From bbc2c0ead632f7ff88d15bce0a58bac577faaa9d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Wed, 18 Feb 2015 14:25:40 +0100
Subject: [PATCH] Odbc: big_typed_query() now knows about UUID values.

---
 lib/modules/Sql.pmod/odbc.pike |  6 ++++++
 src/modules/Odbc/odbc_result.c | 10 ++++++++++
 2 files changed, 16 insertions(+)

diff --git a/lib/modules/Sql.pmod/odbc.pike b/lib/modules/Sql.pmod/odbc.pike
index 2442fa3cb5..bcfd1a31e5 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 8f1fdb18bd..a79ba73073 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 =
-- 
GitLab