[postgis-devel] [postgis-users] Create a new data type for PostGIS in C

Regina Obe lr at pcorp.us
Thu Aug 17 19:42:24 PDT 2017


Fabiana,

 

This question is better asked on postgis-developers list.  Please join that
list if you are not subscribed already. 

 

https://lists.osgeo.org/mailman/listinfo/postgis-devel

 

 

I've cc'd PostGIS development to start things off.

 

Thanks,

Regina

 

From: postgis-users [mailto:postgis-users-bounces at lists.osgeo.org] On Behalf
Of Fabiana Zioti
Sent: Thursday, August 17, 2017 1:37 PM
To: postgis-users at lists.osgeo.org
Subject: [postgis-users] Create a new data type for PostGIS in C

 

Hello,

I developed some basic extensions for PostgreSQL to study. The extensions
contained input and output functions, operators, index (GiST), among others.

 

Now I would like to create a new data type for PostGIS, but I have some
difficulties. Here's what I've done so far:

 

struct trajectory_elem

{

  int32 id;

  Timestamp time_obj;

  GSERIALIZED *geom_elem;       /* Geometry Object */

};

 

#define DatumGetTrajectoryElem(X)      ((struct trajectory_elem*)
PG_DETOAST_DATUM(X))

#define PG_GETARG_TRAJECTELEM_TYPE_P(n)
DatumGetTrajectoryElem(PG_GETARG_DATUM(n))

#define PG_RETURN_TRAJECTELEM_TYPE_P(x)  PG_RETURN_POINTER(x)

 

PG_FUNCTION_INFO_V1(trajectory_elem);

 

Datum

trajectory_elem(PG_FUNCTION_ARGS)

{

 

  int32 id = PG_GETARG_INT32(0);

 

  Timestamp timestamp = PG_GETARG_TIMESTAMP(1);

 

  GSERIALIZED *geom = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(2));

 

  LWGEOM *lwgeom = lwgeom_from_gserialized(geom);

 

  struct trajectory_elem *trje = (struct trajectory_elem *)
palloc(sizeof(struct trajectory_elem));

 

  size_t size;

 

  /*elog(NOTICE, "trajectory_elem called");*/

 

  if (lwgeom_is_empty(lwgeom) || lwgeom->type != POINTTYPE)

  {

    elog(NOTICE, "trajectory_elem is NULL, or type is not correct");

  PG_RETURN_NULL();

  }

 

  trje->id = id;

  trje->time_obj = timestamp;

  trje->geom_elem = gserialized_from_lwgeom(lwgeom, &size);

 

  elog(NOTICE, "trajectory_elem finish");

 

  /* Then call free_if_copy on the *varlena* structures you originally get
as arguments */

  lwgeom_free(lwgeom);

  PG_FREE_IF_COPY(geom, 0);

 

  PG_RETURN_TRAJECTELEM_TYPE_P(trje);

 

}

I also imprinted the output function using lwgeom_to_hexwkb(lwgeom,
WKB_EXTENDED, &size);

 

But in PG_RETURN the connection is closed.

 

It is wrong the way I'm programming the UDT for PostGIS?

 

Thanks in advance !! (and Sorry for the english)

 

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-devel/attachments/20170817/2e2a8dbb/attachment.html>


More information about the postgis-devel mailing list