Hi Sven,

This is bug in my patch. I made mistake because in my testcase I have binmode(STDOUT, ":utf8") so I get double UTF8 encoded string in my screen. In new version of the patch I added SvUTF8_on command for column names, table names and cursor names. I tested only column names but in case of table and cursor names code is the same.

When I tested I found a bug in perl-DBI-1.50.

In the simple testcase

       while($hash_ref = $dep_sth->fetchrow_hashref) {
               foreach my $key (keys(%$hash_ref)) {
                       print "(".utf8::is_utf8($key).") ".$key."\n";
               }
               print "\n";
               foreach my $value (values(%$hash_ref)) {
                       print "(".utf8::is_utf8($value).") ".$value."\n";
               }
       }

I found that keys from fetchrow_hashref are always with turned off SvUTF8. The reason was using

SV**    hv_store(HV* tb, const char* key, I32 klen, SV* val, U32 hash)


to put values into a hash in fetchrow_hashref function in DBI.xs. As you can see key is char* type. It is correct to use hv_store_ent.

I think you are the first how uses UTF8 column names in DBI :).





Sven Köhler пишет:

Sorry, i cannot agree to what you said.
I had the UTF8-bytes on my screen! The names were UTF8 - but they were
octet-string, the utf8-flag was not turned on.

For my tests, i was using a unicode-database. That mean the _UNICODE
parameter was set to yes, when i created the database.


diff -uNr DBI-1.48-orig/DBI.xs DBI-1.48/DBI.xs
--- DBI-1.48-orig/DBI.xs        2005-01-20 19:06:28.000000000 +0800
+++ DBI-1.48/DBI.xs     2006-02-27 17:25:53.000000000 +0800
@@ -3928,10 +3928,8 @@
        ka_av = (AV*)SvRV(ka_rv);
        hv    = newHV();
        for (i=0; i < num_fields; ++i) {        /* honor the original order as 
sent by the database */
-           STRLEN len;
            SV  **field_name_svp = av_fetch(ka_av, i, 1);
-           char *field_name     = SvPV(*field_name_svp, len);
-           hv_store(hv, field_name, len, newSVsv((SV*)(AvARRAY(rowav)[i])), 0);
+           hv_store_ent(hv, newSVsv(*field_name_svp), 
newSVsv((SV*)(AvARRAY(rowav)[i])), 0);
        }
        RETVAL = newRV((SV*)hv);
        SvREFCNT_dec(hv);       /* since newRV incremented it   */
diff -uNr DBD-MaxDB-7.6.00.16.origin/dbdimp.c DBD-MaxDB-7.6.00.16/dbdimp.c
--- DBD-MaxDB-7.6.00.16.origin/dbdimp.c 2005-10-13 03:19:49.000000000 +0900
+++ DBD-MaxDB-7.6.00.16/dbdimp.c        2006-02-27 18:12:36.000000000 +0800
@@ -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 SV* referenceDefaultValue  = NULL;
@@ -317,12 +319,14 @@
 }
 
 static void dbd_maxdb_error(SV* h, SQLDBC_Int4 errnum, char* errmsg, char* 
sqlstate) {
+    int i = 0;
     D_imp_xxh(h);
 
     sv_setiv(DBIc_ERR   (imp_xxh), (IV)errnum); 
     sv_setpv(DBIc_ERRSTR(imp_xxh), errmsg);
     sv_setpv(DBIc_STATE (imp_xxh), sqlstate);
-    
+    SvUTF8_on(DBIc_ERRSTR(imp_xxh));
+
     if (DBIc_DBISTATE(imp_xxh)->debug >= 2)
       PerlIO_printf(DBIc_LOGPIO(imp_xxh), "%d %s [%s]\n",
                     errnum, errmsg, sqlstate);
@@ -353,7 +357,7 @@
  *           been called in the latter case
  *
  **************************************************************************/
-static SQLDBC_DatabaseMetaData myDBMS={69,34,34}; /*magic numbers from 
gsp00.h*/
+static SQLDBC_DatabaseMetaData myDBMS={69*2,34*2,34*2}; /*magic numbers from 
gsp00.h*/
 static SQLDBC_DatabaseMetaData* 
SQLDBC_Connection_getMetaData(SQLDBC_Connection* hdl){
   return &myDBMS;
 }
@@ -479,11 +483,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); 
@@ -973,7 +978,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);  
@@ -1035,7 +1040,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); 
   }
