Changeset: c518784c9355 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c518784c9355
Modified Files:
clients/odbc/driver/ODBCConvert.c
clients/odbc/driver/ODBCDesc.c
clients/odbc/driver/ODBCUtil.c
clients/odbc/driver/SQLBindParameter.c
clients/odbc/driver/SQLExecute.c
clients/odbc/driver/SQLGetInfo.c
clients/odbc/driver/SQLGetTypeInfo.c
Branch: default
Log Message:
ODBC: Implemented SQL_GUID type using the new uuid type.
diffs (195 lines):
diff --git a/clients/odbc/driver/ODBCConvert.c
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -3208,6 +3208,19 @@ ODBCStore(ODBCStmt *stmt,
}
break;
case SQL_C_GUID:
+ snprintf(data, sizeof(data), "%08lx-%04x-%04x-%02x%02x-"
+ "%02x%02x%02x%02x%02x%02x",
+ (unsigned long) ((SQLGUID *) ptr)->Data1,
+ (unsigned int) ((SQLGUID *) ptr)->Data2,
+ (unsigned int) ((SQLGUID *) ptr)->Data3,
+ (unsigned int) ((SQLGUID *) ptr)->Data4[0],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[1],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[2],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[3],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[4],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[5],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[6],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[7]);
break;
}
assign(buf, bufpos, buflen, '\'', stmt);
@@ -3709,6 +3722,52 @@ ODBCStore(ODBCStmt *stmt,
}
assigns(buf, bufpos, buflen, data, stmt);
break;
+ case SQL_GUID:
+ switch (ctype) {
+ case SQL_C_CHAR:
+ case SQL_C_WCHAR:
+ if (slen != 36) {
+ /* not sure this is the correct error */
+ /* Invalid character value for cast
+ * specification */
+ addStmtError(stmt, "22018", NULL, 0);
+ goto failure;
+ }
+ for (i = 0; i < 36; i++) {
+ if (strchr("0123456789abcdefABCDEF-",
+ sval[i]) == NULL) {
+ /* not sure this is the
+ * correct error */
+ /* Invalid character value for
+ * cast specification */
+ addStmtError(stmt, "22018", NULL, 0);
+ goto failure;
+ }
+ }
+ snprintf(data, sizeof(data), "%.36s", sval);
+ break;
+ case SQL_C_GUID:
+ snprintf(data, sizeof(data), "%08lx-%04x-%04x-%02x%02x-"
+ "%02x%02x%02x%02x%02x%02x",
+ (unsigned long) ((SQLGUID *) ptr)->Data1,
+ (unsigned int) ((SQLGUID *) ptr)->Data2,
+ (unsigned int) ((SQLGUID *) ptr)->Data3,
+ (unsigned int) ((SQLGUID *) ptr)->Data4[0],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[1],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[2],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[3],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[4],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[5],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[6],
+ (unsigned int) ((SQLGUID *) ptr)->Data4[7]);
+ break;
+ default:
+ /* Restricted data type attribute violation */
+ addStmtError(stmt, "07006", NULL, 0);
+ goto failure;
+ }
+ assigns(buf, bufpos, buflen, data, stmt);
+ break;
}
if (ctype == SQL_C_WCHAR)
free(sval);
diff --git a/clients/odbc/driver/ODBCDesc.c b/clients/odbc/driver/ODBCDesc.c
--- a/clients/odbc/driver/ODBCDesc.c
+++ b/clients/odbc/driver/ODBCDesc.c
@@ -454,7 +454,7 @@ ODBCLength(ODBCDescRec *rec, int lengtht
6;
case SQL_GUID:
if (lengthtype == SQL_DESC_OCTET_LENGTH)
- return 16;
+ return 16; /* sizeof(SQLGUID) */
/* strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee") */
return 36;
default:
diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c
--- a/clients/odbc/driver/ODBCUtil.c
+++ b/clients/odbc/driver/ODBCUtil.c
@@ -377,7 +377,7 @@ static struct convert {
{ "SQL_DECIMAL", "decimal(18,7)", },
{ "SQL_DOUBLE", "double", },
{ "SQL_FLOAT", "float", },
- /* { "SQL_GUID", "SQL_GUID", }, */
+ { "SQL_GUID", "uuid", },
{ "SQL_INTEGER", "integer", },
{ "SQL_INTERVAL_DAY", "interval day", },
{ "SQL_INTERVAL_DAY_TO_HOUR", "interval day to hour", },
diff --git a/clients/odbc/driver/SQLBindParameter.c
b/clients/odbc/driver/SQLBindParameter.c
--- a/clients/odbc/driver/SQLBindParameter.c
+++ b/clients/odbc/driver/SQLBindParameter.c
@@ -204,7 +204,7 @@ SQLBindParameter_(ODBCStmt *stmt,
case SQL_SMALLINT:
case SQL_INTEGER:
case SQL_BIGINT:
-/* case SQL_GUID: */
+ case SQL_GUID:
break;
default:
/* Invalid SQL data type */
@@ -226,7 +226,6 @@ SQLBindParameter_(ODBCStmt *stmt,
case SQL_INTERVAL_MINUTE_TO_SECOND:
case SQL_NUMERIC:
case SQL_FLOAT:
- case SQL_GUID:
/* Optional feature not implemented */
addStmtError(stmt, "HYC00", NULL, 0);
return SQL_ERROR;
diff --git a/clients/odbc/driver/SQLExecute.c b/clients/odbc/driver/SQLExecute.c
--- a/clients/odbc/driver/SQLExecute.c
+++ b/clients/odbc/driver/SQLExecute.c
@@ -54,7 +54,7 @@ static struct msql_types {
{"double", SQL_DOUBLE},
{"int", SQL_INTEGER},
{"month_interval", SQL_INTERVAL_MONTH},
- {"oid", SQL_GUID},
+ {"oid", SQL_BIGINT},
{"real", SQL_REAL},
{"sec_interval", SQL_INTERVAL_SECOND},
{"smallint", SQL_SMALLINT},
@@ -65,6 +65,7 @@ static struct msql_types {
{"timestamptz", SQL_TYPE_TIMESTAMP},
{"tinyint", SQL_TINYINT},
/* {"ubyte", SQL_TINYINT}, */
+ {"uuid", SQL_GUID},
{"varchar", SQL_WVARCHAR},
{"wrd", SQL_BIGINT},
{0, 0}, /* sentinel */
diff --git a/clients/odbc/driver/SQLGetInfo.c b/clients/odbc/driver/SQLGetInfo.c
--- a/clients/odbc/driver/SQLGetInfo.c
+++ b/clients/odbc/driver/SQLGetInfo.c
@@ -224,8 +224,8 @@ SQLGetInfo_(ODBCDbc *dbc,
SQL_CVT_TIMESTAMP |
SQL_CVT_TINYINT |
SQL_CVT_VARBINARY |
- SQL_CVT_VARCHAR;
- /* SQL_CVT_GUID */
+ SQL_CVT_VARCHAR |
+ SQL_CVT_GUID;
len = sizeof(SQLUINTEGER);
break;
case SQL_CONVERT_FUNCTIONS:
diff --git a/clients/odbc/driver/SQLGetTypeInfo.c
b/clients/odbc/driver/SQLGetTypeInfo.c
--- a/clients/odbc/driver/SQLGetTypeInfo.c
+++ b/clients/odbc/driver/SQLGetTypeInfo.c
@@ -137,7 +137,28 @@ static struct types {
/* this table is sorted on the value of data_type and then on
* how "close" the type maps to the corresponding ODBC SQL
* type (i.e. in the order SQLGetTypeInfo wants it) */
- /* SQL_GUID */
+ {
+ "uuid", /* type_name */
+ SQL_GUID, /* data_type */
+ 36, /* column_size */
+ NULL, /* literal_prefix */
+ NULL, /* literal_suffix */
+ NULL, /* create_params */
+ SQL_NULLABLE, /* nullable */
+ SQL_FALSE, /* case_sensitive */
+ SQL_PRED_BASIC, /* searchable */
+ -1, /* unsigned_attribute */
+ SQL_FALSE, /* fixed_prec_scale */
+ -1, /* auto_unique_value */
+ NULL, /* local_type_name */
+ -1, /* minimum_scale */
+ -1, /* maximum_scale */
+ SQL_GUID, /* sql_data_type */
+ -1, /* sql_datetime_sub */
+ -1, /* num_prec_radix */
+ -1, /* interval_precision */
+ NULL /* tuple */
+ },
{
"character large object", /* type_name */
SQL_WLONGVARCHAR, /* data_type */
@@ -1021,6 +1042,7 @@ SQLGetTypeInfo_(ODBCStmt *stmt,
}
for (t = types, i = 0; t < &types[sizeof(types) / sizeof(types[0])];
t++) {
+ assert(t == types || t->data_type >= (t-1)->data_type);
if (DataType == SQL_ALL_TYPES || DataType == t->data_type) {
if (t->tuple == NULL) {
char buf[32];
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list