From 137120a0349708970a2d4efc9bcc302380575b29 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Sun, 28 Sep 2008 16:18:12 +0000 Subject: [PATCH] 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. git-svn-id: http://svn.osgeo.org/postgis/trunk@3025 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/liblwgeom.h | 15 ++------------- liblwgeom/lwgeom.c | 3 +-- liblwgeom/lwgparse.c | 20 ++++++++------------ lwgeom/lwgeom_inout.c | 8 ++------ lwgeom/lwgeom_ogc.c | 4 +--- lwgeom/lwgeom_pg.c | 8 +++----- 6 files changed, 17 insertions(+), 41 deletions(-) diff --git a/liblwgeom/liblwgeom.h b/liblwgeom/liblwgeom.h index 3105b77f5..dc9a1bdf7 100644 --- a/liblwgeom/liblwgeom.h +++ b/liblwgeom/liblwgeom.h @@ -563,18 +563,6 @@ char is_worth_caching_lwgeom_bbox(const LWGEOM *); */ #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 @@ extern void deparse_hex(uchar str, char *result); */ typedef struct struct_lwgeom_parser_result { - SERIALIZED_LWGEOM *serialized_lwgeom; + uchar *serialized_lwgeom; + int size; } LWGEOM_PARSER_RESULT; diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 80ef5f7ac..2d23294d4 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -515,7 +515,6 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) long int i; int result; LWGEOM *ret; - SERIALIZED_LWGEOM *serialized_lwgeom; LWGEOM_PARSER_RESULT lwg_parser_result; /* "HEXify" the EWKB */ @@ -530,7 +529,7 @@ lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) lwfree(hexewkb); /* Deserialize */ - ret = lwgeom_deserialize(serialized_lwgeom->lwgeom); + ret = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom); return ret; } diff --git a/liblwgeom/lwgparse.c b/liblwgeom/lwgparse.c index e10c055c6..59b2fbdd4 100644 --- a/liblwgeom/lwgparse.c +++ b/liblwgeom/lwgparse.c @@ -155,7 +155,7 @@ void alloc_multisurface(void); 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 @@ alloc_empty(void) 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 @@ make_serialized_lwgeom(void) 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 @@ parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char *geometry, int flag return 0; /* Return the parsed geometry */ - lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom(); + make_serialized_lwgeom(lwg_parser_result); return -1; } diff --git a/lwgeom/lwgeom_inout.c b/lwgeom/lwgeom_inout.c index 78a7c554e..7d9aad626 100644 --- a/lwgeom/lwgeom_inout.c +++ b/lwgeom/lwgeom_inout.c @@ -63,7 +63,6 @@ PG_FUNCTION_INFO_V1(LWGEOM_in); 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 @@ Datum LWGEOM_in(PG_FUNCTION_ARGS) /* 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 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS) /* 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 @@ Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS) 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); diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index 58cdd7cdc..799f344d6 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -966,7 +966,6 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) 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 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS) 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 ) { diff --git a/lwgeom/lwgeom_pg.c b/lwgeom/lwgeom_pg.c index bf3ce92a4..61d55cbc2 100644 --- a/lwgeom/lwgeom_pg.c +++ b/lwgeom/lwgeom_pg.c @@ -245,7 +245,6 @@ PG_LWGEOM * 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 @@ pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen) 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); -- 2.50.1