@@ -1049,12 +1054,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); 
 }
@@ -1135,7 +1134,7 @@
                                                 terminate) != SQLDBC_OK) {
       dbd_maxdb_sqldbc_error(sth, 
SQLDBC_PreparedStatement_getError(imp_sth->m_prepstmt));
       DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_sqldbc_bind_parameters, 
SQLDBC_FALSE); 
-    }       
+    }
   } 
   DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_sqldbc_bind_parameters, 
SQLDBC_TRUE); 
 }
@@ -1207,6 +1206,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;
@@ -1239,7 +1243,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;
         } 
@@ -1255,7 +1264,7 @@
      } 
      collen++;
      allColumnsLength += ALIGN(collen);
-  }     
+  }
   
   /*alloc fetch buffer*/
   Newz(101, imp_sth->m_fetchBuf, allColumnsLength, char);
@@ -1290,9 +1299,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; 
         }
 
@@ -1304,9 +1318,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;
@@ -1326,7 +1342,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;
         }
@@ -1357,9 +1373,9 @@
   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); 
-
   if (DBIc_ACTIVE(imp_sth)) {
     dbd_st_finish(sth, imp_sth);
   }
@@ -1368,31 +1384,28 @@
     dbd_maxdb_internal_error(sth, DBD_ERR_STATEMENT_NOT_PREPARED);
     DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
   } 
-
   if (! dbd_maxdb_sqldbc_bind_parameters (sth, imp_sth)){
     DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
   }
-  
-  exec_rc = SQLDBC_PreparedStatement_executeASCII (imp_sth->m_prepstmt); 
+  exec_rc = SQLDBC_PreparedStatement_executeASCII(imp_sth->m_prepstmt); 
+  imp_sth->m_rowNotFound= SQLDBC_FALSE;
   if ( exec_rc != SQLDBC_OK && exec_rc != SQLDBC_NO_DATA_FOUND) {
     dbd_maxdb_sqldbc_error(sth, 
SQLDBC_PreparedStatement_getError(imp_sth->m_prepstmt)) ;
     DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
   }
-  
   if (SQLDBC_PreparedStatement_isQuery (imp_sth->m_prepstmt)) {
     imp_sth->m_resultset = SQLDBC_PreparedStatement_getResultSet  
(imp_sth->m_prepstmt);
     if (!imp_sth->m_resultset) {
       dbd_maxdb_sqldbc_error(sth, 
SQLDBC_PreparedStatement_getError(imp_sth->m_prepstmt)) ;
       DBD_MAXDB_METHOD_RETURN(imp_sth, dbd_maxdb_st_execute, 
DBD_MAXDB_ERROR_RETVAL); 
     }
-    if (!imp_sth->m_rsmd){
-      imp_sth->m_rsmd = 
SQLDBC_PreparedStatement_getResultSetMetaData(imp_sth->m_prepstmt);
-      if (!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_execute, 
DBD_MAXDB_ERROR_RETVAL); 
-      }
+    imp_sth->m_rsmd = 
SQLDBC_ResultSet_getResultSetMetaData(imp_sth->m_resultset);
+    if (!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_execute, 
DBD_MAXDB_ERROR_RETVAL);
     }
-    DBIc_NUM_FIELDS(imp_sth) = SQLDBC_ResultSetMetaData_getColumnCount 
(imp_sth->m_rsmd);
+    if (DBIc_NUM_FIELDS(imp_sth) < 0)
+      DBIc_NUM_FIELDS(imp_sth) = SQLDBC_ResultSetMetaData_getColumnCount 
(imp_sth->m_rsmd);
     
     if (exec_rc == SQLDBC_NO_DATA_FOUND){
       imp_sth->m_rowNotFound= SQLDBC_TRUE;
@@ -1404,7 +1417,6 @@
     }
     
     DBIc_ACTIVE_on(imp_sth);
