Changeset: dddadfc3d040 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dddadfc3d040 Modified Files: MonetDB/src/gdk/gdk_logger.mx MonetDB4/src/modules/plain/logger.mx MonetDB5/src/modules/kernel/logger.mx pathfinder/runtime/pathfinder.mx sql/src/storage/bat/bat_logger.mx sql/src/storage/bpm/bpm_logger.mx sql/src/storage/restrict/restrict_logger.mx sql/src/storage/store.mx Branch: Jun2010 Log Message:
make sure we can read the old Feb2010 format and auto-convert (for now we only add the columns (readonly/storage)) TODO rewrite 'ids' and rewrite tables and columns views. diffs (280 lines): diff -r e2337864381b -r dddadfc3d040 MonetDB/src/gdk/gdk_logger.mx --- a/MonetDB/src/gdk/gdk_logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/MonetDB/src/gdk/gdk_logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -94,7 +94,9 @@ struct trans *tr; } trans; -typedef int (*precommit_fptr) (char *qid, char *cid); +typedef int (*precommit_fptr)(char *qid, char *cid); +typedef int (*preversionfix_fptr)(int oldversion, int newversion); +typedef void (*postversionfix_fptr)(void *lg); typedef struct logger { int debug; @@ -105,6 +107,8 @@ char *fn; char *dir; precommit_fptr phandler; + preversionfix_fptr prefuncp; + postversionfix_fptr postfuncp; stream *log; lng end; /* end of pre-allocated blocks for faster f(data)sync */ /* Store log_bids (int) to circumvent trouble with reference counting */ @@ -137,7 +141,7 @@ /* the sequence identifier for frontend objects */ #define OBJ_SID 1 -gdk_export logger *logger_create(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler); +gdk_export logger *logger_create(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp); gdk_export void logger_destroy(logger *lg); gdk_export int logger_exit(logger *lg); gdk_export int logger_restart(logger *lg); @@ -979,13 +983,17 @@ return -1; } if (version != lg->version) { - GDKerror("Incompatible database version %06d, " - "this server supports version %06d\n" - "Please move away %s and its corresponding dbfarm.", - version, lg->version, lg->dir); + if (lg->prefuncp == NULL || + (*lg->prefuncp)(version, lg->version) != 0) { + GDKerror("Incompatible database version %06d, " + "this server supports version %06d\n" + "Please move away %s and its corresponding dbfarm.", + version, lg->version, lg->dir); - return -1; - } + return -1; + } + } else + lg->postfuncp = NULL; /* don't call */ fgetc(fp); /* skip \n */ fgetc(fp); /* skip \n */ return 0; @@ -1058,7 +1066,7 @@ } static logger * -logger_new(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler) +logger_new(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) { int id = LOG_SID; logger *lg = (struct logger *) GDKmalloc(sizeof(struct logger)); @@ -1089,6 +1097,8 @@ lg->fn = GDKstrdup(fn); lg->dir = GDKstrdup(filename); lg->phandler = phandler; + lg->prefuncp = prefuncp; + lg->postfuncp = postfuncp; lg->log = NULL; lg->end = 0; lg->catalog = NULL; @@ -1222,6 +1232,8 @@ logger_readlogs(lg, fp, filename); fclose(fp); fp = NULL; + if (lg->postfuncp) + (*lg->postfuncp)(lg); } return lg; error: @@ -1233,9 +1245,9 @@ } logger * -logger_create(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler) +logger_create(int debug, char *fn, char *logdir, char *dbname, int version, precommit_fptr phandler, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) { - logger *lg = logger_new(debug, fn, logdir, dbname, version, phandler); + logger *lg = logger_new(debug, fn, logdir, dbname, version, phandler, prefuncp, postfuncp); if (!lg) return NULL; diff -r e2337864381b -r dddadfc3d040 MonetDB4/src/modules/plain/logger.mx --- a/MonetDB4/src/modules/plain/logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/MonetDB4/src/modules/plain/logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -136,7 +136,7 @@ int logger_create_wrap( logger *L, int *debug, str fn, str dirname, str dbname, int *version) { - logger *l = logger_create(*debug, fn, dirname, dbname, *version, NULL); + logger *l = logger_create(*debug, fn, dirname, dbname, *version, NULL, NULL, NULL); if (l) { *(logger**)L = l; diff -r e2337864381b -r dddadfc3d040 MonetDB5/src/modules/kernel/logger.mx --- a/MonetDB5/src/modules/kernel/logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/MonetDB5/src/modules/kernel/logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -98,7 +98,7 @@ str logger_create_wrap( logger *L, int *debug, str *fn, str *dirname, str *dbname, int *version) { - logger *l = logger_create(*debug, *fn, *dirname, *dbname, *version, NULL); + logger *l = logger_create(*debug, *fn, *dirname, *dbname, *version, NULL, NULL, NULL); if (l) { *(logger**)L = l; diff -r e2337864381b -r dddadfc3d040 pathfinder/runtime/pathfinder.mx --- a/pathfinder/runtime/pathfinder.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/pathfinder/runtime/pathfinder.mx Sat Jun 05 13:15:25 2010 +0200 @@ -6490,7 +6490,7 @@ { /* TODO: instead of passing NULL, pass the real implementation of * the XRPC PRE_COMMIT handler */ - logger *l = logger_create(*debug, fn, dirname, dbname, *version, NULL); + logger *l = logger_create(*debug, fn, dirname, dbname, *version, NULL, NULL, NULL); if (l) { *(logger**)L = l; diff -r e2337864381b -r dddadfc3d040 sql/src/storage/bat/bat_logger.mx --- a/sql/src/storage/bat/bat_logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/sql/src/storage/bat/bat_logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -31,15 +31,88 @@ @c #include "sql_config.h" #include "bat_logger.h" +#include "bat_utils.h" logger *bat_logger = NULL; +static int catalog_version = 0; + +static int +bl_preversion( int oldversion, int newversion) +{ +#define CATALOG_FEB2010 50000 + + (void)newversion; + if (oldversion == CATALOG_FEB2010) { + catalog_version = oldversion; + return 0; + } + return -1; +} + +static void +bl_postversion( void *lg) +{ + (void)lg; + if (catalog_version == CATALOG_FEB2010) { + BAT *o, *b; + fprintf(stderr, "Upgrading catalog from Feb2010\n"); + + o = temp_descriptor(logger_find_bat(lg, "sys__tables_id")); + /* no sys tables, easy upgrade */ + if (!o) + return ; + b = bat_new( TYPE_void, TYPE_bit, BATcount(o)); + memset(Tloc(b,BUNfirst(b)), 0, sizeof(bit)*BATcount(o)); + BATsetcount(b, BATcount(o)); + logger_add_bat(lg, b, "sys__tables_readonly"); + //log_bat_persists(lg, b, "sys__tables_readonly"); + bat_destroy(o); + bat_destroy(b); + + o = temp_descriptor(logger_find_bat(lg, "sys__columns_id")); + if (!o) + return ; + b = bat_new( TYPE_void, TYPE_int, BATcount(o)); + memset(Tloc(b,BUNfirst(b)), 0, sizeof(int)*BATcount(o)); + BATsetcount(b, BATcount(o)); + logger_add_bat(lg, b, "sys__columns_storage"); + //log_bat_persists(lg, b, "sys__columns_storage"); + bat_destroy(o); + bat_destroy(b); + + o = temp_descriptor(logger_find_bat(lg, "tmp__tables_id")); + if (!o) + return ; + b = bat_new( TYPE_void, TYPE_bit, BATcount(o)); + memset(Tloc(b,BUNfirst(b)), 0, sizeof(bit)*BATcount(o)); + BATsetcount(b, BATcount(o)); + logger_add_bat(lg, b, "tmp__tables_readonly"); + //log_bat_persists(lg, b, "tmp__tables_readonly"); + bat_destroy(o); + bat_destroy(b); + + o = temp_descriptor(logger_find_bat(lg, "tmp__columns_id")); + if (!o) + return ; + b = bat_new( TYPE_void, TYPE_int, BATcount(o)); + memset(Tloc(b,BUNfirst(b)), 0, sizeof(int)*BATcount(o)); + BATsetcount(b, BATcount(o)); + logger_add_bat(lg, b, "tmp__columns_storage"); + //log_bat_persists(lg, b, "tmp__columns_storage"); + bat_destroy(o); + bat_destroy(b); + + /* mark that the rest is fixed on sql level */ + } +} + static int bl_create(char *logdir, char *dbname, int catalog_version) { if (bat_logger) return LOG_ERR; - bat_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL); + bat_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL, bl_preversion, bl_postversion); if (bat_logger) return LOG_OK; return LOG_ERR; diff -r e2337864381b -r dddadfc3d040 sql/src/storage/bpm/bpm_logger.mx --- a/sql/src/storage/bpm/bpm_logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/sql/src/storage/bpm/bpm_logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -37,7 +37,7 @@ { if (bpm_logger) return LOG_ERR; - bpm_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL); + bpm_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL, NULL, NULL); if (bpm_logger) return LOG_OK; return LOG_ERR; diff -r e2337864381b -r dddadfc3d040 sql/src/storage/restrict/restrict_logger.mx --- a/sql/src/storage/restrict/restrict_logger.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/sql/src/storage/restrict/restrict_logger.mx Sat Jun 05 13:15:25 2010 +0200 @@ -41,7 +41,7 @@ { if (restrict_logger) return LOG_ERR; - restrict_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL); + restrict_logger = logger_create(0, "sql", logdir, dbname, catalog_version, NULL, NULL, NULL); if (restrict_logger) return LOG_OK; return LOG_ERR; diff -r e2337864381b -r dddadfc3d040 sql/src/storage/store.mx --- a/sql/src/storage/store.mx Fri Jun 04 00:28:18 2010 +0200 +++ b/sql/src/storage/store.mx Sat Jun 05 13:15:25 2010 +0200 @@ -827,8 +827,17 @@ sid = *(sqlid *)v; _DELETE(v); if (sid < id) { node *n = find_sql_schema_node(tr, NULL, sid); - if (n==NULL) - GDKfatal("SQL schema missing or incompatible, rebuild from archive"); + + if (n==NULL) { + char *name; + + v = table_funcs.column_find_value(tr, find_sql_column(ss, "name"), rid); + name = (char*)v; + n = find_sql_schema_node(tr, name, -1); + _DELETE(v); + if (n == NULL) + GDKfatal("SQL schema missing or incompatible, rebuild from archive"); + } s = n->data; } else { s = ZNEW(sql_schema); @@ -863,7 +872,7 @@ /* second tables (and complex types) */ table_schema = find_sql_column(tables, "schema_id"); table_id = find_sql_column(tables, "id"); - rs = table_funcs.rids_select(tr, table_schema, &s->base.id, &s->base.id, table_id, &id, NULL, NULL); + rs = table_funcs.rids_select(tr, table_schema, &sid, &sid, table_id, &id, NULL, NULL); for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid = table_funcs.rids_next(rs)) cs_add(&s->tables, load_table(tr, s, rid), TR_OLD); table_funcs.rids_destroy(rs); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list