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)