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