The third version of the patch.

Added support of UTF8 in OUT parameters of DBPROC. Fixed bug with choping of OUT parameters.




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-16 17:41:22.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;
         }
@@ -1335,6 +1340,7 @@
   int erg = SQLDBC_TRUE;
   D_imp_dbh_from_sth;
   SQLDBC_Retcode exec_rc;
+ int ChopBlanks = 1; /* always chop blanks DBIc_has(imp_sth, DBIcf_ChopBlanks); */

   DBD_MAXDB_METHOD_ENTER(imp_sth, dbd_maxdb_st_execute);

@@ -1416,8 +1422,8 @@
dbd_maxdb_internal_error(sth, DBD_ERR_LONG_COLUMN_TRUNCATED_D, paramIndex+1); DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, DBD_MAXDB_ERROR_RETVAL);
                  }
-                 if (m_param->indicator >= 0){
- while (m_param->indicator >= 0 && buf[m_param->indicator]==' ') --m_param->indicator; + if (m_param->chopBlanks && ChopBlanks && m_param->indicator > 0){ + while (m_param->indicator >= 0 && buf[m_param->indicator-1]==' ') --m_param->indicator;
                  }
                 break;
               }
@@ -1788,7 +1794,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 +1842,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 +1891,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 +1916,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 +2184,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           :
@@ -2208,7 +2219,8 @@
        imp_sth->m_hasOutValues= SQLDBC_TRUE;
        (void)SvUPGRADE(svVal, SVt_PVNV);
        SvPOK_only(svVal);
-
+       parameter->chopBlanks = SQLDBC_FALSE;
+
switch (SQLDBC_ParameterMetaData_getParameterType (imp_sth->m_paramMetadata, index)) {
           case SQLDBC_SQLTYPE_STRB          :
           case SQLDBC_SQLTYPE_LONGB         :
@@ -2217,11 +2229,22 @@
           case SQLDBC_SQLTYPE_LONGA         :
           case SQLDBC_SQLTYPE_LONGE         :
           case SQLDBC_SQLTYPE_STRUNI        :
-          case SQLDBC_SQLTYPE_LONGUNI       : {
-            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+          case SQLDBC_SQLTYPE_LONGUNI       : {
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
             paramlen = DBIc_LongReadLen(imp_sth);
             break;
           }
+         case SQLDBC_SQLTYPE_VARCHARUNI    : {
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
+ paramlen = SQLDBC_ParameterMetaData_getPhysicalLength (imp_sth->m_paramMetadata, index);
+           break;
+         }
+         case SQLDBC_SQLTYPE_UNICODE       : {
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
+ paramlen = SQLDBC_ParameterMetaData_getPhysicalLength (imp_sth->m_paramMetadata, index);
+           parameter->chopBlanks = SQLDBC_TRUE;
+           break;
+         }
           case SQLDBC_SQLTYPE_FIXED         :
           case SQLDBC_SQLTYPE_NUMBER        :
           case SQLDBC_SQLTYPE_SMALLINT      :
@@ -2242,7 +2265,8 @@
             break;
           }
           default : {
- paramlen = SQLDBC_ParameterMetaData_getParameterLength (imp_sth->m_paramMetadata, index);
+            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+ paramlen = SQLDBC_ParameterMetaData_getPhysicalLength (imp_sth->m_paramMetadata, index);
             break;
           }
          }
diff -uNr DBD-MaxDB-7.5.00.32.origin/dbdimp.h DBD-MaxDB-7.5.00.32/dbdimp.h
--- DBD-MaxDB-7.5.00.32.origin/dbdimp.h 2005-09-12 15:26:20.000000000 +0900
+++ DBD-MaxDB-7.5.00.32/dbdimp.h        2005-09-16 17:24:04.000000000 +0900
@@ -81,6 +81,7 @@
int sqltype; /*!< parameter type provide via bind method */
     SQLDBC_HostType hostType;   /*!< column datatyp */
     SQLDBC_Length indicator; /*!< indicator value */
