ret = lwline_split_by_point_to(line, point, coll);
CU_ASSERT_EQUAL(ret, 1);
CU_ASSERT_EQUAL(coll->ngeoms, 0);
- lwgeom_free((LWGEOM*)point);
+ lwpoint_free(point);
point = lwgeom_as_lwpoint(lwgeom_from_wkt(
"POINT(10 0)",
ret = lwline_split_by_point_to(line, point, coll);
CU_ASSERT_EQUAL(ret, 1);
CU_ASSERT_EQUAL(coll->ngeoms, 0);
- lwgeom_free((LWGEOM*)point);
+ lwpoint_free(point);
point = lwgeom_as_lwpoint(lwgeom_from_wkt(
"POINT(5 0)",
ret = lwline_split_by_point_to(line, point, coll);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_EQUAL(coll->ngeoms, 0);
- lwgeom_free((LWGEOM*)point);
+ lwpoint_free(point);
point = lwgeom_as_lwpoint(lwgeom_from_wkt(
"POINT(5 5)",
ret = lwline_split_by_point_to(line, point, coll);
CU_ASSERT_EQUAL(ret, 2);
CU_ASSERT_EQUAL(coll->ngeoms, 2);
- lwgeom_free((LWGEOM*)point);
+ lwpoint_free(point);
point = lwgeom_as_lwpoint(lwgeom_from_wkt(
"POINT(2 2)",
ret = lwline_split_by_point_to(line, point, coll);
CU_ASSERT_EQUAL(ret, 2);
CU_ASSERT_EQUAL(coll->ngeoms, 4);
- lwgeom_free((LWGEOM*)point);
+ lwpoint_free(point);
- lwgeom_free((LWGEOM*)coll);
-
- lwgeom_free((LWGEOM*)line);
+ lwcollection_free(coll);
+ lwline_free(line);
#endif /* POSTGIS_GEOS_VERSION >= 33 */
}
void lwcircstring_free(LWCIRCSTRING *curve)
{
+ if ( ! curve ) return;
+
if ( curve->bbox )
lwfree(curve->bbox);
if ( curve->points )
void lwcollection_free(LWCOLLECTION *col)
{
int i;
+ if ( ! col ) return;
+
if ( col->bbox )
{
lwfree(col->bbox);
return ogeom;
}
+
+/**
+* Free the containing LWGEOM and the associated BOX. Leave the underlying
+* geoms/points/point objects intact. Useful for functions that are stripping
+* out subcomponents of complex objects, or building up new temporary objects
+* on top of subcomponents.
+*/
void
lwgeom_release(LWGEOM *lwgeom)
{
- uint32_t i;
- LWCOLLECTION *col;
-
if ( ! lwgeom )
lwerror("lwgeom_release: someone called on 0x0");
if ( lwgeom->bbox )
{
LWDEBUGF(3, "lwgeom_release: releasing bbox. %p", lwgeom->bbox);
-
lwfree(lwgeom->bbox);
}
-
- /* Collection */
- if ( (col=lwgeom_as_lwcollection(lwgeom)) )
- {
- LWDEBUG(3, "lwgeom_release: Releasing collection.");
-
- for (i=0; i<col->ngeoms; i++)
- {
- lwgeom_release(col->geoms[i]);
- }
- lwfree(lwgeom);
- }
-
- /* Single element */
- else lwfree(lwgeom);
+ lwfree(lwgeom);
}
GEOSGeometry *gepu;
LWMPOINT *epall = lwgeom_extract_endpoints(lwg);
GEOSGeometry *gepall = LWGEOM2GEOS((LWGEOM*)epall);
+ lwmpoint_free(epall);
if ( ! gepall ) {
- lwgeom_free((LWGEOM*)epall);
lwerror("LWGEOM2GEOS: %s", lwgeom_geos_errmsg);
return NULL;
}
- lwgeom_free((LWGEOM*)epall);
/* UnaryUnion to remove duplicates */
/* TODO: do it all within pgis using indices */
}
lwgeom_free(ep);
- lwgeom_free((LWGEOM*)col);
+ lwcollection_free(col);
lines->srid = lwgeom_in->srid;
return (LWGEOM*)lines;
void lwline_free (LWLINE *line)
{
+ if ( ! line ) return;
+
if ( line->bbox )
lwfree(line->bbox);
if ( line->points )
void lwmline_free(LWMLINE *mline)
{
int i;
+ if ( ! mline ) return;
+
if ( mline->bbox )
lwfree(mline->bbox);
void lwmpoint_free(LWMPOINT *mpt)
{
int i;
+
+ if ( ! mpt ) return;
+
if ( mpt->bbox )
lwfree(mpt->bbox);
void lwmpoly_free(LWMPOLY *mpoly)
{
int i;
+ if ( ! mpoly ) return;
if ( mpoly->bbox )
lwfree(mpoly->bbox);
void lwpoint_free(LWPOINT *pt)
{
+ if ( ! pt ) return;
+
if ( pt->bbox )
lwfree(pt->bbox);
if ( pt->point )
{
int t;
+ if( ! poly ) return;
+
if ( poly->bbox )
lwfree(poly->bbox);
void lwpsurface_free(LWPSURFACE *psurf)
{
int i;
-
+ if ( ! psurf ) return;
if ( psurf->bbox )
lwfree(psurf->bbox);
void lwtin_free(LWTIN *tin)
{
int i;
-
+ if ( ! tin ) return;
if ( tin->bbox )
lwfree(tin->bbox);
void lwtriangle_free(LWTRIANGLE *triangle)
{
+ if ( ! triangle ) return;
+
if (triangle->bbox)
lwfree(triangle->bbox);
distance = lwgeom_distance_spheroid(lwgeom1, lwgeom2, &s, FP_TOLERANCE);
+ /* Clean up */
+ lwgeom_free(lwgeom1);
+ lwgeom_free(lwgeom2);
+ PG_FREE_IF_COPY(g1, 0);
+ PG_FREE_IF_COPY(g2, 1);
+
/* Something went wrong, negative return... should already be eloged, return NULL */
if ( distance < 0.0 )
{
- PG_FREE_IF_COPY(g1, 0);
- PG_FREE_IF_COPY(g2, 1);
PG_RETURN_NULL();
}
- /* Clean up, but not all the way to the point arrays */
- lwgeom_release(lwgeom1);
- lwgeom_release(lwgeom2);
-
- PG_FREE_IF_COPY(g1, 0);
- PG_FREE_IF_COPY(g2, 1);
PG_RETURN_FLOAT8(distance);
-
}
/*
distance = lwgeom_distance_spheroid(lwgeom1, lwgeom2, &s, tolerance);
+ /* Clean up */
+ lwgeom_free(lwgeom1);
+ lwgeom_free(lwgeom2);
+ PG_FREE_IF_COPY(g1, 0);
+ PG_FREE_IF_COPY(g2, 1);
+
/* Something went wrong... should already be eloged, return FALSE */
if ( distance < 0.0 )
{
PG_RETURN_BOOL(FALSE);
}
- /* Clean up, but not all the way to the point arrays */
- lwgeom_release(lwgeom1);
- lwgeom_release(lwgeom2);
-
- PG_FREE_IF_COPY(g1, 0);
- PG_FREE_IF_COPY(g2, 1);
PG_RETURN_BOOL(distance < tolerance);
}
/* EMPTY things have no area */
if ( lwgeom_is_empty(lwgeom) )
{
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
PG_RETURN_FLOAT8(0.0);
}
else
area = lwgeom_area_sphere(lwgeom, &s);
+ /* Clean up */
+ lwgeom_free(lwgeom);
+ PG_FREE_IF_COPY(g, 0);
+
/* Something went wrong... */
if ( area < 0.0 )
{
PG_RETURN_NULL();
}
- /* Clean up, but not all the way to the point arrays */
- lwgeom_release(lwgeom);
-
- PG_FREE_IF_COPY(g, 0);
PG_RETURN_FLOAT8(area);
-
}
/*
/* EMPTY never intersects with another geometry */
if ( lwgeom_is_empty(lwgeom1) || lwgeom_is_empty(lwgeom2) )
{
- lwgeom_release(lwgeom1);
- lwgeom_release(lwgeom2);
+ lwgeom_free(lwgeom1);
+ lwgeom_free(lwgeom2);
PG_FREE_IF_COPY(g1, 0);
PG_FREE_IF_COPY(g2, 1);
PG_RETURN_BOOL(false);
/* Calculate answer */
result = lwgeom_covers_lwgeom_sphere(lwgeom1, lwgeom2);
- /* Clean up, but not all the way to the point arrays */
- lwgeom_release(lwgeom1);
- lwgeom_release(lwgeom2);
-
+ /* Clean up */
+ lwgeom_free(lwgeom1);
+ lwgeom_free(lwgeom2);
PG_FREE_IF_COPY(g1, 0);
PG_FREE_IF_COPY(g2, 1);
+
PG_RETURN_BOOL(result);
}
int npoints = 0;
npoints = lwgeom_count_vertices(lwgeom);
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_INT32(npoints);
int nrings = 0;
nrings = lwgeom_count_rings(lwgeom);
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_INT32(nrings);
{
GSERIALIZED *geom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
GSERIALIZED *result;
- LWGEOM *lwgeoms[1];
+ LWGEOM **lwgeoms;
LWGEOM *lwgeom;
int srid;
GBOX *bbox;
bbox = lwgeom->bbox;
lwgeom->srid = SRID_UNKNOWN;
lwgeom->bbox = NULL;
+ lwgeoms = palloc(sizeof(LWGEOM*));
lwgeoms[0] = lwgeom;
lwgeom = (LWGEOM *)lwcollection_construct(COLLECTIONTYPE,
srid, bbox, 1,
}
result = geometry_serialize(lwgeom);
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_POINTER(result);
ret = geometry_serialize(lwgeom);
/* Release deserialized geometry */
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
/* Release detoasted geometry */
pfree(geom);
PG_FREE_IF_COPY(pglwg1, 0);
PG_FREE_IF_COPY(pglwg2, 1);
- lwgeom_release((LWGEOM *)lwgeoms[0]);
- lwgeom_release((LWGEOM *)lwgeoms[1]);
+ lwgeom_free(lwgeoms[0]);
+ lwgeom_free(lwgeoms[1]);
PG_RETURN_POINTER(result);
}
}
outpoly = lwpoly_from_lwlines(shell, nholes, holes);
-
POSTGIS_DEBUGF(3, "%s", lwgeom_summary((LWGEOM*)outpoly, 0));
-
result = geometry_serialize((LWGEOM *)outpoly);
+ lwline_free((LWLINE*)shell);
PG_FREE_IF_COPY(pglwg1, 0);
- lwgeom_release((LWGEOM *)shell);
- for (i=0; i<nholes; i++) lwgeom_release((LWGEOM *)holes[i]);
+
+ for (i=0; i<nholes; i++)
+ {
+ lwline_free((LWLINE*)holes[i]);
+ }
PG_RETURN_POINTER(result);
}
out = geometry_serialize(lwgeom);
+ lwgeom_free(lwgeom);
PG_FREE_IF_COPY(in, 0);
- lwgeom_release(lwgeom);
PG_RETURN_POINTER(out);
}
}
outline = lwline_removepoint(line, which);
-
- result = geometry_serialize((LWGEOM *)outline);
-
/* Release memory */
+ lwline_free(line);
PG_FREE_IF_COPY(pglwg1, 0);
- lwgeom_release((LWGEOM *)line);
- lwgeom_release((LWGEOM *)outline);
- PG_RETURN_POINTER(result);
+ result = geometry_serialize((LWGEOM *)outline);
+ lwline_free(outline);
+ PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(LWGEOM_setpoint_linestring);
PG_RETURN_NULL();
}
getPoint4d_p(lwpoint->point, 0, &newpoint);
- lwgeom_release((LWGEOM *)lwpoint);
+ lwpoint_free(lwpoint);
PG_FREE_IF_COPY(pglwg2, 2);
lwg = lwgeom_from_gserialized(pglwg1);
result = geometry_serialize((LWGEOM *)line);
/* Release memory */
+ lwline_free(line);
pfree(pglwg1); /* we forced copy, POINARRAY is released now */
- lwgeom_release((LWGEOM *)line);
PG_RETURN_POINTER(result);
-
}
/* convert LWGEOM to ewkt (in TEXT format) */
else
lwout = (LWGEOM*)lwmline_measured_from_lwmline((LWMLINE*)lwin, start_measure, end_measure);
- lwgeom_release(lwin);
+ lwgeom_free(lwin);
if ( lwout == NULL )
PG_RETURN_NULL();
lwout = lwgeom_locate_between_m(lwin,
start_measure, end_measure);
- lwgeom_release(lwin);
+ lwgeom_free(lwin);
if ( lwout == NULL )
{
}
gout = geometry_serialize(lwout);
- lwgeom_release(lwout);
+ lwgeom_free(lwout);
PG_RETURN_POINTER(gout);
}
}
g3 = (GEOSGeometry *)GEOSConvexHull(g1);
+ GEOSGeom_destroy(g1);
if (g3 == NULL)
{
- GEOSGeom_destroy(g1);
lwerror("GEOSConvexHull: %s", lwgeom_geos_errmsg);
PG_RETURN_NULL(); /* never get here */
}
-
POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3));
GEOSSetSRID(g3, srid);
lwout = GEOS2LWGEOM(g3, gserialized_has_z(geom1));
+ GEOSGeom_destroy(g3);
if (lwout == NULL)
{
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
elog(ERROR,"convexhull() failed to convert GEOS geometry to LWGEOM");
PG_RETURN_NULL(); /* never get here */
}
}
result = geometry_serialize(lwout);
+ lwgeom_free(lwout);
if (result == NULL)
{
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
elog(ERROR,"GEOS convexhull() threw an error (result postgis geometry formation)!");
PG_RETURN_NULL(); /* never get here */
}
- lwgeom_release(lwout);
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
-
PG_FREE_IF_COPY(geom1, 0);
PG_RETURN_POINTER(result);
}
g3 = GEOSTopologyPreserveSimplify(g1,tolerance);
+ GEOSGeom_destroy(g1);
if (g3 == NULL)
{
- GEOSGeom_destroy(g1);
lwerror("GEOSTopologyPreserveSimplify: %s", lwgeom_geos_errmsg);
PG_RETURN_NULL(); /* never get here */
}
-
POSTGIS_DEBUGF(3, "result: %s", GEOSGeomToWKT(g3));
GEOSSetSRID(g3, gserialized_get_srid(geom1));
result = GEOS2POSTGIS(g3, gserialized_has_z(geom1));
+ GEOSGeom_destroy(g3);
if (result == NULL)
{
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
elog(ERROR,"GEOS topologypreservesimplify() threw an error (result postgis geometry formation)!");
PG_RETURN_NULL(); /* never get here */
}
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
PG_FREE_IF_COPY(geom1, 0);
PG_RETURN_POINTER(result);
#if POSTGIS_GEOS_VERSION >= 32
- g3 = GEOSBufferWithStyle(g1, size, quadsegs,
- endCapStyle, joinStyle, mitreLimit);
+ g3 = GEOSBufferWithStyle(g1, size, quadsegs, endCapStyle, joinStyle, mitreLimit);
+ GEOSGeom_destroy(g1);
#else /* POSTGIS_GEOS_VERSION < 32 */
}
g3 = GEOSBuffer(g1,size,quadsegs);
+ GEOSGeom_destroy(g1);
#endif /* POSTGIS_GEOS_VERSION < 32 */
if (g3 == NULL)
{
- GEOSGeom_destroy(g1);
lwerror("GEOSBuffer: %s", lwgeom_geos_errmsg);
PG_RETURN_NULL(); /* never get here */
}
GEOSSetSRID(g3, gserialized_get_srid(geom1));
result = GEOS2POSTGIS(g3, gserialized_has_z(geom1));
+ GEOSGeom_destroy(g3);
if (result == NULL)
{
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
elog(ERROR,"GEOS buffer() threw an error (result postgis geometry formation)!");
PG_RETURN_NULL(); /* never get here */
}
- GEOSGeom_destroy(g1);
- GEOSGeom_destroy(g3);
PG_FREE_IF_COPY(geom1, 0);
-
PG_RETURN_POINTER(result);
}
lwerror("unable to deserialize input");
}
g1 = LWGEOM2GEOS(lwgeom);
+ lwgeom_free(lwgeom);
+
if ( ! g1 )
{
/* should we drop the following
* notice now that we have ST_isValidReason ?
*/
lwnotice("%s", lwgeom_geos_errmsg);
- lwgeom_release(lwgeom);
PG_RETURN_BOOL(FALSE);
}
- lwgeom_release(lwgeom);
result = GEOSisValid(g1);
-
GEOSGeom_destroy(g1);
+
if (result == 2)
{
elog(ERROR,"GEOS isvalid() threw an error!");
}
PG_FREE_IF_COPY(geom1, 0);
-
PG_RETURN_BOOL(result);
}
elog(ERROR,"Type isn't poly or multipoly!");
PG_RETURN_NULL();
}
+ lwgeom_free(lwgeom);
+ lwpoint_free(point);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
- lwgeom_release((LWGEOM *)lwgeom);
- lwgeom_release((LWGEOM *)point);
if ( result == 1 ) /* completely inside */
{
PG_RETURN_BOOL(TRUE);
PG_RETURN_NULL();
}
+ lwgeom_free(lwgeom);
+ lwpoint_free(point);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
- lwgeom_release((LWGEOM *)lwgeom);
- lwgeom_release((LWGEOM *)point);
if ( result != -1 ) /* not outside */
{
PG_RETURN_BOOL(TRUE);
PG_RETURN_NULL();
}
+ lwgeom_free(lwgeom);
+ lwpoint_free(point);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
- lwgeom_release((LWGEOM *)lwgeom);
- lwgeom_release((LWGEOM *)point);
if ( result != -1 ) /* not outside */
{
PG_RETURN_BOOL(TRUE);
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
if ( gserialized_get_gbox_p(geom1, &box1) &&
- gserialized_get_gbox_p(geom2, &box2) )
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( gbox_overlaps_2d(&box1, &box2) == LW_FALSE )
{
PG_RETURN_NULL();
}
+ lwgeom_free(lwgeom);
+ lwpoint_free(point);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
- lwgeom_release((LWGEOM *)lwgeom);
- lwgeom_release((LWGEOM *)point);
if ( result != -1 ) /* not outside */
{
PG_RETURN_BOOL(TRUE);
}
result = geometry_serialize(lwgeom);
+ lwgeom_free(lwgeom);
return result;
}
return NULL;
}
ret = LWGEOM2GEOS(lwgeom);
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
if ( ! ret )
{
/* lwerror("POSTGIS2GEOS conversion failed"); */
lwgeom_in = lwgeom_from_gserialized(geom);
lwgeom_out = lwgeom_buildarea(lwgeom_in);
+ lwgeom_free(lwgeom_in) ;
+ PG_FREE_IF_COPY(geom, 0);
+
if ( ! lwgeom_out ) {
- lwgeom_free(lwgeom_in) ;
- PG_FREE_IF_COPY(geom, 0);
PG_RETURN_NULL();
}
result = geometry_serialize(lwgeom_out) ;
-
lwgeom_free(lwgeom_out) ;
- lwgeom_free(lwgeom_in) ;
- PG_FREE_IF_COPY(geom, 0);
PG_RETURN_POINTER(result);
}
geom2 = (GSERIALIZED *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
tolerance = PG_GETARG_FLOAT8(2);
- lwgeom1 = lwgeom_from_gserialized(geom1) ;
- lwgeom2 = lwgeom_from_gserialized(geom2) ;
+ lwgeom1 = lwgeom_from_gserialized(geom1);
+ lwgeom2 = lwgeom_from_gserialized(geom2);
lwresult = lwgeom_snap(lwgeom1, lwgeom2, tolerance);
- result = geometry_serialize(lwresult);
-
lwgeom_free(lwgeom1);
lwgeom_free(lwgeom2);
- lwgeom_free(lwresult);
-
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
+ result = geometry_serialize(lwresult);
+ lwgeom_free(lwresult);
+
PG_RETURN_POINTER(result);
#endif /* POSTGIS_GEOS_VERSION >= 33 */
error_if_srid_mismatch(lwgeom_in->srid, lwblade_in->srid);
lwgeom_out = lwgeom_split(lwgeom_in, lwblade_in);
+ lwgeom_free(lwgeom_in);
+ lwgeom_free(lwblade_in);
+ PG_FREE_IF_COPY(in, 0);
+ PG_FREE_IF_COPY(blade_in, 1);
+
if ( ! lwgeom_out )
{
- PG_FREE_IF_COPY(in, 0);
- PG_FREE_IF_COPY(blade_in, 1);
PG_RETURN_NULL();
}
out = geometry_serialize(lwgeom_out);
-
- PG_FREE_IF_COPY(in, 0);
- PG_FREE_IF_COPY(blade_in, 1);
+ lwgeom_free(lwgeom_out);
PG_RETURN_POINTER(out);
-
}
/**********************************************************************
g2 = lwgeom_from_gserialized(geom2);
lwgeom_out = lwgeom_sharedpaths(g1, g2);
+ lwgeom_free(g1);
+ lwgeom_free(g2);
+ PG_FREE_IF_COPY(geom1, 0);
+ PG_FREE_IF_COPY(geom2, 1);
+
if ( ! lwgeom_out )
{
- PG_FREE_IF_COPY(geom1, 0);
- PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
out = geometry_serialize(lwgeom_out);
- PG_FREE_IF_COPY(geom1, 0);
- PG_FREE_IF_COPY(geom2, 1);
+ lwgeom_free(lwgeom_out);
PG_RETURN_POINTER(out);
g1 = lwgeom_from_gserialized(geom1);
lwgeom_out = lwgeom_node(g1);
+ lwgeom_free(g1);
+ PG_FREE_IF_COPY(geom1, 0);
+
if ( ! lwgeom_out )
{
- PG_FREE_IF_COPY(geom1, 0);
PG_RETURN_NULL();
}
out = geometry_serialize(lwgeom_out);
- PG_FREE_IF_COPY(geom1, 0);
+ lwgeom_free(lwgeom_out);
PG_RETURN_POINTER(out);
result = geometry_serialize(subgeom);
- lwgeom_release((LWGEOM *)coll);
+ lwcollection_free(coll);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_POINTER(result);
lwgeom = lwgeom_from_gserialized(geom);
if( lwgeom_is_empty(lwgeom) )
{
- lwgeom_free((LWGEOM *)poly);
+ lwpoly_free(poly);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_NULL();
}
/* Ok, now we have a polygon. Let's see if it has enough holes */
if ( wanted_index >= poly->nrings )
{
- lwgeom_free((LWGEOM *)poly);
+ lwpoly_free(poly);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_NULL();
}
result = geometry_serialize((LWGEOM *)line);
- lwpoly_free(poly);
lwline_release(line);
+ lwpoly_free(poly);
}
else
{
}
result = geometry_serialize(curvepoly->rings[wanted_index]);
- lwgeom_free((LWGEOM *)curvepoly);
+ lwgeom_free((LWGEOM*)curvepoly);
}
PG_FREE_IF_COPY(geom, 0);
lwfree(root->interval);
if (root->segment)
{
- lwfree(root->segment->points->serialized_pointlist);
- lwfree(root->segment->points);
- lwgeom_release((LWGEOM *)root->segment);
+ lwline_free(root->segment);
}
lwfree(root);
}
Datum LWGEOM_polygon_index(PG_FUNCTION_ARGS)
{
GSERIALIZED *igeom, *result;
- LWGEOM *geom;
LWPOLY *poly;
LWMLINE *mline;
RTREE_NODE *root;
result = NULL;
igeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
yval = PG_GETARG_FLOAT8(1);
- geom = lwgeom_from_gserialized(igeom);
- if (geom->type != POLYGONTYPE)
+ if ( gserialized_get_type(igeom) != POLYGONTYPE )
{
- lwgeom_release(geom);
PG_FREE_IF_COPY(igeom, 0);
PG_RETURN_NULL();
}
- poly = (LWPOLY *)geom;
+ poly = lwgeom_as_lwpoly(lwgeom_from_gserialized(igeom));
root = createTree(poly->rings[0]);
mline = findLineSegments(root, yval);
lwfree(root);
+ lwpoly_free(poly);
+ lwmline_free(mline);
PG_FREE_IF_COPY(igeom, 0);
- lwgeom_release((LWGEOM *)poly);
- lwgeom_release((LWGEOM *)mline);
PG_RETURN_POINTER(result);
}
SPHEROID *sphere = (SPHEROID *) PG_GETARG_POINTER(1);
LWGEOM *lwgeom = lwgeom_from_gserialized(geom);
double dist = lwgeom_length_spheroid(lwgeom, sphere);
- lwgeom_release(lwgeom);
+ lwgeom_free(lwgeom);
+ PG_FREE_IF_COPY(geom, 0);
PG_RETURN_FLOAT8(dist);
}
}
length = lwgeom_length_spheroid(lwgeom, sphere);
+ lwgeom_free(lwgeom);
+ PG_FREE_IF_COPY(geom, 0);
/* Something went wrong... */
if ( length < 0.0 )
PG_RETURN_NULL();
}
- /* Clean up, but not all the way to the point arrays */
- lwgeom_release(lwgeom);
-
- PG_FREE_IF_COPY(geom, 0);
+ /* Clean up */
PG_RETURN_FLOAT8(length);
}
ogeom = lwgeom_segmentize(igeom, perQuad);
if (ogeom == NULL) PG_RETURN_NULL();
ret = geometry_serialize(ogeom);
- lwgeom_release(igeom);
- lwgeom_release(ogeom);
+ lwgeom_free(igeom);
+ lwgeom_free(ogeom);
PG_FREE_IF_COPY(geom, 0);
PG_RETURN_POINTER(ret);
}
igeom = lwgeom_from_gserialized(geom);
ogeom = lwgeom_desegmentize(igeom);
+ lwgeom_free(igeom);
+ PG_FREE_IF_COPY(geom, 0);
+
if (ogeom == NULL)
- {
- lwgeom_release(igeom);
PG_RETURN_NULL();
- }
+
ret = geometry_serialize(ogeom);
- lwgeom_release(igeom);
- lwgeom_release(ogeom);
- PG_FREE_IF_COPY(geom, 0);
+ lwgeom_free(ogeom);
PG_RETURN_POINTER(ret);
}