@@ -780,8 +780,9 @@ PHP_MINIT_FUNCTION(odbc)
780780 REGISTER_LONG_CONSTANT ("SQL_TYPE_DATE" , SQL_TYPE_DATE , CONST_PERSISTENT | CONST_CS );
781781 REGISTER_LONG_CONSTANT ("SQL_TYPE_TIME" , SQL_TYPE_TIME , CONST_PERSISTENT | CONST_CS );
782782 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 );
785786
786787 /*
787788 * SQLSpecialColumns values
@@ -945,9 +946,13 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
945946{
946947 RETCODE rc ;
947948 int i ;
948- SQLSMALLINT colnamelen ; /* Not used */
949- SQLLEN displaysize ;
949+ SQLSMALLINT colnamelen ; /* Not used */
950+ SQLLEN displaysize ;
951+ SQLUSMALLINT colfieldid ;
952+ int charextraalloc ;
950953
954+ colfieldid = SQL_COLUMN_DISPLAY_SIZE ;
955+ charextraalloc = 0 ;
951956 result -> values = (odbc_result_value * ) safe_emalloc (sizeof (odbc_result_value ), result -> numcols , 0 );
952957
953958 result -> longreadlen = ODBCG (defaultlrl );
@@ -968,8 +973,9 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
968973 case SQL_VARBINARY :
969974 case SQL_LONGVARBINARY :
970975 case SQL_LONGVARCHAR :
971- case SQL_WVARCHAR :
976+ #if defined( ODBCVER ) && ( ODBCVER >= 0x0300 )
972977 case SQL_WLONGVARCHAR :
978+ #endif
973979 result -> values [i ].value = NULL ;
974980 break ;
975981
@@ -980,15 +986,27 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
980986 27 , & result -> values [i ].vallen );
981987 break ;
982988#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
983998 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 );
9881001 /* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */
9891002 if (result -> values [i ].coltype == SQL_TIMESTAMP ) {
9901003 displaysize += 3 ;
9911004 }
1005+
1006+ if (charextraalloc ) {
1007+ /* Since we don't know the exact # of bytes, allocate extra */
1008+ displaysize *= 4 ;
1009+ }
9921010 result -> values [i ].value = (char * )emalloc (displaysize + 1 );
9931011 rc = SQLBindCol (result -> stmt , (SQLUSMALLINT )(i + 1 ), SQL_C_CHAR , result -> values [i ].value ,
9941012 displaysize + 1 , & result -> values [i ].vallen );
@@ -1728,9 +1746,10 @@ static void php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type)
17281746 if (result -> binmode == 1 ) {
17291747 sql_c_type = SQL_C_BINARY ;
17301748 }
1731- case SQL_WVARCHAR :
1732- case SQL_WLONGVARCHAR :
17331749 case SQL_LONGVARCHAR :
1750+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
1751+ case SQL_WLONGVARCHAR :
1752+ #endif
17341753 if (IS_SQL_LONG (result -> values [i ].coltype ) && result -> longreadlen <= 0 ) {
17351754 Z_STRVAL_P (tmp ) = STR_EMPTY_ALLOC ();
17361755 break ;
@@ -1882,9 +1901,11 @@ PHP_FUNCTION(odbc_fetch_into)
18821901 break ;
18831902 }
18841903 if (result -> binmode == 1 ) sql_c_type = SQL_C_BINARY ;
1885- case SQL_WVARCHAR :
1886- case SQL_WLONGVARCHAR :
1904+
18871905 case SQL_LONGVARCHAR :
1906+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
1907+ case SQL_WLONGVARCHAR :
1908+ #endif
18881909 if (IS_SQL_LONG (result -> values [i ].coltype ) && result -> longreadlen <= 0 ) {
18891910 Z_STRVAL_P (tmp ) = STR_EMPTY_ALLOC ();
18901911 break ;
@@ -2103,8 +2124,9 @@ PHP_FUNCTION(odbc_result)
21032124 break ;
21042125 }
21052126 case SQL_LONGVARCHAR :
2106- case SQL_WVARCHAR :
2127+ #if defined( ODBCVER ) && ( ODBCVER >= 0x0300 )
21072128 case SQL_WLONGVARCHAR :
2129+ #endif
21082130 if (IS_SQL_LONG (result -> values [field_ind ].coltype )) {
21092131 if (result -> longreadlen <= 0 ) {
21102132 break ;
@@ -2142,9 +2164,11 @@ PHP_FUNCTION(odbc_result)
21422164 }
21432165 /* Reduce fieldlen by 1 if we have char data. One day we might
21442166 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+ ) {
21482172 fieldsize -= 1 ;
21492173 }
21502174 /* Don't duplicate result, saves one emalloc.
@@ -2259,9 +2283,10 @@ PHP_FUNCTION(odbc_result_all)
22592283 break ;
22602284 }
22612285 if (result -> binmode <= 1 ) sql_c_type = SQL_C_BINARY ;
2262- case SQL_WVARCHAR :
2263- case SQL_WLONGVARCHAR :
22642286 case SQL_LONGVARCHAR :
2287+ #if defined(ODBCVER ) && (ODBCVER >= 0x0300 )
2288+ case SQL_WLONGVARCHAR :
2289+ #endif
22652290 if (IS_SQL_LONG (result -> values [i ].coltype ) &&
22662291 result -> longreadlen <= 0 ) {
22672292 php_printf ("<td>Not printable</td>" );
0 commit comments