Changeset: b8b677151f55 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b8b677151f55
Modified Files:
        geom/monetdb5/Makefile.ag
        geom/monetdb5/geom.c
        geom/monetdb5/geom.h
        geom/monetdb5/geom_clean.c
        geom/monetdb5/sfcgal.c
Branch: sfcgal
Log Message:

It compiles, but it is not yet functional because one function is still void.


diffs (truncated from 777 to 300 lines):

diff --git a/geom/monetdb5/Makefile.ag b/geom/monetdb5/Makefile.ag
--- a/geom/monetdb5/Makefile.ag
+++ b/geom/monetdb5/Makefile.ag
@@ -17,7 +17,7 @@ INCLUDES = ../lib \
 lib__geom = {
        MODULE
        DIR = libdir/monetdb5
-       SOURCES = geom.h geom.c geomBulk.c geom_upgrade.c geom_geojson.c 
geom_x3d.c
+       SOURCES = geom.h geom.c geomBulk.c geom_upgrade.c geom_geojson.c 
geom_x3d.c geom_clean.c
        LIBS = ../lib/libgeom \
                   ../../gdk/libbat \
               ../../common/stream/libstream \
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -18,6 +18,27 @@ 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**), char* name);
 
+static inline int
+geometryHasZ(int info)
+{
+       return (info & 0x02);
+}
+
+static inline int
+geometryHasM(int info)
+{
+       return (info & 0x01);
+}
+static wkb wkb_nil = { ~0, 0 };
+
+static wkb *
+wkbNULLcopy(void)
+{
+       wkb *n = GDKmalloc(sizeof(wkb_nil));
+       if (n)
+               *n = wkb_nil;
+       return n;
+}
 /* the first argument in the functions is the return variable */
 
 #ifdef HAVE_PROJ
@@ -4053,7 +4074,7 @@ wkbEndPoint(wkb **out, wkb **geom)
        return wkbBorderPoint(out, geom, GEOSGeomGetEndPoint, "geom.EndPoint");
 }
 