-    
   } else {
     if (imp_sth->m_hasOutValues= SQLDBC_TRUE){
       /*handling out parameters*/
@@ -1426,7 +1438,6 @@
            buf = SvPV(m_param->value, bufLen);
            bufLen = SvLEN(m_param->value);
            
-          
            switch(m_param->hostType) {
               case SQLDBC_HOSTTYPE_INT1:{
                 *buf += 48;
@@ -1434,17 +1445,32 @@
                 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 == SQLDBC_NTS) {
+                  m_param->indicator = 0;
+                   while (m_param->indicator < (SQLDBC_Length)bufLen && 
buf[m_param->indicator]!=0)  
+                     ++m_param->indicator;
+               }
+               else 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_fetch, 
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;
               }
            }
-           
+           if (m_param->hostType == SQLDBC_HOSTTYPE_UTF8) {
+               SvUTF8_on(m_param->value);
+          }
 
            SvCUR_set(m_param->value, (STRLEN) m_param->indicator); 
            *SvEND(m_param->value) = '\0';
@@ -1509,7 +1535,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); 
@@ -1521,23 +1547,32 @@
   for (colIndex = 0; colIndex < colcnt; ++colIndex) {
     dbd_maxdb_bind_column *m_col = &imp_sth->m_cols[colIndex];
     SV *sv = AvARRAY(av)[colIndex];
+    char *buf = m_col->buf;
     
     if (m_col->indicator == SQLDBC_NULL_DATA) {
       SvOK_off(sv);
       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 == SQLDBC_NTS) {
+       m_col->indicator = 0;
+       while (m_col->indicator < m_col->bufLen && buf[m_col->indicator+1]!=0)  
+          ++m_col->indicator;
+    }
+    else 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;
     }
@@ -1545,13 +1580,18 @@
       case SQLDBC_HOSTTYPE_INT1:{
         sv_setiv(sv, (int)*(m_col->buf));
         break;
-      }  
+      }
+      case SQLDBC_HOSTTYPE_UTF8: {
+        sv_setpvn(sv, m_col->buf, m_col->indicator);
+       SvUTF8_on(sv);
+        break;
+      }
       default:{
         sv_setpvn(sv, m_col->buf, m_col->indicator);
         break;
       }
     }
-    m_col->indicator = 0;
+    m_col->indicator = SQLDBC_NTS;
   }
   DBD_MAXDB_METHOD_RETURN_AV(imp_sth, dbd_maxdb_st_fetch, av); 
 }
@@ -1810,7 +1850,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;
           }
@@ -1858,12 +1898,14 @@
         if( SQLDBC_PreparedStatement_getCursorName (
                           imp_sth->m_prepstmt, 
                           cname, 
-                          SQLDBC_StringEncodingType_Encoding_Ascii, 
+                          SQLDBC_StringEncodingType_Encoding_UTF8, 
                           cnameLen, 
                           &bufferLength) != SQLDBC_OK){
                break;
         }
-        result = sv_2mortal(newSVpv(cname, bufferLength));
+       SV *sv = newSVpv(cname, bufferLength);
+        SvUTF8_on(sv);
+        result = sv_2mortal(sv);
         break;
       }
       case sth_maxdb_option_FetchSize:{
@@ -1907,7 +1949,7 @@
         if( SQLDBC_PreparedStatement_getTableName( 
                           imp_sth->m_prepstmt,
                           cname,  
-                          SQLDBC_StringEncodingType_Encoding_Ascii, 
+                          SQLDBC_StringEncodingType_Encoding_UTF8, 
                           cnameLen, 
                           &bufferLength) != SQLDBC_OK){
              break;
@@ -1915,7 +1957,9 @@
         if (!*cname){
           result=&PL_sv_undef;
         } else {
-          result = sv_2mortal(newSVpv(cname, bufferLength));
+         SV *sv = newSVpv(cname, bufferLength);
+          SvUTF8_on(sv);
+          result = sv_2mortal(sv);
         }
         break;
       }
@@ -1925,6 +1969,7 @@
         SQLDBC_Int2 i, colcnt = SQLDBC_ResultSetMetaData_getColumnCount 
(imp_sth->m_rsmd); 
         SQLDBC_Length colnamelen;
         AV *av = newAV();
+       SV *sv;
         SQLDBC_Int2 cnameLen = imp_dbh->m_dbmd->getMaxColumnnameLength +1;
         char *cname = (char*) alloca(cnameLen); 
         result = newRV(sv_2mortal((SV*)av));
@@ -1932,7 +1977,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);
@@ -1943,13 +1988,13 @@
             PerlIO_flush(DBIc_LOGPIO(imp_sth));
           }
           if (opt == sth_maxdb_option_ColNames_lc){
-            int k;
-            for (k=0; k < colnamelen; k++) cname[k]= tolower(cname[k]);
+            cname = g_utf8_strdown(cname, colnamelen+1);
           }else if (opt == sth_maxdb_option_ColNames_uc){
-            int k;
-            for (k=0; k < colnamelen; k++) cname[k]= toupper(cname[k]);        
  
+            cname = g_utf8_strup(cname, colnamelen+1);
           }  
