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