-static str
+str
 numPointsLineString(unsigned int *out, const GEOSGeometry *geosGeometry)
 {
        /* get the coordinates of the points comprising the geometry */
diff --git a/geom/monetdb5/geom.h b/geom/monetdb5/geom.h
--- a/geom/monetdb5/geom.h
+++ b/geom/monetdb5/geom.h
@@ -54,27 +54,8 @@
     b->tnonil = 0;                                             \
     b->tnodense = 1;                                            
 
-static inline int
-geometryHasZ(int info)
-{
-       return (info & 0x02);
-}
-
-static inline int
-geometryHasM(int info)
-{
-       return (info & 0x01);
-}
-static wkb wkb_nil = { ~0, 0 };
-
-static wkb *
-wkbNULLcopy(void)
-{
-       wkb *n = GDKmalloc(sizeof(wkb_nil));
-       if (n)
-               *n = wkb_nil;
-       return n;
-}
+/*Necessary for external functionality*/
+geom_export str numPointsLineString(unsigned int *out, const GEOSGeometry 
*geosGeometry);
 
 /* general functions */
 geom_export str geoHasZ(int* res, int* info);
diff --git a/geom/monetdb5/geom_clean.c b/geom/monetdb5/geom_clean.c
--- a/geom/monetdb5/geom_clean.c
+++ b/geom/monetdb5/geom_clean.c
@@ -1,49 +1,14 @@
 #include "geom.h"
 
-static str
-geos_verify(const GEOSGeometry **res, const GEOSGeometry *geom)
-{
-       int geometryType = GEOSGeomTypeId(geosGeometry) + 1;
-    str msg = MAL_SUCCEED;
-
-    switch (geom->type)
-    {
-        case POINTTYPE:
-        case MULTIPOINTTYPE:
-            *res = geom;
-            break;
-        case LINETYPE:
-            msg = geos_line_verify(res, geom);
-            break;
-        case POLYGONTYPE:
-            msg = geos_polygon_verify(res, geom);
-            break;
-        case MULTILINETYPE:
-        case MULTIPOLYGONTYPE:
-        case COLLECTIONTYPE:
-            msg = geos_collection_verify(res, geom);
-            break;
-        case CIRCSTRINGTYPE:
-        case COMPOUNDTYPE:
-        case CURVEPOLYTYPE:
-        case MULTISURFACETYPE:
-        case MULTICURVETYPE:
-        default:
-            *res = NULL;
-            msg = createException(MAL, "geos_verify", "Unknown geometry type");
-            break;
-    }
-    
-    return msg;
-}
+static str geos_geom_verify(GEOSGeometry **res, const GEOSGeometry 
*geosGeometry);
 
 static str
-geos_ring_verify(const GEOSGeometry **res, const GEOSGeometry *geosGeometry)
+geos_ring_verify(GEOSGeometry **res, const GEOSGeometry *geosGeometry)
 {
     int closed = 0;
-       str err = MAL_SUCCEED;
+       str err = MAL_SUCCEED, msg = MAL_SUCCEED;
        unsigned int pointsNum;
-    int srid = 0;
+    int srid = 0, j = 0;
 
     /*Check if the ring is closed*/ 
     if ((closed = GEOSisClosed(geosGeometry)) == 2)
@@ -51,20 +16,21 @@ geos_ring_verify(const GEOSGeometry **re
 
     /*If it is not closed, close it*/
     if (closed != 1) {
-        const GEOSCoordSequence *gcs_new = NULL, *gcs_old;
+        GEOSCoordSequence *gcs_new = NULL;
+        const GEOSCoordSequence *gcs_old = NULL;
         srid = GEOSGetSRID(geosGeometry);
         double x, y, z;
-        int lineDim = 0;
+        int lineDim = 0, i = 0;
 
         if ((err = numPointsLineString(&pointsNum, geosGeometry)) != 
MAL_SUCCEED) {
             *res = NULL;
-            msg = createException(MAL, "geos_ring_verify", 
"numPointsLineString failed:%s", err;
+            msg = createException(MAL, "geos_ring_verify", 
"numPointsLineString failed:%s", err);
             GDKfree(err);
             return msg;
         } else {
             assert(pointsNum < 4);
             //get the coordinate sequences of the LineString
-            if (!(gcs_old = GEOSGeom_getCoordSeq(line))) {
+            if (!(gcs_old = GEOSGeom_getCoordSeq(geosGeometry))) {
                 *res = NULL;
                 throw(MAL, "geom.AddPoint", "GEOSGeom_getCoordSeq failed");
             }
@@ -105,27 +71,26 @@ geos_ring_verify(const GEOSGeometry **re
                 }
             }
             //Create new LineString
-            if (!(res = GEOSGeom_createLineString(gcs_new))) {
+            if (!(*res = GEOSGeom_createLineString(gcs_new))) {
                 throw(MAL, "geom.AddPoint", "GEOSGeom_createLineString 
failed");
             }
 
-           GEOSSetSRID(res, srid);
+           GEOSSetSRID(*res, srid);
         }
     } else {
-        /*We might have to clone it*/
-        *res = geosGeometry;
+        *res = GEOSGeom_clone(geosGeometry);
     }
 
        return MAL_SUCCEED;
 }
 
-str
-geos_poly_verify(const GEOSGeometry **res, const GEOSGeometry *geosGeometry)
+static str
+geos_polygon_verify(GEOSGeometry **res, const GEOSGeometry *geosGeometry)
 {
-       const GEOSGeometry *extRing = NULL, *extRres = NULL, **intRings = NULL;
-       int numInteriorRings = 0, i = 0, j = 0;
-       POINTARRAY **new_rings;
-       int i = 0, numIntRings = 0;
+       const GEOSGeometry *extRing = NULL;
+       GEOSGeometry *extRes = NULL, **intRings = NULL;
+       int i = 0, j = 0, numIntRings = 0;
+    str err = MAL_SUCCEED, msg = MAL_SUCCEED;
     bit untouched = 1;
 
        /* get the exterior ring of the polygon */
@@ -141,30 +106,30 @@ geos_poly_verify(const GEOSGeometry **re
         untouched = 0;
 
        numIntRings = GEOSGetNumInteriorRings(geosGeometry);
-       if (numInteriorRings == -1) {
+       if (numIntRings == -1) {
                *res = NULL;
                throw(MAL, "geos_poly_verify", "GEOSGetNumInteriorRings 
failed.");
     } else if(numIntRings) {
 
-        if ( (intRings = (const GEOSGeometry **) GDKzalloc(sizeof(const 
GEOSGeometry *)*numInteriorRings)) == NULL) {
+        if ( (intRings = (GEOSGeometry **) GDKzalloc(sizeof(GEOSGeometry 
*)*numIntRings)) == NULL) {
             *res = NULL;
             throw(MAL, "geos_poly_verify", MAL_MALLOC_FAIL);
         }
 
-        for (i = 0; i < numInteriorRings; i++) {
+        for (i = 0; i < numIntRings; i++) {
             const GEOSGeometry *intRing = NULL;
             if ((intRing = GEOSGetInteriorRingN(geosGeometry, i)) == NULL) {
                 msg = createException(MAL, "geos_poly_verify", 
"GEOSGetInteriorRingN failed.");
                 break;
             }
-            if ( (msg = geos_ring_verify(intRings[i], intRing)) != 
MAL_SUCCEED) {
+            if ( (msg = geos_ring_verify(&intRings[i], intRing)) != 
MAL_SUCCEED) {
                 break;
             } else if (intRings[i] != intRing)
                 untouched = 0;
         }
         if (msg != MAL_SUCCEED) {
             *res = NULL;
-            /*TODO: You should destroy if you are cloning*/
+            /*TODO: You should only destroy if you have clonned it*/
             for (j = 0; j < i; j++)
                 GEOSGeom_destroy(intRings[j]);
             GDKfree(intRings);
@@ -174,19 +139,18 @@ geos_poly_verify(const GEOSGeometry **re
 
     /*Create a new geometry*/
     if (!untouched) {
-        if ( (*res = GEOSGeom_createPolygon(exteriorRingGeometry, intRings, 
numInteriorRings)) == NULL) {
-            GEOSGeom_destroy(exteriorRingGeometry);
-            if (numInteriorRings) {
-                /*TODO: You should destroy if you are cloning*/
-                for (i = 0; i < numInteriorRings; i++)
+        if ( (*res = GEOSGeom_createPolygon(extRes, intRings, numIntRings)) == 
NULL) {
+            GEOSGeom_destroy(extRes);
+            if (numIntRings) {
+                /*TODO: You should only destroy if you have clonned it*/
+                for (i = 0; i < numIntRings; i++)
                     GEOSGeom_destroy(intRings[i]);
                 GDKfree(intRings);
             }
             return createException(MAL, "geos_poly_verify", 
"GEOSGeom_createPolygon failed");
         }
     } else {
-        /*TODO: Maybe we should clone it*/
-        *res = geosGeometry;
+        *res = GEOSGeom_clone(geosGeometry);
     }
 
     if (intRings)
@@ -196,17 +160,17 @@ geos_poly_verify(const GEOSGeometry **re
 }
 
 /*Line has 0 or more than one point. If missing duplicate points*/
-str
-geos_line_verify(const GEOSGeometry **res, const GEOSGeometry *geosGeometry)
+static str
+geos_line_verify(GEOSGeometry **res, const GEOSGeometry *geosGeometry)
 {
-    unsigned int *pointsN;
+    unsigned int pointsN;
        GEOSGeom *ret;
-    str err = MAL_SUCCEED;
+    str err = MAL_SUCCEED, msg = MAL_SUCCEED;
     int srid = 0;
 
 
        //get the points in the exterior ring
-       if ((err = numPointsLineString(pointsN, lineGeometry)) != MAL_SUCCEED) {
+       if ( (err = numPointsLineString(&pointsN, geosGeometry)) != 
MAL_SUCCEED) {
         msg = createException(MAL,"geos_line_verify", "numPointsLineString 
failed:%s", err);
         GDKfree(err);
         *res = NULL;
@@ -214,12 +178,13 @@ geos_line_verify(const GEOSGeometry **re
        }
 
     if (pointsN == 1) {
-        const GEOSCoordSequence *gcs_new = NULL, *gcs_old;
+        GEOSCoordSequence *gcs_new = NULL;
+        const GEOSCoordSequence *gcs_old = NULL;
         srid = GEOSGetSRID(geosGeometry);
         double x, y, z;
         int lineDim = 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to