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]