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-21 11:08:12.000000000 +0900
@@ -222,6 +222,7 @@
     DBD_ERR_VALUE_OVERFLOW_D,
     DBD_ERR_PARAMETER_NOT_SET_D,
     DBD_ERR_PARAMETER_IS_NOT_INPUT_D,
+    DBD_ERR_FETCH_UNKNOWN
 }dbd_maxdb_errorcode;

 typedef struct dbd_maxdb_errordata
@@ -248,6 +249,7 @@
{ DBD_ERR_VALUE_OVERFLOW_D, -11010 , "", "Value overflow for column/paramter %d."}, { DBD_ERR_PARAMETER_NOT_SET_D, -11011 , "07002","Parameter/Column (%d) not bound."}, { DBD_ERR_PARAMETER_IS_NOT_INPUT_D, -11012 , "07002","Parameter for column (%d) is not an out/inout parameter."}, + { DBD_ERR_FETCH_UNKNOWN , -11013 , "", "Unknown fetch error. Indicator value is: %d."},
 };

static void dbd_maxdb_delete_params(dbd_maxdb_bind_param* params, int parCnt) {
@@ -477,11 +479,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 +970,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 +1032,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 +1046,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 +1182,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;
@@ -1217,7 +1219,12 @@
collen = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, column) + 2;
           break;
         }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+       case SQLDBC_SQLTYPE_UNICODE    :
+       case SQLDBC_SQLTYPE_VARCHARUNI    : {
+ collen = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column);
+         break;
+       }
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
           collen = 1;
           break;
         }
@@ -1233,7 +1240,7 @@
      }
      collen++;
      allColumnsLength += ALIGN(collen);
-  }
+  }

   /*alloc fetch buffer*/
   Newz(101, imp_sth->m_fetchBuf, allColumnsLength, char);
@@ -1268,9 +1275,14 @@
         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;
+ ColumnLength = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column);
         break;
         }

@@ -1282,9 +1294,11 @@
         break;
         }
         case SQLDBC_SQLTYPE_VARCHARUNI    : {
-        break;
-        }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+        m_col->hostType = SQLDBC_HOSTTYPE_UTF8;
+ ColumnLength = SQLDBC_ResultSetMetaData_getPhysicalLength (imp_sth->m_rsmd, column);
+       break;
+       }
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
         m_col->hostType =   SQLDBC_HOSTTYPE_INT1;
         ColumnLength = 1;
         break;
@@ -1304,7 +1318,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 +1349,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);

@@ -1404,7 +1419,6 @@
            buf = SvPV(m_param->value, bufLen);
            bufLen = SvLEN(m_param->value);

-
            switch(m_param->hostType) {
               case SQLDBC_HOSTTYPE_INT1:{
                 *buf += 48;
@@ -1412,13 +1426,21 @@
                 break;
               }
               default:{
-                 if ( m_param->indicator >= (SQLDBC_Length)bufLen) {
- 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->indicator >= (SQLDBC_Length)bufLen || m_param->indicator == SQLDBC_NO_TOTAL) {
+                   if (!DBIc_has(imp_sth, DBIcf_LongTruncOk)) {
+ 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);
+                   }
+                   m_param->indicator = bufLen-1;
+               }
+               if (m_param->indicator < 0) {
+ dbd_maxdb_internal_error(sth, DBD_ERR_FETCH_UNKNOWN, m_param->indicator); + DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, DBD_MAXDB_ERROR_RETVAL);
+               }
+ if (m_param->chopBlanks && ChopBlanks && m_param->indicator > 0){ + while (m_param->indicator >= 0 && buf[m_param->indicator-1]==' ')
+                     --m_param->indicator;
+                }
                 break;
               }
            }
@@ -1487,7 +1509,7 @@
   }

   rowset = SQLDBC_ResultSet_getRowSet (imp_sth->m_resultset);
-
+
   if ((rc = SQLDBC_RowSet_fetch (rowset)) == SQLDBC_NOT_OK) {
     dbd_maxdb_sqldbc_error(sth, SQLDBC_RowSet_getError(rowset)) ;
     DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav);
@@ -1505,17 +1527,21 @@
       continue;
     }

-    if ( m_col->indicator >= m_col->bufLen) {
+ if ( m_col->indicator >= m_col->bufLen || m_col->indicator == SQLDBC_NO_TOTAL) {
       if (!DBIc_has(imp_sth, DBIcf_LongTruncOk)) {
dbd_maxdb_internal_error(sth, DBD_ERR_LONG_COLUMN_TRUNCATED_D, colIndex+1);
         DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav);
       }
       m_col->indicator = m_col->bufLen-1;
     }
