List:Commits« Previous MessageNext Message »
From:jwinstead Date:August 25 2007 1:30am
Subject:Connector/ODBC 3.51 commit: r687 - in branches/guffert: driver test
View as plain text  
Modified:
   branches/guffert/driver/ansi.c
   branches/guffert/driver/catalog.c
   branches/guffert/driver/driver.def
   branches/guffert/driver/driver.h
   branches/guffert/driver/unicode.c
   branches/guffert/test/my_unicode.c
Log:
Implement SQLSpecialColumnsW()


Modified: branches/guffert/driver/ansi.c
===================================================================
--- branches/guffert/driver/ansi.c	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/driver/ansi.c	2007-08-24 23:30:41 UTC (rev 687)
@@ -901,7 +901,62 @@
   return MySQLSetStmtAttr(hstmt, attribute, value, value_len);
 }
 
+
 SQLRETURN SQL_API
+SQLSpecialColumns(SQLHSTMT hstmt, SQLUSMALLINT type,
+                  SQLCHAR *catalog, SQLSMALLINT catalog_len,
+                  SQLCHAR *schema, SQLSMALLINT schema_len,
+                  SQLCHAR *table, SQLSMALLINT table_len,
+                  SQLUSMALLINT scope, SQLUSMALLINT nullable)
+{
+  SQLRETURN rc;
+  DBC *dbc= ((STMT *)hstmt)->dbc;
+
+  if (dbc->ansi_charset_info->number != dbc->cxn_charset_info->number)
+  {
+    SQLINTEGER len= SQL_NTS;
+    uint errors= 0;
+
+    if (catalog)
+    {
+      catalog= sqlchar_as_sqlchar(dbc->ansi_charset_info, dbc->cxn_charset_info,
+                                  catalog, &len, &errors);
+      catalog_len= (SQLSMALLINT)len;
+      len= SQL_NTS;
+    }
+
+    if (schema)
+    {
+      schema= sqlchar_as_sqlchar(dbc->ansi_charset_info, dbc->cxn_charset_info,
+                                 schema, &len, &errors);
+      schema_len= (SQLSMALLINT)len;
+      len= SQL_NTS;
+    }
+
+    if (table)
+    {
+      table= sqlchar_as_sqlchar(dbc->ansi_charset_info, dbc->cxn_charset_info,
+                                table, &len, &errors);
+      table_len= (SQLSMALLINT)len;
+      len= SQL_NTS;
+    }
+  }
+
+  rc= MySQLSpecialColumns(hstmt, type, catalog, catalog_len, schema, schema_len,
+                          table, table_len, scope, nullable);
+
+  if (dbc->ansi_charset_info->number != dbc->cxn_charset_info->number)
+  {
+    x_free(catalog);
+    x_free(schema);
+    x_free(table);
+  }
+
+  return rc;
+}
+
+
+SQLRETURN SQL_API
 SQLTables(SQLHSTMT hstmt,
           SQLCHAR *catalog, SQLSMALLINT catalog_len,
           SQLCHAR *schema, SQLSMALLINT schema_len,
@@ -1050,17 +1105,6 @@
 
 
 SQLRETURN SQL_API
-SQLSpecialColumns(SQLHSTMT hstmt, SQLUSMALLINT type,
-                  SQLCHAR *catalog, SQLSMALLINT catalog_len,
-                  SQLCHAR *schema, SQLSMALLINT schema_len,
-                  SQLCHAR *table, SQLSMALLINT table_len,
-                  SQLUSMALLINT scope, SQLUSMALLINT nullable)
-{
-  NOT_IMPLEMENTED;
-}
-
-
-SQLRETURN SQL_API
 SQLStatistics(SQLHSTMT hstmt,
               SQLCHAR *catalog, SQLSMALLINT catalog_len,
               SQLCHAR *schema, SQLSMALLINT schema_len,

Modified: branches/guffert/driver/catalog.c
===================================================================
--- branches/guffert/driver/catalog.c	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/driver/catalog.c	2007-08-24 23:30:41 UTC (rev 687)
@@ -1384,7 +1384,6 @@
 ****************************************************************************
 */
 
-#if MYSQL_VERSION_ID >= 40100
 MYSQL_FIELD SQLSPECIALCOLUMNS_fields[]=
 {
     {"SCOPE",         NullS,"MySQL_SpecialColumns",NullS,NullS,NullS,NullS,5,5,
0,0,0,0,0,0,0, NOT_NULL_FLAG,0,0,MYSQL_TYPE_SHORT},
@@ -1396,19 +1395,6 @@
     {"DECIMAL_DIGITS",NullS,"MySQL_SpecialColumns",NullS,NullS,NullS,NullS,3,3,
0,0,0,0,0,0,0, 0,0,0,MYSQL_TYPE_SHORT},
     {"PSEUDO_COLUMN", NullS,"MySQL_SpecialColumns",NullS,NullS,NullS,NullS,3,3,
0,0,0,0,0,0,0, 0,0,0,MYSQL_TYPE_SHORT}
 };
-#else
-MYSQL_FIELD SQLSPECIALCOLUMNS_fields[]=
-{
-    {"SCOPE",        
"MySQL_SpecialColumns",NullS,NullS,NullS,5,5,NOT_NULL_FLAG,0,MYSQL_TYPE_SHORT},
-    {"COLUMN_NAME",  
"MySQL_SpecialColumns",NullS,NullS,NullS,NAME_LEN,NAME_LEN,NOT_NULL_FLAG,0,MYSQL_TYPE_VAR_STRING},
-    {"DATA_TYPE",    
"MySQL_SpecialColumns",NullS,NullS,NullS,5,5,NOT_NULL_FLAG,0,MYSQL_TYPE_SHORT},
-    {"TYPE_NAME",    
"MySQL_SpecialColumns",NullS,NullS,NullS,20,20,NOT_NULL_FLAG,0,MYSQL_TYPE_VAR_STRING},
-    {"COLUMN_SIZE",   "MySQL_SpecialColumns",NullS,NullS,NullS,7,7,0,0,MYSQL_TYPE_LONG},
-    {"BUFFER_LENGTH", "MySQL_SpecialColumns",NullS,NullS,NullS,7,7,0,0,MYSQL_TYPE_LONG},
-    {"DECIMAL_DIGITS","MySQL_SpecialColumns",NullS,NullS,NullS,3,3,0,0,MYSQL_TYPE_SHORT},
-    {"PSEUDO_COLUMN", "MySQL_SpecialColumns",NullS,NullS,NullS,3,3,0,0,MYSQL_TYPE_SHORT}
-};
-#endif
 
 char *SQLSPECIALCOLUMNS_values[]= {
     0,NULL,0,NULL,0,0,0,0
@@ -1427,22 +1413,16 @@
          row is updated by a transaction
 */
 
-SQLRETURN SQL_API SQLSpecialColumns(SQLHSTMT hstmt,
-                                    SQLUSMALLINT fColType,
-                                    SQLCHAR FAR *szTableQualifier,
-                                    SQLSMALLINT cbTableQualifier,
-                                    SQLCHAR FAR *szTableOwner
-                                      __attribute__((unused)),
-                                    SQLSMALLINT cbTableOwner
-                                      __attribute__((unused)),
-                                    SQLCHAR FAR *szTableName,
-                                    SQLSMALLINT cbTableName,
-                                    SQLUSMALLINT fScope
-                                      __attribute__((unused)),
-                                    SQLUSMALLINT fNullable
-                                      __attribute__((unused)))
-{  
-    STMT FAR    *stmt=(STMT FAR*) hstmt;
+SQLRETURN SQL_API
+MySQLSpecialColumns(SQLHSTMT hstmt, SQLUSMALLINT fColType,
+                    SQLCHAR *szTableQualifier, SQLSMALLINT cbTableQualifier,
+                    SQLCHAR *szTableOwner __attribute__((unused)),
+                    SQLSMALLINT cbTableOwner __attribute__((unused)),
+                    SQLCHAR *szTableName, SQLSMALLINT cbTableName,
+                    SQLUSMALLINT fScope __attribute__((unused)),
+                    SQLUSMALLINT fNullable __attribute__((unused)))
+{
+    STMT        *stmt=(STMT *) hstmt;
     char        buff[80];
     char        **row;
     MYSQL_RES   *result;
@@ -1601,6 +1581,7 @@
     return SQL_SUCCESS;
 }
 
+
 /*
 ****************************************************************************
 SQLPrimaryKeys

Modified: branches/guffert/driver/driver.def
===================================================================
--- branches/guffert/driver/driver.def	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/driver/driver.def	2007-08-24 23:30:41 UTC (rev 687)
@@ -129,6 +129,7 @@
 SQLSetConnectOptionW
 SQLSetCursorNameW
 SQLSetStmtAttrW
+SQLSpecialColumnsW
 SQLTablesW
 ;
 DllMain

Modified: branches/guffert/driver/driver.h
===================================================================
--- branches/guffert/driver/driver.h	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/driver/driver.h	2007-08-24 23:30:41 UTC (rev 687)
@@ -447,6 +447,12 @@
                                      SQLSMALLINT len);
 SQLRETURN SQL_API MySQLSetStmtAttr(SQLHSTMT hstmt, SQLINTEGER attribute,
                                    SQLPOINTER value, SQLINTEGER len);
+SQLRETURN SQL_API MySQLSpecialColumns(SQLHSTMT hstmt, SQLUSMALLINT type,
+                                      SQLCHAR *catalog, SQLSMALLINT catalog_len,
+                                      SQLCHAR *schema, SQLSMALLINT schema_len,
+                                      SQLCHAR *table, SQLSMALLINT table_len,
+                                      SQLUSMALLINT scope,
+                                      SQLUSMALLINT nullable);
 SQLRETURN SQL_API MySQLTables(SQLHSTMT hstmt,
                               SQLCHAR *catalog, SQLSMALLINT catalog_len,
                               SQLCHAR *schema, SQLSMALLINT schema_len,

Modified: branches/guffert/driver/unicode.c
===================================================================
--- branches/guffert/driver/unicode.c	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/driver/unicode.c	2007-08-24 23:30:41 UTC (rev 687)
@@ -1022,6 +1022,43 @@
 
 
 SQLRETURN SQL_API
+SQLSpecialColumnsW(SQLHSTMT hstmt, SQLUSMALLINT type,
+                   SQLWCHAR *catalog, SQLSMALLINT catalog_len,
+                   SQLWCHAR *schema, SQLSMALLINT schema_len,
+                   SQLWCHAR *table, SQLSMALLINT table_len,
+                   SQLUSMALLINT scope, SQLUSMALLINT nullable)
+{
+  SQLRETURN rc;
+  SQLCHAR *catalog8, *schema8, *table8;
+  DBC *dbc= ((STMT *)hstmt)->dbc;
+  SQLINTEGER len= SQL_NTS;;
+  uint errors= 0;
+
+  catalog8= sqlwchar_as_sqlchar(dbc->cxn_charset_info, catalog, &len,
&errors);
+  catalog_len= (SQLSMALLINT)len;
+  len= SQL_NTS;
+
+  schema8= sqlwchar_as_sqlchar(dbc->cxn_charset_info, schema, &len, &errors);
+  schema_len= (SQLSMALLINT)len;
+  len= SQL_NTS;
+
+  table8= sqlwchar_as_sqlchar(dbc->cxn_charset_info, table, &len, &errors);
+  table_len= (SQLSMALLINT)len;
+  len= SQL_NTS;
+
+  rc= MySQLSpecialColumns(hstmt, type, catalog8, catalog_len,
+                          schema8, schema_len, table8, table_len,
+                          scope, nullable);
+
+  x_free(catalog8);
+  x_free(schema8);
+  x_free(table8);
+
+  return rc;
+}
+
+
+SQLRETURN SQL_API
 SQLTablesW(SQLHSTMT hstmt,
            SQLWCHAR *catalog, SQLSMALLINT catalog_len,
            SQLWCHAR *schema, SQLSMALLINT schema_len,
@@ -1149,17 +1186,6 @@
 
 
 SQLRETURN SQL_API
-SQLSpecialColumnsW(SQLHSTMT hstmt, SQLUSMALLINT type,
-                   SQLWCHAR *catalog, SQLSMALLINT catalog_len,
-                   SQLWCHAR *schema, SQLSMALLINT schema_len,
-                   SQLWCHAR *table, SQLSMALLINT table_len,
-                   SQLUSMALLINT scope, SQLUSMALLINT nullable)
-{
-  NOT_IMPLEMENTED;
-}
-
-
-SQLRETURN SQL_API
 SQLStatisticsW(SQLHSTMT hstmt,
                SQLWCHAR *catalog, SQLSMALLINT catalog_len,
                SQLWCHAR *schema, SQLSMALLINT schema_len,

Modified: branches/guffert/test/my_unicode.c
===================================================================
--- branches/guffert/test/my_unicode.c	2007-08-24 23:20:14 UTC (rev 686)
+++ branches/guffert/test/my_unicode.c	2007-08-24 23:30:41 UTC (rev 687)
@@ -756,6 +756,46 @@
 }
 
 
+DECLARE_TEST(sqlspecialcolumns)
+{
+  HDBC hdbc1;
+  HSTMT hstmt1;
+  SQLWCHAR wbuff[40];
+
+  ok_env(henv, SQLAllocConnect(henv, &hdbc1));
+  ok_con(hdbc1, SQLConnectW(hdbc1, W(L"myodbc3"), SQL_NTS, W(L"root"), SQL_NTS,
+                            W(L""), SQL_NTS));
+
+  ok_con(hdbc1, SQLAllocStmt(hdbc1, &hstmt1));
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_spec");
+  ok_stmt(hstmt1,
+          SQLExecDirectW(hstmt1,
+                         W(L"CREATE TABLE t_spec (a\u00e3g INT PRIMARY KEY)"),
+                         SQL_NTS));
+
+  ok_stmt(hstmt1, SQLSpecialColumnsW(hstmt1, SQL_BEST_ROWID, NULL, 0, NULL, 0,
+                             W(L"t_spec"), SQL_NTS, SQL_SCOPE_SESSION,
+                             SQL_NULLABLE));
+
+  ok_stmt(hstmt1, SQLFetch(hstmt1));
+
+  is_wstr(my_fetch_wstr(hstmt1, wbuff, 2), L"a\u00e3g", 4);
+
+  expect_stmt(hstmt1, SQLFetch(hstmt1), SQL_NO_DATA_FOUND);
+
+  ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE));
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_spec");
+
+  ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_DROP));
+  ok_con(hdbc1, SQLDisconnect(hdbc1));
+  ok_con(hdbc1, SQLFreeConnect(hdbc1));
+
+  return OK;
+}
+
+
 BEGIN_TESTS
   ADD_TEST(sqlconnect)
   ADD_TEST(sqlprepare)
@@ -772,6 +812,7 @@
   ADD_TEST(sqlgetdiagfield)
   ADD_TEST(sqlcolumns)
   ADD_TEST(sqltables)
+  ADD_TEST(sqlspecialcolumns)
 END_TESTS
 
 

Thread
Connector/ODBC 3.51 commit: r687 - in branches/guffert: driver testjwinstead25 Aug