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]