|
|
| version 1.1.1.1, 2012/02/21 23:48:02 | version 1.1.1.2, 2012/05/29 12:34:43 |
|---|---|
| Line 103 PHP_METHOD(sqlite3, open) | Line 103 PHP_METHOD(sqlite3, open) |
| db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); | db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); |
| zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); | zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC); |
| if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls", &filename, &filename_len, &flags, &encryption_key, &encryption_key_len)) { | if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ls", &filename, &filename_len, &flags, &encryption_key, &encryption_key_len)) { |
| zend_restore_error_handling(&error_handling TSRMLS_CC); | zend_restore_error_handling(&error_handling TSRMLS_CC); |
| return; | return; |
| } | } |
| Line 114 PHP_METHOD(sqlite3, open) | Line 114 PHP_METHOD(sqlite3, open) |
| zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Already initialised DB Object", 0 TSRMLS_CC); | zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Already initialised DB Object", 0 TSRMLS_CC); |
| } | } |
| if (strlen(filename) != filename_len) { | |
| return; | |
| } | |
| if (strncmp(filename, ":memory:", 8) != 0) { | if (strncmp(filename, ":memory:", 8) != 0) { |
| if (!(fullpath = expand_filepath(filename, NULL TSRMLS_CC))) { | if (!(fullpath = expand_filepath(filename, NULL TSRMLS_CC))) { |
| zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Unable to expand filepath", 0 TSRMLS_CC); | zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Unable to expand filepath", 0 TSRMLS_CC); |
| Line 851 static void php_sqlite3_callback_final(sqlite3_context | Line 848 static void php_sqlite3_callback_final(sqlite3_context |
| } | } |
| /* }}} */ | /* }}} */ |
| static int php_sqlite3_callback_compare(void *coll, int a_len, const void *a, int b_len, const void* b) /* {{{ */ | |
| { | |
| php_sqlite3_collation *collation = (php_sqlite3_collation*)coll; | |
| zval ***zargs = NULL; | |
| zval *retval = NULL; | |
| int ret; | |
| TSRMLS_FETCH(); | |
| collation->fci.fci.size = (sizeof(collation->fci.fci)); | |
| collation->fci.fci.function_table = EG(function_table); | |
| collation->fci.fci.function_name = collation->cmp_func; | |
| collation->fci.fci.symbol_table = NULL; | |
| collation->fci.fci.object_ptr = NULL; | |
| collation->fci.fci.retval_ptr_ptr = &retval; | |
| collation->fci.fci.param_count = 2; | |
| zargs = (zval***)safe_emalloc(2, sizeof(zval**), 0); | |
| zargs[0] = emalloc(sizeof(zval*)); | |
| zargs[1] = emalloc(sizeof(zval*)); | |
| MAKE_STD_ZVAL(*zargs[0]); | |
| ZVAL_STRINGL(*zargs[0], a, a_len, 1); | |
| MAKE_STD_ZVAL(*zargs[1]); | |
| ZVAL_STRINGL(*zargs[1], b, b_len, 1); | |
| collation->fci.fci.params = zargs; | |
| if ((ret = zend_call_function(&collation->fci.fci, &collation->fci.fcc TSRMLS_CC)) == FAILURE) { | |
| php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the compare callback"); | |
| } | |
| zval_ptr_dtor(zargs[0]); | |
| zval_ptr_dtor(zargs[1]); | |
| efree(zargs[0]); | |
| efree(zargs[1]); | |
| efree(zargs); | |
| //retval ought to contain a ZVAL_LONG by now | |
| // (the result of a comparison, i.e. most likely -1, 0, or 1) | |
| //I suppose we could accept any scalar return type, though. | |
| if (Z_TYPE_P(retval) != IS_LONG){ | |
| php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the compare callback (invalid return type). Collation behaviour is undefined."); | |
| }else{ | |
| ret = Z_LVAL_P(retval); | |
| } | |
| zval_ptr_dtor(&retval); | |
| return ret; | |
| } | |
| /* }}} */ | |
| /* {{{ proto bool SQLite3::createFunction(string name, mixed callback [, int argcount]) | /* {{{ proto bool SQLite3::createFunction(string name, mixed callback [, int argcount]) |
| Allows registration of a PHP function as a SQLite UDF that can be called within SQL statements. */ | Allows registration of a PHP function as a SQLite UDF that can be called within SQL statements. */ |
| PHP_METHOD(sqlite3, createFunction) | PHP_METHOD(sqlite3, createFunction) |
| Line 961 PHP_METHOD(sqlite3, createAggregate) | Line 1012 PHP_METHOD(sqlite3, createAggregate) |
| } | } |
| /* }}} */ | /* }}} */ |
| /* {{{ proto bool SQLite3::createCollation(string name, mixed callback) | |
| Registers a PHP function as a comparator that can be used with the SQL COLLATE operator. Callback must accept two strings and return an integer (as strcmp()). */ | |
| PHP_METHOD(sqlite3, createCollation) | |
| { | |
| php_sqlite3_db_object *db_obj; | |
| zval *object = getThis(); | |
| php_sqlite3_collation *collation; | |
| char *collation_name, *callback_name; | |
| int collation_name_len; | |
| zval *callback_func; | |
| db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); | |
| SQLITE3_CHECK_INITIALIZED(db_obj, db_obj->initialised, SQLite3) | |
| if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &collation_name, &collation_name_len, &callback_func) == FAILURE) { | |
| RETURN_FALSE; | |
| } | |
| if (!collation_name_len) { | |
| RETURN_FALSE; | |
| } | |
| if (!zend_is_callable(callback_func, 0, &callback_name TSRMLS_CC)) { | |
| php_sqlite3_error(db_obj, "Not a valid callback function %s", callback_name); | |
| efree(callback_name); | |
| RETURN_FALSE; | |
| } | |
| efree(callback_name); | |
| collation = (php_sqlite3_collation *)ecalloc(1, sizeof(*collation)); | |
| if (sqlite3_create_collation(db_obj->db, collation_name, SQLITE_UTF8, collation, php_sqlite3_callback_compare) == SQLITE_OK) { | |
| collation->collation_name = estrdup(collation_name); | |
| MAKE_STD_ZVAL(collation->cmp_func); | |
| MAKE_COPY_ZVAL(&callback_func, collation->cmp_func); | |
| collation->next = db_obj->collations; | |
| db_obj->collations = collation; | |
| RETURN_TRUE; | |
| } | |
| efree(collation); | |
| RETURN_FALSE; | |
| } | |
| /* }}} */ | |
| typedef struct { | typedef struct { |
| sqlite3_blob *blob; | sqlite3_blob *blob; |
| size_t position; | size_t position; |
| Line 1749 ZEND_BEGIN_ARG_INFO_EX(arginfo_sqlite3_createaggregate | Line 1847 ZEND_BEGIN_ARG_INFO_EX(arginfo_sqlite3_createaggregate |
| ZEND_ARG_INFO(0, argument_count) | ZEND_ARG_INFO(0, argument_count) |
| ZEND_END_ARG_INFO() | ZEND_END_ARG_INFO() |
| ZEND_BEGIN_ARG_INFO_EX(arginfo_sqlite3_createcollation, 0, 0, 2) | |
| ZEND_ARG_INFO(0, name) | |
| ZEND_ARG_INFO(0, callback) | |
| ZEND_END_ARG_INFO() | |
| ZEND_BEGIN_ARG_INFO_EX(argingo_sqlite3_openblob, 0, 0, 3) | ZEND_BEGIN_ARG_INFO_EX(argingo_sqlite3_openblob, 0, 0, 3) |
| ZEND_ARG_INFO(0, table) | ZEND_ARG_INFO(0, table) |
| ZEND_ARG_INFO(0, column) | ZEND_ARG_INFO(0, column) |
| Line 1812 static zend_function_entry php_sqlite3_class_methods[] | Line 1915 static zend_function_entry php_sqlite3_class_methods[] |
| PHP_ME(sqlite3, querySingle, arginfo_sqlite3_querysingle, ZEND_ACC_PUBLIC) | PHP_ME(sqlite3, querySingle, arginfo_sqlite3_querysingle, ZEND_ACC_PUBLIC) |
| PHP_ME(sqlite3, createFunction, arginfo_sqlite3_createfunction, ZEND_ACC_PUBLIC) | PHP_ME(sqlite3, createFunction, arginfo_sqlite3_createfunction, ZEND_ACC_PUBLIC) |
| PHP_ME(sqlite3, createAggregate, arginfo_sqlite3_createaggregate, ZEND_ACC_PUBLIC) | PHP_ME(sqlite3, createAggregate, arginfo_sqlite3_createaggregate, ZEND_ACC_PUBLIC) |
| PHP_ME(sqlite3, createCollation, arginfo_sqlite3_createcollation, ZEND_ACC_PUBLIC) | |
| PHP_ME(sqlite3, openBlob, argingo_sqlite3_openblob, ZEND_ACC_PUBLIC) | PHP_ME(sqlite3, openBlob, argingo_sqlite3_openblob, ZEND_ACC_PUBLIC) |
| PHP_ME(sqlite3, enableExceptions, argingo_sqlite3_enableexceptions, ZEND_ACC_PUBLIC) | PHP_ME(sqlite3, enableExceptions, argingo_sqlite3_enableexceptions, ZEND_ACC_PUBLIC) |
| /* Aliases */ | /* Aliases */ |
| Line 1908 static void php_sqlite3_object_free_storage(void *obje | Line 2012 static void php_sqlite3_object_free_storage(void *obje |
| { | { |
| php_sqlite3_db_object *intern = (php_sqlite3_db_object *)object; | php_sqlite3_db_object *intern = (php_sqlite3_db_object *)object; |
| php_sqlite3_func *func; | php_sqlite3_func *func; |
| php_sqlite3_collation *collation; | |
| if (!intern) { | if (!intern) { |
| return; | return; |
| Line 1934 static void php_sqlite3_object_free_storage(void *obje | Line 2039 static void php_sqlite3_object_free_storage(void *obje |
| efree(func); | efree(func); |
| } | } |
| while (intern->collations){ | |
| collation = intern->collations; | |
| intern->collations = collation->next; | |
| if (intern->initialised && intern->db){ | |
| sqlite3_create_collation(intern->db, collation->collation_name, SQLITE_UTF8, NULL, NULL); | |
| } | |
| efree((char*)collation->collation_name); | |
| if (collation->cmp_func){ | |
| zval_ptr_dtor(&collation->cmp_func); | |
| } | |
| efree(collation); | |
| } | |
| if (intern->initialised && intern->db) { | if (intern->initialised && intern->db) { |
| sqlite3_close(intern->db); | sqlite3_close(intern->db); |
| intern->initialised = 0; | intern->initialised = 0; |
| Line 2000 static void php_sqlite3_result_object_free_storage(voi | Line 2118 static void php_sqlite3_result_object_free_storage(voi |
| static zend_object_value php_sqlite3_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ | static zend_object_value php_sqlite3_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ |
| { | { |
| zval *tmp; | |
| zend_object_value retval; | zend_object_value retval; |
| php_sqlite3_db_object *intern; | php_sqlite3_db_object *intern; |
| Line 2013 static zend_object_value php_sqlite3_object_new(zend_c | Line 2130 static zend_object_value php_sqlite3_object_new(zend_c |
| zend_llist_init(&(intern->free_list), sizeof(php_sqlite3_free_list *), (llist_dtor_func_t)php_sqlite3_free_list_dtor, 0); | zend_llist_init(&(intern->free_list), sizeof(php_sqlite3_free_list *), (llist_dtor_func_t)php_sqlite3_free_list_dtor, 0); |
| zend_object_std_init(&intern->zo, class_type TSRMLS_CC); | zend_object_std_init(&intern->zo, class_type TSRMLS_CC); |
| zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,(void *) &tmp, sizeof(zval *)); | object_properties_init(&intern->zo, class_type); |
| retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_object_free_storage, NULL TSRMLS_CC); | retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_object_free_storage, NULL TSRMLS_CC); |
| retval.handlers = (zend_object_handlers *) &sqlite3_object_handlers; | retval.handlers = (zend_object_handlers *) &sqlite3_object_handlers; |
| Line 2024 static zend_object_value php_sqlite3_object_new(zend_c | Line 2141 static zend_object_value php_sqlite3_object_new(zend_c |
| static zend_object_value php_sqlite3_stmt_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ | static zend_object_value php_sqlite3_stmt_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ |
| { | { |
| zval *tmp; | |
| zend_object_value retval; | zend_object_value retval; |
| php_sqlite3_stmt *intern; | php_sqlite3_stmt *intern; |
| Line 2035 static zend_object_value php_sqlite3_stmt_object_new(z | Line 2151 static zend_object_value php_sqlite3_stmt_object_new(z |
| intern->db_obj_zval = NULL; | intern->db_obj_zval = NULL; |
| zend_object_std_init(&intern->zo, class_type TSRMLS_CC); | zend_object_std_init(&intern->zo, class_type TSRMLS_CC); |
| zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,(void *) &tmp, sizeof(zval *)); | object_properties_init(&intern->zo, class_type); |
| retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_stmt_object_free_storage, NULL TSRMLS_CC); | retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_stmt_object_free_storage, NULL TSRMLS_CC); |
| retval.handlers = (zend_object_handlers *) &sqlite3_stmt_object_handlers; | retval.handlers = (zend_object_handlers *) &sqlite3_stmt_object_handlers; |
| Line 2046 static zend_object_value php_sqlite3_stmt_object_new(z | Line 2162 static zend_object_value php_sqlite3_stmt_object_new(z |
| static zend_object_value php_sqlite3_result_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ | static zend_object_value php_sqlite3_result_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ |
| { | { |
| zval *tmp; | |
| zend_object_value retval; | zend_object_value retval; |
| php_sqlite3_result *intern; | php_sqlite3_result *intern; |
| Line 2059 static zend_object_value php_sqlite3_result_object_new | Line 2174 static zend_object_value php_sqlite3_result_object_new |
| intern->stmt_obj_zval = NULL; | intern->stmt_obj_zval = NULL; |
| zend_object_std_init(&intern->zo, class_type TSRMLS_CC); | zend_object_std_init(&intern->zo, class_type TSRMLS_CC); |
| zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,(void *) &tmp, sizeof(zval *)); | object_properties_init(&intern->zo, class_type); |
| retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_result_object_free_storage, NULL TSRMLS_CC); | retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_sqlite3_result_object_free_storage, NULL TSRMLS_CC); |
| retval.handlers = (zend_object_handlers *) &sqlite3_result_object_handlers; | retval.handlers = (zend_object_handlers *) &sqlite3_result_object_handlers; |