2012-02-07 9 views
0

postgresで、long long int(int 8 in postgres)と動的文字列(varcharまたはpostgresのTEXT)の2つの引数をとるカスタムデータ型を定義しようとしています。私は長いlong intを動作させることができますが、私は動的な文字列を実装するのに苦労しています。機能ではpostgres拡張機能で動的文字列データ型を定義するには?

:これは私が中のためと機能をアウト私のCコードに持っているものである

Datum object3d_in(PG_FUNCTION_ARGS) { 
    char* str = PG_GETARG_CSTRING(0); 
    long long int timeStamp; 
    char *temp; 
    Object3d *result; 

    if (sscanf(str, "(%lli, %s)", &timeStamp, temp) != 2) 
     ereport(ERROR, 
       (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), 
         errmsg("Invalid input syntax for object3d: \"%s\"", 
           str))); 

    result = (Object3d *) palloc(sizeof(Object3d)); 
    result->timeStamp = timeStamp; 

    result->object = (char*) palloc(sizeof(char)*(strlen(temp) + 1)); 
    sscanf(str, "(%lli, %s)", &timeStamp, result->object); //Reload 
    PG_RETURN_POINTER(result); 
} 

アウト機能:

Datum object3d_out(PG_FUNCTION_ARGS) { 
Object3d *object3d = (Object3d *) PG_GETARG_POINTER(0); 
char *result; 
result = (char *) palloc(128); 
snprintf(result, 128, "[%lli, %s]", object3d->timeStamp, object3d->object); 
PG_RETURN_CSTRING(result); 

}

postgresのタイプのコマンドを:

CREATE TYPE object3d; 

CREATE FUNCTION object3d_in(cstring) 
RETURNS object3d 
AS 'mdobject.dll' 
LANGUAGE C IMMUTABLE STRICT; 

CREATE FUNCTION object3d_out(object3d) 
RETURNS cstring 
AS 'mdobject.dll' 
LANGUAGE C IMMUTABLE STRICT; 

CREATE TYPE object3d(
INTERNALLENGTH = 128, 
input = object3d_in, 
output = object3d_out 
); 

CREATE TABLE listobject3d (id integer, theobject object3d); 
INSERT INTO listobject3d VALUES (random()*100, '(203,12)'); 
INSERT INTO listobject3d VALUES (random()*100, '(20120202,r)'); 
INSERT INTO listobject3d VALUES (random()*100, '(20120203,c)'); 
INSERT INTO listobject3d VALUES (random()*100, '(20120203,triangle)'); 

出力:

SELECT * FROM listobject3d; 

id |  theobject 
----+------------------- 
21 | [203, 12] 
42 | [20120202, /\x01] 
19 | [20120203, /\x01] 
33 | [20120203,     ] 
(4 rows) 

答えて

関連する問題