@@ -780,8 +780,9 @@ PHP_MINIT_FUNCTION(odbc)
780
780
REGISTER_LONG_CONSTANT ("SQL_TYPE_DATE" , SQL_TYPE_DATE , CONST_PERSISTENT | CONST_CS );
781
781
REGISTER_LONG_CONSTANT ("SQL_TYPE_TIME" , SQL_TYPE_TIME , CONST_PERSISTENT | CONST_CS );
782
782
REGISTER_LONG_CONSTANT ("SQL_TYPE_TIMESTAMP" , SQL_TYPE_TIMESTAMP , CONST_PERSISTENT | CONST_CS );
783
- REGISTER_LONG_CONSTANT ("SQL_TYPE_WVARCHAR" , SQL_TYPE_WVARCHAR , CONST_PERSISTENT | CONST_CS );
784
- REGISTER_LONG_CONSTANT ("SQL_TYPE_WLONGVARCHAR" , SQL_TYPE_WLONGVARCHAR , CONST_PERSISTENT | CONST_CS );
783
+ REGISTER_LONG_CONSTANT ("SQL_WCHAR" , SQL_WCHAR , CONST_PERSISTENT | CONST_CS );
784
+ REGISTER_LONG_CONSTANT ("SQL_WVARCHAR" , SQL_WVARCHAR , CONST_PERSISTENT | CONST_CS );
785
+ REGISTER_LONG_CONSTANT ("SQL_WLONGVARCHAR" , SQL_WLONGVARCHAR , CONST_PERSISTENT | CONST_CS );
785
786
786
787
/*
787
788
* SQLSpecialColumns values
@@ -945,9 +946,13 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
945
946
{
946
947
RETCODE rc ;
947
948
int i ;
948
- SQLSMALLINT colnamelen ; /* Not used */
949
- SQLLEN displaysize ;
949
+ SQLSMALLINT colnamelen ; /* Not used */
950
+ SQLLEN displaysize ;
951
+ SQLUSMALLINT colfieldid ;
952
+ int charextraalloc ;
950
953
954
+ colfieldid = SQL_COLUMN_DISPLAY_SIZE ;
955
+ charextraalloc = 0 ;
951
956
result -> values = (odbc_result_value * ) safe_emalloc (sizeof (odbc_result_value ), result -> numcols , 0 );
952
957
953
958
result -> longreadlen = ODBCG (defaultlrl );
@@ -968,8 +973,9 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
968
973
case SQL_VARBINARY :
969
974
case SQL_LONGVARBINARY :
970
975
case SQL_LONGVARCHAR :
971
- case SQL_WVARCHAR :
976
+ #if defined( ODBCVER ) && ( ODBCVER >= 0x0300 )
972
977
case SQL_WLONGVARCHAR :
978
+ #endif
973
979
result -> values [i ].value = NULL ;
974
980
break ;
975
981
@@ -980,15 +986,27 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
980
986
27 , & result -> values [i ].vallen );
981
987
break ;
982
988
#endif /* HAVE_ADABAS */
989
+ case SQL_CHAR :
990
+ case SQL_VARCHAR :
991
+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
992
+ case SQL_WCHAR :
993
+ case SQL_WVARCHAR :
994
+ colfieldid = SQL_DESC_OCTET_LENGTH ;
995
+ #else
996
+ charextraalloc = 1 ;
997
+ #endif
983
998
default :
984
- rc = SQLColAttributes (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_COLUMN_DISPLAY_SIZE ,
985
- NULL , 0 , NULL , & displaysize );
986
- displaysize = displaysize <= result -> longreadlen ? displaysize :
987
- result -> longreadlen ;
999
+ rc = SQLColAttributes (result -> stmt , (SQLUSMALLINT )(i + 1 ), colfieldid ,
1000
+ NULL , 0 , NULL , & displaysize );
988
1001
/* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */
989
1002
if (result -> values [i ].coltype == SQL_TIMESTAMP ) {
990
1003
displaysize += 3 ;
991
1004
}
1005
+
1006
+ if (charextraalloc ) {
1007
+ /* Since we don't know the exact # of bytes, allocate extra */
1008
+ displaysize *= 4 ;
1009
+ }
992
1010
result -> values [i ].value = (char * )emalloc (displaysize + 1 );
993
1011
rc = SQLBindCol (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_C_CHAR , result -> values [i ].value ,
994
1012
displaysize + 1 , & result -> values [i ].vallen );
@@ -1728,9 +1746,10 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
1728
1746
if (result -> binmode == 1 ) {
1729
1747
sql_c_type = SQL_C_BINARY ;
1730
1748
}
1731
- case SQL_WVARCHAR :
1732
- case SQL_WLONGVARCHAR :
1733
1749
case SQL_LONGVARCHAR :
1750
+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
1751
+ case SQL_WLONGVARCHAR :
1752
+ #endif
1734
1753
if (IS_SQL_LONG (result -> values [i ].coltype ) && result -> longreadlen <= 0 ) {
1735
1754
Z_STRVAL_P (tmp ) = STR_EMPTY_ALLOC ();
1736
1755
break ;
@@ -1882,9 +1901,11 @@ PHP_FUNCTION(odbc_fetch_into)
1882
1901
break ;
1883
1902
}
1884
1903
if (result -> binmode == 1 ) sql_c_type = SQL_C_BINARY ;
1885
- case SQL_WVARCHAR :
1886
- case SQL_WLONGVARCHAR :
1904
+
1887
1905
case SQL_LONGVARCHAR :
1906
+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
1907
+ case SQL_WLONGVARCHAR :
1908
+ #endif
1888
1909
if (IS_SQL_LONG (result -> values [i ].coltype ) && result -> longreadlen <= 0 ) {
1889
1910
Z_STRVAL_P (tmp ) = STR_EMPTY_ALLOC ();
1890
1911
break ;
@@ -2103,8 +2124,9 @@ PHP_FUNCTION(odbc_result)
2103
2124
break ;
2104
2125
}
2105
2126
case SQL_LONGVARCHAR :
2106
- case SQL_WVARCHAR :
2127
+ #if defined( ODBCVER ) && ( ODBCVER >= 0x0300 )
2107
2128
case SQL_WLONGVARCHAR :
2129
+ #endif
2108
2130
if (IS_SQL_LONG (result -> values [field_ind ].coltype )) {
2109
2131
if (result -> longreadlen <= 0 ) {
2110
2132
break ;
@@ -2142,9 +2164,11 @@ PHP_FUNCTION(odbc_result)
2142
2164
}
2143
2165
/* Reduce fieldlen by 1 if we have char data. One day we might
2144
2166
have binary strings... */
2145
- if ((result -> values [field_ind ].coltype == SQL_LONGVARCHAR ) ||
2146
- (result -> values [field_ind ].coltype == SQL_WVARCHAR ) ||
2147
- (result -> values [field_ind ].coltype == SQL_WLONGVARCHAR )) {
2167
+ if ((result -> values [field_ind ].coltype == SQL_LONGVARCHAR )
2168
+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
2169
+ || (result -> values [field_ind ].coltype == SQL_WLONGVARCHAR )
2170
+ #endif
2171
+ ) {
2148
2172
fieldsize -= 1 ;
2149
2173
}
2150
2174
/* Don't duplicate result, saves one emalloc.
@@ -2259,9 +2283,10 @@ PHP_FUNCTION(odbc_result_all)
2259
2283
break ;
2260
2284
}
2261
2285
if (result -> binmode <= 1 ) sql_c_type = SQL_C_BINARY ;
2262
- case SQL_WVARCHAR :
2263
- case SQL_WLONGVARCHAR :
2264
2286
case SQL_LONGVARCHAR :
2287
+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
2288
+ case SQL_WLONGVARCHAR :
2289
+ #endif
2265
2290
if (IS_SQL_LONG (result -> values [i ].coltype ) &&
2266
2291
result -> longreadlen <= 0 ) {
2267
2292
php_printf ("<td>Not printable</td>" );
0 commit comments