From: Mark Cave-Ayland Date: Thu, 25 Sep 2008 21:50:19 +0000 (+0000) Subject: Add parser flags to the LWGEOM to (E)WKB/WKT parsers, similar to has already been... X-Git-Tag: 1.4.0b1~700 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6a0bbc574408f8b71b939a83fee3cf9180769b1;p=postgis Add parser flags to the LWGEOM to (E)WKB/WKT parsers, similar to has already been done for the (E)WKB/WKT to LWGEOM parsers. git-svn-id: http://svn.osgeo.org/postgis/trunk@3012 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/liblwgeom/examples/unparser.c b/liblwgeom/examples/unparser.c index a2dc9d639..7bd197c97 100644 --- a/liblwgeom/examples/unparser.c +++ b/liblwgeom/examples/unparser.c @@ -69,9 +69,9 @@ int main() serialized_lwgeom = lwgeom_serialize(lwgeom); /* Output the geometry in WKT and WKB */ - wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom); + wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL); printf("WKT format : %s\n", wkt); - wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size); + wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size); printf("HEXWKB format : %s\n\n", wkb); /* Free all of the allocated items */ @@ -105,9 +105,9 @@ int main() serialized_lwgeom = lwgeom_serialize(lwgeom); /* Output the geometry in WKT and WKB */ - wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom); + wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_ALL); printf("WKT format : %s\n", wkt); - wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size); + wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_ALL, NDR, &wkb_size); printf("HEXWKB format : %s\n\n", wkb); /* Free all of the allocated items */ @@ -177,9 +177,9 @@ int main() serialized_lwgeom = lwgeom_serialize(lwgeom); /* Output the geometry in WKT and WKB */ - wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom); + wkt = serialized_lwgeom_to_ewkt(serialized_lwgeom, PARSER_CHECK_NONE); printf("WKT format : %s\n", wkt); - wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, NDR, &wkb_size); + wkb = serialized_lwgeom_to_hexwkb(serialized_lwgeom, PARSER_CHECK_NONE, NDR, &wkb_size); printf("HEXWKB format : %s\n\n", wkb); /* Free all of the allocated items */ diff --git a/liblwgeom/liblwgeom.h b/liblwgeom/liblwgeom.h index 5e3a532be..811a862cb 100644 --- a/liblwgeom/liblwgeom.h +++ b/liblwgeom/liblwgeom.h @@ -1125,19 +1125,20 @@ extern void deparse_hex(uchar str, char *result); #define PARSER_CHECK_ODD 2 #define PARSER_CHECK_CLOSURE 4 +#define PARSER_CHECK_NONE 0 #define PARSER_CHECK_ALL (PARSER_CHECK_MINPOINTS | PARSER_CHECK_ODD | PARSER_CHECK_CLOSURE) /* Parser access routines */ -extern char *lwgeom_to_ewkt(LWGEOM *lwgeom); -extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder); -extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, size_t ewkblen, int flags); -extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *ewkblen); +extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags); +extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder); +extern LWGEOM *lwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen); +extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *ewkblen); -extern char *serialized_lwgeom_to_ewkt(uchar *serialized); +extern char *serialized_lwgeom_to_ewkt(uchar *serialized, int flags); extern SERIALIZED_LWGEOM *serialized_lwgeom_from_ewkt(char *wkt_input, int flags); -extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size); -extern char *serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size); +extern char *serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size); +extern char *serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size); extern void *lwalloc(size_t size); diff --git a/liblwgeom/lwgeom.c b/liblwgeom/lwgeom.c index 3733e2301..eb22d9d55 100644 --- a/liblwgeom/lwgeom.c +++ b/liblwgeom/lwgeom.c @@ -457,14 +457,14 @@ lwgeom_add(const LWGEOM *to, uint32 where, const LWGEOM *what) * Return an alloced string */ char * -lwgeom_to_ewkt(LWGEOM *lwgeom) +lwgeom_to_ewkt(LWGEOM *lwgeom, int flags) { uchar *serialized = lwgeom_serialize(lwgeom); char *ret; if ( ! serialized ) { lwerror("Error serializing geom %p", lwgeom); } - ret = unparse_WKT(serialized, lwalloc, lwfree); + ret = unparse_WKT(serialized, lwalloc, lwfree, flags); lwfree(serialized); return ret; } @@ -473,10 +473,10 @@ lwgeom_to_ewkt(LWGEOM *lwgeom) * Return an alloced string */ char * -lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder) +lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder) { uchar *serialized = lwgeom_serialize(lwgeom); - char *hexwkb = unparse_WKB(serialized, lwalloc, lwfree, byteorder,NULL,1); + char *hexwkb = unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder,NULL,1); lwfree(serialized); return hexwkb; } @@ -485,7 +485,7 @@ lwgeom_to_hexwkb(LWGEOM *lwgeom, unsigned int byteorder) * Return an alloced string */ uchar * -lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize) +lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *outsize) { uchar *serialized = lwgeom_serialize(lwgeom); @@ -495,7 +495,7 @@ lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize) * (last argument set to 0) */ uchar *hexwkb = (uchar *)unparse_WKB(serialized, lwalloc, lwfree, - byteorder, outsize, 0); + flags, byteorder, outsize, 0); lwfree(serialized); return hexwkb; } @@ -508,7 +508,7 @@ lwgeom_to_ewkb(LWGEOM *lwgeom, char byteorder, size_t *outsize) * - deserialize it */ LWGEOM * -lwgeom_from_ewkb(uchar *ewkb, size_t size, int flags) +lwgeom_from_ewkb(uchar *ewkb, int flags, size_t size) { size_t hexewkblen = size*2; char *hexewkb; @@ -564,27 +564,27 @@ serialized_lwgeom_from_ewkt(char *wkt_input, int flags) * Return an alloced string */ char * -serialized_lwgeom_to_ewkt(uchar *serialized) +serialized_lwgeom_to_ewkt(uchar *serialized, int flags) { - return unparse_WKT(serialized, lwalloc, lwfree); + return unparse_WKT(serialized, lwalloc, lwfree, flags); } /* * Return an alloced string */ char * -serialized_lwgeom_to_hexwkb(uchar *serialized, unsigned int byteorder, size_t *size) +serialized_lwgeom_to_hexwkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size) { - return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 1); + return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 1); } /* * Return an alloced string */ char * -serialized_lwgeom_to_ewkb(uchar *serialized, unsigned int byteorder, size_t *size) +serialized_lwgeom_to_ewkb(uchar *serialized, int flags, unsigned int byteorder, size_t *size) { - return unparse_WKB(serialized, lwalloc, lwfree, byteorder, size, 0); + return unparse_WKB(serialized, lwalloc, lwfree, flags, byteorder, size, 0); } diff --git a/liblwgeom/lwgparse.c b/liblwgeom/lwgparse.c index 6e7253c09..6f5be5fe5 100644 --- a/liblwgeom/lwgparse.c +++ b/liblwgeom/lwgparse.c @@ -1129,7 +1129,7 @@ alloc_wkb(const char *parser) SERIALIZED_LWGEOM * parse_it(const char *geometry, int flags, allocator allocfunc, report_error errfunc) { - LWDEBUGF(2, "parse_it: %s", geometry); + LWDEBUGF(2, "parse_it: %s with parser flags %d", geometry, flags); local_malloc = allocfunc; error_func=errfunc; diff --git a/liblwgeom/lwgunparse.c b/liblwgeom/lwgunparse.c index 73e06d722..fe1dcda15 100644 --- a/liblwgeom/lwgunparse.c +++ b/liblwgeom/lwgunparse.c @@ -75,10 +75,19 @@ static int lwgi; static uchar endianbyte; void (*write_wkb_bytes)(uchar* ptr,unsigned int cnt,size_t size); +/* + * Parser global check flags - a bitmap of flags that determine which checks the parser will perform + * (see liblwgeom.h for the related PARSER_CHECK constants) + */ +int parser_check_flags; + /*---------------------------------------------------------- */ + + + /* * Ensure there is enough space for chars bytes. * Reallocate memory is this is not the case. @@ -230,7 +239,7 @@ output_line_collection(uchar* geom,outfunc func,int supress) int cnt = read_int(&geom); /* Ensure that LINESTRING has a minimum of 2 points */ - if (cnt < 2) + if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 2) lwerror("geometry requires more points"); if ( cnt == 0 ){ @@ -294,7 +303,8 @@ output_polygon_ring_collection(uchar* geom,outfunc func,int supress) } /* Check if they are the same... */ - if (memcmp(&first_point, &last_point, sizeof(double) * dims)) + if (memcmp(&first_point, &last_point, sizeof(double) * dims) && + (parser_check_flags & PARSER_CHECK_CLOSURE)) lwerror("geometry contains non-closed rings"); } @@ -308,11 +318,11 @@ output_curve_collection(uchar* geom,outfunc func,int supress) int cnt = read_int(&geom); /* Ensure that a CIRCULARSTRING has a minimum of 3 points */ - if (cnt < 3) + if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 3) lwerror("geometry requires more points"); /* Ensure that a CIRCULARSTRING has an odd number of points */ - if (cnt % 2 != 1) + if ((parser_check_flags & PARSER_CHECK_ODD) && cnt % 2 != 1) lwerror("geometry must have an odd number of points"); if ( cnt == 0 ){ @@ -556,14 +566,17 @@ output_wkt(uchar* geom, int supress) } char * -unparse_WKT(uchar* serialized, allocator alloc, freeor free) +unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags) { - LWDEBUG(2, "unparse_WKT called."); + LWDEBUGF(2, "unparse_WKT called with parser flags %d.", flags); if (serialized==NULL) return NULL; + /* Setup the inital parser flags */ + parser_check_flags = flags; + local_malloc=alloc; local_free=free; len = 128; @@ -687,7 +700,7 @@ output_wkb_line_collection(uchar* geom,outwkbfunc func) LWDEBUGF(2, "output_wkb_line_collection: %d iterations loop", cnt); /* Ensure that LINESTRING has a minimum of 2 points */ - if (cnt < 2) + if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 2) lwerror("geometry requires more points"); write_wkb_int(cnt); @@ -733,7 +746,8 @@ output_wkb_polygon_ring_collection(uchar* geom,outwkbfunc func) } /* Check if they are the same... */ - if (memcmp(&first_point, &last_point, sizeof(double) * dims)) + if (memcmp(&first_point, &last_point, sizeof(double) * dims) && + (parser_check_flags & PARSER_CHECK_CLOSURE)) lwerror("geometry contains non-closed rings"); return geom; @@ -757,11 +771,11 @@ output_wkb_curve_collection(uchar* geom,outwkbfunc func) LWDEBUGF(2, "output_wkb_curve_collection: %d iterations loop", cnt); /* Ensure that a CIRCULARSTRING has a minimum of 3 points */ - if (cnt < 3) + if ((parser_check_flags & PARSER_CHECK_MINPOINTS) && cnt < 3) lwerror("geometry requires more points"); /* Ensure that a CIRCULARSTRING has an odd number of points */ - if (cnt % 2 != 1) + if ((parser_check_flags & PARSER_CHECK_ODD) && cnt % 2 != 1) lwerror("geometry must have an odd number of points"); write_wkb_int(cnt); @@ -860,13 +874,16 @@ output_wkb(uchar* geom) } char * -unparse_WKB(uchar* serialized, allocator alloc, freeor free, char endian, size_t *outsize, uchar hex) +unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hex) { - LWDEBUGF(2, "unparse_WKB(%p,...) called", serialized); + LWDEBUGF(2, "unparse_WKB(%p,...) called with parser flags %d", serialized, flags); if (serialized==NULL) return NULL; + /* Setup the inital parser flags */ + parser_check_flags = flags; + local_malloc=alloc; local_free=free; len = 128; diff --git a/liblwgeom/wktparse.h b/liblwgeom/wktparse.h index 7a27d0c2b..2f013a540 100644 --- a/liblwgeom/wktparse.h +++ b/liblwgeom/wktparse.h @@ -98,8 +98,8 @@ void alloc_wkb(const char* parser); SERIALIZED_LWGEOM* parse_lwg(const char* wkt, int flags, allocator allocfunc,report_error errfunc); SERIALIZED_LWGEOM* parse_lwgi(const char* wkt, int flags, allocator allocfunc,report_error errfunc); -char* unparse_WKT(uchar* serialized, allocator alloc,freeor free); -char* unparse_WKB(uchar* serialized, allocator alloc,freeor free, char endian, size_t *outsize, uchar hexform); +char* unparse_WKT(uchar* serialized, allocator alloc, freeor free, int flags); +char* unparse_WKB(uchar* serialized, allocator alloc, freeor free, int flags, char endian, size_t *outsize, uchar hexform); int lwg_parse_yyparse(void); int lwg_parse_yyerror(char* s); diff --git a/lwgeom/lwgeom_dump.c b/lwgeom/lwgeom_dump.c index e3f4d28ba..68efc76bd 100644 --- a/lwgeom/lwgeom_dump.c +++ b/lwgeom/lwgeom_dump.c @@ -123,7 +123,7 @@ Datum LWGEOM_dump(PG_FUNCTION_ARGS) if ( TYPE_GETTYPE(state->root->type) < MULTIPOINTTYPE ) { values[0] = "{}"; - values[1] = lwgeom_to_hexwkb(state->root, -1); + values[1] = lwgeom_to_hexwkb(state->root, PARSER_CHECK_NONE, -1); tuple = BuildTupleFromCStrings(funcctx->attinmeta, values); result = TupleGetDatum(funcctx->slot, tuple); @@ -178,7 +178,7 @@ Datum LWGEOM_dump(PG_FUNCTION_ARGS) lwgeom->SRID = state->root->SRID; values[0] = address; - values[1] = lwgeom_to_hexwkb(lwgeom, -1); + values[1] = lwgeom_to_hexwkb(lwgeom, PARSER_CHECK_NONE, -1); tuple = BuildTupleFromCStrings(funcctx->attinmeta, values); result = TupleGetDatum(funcctx->slot, tuple); node->idx++; @@ -286,7 +286,7 @@ Datum LWGEOM_dump_rings(PG_FUNCTION_ARGS) sprintf(address, "{%d}", state->ringnum); values[0] = address; - values[1] = lwgeom_to_hexwkb(ringgeom, -1); + values[1] = lwgeom_to_hexwkb(ringgeom, PARSER_CHECK_NONE, -1); MemoryContextSwitchTo(oldcontext); diff --git a/lwgeom/lwgeom_functions_basic.c b/lwgeom/lwgeom_functions_basic.c index b727d0cff..dc4f6bc9e 100644 --- a/lwgeom/lwgeom_functions_basic.c +++ b/lwgeom/lwgeom_functions_basic.c @@ -2910,7 +2910,7 @@ Datum LWGEOM_asEWKT(PG_FUNCTION_ARGS) /*char *semicolonLoc; */ lwgeom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom)); + result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL); #if 0 semicolonLoc = strchr(result_cstring,';'); diff --git a/lwgeom/lwgeom_geos_c.c b/lwgeom/lwgeom_geos_c.c index 79db62f55..1a31f06b4 100644 --- a/lwgeom/lwgeom_geos_c.c +++ b/lwgeom/lwgeom_geos_c.c @@ -2778,7 +2778,7 @@ GEOS2LWGEOM(GEOSGeom geom, char want3d) else GEOS_setWKBOutputDims(2); wkb = GEOSGeomToWKB_buf(geom, &size); - lwgeom = lwgeom_from_ewkb(wkb, size); + lwgeom = lwgeom_from_ewkb(wkb, flags, size); return lwgeom; } @@ -3210,7 +3210,7 @@ Datum GEOSnoop(PG_FUNCTION_ARGS) geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom))); + POSTGIS_DEBUGF(2, "GEOSnoop: IN: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(geom), PARSER_CHECK_NONE)); geosgeom = POSTGIS2GEOS(geom); if ( ! geosgeom ) PG_RETURN_NULL(); @@ -3223,7 +3223,7 @@ Datum GEOSnoop(PG_FUNCTION_ARGS) result = GEOS2POSTGIS(geosgeom, TYPE_HASZ(geom->type)); GEOSGeom_destroy(geosgeom); - POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result))); + POSTGIS_DEBUGF(4, "GEOSnoop: OUT: %s", serialized_lwgeom_to_ewkt(SERIALIZED_FORM(result), PARSER_CHECK_NONE)); PG_FREE_IF_COPY(geom, 0); diff --git a/lwgeom/lwgeom_gist.c b/lwgeom/lwgeom_gist.c index 4a97536a1..10e461eca 100644 --- a/lwgeom/lwgeom_gist.c +++ b/lwgeom/lwgeom_gist.c @@ -465,7 +465,7 @@ Datum LWGEOM_gist_compress(PG_FUNCTION_ARGS) /* lwgeom serialized form */ in = (PG_LWGEOM*)PG_DETOAST_DATUM(entry->key); - POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt((uchar *)in+VARHDRSZ)); + POSTGIS_DEBUGF(4, "GIST: LWGEOM_gist_compress detoasted entry->key: %s", serialized_lwgeom_to_ewkt((uchar *)in+VARHDRSZ, PARSER_CHECK_NONE)); if (in == NULL) { diff --git a/lwgeom/lwgeom_inout.c b/lwgeom/lwgeom_inout.c index aba81d3cf..75e63006d 100644 --- a/lwgeom/lwgeom_inout.c +++ b/lwgeom/lwgeom_inout.c @@ -97,7 +97,7 @@ Datum LWGEOM_out(PG_FUNCTION_ARGS) char *result; lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, NULL); + result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, -1, NULL); PG_RETURN_CSTRING(result); } @@ -137,7 +137,7 @@ Datum LWGEOM_asHEXEWKB(PG_FUNCTION_ARGS) } } - result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), byteorder, &size); + result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, byteorder, &size); text_result = palloc(size+VARHDRSZ); memcpy(VARDATA(text_result),result,size); @@ -164,7 +164,7 @@ Datum LWGEOM_to_text(PG_FUNCTION_ARGS) size_t size; lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), -1, &size); + result = serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(lwgeom), PARSER_CHECK_ALL, -1, &size); text_result = palloc(size+VARHDRSZ); memcpy(VARDATA(text_result),result,size); @@ -197,7 +197,7 @@ Datum LWGEOMFromWKB(PG_FUNCTION_ARGS) wkb_input = (WellKnownBinary *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); - lwgeom2 = pglwgeom_from_ewkb((uchar *)VARDATA(wkb_input), + lwgeom2 = pglwgeom_from_ewkb((uchar *)VARDATA(wkb_input), PARSER_CHECK_ALL, VARSIZE(wkb_input)-VARHDRSZ); if ( ( PG_NARGS()>1) && ( ! PG_ARGISNULL(1) )) @@ -294,7 +294,7 @@ Datum WKBFromLWGEOM(PG_FUNCTION_ARGS) #else /* ndef BINARY_FROM_HEX */ - hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), byteorder, &size); + hexized_wkb = serialized_lwgeom_to_ewkb(SERIALIZED_FORM(lwgeom_input), PARSER_CHECK_ALL, byteorder, &size); size_result = size+VARHDRSZ; result = palloc(size_result); @@ -527,7 +527,7 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS) POSTGIS_DEBUG(3, "LWGEOM_recv advancing StringInfo buffer"); - POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), -1, NULL)); + POSTGIS_DEBUGF(3, "LWGEOM_from_bytea returned %s", serialized_lwgeom_to_hexwkb(SERIALIZED_FORM(result), PARSER_CHECK_NONE, -1, NULL)); /* Set cursor to the end of buffer (so the backend is happy) */ buf->cursor = buf->len; diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index 9e099c840..fda123085 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -1078,7 +1078,7 @@ Datum LWGEOM_asText(PG_FUNCTION_ARGS) ogclwgeom = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( LWGEOM_force_2d, PointerGetDatum(lwgeom))); - result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom)); + result_cstring = serialized_lwgeom_to_ewkt(SERIALIZED_FORM(ogclwgeom), PARSER_CHECK_ALL); semicolonLoc = strchr(result_cstring,';'); diff --git a/lwgeom/lwgeom_pg.c b/lwgeom/lwgeom_pg.c index 8afe0969d..2328405fb 100644 --- a/lwgeom/lwgeom_pg.c +++ b/lwgeom/lwgeom_pg.c @@ -242,7 +242,7 @@ PG_LWGEOM_construct(uchar *ser, int SRID, int wantbbox) * Make a PG_LWGEOM object from a WKB binary representation. */ PG_LWGEOM * -pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen) +pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen) { PG_LWGEOM *ret; SERIALIZED_LWGEOM *serialized_lwgeom; @@ -257,7 +257,7 @@ pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen) } hexewkb[hexewkblen] = '\0'; - serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, PARSER_CHECK_ALL); + serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags); ret = (PG_LWGEOM *)palloc(serialized_lwgeom->size + VARHDRSZ); SET_VARSIZE(ret, serialized_lwgeom->size + VARHDRSZ); @@ -272,10 +272,10 @@ pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen) * Return the EWKB (binary) representation for a PG_LWGEOM. */ char * -pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *outsize) +pglwgeom_to_ewkb(PG_LWGEOM *geom, int flags, char byteorder, size_t *outsize) { uchar *srl = &(geom->type); - return serialized_lwgeom_to_ewkb(srl, byteorder, outsize); + return serialized_lwgeom_to_ewkb(srl, flags, byteorder, outsize); } /* diff --git a/lwgeom/lwgeom_pg.h b/lwgeom/lwgeom_pg.h index ce8f19f94..376c091af 100644 --- a/lwgeom/lwgeom_pg.h +++ b/lwgeom/lwgeom_pg.h @@ -50,8 +50,8 @@ extern PG_LWGEOM *pglwgeom_serialize(LWGEOM *lwgeom); extern LWGEOM *pglwgeom_deserialize(PG_LWGEOM *pglwgeom); /* PG_LWGEOM WKB IO */ -extern PG_LWGEOM *pglwgeom_from_ewkb(uchar *ewkb, size_t ewkblen); -extern char *pglwgeom_to_ewkb(PG_LWGEOM *geom, char byteorder, size_t *ewkblen); +extern PG_LWGEOM *pglwgeom_from_ewkb(uchar *ewkb, int flags, size_t ewkblen); +extern char *pglwgeom_to_ewkb(PG_LWGEOM *geom, int flags, char byteorder, size_t *ewkblen); /* PG_LWGEOM SRID get/set */ extern PG_LWGEOM *pglwgeom_setSRID(PG_LWGEOM *pglwgeom, int32 newSRID);