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

merged with oct2020


diffs (153 lines):

diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -125,6 +125,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;
+}
+
 const char *
 monetdbe_version(void)
 {
@@ -1420,14 +1457,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;
 }
 
@@ -1465,6 +1540,7 @@ monetdbe_execute(monetdbe_statement *stm
                }
 
                (*(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);
@@ -2504,40 +2580,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