[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> </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. 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> </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> </o:p></span></p><p \
class=MsoNormal><span \
style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p> </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> </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> </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> </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> </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> </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'> 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'> 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'> GSERIALIZED *geom_elem; \
/* 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> </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) ((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) \
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) \
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> </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> </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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> /*elog(NOTICE, \
"trajectory_elem called");*/<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'> if \
(lwgeom_is_empty(lwgeom) || lwgeom->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'> \
{<o:p></o:p></span></p></div><div><p class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> elog(NOTICE, \
"trajectory_elem is NULL, or type is not \
correct");<o:p></o:p></span></p></div><div><p class=MsoNormal \
style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> \
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'> \
}<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'> trje->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'> trje->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'> trje->geom_elem = \
gserialized_from_lwgeom(lwgeom, &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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> elog(NOTICE, \
"trajectory_elem finish");<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'> /* 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'> \
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'> 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> </o:p></span></p></div><div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'> \
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> </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 lwgeom_to_hexwkb(lwgeom, WKB_EXTENDED, \
&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> </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> </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 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> </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 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> </o:p></span></p></div><p \
class=MsoNormal style='margin-left:.5in'><span \
style='font-family:"Calibri",sans-serif;color:black'><o:p> </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