[postgis-commits] svn - r3023 - in trunk: liblwgeom lwgeom

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Sun Sep 28 08:32:47 PDT 2008


Author: mcayland
Date: 2008-09-28 08:32:46 -0700 (Sun, 28 Sep 2008)
New Revision: 3023

Modified:
   trunk/liblwgeom/liblwgeom.h
   trunk/liblwgeom/lwgeom.c
   trunk/liblwgeom/lwgparse.c
   trunk/liblwgeom/wktparse.h
   trunk/lwgeom/lwgeom_inout.c
   trunk/lwgeom/lwgeom_ogc.c
   trunk/lwgeom/lwgeom_pg.c
Log:
Update (E)WKT/WKB parser to return a structure (LWGEOM_PARSER_RESULT) instead of just the serialized lwgeom. This is in preparation for returning more detailed error information back to the caller. 


Modified: trunk/liblwgeom/liblwgeom.h
===================================================================
--- trunk/liblwgeom/liblwgeom.h	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/liblwgeom.h	2008-09-28 15:32:46 UTC (rev 3023)
@@ -1128,7 +1128,15 @@
 #define PARSER_CHECK_NONE	0
 #define PARSER_CHECK_ALL	(PARSER_CHECK_MINPOINTS | PARSER_CHECK_ODD | PARSER_CHECK_CLOSURE)
 
+/*
+ * Parser result structure: returns the result of attempting to convert (E)WKT/(E)WKB to LWGEOM 
+ */
+typedef struct struct_lwgeom_parser_result
+{
+	SERIALIZED_LWGEOM *serialized_lwgeom;
+} LWGEOM_PARSER_RESULT;
 
+
 /* Parser access routines */
 extern char *lwgeom_to_ewkt(LWGEOM *lwgeom, int flags);
 extern char *lwgeom_to_hexwkb(LWGEOM *lwgeom, int flags, unsigned int byteorder);
@@ -1136,7 +1144,7 @@
 extern uchar *lwgeom_to_ewkb(LWGEOM *lwgeom, int flags, char byteorder, size_t *ewkblen);
 
 extern char *serialized_lwgeom_to_ewkt(uchar *serialized, int flags);
-extern SERIALIZED_LWGEOM *serialized_lwgeom_from_ewkt(char *wkt_input, int flags);
+extern int serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags);
 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);
 

Modified: trunk/liblwgeom/lwgeom.c
===================================================================
--- trunk/liblwgeom/lwgeom.c	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/lwgeom.c	2008-09-28 15:32:46 UTC (rev 3023)
@@ -513,8 +513,10 @@
 	size_t hexewkblen = size*2;
 	char *hexewkb;
 	long int i;
+	int result;
 	LWGEOM *ret;
 	SERIALIZED_LWGEOM *serialized_lwgeom;
+	LWGEOM_PARSER_RESULT lwg_parser_result;
 
 	/* "HEXify" the EWKB */
 	hexewkb = lwalloc(hexewkblen+1);
@@ -522,7 +524,7 @@
 	hexewkb[hexewkblen] = '\0';
 
 	/* Rely on grammar parser to construct a LWGEOM */
-	serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags);
+	result = serialized_lwgeom_from_ewkt(&lwg_parser_result, hexewkb, flags);
 
 	/* Free intermediate HEXified representation */
 	lwfree(hexewkb);
@@ -542,22 +544,16 @@
 /*
  * Make a serialzed LWGEOM object from a WKT input string
  */
