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

Reply via email to