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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list