summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/c/sg/sg.c175
-rw-r--r--src/runtime/c/sg/sg.h10
2 files changed, 118 insertions, 67 deletions
diff --git a/src/runtime/c/sg/sg.c b/src/runtime/c/sg/sg.c
index f736c745f..6dc865853 100644
--- a/src/runtime/c/sg/sg.c
+++ b/src/runtime/c/sg/sg.c
@@ -88,6 +88,45 @@ sg_shutdown()
sqlite3_shutdown();
}
+void
+sg_begin_trans(SgSG* sg, GuExn* err)
+{
+ sqlite3 *db = (sqlite3 *) sg;
+
+ int rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 1);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return;
+ }
+ db->autoCommit = 0;
+}
+
+void
+sg_commit(SgSG* sg, GuExn* err)
+{
+ sqlite3 *db = (sqlite3 *) sg;
+
+ int rc = sqlite3BtreeCommit(db->aDb[0].pBt);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return;
+ }
+ db->autoCommit = 1;
+}
+
+void
+sg_rollback(SgSG* sg, GuExn* err)
+{
+ sqlite3 *db = (sqlite3 *) sg;
+
+ int rc = sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return;
+ }
+ db->autoCommit = 1;
+}
+
static int
store_expr(StoreContext* ctxt, PgfExpr expr, SgId* pKey)
{
@@ -280,10 +319,12 @@ sg_insert_expr(SgSG *sg, PgfExpr expr, GuExn* err)
}
int rc;
- rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 1);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return 0;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 1);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return 0;
+ }
}
BtCursor crsExprs;
@@ -359,10 +400,12 @@ sg_insert_expr(SgSG *sg, PgfExpr expr, GuExn* err)
goto rollback;
}
- rc = sqlite3BtreeCommit(db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return 0;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeCommit(db->aDb[0].pBt);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return 0;
+ }
}
return key;
@@ -379,7 +422,9 @@ close1:
sqlite3BtreeCloseCursor(&crsExprs);
rollback:
- sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ if (db->autoCommit) {
+ sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ }
return 0;
}
@@ -452,10 +497,12 @@ sg_select_expr(SgSG *sg, SgId key, GuPool* out_pool, GuExn* err)
}
int rc;
- rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 0);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return gu_null_variant;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 0);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return gu_null_variant;
+ }
}
BtCursor crsExprs;
@@ -479,10 +526,12 @@ sg_select_expr(SgSG *sg, SgId key, GuPool* out_pool, GuExn* err)
goto rollback;
}
- rc = sqlite3BtreeCommit(db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- goto rollback;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeCommit(db->aDb[0].pBt);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ goto rollback;
+ }
}
return expr;
@@ -491,7 +540,9 @@ close:
sqlite3BtreeCloseCursor(&crsExprs);
rollback:
- sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ if (db->autoCommit) {
+ sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ }
return gu_null_variant;
}
@@ -525,10 +576,12 @@ open_triples(sqlite3 *db, int wrFlag, BtCursor cursor[], int *n_cursors, GuExn*
}
int rc;
- rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, wrFlag);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, wrFlag);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return;
+ }
}
memset(cursor, 0, sizeof(BtCursor)*4);
@@ -553,7 +606,7 @@ open_triples(sqlite3 *db, int wrFlag, BtCursor cursor[], int *n_cursors, GuExn*
}
static void
-close_triples(sqlite3 *db, BtCursor cursor[], int *n_cursors)
+close_triples(sqlite3 *db, BtCursor cursor[], int *n_cursors, int rc, GuExn* err)
{
while (*n_cursors > 0) {
(*n_cursors)--;
@@ -562,6 +615,18 @@ close_triples(sqlite3 *db, BtCursor cursor[], int *n_cursors)
}
sqlite3BtreeCloseCursor(&cursor[*n_cursors]);
}
+
+ if (db->autoCommit) {
+ if (rc == SQLITE_OK || rc == SQLITE_DONE) {
+ rc = sqlite3BtreeCommit(db->aDb[0].pBt);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return;
+ }
+ } else {
+ sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ }
+ }
}
SgId
@@ -600,7 +665,7 @@ sg_insert_triple(SgSG *sg, SgTriple triple, GuExn* err)
goto close;
}
- SgId key;
+ SgId key = 0;
if (res == 0) {
rc = sqlite3VdbeIdxRowid(db, &cursor[0], &key);
@@ -709,20 +774,9 @@ sg_insert_triple(SgSG *sg, SgTriple triple, GuExn* err)
}
}
- close_triples(db, cursor, &n_cursors);
-
- rc = sqlite3BtreeCommit(db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- goto close;
- }
-
- return key;
-
close:
- close_triples(db, cursor, &n_cursors);
- sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
- return 0;
+ close_triples(db, cursor, &n_cursors, rc, err);
+ return key;
}
static int
@@ -770,10 +824,12 @@ sg_select_triple(SgSG *sg, SgId key, SgTriple triple, GuExn* err)
}
int rc;
- rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 0);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return false;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeBeginTrans(db->aDb[0].pBt, 0);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return false;
+ }
}
BtCursor crsTriples;
@@ -805,10 +861,12 @@ sg_select_triple(SgSG *sg, SgId key, SgTriple triple, GuExn* err)
goto rollback;
}
- rc = sqlite3BtreeCommit(db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return false;
+ if (db->autoCommit) {
+ rc = sqlite3BtreeCommit(db->aDb[0].pBt);
+ if (rc != SQLITE_OK) {
+ sg_raise_sqlite(db, err);
+ return false;
+ }
}
return (res == 0);
@@ -817,7 +875,9 @@ close:
sqlite3BtreeCloseCursor(&crsTriples);
rollback:
- sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ if (db->autoCommit) {
+ sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
+ }
return false;
}
@@ -897,20 +957,8 @@ sg_query_triple(SgSG *sg, SgTriple triple, GuExn* err)
return tres;
close:
- close_triples(db, tres->cursors, &tres->n_cursors);
-
+ close_triples(db, tres->cursors, &tres->n_cursors, rc, err);
free(tres);
-
- if (rc == SQLITE_OK) {
- rc = sqlite3BtreeCommit(db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(db, err);
- return NULL;
- }
- } else {
- sqlite3BtreeRollback(db->aDb[0].pBt, SQLITE_ABORT_ROLLBACK, 0);
- }
-
return NULL;
}
@@ -995,14 +1043,7 @@ sg_triple_result_fetch(SgTripleResult* tres, SgId* pKey, SgTriple triple, GuExn*
void
sg_triple_result_close(SgTripleResult* tres, GuExn* err)
{
- close_triples(tres->db, tres->cursors, &tres->n_cursors);
-
- int rc = sqlite3BtreeCommit(tres->db->aDb[0].pBt);
- if (rc != SQLITE_OK) {
- sg_raise_sqlite(tres->db, err);
- return;
- }
-
+ close_triples(tres->db, tres->cursors, &tres->n_cursors, SQLITE_OK, err);
free(tres);
}
diff --git a/src/runtime/c/sg/sg.h b/src/runtime/c/sg/sg.h
index a859bbec2..67084876f 100644
--- a/src/runtime/c/sg/sg.h
+++ b/src/runtime/c/sg/sg.h
@@ -14,6 +14,16 @@ sg_open(const char *filename, GuExn* err);
void
sg_close(SgSG *sg, GuExn* err);
+void
+sg_begin_trans(SgSG* sg, GuExn* err);
+
+void
+sg_commit(SgSG* sg, GuExn* err);
+
+void
+sg_rollback(SgSG* sg, GuExn* err);
+
+
SgId
sg_insert_expr(SgSG *sg, PgfExpr expr, GuExn* err);