Re: Code for user-defined type - Mailing list pgsql-general

From Pavel Stehule
Subject Re: Code for user-defined type
Date
Msg-id CAFj8pRDAA_W=ffUpyN2E7+xbkcsFpR_dkDWZ=0XkfjrjcOD-MA@mail.gmail.com
Whole thread Raw
In response to Code for user-defined type  (Paul Jones <pbj@cmicdo.com>)
List pgsql-general
Hello


2014-05-27 20:30 GMT+02:00 Paul Jones <pbj@cmicdo.com>:
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);



There is one issue DirectFunctionCall takes a parameters converted to Datum and returns Datum

You should to use a macros XGetDatum and DatumGetX

In this case

		newDate = DatumGetTimestamp(DirectFunctionCall2(to_timestamp,
CStringGetDatum(date_txt), CStringGetDatum(cstring_to_text(nls_date_format))));
PG_RETURN_TIMESTAMP(newDate);


There is inconsistency in types - Timestamp and Timestamptz -
 
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));
}


Regards

Pavel
 

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

pgsql-general by date:

Previous
From: Maciek Sakrejda
Date:
Subject: Re: Shared memory changes in 9.4?
Next
From: Dmitry Samonenko
Date:
Subject: Re: Fwd: libpq: indefinite block on poll during network problems