+    if (m_col->indicator < 0) {
+ dbd_maxdb_internal_error(sth, DBD_ERR_FETCH_UNKNOWN, m_col->indicator);
+       DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav);
+    }

     if (m_col->chopBlanks && ChopBlanks && m_col->indicator > 0){
       char *buf = m_col->buf;
-      m_col->buf[m_col->bufLen-1]='\0'; /*terminate string*/
+ m_col->buf[m_col->bufLen-1]='\0'; /*terminate string for ASCII and UTF8*/
       while (m_col->indicator && buf[m_col->indicator-1]==' ')
         --m_col->indicator;
     }
@@ -1788,7 +1814,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 +1862,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 +1911,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 +1936,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 +2204,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 +2239,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 +2249,29 @@
           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_CHA           :
+          case SQLDBC_SQLTYPE_CHE           :{
+            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+ paramlen = SQLDBC_ParameterMetaData_getPhysicalLength (imp_sth->m_paramMetadata, index);
+           parameter->chopBlanks = SQLDBC_TRUE;
+           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 +2292,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-19 13:21:41.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;

 /*
@@ -90,7 +91,7 @@
     char* buf;                  /*!< offset pointer to internal buffer */
SQLDBC_Length bufLen; /*!< maximum length of buffer within the result */
     SQLDBC_HostType hostType;   /*!< column datatyp */
-    SQLDBC_Length   indicator;  /*!< coulumn indicator */
+    SQLDBC_Length   indicator;  /*!< column indicator */
SQLDBC_Bool chopBlanks; /*!< flag that indicates whether the column is relevant for cutoff blanks*/
 } dbd_maxdb_bind_column;


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-21 11:08:12.000000000 +0900
@@ -222,6 +222,7 @@
     DBD_ERR_VALUE_OVERFLOW_D,
     DBD_ERR_PARAMETER_NOT_SET_D,
     DBD_ERR_PARAMETER_IS_NOT_INPUT_D,
+    DBD_ERR_FETCH_UNKNOWN
 }dbd_maxdb_errorcode;    
 
 typedef struct dbd_maxdb_errordata
@@ -248,6 +249,7 @@
     { DBD_ERR_VALUE_OVERFLOW_D,          -11010 ,  "",     "Value overflow for 
column/paramter %d."},
     { DBD_ERR_PARAMETER_NOT_SET_D,       -11011 ,  "07002","Parameter/Column 
(%d) not bound."},
     { DBD_ERR_PARAMETER_IS_NOT_INPUT_D,  -11012 ,  "07002","Parameter for 
column (%d) is not an out/inout parameter."},
+    { DBD_ERR_FETCH_UNKNOWN  ,                  -11013 ,  "",     "Unknown 
fetch error. Indicator value is: %d."},
 };
 
 static void dbd_maxdb_delete_params(dbd_maxdb_bind_param* params, int parCnt) {
@@ -477,11 +479,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 +970,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 +1032,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 +1046,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 +1182,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;
@@ -1217,7 +1219,12 @@
           collen = SQLDBC_ResultSetMetaData_getColumnLength (imp_sth->m_rsmd, 
column) + 2;
           break;
         }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+       case SQLDBC_SQLTYPE_UNICODE    : 
+       case SQLDBC_SQLTYPE_VARCHARUNI    : {
+          collen = SQLDBC_ResultSetMetaData_getPhysicalLength 
(imp_sth->m_rsmd, column);
+         break;
+       }
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
           collen = 1;    
           break;
         } 
@@ -1233,7 +1240,7 @@
      } 
      collen++;
      allColumnsLength += ALIGN(collen);
-  }     
+  }
   
   /*alloc fetch buffer*/
   Newz(101, imp_sth->m_fetchBuf, allColumnsLength, char);
@@ -1268,9 +1275,14 @@
         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;
+       ColumnLength = SQLDBC_ResultSetMetaData_getPhysicalLength 
(imp_sth->m_rsmd, column);
         break; 
         }
 
