libpqtypes home page

PQregisterTypeHandler(3)       libpqtypes Manual      PQregisterTypeHandler(3)



NAME
       PQregisterTypeHandler  -  Registers  a  type  handler  for user-defined
       types, composites, aliases or sub-classes.

SYNOPSIS
       #include <libpqtypes.h>

       typedef int (*PGtypeProc)(PGtypeArgs *args);
       int PQregisterTypeHandler(PGconn *conn, const char *typname,
                                 PGtypeProc put, PGtypeProc get);

DEPRECATED
       THIS FUNCTION IS DEPRECATED.  New applications should  use  PQregister-
       SubClasses,  PQregisterUserDefinedTypes  or PQregisterComposites.  This
       function is now a wrapper to those functions and  will  be  removed  in
       future versions.

DESCRIPTION
       The  PQregisterTypeHandler()  function allows the application developer
       to register their own data type handlers at runtime.  This can be  sim-
       ple aliases, composites, user-defined types or sub-classes.

       The typname argument describes either a fully qualified type name or an
       inheritence relationship: ex. "myint=int4" where  myint  inherits  from
       int4.   This  cannot be NULL.  The '=' is called the inheritence opera-
       tor.

       The put and get arguments are PGtypeProc callbacks.  When a  registered
       type  is  encountered  within  a  type specifier string by PQputf(3) or
       PQgetf(3), its put and get routine is called.

       WARNING: PQparamCreate is only aware of types that  have  already  been
       registered.   If  you  need to put a type into a param, make sure it is
       first registered.

       Alias Registration
       When both put and get  arguments  are  NULL  and  typname  contains  an
       inheritence  operator,  the  registration is considered an alias.  This
       means the type being registered will behave identically to the type  it
       is inheriting from.

              /* Register an int4 alias under the built-in pqt schema.
               * Allows referencing %int4 as %d, printf-like.
               */
              PQregisterTypeHandler(conn, "pqt.d=pg_catalog.int4", NULL, NULL);

              /* use the 'd' alias to put an 'int4' */
              PQputf(param, "%d", 2893744);

       Sub-class Registration
       When either the put or get argument is not-NULL and typname contains an
       inheritence operator, the registration is considered a sub-class.  This
       means  the type being registered will inherit the base type's low-level
       data conversion routines.  This allows an application  to  convert  its
       structures  into  libpqtypes structures, like PGtimestamp, prior to the
       base type handler converting the libpqtypes structure to the  backend's
       external format.

              /* Register timestamp sub-class named epoch.  The goal is to allow
               * an application to put and/or get timestamps as time_t epoch values,
               * rather than putting or getting via PGtimestamp.
               */
              PQregisterTypeHandler(conn, "pqt.epoch=pg_catalog.timestamp",
                   epoch_put, epoch_get);

              /* Put an epoch value */
              PQputf(param, "%epoch", time(NULL));

              /* Get an epoch value */
              time_t t;
              PGresult *res = PQexec(conn, "SELECT my_timestamp FROM t");
              PQgetf(res, tup_num, "%epoch", field_num, &t);

       Composite Registration
       When  both  put and get arguments are NULL and typname does not contain
       an inheritence operator, the registration is  considered  a  composite.
       Composites cannot be sub-classed and cannot be handled by user provided
       PGtypeProc routines.  Although, the fields within a composite can  have
       their own PGtypeProc routines. The composite is verified with the back-
       end.

              /* Register the 'invoice' composite that's in the billing schema. */
              PQregisterTypeHandler(conn, "billing.invoice", NULL, NULL);

              /* An invoice compsoite contains: int4, int4, text.
               * We have to first pack the invoice fields into a PGparam.
               */
              PGparam *inv_param = PQparamCreate(conn);
              PQputf(inv_param, "%int4 %int4 %text", 23, 90, "invoice text");

              /* Now pack the inv_param into a single parameter of
               * another param.
               */
              PGparam *param = PQparamCreate(conn);
              PQputf(param, "%invoice", inv_param);
              PQparamClear(inv_param); /* not needed anymore */
              //PQparamExec(conn, param, ...);

       User-defined Types Registration
       When either the put or get argument is not-NULL and  typname  does  not
       contain an inheritence operator, the registration is considered a user-
       defined type.  User-defined types are custom types in  a  backend  that
       implement  their  own  C  procedures for in/out/send/recv.  The type is
       verified with the backend.

              /* Register the 'rgb' user-defined type that's in the
               * graphics schema.
               */
              PQregisterTypeHandler(conn, "graphics.rgb", rgb_put, rgb_get);


RETURN VALUE
       On success, a non-zero value is returned.  On error, zero  is  returned
       and PQgeterror(3) will contain an error message.

EXAMPLES
       None.

AUTHOR
       A  contribution  of  eSilo, LLC. for the PostgreSQL Database Management
       System.  Written by Andrew Chernow and Merlin Moncure.

REPORTING BUGS
       Report bugs to <libpqtypes@esilo.com>.

COPYRIGHT
       Copyright (c) 2009 eSilo, LLC. All rights reserved.
       This is free software; see the source for copying conditions.  There is
       NO  warranty; not even for MERCHANTABILITY or  FITNESS FOR A PARTICULAR
       PURPOSE.

SEE ALSO
       pqt-handlers(3), PQputf(3), PQgetf(3)



libpqtypes                           2009             PQregisterTypeHandler(3)

libpqtypes home page