diff --git a/UPGRADING b/UPGRADING index aebda12cf500e..b38fd2c7a2deb 100644 --- a/UPGRADING +++ b/UPGRADING @@ -194,6 +194,9 @@ PHP 8.5 UPGRADE NOTES IntlListFormatter::WIDTH_NARROW widths. It is supported from icu 67. +- PDO_Sqlite: + . Added class constant Pdo_Sqlite::ATTR_BUSY_STATEMENT. + - SOAP: . Enumeration cases are now dumped in __getTypes(). @@ -424,6 +427,9 @@ PHP 8.5 UPGRADE NOTES - PCRE: . Upgraded to pcre2lib from 10.44 to 10.45. +- PDO_Sqlite: + . Increased minimum release version support from 3.7.7 to 3.7.17. + - Readline: . The return types of readline_add_history(), readline_clear_history(), and readline_callback_handler_install() have been changed to true, rather diff --git a/build/php.m4 b/build/php.m4 index 640f01008009d..aa49766fedd7f 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -1923,7 +1923,7 @@ dnl dnl Common setup macro for SQLite library. dnl AC_DEFUN([PHP_SETUP_SQLITE], [ -PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.7], [ +PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.17], [ PHP_EVAL_INCLINE([$SQLITE_CFLAGS]) PHP_EVAL_LIBLINE([$SQLITE_LIBS], [$1]) ]) diff --git a/ext/pdo_sqlite/pdo_sqlite.c b/ext/pdo_sqlite/pdo_sqlite.c index fbbb336c1af1e..023e35a2bc33c 100644 --- a/ext/pdo_sqlite/pdo_sqlite.c +++ b/ext/pdo_sqlite/pdo_sqlite.c @@ -385,14 +385,10 @@ static int php_sqlite_collation_callback(void *context, int string1_len, const v zend_type_error("%s(): Return value of the collation callback must be of type int, %s returned", ZSTR_VAL(func_name), zend_zval_value_name(&retval)); zend_string_release(func_name); - ret = FAILURE; + zval_ptr_dtor(&retval); + return FAILURE; } - if (Z_LVAL(retval) > 0) { - ret = 1; - } else if (Z_LVAL(retval) < 0) { - ret = -1; - } - zval_ptr_dtor(&retval); + ret = ZEND_NORMALIZE_BOOL(Z_LVAL(retval)); } return ret; diff --git a/ext/pdo_sqlite/pdo_sqlite.stub.php b/ext/pdo_sqlite/pdo_sqlite.stub.php index 3832683598ed5..4cb6c14eae0a4 100644 --- a/ext/pdo_sqlite/pdo_sqlite.stub.php +++ b/ext/pdo_sqlite/pdo_sqlite.stub.php @@ -33,6 +33,9 @@ class Sqlite extends \PDO /** @cvalue PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES */ public const int ATTR_EXTENDED_RESULT_CODES = UNKNOWN; + /** @cvalue PDO_SQLITE_ATTR_BUSY_STATEMENT */ + public const int ATTR_BUSY_STATEMENT = UNKNOWN; + /** @cvalue SQLITE_OK */ public const int OK = UNKNOWN; diff --git a/ext/pdo_sqlite/pdo_sqlite_arginfo.h b/ext/pdo_sqlite/pdo_sqlite_arginfo.h index 75de256e55c7b..ec826bc4bbc5a 100644 --- a/ext/pdo_sqlite/pdo_sqlite_arginfo.h +++ b/ext/pdo_sqlite/pdo_sqlite_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: f8cd6b3c6aa662d76dca3d0a28d61acfb5a611b5 */ + * Stub hash: ae1e62d72c3c8290c9f39f21b583e980ea9b8eb2 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Pdo_Sqlite_createAggregate, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) @@ -110,6 +110,12 @@ static zend_class_entry *register_class_Pdo_Sqlite(zend_class_entry *class_entry zend_declare_typed_class_constant(class_entry, const_ATTR_EXTENDED_RESULT_CODES_name, &const_ATTR_EXTENDED_RESULT_CODES_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); zend_string_release(const_ATTR_EXTENDED_RESULT_CODES_name); + zval const_ATTR_BUSY_STATEMENT_value; + ZVAL_LONG(&const_ATTR_BUSY_STATEMENT_value, PDO_SQLITE_ATTR_BUSY_STATEMENT); + zend_string *const_ATTR_BUSY_STATEMENT_name = zend_string_init_interned("ATTR_BUSY_STATEMENT", sizeof("ATTR_BUSY_STATEMENT") - 1, 1); + zend_declare_typed_class_constant(class_entry, const_ATTR_BUSY_STATEMENT_name, &const_ATTR_BUSY_STATEMENT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release(const_ATTR_BUSY_STATEMENT_name); + zval const_OK_value; ZVAL_LONG(&const_OK_value, SQLITE_OK); zend_string *const_OK_name = zend_string_init_interned("OK", sizeof("OK") - 1, 1); diff --git a/ext/pdo_sqlite/php_pdo_sqlite_int.h b/ext/pdo_sqlite/php_pdo_sqlite_int.h index 4a39781f85c96..8acb95015e79a 100644 --- a/ext/pdo_sqlite/php_pdo_sqlite_int.h +++ b/ext/pdo_sqlite/php_pdo_sqlite_int.h @@ -73,7 +73,8 @@ extern const struct pdo_stmt_methods sqlite_stmt_methods; enum { PDO_SQLITE_ATTR_OPEN_FLAGS = PDO_ATTR_DRIVER_SPECIFIC, PDO_SQLITE_ATTR_READONLY_STATEMENT, - PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES + PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES, + PDO_SQLITE_ATTR_BUSY_STATEMENT }; typedef int pdo_sqlite_create_collation_callback(void*, int, const void*, int, const void*); diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index d06d255c14cd8..2c907a34f489b 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -492,14 +492,10 @@ static int php_sqlite3_collation_callback(void *context, int string1_len, const zend_type_error("%s(): Return value of the collation callback must be of type int, %s returned", ZSTR_VAL(func_name), zend_zval_value_name(&retval)); zend_string_release(func_name); - ret = FAILURE; - } - if (Z_LVAL(retval) > 0) { - ret = 1; - } else if (Z_LVAL(retval) < 0) { - ret = -1; + zval_ptr_dtor(&retval); + return FAILURE; } - zval_ptr_dtor(&retval); + ret = ZEND_NORMALIZE_BOOL(Z_LVAL(retval)); } return ret; diff --git a/ext/pdo_sqlite/sqlite_statement.c b/ext/pdo_sqlite/sqlite_statement.c index c0e327450232f..64c8c8a86dd9a 100644 --- a/ext/pdo_sqlite/sqlite_statement.c +++ b/ext/pdo_sqlite/sqlite_statement.c @@ -375,13 +375,18 @@ static int pdo_sqlite_stmt_get_attribute(pdo_stmt_t *stmt, zend_long attr, zval case PDO_SQLITE_ATTR_READONLY_STATEMENT: ZVAL_FALSE(val); -#if SQLITE_VERSION_NUMBER >= 3007004 - if (sqlite3_stmt_readonly(S->stmt)) { - ZVAL_TRUE(val); - } -#endif + if (sqlite3_stmt_readonly(S->stmt)) { + ZVAL_TRUE(val); + } break; + case PDO_SQLITE_ATTR_BUSY_STATEMENT: + ZVAL_FALSE(val); + + if (sqlite3_stmt_busy(S->stmt)) { + ZVAL_TRUE(val); + } + break; default: return 0; } diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_constants.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_constants.phpt index 243240bef4662..d1db58b1323eb 100644 --- a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_constants.phpt +++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_constants.phpt @@ -13,6 +13,7 @@ var_dump(Pdo\Sqlite::OPEN_READWRITE); var_dump(Pdo\Sqlite::OPEN_CREATE); var_dump(Pdo\Sqlite::ATTR_READONLY_STATEMENT); var_dump(Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES); +var_dump(Pdo\Sqlite::ATTR_BUSY_STATEMENT); ?> --EXPECTF-- @@ -24,3 +25,4 @@ int(%d) int(%d) int(%d) int(%d) +int(%d) diff --git a/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt new file mode 100644 index 0000000000000..230fb7390ae50 --- /dev/null +++ b/ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt @@ -0,0 +1,19 @@ +--TEST-- +Pdo\Sqlite::ATTR_BUSY_STATEMENT usage +--EXTENSIONS-- +pdo_sqlite +--FILE-- +query('CREATE TABLE test_busy (a string);'); +$db->query('INSERT INTO test_busy VALUES ("interleaved"), ("statements")'); +$st = $db->prepare('SELECT a FROM test_busy'); +var_dump($st->getAttribute(Pdo\Sqlite::ATTR_BUSY_STATEMENT)); +$st->execute(); +var_dump($st->getAttribute(Pdo\Sqlite::ATTR_BUSY_STATEMENT)); +?> +--EXPECTF-- +bool(false) +bool(true)