Initial skel for geometry_send canonical binary rep.
authorSandro Santilli <strk@keybit.net>
Thu, 16 Dec 2004 12:30:24 +0000 (12:30 +0000)
committerSandro Santilli <strk@keybit.net>
Thu, 16 Dec 2004 12:30:24 +0000 (12:30 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@1155 b70326c6-7e19-0410-871a-916f4a2858ee

lwgeom/lwgeom_inout.c
lwgeom/lwpostgis.sql.in

index b90baa69eeef419d9edc24e69bd9b53828f352c8..d8bdea7e355c22d386bd49012ee00ccfe2d1ef65 100644 (file)
@@ -23,7 +23,7 @@
 #include "stringBuffer.h"
 
 
-//#define DEBUG
+//#define DEBUG 1
 
 #include "lwgeom_pg.h"
 #include "wktparse.h"
@@ -41,6 +41,7 @@ Datum LWGEOM_getBBOX(PG_FUNCTION_ARGS);
 Datum parse_WKT_lwgeom(PG_FUNCTION_ARGS);
 #if USE_VERSION > 73
 Datum LWGEOM_recv(PG_FUNCTION_ARGS);
+Datum LWGEOM_send(PG_FUNCTION_ARGS);
 #endif
 
 
@@ -427,7 +428,7 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS)
 #endif
 
 #ifdef DEBUG
-       elog(NOTICE, "LWGEOMFromWKB returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free));
+       elog(NOTICE, "LWGEOMFromWKB returned %s", unparse_WKB(SERIALIZED_FORM(result),pg_alloc,pg_free,-1));
 #endif
 
 
@@ -440,4 +441,62 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS)
 
         PG_RETURN_POINTER(result);
 }
+
+PG_FUNCTION_INFO_V1(LWGEOM_send);
+Datum LWGEOM_send(PG_FUNCTION_ARGS)
+{
+       PG_LWGEOM *lwgeom_input; // SRID=#;<hexized wkb>
+       char *hexized_wkb_srid;
+       char *hexized_wkb; // hexized_wkb_srid w/o srid
+       char *result; //wkb
+       int len_hexized_wkb;
+       int size_result;
+       char *semicolonLoc;
+       int t;
+       text *type;
+       int SRID=-1;
+
+#ifdef DEBUG
+       elog(NOTICE, "LWGEOM_send called");
+#endif
+
+       lwgeom_input = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
+       hexized_wkb_srid = unparse_WKB(SERIALIZED_FORM(lwgeom_input),
+               lwalloc, lwfree, -1);
+
+//elog(NOTICE, "in WKBFromLWGEOM with WKB = '%s'", hexized_wkb_srid);
+
+       hexized_wkb = hexized_wkb_srid;
+       semicolonLoc = strchr(hexized_wkb_srid,';');
+
+
+       if (semicolonLoc != NULL)
+       {
+               SRID=atoi(hexized_wkb+5); // SRID=
+               hexized_wkb = (semicolonLoc+1);
+       }
+
+#ifdef DEBUG
+               elog(NOTICE, "SRID=%d", SRID);
 #endif
+
+//elog(NOTICE, "in WKBFromLWGEOM with WKB (with no 'SRID=#;' = '%s'", hexized_wkb);
+
+       len_hexized_wkb = strlen(hexized_wkb);
+       size_result = len_hexized_wkb/2 + 4;
+       result = palloc(size_result);
+
+       memcpy(result, &size_result,4); // size header
+
+       // have a hexized string, want to make it binary
+       for (t=0; t< (len_hexized_wkb/2); t++)
+       {
+               ((unsigned char *) result +4)[t] = parse_hex(  hexized_wkb + (t*2) );
+       }
+
+       pfree(hexized_wkb_srid);
+
+       PG_RETURN_POINTER(result);
+}
+
+#endif // USE_VERSION > 73
index 5cd1f6683a2a4594f45c916f177dfc6ca3474c45..0aa40e3109946ebdeccb2f4c99ea7a222fde0d86 100644 (file)
@@ -115,7 +115,7 @@ CREATEFUNCTION geometry_recv(internal)
 
 CREATEFUNCTION geometry_send(geometry)
        RETURNS bytea
-       AS '@MODULE_FILENAME@','WKBFromLWGEOM'
+       AS '@MODULE_FILENAME@','LWGEOM_send'
        LANGUAGE 'C' WITH (isstrict);
 #endif