@@ -1282,9 +1294,11 @@
         break;
         }
         case SQLDBC_SQLTYPE_VARCHARUNI    : {
-        break;
-        }
-        case SQLDBC_SQLTYPE_BOOLEAN       : {
+        m_col->hostType = SQLDBC_HOSTTYPE_UTF8;
+       ColumnLength = SQLDBC_ResultSetMetaData_getPhysicalLength 
(imp_sth->m_rsmd, column);
+       break;
+       }
+       case SQLDBC_SQLTYPE_BOOLEAN       : {
         m_col->hostType =   SQLDBC_HOSTTYPE_INT1;
         ColumnLength = 1;    
         break;
@@ -1304,7 +1318,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 +1349,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); 
 
@@ -1404,7 +1419,6 @@
            buf = SvPV(m_param->value, bufLen);
            bufLen = SvLEN(m_param->value);
            
-          
            switch(m_param->hostType) {
               case SQLDBC_HOSTTYPE_INT1:{
                 *buf += 48;
@@ -1412,13 +1426,21 @@
                 break;
               }  
               default:{
-                 if ( m_param->indicator >= (SQLDBC_Length)bufLen) { 
-                   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->indicator >= (SQLDBC_Length)bufLen || 
m_param->indicator == SQLDBC_NO_TOTAL) { 
+                   if (!DBIc_has(imp_sth, DBIcf_LongTruncOk)) {
+                       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); 
+                   }
+                   m_param->indicator = bufLen-1;
+               }
+               if (m_param->indicator < 0) {
+                  dbd_maxdb_internal_error(sth, DBD_ERR_FETCH_UNKNOWN, 
m_param->indicator);
+                  DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
+               }
+                if (m_param->chopBlanks && ChopBlanks && m_param->indicator > 
0){
+                   while (m_param->indicator >= 0 && 
buf[m_param->indicator-1]==' ')  
+                     --m_param->indicator;
+                }
                 break;
               }
            }
@@ -1487,7 +1509,7 @@
   }
 
   rowset = SQLDBC_ResultSet_getRowSet (imp_sth->m_resultset);
-  
+
   if ((rc = SQLDBC_RowSet_fetch (rowset)) == SQLDBC_NOT_OK) {
     dbd_maxdb_sqldbc_error(sth, SQLDBC_RowSet_getError(rowset)) ;
     DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav); 
@@ -1505,17 +1527,21 @@
       continue;
     }
 
-    if ( m_col->indicator >= m_col->bufLen) { 
+    if ( m_col->indicator >= m_col->bufLen || m_col->indicator == 
SQLDBC_NO_TOTAL) { 
       if (!DBIc_has(imp_sth, DBIcf_LongTruncOk)) {
         dbd_maxdb_internal_error(sth, DBD_ERR_LONG_COLUMN_TRUNCATED_D, 
colIndex+1);
         DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav); 
       }
       m_col->indicator = m_col->bufLen-1;
     }
+    if (m_col->indicator < 0) {
+       dbd_maxdb_internal_error(sth, DBD_ERR_FETCH_UNKNOWN, m_col->indicator);
+       DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, Nullav); 
+    }
 
     if (m_col->chopBlanks && ChopBlanks && m_col->indicator > 0){
       char *buf = m_col->buf;
-      m_col->buf[m_col->bufLen-1]='\0'; /*terminate string*/
+      m_col->buf[m_col->bufLen-1]='\0'; /*terminate string for ASCII and UTF8*/
       while (m_col->indicator && buf[m_col->indicator-1]==' ')
         --m_col->indicator;
     }
@@ -1788,7 +1814,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 +1862,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 +1911,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 +1936,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 +2204,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 +2239,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 +2249,29 @@
           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_CHA           :
+          case SQLDBC_SQLTYPE_CHE           :{
+            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+            paramlen = SQLDBC_ParameterMetaData_getPhysicalLength 
(imp_sth->m_paramMetadata, index);
+           parameter->chopBlanks = SQLDBC_TRUE;
+           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 +2292,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-19 13:21:41.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;
 
 /*
@@ -90,7 +91,7 @@
     char* buf;                  /*!< offset pointer to internal buffer */
     SQLDBC_Length   bufLen;     /*!< maximum length of buffer within the 
result */
     SQLDBC_HostType hostType;   /*!< column datatyp */
-    SQLDBC_Length   indicator;  /*!< coulumn indicator */
+    SQLDBC_Length   indicator;  /*!< column indicator */
     SQLDBC_Bool     chopBlanks; /*!< flag that indicates whether the column is 
relevant for cutoff blanks*/
 } dbd_maxdb_bind_column;
 
-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to