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