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

Reply via email to