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