Loading lwgeom/lwgeom_inout.c +33 −67 Original line number Diff line number Diff line Loading @@ -155,70 +155,6 @@ Datum LWGEOM_to_text(PG_FUNCTION_ARGS) PG_RETURN_POINTER(text_result); } // // LWGEOM_to_bytea(LWGEOM) // bytea contains canonical binary form, being // internal representation with additional byte containing // byte order // PG_FUNCTION_INFO_V1(LWGEOM_to_bytea); Datum LWGEOM_to_bytea(PG_FUNCTION_ARGS) { bytea *ret; PG_LWGEOM *pglwg; pglwg = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); ret = (bytea *)palloc(pglwg->size+5); VARATT_SIZEP(ret) = pglwg->size+1; *(VARDATA(ret)) = getMachineEndian(); memcpy((void *)(VARDATA(ret)+1), SERIALIZED_FORM(pglwg), pglwg->size-4); #if DEBUG elog(NOTICE, "LWGEOM_to_bytea returning %d bytes (machine endian: %d)", VARSIZE(ret), getMachineEndian()); #endif PG_RETURN_POINTER(ret); } // LWGEOM_from_bytea(bytea) // bytea contains canonical binary form, being // internal representation with additional byte containing // byte order // PG_FUNCTION_INFO_V1(LWGEOM_from_bytea); Datum LWGEOM_from_bytea(PG_FUNCTION_ARGS) { bytea *in; PG_LWGEOM *ret; char flipbytes=0; in = (bytea *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); ret = (PG_LWGEOM *)palloc(VARSIZE(in)-1); ret->size = VARSIZE(in)-1; if ( *(VARDATA(in)) != getMachineEndian() ) flipbytes = 1; if ( flipbytes ) { elog(ERROR, "Unable to handle bytes flipping"); PG_RETURN_NULL(); } else { memcpy(SERIALIZED_FORM(ret), VARDATA(in)+1, VARSIZE(in)-5); } #if DEBUG elog(NOTICE, "LWGEOM_from_bytea returning %d bytes", ret->size); #endif PG_RETURN_POINTER(ret); } // LWGEOMFromWKB(wkb, [SRID] ) // NOTE: wkb is in *binary* not hex form. // Loading Loading @@ -528,7 +464,7 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS) /* Call LWGEOM_from_bytea function... */ result = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( LWGEOM_from_bytea, PointerGetDatum(wkb))); LWGEOMFromWKB, PointerGetDatum(wkb))); #ifdef DEBUG elog(NOTICE, "LWGEOM_recv advancing StringInfo buffer"); Loading @@ -552,14 +488,44 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS) PG_FUNCTION_INFO_V1(LWGEOM_send); Datum LWGEOM_send(PG_FUNCTION_ARGS) { PG_LWGEOM *result; bytea *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_send called"); #endif result = (bytea *)DatumGetPointer(DirectFunctionCall1( WKBFromLWGEOM, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(LWGEOM_to_bytea); Datum LWGEOM_to_bytea(PG_FUNCTION_ARGS) { bytea *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_to_bytea called"); #endif result = (bytea *)DatumGetPointer(DirectFunctionCall1( WKBFromLWGEOM, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(LWGEOM_from_bytea); Datum LWGEOM_from_bytea(PG_FUNCTION_ARGS) { PG_LWGEOM *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_from_bytea start"); #endif result = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( LWGEOM_to_bytea, PG_GETARG_DATUM(0))); LWGEOMFromWKB, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } Loading lwgeom/lwgparse.c +8 −2 Original line number Diff line number Diff line Loading @@ -738,6 +738,7 @@ parse_wkb(const char** b) int4 type; byte xdr = read_wkb_byte(b); swap_order=0; int4 localsrid; if ( xdr != getMachineEndian() ) { Loading Loading @@ -765,8 +766,13 @@ parse_wkb(const char** b) if (type & WKBSRIDFLAG ) { the_geom.hasZ = 1; the_geom.ndims++; // local (in-EWKB) srid spec overrides SRID=#; localsrid = read_wkb_int(b); if ( localsrid != -1 ) { if ( the_geom.srid == -1 ) the_geom.alloc_size += 4; the_geom.srid = localsrid; } } type &=0x0f; Loading lwgeom/wktunparse.c +11 −6 Original line number Diff line number Diff line Loading @@ -444,12 +444,6 @@ output_wkb(byte* geom) geom+=16; } if ( TYPE_HASSRID(type) ) { write_str("SRID="); write_int(read_int(&geom)); write_str(";"); } //type&=0x0f; wkbtype = TYPE_GETTYPE(type); Loading @@ -457,12 +451,20 @@ output_wkb(byte* geom) wkbtype |= WKBZOFFSET; if ( TYPE_HASM(type) ) wkbtype |= WKBMOFFSET; if ( TYPE_HASSRID(type) ) { wkbtype |= WKBSRIDFLAG; } // Write byteorder (as from WKB specs...) write_wkb_bytes(&endianbyte,1,1); write_wkb_int(wkbtype); if ( TYPE_HASSRID(type) ) { write_wkb_int(read_int(&geom)); } switch(TYPE_GETTYPE(type)){ case POINTTYPE: geom=output_wkb_point(geom); Loading Loading @@ -543,6 +545,9 @@ unparse_WKB(byte* serialized, allocator alloc, freeor free, char endian) /****************************************************************** * $Log$ * Revision 1.15 2004/12/21 15:19:01 strk * Canonical binary reverted back to EWKB, now supporting SRID inclusion. * * Revision 1.14 2004/12/17 11:08:53 strk * Moved getMachineEndian from parser to liblwgeom.{h,c}. * Added XDR and NDR defines. Loading Loading
lwgeom/lwgeom_inout.c +33 −67 Original line number Diff line number Diff line Loading @@ -155,70 +155,6 @@ Datum LWGEOM_to_text(PG_FUNCTION_ARGS) PG_RETURN_POINTER(text_result); } // // LWGEOM_to_bytea(LWGEOM) // bytea contains canonical binary form, being // internal representation with additional byte containing // byte order // PG_FUNCTION_INFO_V1(LWGEOM_to_bytea); Datum LWGEOM_to_bytea(PG_FUNCTION_ARGS) { bytea *ret; PG_LWGEOM *pglwg; pglwg = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); ret = (bytea *)palloc(pglwg->size+5); VARATT_SIZEP(ret) = pglwg->size+1; *(VARDATA(ret)) = getMachineEndian(); memcpy((void *)(VARDATA(ret)+1), SERIALIZED_FORM(pglwg), pglwg->size-4); #if DEBUG elog(NOTICE, "LWGEOM_to_bytea returning %d bytes (machine endian: %d)", VARSIZE(ret), getMachineEndian()); #endif PG_RETURN_POINTER(ret); } // LWGEOM_from_bytea(bytea) // bytea contains canonical binary form, being // internal representation with additional byte containing // byte order // PG_FUNCTION_INFO_V1(LWGEOM_from_bytea); Datum LWGEOM_from_bytea(PG_FUNCTION_ARGS) { bytea *in; PG_LWGEOM *ret; char flipbytes=0; in = (bytea *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); ret = (PG_LWGEOM *)palloc(VARSIZE(in)-1); ret->size = VARSIZE(in)-1; if ( *(VARDATA(in)) != getMachineEndian() ) flipbytes = 1; if ( flipbytes ) { elog(ERROR, "Unable to handle bytes flipping"); PG_RETURN_NULL(); } else { memcpy(SERIALIZED_FORM(ret), VARDATA(in)+1, VARSIZE(in)-5); } #if DEBUG elog(NOTICE, "LWGEOM_from_bytea returning %d bytes", ret->size); #endif PG_RETURN_POINTER(ret); } // LWGEOMFromWKB(wkb, [SRID] ) // NOTE: wkb is in *binary* not hex form. // Loading Loading @@ -528,7 +464,7 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS) /* Call LWGEOM_from_bytea function... */ result = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( LWGEOM_from_bytea, PointerGetDatum(wkb))); LWGEOMFromWKB, PointerGetDatum(wkb))); #ifdef DEBUG elog(NOTICE, "LWGEOM_recv advancing StringInfo buffer"); Loading @@ -552,14 +488,44 @@ Datum LWGEOM_recv(PG_FUNCTION_ARGS) PG_FUNCTION_INFO_V1(LWGEOM_send); Datum LWGEOM_send(PG_FUNCTION_ARGS) { PG_LWGEOM *result; bytea *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_send called"); #endif result = (bytea *)DatumGetPointer(DirectFunctionCall1( WKBFromLWGEOM, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(LWGEOM_to_bytea); Datum LWGEOM_to_bytea(PG_FUNCTION_ARGS) { bytea *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_to_bytea called"); #endif result = (bytea *)DatumGetPointer(DirectFunctionCall1( WKBFromLWGEOM, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } PG_FUNCTION_INFO_V1(LWGEOM_from_bytea); Datum LWGEOM_from_bytea(PG_FUNCTION_ARGS) { PG_LWGEOM *result; #ifdef DEBUG elog(NOTICE, "LWGEOM_from_bytea start"); #endif result = (PG_LWGEOM *)DatumGetPointer(DirectFunctionCall1( LWGEOM_to_bytea, PG_GETARG_DATUM(0))); LWGEOMFromWKB, PG_GETARG_DATUM(0))); PG_RETURN_POINTER(result); } Loading
lwgeom/lwgparse.c +8 −2 Original line number Diff line number Diff line Loading @@ -738,6 +738,7 @@ parse_wkb(const char** b) int4 type; byte xdr = read_wkb_byte(b); swap_order=0; int4 localsrid; if ( xdr != getMachineEndian() ) { Loading Loading @@ -765,8 +766,13 @@ parse_wkb(const char** b) if (type & WKBSRIDFLAG ) { the_geom.hasZ = 1; the_geom.ndims++; // local (in-EWKB) srid spec overrides SRID=#; localsrid = read_wkb_int(b); if ( localsrid != -1 ) { if ( the_geom.srid == -1 ) the_geom.alloc_size += 4; the_geom.srid = localsrid; } } type &=0x0f; Loading
lwgeom/wktunparse.c +11 −6 Original line number Diff line number Diff line Loading @@ -444,12 +444,6 @@ output_wkb(byte* geom) geom+=16; } if ( TYPE_HASSRID(type) ) { write_str("SRID="); write_int(read_int(&geom)); write_str(";"); } //type&=0x0f; wkbtype = TYPE_GETTYPE(type); Loading @@ -457,12 +451,20 @@ output_wkb(byte* geom) wkbtype |= WKBZOFFSET; if ( TYPE_HASM(type) ) wkbtype |= WKBMOFFSET; if ( TYPE_HASSRID(type) ) { wkbtype |= WKBSRIDFLAG; } // Write byteorder (as from WKB specs...) write_wkb_bytes(&endianbyte,1,1); write_wkb_int(wkbtype); if ( TYPE_HASSRID(type) ) { write_wkb_int(read_int(&geom)); } switch(TYPE_GETTYPE(type)){ case POINTTYPE: geom=output_wkb_point(geom); Loading Loading @@ -543,6 +545,9 @@ unparse_WKB(byte* serialized, allocator alloc, freeor free, char endian) /****************************************************************** * $Log$ * Revision 1.15 2004/12/21 15:19:01 strk * Canonical binary reverted back to EWKB, now supporting SRID inclusion. * * Revision 1.14 2004/12/17 11:08:53 strk * Moved getMachineEndian from parser to liblwgeom.{h,c}. * Added XDR and NDR defines. Loading