Changeset: 3f5a0c964005 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3f5a0c964005
Modified Files:
geom/monetdb5/geom.c
geom/monetdb5/geom.h
geom/monetdb5/geomBulk.c
Branch: sfcgal
Log Message:
More protection. Correct error message. The number of polygons or number of
points should be determined using the recursive iteration over the geometries,
only then we create the BAT with parent_id
diffs (truncated from 556 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
@@ -15,7 +15,7 @@
int TYPE_mbr;
-static str BATgroupWKBWKBtoWKB(bat *outBAT_id, BAT *b, BAT *g, BAT *e, int
skip_nils, oid min, oid max, BUN ngrp, BUN start, BUN end, wkb **empty_geoms,
str (*func) (wkb **, wkb **, wkb**), const char* name);
+static str BATgroupWKBWKBtoWKB(bat *outBAT_id, BAT *b, BAT *g, BAT *e, int
skip_nils, oid min, oid max, BUN ngrp, BUN start, BUN end, wkb **empty_geoms,
str (*func) (wkb **, wkb **, wkb**), char* name);
static inline int
geometryHasZ(int info)
@@ -1588,7 +1588,7 @@ wkbPointOnSurface(wkb **resWKB, wkb **ge
}
static str
-dumpGeometriesSingle(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned int *lvl, const char *path)
+dumpGeometriesSingle(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned int *lvl, unsigned *num_geoms, const char *path)
{
char *newPath = NULL;
size_t pathLength = strlen(path);
@@ -1624,6 +1624,8 @@ dumpGeometriesSingle(BAT *idBAT, BAT *ge
if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED ||
BUNappend(geomBAT, singleWKB, TRUE) != GDK_SUCCEED)
err = createException(MAL, "geom.Dump", "BUNappend failed");
+ else
+ *num_geoms++;
GDKfree(newPath);
GDKfree(singleWKB);
@@ -1631,10 +1633,10 @@ dumpGeometriesSingle(BAT *idBAT, BAT *ge
return err;
}
-static str dumpGeometriesGeometry_(BAT *idBAT, BAT *geomBAT, const
GEOSGeometry *geosGeometry, const char *path);
+static str dumpGeometriesGeometry_(BAT *idBAT, BAT *geomBAT, const
GEOSGeometry *geosGeometry, unsigned *num_geoms, const char *path);
static str
-dumpGeometriesMulti(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
+dumpGeometriesMulti(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_geoms, const char *path)
{
int i;
const GEOSGeometry *multiGeometry = NULL;
@@ -1661,7 +1663,7 @@ dumpGeometriesMulti(BAT *idBAT, BAT *geo
snprintf(newPath, pathLength, "%s%u,", path, lvl);
//*secondLevel = 0;
- err = dumpGeometriesGeometry_(idBAT, geomBAT, multiGeometry,
newPath);
+ err = dumpGeometriesGeometry_(idBAT, geomBAT, multiGeometry,
num_geoms, newPath);
if (err != MAL_SUCCEED)
break;
}
@@ -1670,7 +1672,7 @@ dumpGeometriesMulti(BAT *idBAT, BAT *geo
}
static str
-dumpGeometriesGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
+dumpGeometriesGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_geoms, const char *path)
{
int geometryType = GEOSGeomTypeId(geosGeometry) + 1;
unsigned int lvl = 0;
@@ -1683,7 +1685,7 @@ dumpGeometriesGeometry_(BAT *idBAT, BAT
case wkbLinearRing_mdb:
case wkbPolygon_mdb:
//Single Geometry
- return dumpGeometriesSingle(idBAT, geomBAT, geosGeometry, &lvl,
path);
+ return dumpGeometriesSingle(idBAT, geomBAT, geosGeometry, &lvl,
num_geoms, path);
case wkbMultiPoint_mdb:
case wkbMultiLineString_mdb:
case wkbMultiPolygon_mdb:
@@ -1700,7 +1702,7 @@ dumpGeometriesGeometry_(BAT *idBAT, BAT
return MAL_SUCCEED;
}
- return dumpGeometriesMulti(idBAT, geomBAT, geosGeometry, path);
+ return dumpGeometriesMulti(idBAT, geomBAT, geosGeometry,
num_geoms, path);
default:
throw(MAL, "geom.Dump", "%s Unknown geometry type",
geom_type2str(geometryType, 0));
}
@@ -1708,9 +1710,9 @@ dumpGeometriesGeometry_(BAT *idBAT, BAT
}
str
-dumpGeometriesGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
-{
- return dumpGeometriesGeometry_(idBAT, geomBAT, geosGeometry, path);
+dumpGeometriesGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_geoms, const char *path)
+{
+ return dumpGeometriesGeometry_(idBAT, geomBAT, geosGeometry, num_geoms,
path);
}
static str
@@ -1718,7 +1720,7 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i
{
BAT *idBAT = NULL, *geomBAT = NULL, *parentBAT = NULL;
GEOSGeom geosGeometry;
- unsigned int geometriesNum, i;
+ unsigned int num_geoms = 0, i;
str err;
if (wkb_isnil(*geomWKB)) {
@@ -1757,28 +1759,33 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i
geosGeometry = wkb2geos(*geomWKB);
- //count the number of geometries
- geometriesNum = GEOSGetNumGeometries(geosGeometry);
-
- if ((idBAT = COLnew(0, TYPE_str, geometriesNum, TRANSIENT)) == NULL) {
+ if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) {
GEOSGeom_destroy(geosGeometry);
throw(MAL, "geom.Dump", "Error creating new BAT");
}
- if ((geomBAT = COLnew(0, ATOMindex("wkb"), geometriesNum, TRANSIENT))
== NULL) {
+ if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) {
BBPunfix(idBAT->batCacheid);
GEOSGeom_destroy(geosGeometry);
throw(MAL, "geom.Dump", "Error creating new BAT");
}
+ if ((err = dumpGeometriesGeometry_(idBAT, geomBAT, geosGeometry,
&num_geoms, "")) != MAL_SUCCEED) {
+ BBPunfix(idBAT->batCacheid);
+ BBPunfix(geomBAT->batCacheid);
+ if (parent)
+ BBPunfix(parentBAT->batCacheid);
+ return err;
+ }
+
if (parent) {
- if ((parentBAT = COLnew(0, ATOMindex("int"), geometriesNum,
TRANSIENT)) == NULL) {
+ if ((parentBAT = COLnew(0, ATOMindex("int"), num_geoms, TRANSIENT)) ==
NULL) {
BBPunfix(idBAT->batCacheid);
BBPunfix(geomBAT->batCacheid);
throw(MAL, "geom.Dump", "Error creating new BAT");
}
/*Get the tail and add parentID geometriesNum types*/
- for (i = 0; i < geometriesNum; i++) {
+ for (i = 0; i < num_geoms; i++) {
if (BUNappend(parentBAT, parent, TRUE) != GDK_SUCCEED) {
err = createException(MAL, "geom.Dump", "BUNappend failed");
BBPunfix(idBAT->batCacheid);
@@ -1790,13 +1797,6 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i
}
}
- if ((err = dumpGeometriesGeometry_(idBAT, geomBAT, geosGeometry, ""))
!= MAL_SUCCEED) {
- BBPunfix(idBAT->batCacheid);
- BBPunfix(geomBAT->batCacheid);
- if (parent)
- BBPunfix(parentBAT->batCacheid);
- return err;
- }
GEOSGeom_destroy(geosGeometry);
BBPkeepref(*idBAT_id = idBAT->batCacheid);
@@ -1818,7 +1818,7 @@ wkbDumpP(bat *parentBAT_id, bat *idBAT_i
}
static str
-dumpPointsPoint(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
unsigned int *lvl, const char *path)
+dumpPointsPoint(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
unsigned *num_points, unsigned int *lvl, const char *path)
{
char *newPath = NULL;
size_t pathLength = strlen(path);
@@ -1834,6 +1834,8 @@ dumpPointsPoint(BAT *idBAT, BAT *geomBAT
if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED ||
BUNappend(geomBAT, pointWKB, TRUE) != GDK_SUCCEED)
err = createException(MAL, "geom.Dump", "BUNappend failed");
+ else
+ *num_points++;
GDKfree(newPath);
GDKfree(pointWKB);
@@ -1842,7 +1844,7 @@ dumpPointsPoint(BAT *idBAT, BAT *geomBAT
}
static str
-dumpPointsLineString(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
+dumpPointsLineString(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_points, const char *path)
{
int pointsNum = 0;
str err;
@@ -1862,7 +1864,7 @@ dumpPointsLineString(BAT *idBAT, BAT *ge
if (pointGeometry == NULL)
throw(MAL, "geom.DumpPoints", "GEOSGeomGetPointN
failed");
- err = dumpPointsPoint(idBAT, geomBAT, pointGeometry, &lvl,
path);
+ err = dumpPointsPoint(idBAT, geomBAT, pointGeometry,
num_points, &lvl, path);
GEOSGeom_destroy(pointGeometry);
}
@@ -1870,7 +1872,7 @@ dumpPointsLineString(BAT *idBAT, BAT *ge
}
static str
-dumpPointsPolygon(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
unsigned int *lvl, const char *path)
+dumpPointsPolygon(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
unsigned int *lvl, unsigned *num_points, const char *path)
{
const GEOSGeometry *exteriorRingGeometry;
int numInteriorRings = 0, i = 0;
@@ -1892,7 +1894,7 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
sprintf(newPath, "%s%u%s", path, *lvl, extraStr);
//get the points in the exterior ring
- err = dumpPointsLineString(idBAT, geomBAT, exteriorRingGeometry,
newPath);
+ err = dumpPointsLineString(idBAT, geomBAT, exteriorRingGeometry,
num_points, newPath);
GDKfree(newPath);
if (err != MAL_SUCCEED)
return err;
@@ -1910,7 +1912,7 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
newPath = GDKmalloc(pathLength + lvlDigitsNum + extraLength +
1);
sprintf(newPath, "%s%u%s", path, *lvl, extraStr);
- err = dumpPointsLineString(idBAT, geomBAT,
GEOSGetInteriorRingN(geosGeometry, i), newPath);
+ err = dumpPointsLineString(idBAT, geomBAT,
GEOSGetInteriorRingN(geosGeometry, i), num_points, newPath);
GDKfree(newPath);
if (err != MAL_SUCCEED)
return err;
@@ -1919,9 +1921,9 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
return MAL_SUCCEED;
}
-static str dumpPointsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path);
+static str dumpPointsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_points, const char *path);
static str
-dumpPointsMultiGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
+dumpPointsMultiGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_points, const char *path)
{
int geometriesNum, i;
const GEOSGeometry *multiGeometry = NULL;
@@ -1944,7 +1946,7 @@ dumpPointsMultiGeometry(BAT *idBAT, BAT
sprintf(newPath, "%s%u%s", path, lvl, extraStr);
//*secondLevel = 0;
- err = dumpPointsGeometry_(idBAT, geomBAT, multiGeometry,
newPath);
+ err = dumpPointsGeometry_(idBAT, geomBAT, multiGeometry,
num_points, newPath);
GDKfree(newPath);
if (err != MAL_SUCCEED)
return err;
@@ -1954,7 +1956,7 @@ dumpPointsMultiGeometry(BAT *idBAT, BAT
}
static str
-dumpPointsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, const char *path)
+dumpPointsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry
*geosGeometry, unsigned *num_points, const char *path)
{
int geometryType = GEOSGeomTypeId(geosGeometry) + 1;
unsigned int lvl = 0;
@@ -1962,25 +1964,25 @@ dumpPointsGeometry_(BAT *idBAT, BAT *geo
//check the type of the geometry
switch (geometryType) {
case wkbPoint_mdb:
- return dumpPointsPoint(idBAT, geomBAT, geosGeometry, &lvl,
path);
+ return dumpPointsPoint(idBAT, geomBAT, geosGeometry, &lvl,
num_points, path);
case wkbLineString_mdb:
case wkbLinearRing_mdb:
- return dumpPointsLineString(idBAT, geomBAT, geosGeometry, path);
+ return dumpPointsLineString(idBAT, geomBAT, geosGeometry,
num_points, path);
case wkbPolygon_mdb:
- return dumpPointsPolygon(idBAT, geomBAT, geosGeometry, &lvl,
path);
+ return dumpPointsPolygon(idBAT, geomBAT, geosGeometry,
num_points, &lvl, path);
case wkbMultiPoint_mdb:
case wkbMultiLineString_mdb:
case wkbMultiPolygon_mdb:
case wkbGeometryCollection_mdb:
- return dumpPointsMultiGeometry(idBAT, geomBAT, geosGeometry,
path);
+ return dumpPointsMultiGeometry(idBAT, geomBAT, geosGeometry,
num_points, path);
default:
throw(MAL, "geom.DumpPoints", "%s Unknown geometry type",
geom_type2str(geometryType, 0));
}
}
str
-dumpPointsGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
const char *path) {
- return dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, path);
+dumpPointsGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry,
unsigned *num_points, const char *path) {
+ return dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, num_points, path);
}
static str
@@ -1989,8 +1991,9 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i
BAT *idBAT = NULL, *geomBAT = NULL, *parentBAT = NULL;
GEOSGeom geosGeometry;
int check = 0;
- int pointsNum, i = 0;
+ int i = 0;
str err;
+ uint32_t num_points = 0;
if (wkb_isnil(*geomWKB)) {
@@ -2028,30 +2031,33 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i
geosGeometry = wkb2geos(*geomWKB);
- if ((err = wkbNumPoints(&pointsNum, geomWKB, &check)) != MAL_SUCCEED) {
- GEOSGeom_destroy(geosGeometry);
- return err;
- }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list