Changeset: 9a24551ec6f1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a24551ec6f1
Modified Files:
        CMakeLists.txt
        embedded/monetdb_embedded.c
        embedded/monetdb_embedded.h
        monetdb_config.h.in
Branch: cmake-monetdblite
Log Message:

Cleanup:
- "append_data" struct is not needed, because the "colname" was never used.
- For every MonetDBLite connection action, commit the result. If there was an 
error, the ongoing transaction will rollback.
- Add MonetDB major, minor and patch numbers to monetdb_config.h, so users can 
dynamically add compilation definitions for multiple versions of MonetDBLite.
- In monetdb_get_columns and monetdb_append, if schema parameter is NULL, use 
current transaction schema.


diffs (truncated from 539 to 300 lines):

diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,9 @@ endif()
 
 # Change these variables between releases
 set(MONETDB_VERSION_MAJOR "11")
-set(MONETDB_VERSION "${MONETDB_VERSION_MAJOR}.34.0")
+set(MONETDB_VERSION_MINOR "34")
+set(MONETDB_VERSION_PATCH "0")
+set(MONETDB_VERSION 
"${MONETDB_VERSION_MAJOR}.${MONETDB_VERSION_MINOR}.${MONETDB_VERSION_PATCH}")
 
 set(GDK_VERSION_MAJOR "18")
 set(GDK_VERSION "${GDK_VERSION_MAJOR}.1.0")
diff --git a/embedded/monetdb_embedded.c b/embedded/monetdb_embedded.c
--- a/embedded/monetdb_embedded.c
+++ b/embedded/monetdb_embedded.c
@@ -23,6 +23,7 @@
 #include "sql_mvc.h"
 #include "sql_catalog.h"
 #include "sql_gencode.h"
+#include "sql_semantic.h"
 #include "sql_scenario.h"
 #include "sql_optimizer.h"
 #include "rel_exp.h"
@@ -30,6 +31,12 @@
 #include "rel_updates.h"
 #include "monet_options.h"
 
+typedef struct {
+       monetdb_result res;
+       res_table *monetdb_resultset;
+       monetdb_column **converted_columns;
+} monetdb_result_internal;
+
 static MT_Lock embedded_lock = MT_LOCK_INITIALIZER("embedded_lock");
 static bool monetdb_embedded_initialized = false;
 
@@ -43,10 +50,23 @@ monetdb_is_initialized(void)
 }
 
 static char*
+commit_action(mvc* m, char* msg)
+{
+       char *commit_msg = SQLautocommit(m);
+       if ((msg != MAL_SUCCEED || commit_msg != MAL_SUCCEED)) {
+               if (msg == MAL_SUCCEED)
+                       msg = commit_msg;
+               else if (commit_msg)
+                       freeException(commit_msg);
+       }
+       return msg;
+}
+
+static char*
 validate_connection(monetdb_connection conn, const char* call) // Call this 
