Changeset: febc8b93811d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=febc8b93811d
Modified Files:
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/Tests/All
Branch: geo
Log Message:

error handling


diffs (213 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -113,6 +113,7 @@ geom_export str wkbCentroid(wkb **out, w
 geom_export str wkbStartPoint(wkb **out, wkb **geom);
 geom_export str wkbEndPoint(wkb **out, wkb **geom);
 geom_export str wkbNumPoints(int *out, wkb **geom);
+geom_export str wkbPointN(wkb **out, wkb **geom, short *n);
 
 bat *
 geom_prelude(void)
@@ -794,8 +795,8 @@ wkbcreatepoint_bat(int *out, int *ix, in
        }
 
        BATsetcount(bo, BATcount(bx));
-    BATsettrivprop(bo);
-    BATderiveProps(bo,FALSE);
+       BATsettrivprop(bo);
+       BATderiveProps(bo,FALSE);
        BBPreleaseref(bx->batCacheid);
        BBPreleaseref(by->batCacheid);
        BBPkeepref(*out = bo->batCacheid);
@@ -1224,8 +1225,8 @@ wkbCentroid(wkb **out, wkb **geom)
 
        GEOSGeom_destroy(geosGeometry);
 
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, "geom.Centroid", "GEOSGetCentroid failed");
+       //if (GDKerrbuf && GDKerrbuf[0])
+       //      throw(MAL, "geom.Centroid", "GEOSGetCentroid failed");
        return MAL_SUCCEED;
 
 }