-SERIALIZED_LWGEOM *
-serialized_lwgeom_from_ewkt(char *wkt_input, int flags)
+int
+serialized_lwgeom_from_ewkt(LWGEOM_PARSER_RESULT *lwg_parser_result, char *wkt_input, int flags)
 {
-	SERIALIZED_LWGEOM *serialized_form = parse_lwg(wkt_input, flags,
+
+	int result = parse_lwg(lwg_parser_result, wkt_input, flags,
 		lwalloc, lwerror);
 
-
 	LWDEBUGF(2, "serialized_lwgeom_from_ewkt with %s",wkt_input);
 
-	if (serialized_form == NULL)
-	{
-		lwerror("serialized_lwgeom_from_ewkt:: couldnt parse!");
-		return NULL;
-	}
-
-	return serialized_form;
+	return result;
 }
 
 /*

Modified: trunk/liblwgeom/lwgparse.c
===================================================================
--- trunk/liblwgeom/lwgparse.c	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/lwgparse.c	2008-09-28 15:32:46 UTC (rev 3023)
@@ -169,9 +169,9 @@
 void read_collection(const char **b, read_col_func f);
 void parse_wkb(const char **b);
 void alloc_wkb(const char *parser);
-SERIALIZED_LWGEOM* parse_it(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
-SERIALIZED_LWGEOM* parse_lwg(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
-SERIALIZED_LWGEOM* parse_lwgi(const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
+int parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc);
 
 void
 set_srid(double d_srid)
@@ -1126,8 +1126,8 @@
 /*
 	Parse a string and return a LW_GEOM
 */
-SERIALIZED_LWGEOM *
-parse_it(const char *geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_it(LWGEOM_PARSER_RESULT *lwg_parser_result, const char *geometry, int flags, allocator allocfunc, report_error errfunc)
 {
         LWDEBUGF(2, "parse_it: %s with parser flags %d", geometry, flags);
 
@@ -1136,8 +1136,9 @@
 
 	ferror_occured = 0;
 
-	/* Setup the inital parser flags */
+	/* Setup the inital parser flags and empty the return struct */
 	parser_check_flags = flags;
+	lwg_parser_result->serialized_lwgeom = NULL;
 
 	init_parser(geometry);
 
@@ -1146,23 +1147,26 @@
 	close_parser();
 
 	if (ferror_occured)
-		return NULL;
+		return 0;
 
-	return make_serialized_lwgeom();
+	/* Return the parsed geometry */
+	lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom();
+
+	return -1;
 }
 
-SERIALIZED_LWGEOM *
-parse_lwg(const char* geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc)
 {
 	the_geom.lwgi=0;
-	return parse_it(geometry, flags, allocfunc, errfunc);
+	return parse_it(lwg_parser_result, geometry, flags, allocfunc, errfunc);
 }
 
-SERIALIZED_LWGEOM *
-parse_lwgi(const char* geometry, int flags, allocator allocfunc, report_error errfunc)
+int
+parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* geometry, int flags, allocator allocfunc, report_error errfunc)
 {
 	the_geom.lwgi=1;
-	return parse_it(geometry, flags, allocfunc, errfunc);
+	return parse_it(lwg_parser_result, geometry, flags, allocfunc, errfunc);
 }
 
 void

Modified: trunk/liblwgeom/wktparse.h
===================================================================
--- trunk/liblwgeom/wktparse.h	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/liblwgeom/wktparse.h	2008-09-28 15:32:46 UTC (rev 3023)
@@ -19,6 +19,11 @@
     uchar *lwgeom;
     int size;
 } SERIALIZED_LWGEOM;
+
+typedef struct struct_lwgeom_parser_result
+{
+        SERIALIZED_LWGEOM *serialized_lwgeom;
+} LWGEOM_PARSER_RESULT;
 #endif
 typedef void* (*allocator)(size_t size);
 typedef void  (*freeor)(void* mem);
@@ -96,8 +101,8 @@
 	You are responsible for freeing the returned memory.
 */
 
-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);
+int parse_lwg(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* wkt, int flags, allocator allocfunc,report_error errfunc);
+int parse_lwgi(LWGEOM_PARSER_RESULT *lwg_parser_result, const char* wkt, int flags, allocator allocfunc,report_error errfunc);
 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);

