Skip to content

Commit d54134d

Browse files
committed
Promote warning to Error in ODBC extension
1 parent 3854234 commit d54134d

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

ext/odbc/php_odbc.c

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,11 @@ void odbc_column_lengths(INTERNAL_FUNCTION_PARAMETERS, int type)
787787
RETURN_THROWS();
788788
}
789789

790+
if (pv_num < 1) {
791+
zend_argument_value_error(2, "must be greater than or equal to 1");
792+
RETURN_THROWS();
793+
}
794+
790795
if (result->numcols == 0) {
791796
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
792797
RETURN_FALSE;
@@ -797,11 +802,6 @@ void odbc_column_lengths(INTERNAL_FUNCTION_PARAMETERS, int type)
797802
RETURN_FALSE;
798803
}
799804

800-
if (pv_num < 1) {
801-
php_error_docref(NULL, E_WARNING, "Field numbering starts at 1");
802-
RETURN_FALSE;
803-
}
804-
805805
PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)pv_num, (SQLUSMALLINT) (type?SQL_COLUMN_SCALE:SQL_COLUMN_PRECISION), NULL, 0, NULL, &len);
806806

807807
RETURN_LONG(len);
@@ -963,7 +963,8 @@ PHP_FUNCTION(odbc_prepare)
963963
/* {{{ Execute a prepared statement */
964964
PHP_FUNCTION(odbc_execute)
965965
{
966-
zval *pv_res, *pv_param_arr, *tmp;
966+
zval *pv_res, *tmp;
967+
HashTable *pv_param_ht;
967968
typedef struct params_t {
968969
SQLLEN vallen;
969970
int fp;
@@ -976,7 +977,7 @@ PHP_FUNCTION(odbc_execute)
976977
int numArgs = ZEND_NUM_ARGS(), i, ne;
977978
RETCODE rc;
978979

979-
if (zend_parse_parameters(numArgs, "r|a", &pv_res, &pv_param_arr) == FAILURE) {
980+
if (zend_parse_parameters(numArgs, "r|h", &pv_res, &pv_param_ht) == FAILURE) {
980981
RETURN_THROWS();
981982
}
982983

@@ -991,19 +992,19 @@ PHP_FUNCTION(odbc_execute)
991992
}
992993

993994
if (result->numparams > 0) {
994-
if ((ne = zend_hash_num_elements(Z_ARRVAL_P(pv_param_arr))) < result->numparams) {
995+
if ((ne = zend_hash_num_elements(pv_param_ht)) < result->numparams) {
995996
php_error_docref(NULL, E_WARNING,"Not enough parameters (%d should be %d) given", ne, result->numparams);
996997
RETURN_FALSE;
997998
}
998999

999-
zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
1000+
zend_hash_internal_pointer_reset(pv_param_ht);
10001001
params = (params_t *)safe_emalloc(sizeof(params_t), result->numparams, 0);
10011002
for(i = 0; i < result->numparams; i++) {
10021003
params[i].fp = -1;
10031004
}
10041005

10051006
for(i = 1; i <= result->numparams; i++) {
1006-
if ((tmp = zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr))) == NULL) {
1007+
if ((tmp = zend_hash_get_current_data(pv_param_ht)) == NULL) {
10071008
php_error_docref(NULL, E_WARNING,"Error getting parameter");
10081009
SQLFreeStmt(result->stmt,SQL_RESET_PARAMS);
10091010
for (i = 0; i < result->numparams; i++) {
@@ -1104,7 +1105,7 @@ PHP_FUNCTION(odbc_execute)
11041105
efree(params);
11051106
RETURN_FALSE;
11061107
}
1107-
zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
1108+
zend_hash_move_forward(pv_param_ht);
11081109
}
11091110
}
11101111
/* Close cursor, needed for doing multiple selects */
@@ -1246,8 +1247,8 @@ PHP_FUNCTION(odbc_data_source)
12461247
fetch_type = (SQLSMALLINT) zv_fetch_type;
12471248

12481249
if (!(fetch_type == SQL_FETCH_FIRST || fetch_type == SQL_FETCH_NEXT)) {
1249-
php_error_docref(NULL, E_WARNING, "Invalid fetch type (%d)", fetch_type);
1250-
RETURN_FALSE;
1250+
zend_argument_value_error(2, "must be SQL_FETCH_FIRST or SQL_FETCH_NEXT");
1251+
RETURN_THROWS()
12511252
}
12521253

12531254
if (!(conn = (odbc_connection *)zend_fetch_resource2(Z_RES_P(zv_conn), "ODBC-Link", le_conn, le_pconn))) {
@@ -2209,8 +2210,9 @@ void odbc_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
22092210
cur_opt == SQL_CUR_USE_ODBC ||
22102211
cur_opt == SQL_CUR_USE_DRIVER ||
22112212
cur_opt == SQL_CUR_DEFAULT) ) {
2212-
php_error_docref(NULL, E_WARNING, "Invalid Cursor type (%d)", cur_opt);
2213-
RETURN_FALSE;
2213+
zend_argument_value_error(4, "must be one of SQL_CUR_USE_IF_NEEDED, "
2214+
"SQL_CUR_USE_ODBC, or SQL_CUR_USE_DRIVER");
2215+
RETURN_THROWS();
22142216
}
22152217
}
22162218

@@ -2483,6 +2485,11 @@ PHP_FUNCTION(odbc_field_name)
24832485
RETURN_THROWS();
24842486
}
24852487

