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

Reply via email to