OSEC

Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com
 
RE: DBD::MaxDB and Unicode-Data

From: Alexey Gaidukov (gaiddc.baikal.ru)
Date: Fri Sep 16 2005 - 03:50:01 CDT


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