@@ -1235,17 +1236,22 @@ wkbBorderPoint(wkb **out, wkb **geom, GE
 {
        GEOSGeom geosGeometry = wkb2geos(*geom);
 
-       if (!geosGeometry || GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+       if (!geosGeometry) {
                *out = geos2wkb(NULL);
                return MAL_SUCCEED;
        }
 
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = geos2wkb(NULL);
+               throw(MAL, name, "GEOSGeomGet%s failed. Geometry not a 
LineString", name + 5);
+       }
+
        *out = geos2wkb((*func)(geosGeometry));
 
        GEOSGeom_destroy(geosGeometry);
 
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, name, "GEOSGeomGet%s failed", name + 5);
+       //if (GDKerrbuf && GDKerrbuf[0])
+       //      throw(MAL, name, "GEOSGeomGet%s failed", name + 5);
        return MAL_SUCCEED;
 }
 
@@ -1253,62 +1259,73 @@ str
 wkbStartPoint(wkb **out, wkb **geom)
 {
        return wkbBorderPoint(out, geom, GEOSGeomGetStartPoint, 
"geom.StartPoint");
-       /*GEOSGeom geosGeometry = wkb2geos(*geom);
-
-       if (!geosGeometry || GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
-               *out = geos2wkb(NULL);
-               return MAL_SUCCEED;
-       }
-
-       *out = geos2wkb(GEOSGeomGetStartPoint(geosGeometry));
-
-       GEOSGeom_destroy(geosGeometry);
-
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, "geom.StartPoint", "GEOSGeomGetStartPoint failed");
-       return MAL_SUCCEED;*/
-
 }
 
 str
 wkbEndPoint(wkb **out, wkb **geom)
 {
        return wkbBorderPoint(out, geom, GEOSGeomGetEndPoint, "geom.EndPoint");
-       /*GEOSGeom geosGeometry = wkb2geos(*geom);
+}
+
+str
+wkbNumPoints(int *out, wkb **geom)
+{
+       GEOSGeom geosGeometry = wkb2geos(*geom);
+
+       if (!geosGeometry) {
+               *out = int_nil;
+               return MAL_SUCCEED;
+       }
+
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = int_nil;
+               throw(MAL, "geom.NumPoints", "GEOSGeomGetNumPoints failed. 
Geometry not a LineString");
+       }
+
+       *out = GEOSGeomGetNumPoints(geosGeometry);
+       GEOSGeom_destroy(geosGeometry);
+
+       if (*out == -1)
+               throw(MAL, "geom.NumPoints", "GEOSGeomGetNumPoints failed");
+
+       //if (GDKerrbuf && GDKerrbuf[0])
+       //      throw(MAL, "geom.NumPoints", "GEOSGeomGetNumPoints failed");
+
+       return MAL_SUCCEED;
+}
+
+str 
+wkbPointN(wkb **out, wkb **geom, short *n)
+{
+       short rN = -1;
+       GEOSGeom geosGeometry = wkb2geos(*geom);
 
        if (!geosGeometry) {
                *out = geos2wkb(NULL);
                return MAL_SUCCEED;
        }
 
-       *out = geos2wkb(GEOSGeomGetEndPoint(geosGeometry));
+       if (GEOSGeomTypeId(geosGeometry) != GEOS_LINESTRING) {
+               *out = geos2wkb(NULL);
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed. Geometry 
not a LineString");
+       }
 
+       //check number of points
+       rN = GEOSGeomGetNumPoints(geosGeometry);
+       if (rN == -1)
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed becasue 
GEOSGeomGetNumPoints ");    
+
+       if(rN <= *n || *n<0) {
+               *out = geos2wkb(NULL);
+               GEOSGeom_destroy(geosGeometry);
+               throw(MAL, "geom.PointN", "GEOSGeomGetPointN unable to retrieve 
point %d (not enough points)", *n);
+       }
+
+       *out = geos2wkb(GEOSGeomGetPointN(geosGeometry, *n));
        GEOSGeom_destroy(geosGeometry);
 
-       if (GDKerrbuf && GDKerrbuf[0])
-               throw(MAL, "geom.EndPoint", "GEOSGeomGetEndPoint failed");
-       return MAL_SUCCEED;*/
+       if (*out != NULL)
+               return MAL_SUCCEED;
 
+       throw(MAL, "geom.PointN", "GEOSGeomGetPointN failed");
 }
-
-str
-wkbNumPoints(int *out, wkb **geom)
-{
-       str ret = MAL_SUCCEED;
-       GEOSGeom ga = wkb2geos(*geom);
-
-       if (!ga) {
-               *out = dbl_nil;
-               return ret;
-       }
-
-       *out = GEOSGeomGetNumPoints(ga);
-       if (*out == -1)
-               ret = "GEOSGeomGetNumPoints failed";
-
-       GEOSGeom_destroy(ga);
-
-       if (ret != MAL_SUCCEED)
-               throw(MAL, "geom.NumPoints", "%s", ret);
-       return ret;
-}
diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal
--- a/geom/monetdb5/geom.mal
+++ b/geom/monetdb5/geom.mal
@@ -245,15 +245,19 @@ comment "Returns the centroid of this Ge
 
 command StartPoint(w:wkb) :wkb
 address wkbStartPoint
-comment "Returns the start point of this Geometry which should be Linestring.";
+comment "Returns the start point of this Geometry. Argument w should be 
Linestring.";
 
 command EndPoint(w:wkb) :wkb
 address wkbEndPoint
-comment "Returns the end point of this Geometry where should be Linestring 
(?).";
+comment "Returns the end point of this Geometry. Argument w should be 
Linestring.";
 
 command NumPoints(w:wkb) :int
 address wkbNumPoints
-comment "The number of points in the Geometry where should be Linestring (?).";
+comment "The number of points in the Geometry. Argument w should be 
Linestring.";
+
+command PointN(w:wkb, n:sht) :wkb
+address wkbPointN
+comment "Returns the n-th point of the Geometry. Argument w should be 
Linestring.";
 
 
 command prelude():void address geom_prelude;
diff --git a/geom/sql/Tests/All b/geom/sql/Tests/All
--- a/geom/sql/Tests/All
+++ b/geom/sql/Tests/All
@@ -40,7 +40,7 @@ T18
 # T20  no such unary operator 'asbinary(geometry)'
 T21
 T22
-# T23  no such binary operator 'pointn(linestring,tinyint)'
+T23
 T24
 # T25  no such unary operator 'pointonsurface(polygon)'
 T26
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to