Modified: trunk/lwgeom/lwgeom_inout.c
===================================================================
--- trunk/lwgeom/lwgeom_inout.c	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_inout.c	2008-09-28 15:32:46 UTC (rev 3023)
@@ -64,11 +64,15 @@
 {
 	char *str = PG_GETARG_CSTRING(0);
 	SERIALIZED_LWGEOM *serialized_lwgeom;
+	LWGEOM_PARSER_RESULT lwg_parser_result;
 	LWGEOM *lwgeom;	
 	PG_LWGEOM *ret;
+	int result;
 
 	/* will handle both HEXEWKB and EWKT */
-	serialized_lwgeom = serialized_lwgeom_from_ewkt(str, PARSER_CHECK_ALL);
+	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);
     
 	ret = pglwgeom_serialize(lwgeom);
@@ -463,9 +467,10 @@
 	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;
-	int wkt_size ;
+	int wkt_size, result;
 
 	wkt_size = VARSIZE(wkt_input)-VARHDRSZ; /* actual letters */
 
@@ -476,7 +481,9 @@
 
 	POSTGIS_DEBUGF(3, "in parse_WKT_lwgeom with input: '%s'",wkt);
 
-	serialized_lwgeom = serialized_lwgeom_from_ewkt(wkt, PARSER_CHECK_ALL);
+	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);
     
 	ret = pglwgeom_serialize(lwgeom);

Modified: trunk/lwgeom/lwgeom_ogc.c
===================================================================
--- trunk/lwgeom/lwgeom_ogc.c	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_ogc.c	2008-09-28 15:32:46 UTC (rev 3023)
@@ -967,8 +967,10 @@
 	char *wkt, fc;
 	size_t size;
 	SERIALIZED_LWGEOM *serialized_lwgeom;
-	PG_LWGEOM *result = NULL;
+	LWGEOM_PARSER_RESULT lwg_parser_result;
+	PG_LWGEOM *geom_result = NULL;
 	LWGEOM *lwgeom;
+	int result;
 
         POSTGIS_DEBUG(2, "LWGEOM_from_text");
 
@@ -1002,7 +1004,9 @@
 
 	POSTGIS_DEBUGF(3, "wkt: [%s]", wkt);
 
-	serialized_lwgeom = serialized_lwgeom_from_ewkt(wkt, PARSER_CHECK_ALL);
+	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);
 
 	if ( lwgeom->SRID != -1 || TYPE_GETZM(lwgeom->type) != 0 )
@@ -1013,10 +1017,10 @@
 	/* read user-requested SRID if any */
 	if ( PG_NARGS() > 1 ) lwgeom->SRID = PG_GETARG_INT32(1);
 
-	result = pglwgeom_serialize(lwgeom);
+	geom_result = pglwgeom_serialize(lwgeom);
 	lwgeom_release(lwgeom);
 
-	PG_RETURN_POINTER(result);
+	PG_RETURN_POINTER(geom_result);
 }
 
 /*

Modified: trunk/lwgeom/lwgeom_pg.c
===================================================================
--- trunk/lwgeom/lwgeom_pg.c	2008-09-28 09:03:32 UTC (rev 3022)
+++ trunk/lwgeom/lwgeom_pg.c	2008-09-28 15:32:46 UTC (rev 3023)
@@ -246,9 +246,10 @@
 {
 	PG_LWGEOM *ret;
 	SERIALIZED_LWGEOM *serialized_lwgeom;
+	LWGEOM_PARSER_RESULT lwg_parser_result;
 	char *hexewkb;
 	size_t hexewkblen = ewkblen*2;
-	int i;
+	int i, result;
 
 	hexewkb = lwalloc(hexewkblen+1);
 	for (i=0; i<ewkblen; i++)
@@ -257,8 +258,9 @@
 	}
 	hexewkb[hexewkblen] = '\0';
 
-	serialized_lwgeom = serialized_lwgeom_from_ewkt(hexewkb, flags);
-    
+	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);



More information about the postgis-commits mailing list