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; |