[prev in list] [next in list] [prev in thread] [next in thread] 

List:       monetdb-checkins
Subject:    MonetDB: geo - all bats that need to be modified during an upgra...
From:       Kostis Kyzirakos <commits+kostis=cwi.nl () monetdb ! org>
Date:       2016-01-29 15:31:37
Message-ID: hg.5ee0527e9157.1454081497.6315528441665844383 () monetdb2 ! cwi-incubator ! nl
[Download RAW message or body]

Changeset: 5ee0527e9157 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5ee0527e9157
Modified Files:
	sql/storage/bat/bat_logger.c
Branch: geo
Log Message:

all bats that need to be modified during an upgrade will be commited
by the logger iff all of them have been created sucessfully


diffs (151 lines):

diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -39,6 +39,75 @@ bl_preversion( int oldversion, int newve
 	return -1;
 }
 
+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 *
 N( char *buf, char *pre, char *schema, char *post)
 {
@@ -167,7 +236,9 @@ bl_postversion( void *lg)
 		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 = temp_descriptor(logger_find_bat(lg, N(n, NULL, s, "_columns_type")));
@@ -320,23 +391,14 @@ bl_postversion( void *lg)
 					wn->srid = 0;// we did not save the srid in the past
 					BUNappend(gn, wn, TRUE);
 				}
-				BATsetaccess(gn, BAT_READ);
-				logger_add_bat(lg, gn, N(n, sn, tblname, colname));
-				bat_destroy(g);
+				list_add(&ul, g, gn, N(n, sn, tblname, colname));
 			}
 		}
 
-		BATsetaccess(cnt, BAT_READ);
-		BATsetaccess(cnd, BAT_READ);
-		BATsetaccess(cns, BAT_READ);
+		list_add(&ul, ct, cnt, N(n, NULL, s, "_columns_type"));
+		list_add(&ul, cd, cnd, N(n, NULL, s, "_columns_type_digits"));
+		list_add(&ul, cs, cns, N(n, NULL, s, "_columns_type_scale"));
 
-		logger_add_bat(lg, cnt, N(n, NULL, s, "_columns_type"));
-		logger_add_bat(lg, cnd, N(n, NULL, s, "_columns_type_digits"));
-		logger_add_bat(lg, cns, N(n, NULL, s, "_columns_type_scale"));
-
-		bat_destroy(ct);
-		bat_destroy(cd);
-		bat_destroy(cs);
 		bat_destroy(cn);
 		bat_destroy(ctid);
 		bat_destroy(ti);
@@ -390,11 +452,8 @@ bl_postversion( void *lg)
 		val = EC_EXTERNAL; BUNappend(ttn[6], &val, TRUE);
 		val = 0; BUNappend(ttn[7], &val, TRUE); // the new types use schema_id=0
 
-		for (i = 0; i < 8; i++) {
-			BATsetaccess(ttn[i], BAT_READ);
-			logger_add_bat(lg, ttn[i], N(n, NULL, s, nt[i]));
-			bat_destroy(tt[i]);
-		}
+		for (i = 0; i < 8; i++) 
+			list_add(&ul, tt[i], ttn[i], N(n, NULL, s, nt[i]));
 
 		/* Add the new functions */
 		for (i = 0; i < 10; i++) {
@@ -457,11 +516,15 @@ bl_postversion( void *lg)
 		GEOM_UPGRADE_STORE_FUNC(ffn, ++maxid, "right_shift", "geom", "mbrRight");
 		GEOM_UPGRADE_STORE_FUNC(ffn, ++maxid, "right_shift", "geom", "mbrRight");
 #undef GEOM_UPGRADE_STORE_FUNC
-		for (i = 0; i < 10; i++) {
-			BATsetaccess(ffn[i], BAT_READ);
-			logger_add_bat(lg, ffn[i], N(n, NULL, s, nf[i]));
-			bat_destroy(ff[i]);
+		for (i = 0; i < 10; i++) 
+			list_add(&ul, ff[i], ffn[i], N(n, NULL, s, nf[i]));
+		
+		for (ii = 0; ii < ul->count; ii++) {
+			BATsetaccess(ul->elements[ii].nb, BAT_READ);
+			logger_add_bat(lg, ul->elements[ii].nb, ul->elements[ii].n);
+			bat_destroy(ul->elements[ii].ob);
 		}
+		list_delete(ul);
 	}
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic