Changeset: d7e53bf51c19 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d7e53bf51c19
Modified Files:
        tools/monetdbe/monetdbe.c
Branch: Oct2020
Log Message:

add missing types in monetdbe bind, ie blob, timestamp, time, date.


diffs (194 lines):

diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -119,6 +119,43 @@ static daytime time_from_data(monetdbe_d
 
 static char* monetdbe_cleanup_result_internal(monetdbe_database_internal 
*mdbe, monetdbe_result_internal* res);
 
+static int
+date_is_null(monetdbe_data_date *value)
+{
+       monetdbe_data_date null_value;
+       data_from_date(date_nil, &null_value);
+       return value->year == null_value.year && value->month == 
null_value.month &&
+                  value->day == null_value.day;
+}
+
+static int
+time_is_null(monetdbe_data_time *value)
+{
+       monetdbe_data_time null_value;
+       data_from_time(daytime_nil, &null_value);
+       return value->hours == null_value.hours &&
+                  value->minutes == null_value.minutes &&
+                  value->seconds == null_value.seconds && value->ms == 
null_value.ms;
+}
+
+static int
+timestamp_is_null(monetdbe_data_timestamp *value)
+{
+       return is_timestamp_nil(timestamp_from_data(value));
+}
+
+static int
+str_is_null(char **value)
+{
+       return !value || *value == NULL;
+}
+
+static int
+blob_is_null(monetdbe_data_blob *value)
+{
+       return !value || value->data == NULL;
+}
+
 static void
 clear_error( monetdbe_database_internal *mdbe)
 {
@@ -546,14 +583,14 @@ monetdbe_startup(monetdbe_database_inter
        }
 
        if (!dbdir) { /* in-memory */
-               if (BBPaddfarm(NULL, (1 << PERSISTENT) | (1 << TRANSIENT), 
false) != GDK_SUCCEED) {
+               if (BBPaddfarm(NULL, (1U << PERSISTENT) | (1U << TRANSIENT), 
false) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
                        mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add in-memory farm");
                        goto cleanup;
                }
        } else {
-               if (BBPaddfarm(dbdir, 1 << PERSISTENT, false) != GDK_SUCCEED ||
-                       BBPaddfarm(/*dbextra ? dbextra : */dbdir, 1 << 
TRANSIENT, false) != GDK_SUCCEED) {
+               if (BBPaddfarm(dbdir, 1U << PERSISTENT, false) != GDK_SUCCEED ||
+                       BBPaddfarm(/*dbextra ? dbextra : */dbdir, 1U << 
TRANSIENT, false) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
                        mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add farm %s", dbdir);
                        goto cleanup;
@@ -570,6 +607,7 @@ monetdbe_startup(monetdbe_database_inter
                mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
"GDKinit() failed");
                goto cleanup;
        }
+
        if ((mdbe->msg = malEmbeddedBoot(workers, memory, querytimeout, 
sessiontimeout)) != MAL_SUCCEED)
                goto cleanup;
 
@@ -852,14 +890,52 @@ monetdbe_bind(monetdbe_statement *stmt, 
 {
        monetdbe_stmt_internal *stmt_internal = (monetdbe_stmt_internal*)stmt;
 
-       /* TODO !data treat as NULL value (add nil mask) ? */
        if (i >= stmt->nparam)
                return createException(MAL, "monetdbe.monetdbe_bind", 
"Parameter %zu not bound to a value", i);
        sql_arg *a = (sql_arg*)list_fetch(stmt_internal->q->f->ops, (int) i);
        assert(a);
-       stmt_internal->data[i].vtype = a->type.type->localtype;
-       /* TODO handle conversion from NULL and special types */
-       VALset(&stmt_internal->data[i], a->type.type->localtype, data);
+       int tpe = a->type.type->localtype;
+       stmt_internal->data[i].vtype = tpe;
+
+       const void* nil = (tpe>=0)?ATOMnilptr(tpe):NULL;
+       if (!data) {
+               VALset(&stmt_internal->data[i], tpe, (ptr)nil);
+       } else if (tpe == TYPE_timestamp) {
+               monetdbe_data_timestamp* ts = (monetdbe_data_timestamp*)data;
+               timestamp t = *(timestamp*) nil;
+               if(!timestamp_is_null(ts))
+                       t = timestamp_from_data(ts);
+               VALset(&stmt_internal->data[i], tpe, &t);
+       } else if (tpe == TYPE_date) {
+               monetdbe_data_date* de = (monetdbe_data_date*)data;
+               date d = *(date*) nil;
+               if(!date_is_null(de))
+                       d = date_from_data(de);
+               VALset(&stmt_internal->data[i], tpe, &d);
+       } else if (tpe == TYPE_daytime) {
+               monetdbe_data_time* t = (monetdbe_data_time*)data;
+               daytime dt = *(daytime*) nil;
+
+               if(!time_is_null(t))
+                       dt = time_from_data(t);
+               VALset(&stmt_internal->data[i], tpe, &dt);
+       } else if (tpe == TYPE_blob) {
+               monetdbe_data_blob *be = (monetdbe_data_blob*)data;
+               blob *b = (blob*)nil;
+               if (!blob_is_null(be)) {
+                       size_t len = be->size;
+                       b = (blob*) GDKmalloc(blobsize(len));
+                       if (b == NULL) {
+                               stmt_internal->mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_bind", MAL_MALLOC_FAIL);
+                               return stmt_internal->mdbe->msg;
+                       }
+                       b->nitems = len;
+                       memcpy(b->data, be->data, len);
+               }
+               VALset(&stmt_internal->data[i], tpe, b);
+       } else {
+               VALset(&stmt_internal->data[i], tpe, data);
+       }
        return MAL_SUCCEED;
 }
 
@@ -885,18 +961,19 @@ monetdbe_execute(monetdbe_statement *stm
        MalStkPtr glb = (MalStkPtr) (NULL);
        Symbol s = findSymbolInModule(mdbe->c->usermodule, q->f->imp);
 
-       mdbe->msg = callMAL(mdbe->c, s->def, &glb, stmt_internal->args, 0);
+       if ((mdbe->msg = callMAL(mdbe->c, s->def, &glb, stmt_internal->args, 
0)) != MAL_SUCCEED)
+               goto cleanup;
 
        if (!b->results && b->rowcnt >= 0 && affected_rows)
                *affected_rows = b->rowcnt;
 
-
        if (result) {
                if ((mdbe->msg = monetdbe_get_results(result, mdbe)) != 
MAL_SUCCEED) {
                        goto cleanup;
                }
 
-               ((monetdbe_result_internal*) result)->type = (b->results) ? 
Q_TABLE : Q_UPDATE;
+               (*(monetdbe_result_internal**) result)->type = (b->results) ? 
Q_TABLE : Q_UPDATE;
+               res_internal = *(monetdbe_result_internal**)result;
        }
 cleanup:
        return commit_action(m, stmt_internal->mdbe, result, res_internal);
@@ -1583,40 +1660,3 @@ timestamp_from_data(monetdbe_data_timest
                date_create(ptr->date.year, ptr->date.month, ptr->date.day),
                daytime_create(ptr->time.hours, ptr->time.minutes, 
ptr->time.seconds, ptr->time.ms * 1000));
 }
-
-static int
-date_is_null(monetdbe_data_date *value)
-{
-       monetdbe_data_date null_value;
-       data_from_date(date_nil, &null_value);
-       return value->year == null_value.year && value->month == 
null_value.month &&
-                  value->day == null_value.day;
-}
-
-static int
-time_is_null(monetdbe_data_time *value)
-{
-       monetdbe_data_time null_value;
-       data_from_time(daytime_nil, &null_value);
-       return value->hours == null_value.hours &&
-                  value->minutes == null_value.minutes &&
-                  value->seconds == null_value.seconds && value->ms == 
null_value.ms;
-}
-
-static int
-timestamp_is_null(monetdbe_data_timestamp *value)
-{
-       return is_timestamp_nil(timestamp_from_data(value));
-}
-
-static int
-str_is_null(char **value)
-{
-       return !value || *value == NULL;
-}
-
-static int
-blob_is_null(monetdbe_data_blob *value)
-{
-       return !value || value->data == NULL;
-}
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to