Changeset: b2075ba01b29 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b2075ba01b29
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.h
        geom/monetdb5/geomBulk.c
Branch: Jun2016
Log Message:

More checking.


diffs (truncated from 535 to 300 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -2501,73 +2501,55 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
        double *linestringsArea;
        bit ordered = 0;
 
+       *geomWKB = NULL;
+
        //make wkb from wkt
        ret = wkbFromText(&inputWKB, geomWKT, srid, &type);
-       if (ret != MAL_SUCCEED) {
-               *geomWKB = NULL;
-
-               if (inputWKB)
-                       GDKfree(inputWKB);
+       if (ret != MAL_SUCCEED)
                return ret;
-       }
+
        //read the number of linestrings in the input
        ret = wkbNumGeometries(&itemsNum, &inputWKB);
        if (ret != MAL_SUCCEED) {
-               *geomWKB = NULL;
+               GDKfree(inputWKB);
                return ret;
        }
 
-       linestringsWKB = (wkb **) GDKmalloc(itemsNum * sizeof(wkb *));
-       linestringsArea = (double *) GDKmalloc(itemsNum * sizeof(double));
-       //create one polygon for each lineString and compute the are of each of 
them
+       linestringsWKB = GDKmalloc(itemsNum * sizeof(wkb *));
+       linestringsArea = GDKmalloc(itemsNum * sizeof(double));
+       if (linestringsWKB == NULL || linestringsArea == NULL) {
+               itemsNum = 0;
+               ret = createException(MAL, "geom.MLineStringToPolygon", 
MAL_MALLOC_FAIL);
+               goto bailout;
+       }
+
+       //create one polygon for each lineString and compute the area of each 
of them
        for (i = 1; i <= itemsNum; i++) {
                wkb *polygonWKB;
                int batId = 0;
 
                ret = wkbGeometryN(&linestringsWKB[i - 1], &inputWKB, &i);
-               if (ret != MAL_SUCCEED || !linestringsWKB[i - 1]) {
-                       *geomWKB = NULL;
-
-                       GDKfree(inputWKB);
-                       for (; i > 0; i--)
-                               if (linestringsWKB[i - 1])
-                                       GDKfree(linestringsWKB[i - 1]);
-                       GDKfree(linestringsWKB);
-
-                       return ret;
+               if (ret != MAL_SUCCEED || linestringsWKB[i - 1] == NULL) {
+                       itemsNum = i - 1;
+                       goto bailout;
                }
 
                ret = wkbMakePolygon(&polygonWKB, &linestringsWKB[i - 1], 
&batId, srid);
                if (ret != MAL_SUCCEED) {
-                       *geomWKB = NULL;
-
-                       GDKfree(inputWKB);
-                       for (; i > 0; i--)
-                               if (linestringsWKB[i - 1])
-                                       GDKfree(linestringsWKB[i - 1]);
-                       GDKfree(linestringsWKB);
-
-                       //throw(MAL, "geom.MLineStringToPolygon", "All 
linestring should be closed");
-                       return ret;
+                       itemsNum = i;
+                       goto bailout;
                }
 
                ret = wkbArea(&linestringsArea[i - 1], &polygonWKB);
+               GDKfree(polygonWKB);
                if (ret != MAL_SUCCEED) {
-                       *geomWKB = NULL;
-
-                       GDKfree(inputWKB);
-                       for (; i > 0; i--)
-                               if (linestringsWKB[i - 1])
-                                       GDKfree(linestringsWKB[i - 1]);
-                       GDKfree(linestringsWKB);
-
-                       return ret;
+                       itemsNum = i;
+                       goto bailout;
                }
-
-               GDKfree(polygonWKB);
        }
 
        GDKfree(inputWKB);
+       inputWKB = NULL;
 
        //order the linestrings with decreasing (polygons) area
        while (!ordered) {
@@ -2604,39 +2586,74 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
                GEOSGeom externalGeometry, linearRingExternalGeometry, 
*internalGeometries, finalGeometry;
 
                externalGeometry = wkb2geos(linestringsWKB[0]);
-               if (!externalGeometry) {
-                       *geomWKB = NULL;
-                       throw(MAL, "geom.MLineStringToPolygon", "Error in 
wkb2geos");
+               if (externalGeometry == NULL) {
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
"Error in wkb2geos");
+                       goto bailout;
                }
 
                coordSeq_external = 
GEOSCoordSeq_clone(GEOSGeom_getCoordSeq(externalGeometry));
+               if (coordSeq_external == NULL) {
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
"GEOSCoordSeq_clone failed");
+                       goto bailout;
+               }
                linearRingExternalGeometry = 
GEOSGeom_createLinearRing(coordSeq_external);
+               if (linearRingExternalGeometry == NULL) {
+                       GEOSCoordSeq_destroy(coordSeq_external);
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
"GEOSGeom_createLinearRing failed");
+                       goto bailout;
+               }
 
                //all remaining should be internal
-               internalGeometries = (GEOSGeom *) GDKmalloc((itemsNum - 1) * 
sizeof(GEOSGeom *));
+               internalGeometries = GDKmalloc((itemsNum - 1) * sizeof(GEOSGeom 
*));
+               if (internalGeometries == NULL) {
+                       GEOSGeom_destroy(linearRingExternalGeometry);
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
                for (i = 1; i < itemsNum; i++) {
                        GEOSCoordSeq coordSeq_internal;
                        GEOSGeom internalGeometry;
 
                        internalGeometry = wkb2geos(linestringsWKB[i]);
-                       if (!internalGeometry) {
-                               *geomWKB = NULL;
+                       if (internalGeometry == NULL) {
+                               GEOSGeom_destroy(linearRingExternalGeometry);
+                               while (--i >= 1)
+                                       GEOSGeom_destroy(internalGeometries[i - 
1]);
                                GDKfree(internalGeometries);
-                               throw(MAL, "geom.MLineStringToPolygon", "Error 
in wkb2geos");
+                               ret = createException(MAL, 
"geom.MLineStringToPolygon", "Error in wkb2geos");
+                               goto bailout;
                        }
 
                        coordSeq_internal = 
GEOSCoordSeq_clone(GEOSGeom_getCoordSeq(internalGeometry));
+                       GDKfree(internalGeometry);
+                       if (coordSeq_internal == NULL) {
+                               GEOSGeom_destroy(linearRingExternalGeometry);
+                               while (--i >= 1)
+                                       GEOSGeom_destroy(internalGeometries[i - 
1]);
+                               GDKfree(internalGeometries);
+                               ret = createException(MAL, 
"geom.MLineStringToPolygon", "Error in wkb2geos");
+                               goto bailout;
+                       }
                        internalGeometries[i - 1] = 
GEOSGeom_createLinearRing(coordSeq_internal);
+                       if (internalGeometries[i - 1] == NULL) {
+                               GEOSGeom_destroy(linearRingExternalGeometry);
+                               GEOSCoordSeq_destroy(coordSeq_internal);
+                               while (--i >= 1)
+                                       GEOSGeom_destroy(internalGeometries[i - 
1]);
+                               GDKfree(internalGeometries);
+                               ret = createException(MAL, 
"geom.MLineStringToPolygon", "GEOSGeom_createLinearRing failed");
+                               goto bailout;
+                       }
                }
 
                finalGeometry = 
GEOSGeom_createPolygon(linearRingExternalGeometry, internalGeometries, itemsNum 
- 1);
+               GEOSGeom_destroy(linearRingExternalGeometry);
                if (finalGeometry == NULL) {
-                       GEOSGeom_destroy(linearRingExternalGeometry);
-                       for (i = 0; i < itemsNum; i++)
+                       for (i = 0; i < itemsNum - 1; i++)
                                GEOSGeom_destroy(internalGeometries[i]);
                        GDKfree(internalGeometries);
-                       *geomWKB = NULL;
-                       throw(MAL, "geom.MLineStringToPolygon", "Error creating 
Polygon from LinearRing");
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
"Error creating Polygon from LinearRing");
+                       goto bailout;
                }
                GDKfree(internalGeometries);
                //check of the created polygon is valid
@@ -2647,28 +2664,28 @@ wkbMLineStringToPolygon(wkb **geomWKB, s
 
                        GEOSGeom_destroy(finalGeometry);
 
-                       *geomWKB = NULL;
                        throw(MAL, "geom.MLineStringToPolygon", "The provided 
MultiLineString does not create a valid Polygon");
 
                }
 
                GEOSSetSRID(finalGeometry, *srid);
                *geomWKB = geos2wkb(finalGeometry);
-
                GEOSGeom_destroy(finalGeometry);
+               if (*geomWKB == NULL)
+                       ret = createException(MAL, "geom.MLineStringToPolygon", 
"geos2wkb failed");
        } else if (*flag == 1) {
-               *geomWKB = NULL;
-               throw(MAL, "geom.MLineStringToPolygon", "Multipolygon from 
string has not been defined");
+               ret = createException(MAL, "geom.MLineStringToPolygon", 
"Multipolygon from string has not been defined");
        } else {
-               *geomWKB = NULL;
-               throw(MAL, "geom.MLineStringToPolygon", "Unknown flag");
-       }
-
+               ret = createException(MAL, "geom.MLineStringToPolygon", 
"Unknown flag");
+       }
+
+  bailout:
+       GDKfree(inputWKB);
        for (i = 0; i < itemsNum; i++)
                GDKfree(linestringsWKB[i]);
        GDKfree(linestringsWKB);
        GDKfree(linestringsArea);
-       return MAL_SUCCEED;
+       return ret;
 }
 
 str
@@ -2738,9 +2755,9 @@ wkbBasicInt(int *out, wkb *geom, int (*f
        GEOSGeom geosGeometry = wkb2geos(geom);
        str ret = MAL_SUCCEED;
 
-       if (!geosGeometry) {
+       if (geosGeometry == NULL) {
                *out = int_nil;
-               return MAL_SUCCEED;
+               throw(MAL, name, "wkb2geos failed");
        }
 
        *out = (*func) (geosGeometry);
@@ -2755,6 +2772,7 @@ wkbBasicInt(int *out, wkb *geom, int (*f
                //clear the error buffer
                GDKerrbuf[0] = '\0';
        }
+
        return ret;
 }
 
@@ -2769,9 +2787,7 @@ wkbGeometryType(char **out, wkb **geomWK
        if (ret != MAL_SUCCEED)
                return ret;
        typeId = ((typeId + 1) << 2);
-       geoGetType(out, &typeId, flag);
-
-       return ret;
+       return geoGetType(out, &typeId, flag);
 }
 
 /* returns the number of dimensions of the geometry */
@@ -2779,7 +2795,6 @@ str
 wkbCoordDim(int *out, wkb **geom)
 {
        return wkbBasicInt(out, *geom, GEOSGeom_getCoordinateDimension, 
"geom.CoordDim");
-       return MAL_SUCCEED;     //it gives error if not his present (?)
 }
 
 /* returns the inherent dimension of the geometry, e.g 0 for point */
@@ -2802,7 +2817,7 @@ wkbSetSRID(wkb **resultGeomWKB, wkb **ge
 {
        GEOSGeom geosGeometry = wkb2geos(*geomWKB);
 
-       if (!geosGeometry) {
+       if (geosGeometry == NULL) {
                if ((*resultGeomWKB = wkbNULLcopy()) == NULL)
                        throw(MAL, "geom.setSRID", MAL_MALLOC_FAIL);
                return MAL_SUCCEED;
@@ -2825,7 +2840,7 @@ wkbGetCoordinate(dbl *out, wkb **geom, i
        GEOSGeom geosGeometry = wkb2geos(*geom);
        const GEOSCoordSequence *gcs;
 
-       if (!geosGeometry) {
+       if (geosGeometry == NULL) {
                *out = dbl_nil;
                throw(MAL, "geom.wkbGetCoordinate", "wkb2geos failed");
        }
@@ -2833,24 +2848,24 @@ wkbGetCoordinate(dbl *out, wkb **geom, i
        if ((GEOSGeomTypeId(geosGeometry) + 1) != wkbPoint_mdb) {
                str err;
                char *geomSTR;
+
+               GEOSGeom_destroy(geosGeometry);
                if ((err = wkbAsText(&geomSTR, geom, NULL)) != MAL_SUCCEED) {
-                       GEOSGeom_destroy(geosGeometry);
                        return err;
                }
 
-               GEOSGeom_destroy(geosGeometry);
                throw(MAL, "geom.wkbGetCoordinate", "Geometry %s not a Point", 
geomSTR);
        }
 
        gcs = GEOSGeom_getCoordSeq(geosGeometry);
-
-       if (!gcs) {
+       GEOSGeom_destroy(geosGeometry);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to