2488+
if (pv_num < 1) {
2489+
zend_argument_value_error(2, "must be greater than or equal to 1");
2490+
RETURN_THROWS();
2491+
}
2492+
24862493
if (result->numcols == 0) {
24872494
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
24882495
RETURN_FALSE;
@@ -2493,11 +2500,6 @@ PHP_FUNCTION(odbc_field_name)
24932500
RETURN_FALSE;
24942501
}
24952502

2496-
if (pv_num < 1) {
2497-
php_error_docref(NULL, E_WARNING, "Field numbering starts at 1");
2498-
RETURN_FALSE;
2499-
}
2500-
25012503
RETURN_STRING(result->values[pv_num - 1].name);
25022504
}
25032505
/* }}} */
@@ -2519,6 +2521,11 @@ PHP_FUNCTION(odbc_field_type)
25192521
RETURN_THROWS();
25202522
}
25212523

2524+
if (pv_num < 1) {
2525+
zend_argument_value_error(2, "must be greater than or equal to 1");
2526+
RETURN_THROWS();
2527+
}
2528+
25222529
if (result->numcols == 0) {
25232530
php_error_docref(NULL, E_WARNING, "No tuples available at this result index");
25242531
RETURN_FALSE;
@@ -2529,11 +2536,6 @@ PHP_FUNCTION(odbc_field_type)
25292536
RETURN_FALSE;
25302537
}
25312538

2532-
if (pv_num < 1) {
2533-
php_error_docref(NULL, E_WARNING, "Field numbering starts at 1");
2534-
RETURN_FALSE;
2535-
}
2536-
25372539
PHP_ODBC_SQLCOLATTRIBUTE(result->stmt, (SQLUSMALLINT)pv_num, SQL_COLUMN_TYPE_NAME, tmp, 31, &tmplen, NULL);
25382540
RETURN_STRING(tmp);
25392541
}
@@ -2733,9 +2735,8 @@ PHP_FUNCTION(odbc_setoption)
27332735
}
27342736
break;
27352737
default:
2736-
php_error_docref(NULL, E_WARNING, "Unknown option type");
2737-
RETURN_FALSE;
2738-
break;
2738+
zend_argument_value_error(2, "must be 1 for SQLSetConnectOption(), or 2 for SQLSetStmtOption()");
2739+
RETURN_THROWS();
27392740
}
27402741

27412742
RETURN_TRUE;

ext/odbc/tests/odbc_data_source_001.phpt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ include 'config.inc';
1414

1515
$conn = odbc_connect($dsn, $user, $pass);
1616

17-
var_dump(odbc_data_source($conn, NULL));
17+
try {
18+
var_dump(odbc_data_source($conn, NULL));
19+
} catch (\ValueError $e) {
20+
echo $e->getMessage() . \PHP_EOL;
21+
}
1822
var_dump(odbc_data_source($conn, SQL_FETCH_FIRST));
1923

2024
?>
2125
--EXPECTF--
22-
Warning: odbc_data_source(): Invalid fetch type (0) in %s on line %d
26+
odbc_data_source(): Argument #2 ($fetch_type) must be SQL_FETCH_FIRST or SQL_FETCH_NEXT
2327
bool(false)
2428
array(%d) {
2529
%a

0 commit comments

Comments
 (0)