Diff for /embedaddon/php/ext/sqlite3/sqlite3.c between versions 1.1.1.1 and 1.1.1.2

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;

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>