Changeset: 539bf1341459 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=539bf1341459 Modified Files: geom/monetdb5/geom.c geom/monetdb5/geom.mal Branch: geo Log Message:
added linearring type before multipoint + fixed some checks to destroy the message returned from a function called inside another function diffs (200 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -2071,20 +2071,25 @@ str wkbFromWKB(wkb **w, wkb **src) { * same with the type of the geometry created from the wkt representation */ str wkbFromText(wkb **geomWKB, str *geomWKT, int* srid, int *tpe) { size_t len=0; - int te = *tpe; - char *errbuf; + int te = 0; + char *errbuf = NULL; str ex; + if(*tpe > 2) + te=1; + *geomWKB = NULL; if (wkbFROMSTR(*geomWKT, &len, geomWKB, *srid) && - (wkb_isnil(*geomWKB) || *tpe==0 || *tpe == wkbGeometryCollection || (te = *((*geomWKB)->data + 1) & 0x0f) == *tpe)) { + (wkb_isnil(*geomWKB) || *tpe==0 || *tpe == wkbGeometryCollection || (te += *((*geomWKB)->data + 1) & 0x0f) == *tpe)) { return MAL_SUCCEED; } + if (*geomWKB == NULL) { *geomWKB = wkb_nil; - } + } + if (*tpe > 0 && te != *tpe) - throw(MAL, "wkb.FromText", "Geometry not type '%s' but '%s' instead", geom_type2str(*tpe,0), geom_type2str(te,0)); + throw(MAL, "wkb.FromText", "Geometry not type '%d: %s' but '%d: %s' instead", *tpe, geom_type2str(*tpe,0), te, geom_type2str(te,0)); errbuf = GDKerrbuf; if (errbuf) { if (strncmp(errbuf, "!ERROR: ", 8) == 0) @@ -2097,7 +2102,6 @@ str wkbFromText(wkb **geomWKB, str *geom if (GDKerrbuf) GDKerrbuf[0] = '\0'; - return ex; } @@ -2166,18 +2170,25 @@ str wkbMLineStringToPolygon(wkb** geomWK //make wkb from wkt ret = wkbFromText(&inputWKB, geomWKT, srid, &type); if(ret != MAL_SUCCEED) { + str msg = createException(MAL, "geom.MLineStringToPolygon: ", "%s", ret); + *geomWKB = wkb_nil; + GDKfree(ret); if(inputWKB) GDKfree(inputWKB); - return ret; + return msg; } //read the number of linestrings in the input ret = wkbNumGeometries(&itemsNum, &inputWKB); if(ret != MAL_SUCCEED) { + str msg = createException(MAL, "geom.MLineStringToPolygon: ", "%s", ret); + *geomWKB = wkb_nil; - return ret; + GDKfree(ret); + + return msg; } linestringsWKB = (wkb**)GDKmalloc(itemsNum*sizeof(wkb*)); @@ -2189,7 +2200,10 @@ str wkbMLineStringToPolygon(wkb** geomWK ret = wkbGeometryN(&linestringsWKB[i-1], &inputWKB, &i); if(ret != MAL_SUCCEED || !linestringsWKB[i-1]) { - *geomWKB = wkb_nil; + str msg = createException(MAL, "geom.MLineStringToPolygon: ", "%s", ret); + + *geomWKB = wkb_nil; + GDKfree(ret); GDKfree(inputWKB); for(;i>0; i--) @@ -2197,33 +2211,40 @@ str wkbMLineStringToPolygon(wkb** geomWK GDKfree(linestringsWKB[i-1]); GDKfree(linestringsWKB); - return ret; + return msg; } ret = wkbMakePolygon(&polygonWKB, &linestringsWKB[i-1], &batId, srid); if(ret != MAL_SUCCEED) { - *geomWKB = wkb_nil; - + str msg = createException(MAL, "geom.MLineStringToPolygon: ", "%s", ret); + + *geomWKB = wkb_nil; + GDKfree(ret); + GDKfree(inputWKB); for(;i>0; i--) if(linestringsWKB[i-1]) GDKfree(linestringsWKB[i-1]); GDKfree(linestringsWKB); - throw(MAL, "geom.MLineStringToPolygon", "All linestring should be closed"); + //throw(MAL, "geom.MLineStringToPolygon", "All linestring should be closed"); + return msg; } ret = wkbArea(&linestringsArea[i-1], &polygonWKB); if(ret != MAL_SUCCEED) { - *geomWKB = wkb_nil; - + str msg = createException(MAL, "geom.MLineStringToPolygon: ", "%s", ret); + + *geomWKB = wkb_nil; + GDKfree(ret); + GDKfree(inputWKB); for(;i>0; i--) if(linestringsWKB[i-1]) GDKfree(linestringsWKB[i-1]); GDKfree(linestringsWKB); - return ret; + return msg; } GDKfree(polygonWKB); @@ -3154,7 +3175,7 @@ str wkbInteriorRingN(wkb **interiorRingW const GEOSGeometry* interiorRingGeometry; int rN = -1; - //initialise to NULL + //iniitialise to NULL *interiorRingWKB = NULL; geosGeometry = wkb2geos(*geom); diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal --- a/geom/monetdb5/geom.mal +++ b/geom/monetdb5/geom.mal @@ -112,23 +112,23 @@ function LineFromText{unsafe}(wkt:str, s return x; end LineFromText; function PolygonFromText{unsafe}(wkt:str, srid:int) :wkb; - x := wkb.FromText(wkt,srid,3); + x := wkb.FromText(wkt,srid,4); return x; end PolygonFromText; function MPointFromText{unsafe}(wkt:str, srid:int) :wkb; - x := wkb.FromText(wkt,srid,4); + x := wkb.FromText(wkt,srid,5); return x; end MPointFromText; function MLineFromText{unsafe}(wkt:str, srid:int) :wkb; - x := wkb.FromText(wkt,srid,5); + x := wkb.FromText(wkt,srid,6); return x; end MLineFromText; function MPolyFromText{unsafe}(wkt:str, srid:int) :wkb; - x := wkb.FromText(wkt,srid,6); + x := wkb.FromText(wkt,srid,7); return x; end MPolyFromText; function GeomCollFromText{unsafe}(wkt:str, srid:int) :wkb; - x := wkb.FromText(wkt,srid,7); + x := wkb.FromText(wkt,srid,8); return x; end GeomCollFromText; @@ -145,23 +145,23 @@ function LineFromText{unsafe}(wkt:str) : return x; end LineFromText; function PolygonFromText{unsafe}(wkt:str) :wkb; - x := wkb.FromText(wkt,0,3); + x := wkb.FromText(wkt,0,4); return x; end PolygonFromText; function MPointFromText{unsafe}(wkt:str) :wkb; - x := wkb.FromText(wkt,0,4); + x := wkb.FromText(wkt,0,5); return x; end MPointFromText; function MLineFromText{unsafe}(wkt:str) :wkb; - x := wkb.FromText(wkt,0,5); + x := wkb.FromText(wkt,0,6); return x; end MLineFromText; function MPolyFromText{unsafe}(wkt:str) :wkb; - x := wkb.FromText(wkt,0,6); + x := wkb.FromText(wkt,0,7); return x; end MPolyFromText; function GeomCollFromText{unsafe}(wkt:str) :wkb; - x := wkb.FromText(wkt,0,7); + x := wkb.FromText(wkt,0,8); return x; end GeomCollFromText; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list