New version of the patch.
I found and fixed two problems with unicode. And now it's possible to
get ResultSet from callable statements.
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-13 15:31:08.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;
}
@@ -1788,7 +1793,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 +1841,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 +1890,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 +1915,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 +2183,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 :
@@ -2218,7 +2228,7 @@
case SQLDBC_SQLTYPE_LONGE :
case SQLDBC_SQLTYPE_STRUNI :
case SQLDBC_SQLTYPE_LONGUNI : {
- parameter->hostType = SQLDBC_HOSTTYPE_ASCII;
+ parameter->hostType = SQLDBC_HOSTTYPE_UTF8;
paramlen = DBIc_LongReadLen(imp_sth);
break;
}
--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]