-          av_store(av, i-1, newSVpv(cname, colnamelen));
+         sv = newSVpv(cname, colnamelen);
+          SvUTF8_on(sv);
+          av_store(av, i-1, sv);
         }
         break;
       }
@@ -2034,13 +2079,16 @@
     }  /*end switch*/
   }  
 
+printf("-------\n");
   if (DBIc_DBISTATE(imp_sth)->debug >= 2)
       PerlIO_printf(DBIc_LOGPIO(imp_sth), "      <- dbd_maxdb_st_FETCH_attrib 
%s => %s \n",
-      key,  (result == 
NULL)?"NULL":(result==&PL_sv_undef)?"UNDEF":SvPV(result,kl));
+      key, (result == 
NULL)?"NULL":(result==&PL_sv_undef)?"UNDEF":SvPV(result,kl));
 
   if (result == NULL) {
     return Nullsv;
   }
+  SV* sv = SvPV(result,kl);
+  SvUTF8_on(sv);
   return result;
 }
 
@@ -2185,7 +2233,7 @@
    }
 
    parameter = &imp_sth->m_bindParms[index-1];
-   parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+   parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
    if (sql_type) parameter->sqltype = sql_type;
 
    if (parameter->value) (void) SvREFCNT_dec(parameter->value);
@@ -2199,6 +2247,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           :
@@ -2229,7 +2282,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         : 
@@ -2238,11 +2292,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      :
@@ -2263,7 +2335,8 @@
             break;
           } 
           default : {
-            paramlen = SQLDBC_ParameterMetaData_getParameterLength 
(imp_sth->m_paramMetadata, index);
+            parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+            paramlen = SQLDBC_ParameterMetaData_getColumnLength 
(imp_sth->m_paramMetadata, index);
             break;
           }
          }
diff -uNr DBD-MaxDB-7.6.00.16.origin/dbdimp.h DBD-MaxDB-7.6.00.16/dbdimp.h
--- DBD-MaxDB-7.6.00.16.origin/dbdimp.h 2005-10-13 03:19:49.000000000 +0900
+++ DBD-MaxDB-7.6.00.16/dbdimp.h        2005-11-14 12:19:57.000000000 +0800
@@ -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*/
     ParameterMode paramMode; /*!< indicator value */
 } dbd_maxdb_bind_param;
 
@@ -91,7 +92,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.6.00.16.origin/Makefile.PL DBD-MaxDB-7.6.00.16/Makefile.PL
--- DBD-MaxDB-7.6.00.16.origin/Makefile.PL      2005-10-13 03:19:49.000000000 
+0900
+++ DBD-MaxDB-7.6.00.16/Makefile.PL     2006-02-27 18:12:06.000000000 +0800
@@ -148,7 +148,7 @@
 $opts{INC} .= " -q64 -qcpluscmt -qsuppress=1506-234 -DBIT64";
 }
 if ($^O ne 'MSWin32') {
-  $opts{LIBS} .= ' -L'.$SQLDBC_slPath.' -lSQLDBC_C -ldl';
+  $opts{LIBS} .= ' -L'.$SQLDBC_slPath.' -lSQLDBC_C -ldl -lglib-2.0';
 } else {
   $opts{LIBS} .= ' '.$SQLDBC_lib;
 }
diff -uNr DBD-MaxDB-7.6.00.16.origin/price.xml DBD-MaxDB-7.6.00.16/price.xml
--- DBD-MaxDB-7.6.00.16.origin/price.xml        1970-01-01 08:00:00.000000000 
+0800
+++ DBD-MaxDB-7.6.00.16/price.xml       2006-02-27 12:16:01.000000000 +0800
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pricelist generated='27.2.2006 12:16:1' for='27.2.2006'>
-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to