*/
#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.
*/
typedef struct struct_lwgeom_parser_result
{
- SERIALIZED_LWGEOM *serialized_lwgeom;
+ uchar *serialized_lwgeom;
+ int size;
} LWGEOM_PARSER_RESULT;
long int i;
int result;
LWGEOM *ret;
- SERIALIZED_LWGEOM *serialized_lwgeom;
LWGEOM_PARSER_RESULT lwg_parser_result;
/* "HEXify" the EWKB */
lwfree(hexewkb);
/* Deserialize */
- ret = lwgeom_deserialize(serialized_lwgeom->lwgeom);
+ ret = lwgeom_deserialize(lwg_parser_result.serialized_lwgeom);
return ret;
}
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);
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;
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
return 0;
/* Return the parsed geometry */
- lwg_parser_result->serialized_lwgeom = make_serialized_lwgeom();
+ make_serialized_lwgeom(lwg_parser_result);
return -1;
}
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;
/* 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);
/* 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;
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);
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;
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 )
{
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;
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);