New version of the patch.

I found and fixed two problems with unicode. And now it's possible to get ResultSet from callable statements.




diff -uNr DBD-MaxDB-7.5.00.32.origin/dbdimp.c DBD-MaxDB-7.5.00.32/dbdimp.c
--- DBD-MaxDB-7.5.00.32.origin/dbdimp.c 2005-09-12 15:26:20.000000000 +0900
+++ DBD-MaxDB-7.5.00.32/dbdimp.c        2005-09-13 15:31:08.000000000 +0900
@@ -477,11 +477,12 @@
dbd_maxdb_internal_error(dbh, DBD_ERR_INITIALIZATION_FAILED_S, "Cannot get connection from environment");
     DBD_MAXDB_METHOD_RETURN(imp_dbh, dbd_maxdb_db_login6, SQLDBC_FALSE);
   }
-  if (! SQLDBC_Connection_connectASCII(imp_dbh->m_connection,
+  if (! SQLDBC_Connection_connectNTS(imp_dbh->m_connection,
                                        host,
                                        dbname,
                                        user,
                                        password,
+                                      SQLDBC_StringEncodingType_Encoding_UTF8,
                                        imp_dbh->m_connprop)==SQLDBC_OK){
dbd_maxdb_sqldbc_error(dbh, SQLDBC_Connection_getError(imp_dbh->m_connection)) ;
     DBD_MAXDB_METHOD_RETURN(imp_dbh, dbd_maxdb_db_login6, SQLDBC_FALSE);
@@ -967,7 +968,7 @@
     }
    }

-   retcode = SQLDBC_Statement_executeASCII (imp_dbh->m_stmt, statement);
+ retcode = SQLDBC_Statement_executeNTS (imp_dbh->m_stmt, statement,SQLDBC_StringEncodingType_Encoding_UTF8);
    if (retcode != SQLDBC_OK && retcode != SQLDBC_NO_DATA_FOUND){
dbd_maxdb_sqldbc_error(dbh, SQLDBC_Statement_getError(imp_dbh->m_stmt)); DBD_MAXDB_METHOD_RETURN (imp_dbh, dbd_maxdb_db_executeUpdate, DBD_MAXDB_ERROR_RETVAL);
@@ -1029,7 +1030,7 @@
DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_prepare, SQLDBC_FALSE);
     }
   }
- if (SQLDBC_PreparedStatement_prepareASCII (imp_sth->m_prepstmt, statement) != SQLDBC_OK) { + if (SQLDBC_PreparedStatement_prepareNTS (imp_sth->m_prepstmt, statement,SQLDBC_StringEncodingType_Encoding_UTF8) != SQLDBC_OK) { dbd_maxdb_sqldbc_error(sth, SQLDBC_PreparedStatement_getError(imp_sth->m_prepstmt));
     DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_prepare, SQLDBC_FALSE);
   }
@@ -1043,12 +1044,6 @@
if (parcnt) Newz(242, imp_sth->m_bindParms, parcnt, dbd_maxdb_bind_param);
   }

- imp_sth->m_rsmd=SQLDBC_PreparedStatement_getResultSetMetaData (imp_sth->m_prepstmt); - if (SQLDBC_PreparedStatement_isQuery(imp_sth->m_prepstmt) && !imp_sth->m_rsmd) { - dbd_maxdb_internal_error(sth, DBD_ERR_INITIALIZATION_FAILED_S, "Cannot get resultset metadata");
-    DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_prepare, SQLDBC_FALSE);
-  }
-
   DBIc_IMPSET_on(imp_sth);
   DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_prepare, SQLDBC_TRUE);
 }
@@ -1185,6 +1180,11 @@

   DBD_MAXDB_METHOD_ENTER(imp_sth, dbd_maxdb_registerResultSet);

+  if (DBIc_NUM_FIELDS(imp_sth) < 0) {
+ dbd_maxdb_internal_error(sth, DBD_ERR_INITIALIZATION_FAILED_S, "Wrong number of columns"); + DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_registerResultSet, SQLDBC_FALSE);
+  }
+
   if (imp_sth->m_cols){
     /*already registered*/
     return SQLDBC_TRUE;
@@ -1214,20 +1214,20 @@
         case SQLDBC_SQLTYPE_NUMBER        :
         case SQLDBC_SQLTYPE_SMALLINT      :
         case SQLDBC_SQLTYPE_INTEGER       : {
- collen = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, column) + 2; + collen = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column) + 2;
           break;
         }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
           collen = 1;
           break;
         }
         case SQLDBC_SQLTYPE_FLOAT         :
         case SQLDBC_SQLTYPE_VFLOAT        : {
- collen = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, column) + 6; /*-[0-9]+.[0-9]+E[-][0-9][0-9]*/ + collen = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column) + 6; /*-[0-9]+.[0-9]+E[-][0-9][0-9]*/
           break;
         }
         default : {
- collen = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, column); + collen = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column);
           break;
         }
      }
