Changeset: 398a24a90f65 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=398a24a90f65 Added Files: geom/monetdb5/geom_upgrade.c Modified Files: gdk/gdk_logger.c gdk/gdk_logger.h geom/monetdb5/Makefile.ag geom/monetdb5/geom.c geom/monetdb5/geom.h sql/backends/monet5/sql_upgrades.c sql/storage/bat/bat_logger.c Branch: geo Log Message:
Moved all upgrade code to the geom module diffs (truncated from 9311 to 300 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -127,6 +127,9 @@ log_find(BAT *b, BAT *d, int val) return BUN_NONE; } +static geomcatalogfix_fptr geomcatalogfix = NULL; +static geomsqlfix_fptr geomsqlfix = NULL; + static void logbat_destroy(BAT *b) { @@ -2807,3 +2810,28 @@ logger_find_bat(logger *lg, const char * } return 0; } + +void +geomcatalogfix_set(geomcatalogfix_fptr f) +{ + geomcatalogfix = f; +} + +geomcatalogfix_fptr +geomcatalogfix_get(void) +{ + return geomcatalogfix; +} + +void +geomsqlfix_set(geomsqlfix_fptr f) +{ + geomsqlfix = f; +} + +geomsqlfix_fptr +geomsqlfix_get(void) +{ + return geomsqlfix; +} + diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h --- a/gdk/gdk_logger.h +++ b/gdk/gdk_logger.h @@ -139,4 +139,12 @@ gdk_export log_bid logger_add_bat(logger gdk_export void logger_del_bat(logger *lg, log_bid bid); gdk_export log_bid logger_find_bat(logger *lg, const char *name); +typedef int (*geomcatalogfix_fptr)(void*,int,int); +gdk_export void geomcatalogfix_set(geomcatalogfix_fptr); +gdk_export geomcatalogfix_fptr geomcatalogfix_get(void); + +typedef str (*geomsqlfix_fptr)(void); +gdk_export void geomsqlfix_set(geomsqlfix_fptr); +gdk_export geomsqlfix_fptr geomsqlfix_get(void); + #endif /*_LOGGER_H_*/ diff --git a/geom/monetdb5/Makefile.ag b/geom/monetdb5/Makefile.ag --- a/geom/monetdb5/Makefile.ag +++ b/geom/monetdb5/Makefile.ag @@ -10,12 +10,16 @@ INCLUDES = ../lib \ ../../common/stream \ ../../common/options \ ../../monetdb5/mal \ + ../../sql/include \ + ../../sql/common \ + ../../sql/storage \ + ../../sql/storage/bat \ $(GEOS_INCS) $(PROJ_INCS) lib__geom = { MODULE DIR = libdir/monetdb5 - SOURCES = geom.h geom.c geomBulk.c + SOURCES = geom.h geom.c geomBulk.c geom_upgrade.c LIBS = ../lib/libgeom \ ../../gdk/libbat \ ../../common/stream/libstream \ diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -1852,6 +1852,9 @@ str geom_prelude(void *ret) { (void) ret; libgeom_init(); TYPE_mbr = malAtomSize(sizeof(mbr), sizeof(oid), "mbr"); + geomcatalogfix_set(geom_catalog_upgrade); + geomsqlfix_set(geom_sql_upgrade); + return MAL_SUCCEED; } @@ -5679,3 +5682,4 @@ wkbContains_point(bit *out, wkb **a, dbl *out = TRUE; return MAL_SUCCEED; } + diff --git a/geom/monetdb5/geom.h b/geom/monetdb5/geom.h --- a/geom/monetdb5/geom.h +++ b/geom/monetdb5/geom.h @@ -25,6 +25,8 @@ #include <math.h> #include <time.h> +#include <gdk_logger.h> + #ifdef WIN32 #ifndef LIBGEOM #define geom_export extern __declspec(dllimport) @@ -289,3 +291,6 @@ geom_export str wkbMBR_bat(bat* outBAT_i geom_export str wkbCoordinateFromWKB_bat(bat *outBAT_id, bat *inBAT_id, int* coordinateIdx); geom_export str wkbCoordinateFromMBR_bat(bat *outBAT_id, bat *inBAT_id, int* coordinateIdx); + +geom_export int geom_catalog_upgrade(void*,int,int); +geom_export str geom_sql_upgrade(void); diff --git a/geom/monetdb5/geom_upgrade.c b/geom/monetdb5/geom_upgrade.c new file mode 100644 --- /dev/null +++ b/geom/monetdb5/geom_upgrade.c @@ -0,0 +1,4574 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V. + */ + +/* + * @a Kostis Kyzirakos, Foteini Alvanaki + */ + + +#include <geom.h> + +typedef struct list_element { + BAT *ob; + BAT *nb; + char *n; +} list_element; + +typedef struct ulist { + size_t capacity; + size_t count; + list_element *elements; +} ulist; + +static ulist* +list_init(size_t capacity) +{ + ulist *l; + if ((l = GDKmalloc(sizeof(ulist))) == NULL) + return NULL; + l->capacity = capacity; + l->count = 0; + if ((l->elements = GDKmalloc(capacity*sizeof(list_element))) == NULL) { + GDKfree(l); + return NULL; + } + return l; +} + +static char* +list_delete(ulist* ul) +{ + size_t i; + for (i = 0; i < ul->count; i++) + GDKfree(ul->elements[i].n); + GDKfree(ul->elements); + GDKfree(ul); + return true; +} + +static char* +list_extend(ulist **ul) +{ + ulist* nl; + if ((nl = list_init((*ul)->capacity*2)) == NULL ) + return NULL; + memcpy(nl->elements, (*ul)->elements, sizeof(list_element)*(*ul)->count); + nl->count = (*ul)->count; + GDKfree((*ul)->elements); + GDKfree(*ul); + *ul = nl; + return true; +} + +static char* +list_add(ulist **ul, BAT *ob, BAT *nb, char *n) +{ + char *nn; + if ((nn = GDKmalloc(sizeof(char)*strlen(n))) == NULL) + return NULL; + strcpy(nn, n); + if ((*ul)->count == (*ul)->capacity) + if (!list_extend(ul)) + return NULL; + (*ul)->elements[(*ul)->count].ob = ob; + (*ul)->elements[(*ul)->count].nb = nb; + (*ul)->elements[(*ul)->count].n = nn; + (*ul)->count++; + return true; +} + +static char * +mkLower(char *s) +{ + char *r = s; + + while (*s) { + *s = (char) tolower(*s); + s++; + } + return r; +} + +static char * +toLower(const char *s) +{ + char *r = GDKstrdup((char*)s); + + return r ? mkLower(r) : NULL; +} + +static char * +N( char *buf, char *pre, char *schema, char *post) +{ + if (pre) + snprintf(buf, 64, "%s_%s_%s", pre, schema, post); + else + snprintf(buf, 64, "%s_%s", schema, post); + return buf; +} + +int +geom_catalog_upgrade(void *lg, int EC_GEOM, int EC_EXTERNAL) +{ + /* Do the updates needed for the new geom module */ + BAT *ct, *cnt, *cd, *cnd, *cs, *cns, *cn, *ctid, *ti, *tn, *ts, *si, *sn, *g; + BATiter cti, cdi, csi, cni, ctidi, tsi, tni, sni, gi; + char *s = "sys", n[64]; + BUN p,q; + char *nt[] = {"types_id", "types_systemname", "types_sqlname", "types_digits", "types_scale", "types_radix", "types_eclass", "types_schema_id"}; + unsigned char ntt[] = {TYPE_int, TYPE_str, TYPE_str, TYPE_int, TYPE_int, TYPE_int, TYPE_int, TYPE_int}; + char *nf[] = {"functions_id", "functions_name", "functions_func", "functions_mod", "functions_language", "functions_type", "functions_side_effect", "functions_varres", "functions_vararg", "functions_schema_id"}; + unsigned char nft[] = {TYPE_int, TYPE_str, TYPE_str, TYPE_str, TYPE_int, TYPE_int, TYPE_bit, TYPE_bit, TYPE_bit, TYPE_int}; + BAT *tt[8], *ttn[8], *ff[10], *ffn[10]; + BATiter tti[8], ffi[10]; + int val, maxid, i; + size_t ii; + bit bval; + ulist *ul = list_init(32); + + /* Update the catalog to use the new geometry types */ + ct = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_columns_type"))); + cti = bat_iterator(ct); + cd = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_columns_type_digits"))); + cdi = bat_iterator(cd); + cs = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_columns_type_scale"))); + csi = bat_iterator(cs); + cn = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_columns_name"))); + cni = bat_iterator(cn); + ctid = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_columns_table_id"))); + ctidi = bat_iterator(ctid); + ti = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_tables_id"))); + tn = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_tables_name"))); + tni = bat_iterator(tn); + ts = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "_tables_schema_id"))); + tsi = bat_iterator(ts); + si = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "schemas_id"))); + sn = BATdescriptor((bat) logger_find_bat(lg, N(n, NULL, s, "schemas_name"))); + sni = bat_iterator(sn); + + cnt = BATnew(TYPE_void, TYPE_str, BATcount(ct), PERSISTENT); + cnd = BATnew(TYPE_void, TYPE_int, BATcount(cd), PERSISTENT); + cns = BATnew(TYPE_void, TYPE_int, BATcount(cs), PERSISTENT); + + if (!cnt || !cnd || !cns || !ct || !cd || !cs || + !cn || !ctid || !ti || !tn || !ts || !si || !sn) + return 0; + BATseqbase(cnt, ct->hseqbase); + BATseqbase(cnd, cd->hseqbase); + BATseqbase(cns, cs->hseqbase); + + for(p=BUNfirst(ct), q=BUNlast(ct); p<q; p++) { + bool isGeom = false; + char *type = BUNtail(cti, p); + int digits = *(int*)BUNtail(cdi, p); + int scale = *(int*)BUNtail(csi, p); + char* colname = BUNtail(cni, p); + + if (strcmp(toLower(type), "point") == 0) { + type = "geometry"; + isGeom = true; + digits = wkbPoint; + scale = 0; // in the past we did not save the srid + } else if (strcmp(toLower(type), "linestring") == 0) { + type = "geometry"; + isGeom = true; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list