Skip to content

Commit abd9f08

Browse files
BohwaZcmb69
authored andcommitted
SQLite3: Separating parameters binding in a function
1 parent 8f46f6d commit abd9f08

File tree

1 file changed

+107
-90
lines changed

1 file changed

+107
-90
lines changed

ext/sqlite3/sqlite3.c

Lines changed: 107 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,108 @@ PHP_METHOD(sqlite3stmt, readOnly)
13931393
}
13941394
/* }}} */
13951395

1396+
/* bind parameters to a statement before execution */
1397+
static int php_sqlite3_bind_params(php_sqlite3_stmt *stmt_obj) /* {{{ */
1398+
{
1399+
struct php_sqlite3_bound_param *param;
1400+
int return_code;
1401+
1402+
if (stmt_obj->bound_params) {
1403+
ZEND_HASH_FOREACH_PTR(stmt_obj->bound_params, param) {
1404+
zval *parameter;
1405+
/* parameter must be a reference? */
1406+
if (Z_ISREF(param->parameter)) {
1407+
parameter = Z_REFVAL(param->parameter);
1408+
} else {
1409+
parameter = &param->parameter;
1410+
}
1411+
1412+
/* If the ZVAL is null then it should be bound as that */
1413+
if (Z_TYPE_P(parameter) == IS_NULL) {
1414+
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1415+
if (return_code != SQLITE_OK) {
1416+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1417+
}
1418+
continue;
1419+
}
1420+
1421+
switch (param->type) {
1422+
case SQLITE_INTEGER:
1423+
convert_to_long(parameter);
1424+
#if ZEND_LONG_MAX > 2147483647
1425+
return_code = sqlite3_bind_int64(stmt_obj->stmt, param->param_number, Z_LVAL_P(parameter));
1426+
#else
1427+
return_code = sqlite3_bind_int(stmt_obj->stmt, param->param_number, Z_LVAL_P(parameter));
1428+
#endif
1429+
if (return_code != SQLITE_OK) {
1430+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1431+
}
1432+
break;
1433+
1434+
case SQLITE_FLOAT:
1435+
convert_to_double(parameter);
1436+
return_code = sqlite3_bind_double(stmt_obj->stmt, param->param_number, Z_DVAL_P(parameter));
1437+
if (return_code != SQLITE_OK) {
1438+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1439+
}
1440+
break;
1441+
1442+
case SQLITE_BLOB:
1443+
{
1444+
php_stream *stream = NULL;
1445+
zend_string *buffer = NULL;
1446+
if (Z_TYPE_P(parameter) == IS_RESOURCE) {
1447+
php_stream_from_zval_no_verify(stream, parameter);
1448+
if (stream == NULL) {
1449+
php_sqlite3_error(stmt_obj->db_obj, "Unable to read stream for parameter %ld", param->param_number);
1450+
return FAILURE;
1451+
}
1452+
buffer = php_stream_copy_to_mem(stream, PHP_STREAM_COPY_ALL, 0);
1453+
} else {
1454+
buffer = zval_get_string(parameter);
1455+
}
1456+
1457+
if (buffer) {
1458+
return_code = sqlite3_bind_blob(stmt_obj->stmt, param->param_number, ZSTR_VAL(buffer), ZSTR_LEN(buffer), SQLITE_TRANSIENT);
1459+
zend_string_release_ex(buffer, 0);
1460+
if (return_code != SQLITE_OK) {
1461+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1462+
}
1463+
} else {
1464+
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1465+
if (return_code != SQLITE_OK) {
1466+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1467+
}
1468+
}
1469+
break;
1470+
}
1471+
1472+
case SQLITE3_TEXT:
1473+
convert_to_string(parameter);
1474+
return_code = sqlite3_bind_text(stmt_obj->stmt, param->param_number, Z_STRVAL_P(parameter), Z_STRLEN_P(parameter), SQLITE_STATIC);
1475+
if (return_code != SQLITE_OK) {
1476+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1477+
}
1478+
break;
1479+
1480+
case SQLITE_NULL:
1481+
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1482+
if (return_code != SQLITE_OK) {
1483+
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1484+
}
1485+
break;
1486+
1487+
default:
1488+
php_sqlite3_error(stmt_obj->db_obj, "Unknown parameter type: %pd for parameter %pd", param->type, param->param_number);
1489+
return FAILURE;
1490+
}
1491+
} ZEND_HASH_FOREACH_END();
1492+
}
1493+
1494+
return SUCCESS;
1495+
}
1496+
/* }}} */
1497+
13961498
static int register_bound_parameter_to_sqlite(struct php_sqlite3_bound_param *param, php_sqlite3_stmt *stmt) /* {{{ */
13971499
{
13981500
HashTable *hash;
@@ -1548,7 +1650,7 @@ PHP_METHOD(sqlite3stmt, execute)
15481650
php_sqlite3_result *result;
15491651
zval *object = ZEND_THIS;
15501652
int return_code = 0;
1551-
struct php_sqlite3_bound_param *param;
1653+
int bind_rc = 0;
15521654

15531655
stmt_obj = Z_SQLITE3_STMT_P(object);
15541656

@@ -1561,96 +1663,11 @@ PHP_METHOD(sqlite3stmt, execute)
15611663
/* Always reset statement before execution, see bug #77051 */
15621664
sqlite3_reset(stmt_obj->stmt);
15631665

1564-
if (stmt_obj->bound_params) {
1565-
ZEND_HASH_FOREACH_PTR(stmt_obj->bound_params, param) {
1566-
zval *parameter;
1567-
/* parameter must be a reference? */
1568-
if (Z_ISREF(param->parameter)) {
1569-
parameter = Z_REFVAL(param->parameter);
1570-
} else {
1571-
parameter = &param->parameter;
1572-
}
1573-
1574-
/* If the ZVAL is null then it should be bound as that */
1575-
if (Z_TYPE_P(parameter) == IS_NULL) {
1576-
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1577-
if (return_code != SQLITE_OK) {
1578-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1579-
}
1580-
continue;
1581-
}
1666+
/* Bind parameters to the statement */
1667+
bind_rc = php_sqlite3_bind_params(stmt_obj);
15821668

1583-
switch (param->type) {
1584-
case SQLITE_INTEGER:
1585-
convert_to_long(parameter);
1586-
#if ZEND_LONG_MAX > 2147483647
1587-
return_code = sqlite3_bind_int64(stmt_obj->stmt, param->param_number, Z_LVAL_P(parameter));
1588-
#else
1589-
return_code = sqlite3_bind_int(stmt_obj->stmt, param->param_number, Z_LVAL_P(parameter));
1590-
#endif
1591-
if (return_code != SQLITE_OK) {
1592-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1593-
}
1594-
break;
1595-
1596-
case SQLITE_FLOAT:
1597-
convert_to_double(parameter);
1598-
return_code = sqlite3_bind_double(stmt_obj->stmt, param->param_number, Z_DVAL_P(parameter));
1599-
if (return_code != SQLITE_OK) {
1600-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1601-
}
1602-
break;
1603-
1604-
case SQLITE_BLOB:
1605-
{
1606-
php_stream *stream = NULL;
1607-
zend_string *buffer = NULL;
1608-
if (Z_TYPE_P(parameter) == IS_RESOURCE) {
1609-
php_stream_from_zval_no_verify(stream, parameter);
1610-
if (stream == NULL) {
1611-
php_sqlite3_error(stmt_obj->db_obj, "Unable to read stream for parameter %ld", param->param_number);
1612-
RETURN_FALSE;
1613-
}
1614-
buffer = php_stream_copy_to_mem(stream, PHP_STREAM_COPY_ALL, 0);
1615-
} else {
1616-
buffer = zval_get_string(parameter);
1617-
}
1618-
1619-
if (buffer) {
1620-
return_code = sqlite3_bind_blob(stmt_obj->stmt, param->param_number, ZSTR_VAL(buffer), ZSTR_LEN(buffer), SQLITE_TRANSIENT);
1621-
zend_string_release_ex(buffer, 0);
1622-
if (return_code != SQLITE_OK) {
1623-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1624-
}
1625-
} else {
1626-
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1627-
if (return_code != SQLITE_OK) {
1628-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1629-
}
1630-
}
1631-
break;
1632-
}
1633-
1634-
case SQLITE3_TEXT:
1635-
convert_to_string(parameter);
1636-
return_code = sqlite3_bind_text(stmt_obj->stmt, param->param_number, Z_STRVAL_P(parameter), Z_STRLEN_P(parameter), SQLITE_STATIC);
1637-
if (return_code != SQLITE_OK) {
1638-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1639-
}
1640-
break;
1641-
1642-
case SQLITE_NULL:
1643-
return_code = sqlite3_bind_null(stmt_obj->stmt, param->param_number);
1644-
if (return_code != SQLITE_OK) {
1645-
php_sqlite3_error(stmt_obj->db_obj, "Unable to bind parameter number " ZEND_LONG_FMT " (%d)", param->param_number, return_code);
1646-
}
1647-
break;
1648-
1649-
default:
1650-
php_sqlite3_error(stmt_obj->db_obj, "Unknown parameter type: %pd for parameter %pd", param->type, param->param_number);
1651-
RETURN_FALSE;
1652-
}
1653-
} ZEND_HASH_FOREACH_END();
1669+
if (bind_rc == FAILURE) {
1670+
RETURN_FALSE;
16541671
}
16551672

16561673
return_code = sqlite3_step(stmt_obj->stmt);

0 commit comments

Comments
 (0)