From c4f92fa22311fec52e97e2c4cc9e1d4ba8f94a30 Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Mon, 6 May 2013 09:40:22 -0700 Subject: [PATCH] Add to string functions, extent function --- lib/TODO.md | 2 + lib/pc_api_internal.h | 2 + lib/pc_patch.c | 8 ++-- lib/pc_patch_ght.c | 105 ++++++++++++++++++++---------------------- pgsql/pc_pgsql.c | 2 +- 5 files changed, 58 insertions(+), 61 deletions(-) diff --git a/lib/TODO.md b/lib/TODO.md index 85b1303..514867c 100644 --- a/lib/TODO.md +++ b/lib/TODO.md @@ -37,3 +37,5 @@ More Functions - PC\_FilterPolygon(patch, wkb) returns patch - PC\_Filter(patch, dimension, expression) returns patch - PC\_Get(pcpatch, dimname) returns Array(numeric) + +- PC\_Transform(pcpatch, newpcid) \ No newline at end of file diff --git a/lib/pc_api_internal.h b/lib/pc_api_internal.h index 77ecf31..9788666 100644 --- a/lib/pc_api_internal.h +++ b/lib/pc_api_internal.h @@ -165,10 +165,12 @@ PCPATCH_UNCOMPRESSED* pc_patch_uncompressed_from_dimensional(const PCPATCH_DIMEN int pc_patch_uncompressed_add_point(PCPATCH_UNCOMPRESSED *c, const PCPOINT *p); /* GHT PATCHES */ +char* pc_patch_ght_to_string(const PCPATCH_GHT *patch); PCPATCH_GHT* pc_patch_ght_from_uncompressed(const PCPATCH_UNCOMPRESSED *pa); PCPATCH_GHT* pc_patch_ght_from_pointlist(const PCPOINTLIST *pdl); PCPATCH_UNCOMPRESSED* pc_patch_uncompressed_from_ght(const PCPATCH_GHT *pght); void pc_patch_ght_free(PCPATCH_GHT *paght); +int pc_patch_ght_compute_extent(PCPATCH_GHT *patch); diff --git a/lib/pc_patch.c b/lib/pc_patch.c index 3f73612..8765852 100644 --- a/lib/pc_patch.c +++ b/lib/pc_patch.c @@ -15,10 +15,6 @@ #include "pc_api_internal.h" #include "stringbuffer.h" - - - - int pc_patch_compute_extent(PCPATCH *patch) { @@ -27,7 +23,7 @@ pc_patch_compute_extent(PCPATCH *patch) case PC_NONE: return pc_patch_uncompressed_compute_extent((PCPATCH_UNCOMPRESSED*)patch); case PC_GHT: - return PC_FAILURE; + return pc_patch_ght_compute_extent((PCPATCH_GHT*)patch); case PC_DIMENSIONAL: return pc_patch_dimensional_compute_extent((PCPATCH_DIMENSIONAL*)patch); } @@ -220,6 +216,8 @@ pc_patch_to_string(const PCPATCH *patch) return pc_patch_uncompressed_to_string((PCPATCH_UNCOMPRESSED*)patch); case PC_DIMENSIONAL: return pc_patch_dimensional_to_string((PCPATCH_DIMENSIONAL*)patch); + case PC_GHT: + return pc_patch_ght_to_string((PCPATCH_GHT*)patch); } pcerror("%s: unsupported compression %d requested", __func__, patch->type); } diff --git a/lib/pc_patch_ght.c b/lib/pc_patch_ght.c index 9231e76..80479e1 100644 --- a/lib/pc_patch_ght.c +++ b/lib/pc_patch_ght.c @@ -105,6 +105,26 @@ ght_schema_from_pc_schema(const PCSCHEMA *pcschema) return schema; } + +static GhtTreePtr +ght_tree_from_pc_patch(const PCPATCH_GHT *paght) +{ + GhtTreePtr tree; + GhtReaderPtr reader; + GhtSchemaPtr ghtschema; + + ghtschema = ght_schema_from_pc_schema(paght->schema); + if ( ! ghtschema ) + return NULL; + + if ( GHT_OK != ght_reader_new_mem(paght->ght, paght->ghtsize, ghtschema, &reader) ) + return NULL; + + if ( GHT_OK != ght_tree_read(reader, &tree) ) + return NULL; + + return tree; +} #endif /* HAVE_LIBGHT */ PCPATCH_GHT * @@ -251,25 +271,7 @@ pc_patch_ght_free(PCPATCH_GHT *paght) #endif } -static GhtTreePtr -ght_tree_from_pc_patch(const PCPATCH_GHT *paght) -{ - GhtTreePtr tree; - GhtReaderPtr reader; - GhtSchemaPtr ghtschema; - - ghtschema = ght_schema_from_pc_schema(paght->schema); - if ( ! ghtschema ) - return NULL; - - if ( GHT_OK != ght_reader_new_mem(paght->ght, paght->ghtsize, ghtschema, &reader) ) - return NULL; - - if ( GHT_OK != ght_tree_read(reader, &tree) ) - return NULL; - - return tree; -} + PCPATCH_UNCOMPRESSED * pc_patch_uncompressed_from_ght(const PCPATCH_GHT *paght) @@ -378,8 +380,6 @@ pc_patch_ght_from_wkb(const PCSCHEMA *schema, const uint8_t *wkb, size_t wkbsize uint32_t npoints; size_t ghtsize; const uint8_t *buf; - GhtTreePtr tree; - GhtArea area; if ( wkb_get_compression(wkb) != PC_GHT ) { @@ -404,13 +404,32 @@ pc_patch_ght_from_wkb(const PCSCHEMA *schema, const uint8_t *wkb, size_t wkbsize patch->ght = pcalloc(ghtsize); memcpy(patch->ght, buf, ghtsize); + if ( PC_SUCCESS != pc_patch_ght_compute_extent(patch) ) + return NULL; + + return (PCPATCH*)patch; +#endif +} + + +int +pc_patch_ght_compute_extent(PCPATCH_GHT *patch) +{ +#ifndef HAVE_LIBGHT + pcerror("%s: libght support is not enabled", __func__); + return NULL; +#else + + GhtTreePtr tree; + GhtArea area; + /* Get a tree */ tree = ght_tree_from_pc_patch(patch); - if ( ! tree ) return NULL; + if ( ! tree ) return PC_FAILURE; /* Calculate bounds and save */ if ( GHT_OK != ght_tree_get_extent(tree, &area) ) - return NULL; + return PC_FAILURE; patch->xmin = area.x.min; patch->xmax = area.x.min; @@ -418,54 +437,30 @@ pc_patch_ght_from_wkb(const PCSCHEMA *schema, const uint8_t *wkb, size_t wkbsize patch->ymax = area.y.min; ght_tree_free(tree); - - return (PCPATCH*)patch; + + return PC_SUCCESS; #endif } - - - -#if 0 char * pc_patch_ght_to_string(const PCPATCH_GHT *pa) { +#ifndef HAVE_LIBGHT + pcerror("%s: libght support is not enabled", __func__); + return NULL; +#else PCPATCH_UNCOMPRESSED *patch = pc_patch_uncompressed_from_ght(pa); char *str = pc_patch_uncompressed_to_string(patch); pc_patch_uncompressed_free(patch); return str; +#endif } -int -pc_patch_ght_compute_extent(PCPATCH_GHT *pdl) -{ - int i; - double xmin, xmax, ymin, ymax; - int rv; - PCBYTES *pcb; +#if 0 - assert(pdl); - assert(pdl->schema); - /* Get x extremes */ - pcb = &(pdl->bytes[pdl->schema->x_position]); - rv = pc_bytes_minmax(pcb, &xmin, &xmax); - xmin = pc_value_scale_offset(xmin, pdl->schema->dims[pdl->schema->x_position]); - xmax = pc_value_scale_offset(xmax, pdl->schema->dims[pdl->schema->x_position]); - pdl->xmin = xmin; - pdl->xmax = xmax; - /* Get y extremes */ - pcb = &(pdl->bytes[pdl->schema->y_position]); - rv = pc_bytes_minmax(pcb, &ymin, &ymax); - ymin = pc_value_scale_offset(xmin, pdl->schema->dims[pdl->schema->y_position]); - ymax = pc_value_scale_offset(xmax, pdl->schema->dims[pdl->schema->y_position]); - pdl->ymin = ymin; - pdl->ymax = ymax; - - return PC_SUCCESS; -} uint8_t * pc_patch_ght_to_wkb(const PCPATCH_GHT *patch, size_t *wkbsize) diff --git a/pgsql/pc_pgsql.c b/pgsql/pc_pgsql.c index 1bad16b..01e4506 100644 --- a/pgsql/pc_pgsql.c +++ b/pgsql/pc_pgsql.c @@ -728,7 +728,7 @@ pc_patch_ght_deserialize(const SERIALIZED_PATCH *serpatch, const PCSCHEMA *schem PCPATCH_GHT *patch; uint32_t ghtsize; - const uint8_t *buf = serpatch->data; + uint8_t *buf = (uint8_t *)serpatch->data; int npoints = serpatch->npoints; /* Reference the external data */