[postgis-commits] svn - r3025 - in trunk: liblwgeom lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Sun Sep 28 09:18:12 PDT 2008
Author: mcayland
Date: 2008-09-28 09:18:12 -0700 (Sun, 28 Sep 2008)
New Revision: 3025
Modified:
trunk/liblwgeom/liblwgeom.h
trunk/liblwgeom/lwgeom.c
trunk/liblwgeom/lwgparse.c
trunk/lwgeom/lwgeom_inout.c
trunk/lwgeom/lwgeom_ogc.c
trunk/lwgeom/lwgeom_pg.c
Log:
With the advent of LWGEOM_PARSER_RESULT, it is now possible to get rid of the horrible SERIALIZED_LWGEOM hack for PostgreSQL 8.3 to allow us to return the size separate from the result. This is good as it removes another level of indirection from the parser. Note that the size field has now been added to the LWGEOM_PARSER_RESULT structure.
Modified: trunk/liblwgeom/liblwgeom.h
===================================================================
--- trunk/liblwgeom/liblwgeom.h 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/liblwgeom/liblwgeom.h 2008-09-28 16:18:12 UTC (rev 3025)
@@ -564,18 +564,6 @@
#define SERIALIZED_FORM(x) ((uchar *)VARDATA((x)))
/*
- This structure is a "glue" structure for returning a serialized
- LWGEOM from the parser, along with its size. By using a separate
- type, we remove the constraint that the output from the
- parser must be PG_LWGEOM format (and hence protect ourselves
- from future varlena changes)
-*/
-typedef struct serialized_lwgeom {
- uchar *lwgeom;
- int size;
-} SERIALIZED_LWGEOM;
-
-/*
* This function computes the size in bytes
* of the serialized geometries.
*/
@@ -1133,7 +1121,8 @@
*/
typedef struct struct_lwgeom_parser_result
{
- SERIALIZED_LWGEOM *serialized_lwgeom;
+ uchar *serialized_lwgeom;
+ int size;
} LWGEOM_PARSER_RESULT;
Modified: trunk/liblwgeom/lwgeom.c
===================================================================
--- trunk/liblwgeom/lwgeom.c 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/liblwgeom/lwgeom.c 2008-09-28 16:18:12 UTC (rev 3025)
@@ -515,7 +515,6 @@
long int i;
int result;
LWGEOM *ret;
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
/* "HEXify" the EWKB */
@@ -530,7 +529,7 @@
lwfree(hexewkb);
/* Deserialize */
- ret = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+ ret = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
return ret;
}
Modified: trunk/liblwgeom/lwgparse.c
===================================================================
--- trunk/liblwgeom/lwgparse.c 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/liblwgeom/lwgparse.c 2008-09-28 16:18:12 UTC (rev 3025)
@@ -155,7 +155,7 @@
void alloc_geomertycollection(void);
void alloc_counter(void);
void alloc_empty(void);
-SERIALIZED_LWGEOM* make_serialized_lwgeom(void);
+void make_serialized_lwgeom(LWGEOM_PARSER_RESULT *lwg_parser_result);
uchar strhex_readbyte(const char *in);
uchar read_wkb_byte(const char **in);
void read_wkb_bytes(const char **in, uchar* out, int cnt);
@@ -739,19 +739,15 @@
st->uu.nn.num=0;
}
-SERIALIZED_LWGEOM *
-make_serialized_lwgeom(void)
+void
+make_serialized_lwgeom(LWGEOM_PARSER_RESULT *lwg_parser_result)
{
- SERIALIZED_LWGEOM *out_serialized_lwgeom;
uchar* out_c;
output_state out;
tuple* cur;
LWDEBUG(2, "make_serialized_lwgeom");
- /* Allocate the SERIALIZED_LWGEOM structure */
- out_serialized_lwgeom = (SERIALIZED_LWGEOM *)local_malloc(sizeof(SERIALIZED_LWGEOM));
-
/* Allocate the LWGEOM itself */
out_c = (uchar*)local_malloc(the_geom.alloc_size);
out.pos = out_c;
@@ -762,11 +758,11 @@
cur=cur->next;
}
- /* Setup the SERIALIZED_LWGEOM structure */
- out_serialized_lwgeom->lwgeom = out_c;
- out_serialized_lwgeom->size = the_geom.alloc_size;
+ /* Setup the LWGEOM_PARSER_RESULT structure */
+ lwg_parser_result->serialized_lwgeom = out_c;
+ lwg_parser_result->size = the_geom.alloc_size;
- return out_serialized_lwgeom;
+ return;
}
void
@@ -1150,7 +1146,7 @@
return 0;
/* Return the parsed geometry */
- lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom();
+ make_serialized_lwgeom(lwg_parser_result);
return -1;
}
Modified: trunk/lwgeom/lwgeom_inout.c
===================================================================
--- trunk/lwgeom/lwgeom_inout.c 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/lwgeom/lwgeom_inout.c 2008-09-28 16:18:12 UTC (rev 3025)
@@ -63,7 +63,6 @@
Datum LWGEOM_in(PG_FUNCTION_ARGS)
{
char *str = PG_GETARG_CSTRING(0);
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
LWGEOM *lwgeom;
PG_LWGEOM *ret;
@@ -72,8 +71,7 @@
/* will handle both HEXEWKB and EWKT */
result = serialized_lwgeom_from_ewkt(&lwg_parser_result, str, PARSER_CHECK_ALL);
- serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
- lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+ lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
ret = pglwgeom_serialize(lwgeom);
lwgeom_release(lwgeom);
@@ -466,7 +464,6 @@
/* text */
text *wkt_input = PG_GETARG_TEXT_P(0);
PG_LWGEOM *ret; /*with length */
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
LWGEOM *lwgeom;
char *wkt;
@@ -483,8 +480,7 @@
result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
- serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
- lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+ lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
ret = pglwgeom_serialize(lwgeom);
lwgeom_release(lwgeom);
Modified: trunk/lwgeom/lwgeom_ogc.c
===================================================================
--- trunk/lwgeom/lwgeom_ogc.c 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/lwgeom/lwgeom_ogc.c 2008-09-28 16:18:12 UTC (rev 3025)
@@ -966,7 +966,6 @@
text *wkttext = PG_GETARG_TEXT_P(0);
char *wkt, fc;
size_t size;
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
PG_LWGEOM *geom_result = NULL;
LWGEOM *lwgeom;
@@ -1006,8 +1005,7 @@
result = serialized_lwgeom_from_ewkt(&lwg_parser_result, wkt, PARSER_CHECK_ALL);
- serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
- lwgeom = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+ lwgeom = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
{
Modified: trunk/lwgeom/lwgeom_pg.c
===================================================================
--- trunk/lwgeom/lwgeom_pg.c 2008-09-28 15:47:02 UTC (rev 3024)
+++ trunk/lwgeom/lwgeom_pg.c 2008-09-28 16:18:12 UTC (rev 3025)
@@ -245,7 +245,6 @@
pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen)
{
PG_LWGEOM *ret;
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
char *hexewkb;
size_t hexewkblen = ewkblen*2;
@@ -260,10 +259,9 @@
result = serialized_lwgeom_from_ewkt(&lwg_parser_result, hexewkb, flags);
- serialized_lwgeom = lwg_parser_result.serialized_lwgeom;
- ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ);
- SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ);
- memcpy(VARDATA(ret), serialized_lwgeom->lwgeom, serialized_lwgeom->size);
+ ret = (PG_LWGEOM *)palloc(lwg_parser_result.size + VARHDRSZ);
+ SET_VARSIZE(ret, lwg_parser_result.size + VARHDRSZ);
+ memcpy(VARDATA(ret), lwg_parser_result.serialized_lwgeom, lwg_parser_result.size);
lwfree(hexewkb);
More information about the postgis-commits
mailing list