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