@@ -1243,7 +1243,7 @@
   allColumnsLength = 0;
   for (column = 1; column <= colcnt; column++) {
     dbd_maxdb_bind_column *m_col = &imp_sth->m_cols[column-1];
- SQLDBC_Int4 ColumnLength = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, column); + SQLDBC_Int4 ColumnLength = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column); SQLDBC_SQLType ColumnType = SQLDBC_ResultSetMetaData_getColumnType (imp_sth->m_rsmd, column);
     m_col->hostType = SQLDBC_HOSTTYPE_ASCII;
     m_col->chopBlanks = SQLDBC_FALSE;
@@ -1268,8 +1268,12 @@
         break;
         }
         case SQLDBC_SQLTYPE_CHA           :
-        case SQLDBC_SQLTYPE_CHE           :
+        case SQLDBC_SQLTYPE_CHE           :{
+        m_col->chopBlanks = SQLDBC_TRUE;
+       break;
+       }
         case SQLDBC_SQLTYPE_UNICODE       :{
+        m_col->hostType = SQLDBC_HOSTTYPE_UTF8;
         m_col->chopBlanks = SQLDBC_TRUE;
         break;
         }
@@ -1282,9 +1286,10 @@
         break;
         }
         case SQLDBC_SQLTYPE_VARCHARUNI    : {
-        break;
-        }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+        m_col->hostType = SQLDBC_HOSTTYPE_UTF8;
+       break;
+       }
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
         m_col->hostType =   SQLDBC_HOSTTYPE_INT1;
         ColumnLength = 1;
         break;
@@ -1304,7 +1309,7 @@
         case SQLDBC_SQLTYPE_LONGE         :
         case SQLDBC_SQLTYPE_STRUNI        :
         case SQLDBC_SQLTYPE_LONGUNI       : {
-        m_col->hostType = SQLDBC_HOSTTYPE_ASCII;
+        m_col->hostType = SQLDBC_HOSTTYPE_UTF8;
         ColumnLength = DBIc_LongReadLen(imp_sth);
         break;
         }
@@ -1788,7 +1793,7 @@
           }
           case sth_maxdb_option_CursorName:{
              char* cursorname = SvPV(valuesv,kl);
- SQLDBC_PreparedStatement_setCursorName (imp_sth->m_prepstmt, cursorname, kl, SQLDBC_StringEncodingType_Encoding_Ascii) ; + SQLDBC_PreparedStatement_setCursorName (imp_sth->m_prepstmt, cursorname, kl, SQLDBC_StringEncodingType_Encoding_UTF8) ;
              erg = SQLDBC_TRUE;
              break;
           }
@@ -1836,7 +1841,7 @@
         if( SQLDBC_PreparedStatement_getCursorName (
                           imp_sth->m_prepstmt,
                           cname,
-                          SQLDBC_StringEncodingType_Encoding_Ascii,
+                          SQLDBC_StringEncodingType_Encoding_UTF8,
                           cnameLen,
                           &bufferLength) != SQLDBC_OK){
                break;
@@ -1885,7 +1890,7 @@
         if( SQLDBC_PreparedStatement_getTableName(
                           imp_sth->m_prepstmt,
                           cname,
-                          SQLDBC_StringEncodingType_Encoding_Ascii,
+                          SQLDBC_StringEncodingType_Encoding_UTF8,
                           cnameLen,
                           &bufferLength) != SQLDBC_OK){
              break;
@@ -1910,7 +1915,7 @@
           if (SQLDBC_ResultSetMetaData_getColumnName (imp_sth->m_rsmd,
                                                       i,
                                                       cname,
- SQLDBC_StringEncodingType_Encoding_Ascii, + SQLDBC_StringEncodingType_Encoding_UTF8,
                                                       cnameLen,
&colnamelen) != SQLDBC_OK) { dbd_maxdb_internal_error(sth, DBD_ERR_CANNOT_GET_COLUMNNAME_D, i);
@@ -2178,6 +2183,11 @@
             parameter->value = newSViv(intval);
             break;
           }
+          case SQLDBC_SQLTYPE_UNICODE          :
+          case SQLDBC_SQLTYPE_VARCHARUNI          :
+         parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
+         parameter->value = newSVsv(value);
+         break;
           case SQLDBC_SQLTYPE_STRB          :
           case SQLDBC_SQLTYPE_LONGB         :
                case SQLDBC_SQLTYPE_CHB           :
@@ -2218,7 +2228,7 @@
           case SQLDBC_SQLTYPE_LONGE         :
           case SQLDBC_SQLTYPE_STRUNI        :
           case SQLDBC_SQLTYPE_LONGUNI       : {
-            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
             paramlen = DBIc_LongReadLen(imp_sth);
             break;
           }


--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to