Changeset: 5001021cc090 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5001021cc090 Modified Files: geom/lib/libgeom.c geom/lib/libgeom.h geom/monetdb5/geom.c Branch: default Log Message:
Experimental fix for failing geom tests. Use the reentrant versions of geos library instead of the global ones. So far I used for the reader and writer functions, which may cause most of the problems. If this is the solution, we should change the API to pass the handle as a parameter, or move it to Thread local storage, so it we don't to create it at every function call. If the tests still fail, then tomorrow I will revert this commit. HG :Entei commit message. Lines beginning with 'HG:' are removed. diffs (truncated from 868 to 300 lines): diff --git a/geom/lib/libgeom.c b/geom/lib/libgeom.c --- a/geom/lib/libgeom.c +++ b/geom/lib/libgeom.c @@ -106,17 +106,24 @@ getMbrGeos(mbr *res, const GEOSGeom geos */ GEOSGeom -wkb2geos(const wkb *geomWKB) +wkb2geos(GEOSContextHandle_t handle, const wkb *geomWKB) { GEOSGeom geosGeometry; if (is_wkb_nil(geomWKB)) return NULL; - geosGeometry = GEOSGeomFromWKB_buf((unsigned char *) geomWKB->data, geomWKB->len); + if (handle) + geosGeometry = GEOSGeomFromWKB_buf_r(handle, (unsigned char *) geomWKB->data, geomWKB->len); + else + geosGeometry = GEOSGeomFromWKB_buf((unsigned char *) geomWKB->data, geomWKB->len); - if (geosGeometry != NULL) - GEOSSetSRID(geosGeometry, geomWKB->srid); + if (geosGeometry != NULL) { + if (handle) + GEOSSetSRID_r(handle, geosGeometry, geomWKB->srid); + else + GEOSSetSRID(geosGeometry, geomWKB->srid); + } return geosGeometry; } diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h --- a/geom/lib/libgeom.h +++ b/geom/lib/libgeom.h @@ -139,7 +139,7 @@ libgeom_export void libgeom_exit(void); libgeom_export bool is_wkb_nil(const wkb *wkbp); libgeom_export int getMbrGeos(mbr *mbr, const GEOSGeom geosGeometry); libgeom_export int getMbrGeom(mbr *res, wkb *geom); -libgeom_export GEOSGeom wkb2geos(const wkb *geomWKB); +libgeom_export GEOSGeom wkb2geos(GEOSContextHandle_t handle, const wkb *geomWKB); //libgeom_export str geomerty_2_geometry(wkb *res, wkb **geom, int* columnType, int* columnSRID, int* valueSRID); diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -16,7 +16,7 @@ int TYPE_mbr; -static wkb *geos2wkb(const GEOSGeometry *geosGeometry); +static wkb *geos2wkb(GEOSContextHandle_t handle, const GEOSGeometry *geosGeometry); static inline int geometryHasZ(int info) @@ -438,7 +438,7 @@ wkbTransform(wkb **transformedWKB, wkb * } /* get the geosGeometry from the wkb */ - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); /* get the type of the geometry */ geometryType = GEOSGeomTypeId(geosGeometry) + 1; @@ -469,7 +469,7 @@ wkbTransform(wkb **transformedWKB, wkb * /* set the new srid */ GEOSSetSRID(transformedGeosGeometry, *srid_dst); /* get the wkb */ - if ((*transformedWKB = geos2wkb(transformedGeosGeometry)) == NULL) + if ((*transformedWKB = geos2wkb(NULL, transformedGeosGeometry)) == NULL) ret = createException(MAL, "geom.Transform", SQLSTATE(38000) "Geos operation geos2wkb failed"); /* destroy the geos geometries */ GEOSGeom_destroy(transformedGeosGeometry); @@ -776,7 +776,7 @@ wkbForceDim(wkb **outWKB, wkb **geomWKB, return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); if (geosGeometry == NULL) { *outWKB = NULL; throw(MAL, "geom.ForceDim", SQLSTATE(38000) "Geos operation wkb2geos failed"); @@ -790,7 +790,7 @@ wkbForceDim(wkb **outWKB, wkb **geomWKB, GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry)); - *outWKB = geos2wkb(outGeometry); + *outWKB = geos2wkb(NULL, outGeometry); GEOSGeom_destroy(geosGeometry); GEOSGeom_destroy(outGeometry); @@ -1156,7 +1156,7 @@ wkbSegmentize(wkb **outWKB, wkb **geomWK return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); if (geosGeometry == NULL) { *outWKB = NULL; throw(MAL, "geom.Segmentize", SQLSTATE(38000) "Geos operation wkb2geos failed"); @@ -1170,7 +1170,7 @@ wkbSegmentize(wkb **outWKB, wkb **geomWK GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry)); - *outWKB = geos2wkb(outGeometry); + *outWKB = geos2wkb(NULL, outGeometry); GEOSGeom_destroy(geosGeometry); GEOSGeom_destroy(outGeometry); @@ -1474,7 +1474,7 @@ wkbTranslate(wkb **outWKB, wkb **geomWKB return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); if (geosGeometry == NULL) { *outWKB = NULL; throw(MAL, "geom.Translate", SQLSTATE(38000) "Geos operation wkb2geos failed"); @@ -1488,7 +1488,7 @@ wkbTranslate(wkb **outWKB, wkb **geomWKB GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry)); - *outWKB = geos2wkb(outGeometry); + *outWKB = geos2wkb(NULL, outGeometry); GEOSGeom_destroy(geosGeometry); GEOSGeom_destroy(outGeometry); @@ -1514,7 +1514,7 @@ wkbDelaunayTriangles(wkb **outWKB, wkb * return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); outGeometry = GEOSDelaunayTriangulation(geosGeometry, *tolerance, *flag); GEOSGeom_destroy(geosGeometry); if (outGeometry == NULL) { @@ -1522,7 +1522,7 @@ wkbDelaunayTriangles(wkb **outWKB, wkb * throw(MAL, "geom.DelaunayTriangles", SQLSTATE(38000) "Geos operation GEOSDelaunayTriangulation failed"); } - *outWKB = geos2wkb(outGeometry); + *outWKB = geos2wkb(NULL, outGeometry); GEOSGeom_destroy(outGeometry); if (*outWKB == NULL) @@ -1542,7 +1542,7 @@ wkbPointOnSurface(wkb **resWKB, wkb **ge return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); if (geosGeometry == NULL) { *resWKB = NULL; throw(MAL, "geom.PointOnSurface", SQLSTATE(38000) "Geos operation wkb2geos failed"); @@ -1557,7 +1557,7 @@ wkbPointOnSurface(wkb **resWKB, wkb **ge //set the srid of the point the same as the srid of the input geometry GEOSSetSRID(resGeosGeometry, GEOSGetSRID(geosGeometry)); - *resWKB = geos2wkb(resGeosGeometry); + *resWKB = geos2wkb(NULL, resGeosGeometry); GEOSGeom_destroy(geosGeometry); GEOSGeom_destroy(resGeosGeometry); @@ -1573,7 +1573,7 @@ dumpGeometriesSingle(BAT *idBAT, BAT *ge { char *newPath = NULL; size_t pathLength = strlen(path); - wkb *singleWKB = geos2wkb(geosGeometry); + wkb *singleWKB = geos2wkb(NULL, geosGeometry); str err = MAL_SUCCEED; if (singleWKB == NULL) @@ -1709,7 +1709,7 @@ wkbDump(bat *idBAT_id, bat *geomBAT_id, return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); //count the number of geometries geometriesNum = GEOSGetNumGeometries(geosGeometry); @@ -1743,7 +1743,7 @@ dumpPointsPoint(BAT *idBAT, BAT *geomBAT { char *newPath = NULL; size_t pathLength = strlen(path); - wkb *pointWKB = geos2wkb(geosGeometry); + wkb *pointWKB = geos2wkb(NULL, geosGeometry); int lvlDigitsNum = 10; //MAX_UNIT = 4,294,967,295 str err = MAL_SUCCEED; @@ -1776,7 +1776,7 @@ dumpPointsLineString(BAT *idBAT, BAT *ge int i = 0; int check = 0; unsigned int lvl = 0; - wkb *geomWKB = geos2wkb(geosGeometry); + wkb *geomWKB = geos2wkb(NULL, geosGeometry); err = wkbNumPoints(&pointsNum, &geomWKB, &check); GDKfree(geomWKB); @@ -1940,7 +1940,7 @@ wkbDumpPoints(bat *idBAT_id, bat *geomBA return MAL_SUCCEED; } - geosGeometry = wkb2geos(*geomWKB); + geosGeometry = wkb2geos(NULL, (*geomWKB)); if ((err = wkbNumPoints(&pointsNum, geomWKB, &check)) != MAL_SUCCEED) { GEOSGeom_destroy(geosGeometry); @@ -1988,7 +1988,7 @@ geom_2_geom(wkb **resWKB, wkb **valueWKB } /* get the geosGeometry from the wkb */ - geosGeometry = wkb2geos(*valueWKB); + geosGeometry = wkb2geos(NULL, (*valueWKB)); if (geosGeometry == NULL) throw(MAL, "calc.wkb", SQLSTATE(38000) "Geos operation wkb2geos failed"); @@ -2008,7 +2008,7 @@ geom_2_geom(wkb **resWKB, wkb **valueWKB } /* get the wkb from the geosGeometry */ - *resWKB = geos2wkb(geosGeometry); + *resWKB = geos2wkb(NULL, geosGeometry); GEOSGeom_destroy(geosGeometry); if (*resWKB == NULL) @@ -2131,6 +2131,7 @@ wkbFROMSTR_withSRID(const char *geomWKT, const char *multiPolygon = "MULTIPOLYGON"; char *geomWKT_new = NULL; size_t parsedCharacters = 0; + GEOSContextHandle_t handle = NULL; *nread = 0; @@ -2171,36 +2172,46 @@ wkbFROMSTR_withSRID(const char *geomWKT, } ////////////////////////// UP TO HERE /////////////////////////// - WKT_reader = GEOSWKTReader_create(); + if (!(handle = initGEOS_r((GEOSMessageHandler) GDKerror, (GEOSMessageHandler) GDKerror))) { + if (geomWKT_new) + GDKfree(geomWKT_new); + throw(MAL, "wkb.FromText", SQLSTATE(38000) "Geos operation initGEOS_r failed"); + } + + WKT_reader = GEOSWKTReader_create_r(handle); if (WKT_reader == NULL) { if (geomWKT_new) GDKfree(geomWKT_new); + GEOS_finish_r(handle); throw(MAL, "wkb.FromText", SQLSTATE(38000) "Geos operation GEOSWKTReader_create failed"); } - geosGeometry = GEOSWKTReader_read(WKT_reader, geomWKT); - GEOSWKTReader_destroy(WKT_reader); + geosGeometry = GEOSWKTReader_read_r(handle, WKT_reader, geomWKT); + GEOSWKTReader_destroy_r(handle, WKT_reader); if (geosGeometry == NULL) { if (geomWKT_new) GDKfree(geomWKT_new); + GEOS_finish_r(handle); throw(MAL, "wkb.FromText", SQLSTATE(38000) "Geos operation GEOSWKTReader_read failed"); } - if (GEOSGeomTypeId(geosGeometry) == -1) { + if (GEOSGeomTypeId_r(handle, geosGeometry) == -1) { if (geomWKT_new) GDKfree(geomWKT_new); - GEOSGeom_destroy(geosGeometry); + GEOSGeom_destroy_r(handle, geosGeometry); + GEOS_finish_r(handle); throw(MAL, "wkb.FromText", SQLSTATE(38000) "Geos operation GEOSGeomTypeId failed"); } - GEOSSetSRID(geosGeometry, srid); + GEOSSetSRID_r(handle, geosGeometry, srid); /* the srid was lost with the transformation of the GEOSGeom to wkb * so we decided to store it in the wkb */ /* we have a GEOSGeometry with number of coordinates and SRID and we * want to get the wkb out of it */ - *geomWKB = geos2wkb(geosGeometry); - GEOSGeom_destroy(geosGeometry); + *geomWKB = geos2wkb(handle, geosGeometry); + GEOSGeom_destroy_r(handle, geosGeometry); + GEOS_finish_r(handle); if (*geomWKB == NULL) { if (geomWKT_new) GDKfree(geomWKT_new); @@ -2252,7 +2263,7 @@ wkbaFROMSTR_withSRID(const char *fromStr * the input geosGeometry should not be altered by this function * return NULL on error */ static wkb * -geos2wkb(const GEOSGeometry *geosGeometry) +geos2wkb(GEOSContextHandle_t handle, const GEOSGeometry *geosGeometry) //TODO finish conversion to the reentrant functions { size_t wkbLen = 0; unsigned char *w = NULL; @@ -2263,8 +2274,13 @@ geos2wkb(const GEOSGeometry *geosGeometr _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list