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

Reply via email to