Changeset: 0de233c64b1b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0de233c64b1b
Modified Files:
        geom/lib/libgeom.h
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/40_geom.sql
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/server/sql_parser.y
Branch: geo
Log Message:

creating new type (wkba)


diffs (truncated from 1349 to 300 lines):

diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -124,6 +124,11 @@ typedef struct wkb {
        char data[1];
 } wkb;
 
+typedef struct wkba {
+       int itemsNum; //the number of wkb
+       char wkb[]; //the wkb
+} wkba;
+
 typedef struct {
        unsigned char type;
        mbr bbox;
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -67,8 +67,51 @@ geom_export void geoGetType(char** res, 
 geom_export bat *geom_prelude(void);
 geom_export void geom_epilogue(void);
 
+/* the len argument is needed for correct storage and retrieval */
+geom_export int wkbTOSTR(char **geomWKT, int *len, wkb *geomWKB);
+geom_export int mbrTOSTR(char **dst, int *len, mbr *atom);
+geom_export int wkbaTOSTR(char **toStr, int* len, wkba *fromArray);
+
+geom_export int wkbFROMSTR(char* geomWKT, int *len, wkb** geomWKB, int srid);
+geom_export int mbrFROMSTR(char *src, int *len, mbr **atom);
+geom_export int wkbaFROMSTR(char *fromStr, int* len, wkba **toArray);
+
 geom_export wkb *wkbNULL(void);
 geom_export mbr *mbrNULL(void);
+geom_export wkba *wkbaNULL(void);
+
+geom_export BUN wkbHASH(wkb *w);
+geom_export BUN mbrHASH(mbr *atom);
+geom_export BUN wkbaHASH(wkba *w);
+
+geom_export int wkbCOMP(wkb *l, wkb *r);
+geom_export int mbrCOMP(mbr *l, mbr *r);
+geom_export int wkbaCOMP(wkba *l, wkba *r);
+
+/* read/write to/from log */
+geom_export wkb *wkbREAD(wkb *a, stream *s, size_t cnt);
+geom_export mbr *mbrREAD(mbr *a, stream *s, size_t cnt);
+geom_export wkb *wkbaREAD(wkba *a, stream *s, size_t cnt);
+
+geom_export int wkbWRITE(wkb *a, stream *s, size_t cnt);
+geom_export int mbrWRITE(mbr *c, stream *s, size_t cnt);
+geom_export int wkbaWRITE(wkba *c, stream *s, size_t cnt);
+
+geom_export var_t wkbPUT(Heap *h, var_t *bun, wkb *val);
+geom_export var_t wkbaPUT(Heap *h, var_t *bun, wkba *val);
+
+geom_export void wkbDEL(Heap *h, var_t *index);
+geom_export void wkbaDEL(Heap *h, var_t *index);
+
+geom_export int wkbLENGTH(wkb *p);
+geom_export int wkbaLENGTH(wkba *p);
+
+geom_export void wkbHEAP(Heap *heap, size_t capacity);
+geom_export void wkbaHEAP(Heap *heap, size_t capacity);
+
+//geom_export str mbrFromString(mbr **w, str *src);
+geom_export str wkbIsnil(bit *r, wkb **v);
+
 
 /* functions tha are used when a column is added to an existing table */
 geom_export str mbrFromMBR(mbr **w, mbr **src);
@@ -85,18 +128,6 @@ geom_export wkb* geos2wkb(const GEOSGeom
  * works only for 2D geometries */
 geom_export mbr* mbrFromGeos(const GEOSGeom geosGeometry);
 
-/* the len argument is needed for correct storage and retrieval */
-geom_export int mbrFROMSTR(char *src, int *len, mbr **atom);
-geom_export int mbrTOSTR(char **dst, int *len, mbr *atom);
-geom_export int wkbFROMSTR(char* geomWKT, int *len, wkb** geomWKB, int srid);
-geom_export int wkbTOSTR(char **geomWKT, int *len, wkb *geomWKB);
-
-/* read/write to/from disk */
-geom_export mbr *mbrREAD(mbr *a, stream *s, size_t cnt);
-geom_export int mbrWRITE(mbr *c, stream *s, size_t cnt);
-geom_export wkb *wkbREAD(wkb *a, stream *s, size_t cnt);
-geom_export int wkbWRITE(wkb *a, stream *s, size_t cnt);
-
 
 geom_export str wkbFromText(wkb **geomWKB, str *geomWKT, int* srid, int *tpe);
 
@@ -162,7 +193,7 @@ geom_export str wkbMakePolygon(wkb** out
 geom_export str wkbExteriorRing(wkb**, wkb**);
 geom_export str wkbInteriorRingN(wkb**, wkb**, short*);
 geom_export str wkbNumRings(int*, wkb**, int*);
-geom_export str wkbInteriorRings(int* outBAT_id, wkb** geomWKB);
+geom_export str wkbInteriorRings(wkba**, wkb**);
 geom_export str wkbIsClosed(bit *out, wkb **geom);
 geom_export str wkbIsRing(bit *out, wkb **geom);
 geom_export str wkbIsValid(bit *out, wkb **geom);
@@ -762,23 +793,16 @@ static var_t wkb_size(size_t len) {
        return (var_t) (sizeof(wkb) - 1 + len);
 }
 
-/* NULL: generic nil mbr. */
-/* returns a pointer to a nil-mbr. */
-mbr *mbrNULL(void) {
-       static mbr mbrNIL;
-       mbrNIL.xmin = flt_nil;
-       mbrNIL.ymin = flt_nil;
-       mbrNIL.xmax = flt_nil;
-       mbrNIL.ymax = flt_nil;
-       return (&mbrNIL);
-}
-
-/* returns a pointer to a null wkb */
-wkb *wkbNULL(void) {
-       static wkb nullval;
-
-       nullval.len = ~(int) 0;
-       return (&nullval);
+/* returns the size of variable-sized atom wkba */
+static var_t wkba_size(size_t len) {
+       var_t size;
+ 
+       if (len == ~(size_t) 0)
+               len = 0;        
+       size = sizeof(wkba)+len;
+       assert(size <= VAR_MAX);
+
+       return size;
 }
 
 /* create the WKB out of the GEOSGeometry 
@@ -885,150 +909,8 @@ mbr* mbrFromGeos(const GEOSGeom geosGeom
 }
 
 
-/*str wkbFromString(wkb **w, str *wkt) {
-       int len = 0;
-       char *errbuf;
-       str ex;
-
-       if (wkbFROMSTR(*wkt, 0, &len, w))
-               return MAL_SUCCEED;
-       errbuf = GDKerrbuf;
-       if (errbuf) {
-               if (strncmp(errbuf, "!ERROR: ", 8) == 0)
-                       errbuf += 8;
-       } else {
-               errbuf = "cannot parse string";
-       }
-
-       ex = createException(MAL, "wkb.FromString", "%s", errbuf);
-
-       if (GDKerrbuf)
-               GDKerrbuf[0] = '\0';
-
-       return ex;
-}*/
-
-
-/* FROMSTR: parse string to mbr. */
-/* return number of parsed characters. */
-int mbrFROMSTR(char *src, int *len, mbr **atom) {
-       int nil = 0;
-       int nchars = 0; /* The number of characters parsed; the return value. */
-       GEOSGeom geosMbr = NULL; /* The geometry object that is parsed from the 
src string. */
-       double xmin = 0, ymin = 0, xmax = 0, ymax = 0;
-       char *c;
-
-       if (strcmp(src, str_nil) == 0)
-               nil = 1;
-
-       if (!nil && strstr(src,"BOX") ==  src && (c = strstr(src,"(")) != NULL) 
{
-               /* Parse the mbr */
-               if ((c - src) != 3 && (c - src) != 4) {
-                       GDKerror("ParseException: Expected a string like 'BOX(0 
0,1 1)' or 'BOX (0 0,1 1)'\n");
-                       return 0;
-               }
-
-               if (sscanf(c,"(%lf %lf,%lf %lf)", &xmin, &ymin, &xmax, &ymax) 
!= 4) {
-                       GDKerror("ParseException: Not enough coordinates.\n");
-                       return 0;
-               }
-       } else if (!nil && (geosMbr = GEOSGeomFromWKT(src)) == NULL)
-               return 0;
-
-       if (*len < (int) sizeof(mbr)) {
-               if (*atom)
-                       GDKfree(*atom);
-               *atom = GDKmalloc(*len = sizeof(mbr));
-       }
-       if (nil) {
-               nchars = 3;
-               **atom = *mbrNULL();
-       } else if (geosMbr == NULL) {
-               size_t l;
-               assert(GDK_flt_min <= xmin && xmin <= GDK_flt_max);
-               assert(GDK_flt_min <= xmax && xmax <= GDK_flt_max);
-               assert(GDK_flt_min <= ymin && ymin <= GDK_flt_max);
-               assert(GDK_flt_min <= ymax && ymax <= GDK_flt_max);
-               (*atom)->xmin = (float) xmin;
-               (*atom)->ymin = (float) ymin;
-               (*atom)->xmax = (float) xmax;
-               (*atom)->ymax = (float) ymax;
-               l = strlen(src);
-               assert(l <= GDK_int_max);
-               nchars = (int) l;
-       }
-       if (geosMbr)
-               GEOSGeom_destroy(geosMbr);
-       return nchars;
-}
-
-#define MBR_WKTLEN 256
-
-/* TOSTR: print atom in a string. */
-/* return length of resulting string. */
-int mbrTOSTR(char **dst, int *len, mbr *atom) {
-       static char tempWkt[MBR_WKTLEN];
-       size_t dstStrLen = 3;
-
-       if (!mbr_isnil(atom)) {
-               snprintf(tempWkt, MBR_WKTLEN, "BOX (%f %f, %f %f)",
-                        atom->xmin, atom->ymin, atom->xmax, atom->ymax);
-               dstStrLen = strlen(tempWkt) + 2;
-               assert(dstStrLen < GDK_int_max);
-       }
-
-       if (*len < (int) dstStrLen + 1) {
-               if (*dst)
-                       GDKfree(*dst);
-               *dst = GDKmalloc(*len = (int) dstStrLen + 1);
-       }
-
-       if (dstStrLen > 3)
-               snprintf(*dst, *len, "\"%s\"", tempWkt);
-       else
-               strcpy(*dst, "nil");
-       return (int) dstStrLen;
-}
-
-/* Creates WKB representation (including srid) from WKT representation */
-/* return number of parsed characters. */
-int wkbFROMSTR(char* geomWKT, int* len, wkb **geomWKB, int srid) {
-       GEOSGeom geosGeometry = NULL;   /* The geometry object that is parsed 
from the src string. */
-       GEOSWKTReader *WKT_reader;
-
-       if (strcmp(geomWKT, str_nil) == 0) {
-               *geomWKB = wkb_nil;
-               return 0;
-       }
-
-       WKT_reader = GEOSWKTReader_create();
-       geosGeometry = GEOSWKTReader_read(WKT_reader, geomWKT); 
-       GEOSWKTReader_destroy(WKT_reader);
-
-       if(geosGeometry == NULL){
-               *geomWKB = wkb_nil;
-               return 0;
-       }
-
-       if (GEOSGeomTypeId(geosGeometry) == -1) {
-               GEOSGeom_destroy(geosGeometry);
-               *geomWKB = wkb_nil;
-               return 0;
-       }
-
-       GEOSSetSRID(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 will number of coordinates and SRID and we 
-       * want to get the wkb out of it */
-       *geomWKB = geos2wkb(geosGeometry);
-       GEOSGeom_destroy(geosGeometry);
-
-       *len = (int) wkb_size((*geomWKB)->len);
-
-       return (int)strlen(geomWKT);
-}
+
+
 
 //Returns the wkb in a hex representation */
 static char hexit[] = "0123456789ABCDEF";
@@ -1139,121 +1021,13 @@ str wkbFromBinary(wkb** geomWKB, char **
        return MAL_SUCCEED;
 }
 
-/* Creates the string representation (WKT) of a WKB */
-/* return length of resulting string. */
-int wkbTOSTR(char **geomWKT, int* len, wkb *geomWKB) {
-       char *wkt = NULL;
-       int dstStrLen = 5;                      /* "nil" */
-
-       /* from WKB to GEOSGeometry */
-       GEOSGeom geosGeometry = wkb2geos(geomWKB);
-
-       
-       if (geosGeometry) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to