Changeset: 6f6350b4d071 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f6350b4d071 Modified Files: geom/monetdb5/geom.c Branch: sfcgal Log Message:
Handle properly the creation of a Polygon, GKDmalloc of 0 does not work diffs (219 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -252,33 +252,37 @@ transformPolygon(GEOSGeometry **transfor } /* iterate over the interiorRing and transform each one of them */ - transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); - if (transformedInteriorRingGeometries == NULL) { - *transformedGeometry = NULL; - GEOSGeom_destroy(transformedExteriorRingGeometry); - throw(MAL, "geom.wkbTransform", MAL_MALLOC_FAIL); - } - for (i = 0; i < numInteriorRings; i++) { - ret = transformLinearRing(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), proj4_src, proj4_dst); - if (ret != MAL_SUCCEED) { - while (--i >= 0) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); - *transformedGeometry = NULL; - return ret; - } - GEOSSetSRID(transformedInteriorRingGeometries[i], srid); - } - - *transformedGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); - if (*transformedGeometry == NULL) { - for (i = 0; i < numInteriorRings; i++) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - ret = createException(MAL, "geom.wkbTransform", "GEOSGeom_createPolygon failed"); - } - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); + if (numInteriorRings) { + transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); + if (transformedInteriorRingGeometries == NULL) { + *transformedGeometry = NULL; + GEOSGeom_destroy(transformedExteriorRingGeometry); + throw(MAL, "geom.wkbTransform", MAL_MALLOC_FAIL); + } + for (i = 0; i < numInteriorRings; i++) { + ret = transformLinearRing(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), proj4_src, proj4_dst); + if (ret != MAL_SUCCEED) { + while (--i >= 0) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + GDKfree(transformedInteriorRingGeometries); + GEOSGeom_destroy(transformedExteriorRingGeometry); + *transformedGeometry = NULL; + return ret; + } + GEOSSetSRID(transformedInteriorRingGeometries[i], srid); + } + } + + *transformedGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); + if (*transformedGeometry == NULL) { + GEOSGeom_destroy(transformedExteriorRingGeometry); + for (i = 0; i < numInteriorRings; i++) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + ret = createException(MAL, "geom.wkbTransform", "GEOSGeom_createPolygon failed"); + } + + if(transformedInteriorRingGeometries) + GDKfree(transformedInteriorRingGeometries); return ret; } @@ -648,31 +652,35 @@ forceDimPolygon(GEOSGeometry **outGeomet } /* iterate over the interiorRing and translate each one of them */ - transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); - if (transformedInteriorRingGeometries == NULL) { - *outGeometry = NULL; - GEOSGeom_destroy(transformedExteriorRingGeometry); - throw(MAL, "geom.ForceDim", MAL_MALLOC_FAIL); - } - for (i = 0; i < numInteriorRings; i++) { - if ((ret = forceDimLinearRing(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), dim)) != MAL_SUCCEED) { - while (--i >= 0) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); - *outGeometry = NULL; - return ret; - } - } - - *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); - if (*outGeometry == NULL) { - for (i = 0; i < numInteriorRings; i++) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - ret = createException(MAL, "geom.ForceDim", "GEOSGeom_createPolygon failed"); - } - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); + if (numInteriorRings) { + transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); + if (transformedInteriorRingGeometries == NULL) { + *outGeometry = NULL; + GEOSGeom_destroy(transformedExteriorRingGeometry); + throw(MAL, "geom.ForceDim", MAL_MALLOC_FAIL); + } + for (i = 0; i < numInteriorRings; i++) { + if ((ret = forceDimLinearRing(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), dim)) != MAL_SUCCEED) { + while (--i >= 0) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + GDKfree(transformedInteriorRingGeometries); + GEOSGeom_destroy(transformedExteriorRingGeometry); + *outGeometry = NULL; + return ret; + } + } + } + + *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); + if (*outGeometry == NULL) { + GEOSGeom_destroy(transformedExteriorRingGeometry); + for (i = 0; i < numInteriorRings; i++) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + ret = createException(MAL, "geom.ForceDim", "GEOSGeom_createPolygon failed"); + } + + if (transformedInteriorRingGeometries) + GDKfree(transformedInteriorRingGeometries); return ret; } @@ -1024,31 +1032,34 @@ segmentizePolygon(GEOSGeometry **outGeom throw(MAL, "geom.Segmentize", "GEOSGetInteriorRingN failed."); } //iterate over the interiorRing and segmentize each one of them - transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); - if (transformedInteriorRingGeometries == NULL) { - *outGeometry = NULL; - GEOSGeom_destroy(transformedExteriorRingGeometry); - throw(MAL, "geom.Segmentize", MAL_MALLOC_FAIL); - } - for (i = 0; i < numInteriorRings; i++) { - if ((err = segmentizeLineString(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), sz, 1)) != MAL_SUCCEED) { - while (--i >= 0) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); - *outGeometry = NULL; - return err; - } - } - - *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); - if (*outGeometry == NULL) { - for (i = 0; i < numInteriorRings; i++) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - err = createException(MAL, "geom.Segmentize", "GEOSGeom_createPolygon failed"); - } - GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); + if (numInteriorRings) { + transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * sizeof(GEOSGeometry *)); + if (transformedInteriorRingGeometries == NULL) { + *outGeometry = NULL; + GEOSGeom_destroy(transformedExteriorRingGeometry); + throw(MAL, "geom.Segmentize", MAL_MALLOC_FAIL); + } + for (i = 0; i < numInteriorRings; i++) { + if ((err = segmentizeLineString(&transformedInteriorRingGeometries[i], GEOSGetInteriorRingN(geosGeometry, i), sz, 1)) != MAL_SUCCEED) { + while (--i >= 0) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + GDKfree(transformedInteriorRingGeometries); + GEOSGeom_destroy(transformedExteriorRingGeometry); + *outGeometry = NULL; + return err; + } + } + } + + *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); + if (*outGeometry == NULL) { + GEOSGeom_destroy(transformedExteriorRingGeometry); + for (i = 0; i < numInteriorRings; i++) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + err = createException(MAL, "geom.Segmentize", "GEOSGeom_createPolygon failed"); + } + if (transformedInteriorRingGeometries) + GDKfree(transformedInteriorRingGeometries); return err; } @@ -1359,18 +1370,18 @@ translatePolygon(GEOSGeometry **outGeome return err; } } - - *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); - if (*outGeometry == NULL) { - for (i = 0; i < numInteriorRings; i++) - GEOSGeom_destroy(transformedInteriorRingGeometries[i]); - err = createException(MAL, "geom.Translate", "GEOSGeom_createPolygon failed"); - } + } + + *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, transformedInteriorRingGeometries, numInteriorRings); + if (*outGeometry == NULL) { + GEOSGeom_destroy(transformedExteriorRingGeometry); + for (i = 0; i < numInteriorRings; i++) + GEOSGeom_destroy(transformedInteriorRingGeometries[i]); + err = createException(MAL, "geom.Translate", "GEOSGeom_createPolygon failed"); + } + + if (transformedInteriorRingGeometries) GDKfree(transformedInteriorRingGeometries); - GEOSGeom_destroy(transformedExteriorRingGeometry); - } else { - *outGeometry = GEOSGeom_createPolygon(transformedExteriorRingGeometry, NULL, 0); - } return err; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list