Skip to content

Commit d3f8e4b

Browse files
committed
Add a few callable method parameter types to ext/sqlite3
1 parent 179bc21 commit d3f8e4b

File tree

3 files changed

+26
-61
lines changed

3 files changed

+26
-61
lines changed

ext/sqlite3/sqlite3.c

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -952,12 +952,13 @@ PHP_METHOD(SQLite3, createFunction)
952952
php_sqlite3_func *func;
953953
char *sql_func;
954954
size_t sql_func_len;
955-
zval *callback_func;
955+
zend_fcall_info fci;
956+
zend_fcall_info_cache fcc;
956957
zend_long sql_func_num_args = -1;
957958
zend_long flags = 0;
958959
db_obj = Z_SQLITE3_DB_P(object);
959960

960-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|ll", &sql_func, &sql_func_len, &callback_func, &sql_func_num_args, &flags) == FAILURE) {
961+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sf|ll", &sql_func, &sql_func_len, &fci, &fcc, &sql_func_num_args, &flags) == FAILURE) {
961962
RETURN_THROWS();
962963
}
963964

@@ -967,19 +968,12 @@ PHP_METHOD(SQLite3, createFunction)
967968
RETURN_FALSE;
968969
}
969970

970-
if (!zend_is_callable(callback_func, 0, NULL)) {
971-
zend_string *callback_name = zend_get_callable_name(callback_func);
972-
php_sqlite3_error(db_obj, "Not a valid callback function %s", ZSTR_VAL(callback_name));
973-
zend_string_release_ex(callback_name, 0);
974-
RETURN_FALSE;
975-
}
976-
977971
func = (php_sqlite3_func *)ecalloc(1, sizeof(*func));
978972

979973
if (sqlite3_create_function(db_obj->db, sql_func, sql_func_num_args, flags | SQLITE_UTF8, func, php_sqlite3_callback_func, NULL, NULL) == SQLITE_OK) {
980974
func->func_name = estrdup(sql_func);
981975

982-
ZVAL_COPY(&func->func, callback_func);
976+
ZVAL_COPY(&func->func, &fci.function_name);
983977

984978
func->argc = sql_func_num_args;
985979
func->next = db_obj->funcs;
@@ -1001,11 +995,12 @@ PHP_METHOD(SQLite3, createAggregate)
1001995
php_sqlite3_func *func;
1002996
char *sql_func;
1003997
size_t sql_func_len;
1004-
zval *step_callback, *fini_callback;
998+
zend_fcall_info step_fci, fini_fci;
999+
zend_fcall_info_cache step_fcc, fini_fcc;
10051000
zend_long sql_func_num_args = -1;
10061001
db_obj = Z_SQLITE3_DB_P(object);
10071002

1008-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &sql_func, &sql_func_len, &step_callback, &fini_callback, &sql_func_num_args) == FAILURE) {
1003+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sff|l", &sql_func, &sql_func_len, &step_fci, &step_fcc, &fini_fci, &fini_fcc, &sql_func_num_args) == FAILURE) {
10091004
RETURN_THROWS();
10101005
}
10111006

@@ -1015,27 +1010,13 @@ PHP_METHOD(SQLite3, createAggregate)
10151010
RETURN_FALSE;
10161011
}
10171012

1018-
if (!zend_is_callable(step_callback, 0, NULL)) {
1019-
zend_string *callback_name = zend_get_callable_name(step_callback);
1020-
php_sqlite3_error(db_obj, "Not a valid callback function %s", ZSTR_VAL(callback_name));
1021-
zend_string_release_ex(callback_name, 0);
1022-
RETURN_FALSE;
1023-
}
1024-
1025-
if (!zend_is_callable(fini_callback, 0, NULL)) {
1026-
zend_string *callback_name = zend_get_callable_name(fini_callback);
1027-
php_sqlite3_error(db_obj, "Not a valid callback function %s", ZSTR_VAL(callback_name));
1028-
zend_string_release_ex(callback_name, 0);
1029-
RETURN_FALSE;
1030-
}
1031-
10321013
func = (php_sqlite3_func *)ecalloc(1, sizeof(*func));
10331014

