diff --git a/lib/modules/Sql.pmod/odbc.pike b/lib/modules/Sql.pmod/odbc.pike index 2442fa3cb537d3608c84b2d1a3bccd9bc8e1b810..bcfd1a31e513925871b804c3d89738547aa00c09 100644 --- a/lib/modules/Sql.pmod/odbc.pike +++ b/lib/modules/Sql.pmod/odbc.pike @@ -111,4 +111,10 @@ class typed_result return Calendar.ISO.Fraction(year, month, day, hour, minute, second, nanos); } + + //! Function called to create UUID/GUID objects. + Standards.UUID.UUID uuid_factory(string(0..255) raw_uuid) + { + return Standards.UUID.UUID(raw_uuid); + } } diff --git a/src/modules/Odbc/odbc_result.c b/src/modules/Odbc/odbc_result.c index 8f1fdb18bd886f62e48dcf6cb7cabbee15be2d96..a79ba7307378af6319a8ccf83e106e420b2e707e 100644 --- a/src/modules/Odbc/odbc_result.c +++ b/src/modules/Odbc/odbc_result.c @@ -73,6 +73,7 @@ int odbc_typed_result_fun_num = -1; static int scale_numeric_fun_num = -1; static int time_factory_fun_num = -1; static int timestamp_factory_fun_num = -1; +static int uuid_factory_fun_num = -1; /* * Functions @@ -270,6 +271,11 @@ static void push_timestamp(int i) apply_current(timestamp_factory_fun_num, 7); } +static void push_uuid(int i) +{ + apply_current(uuid_factory_fun_num, 1); +} + #ifndef SQL_SS_VARIANT #define SQL_SS_VARIANT (-150) #endif @@ -434,6 +440,8 @@ static void odbc_fix_fields(void) #ifdef SQL_GUID case SQL_GUID: push_text("uuid"); + field_info[i].bin_size = sizeof(struct tagSQLGUID); + field_info[i].factory = push_uuid; break; #endif case SQL_DATE: @@ -1376,6 +1384,8 @@ void init_odbc_res_programs(void) tOr(tInt, tVoid) tOr(tInt, tVoid) tOr(tInt, tVoid) tOr(tInt, tVoid), tMix), ID_PUBLIC); + uuid_factory_fun_num = + ADD_FUNCTION("uuid_factory", NULL, tFunc(tStr8, tObj), ID_PUBLIC); odbc_typed_result_program = end_program(); odbc_typed_result_fun_num =