wez Fri Jun 10 00:04:43 2005 EDT
Modified files:
/php-src/ext/pdo_sqlite sqlite_driver.c
Log:
finish implementation of sqliteCreateFunction().
http://cvs.php.net/diff.php/php-src/ext/pdo_sqlite/sqlite_driver.c?r1=1.16&r2=1.17&ty=u
Index: php-src/ext/pdo_sqlite/sqlite_driver.c
diff -u php-src/ext/pdo_sqlite/sqlite_driver.c:1.16
php-src/ext/pdo_sqlite/sqlite_driver.c:1.17
--- php-src/ext/pdo_sqlite/sqlite_driver.c:1.16 Thu Jun 9 22:50:37 2005
+++ php-src/ext/pdo_sqlite/sqlite_driver.c Fri Jun 10 00:04:43 2005
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sqlite_driver.c,v 1.16 2005/06/10 02:50:37 wez Exp $ */
+/* $Id: sqlite_driver.c,v 1.17 2005/06/10 04:04:43 wez Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -279,9 +279,10 @@
}
static int do_callback(struct pdo_sqlite_fci *fc, zval *cb,
- int argc, sqlite3_value **argv, zval **retval TSRMLS_DC)
+ int argc, sqlite3_value **argv, sqlite3_context *context
TSRMLS_DC)
{
zval ***zargs = NULL;
+ zval *retval = NULL;
int i;
int ret;
@@ -290,7 +291,7 @@
fc->fci.function_name = cb;
fc->fci.symbol_table = NULL;
fc->fci.object_pp = NULL;
- fc->fci.retval_ptr_ptr = retval;
+ fc->fci.retval_ptr_ptr = &retval;
fc->fci.param_count = argc;
/* build up the params */
@@ -341,36 +342,63 @@
efree(zargs);
}
+ if (context) {
+ if (retval) {
+ switch (Z_TYPE_P(retval)) {
+ case IS_LONG:
+ sqlite3_result_int(context,
Z_LVAL_P(retval));
+ break;
+
+ case IS_NULL:
+ sqlite3_result_null(context);
+ break;
+
+ case IS_DOUBLE:
+ sqlite3_result_double(context,
Z_DVAL_P(retval));
+ break;
+
+ default:
+ convert_to_string_ex(&retval);
+ sqlite3_result_text(context,
Z_STRVAL_P(retval),
+ Z_STRLEN_P(retval),
SQLITE_TRANSIENT);
+ break;
+ }
+ } else {
+ sqlite3_result_error(context, "failed to invoke
callback", 0);
+ }
+ }
+
+ if (retval) {
+ zval_ptr_dtor(&retval);
+ }
+
return ret;
}
static void php_sqlite3_func_callback(sqlite3_context *context, int argc,
sqlite3_value **argv)
{
- struct pdo_sqlite_func *func = (struct pdo_sqlite_func*)context;
- zval *retval = NULL;
+ struct pdo_sqlite_func *func = (struct
pdo_sqlite_func*)sqlite3_user_data(context);
TSRMLS_FETCH();
- do_callback(&func->afunc, func->func, argc, argv, &retval TSRMLS_CC);
+ do_callback(&func->afunc, func->func, argc, argv, context TSRMLS_CC);
}
static void php_sqlite3_func_step_callback(sqlite3_context *context, int argc,
sqlite3_value **argv)
{
- struct pdo_sqlite_func *func = (struct pdo_sqlite_func*)context;
- zval *retval = NULL;
+ struct pdo_sqlite_func *func = (struct
pdo_sqlite_func*)sqlite3_user_data(context);
TSRMLS_FETCH();
- do_callback(&func->astep, func->step, argc, argv, &retval TSRMLS_CC);
+ do_callback(&func->astep, func->step, argc, argv, NULL TSRMLS_CC);
}
static void php_sqlite3_func_final_callback(sqlite3_context *context)
{
- struct pdo_sqlite_func *func = (struct pdo_sqlite_func*)context;
- zval *retval = NULL;
+ struct pdo_sqlite_func *func = (struct
pdo_sqlite_func*)sqlite3_user_data(context);
TSRMLS_FETCH();
- do_callback(&func->afini, func->fini, 0, NULL, &retval TSRMLS_CC);
+ do_callback(&func->afini, func->fini, 0, NULL, context TSRMLS_CC);
}
/* {{{ bool SQLite::sqliteCreateFunction(string name, mixed callback [, int
argcount])
@@ -412,7 +440,6 @@
ret = sqlite3_create_function(H->db, func_name, argc, SQLITE_UTF8,
func, php_sqlite3_func_callback, NULL, NULL);
-
if (ret == SQLITE_OK) {
func->funcname = estrdup(func_name);
@@ -440,7 +467,6 @@
static function_entry *get_driver_methods(pdo_dbh_t *dbh, int kind TSRMLS_DC)
{
- printf("get_driver_methods\n");
switch (kind) {
case PDO_DBH_DRIVER_METHOD_KIND_DBH:
return dbh_methods;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php