10341015
if (sqlite3_create_function(db_obj->db, sql_func, sql_func_num_args, SQLITE_UTF8, func, NULL, php_sqlite3_callback_step, php_sqlite3_callback_final) == SQLITE_OK) {
10351016
func->func_name = estrdup(sql_func);
10361017

1037-
ZVAL_COPY(&func->step, step_callback);
1038-
ZVAL_COPY(&func->fini, fini_callback);
1018+
ZVAL_COPY(&func->step, &step_fci.function_name);
1019+
ZVAL_COPY(&func->fini, &fini_fci.function_name);
10391020

10401021
func->argc = sql_func_num_args;
10411022
func->next = db_obj->funcs;
@@ -1057,10 +1038,11 @@ PHP_METHOD(SQLite3, createCollation)
10571038
php_sqlite3_collation *collation;
10581039
char *collation_name;
10591040
size_t collation_name_len;
1060-
zval *callback_func;
1041+
zend_fcall_info fci;
1042+
zend_fcall_info_cache fcc;
10611043
db_obj = Z_SQLITE3_DB_P(object);
10621044

1063-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &collation_name, &collation_name_len, &callback_func) == FAILURE) {
1045+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sf", &collation_name, &collation_name_len, &fci, &fcc) == FAILURE) {
10641046
RETURN_THROWS();
10651047
}
10661048

@@ -1070,18 +1052,11 @@ PHP_METHOD(SQLite3, createCollation)
10701052
RETURN_FALSE;
10711053
}
10721054

1073-
if (!zend_is_callable(callback_func, 0, NULL)) {
1074-
zend_string *callback_name = zend_get_callable_name(callback_func);
1075-
php_sqlite3_error(db_obj, "Not a valid callback function %s", ZSTR_VAL(callback_name));
1076-
zend_string_release_ex(callback_name, 0);
1077-
RETURN_FALSE;
1078-
}
1079-
10801055
collation = (php_sqlite3_collation *)ecalloc(1, sizeof(*collation));
10811056
if (sqlite3_create_collation(db_obj->db, collation_name, SQLITE_UTF8, collation, php_sqlite3_callback_compare) == SQLITE_OK) {
10821057
collation->collation_name = estrdup(collation_name);
10831058

1084-
ZVAL_COPY(&collation->cmp_func, callback_func);
1059+
ZVAL_COPY(&collation->cmp_func, &fci.function_name);
10851060

10861061
collation->next = db_obj->collations;
10871062
db_obj->collations = collation;

ext/sqlite3/sqlite3.stub.php

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,14 @@ public function query(string $query) {}
5959
/** @return mixed */
6060
public function querySingle(string $query, bool $entire_row = false) {}
6161

62-
/**
63-
* @param callable $callback
64-
* @return bool
65-
*/
66-
public function createFunction(string $name, $callback, int $argument_count = -1, int $flags = 0) {}
67-
68-
/**
69-
* @param callable $step_callback
70-
* @param callable $final_callback
71-
* @return bool
72-
*/
73-
public function createAggregate(string $name, $step_callback, $final_callback, int $argument_count = -1) {}
74-
75-
/**
76-
* @param callable $callback
77-
* @return bool
78-
*/
79-
public function createCollation(string $name, $callback) {}
62+
/** @return bool */
63+
public function createFunction(string $name, callable $callback, int $argument_count = -1, int $flags = 0) {}
64+
65+
/** @return bool */
66+
public function createAggregate(string $name, callable $step_callback, callable $final_callback, int $argument_count = -1) {}
67+
68+
/** @return bool */
69+
public function createCollation(string $name, callable $callback) {}
8070

8171
/** @return resource|false */
8272
public function openBlob(string $table, string $column, int $rowid, string $dbname = "main", int $flags = SQLITE3_OPEN_READONLY) {}

ext/sqlite3/sqlite3_arginfo.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: cc36f3299089a453fac76179377b68647c33786c */
2+
* Stub hash: d40496bbba4787b192a58896a9ca4858dc59dc76 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3___construct, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -61,21 +61,21 @@ ZEND_END_ARG_INFO()
6161

6262
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3_createFunction, 0, 0, 2)
6363
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
64-
ZEND_ARG_INFO(0, callback)
64+
ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0)
6565
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, argument_count, IS_LONG, 0, "-1")
6666
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0")
6767
ZEND_END_ARG_INFO()
6868

6969
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3_createAggregate, 0, 0, 3)
7070
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
71-
ZEND_ARG_INFO(0, step_callback)
72-
ZEND_ARG_INFO(0, final_callback)
71+
ZEND_ARG_TYPE_INFO(0, step_callback, IS_CALLABLE, 0)
72+
ZEND_ARG_TYPE_INFO(0, final_callback, IS_CALLABLE, 0)
7373
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, argument_count, IS_LONG, 0, "-1")
7474
ZEND_END_ARG_INFO()
7575

7676
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3_createCollation, 0, 0, 2)
7777
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
78-
ZEND_ARG_INFO(0, callback)
78+
ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0)
7979
ZEND_END_ARG_INFO()
8080

8181
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SQLite3_openBlob, 0, 0, 3)

0 commit comments

Comments
 (0)