I have written a user-defined type that allows direct import and printing of
DB2 timestamps.It does correctly import and export DB2 timestamps,
butI'm wondering ifsomeone could tell me if I made anymistakes in
the C code, particularly w.r.t. memory leaks or non-portableconstructs.
I'm doing this on 9.3.4.
Thanks,
PJ
------------------ SQL ---------------------------
CREATE TYPE db2tstz;
CREATE FUNCTION db2tstzin(cstring) RETURNS db2tstz
AS '/home/paul/src/pgproj/types/db2tstz.so', 'db2tstzin'
LANGUAGE C STRICT;
CREATE FUNCTION db2tstzout(db2tstz) RETURNS cstring
AS '/home/paul/src/pgproj/types/db2tstz.so', 'db2tstzout'
LANGUAGE C STRICT;
CREATE TYPE db2tstz (
INPUT = db2tstzin,
OUTPUT = db2tstzout,
LIKE = timestamptz
);
CREATE TABLE foo
(
aaa INT,
bbb DB2TSTZ
);
INSERT INTO foo VALUES (1, '2013-10-03-17.22.18.823581'),
(2, '2010-04-06-13.16.47.174372');
---------------- C Code ----------------
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "utils/formatting.h"
#include "utils/datetime.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
/* by value */
PG_FUNCTION_INFO_V1(db2tstzin);
Datum
db2tstzin(PG_FUNCTION_ARGS)
{
char *date_txt = PG_GETARG_CSTRING(0);
Timestamp tsp;
tsp = DirectFunctionCall2(to_timestamp,
cstring_to_text(date_txt),
cstring_to_text("YYYY-MM-DD-HH24.MI.SS.US"));
PG_RETURN_DATUM(tsp);
}
PG_FUNCTION_INFO_V1(db2tstzout);
Datum
db2tstzout(PG_FUNCTION_ARGS)
{
TimestampTz tsp = PG_GETARG_TIMESTAMPTZ(0);
text *result;
result = (text *)DirectFunctionCall2(timestamp_to_char,
(int)&tsp,
cstring_to_text("YYYY-MM-DD-HH24.MI.SS.US"));
PG_RETURN_CSTRING(text_to_cstring(result));
}