Changeset: 546580fc280a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=546580fc280a Modified Files: geom/monetdb5/geom.c geom/monetdb5/geom.h geom/monetdb5/geom.mal geom/monetdb5/geomBulk.c geom/sql/40_geom.sql Branch: sfcgal Log Message:
Clean generic function for DumpPoints and Dump. Create DumpRings(geom) and DumpRingsP(geom, parent) and their bulk version. The path returned by DumpRings is the ring index. diffs (truncated from 514 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 @@ -1723,53 +1723,38 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i unsigned int num_geoms = 0, i; str err; - if (wkb_isnil(*geomWKB)) { - - //create new empty BAT for the output - if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) { - *idBAT_id = bat_nil; - throw(MAL, "geom.Dump", "Error creating new BAT"); - } - - if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) { - BBPunfix(idBAT->batCacheid); - *geomBAT_id = bat_nil; - throw(MAL, "geom.Dump", "Error creating new BAT"); - } - - if (parent) { - if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) { - BBPunfix(idBAT->batCacheid); - BBPunfix(geomBAT->batCacheid); - *parentBAT_id = bat_nil; - throw(MAL, "geom.Dump", "Error creating new BAT"); - } + if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) { + *idBAT_id = bat_nil; + throw(MAL, "geom.Dump", "Error creating new BAT"); + } + + if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); + *geomBAT_id = bat_nil; + throw(MAL, "geom.Dump", "Error creating new BAT"); + } + + if (parent) { + if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); + BBPunfix(geomBAT->batCacheid); + *parentBAT_id = bat_nil; + throw(MAL, "geom.Dump", "Error creating new BAT"); } - + } + + if (wkb_isnil(*geomWKB)) { + //create new empty BAT for the output BBPkeepref(*idBAT_id = idBAT->batCacheid); - BBPkeepref(*geomBAT_id = geomBAT->batCacheid); - if (parent) { BBPkeepref(*parentBAT_id = parentBAT->batCacheid); } - return MAL_SUCCEED; } geosGeometry = wkb2geos(*geomWKB); - 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"), 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); @@ -1779,11 +1764,6 @@ wkbDump_(bat *parentBAT_id, bat *idBAT_i } if (parent) { - 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 < num_geoms; i++) { if (BUNappend(parentBAT, parent, TRUE) != GDK_SUCCEED) { @@ -1995,55 +1975,44 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i str err; uint32_t num_points = 0; + if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) { + *idBAT_id = int_nil; + throw(MAL, "geom.DumpPoints", "Error creating new BAT"); + } + + if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); + *geomBAT_id = int_nil; + throw(MAL, "geom.DumpPoints", "Error creating new BAT"); + } + + if (parent) { + if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); + BBPunfix(geomBAT->batCacheid); + *parentBAT_id = bat_nil; + throw(MAL, "geom.DumpPoints", "Error creating new BAT"); + } + } if (wkb_isnil(*geomWKB)) { - //create new empty BAT for the output - if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) { - *idBAT_id = int_nil; - throw(MAL, "geom.DumpPoints", "Error creating new BAT"); - } - - if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) { - BBPunfix(idBAT->batCacheid); - *geomBAT_id = int_nil; - throw(MAL, "geom.DumpPoints", "Error creating new BAT"); - } - - if (parent) { - if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) { - BBPunfix(idBAT->batCacheid); - BBPunfix(geomBAT->batCacheid); - *parentBAT_id = bat_nil; - throw(MAL, "geom.DumpPoints", "Error creating new BAT"); - } - } - BBPkeepref(*idBAT_id = idBAT->batCacheid); - BBPkeepref(*geomBAT_id = geomBAT->batCacheid); - if (parent) { BBPkeepref(*parentBAT_id = parentBAT->batCacheid); } - return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); - - 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"), 0, TRANSIENT)) == NULL) { + if ( (geosGeometry = wkb2geos(*geomWKB)) == NULL) { BBPunfix(idBAT->batCacheid); - GEOSGeom_destroy(geosGeometry); - throw(MAL, "geom.Dump", "Error creating new BAT"); - } - - if ( (err = dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, &num_points, "")) != MAL_SUCCEED ) - { + BBPunfix(geomBAT->batCacheid); + if (parent) + BBPunfix(parentBAT->batCacheid); + throw(MAL, "geom.DumpPoints", "wkb2geos failed"); + } + + if ( (err = dumpPointsGeometry_(idBAT, geomBAT, geosGeometry, &num_points, "")) != MAL_SUCCEED ) { BBPunfix(idBAT->batCacheid); BBPunfix(geomBAT->batCacheid); if (parent) @@ -2051,11 +2020,6 @@ wkbDumpPoints_(bat *parentBAT_id, bat *i return err; } if (parent) { - if ((parentBAT = COLnew(0, ATOMindex("int"), num_points, 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 < num_points; i++) { if (BUNappend(parentBAT, parent, TRUE) != GDK_SUCCEED) { @@ -2089,109 +2053,156 @@ wkbDumpPointsP(bat *parentBAT_id, bat *i } static str -wkbDumpRings_(bat *parentBAT_id, bat *geomBAT_id, wkb **geomWKB, int *parent) -{ - BAT *geomBAT = NULL, *parentBAT = NULL; - GEOSGeom geosGeometry; +dumpRingsGeometry_(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry, unsigned *num_rings, const char *path) +{ + char *newPath = NULL; const GEOSGeometry *ring; wkb *geom; unsigned int numInteriorRings, i; + int lvlDigitsNum = 10, lvl=0; //MAX_UNIT = 4,294,967,295 str err; - - if (wkb_isnil(*geomWKB)) { - + (void) path; + + /*Check Type*/ + if ( (GEOSGeomTypeId(geosGeometry) + 1) != wkbPolygon_mdb ) { + return createException(MAL, "geom.DumpRings","Geometry is not a Polygon"); + } + + ring = GEOSGetExteriorRing(geosGeometry); + if(!ring) { + return createException(MAL, "geom.DumpRings","GEOSGetExteriorRing failed"); + } + if((geom = geos2wkb(ring)) == NULL) { + return createException(MAL, "geom.DumpRings","geos2wkb failed"); + } + if (BUNappend(geomBAT, geom, TRUE) != GDK_SUCCEED) { + return createException(MAL, "geom.DumpRings","BUNappend failed"); + } + + lvl++; + if ( (newPath = GDKmalloc(lvlDigitsNum + 1)) == NULL) { + throw(MAL, "geom.DumpRings", MAL_MALLOC_FAIL); + } + snprintf(newPath, lvlDigitsNum + 1, "%u", lvl); + if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED) { + GDKfree(newPath); + throw(MAL, "geom.DumpRings", "BUNappend failed"); + } + GDKfree(newPath); + + //check the interior rings + if ((numInteriorRings = GEOSGetNumInteriorRings(geosGeometry) == -1)) { + return createException(MAL, "geom.DumpRings","GEOSGetNumInteriorRings failed"); + } + + for(i=0; i<numInteriorRings; i++) { + ring = GEOSGetInteriorRingN(geosGeometry, i); + if (ring == NULL) { + GDKfree(newPath); + return createException(MAL, "geom.DumpRings","GEOSGetInteriorRingN failed"); + } + + if((geom = geos2wkb(ring)) == NULL) { + GDKfree(newPath); + return createException(MAL, "geom.DumpRings","geos2wkb failed"); + } + if (BUNappend(geomBAT, geom, TRUE) != GDK_SUCCEED) { + GDKfree(newPath); + return createException(MAL, "geom.DumpRings","BUNappend failed"); + } + lvl++; + if ( (newPath = GDKmalloc(lvlDigitsNum + 1)) == NULL) { + throw(MAL, "geom.DumpRings", MAL_MALLOC_FAIL); + } + snprintf(newPath, lvlDigitsNum + 1, "%u", lvl); + if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED) { + GDKfree(newPath); + throw(MAL, "geom.DumpRings", "BUNappend failed"); + } + GDKfree(newPath); + } + + *num_rings = lvl; + return MAL_SUCCEED; +} + +str +dumpRingsGeometry(BAT *idBAT, BAT *geomBAT, const GEOSGeometry *geosGeometry, uint32_t *num_rings, const char *path) { + return dumpRingsGeometry_(idBAT, geomBAT, geosGeometry, num_rings, path); +} + +static str +wkbDumpRings_(bat *parentBAT_id, bat *idBAT_id, bat *geomBAT_id, wkb **geomWKB, int *parent) +{ + BAT *idBAT = NULL, *geomBAT = NULL, *parentBAT = NULL; + GEOSGeom geosGeometry; + char *path = NULL; + const GEOSGeometry *ring; + wkb *geom; + unsigned int numInteriorRings, i; + int num_rings=0; + str err; + + if ((idBAT = COLnew(0, TYPE_str, 0, TRANSIENT)) == NULL) { + *idBAT_id = bat_nil; + throw(MAL, "geom.DumpRings", "Error creating new BAT"); + } + + if ((geomBAT = COLnew(0, ATOMindex("wkb"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); + *geomBAT_id = bat_nil; + throw(MAL, "geom.DumpRings", "Error creating new BAT"); + } + + if (parent) { + if ((parentBAT = COLnew(0, ATOMindex("int"), 0, TRANSIENT)) == NULL) { + BBPunfix(idBAT->batCacheid); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list