Changeset: 7728b20d36fe for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7728b20d36fe
Modified Files:
geom/lib/libgeom.h
geom/monetdb5/geom.c
Branch: geo
Log Message:
wkba datatyoe finished + wkbInteriorRings implemented
diffs (179 lines):
diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -126,7 +126,7 @@ typedef struct wkb {
typedef struct wkba {
int itemsNum; //the number of wkbs
- wkb** data; //the wkbs
+ wkb* data[]; //the wkbs
} wkba;
typedef struct {
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -799,7 +799,7 @@ static var_t wkba_size(int items) {
if (items == ~ 0)
items = 0;
- size = sizeof(wkba)+items*sizeof(wkba*);
+ size = sizeof(wkba)+items*sizeof(wkb*);
assert(size <= VAR_MAX);
return size;
@@ -2076,8 +2076,9 @@ str wkbInteriorRings(wkba** geomArray, w
int interiorRingsNum = 0, i=0;
GEOSGeom geosGeometry;
str ret = MAL_SUCCEED;
- char* data= NULL;
- int totalDataSize =0;
+// char* data= NULL;
+// int totalDataSize =0;
+fprintf(stderr, "In wkbInteriorRings\n");
if (wkb_isnil(*geomWKB)) {
throw(MAL, "geom.InteriorRings", "Null input geometry");
@@ -2102,10 +2103,13 @@ str wkbInteriorRings(wkba** geomArray, w
throw(MAL, "geom.InteriorRings", "Error in wkbNumRings");
}
+ *geomArray = (wkba*)GDKmalloc(wkba_size(interiorRingsNum));
+ (*geomArray)->itemsNum = interiorRingsNum;
+
for (i = 0; i < interiorRingsNum; i++) {
const GEOSGeometry* interiorRingGeometry;
wkb* interiorRingWKB;
- char* dataCopy = NULL;
+// char* dataCopy = NULL;
// get the interior ring of the geometry
interiorRingGeometry = GEOSGetInteriorRingN(geosGeometry, i);
@@ -2118,25 +2122,27 @@ str wkbInteriorRings(wkba** geomArray, w
if(!interiorRingWKB) {
throw(MAL, "geom.InteriorRings", "Error in wkb2geos");
}
-
- if(data)
- dataCopy = data;
- data = GDKmalloc(totalDataSize+interiorRingWKB->len+8);
- if(dataCopy) {
- memcpy(data, dataCopy, totalDataSize);
- GDKfree(dataCopy);
- }
-
- memcpy(data+totalDataSize, &interiorRingWKB->len, 4);
- memcpy(data+totalDataSize+4, &interiorRingWKB->srid, 4);
- memcpy(data+totalDataSize+8, interiorRingWKB->data,
interiorRingWKB->len);
- totalDataSize += interiorRingWKB->len+8;
- }
-
- *geomArray = GDKmalloc(wkba_size(totalDataSize));
- (*geomArray)->itemsNum = interiorRingsNum;
- memcpy(&(*geomArray)->data, data, totalDataSize);
- GDKfree(data);
+
+ (*geomArray)->data[i] = interiorRingWKB;
+
+// if(data)
+// dataCopy = data;
+// data = GDKmalloc(totalDataSize+interiorRingWKB->len+8);
+// if(dataCopy) {
+// memcpy(data, dataCopy, totalDataSize);
+// GDKfree(dataCopy);
+// }
+//
+// memcpy(data+totalDataSize, &interiorRingWKB->len, 4);
+// memcpy(data+totalDataSize+4, &interiorRingWKB->srid, 4);
+// memcpy(data+totalDataSize+8, interiorRingWKB->data,
interiorRingWKB->len);
+// totalDataSize += interiorRingWKB->len+8;
+ }
+
+// *geomArray = GDKmalloc(wkba_size(totalDataSize));
+// (*geomArray)->itemsNum = interiorRingsNum;
+// memcpy(&(*geomArray)->data, data, totalDataSize);
+// GDKfree(data);
return MAL_SUCCEED;
}
@@ -4194,18 +4200,23 @@ int mbrWRITE(mbr *c, stream *s, size_t c
/* return length of resulting string. */
size_t wkbaTOSTR(char **toStr, int* len, wkba *fromArray) {
int items = fromArray->itemsNum, i;
- size_t dataSize=sizeof(int), skipBytes=0;
+ int itemsNumDigits = ceil(log10(items));
+ size_t dataSize;//, skipBytes=0;
char** partialStrs;
char* nilStr = "nil";
-
+ char* toStrPtr = NULL,
*itemsNumStr=GDKmalloc((itemsNumDigits+1)*sizeof(char));
+
fprintf(stderr, "wkbaTOSTR\n");
-
+ sprintf(itemsNumStr, "%d", items);
+ dataSize = strlen(itemsNumStr);
+
+
//reserve space for an array with pointers to the partial strings, i.e.
for each wkbTOSTR
- partialStrs = (char**)malloc(sizeof(char**));
- *partialStrs = (char*) malloc(items*sizeof(char*));
+ partialStrs = (char**)GDKmalloc(sizeof(char**));
+ *partialStrs = (char*) GDKmalloc(items*sizeof(char*));
//create the string version of each wkb
for(i=0; i<items; i++) {
- dataSize += wkbTOSTR(&partialStrs[i], len, fromArray->data[i]);
+ dataSize += wkbTOSTR(&partialStrs[i], len,
fromArray->data[i])-2; //remove quotes
if(strcmp(partialStrs[i], nilStr) == 0) {
*len = 6;
@@ -4215,19 +4226,41 @@ fprintf(stderr, "wkbaTOSTR\n");
}
}
+ //add [] around itemsNum
+ dataSize+=2;
+ //add ", " before each item
+ dataSize += 2*sizeof(char)*items;
+
//copy all partial strings to a single one
- *toStr = GDKmalloc(dataSize+1);
- memcpy(*toStr, &items, sizeof(int));
+ *toStr = GDKmalloc(dataSize+3); //plus quotes+termination character
+ toStrPtr=*toStr;
+ *(toStrPtr++) = '\"';
+ *(toStrPtr++) = '[';
+ strcpy(toStrPtr, itemsNumStr);
+ toStrPtr+=strlen(itemsNumStr);
+ *(toStrPtr++) = ']';
for(i=0; i<items; i++) {
- strcpy(*toStr+skipBytes, partialStrs[i]);
- skipBytes+=strlen(partialStrs[i])-1;
+ if(i==0)
+ *(toStrPtr++) = ':';
+ else
+ *(toStrPtr++) = ',';
+ *(toStrPtr++) = ' ';
+
+ //strcpy(toStrPtr, partialStrs[i]);
+ memcpy(toStrPtr, &partialStrs[i][1], strlen(partialStrs[i])-2);
+ toStrPtr+=strlen(partialStrs[i])-2;
GDKfree(partialStrs[i]);
- }
-
+
+ }
+
+ *(toStrPtr++) = '\"';
+ *toStrPtr='\0';
+
GDKfree(partialStrs);
-
- *len = dataSize+1;
- return dataSize;
+ GDKfree(itemsNumStr);
+
+ *len = strlen(*toStr)+1;
+ return (toStrPtr-*toStr);
}
/* return number of parsed characters. */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list