dat = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull);
if ( isnull ) {
cberror(be, "Topology '%s' has null identifier", name);
+ SPI_freetuptable(SPI_tuptable);
return NULL;
}
topo->id = DatumGetInt32(dat);
dat = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 2, &isnull);
if ( isnull ) {
cberror(be, "Topology '%s' has null SRID", name);
+ SPI_freetuptable(SPI_tuptable);
return NULL;
}
topo->srid = DatumGetInt32(dat);
"id %d, srid %d, precision %g",
name, topo->id, topo->srid, topo->precision);
+ SPI_freetuptable(SPI_tuptable);
+
return topo;
}
Datum dat;
int val;
GSERIALIZED *geom;
+ LWGEOM *lwg;
int colno = 0;
POSTGIS_DEBUGF(2, "fillEdgeFields: got %d atts and fields %x",
}
if ( fields & LWT_COL_EDGE_GEOM ) {
dat = SPI_getbinval(row, rowdesc, ++colno, &isnull);
- if ( ! isnull ) {
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(dat);
- edge->geom = lwgeom_as_lwline(lwgeom_from_gserialized(geom));
- } else {
+ if ( ! isnull ) {{
+ MemoryContext oldcontext = CurrentMemoryContext;
+ geom = (GSERIALIZED *)PG_DETOAST_DATUM(dat);
+ lwg = lwgeom_from_gserialized(geom);
+ MemoryContextSwitchTo( TopMemoryContext );
+ edge->geom = lwgeom_as_lwline(lwgeom_clone_deep(lwg));
+ MemoryContextSwitchTo( oldcontext ); /* switch back */
+ lwgeom_free(lwg);
+ if ( DatumGetPointer(dat) != (Pointer)geom ) pfree(geom); /* IF_COPY */
+ }} else {
lwpgwarning("Found edge with NULL geometry !");
edge->geom = NULL;
}
bool isnull;
Datum dat;
GSERIALIZED *geom;
+ LWGEOM *lwg;
int colno = 0;
if ( fields & LWT_COL_NODE_NODE_ID ) {
if ( fields & LWT_COL_NODE_GEOM ) {
dat = SPI_getbinval(row, rowdesc, ++colno, &isnull);
if ( ! isnull ) {
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(dat);
- node->geom = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom));
+ geom = (GSERIALIZED *)PG_DETOAST_DATUM(dat);
+ lwg = lwgeom_from_gserialized(geom);
+ node->geom = lwgeom_as_lwpoint(lwgeom_clone_deep(lwg));
+ lwgeom_free(lwg);
+ if ( DatumGetPointer(dat) != (Pointer)geom ) pfree(geom); /* IF_COPY */
} else {
lwpgnotice("Found node with NULL geometry !");
node->geom = NULL;
dat = SPI_getbinval(row, rowdesc, ++colno, &isnull);
if ( ! isnull ) {
/* NOTE: this is a geometry of which we want to take (and clone) the BBOX */
- geom = (GSERIALIZED *)PG_DETOAST_DATUM_COPY(dat);
+ geom = (GSERIALIZED *)PG_DETOAST_DATUM(dat);
g = lwgeom_from_gserialized(geom);
box = lwgeom_get_bbox(g);
if ( box ) {
lwpgnotice("Found face with EMPTY MBR !");
face->mbr = NULL;
}
+ lwgeom_free(g);
+ if ( DatumGetPointer(dat) != (Pointer)geom ) pfree(geom);
} else {
/* NOTE: perfectly fine for universe face */
POSTGIS_DEBUG(1, "Found face with NULL MBR");
fillEdgeFields(&edges[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
fillEdgeFields(&edges[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
fillEdgeFields(&edges[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
fillFaceFields(&faces[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return faces;
}
" is edge %d", i, edge, val);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
fillNodeFields(&nodes[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return nodes;
}
fillNodeFields(&nodes[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return nodes;
}
*numelems = exists ? 1 : 0;
POSTGIS_DEBUGF(1, "cb_getEdgeWithinDistance2D: exists ? %d", *numelems);
}
+
+ SPI_freetuptable(SPI_tuptable);
+
return NULL;
}
fillEdgeFields(&edges[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
exists = DatumGetBool(dat);
*numelems = exists ? 1 : 0;
}
+
+ SPI_freetuptable(SPI_tuptable);
+
return NULL;
}
else
fillNodeFields(&nodes[i], row, SPI_tuptable->tupdesc, fields);
}
*numelems = SPI_processed;
+
+ SPI_freetuptable(SPI_tuptable);
+
return nodes;
}
}
SPI_tuptable->tupdesc, LWT_COL_NODE_NODE_ID);
}
+ SPI_freetuptable(SPI_tuptable);
+
return 1;
}
}
}
+ SPI_freetuptable(SPI_tuptable);
+
return SPI_processed;
}
}
}
+ SPI_freetuptable(SPI_tuptable);
+
return SPI_processed;
}
return -1;
}
edge_id = DatumGetInt64(dat); /* sequences return 64bit integers */
+
+ SPI_freetuptable(SPI_tuptable);
+
return edge_id;
}
topogeo_id, layer_id, negate ? -new_edge2 : new_edge2, element_type);
}
}
+
+ SPI_freetuptable(SPI_tuptable);
+
POSTGIS_DEBUGF(1, "cb_updateTopoGeomEdgeSplit query: %s", sql->data);
spi_result = SPI_execute(sql->data, false, 0);
MemoryContextSwitchTo( oldcontext ); /* switch back */
}
}
+ SPI_freetuptable(SPI_tuptable);
+
POSTGIS_DEBUGF(1, "cb_updateTopoGeomFaceSplit query: %s", sql->data);
spi_result = SPI_execute(sql->data, false, 0);
MemoryContextSwitchTo( oldcontext ); /* switch back */
pfree(sqldata.data);
return 0;
}
+
if ( SPI_processed ) topo->be_data->data_changed = true;
}
table_name = SPI_getvalue(row, tdesc, 4);
col_name = SPI_getvalue(row, tdesc, 5);
+ SPI_freetuptable(SPI_tuptable);
+
cberror(topo->be_data, "TopoGeom %s in layer %s "
"(%s.%s.%s) cannot be represented "
"dropping edge %" LWTFMT_ELEMID,
table_name = SPI_getvalue(row, tdesc, 4);
col_name = SPI_getvalue(row, tdesc, 5);
+ SPI_freetuptable(SPI_tuptable);
+
cberror(topo->be_data, "TopoGeom %s in layer %s "
"(%s.%s.%s) cannot be represented "
"healing faces %" LWTFMT_ELEMID
table_name = SPI_getvalue(row, tdesc, 4);
col_name = SPI_getvalue(row, tdesc, 5);
+ SPI_freetuptable(SPI_tuptable);
+
cberror(topo->be_data, "TopoGeom %s in layer %s "
"(%s.%s.%s) cannot be represented "
"healing edges %" LWTFMT_ELEMID
dat = SPI_getbinval( SPI_tuptable->vals[0],
SPI_tuptable->tupdesc, 1, &isnull );
if ( isnull ) {
+ SPI_freetuptable(SPI_tuptable);
cberror(topo->be_data, "corrupted topology: face with NULL face_id");
return -2;
}
face_id = DatumGetInt32(dat);
+ SPI_freetuptable(SPI_tuptable);
return face_id;
}
bool isnull, exists;
dat = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull);
exists = DatumGetBool(dat);
+ SPI_freetuptable(SPI_tuptable);
*numelems = exists ? 1 : 0;
POSTGIS_DEBUGF(1, "cb_getNodeWithinBox2D: exists ? %d", *numelems);
}
fillNodeFields(&nodes[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return nodes;
}
dat = SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &isnull);
exists = DatumGetBool(dat);
*numelems = exists ? 1 : 0;
+ SPI_freetuptable(SPI_tuptable);
POSTGIS_DEBUGF(1, "cb_getEdgeWithinBox2D: exists ? %d", *numelems);
}
return NULL;
fillEdgeFields(&edges[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return edges;
}
*numelems = exists ? 1 : 0;
POSTGIS_DEBUGF(1, "cb_getFaceWithinBox2D: exists ? %d", *numelems);
}
+
+ SPI_freetuptable(SPI_tuptable);
+
return NULL;
}
fillFaceFields(&faces[i], row, SPI_tuptable->tupdesc, fields);
}
+ SPI_freetuptable(SPI_tuptable);
+
return faces;
}