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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list