[prev in list] [next in list] [prev in thread] [next in thread] 

List:       postgis-users
Subject:    Re: [postgis-users] Create a new data type for PostGIS in C
From:       "Regina Obe" <lr () pcorp ! us>
Date:       2017-08-18 2:42:24
Message-ID: 000001d317cb$9fd6f0e0$df84d2a0$ () pcorp ! us
[Download RAW message or body]

This is a multipart message in MIME format.

[Attachment #2 (multipart/alternative)]
This is a multipart message in MIME format.


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@lists.osgeo.org] On Behalf
Of Fabiana Zioti
Sent: Thursday, August 17, 2017 1:37 PM
To: postgis-users@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)

 

 

 

 


[Attachment #5 (text/html)]

<html xmlns:v="urn:schemas-microsoft-com:vml" \
xmlns:o="urn:schemas-microsoft-com:office:office" \
xmlns:w="urn:schemas-microsoft-com:office:word" \
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" \
xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type \
content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 \
(filtered medium)"><style><!-- /* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:#0563C1;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:#954F72;
	text-decoration:underline;}
p
	{mso-style-priority:99;
	margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman",serif;}
span.EmailStyle18
	{mso-style-type:personal-reply;
	font-family:"Calibri",sans-serif;
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" \
vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>Fabiana,<o:p></o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>This question \
is better asked on postgis-developers list.&nbsp; Please join that list if you are \
not subscribed already. <o:p></o:p></span></p><p class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><a \
href="https://lists.osgeo.org/mailman/listinfo/postgis-devel">https://lists.osgeo.org/mailman/listinfo/postgis-devel</a><o:p></o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>I've cc'd \
PostGIS development to start things off.<o:p></o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>Thanks,<o:p></o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>Regina<o:p></o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div \
style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p \
class=MsoNormal style='margin-left:.5in'><b><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif'>From:</span></b><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif'> postgis-users \
[mailto:postgis-users-bounces@lists.osgeo.org] <b>On Behalf Of </b>Fabiana \
Zioti<br><b>Sent:</b> Thursday, August 17, 2017 1:37 PM<br><b>To:</b> \
postgis-users@lists.osgeo.org<br><b>Subject:</b> [postgis-users] Create a new data \
type for PostGIS in C<o:p></o:p></span></p></div></div><p class=MsoNormal \
style='margin-left:.5in'><o:p>&nbsp;</o:p></p><div id=divtagdefaultwrapper><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>Hello,<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>I developed some basic \
extensions for PostgreSQL to study. The extensions contained input and output \
functions, operators, index (GiST), among others.<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>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:<o:p></o:p></span></p></div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>struct \
trajectory_elem<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>{<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; int32 \
id;<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; Timestamp \
time_obj;<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; GSERIALIZED *geom_elem; \
&nbsp; &nbsp; &nbsp; /* Geometry Object */<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>};<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>#define \
DatumGetTrajectoryElem(X) &nbsp; &nbsp; &nbsp;((struct trajectory_elem*) \
PG_DETOAST_DATUM(X))<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>#define \
PG_GETARG_TRAJECTELEM_TYPE_P(n) \
&nbsp;DatumGetTrajectoryElem(PG_GETARG_DATUM(n))<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>#define \
PG_RETURN_TRAJECTELEM_TYPE_P(x) \
&nbsp;PG_RETURN_POINTER(x)<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>PG_FUNCTION_INFO_V1(trajectory_elem);<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>Datum<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>trajectory_elem(PG_FUNCTION_ARGS)<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>{<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; int32 id = \
PG_GETARG_INT32(0);<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; Timestamp timestamp = \
PG_GETARG_TIMESTAMP(1);<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; GSERIALIZED *geom = \
(GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(2));<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; LWGEOM *lwgeom = \
lwgeom_from_gserialized(geom);<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; struct trajectory_elem \
*trje = (struct trajectory_elem *) palloc(sizeof(struct \
trajectory_elem));<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; size_t \
size;<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; /*elog(NOTICE, \
&quot;trajectory_elem called&quot;);*/<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; if \
(lwgeom_is_empty(lwgeom) || lwgeom-&gt;type != \
POINTTYPE)<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; \
{<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; &nbsp; elog(NOTICE, \
&quot;trajectory_elem is NULL, or type is not \
correct&quot;);<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; \
PG_RETURN_NULL();<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; \
}<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; trje-&gt;id = \
id;<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; trje-&gt;time_obj = \
timestamp;<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; trje-&gt;geom_elem = \
gserialized_from_lwgeom(lwgeom, &amp;size);<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; elog(NOTICE, \
&quot;trajectory_elem finish&quot;);<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; /* Then call free_if_copy \
on the *varlena* structures you originally get as arguments \
*/<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; \
lwgeom_free(lwgeom);<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; PG_FREE_IF_COPY(geom, \
0);<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>&nbsp; \
PG_RETURN_TRAJECTELEM_TYPE_P(trje);<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>}<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>I also imprinted the output \
function using&nbsp;lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, \
&amp;size);<o:p></o:p></span></p></div><div><div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>But in PG_RETURN the connection \
is closed.<o:p></o:p></span></p></div></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>It is wrong the way I'm \
programming the UDT&nbsp;for PostGIS?<o:p></o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'>Thanks in advance !! \
(and&nbsp;Sorry for the english)<o:p></o:p></span></p></div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p>&nbsp;</o:p></span></p></div><p \
class=MsoNormal style='margin-left:.5in'><span \


[Attachment #6 (text/plain)]

_______________________________________________
postgis-users mailing list
postgis-users@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/postgis-users

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic