Update of /cvsroot/monetdb/sql/src/backends/monet5
In directory 
sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22885/src/backends/monet5

Modified Files:
        sql.mx sql_gencode.mx sql_scenario.mx 
Log Message:
transactions are now first only parsed, and then executed via mal.


Index: sql_scenario.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_scenario.mx,v
retrieving revision 1.368
retrieving revision 1.369
diff -u -d -r1.368 -r1.369
--- sql_scenario.mx     1 Dec 2009 14:32:41 -0000       1.368
+++ sql_scenario.mx     13 Dec 2009 20:33:15 -0000      1.369
@@ -758,6 +758,7 @@
 #endif
        language = be->language;        /* 'S' for SQL, 'D' from debugger */
        m = be->mvc;
+       m->errstr[0] = 0;
 @- 
 Continue processing any left-over input from the previous round.
 @c
@@ -1150,7 +1151,7 @@
 
                s = sql_symbol2stmt(m, m->sym);
 
-               if (s==0 || (err = mvc_status(m))) {
+               if (s==0 || (err = mvc_status(m) && m->type != Q_TRANS)) {
                        msg = createException(PARSE, "SQLparser", "%s", 
m->errstr);
                        handle_error(m, c->fdout, pstatus);
                        sqlcleanup(m, err);
@@ -1164,7 +1165,7 @@
                        SQLsetTrace(be, c, TRUE);
                if (m->emod & mod_debug)
                        SQLsetDebugger(c, m, TRUE); 
-               if ((m->emode != m_inplace && m->emode != m_prepare && 
!m->cache && m->emode != m_explain) || s->type == st_none) {
+               if ((m->emode != m_inplace && m->emode != m_prepare && 
!m->cache && m->emode != m_explain) || s->type == st_none || m->type == 
Q_TRANS) {
                        scanner_query_processed(&(m->scanner));
                        backend_callinline(be, c, s );
                        if( m->emode == m_inplace)

Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_gencode.mx,v
retrieving revision 1.345
retrieving revision 1.346
diff -u -d -r1.345 -r1.346
--- sql_gencode.mx      2 Dec 2009 13:05:56 -0000       1.345
+++ sql_gencode.mx      13 Dec 2009 20:33:15 -0000      1.346
@@ -1614,6 +1614,22 @@
                        s->nr = getDestVar(q);
                        break;
                }
+               case st_trans:{
+                       int l,r = -1;
+
+                       l = _dumpstmt(sql, mb, s->op1.stval);
+                       if (s->op2.stval)
+                               r = _dumpstmt(sql, mb, s->op2.stval);
+                       q = newStmt1(mb, sqlRef, "trans");
+                       q = pushInt(mb, q, s->flag);
+                       q = pushArgument(mb, q, l);
+                       if (r > 0) 
+                               q = pushArgument(mb, q, r);
+                       else
+                               q = pushNil(mb, q, TYPE_str);
+                       s->nr = getDestVar(q);
+                       break;
+               }
                case st_alias:
                        s->nr = _dumpstmt(sql, mb, s->op1.stval);
                        break;

Index: sql.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql.mx,v
retrieving revision 1.370
retrieving revision 1.371
diff -u -d -r1.370 -r1.371
--- sql.mx      2 Dec 2009 09:33:03 -0000       1.370
+++ sql.mx      13 Dec 2009 20:33:15 -0000      1.371
@@ -40,15 +40,9 @@
 address SQLinitEnvironment
 comment "Initialize the environment for MAL";
 
-pattern transaction():void
+pattern trans(type:int,chain:int,name:str):void
 address SQLtransaction
-comment "Start a transaction";
-pattern commit():void
-address SQLcommit
-comment "Commit the transaction";
-pattern rollback():void
-address SQLrollback
-comment "Abort the transaction";
+comment "a transaction statement (type can be commit,release,rollback or 
start)";
 
 pattern eval(cmd:str):void 
 address SQLstatement
@@ -967,8 +961,6 @@
 extern BAT *mvc_bind_idxbat(mvc *m, char *sname, char *tname, char *iname, int 
access);
 
 sql5_export str SQLtransaction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
-sql5_export str SQLrollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
 sql5_export str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
@@ -1352,42 +1344,66 @@
 str
 SQLtransaction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       mvc *m = NULL;
-       str msg = getContext(cntxt,mb, &m, NULL);
-
-       (void) cntxt;
-       (void) stk;
-       (void) pci;
-       if (msg)
-               return msg;
-       mvc_trans(m);
-       return MAL_SUCCEED;
-}
-
-str
-SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       mvc *m = NULL;
-       str msg = getContext(cntxt,mb, &m, NULL);
-       int *ret  = (int *) getArgReference(stk, pci, 0);
+       mvc *sql = NULL;
+       str msg = getContext(cntxt, mb, &sql, NULL);
+       int type = *(int*) getArgReference(stk, pci, 1);
+       int chain = *(int*) getArgReference(stk, pci, 2);
+       str name = *(str*) getArgReference(stk, pci, 3);
+       char buf[BUFSIZ];
+       int ret = 0;
 
        if (msg)
                return msg;
-       *ret = 0;
-       mvc_commit(m, 0, NULL); /* keep the changes */
-       return MAL_SUCCEED;
-}
-str
-SQLrollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       mvc *m=NULL;
-       str msg = getContext(cntxt,mb, &m, NULL);
-       int *ret  = (int *) getArgReference(stk, pci, 0);
+       if (name && strcmp(name, str_nil) == 0)
+               name = NULL;
 
-       if (msg)
-               return msg;
-       *ret = 0;
-       mvc_rollback(m, 0, NULL); /* keep the changes */
+       switch (type) {
+       case DDL_RELEASE:
+               if (sql->session->auto_commit == 1) 
+                       throw(SQL, "sql.trans", "RELEASE SAVEPOINT: not allowed 
in auto commit mode");
+               ret = mvc_release(sql, name);
+               if (ret < 0) {
+                       snprintf(buf, BUFSIZ, "RELEASE SAVEPOINT: (%s) failed", 
name);
+                       throw(SQL, "sql.trans", buf);
+               }
+               break;
+       case DDL_COMMIT:
+               if (sql->session->auto_commit == 1) {
+                       if (name)
+                               throw(SQL,"sql.trans", "SAVEPOINT: not allowed 
in auto commit mode");
+                       else
+                               throw(SQL,"sql.trans", "COMMIT: not allowed in 
auto commit mode");
+               }
+               ret = mvc_commit(sql, chain, name);
+               if (ret < 0 && !name) 
+                       throw(SQL, "sql.trans", "COMMIT: failed");
+               if (ret < 0 && name) {
+                       snprintf(buf, BUFSIZ, "SAVEPOINT: (%s) failed", name);
+                       throw(SQL, "sql.trans", buf);
+               }
+               break;
+       case DDL_ROLLBACK:
+               if (sql->session->auto_commit == 1) 
+                       throw(SQL, "sql.trans", "ROLLBACK: not allowed in auto 
commit mode");
+               ret = mvc_rollback(sql, chain, name);
+               if (ret < 0 && name) {
+                       snprintf(buf, BUFSIZ, "ROLLBACK TO SAVEPOINT: (%s) 
failed", name);
+                       throw(SQL, "sql.trans", buf);
+               }
+               break;
+       case DDL_TRANS:
+               if (sql->session->auto_commit == 0) 
+                       throw(SQL, "sql.trans", "START TRANSACTION: cannot 
start a transaction within a transaction");
+               if (sql->session->active)
+                       mvc_rollback(sql, 0, NULL);
+               sql->session->auto_commit = 0;
+               sql->session->ac_on_commit = 1;
+               sql->session->level = chain;
+               (void) mvc_trans(sql);
+               break;
+       default:
+               throw(SQL, "sql.trans", "transaction unknown type");
+       }
        return MAL_SUCCEED;
 }
 


------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to