function always inside the embedded_lock
 {
        if (!monetdb_embedded_initialized)
-               return createException(MAL, call, "Embedded MonetDB is not 
started");
+               return createException(MAL, call, "MonetDBLite has not yet 
started");
        if (!MCvalid((Client) conn))
                return createException(MAL, call, "Invalid connection");
        return MAL_SUCCEED;
@@ -78,21 +98,24 @@ monetdb_destroy_column(monetdb_column* c
        GDKfree(column);
 }
 
-typedef struct {
-       monetdb_result res;
-       res_table *monetdb_resultset;
-       monetdb_column **converted_columns;
-} monetdb_result_internal;
-
 static char*
 monetdb_cleanup_result_internal(monetdb_connection conn, monetdb_result* 
result)
 {
        char* msg = MAL_SUCCEED;
        monetdb_result_internal* res = (monetdb_result_internal *) result;
+       Client c = (Client) conn;
+       mvc* m = NULL;
 
        if ((msg = validate_connection(conn, 
"embedded.monetdb_cleanup_result_internal")) != MAL_SUCCEED)
                return msg;
 
+       if ((msg = getSQLContext(c, NULL, &m, NULL)) != MAL_SUCCEED)
+               goto cleanup;
+       if (!result) {
+               msg = createException(MAL, 
"embedded.monetdb_cleanup_result_internal", "Parameter result is NULL");
+               goto cleanup;
+       }
+
        if (res->monetdb_resultset)
                res_tables_destroy(res->monetdb_resultset);
 
@@ -104,7 +127,8 @@ monetdb_cleanup_result_internal(monetdb_
        }
        GDKfree(res);
 
-       return msg;
+cleanup:
+       return commit_action(m, msg);
 }
 
 static char*
@@ -125,11 +149,14 @@ monetdb_query_internal(monetdb_connectio
                return msg;
 
        old_bstream = c->fdin;
+       if ((msg = getSQLContext(c, NULL, &m, NULL)) != MAL_SUCCEED)
+               goto cleanup;
        b = (backend *) c->sqlcontext;
-       m = b->mvc;
 
-       if (!query)
-               return createException(MAL, "embedded.monetdb_query_internal", 
"Query missing");
+       if (!query) {
+               msg = createException(MAL, "embedded.monetdb_query_internal", 
"Query missing");
+               goto cleanup;
+       }
        if (!(query_stream = buffer_rastream(&query_buf, "sqlstatement"))) {
                msg = createException(MAL, "embedded.monetdb_query_internal", 
"Could not setup query stream");
                goto cleanup;
@@ -156,6 +183,7 @@ monetdb_query_internal(monetdb_connectio
                goto cleanup;
        }
 
+       assert(language);
        b->language = language;
        m->scanner.mode = LINE_N;
        m->scanner.rs = c->fdin;
@@ -186,7 +214,7 @@ monetdb_query_internal(monetdb_connectio
                else
                        res_internal->res.type = (char) m->type;
                res_internal->res.id = (size_t) m->last_id;
-               *result  = (monetdb_result*) res_internal;
+               *result = (monetdb_result*) res_internal;
                m->reply_size = -2; /* do not clean up result tables */
 
                if (m->results) {
@@ -219,8 +247,7 @@ cleanup:
                c->fdin = old_bstream;
        }
 
-       if (m) //the connection is valid and a query was attempted
-               commit_msg = SQLautocommit(m); //need always to commit even if 
msg is set
+       commit_msg = SQLautocommit(m); //need always to commit even if msg is 
set
        if ((msg != MAL_SUCCEED || commit_msg != MAL_SUCCEED)) {
                if (res_internal) {
                        char* other = monetdb_cleanup_result_internal(conn, 
(monetdb_result*) res_internal);
@@ -231,7 +258,7 @@ cleanup:
                        *result = NULL;
                if (msg == MAL_SUCCEED) //if the error happened in the 
autocommit, set it as the returning error message
                        msg = commit_msg;
-               else if(commit_msg) //otherwise if msg is set, discard 
commit_msg
+               else if (commit_msg) //otherwise if msg is set, discard 
commit_msg
                        freeException(commit_msg);
        }
        return msg;
@@ -247,7 +274,7 @@ monetdb_disconnect_internal(monetdb_conn
        if ((msg = SQLexitClient((Client) conn)) != MAL_SUCCEED)
                return msg;
        MCcloseClient((Client) conn);
-       return MAL_SUCCEED;
+       return msg;
 }
 
 static char*
@@ -276,6 +303,12 @@ monetdb_connect_internal(monetdb_connect
        if ((msg = getSQLContext(mc, NULL, &m, NULL)) != MAL_SUCCEED)
                goto cleanup;
        m->session->auto_commit = 1;
+       if (!m->sa)
+               m->sa = sa_create();
+       if (!m->sa) {
+               msg = createException(SQL, "embedded.monetdb_connect_internal", 
MAL_MALLOC_FAIL);
+               goto cleanup;
+       }
 
 cleanup:
        if (msg && mc) {
@@ -283,7 +316,7 @@ cleanup:
                if (other)
                        freeException(other);
                *conn = NULL;
-       } else if(conn)
+       } else if (conn)
                *conn = mc;
        return msg;
 }
@@ -403,7 +436,7 @@ monetdb_clear_prepare(monetdb_connection
 {
        char query[64], *msg;
 
-       sprintf(query, "release "LLFMT, id);
+       sprintf(query, "release "LLFMT, id); //no need to validate at this level
        MT_lock_set(&embedded_lock);
        msg = monetdb_query_internal(conn, query, NULL, NULL, NULL, 'X');
        MT_lock_unset(&embedded_lock);
@@ -415,9 +448,7 @@ monetdb_send_close(monetdb_connection co
 {
        char query[64], *msg;
 
-       if (id < 1)
-               return createException(MAL, "embedded.monetdb_send_close", 
"Invalid value, must be positive.");
-       sprintf(query, "close "LLFMT, id);
+       sprintf(query, "close "LLFMT, id); //no need to validate at this level
        MT_lock_set(&embedded_lock);
        msg = monetdb_query_internal(conn, query, NULL, NULL, NULL, 'X');
        MT_lock_unset(&embedded_lock);
@@ -425,13 +456,11 @@ monetdb_send_close(monetdb_connection co
 }
 
 char*
-monetdb_set_autocommit(monetdb_connection conn, char value)
+monetdb_set_autocommit(monetdb_connection conn, int8_t value)
 {
        char query[64], *msg;
 
-       if (value != 1 && value != 0)
-               return createException(MAL, "embedded.monetdb_set_autocommit", 
"Invalid value, need 0 or 1.");
-       sprintf(query, "auto_commit %i", value);
+       sprintf(query, "auto_commit %"PRIi8, value); //no need to validate at 
this level
        MT_lock_set(&embedded_lock);
        msg = monetdb_query_internal(conn, query, NULL, NULL, NULL, 'X');
        MT_lock_unset(&embedded_lock);
@@ -449,37 +478,34 @@ monetdb_query(monetdb_connection conn, c
 }
 
 char*
-monetdb_append(monetdb_connection conn, const char* schema, const char* table, 
append_data *data, size_t column_count)
+monetdb_append(monetdb_connection conn, const char* schema, const char* table, 
int *batids, size_t column_count)
 {
        Client c = (Client) conn;
        mvc *m;
        char* msg = MAL_SUCCEED;
 
-       if (table == NULL)
-               return createException(MAL, "embedded.monetdb_append", "table 
parameter is NULL");
-       if (data == NULL)
-               return createException(MAL, "embedded.monetdb_append", "data 
parameter is NULL");
-       if (column_count < 1)
-               return createException(MAL, "embedded.monetdb_append", 
"column_count must be higher than 0");
+       MT_lock_set(&embedded_lock);
+       if ((msg = validate_connection(conn, "embedded.monetdb_append")) != 
MAL_SUCCEED) {
+               MT_lock_unset(&embedded_lock);
+               return msg; //The connection is invalid, there is no 
transaction going
+       }
 
-       MT_lock_set(&embedded_lock);
-       if ((msg = validate_connection(conn, "embedded.monetdb_append")) != 
MAL_SUCCEED)
-               goto cleanup;
        if ((msg = getSQLContext(c, NULL, &m, NULL)) != MAL_SUCCEED)
                goto cleanup;
-       if (m->session->status < 0 && m->session->auto_commit == 0) {
-               msg = createException(SQL, "embedded.monetdb_append", "Current 
transaction is aborted (please ROLLBACK)");
+       if ((msg = SQLtrans(m)) != MAL_SUCCEED)
+               goto cleanup;
+       if (table == NULL) {
+               msg = createException(MAL, "embedded.monetdb_append", "table 
parameter is NULL");
                goto cleanup;
        }
-       if (!m->sa) // unclear why this is required
-               m->sa = sa_create();
-       if (!m->sa) {
-               msg = createException(SQL, "embedded.monetdb_append", 
MAL_MALLOC_FAIL);
+       if (batids == NULL) {
+               msg = createException(MAL, "embedded.monetdb_append", "batids 
parameter is NULL");
                goto cleanup;
        }
-
-       if ((msg = SQLtrans(m)) != MAL_SUCCEED)
+       if (column_count < 1) {
+               msg = createException(MAL, "embedded.monetdb_append", 
"column_count must be higher than 0");
                goto cleanup;
+       }
        {
                node *n;
                size_t i;
@@ -491,9 +517,13 @@ monetdb_append(monetdb_connection conn, 
                sql_subfunc *f = sql_find_func(m->sa, mvc_bind_schema(m, 
"sys"), "append", 1, F_UNION, NULL);
 
                assert(f);
-               if (!(s = mvc_bind_schema(m, schema))) {
-                       msg = createException(SQL, "embedded.monetdb_append", 
"Schema missing %s", schema);
-                       goto cleanup;
+               if (schema) {
+                       if (!(s = mvc_bind_schema(m, schema))) {
+                               msg = createException(MAL, 
"embedded.monetdb_get_columns", "Schema missing %s", schema);
+                               goto cleanup;
+                       }
+               } else {
+                       s = cur_schema(m);
                }
                if (!(t = mvc_bind_table(m, s, table))) {
                        msg = createException(SQL, "embedded.monetdb_append", 
"Table missing %s.%s", schema, table);
@@ -505,7 +535,7 @@ monetdb_append(monetdb_connection conn, 
                }
                for (i = 0, n = t->columns.set->h; i < column_count && n; i++, 
n = n->next) {
                        sql_column *col = n->data;
-                       list_append(args, exp_atom_lng(m->sa, data[i].batid));
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to