Update of /cvsroot/monetdb/MonetDB5/src/modules/kernel
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv7699

Modified Files:
        bat5.mx 
Log Message:
Properly handle return of different descriptors.


Index: bat5.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/modules/kernel/bat5.mx,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- bat5.mx     25 May 2007 09:07:30 -0000      1.16
+++ bat5.mx     26 May 2007 10:34:41 -0000      1.17
@@ -1916,7 +1916,7 @@
 str
 BKCreplace_bat(int *r, int *bid, int *sid)
 {
-       BAT *b, *s;
+       BAT *b, *bn, *s;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
@@ -1926,20 +1926,21 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.replace", "Cannot access descriptor");
        }
-       if (BATreplace(b, s, 0) != NULL) {
-               BBPreleaseref(b->batCacheid);
-               BBPreleaseref(s->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
+       bn=BATreplace(b, s, 0);
        BBPreleaseref(s->batCacheid);
-       throw(MAL, "bat.replace_bat", "GDKerror");
+       if(bn==NULL )
+               BBPreleaseref(b->batCacheid);
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.replace", "GDKerror, different BAT returned");
+       return MAL_SUCCEED;
 }
 
 str
 BKCreplace_bun_force(int *r, int *bid, ptr h, ptr t, bit *force)
 {
-       BAT *b;
+       BAT *b, *bn;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
@@ -1947,18 +1948,20 @@
        }
        @:derefStr(b,h,h)@
        @:derefStr(b,t,t)@
-       if (BUNreplace(b, h, t, *force) == NULL) {
+       bn= BUNreplace(b, h, t, *force);
+       if(bn==NULL )
                BBPreleaseref(b->batCacheid);
-               throw(MAL, "bat.replace", "BUNreplaceFailed");
-       }
-       BBPreleaseref(b->batCacheid);
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.replace", "GDKerror, different BAT returned");
        return MAL_SUCCEED;
 }
 
 str
 BKCreplace_bat_force(int *r, int *bid, int *sid, bit *force)
 {
-       BAT *b, *s;
+       BAT *b, *bn, *s;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
@@ -1968,20 +1971,21 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.replace", "Cannot access descriptor");
        }
-       if (BATreplace(b, s, *force) != NULL) {
-               BBPreleaseref(b->batCacheid);
-               BBPreleaseref(s->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
+       bn= BATreplace(b, s, *force);
        BBPreleaseref(s->batCacheid);
-       throw(MAL, "bat.replace_bat", "GDKerror");
+       if(bn==NULL )
+               BBPreleaseref(b->batCacheid);
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.replace_bat", "GDKerror, different BAT 
returned");
+       return MAL_SUCCEED;
 }
 
 char *
 BKCdelete_bun(int *r, int *bid, ptr h, ptr t)
 {
-       BAT *b;
+       BAT *b, *bn;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
@@ -1989,53 +1993,59 @@
        }
        @:derefStr(b,h,h)@
        @:derefStr(b,t,t)@
-       if (BUNdel(b, h, t,FALSE) != NULL) {
+       bn= BUNdel(b, h, t,FALSE);
+       if(bn==NULL )
                BBPreleaseref(b->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
-       throw(MAL, "bat.delete_buns", "GDKerror");
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.delete_bun", "GDKerror, different BAT 
returned");
+       return MAL_SUCCEED;
 }
 
 char *
 BKCdelete(int *r, int *bid, ptr h)
 {
-       BAT *b;
+       BAT *b, *bn;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "bat.delete", "Cannot access descriptor");
        }
        @:derefStr(b,h,h)@
-       if (BUNdelHead(b, h,FALSE) != NULL) {
+       bn= BUNdelHead(b, h,FALSE);
+       if(bn==NULL )
                BBPreleaseref(b->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
-       throw(MAL, "bat.delete", "GDKerror");
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.delete", "GDKerror, different BAT returned");
+       return MAL_SUCCEED;
 }
 
 str
 BKCdelete_all(int *r, int *bid)
 {
-       BAT *b;
+       BAT *b, *bn;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "bat.delete", "Cannot access descriptor");
        }
-       if (BATclear(b) != NULL) {
+       bn=BATclear(b);
+       if(bn==NULL )
                BBPreleaseref(b->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
-       throw(MAL, "bat.delete", "GDKerror");
+       else
+               BBPreleaseref(bn->batCacheid);
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.delete_all", "GDKerror, different BAT 
returned");
+       return MAL_SUCCEED;
 }
 
 str
 BKCdelete_bat_bun(int *r, int *bid, int *sid)
 {
-       BAT *b, *s;
+       BAT *b, *bn, *s;
 
        (void) r;
        if ((b = BATdescriptor(*bid)) == NULL) {
@@ -2045,14 +2055,15 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.delete", "Cannot access descriptor");
        }
-       if (BATdel(b, s,FALSE) != NULL) {
+       bn=BATdel(b, s,FALSE);
+       if(bn==NULL )
                BBPreleaseref(b->batCacheid);
-               BBPreleaseref(s->batCacheid);
-               return MAL_SUCCEED;
-       }
-       BBPreleaseref(b->batCacheid);
+       else
+               BBPreleaseref(bn->batCacheid);
        BBPreleaseref(s->batCacheid);
-       throw(MAL, "bat.delete_bat_buns", "GDKerror");
+       if(bn && bn->batCacheid != b->batCacheid)
+               throw(MAL, "bat.delete_bat_buns", "GDKerror, different BAT 
returned");
+       return MAL_SUCCEED;
 }
 
 str
@@ -2777,6 +2788,7 @@
 BKCsetColumn(int *r, int *bid, str *tname)
 {
        BAT *b;
+       str dummy;
 
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(MAL, "bat.setColumn", "Cannot access descriptor");
@@ -2785,7 +2797,10 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.setColumn", "column name missing");
        }
-       BATroles(b, GDKstrdup(b->hident), *tname);
+       /* watch out, hident is freed first */
+       dummy= GDKstrdup(b->hident);
+       BATroles(b, dummy, *tname);
+       GDKfree(dummy);
        BBPreleaseref(b->batCacheid);
        *r =0;
        return MAL_SUCCEED;


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins

Reply via email to