+ SQLDBC_Bool chopBlanks; /*!< flag that indicates whether the column is relevant for cutoff blanks*/
 } dbd_maxdb_bind_param;

 /*

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-16 17:41:22.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;
         }
@@ -1335,6 +1340,7 @@
   int erg = SQLDBC_TRUE;
   D_imp_dbh_from_sth;
   SQLDBC_Retcode exec_rc;
+  int ChopBlanks = 1; /* always chop blanks DBIc_has(imp_sth, 
DBIcf_ChopBlanks); */
 
   DBD_MAXDB_METHOD_ENTER(imp_sth, dbd_maxdb_st_execute); 
 
@@ -1416,8 +1422,8 @@
                    dbd_maxdb_internal_error(sth, 
DBD_ERR_LONG_COLUMN_TRUNCATED_D, paramIndex+1);
                    DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
                  }
-                 if (m_param->indicator >= 0){
-                   while (m_param->indicator >= 0 && 
buf[m_param->indicator]==' ')  --m_param->indicator;
+                 if (m_param->chopBlanks && ChopBlanks && m_param->indicator > 
0){
+                   while (m_param->indicator >= 0 && 
buf[m_param->indicator-1]==' ')  --m_param->indicator;
                  }
                 break;
               }
@@ -1788,7 +1794,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 +1842,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 +1891,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 +1916,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 +2184,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           :
@@ -2208,7 +2219,8 @@
        imp_sth->m_hasOutValues= SQLDBC_TRUE;
        (void)SvUPGRADE(svVal, SVt_PVNV);
        SvPOK_only(svVal);
-
+       parameter->chopBlanks = SQLDBC_FALSE;
+    
        switch (SQLDBC_ParameterMetaData_getParameterType 
(imp_sth->m_paramMetadata, index)) {
           case SQLDBC_SQLTYPE_STRB          :
           case SQLDBC_SQLTYPE_LONGB         : 
@@ -2217,11 +2229,22 @@
           case SQLDBC_SQLTYPE_LONGA         :
           case SQLDBC_SQLTYPE_LONGE         : 
           case SQLDBC_SQLTYPE_STRUNI        :
-          case SQLDBC_SQLTYPE_LONGUNI       : {
-            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+          case SQLDBC_SQLTYPE_LONGUNI       : { 
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
             paramlen = DBIc_LongReadLen(imp_sth); 
             break;
           }
+         case SQLDBC_SQLTYPE_VARCHARUNI    : {
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
+            paramlen = SQLDBC_ParameterMetaData_getPhysicalLength 
(imp_sth->m_paramMetadata, index);
+           break;
+         }
+         case SQLDBC_SQLTYPE_UNICODE       : {
+            parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
+            paramlen = SQLDBC_ParameterMetaData_getPhysicalLength 
(imp_sth->m_paramMetadata, index);
+           parameter->chopBlanks = SQLDBC_TRUE;
+           break;
+         }
           case SQLDBC_SQLTYPE_FIXED         :
           case SQLDBC_SQLTYPE_NUMBER        :
           case SQLDBC_SQLTYPE_SMALLINT      :
@@ -2242,7 +2265,8 @@
             break;
           } 
           default : {
-            paramlen = SQLDBC_ParameterMetaData_getParameterLength 
(imp_sth->m_paramMetadata, index);
+            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+            paramlen = SQLDBC_ParameterMetaData_getPhysicalLength 
(imp_sth->m_paramMetadata, index);
             break;
           }
          }
diff -uNr DBD-MaxDB-7.5.00.32.origin/dbdimp.h DBD-MaxDB-7.5.00.32/dbdimp.h
--- DBD-MaxDB-7.5.00.32.origin/dbdimp.h 2005-09-12 15:26:20.000000000 +0900
+++ DBD-MaxDB-7.5.00.32/dbdimp.h        2005-09-16 17:24:04.000000000 +0900
@@ -81,6 +81,7 @@
     int sqltype;             /*!< parameter type provide via bind method */
     SQLDBC_HostType hostType;   /*!< column datatyp */
     SQLDBC_Length indicator; /*!< indicator value */
+    SQLDBC_Bool     chopBlanks; /*!< flag that indicates whether the column is 
relevant for cutoff blanks*/
 } dbd_maxdb_bind_param;
 
 /*
-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to