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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list