Я пытаюсь определить пользовательский тип данных в postgreSQL, который принимает два аргумента: long long int (int8 в postgres) и динамическую строку (varchar или TEXT в postgres). Я могу заставить работать long long int, но у меня возникают проблемы с реализацией динамической строки. Вот что у меня есть в коде c для функций in и out:
В функции:
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)