Changeset: c99dbabc15c6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c99dbabc15c6
Modified Files:
geom/monetdb5/geom.c
Branch: Jun2016
Log Message:
Sanitize exception handling.
Also, checked to make sure no freshly allocated memory gets returned
in failing calls.
diffs (truncated from 1853 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
@@ -66,9 +66,9 @@ static str transformCoordSeq(int idx, in
errorNum = pj_get_errno_ref();
if (*errorNum != 0){
if(coordinatesNum >2)
- return createException(MAL, "geom.wkbTransform",
"Couldn't transform point (%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
+ throw(MAL, "geom.wkbTransform", "Couldn't transform
point (%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
else
- return createException(MAL, "geom.wkbTransform",
"Couldn't transform point (%f %f): %s\n", x, y, pj_strerrno(*errorNum));
+ throw(MAL, "geom.wkbTransform", "Couldn't transform
point (%f %f): %s\n", x, y, pj_strerrno(*errorNum));
}
@@ -101,7 +101,7 @@ static str transformPoint(GEOSGeometry**
if(gcs_old == NULL) {
*transformedGeometry = NULL;
- return createException(MAL, "geom.wkbTransform",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
}
/* create the coordinates sequence for the transformed geometry */
@@ -132,7 +132,7 @@ static str transformLine(GEOSCoordSeq *g
gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
if(gcs_old == NULL)
- return createException(MAL, "geom.wkbTransform",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
/* get the number of points in the geometry */
GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -199,7 +199,7 @@ static str transformPolygon(GEOSGeometry
exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
if(!exteriorRingGeometry) {
*transformedGeometry = NULL;
- return createException(MAL,
"geom.wkbTransform","GEOSGetExteriorRing failed");
+ throw(MAL, "geom.wkbTransform","GEOSGetExteriorRing failed");
}
ret = transformLinearRing(&transformedExteriorRingGeometry,
exteriorRingGeometry, proj4_src, proj4_dst);
@@ -213,7 +213,7 @@ static str transformPolygon(GEOSGeometry
if (numInteriorRings == -1 ) {
*transformedGeometry = NULL;
GEOSGeom_destroy(transformedExteriorRingGeometry);
- return createException(MAL, "geom.wkbTransform",
"GEOSGetInteriorRingN failed.");
+ throw(MAL, "geom.wkbTransform", "GEOSGetInteriorRingN failed.");
}
/* iterate over the interiorRing and transform each one of them */
@@ -335,7 +335,7 @@ str wkbTransform(wkb** transformedWKB, w
(void)*srid_dst;
(void)**proj4_src_str;
(void)**proj4_dst_str;
- return createException(MAL, "geom.Transform", "Function Not
Implemented");
+ throw(MAL, "geom.Transform", "Function Not Implemented");
#else
projPJ proj4_src, proj4_dst;
GEOSGeom geosGeometry, transformedGeosGeometry;
@@ -408,21 +408,21 @@ static str forceDimCoordSeq(int idx, int
//get the coordinates
if(!GEOSCoordSeq_getX(gcs_old, idx, &x))
- return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_getX
failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getX failed");
if(!GEOSCoordSeq_getY(gcs_old, idx, &y))
- return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_getY
failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getY failed");
if(coordinatesNum > 2 && dim > 2) //read it only if needed (dim >2)
if(!GEOSCoordSeq_getZ(gcs_old, idx, &z))
- return createException(MAL, "geom.ForceDim",
"GEOSCoordSeq_getZ failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getZ failed");
//create the new coordinates
if(!GEOSCoordSeq_setX(*gcs_new, idx, x))
- return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_setX
failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setX failed");
if(!GEOSCoordSeq_setY(*gcs_new, idx, y))
- return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_setY
failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setY failed");
if(dim > 2)
if(!GEOSCoordSeq_setZ(*gcs_new, idx, z))
- return createException(MAL, "geom.ForceDim",
"GEOSCoordSeq_setZ failed");
+ throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setZ failed");
return MAL_SUCCEED;
}
@@ -439,7 +439,7 @@ static str forceDimPoint(GEOSGeometry**
if(gcs_old == NULL) {
*outGeometry = NULL;
- return createException(MAL, "geom.ForceDim",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
}
/* create the coordinates sequence for the translated geometry */
@@ -471,7 +471,7 @@ static str forceDimLineString(GEOSGeomet
gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
if(gcs_old == NULL)
- return createException(MAL, "geom.ForceDim",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
/* get the number of points in the geometry */
GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -509,7 +509,7 @@ static str forceDimLinearRing(GEOSGeomet
gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
if(gcs_old == NULL)
- return createException(MAL, "geom.ForceDim",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
/* get the number of points in the geometry */
GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -543,7 +543,7 @@ static str forceDimPolygon(GEOSGeometry*
exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
if(!exteriorRingGeometry) {
*outGeometry = NULL;
- return createException(MAL,
"geom.ForceDim","GEOSGetExteriorRing failed");
+ throw(MAL, "geom.ForceDim","GEOSGetExteriorRing failed");
}
if((ret = forceDimLinearRing(&transformedExteriorRingGeometry,
exteriorRingGeometry, dim)) != MAL_SUCCEED) {
@@ -555,7 +555,7 @@ static str forceDimPolygon(GEOSGeometry*
if (numInteriorRings == -1 ) {
*outGeometry = NULL;
GEOSGeom_destroy(transformedExteriorRingGeometry);
- return createException(MAL, "geom.ForceDim",
"GEOSGetInteriorRingN failed.");
+ throw(MAL, "geom.ForceDim", "GEOSGetInteriorRingN failed.");
}
/* iterate over the interiorRing and translate each one of them */
@@ -586,13 +586,11 @@ static str forceDimMultiGeometry(GEOSGeo
str err;
const GEOSGeometry* multiGeometry =
GEOSGetGeometryN(geosGeometry, i);
- if((err = forceDimGeometry(&(transformedMultiGeometries[i]),
multiGeometry, dim)) != MAL_SUCCEED) {
- str msg = createException(MAL, "geom.ForceDim", "%s",
err);
- GDKfree(err);
+ if((err = forceDimGeometry(&transformedMultiGeometries[i],
multiGeometry, dim)) != MAL_SUCCEED) {
GDKfree(*transformedMultiGeometries);
*outGeometry = NULL;
- return msg;
+ return err;
}
}
@@ -602,48 +600,25 @@ static str forceDimMultiGeometry(GEOSGeo
}
static str forceDimGeometry(GEOSGeometry** outGeometry, const GEOSGeometry*
geosGeometry, int dim) {
- str err;
int geometryType = GEOSGeomTypeId(geosGeometry)+1;
//check the type of the geometry
switch(geometryType) {
case wkbPoint_mdb:
- if((err = forceDimPoint(outGeometry, geosGeometry, dim)) !=
MAL_SUCCEED){
- str msg = createException(MAL, "geom.ForceDim",
"%s",err);
- GDKfree(err);
- return msg;
- }
- break;
+ return forceDimPoint(outGeometry, geosGeometry, dim);
case wkbLineString_mdb:
case wkbLinearRing_mdb:
- if((err = forceDimLineString(outGeometry, geosGeometry, dim))
!= MAL_SUCCEED){
- str msg = createException(MAL, "geom.ForceDim",
"%s",err);
- GDKfree(err);
- return msg;
- }
- break;
+ return forceDimLineString(outGeometry, geosGeometry, dim);
case wkbPolygon_mdb:
- if((err = forceDimPolygon(outGeometry, geosGeometry, dim)) !=
MAL_SUCCEED){
- str msg = createException(MAL, "geom.ForceDim",
"%s",err);
- GDKfree(err);
- return msg;
- }
- break;
+ return forceDimPolygon(outGeometry, geosGeometry, dim);
case wkbMultiPoint_mdb:
case wkbMultiLineString_mdb:
case wkbMultiPolygon_mdb:
case wkbGeometryCollection_mdb:
- if((err = forceDimMultiGeometry(outGeometry, geosGeometry,
dim)) != MAL_SUCCEED){
- str msg = createException(MAL, "geom.ForceDim",
"%s",err);
- GDKfree(err);
- return msg;
- }
- break;
+ return forceDimMultiGeometry(outGeometry, geosGeometry, dim);
default:
- return createException(MAL, "geom.ForceDim", "%s Unknown
geometry type", geom_type2str(geometryType,0));
- }
-
- return MAL_SUCCEED;
+ throw(MAL, "geom.ForceDim", "%s Unknown geometry type",
geom_type2str(geometryType,0));
+ }
}
str wkbForceDim(wkb** outWKB, wkb** geomWKB, int *dim) {
@@ -659,16 +634,14 @@ str wkbForceDim(wkb** outWKB, wkb** geom
geosGeometry = wkb2geos(*geomWKB);
if(!geosGeometry) {
*outWKB = NULL;
- return createException(MAL, "geom.ForceDim", "wkb2geos failed");
+ throw(MAL, "geom.ForceDim", "wkb2geos failed");
}
if((err = forceDimGeometry(&outGeometry, geosGeometry, *dim)) !=
MAL_SUCCEED) {
- str msg = createException(MAL, "geom.ForceDim", "%s", err);
GEOSGeom_destroy(geosGeometry);
*outWKB = NULL;
- GDKfree(err);
- return msg;
+ return err;
}
GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));
@@ -691,12 +664,12 @@ static str segmentizePoint(GEOSGeometry*
//get the coordinates
if(!(gcs_old = GEOSGeom_getCoordSeq(geosGeometry))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.Segmentize", "GEOSGeom_getCoordSeq failed");
}
//create a copy of it
if(!(gcs_new = GEOSCoordSeq_clone(gcs_old))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_clone failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_clone failed");
}
//create the geometry from the coordinates sequence
@@ -718,36 +691,36 @@ static str segmentizeLineString(GEOSGeom
//get the coordinates of the points comprising the geometry
if(!(gcs_old = GEOSGeom_getCoordSeq(geosGeometry))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize",
"GEOSGeom_getCoordSeq failed");
+ throw(MAL, "geom.Segmentize", "GEOSGeom_getCoordSeq failed");
}
//get the number of points in the geometry
if(!(GEOSCoordSeq_getSize(gcs_old, &pointsNum))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getSize failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getSize failed");
}
//store the points so that I do not have to read them multiple times
using geos
if(!(xCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize", "Could not
allocate memory for %d double values", pointsNum);
+ throw(MAL, "geom.Segmentize", "Could not allocate memory for %d
double values", pointsNum);
}
if(!(yCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize", "Could not
allocate memory for %d double values", pointsNum);
+ throw(MAL, "geom.Segmentize", "Could not allocate memory for %d
double values", pointsNum);
}
if(!(zCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
*outGeometry = NULL;
- return createException(MAL, "geom.Segmentize", "Could not
allocate memory for %d double values", pointsNum);
+ throw(MAL, "geom.Segmentize", "Could not allocate memory for %d
double values", pointsNum);
}
if(!GEOSCoordSeq_getX(gcs_old, 0, &xCoords_org[0]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getX failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getX failed");
if(!GEOSCoordSeq_getY(gcs_old, 0, &yCoords_org[0]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getY failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getY failed");
if(coordinatesNum > 2)
if(!GEOSCoordSeq_getZ(gcs_old, 0, &zCoords_org[0]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getZ failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getZ
failed");
xl=xCoords_org[0];
yl=yCoords_org[0];
@@ -758,12 +731,12 @@ static str segmentizeLineString(GEOSGeom
double dist = 0.0;
if(!GEOSCoordSeq_getX(gcs_old, i, &xCoords_org[i]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getX failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getX
failed");
if(!GEOSCoordSeq_getY(gcs_old, i, &yCoords_org[i]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getY failed");
+ throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getY
failed");
if(coordinatesNum > 2)
if(!GEOSCoordSeq_getZ(gcs_old, i, &zCoords_org[i]))
- return createException(MAL, "geom.Segmentize",
"GEOSCoordSeq_getZ failed");
+ throw(MAL, "geom.Segmentize",
"GEOSCoordSeq_getZ failed");
//compute the distance of the current point to the last added
one
dist = sqrt(pow(xl-xCoords_org[i],2) + pow(yl-yCoords_org[i],2)
+ pow(zl-zCoords_org[i],2));
@@ -789,17 +762,17 @@ static str segmentizeLineString(GEOSGeom
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list