Changeset 82

Show
Ignore:
Timestamp:
08/06/08 15:13:51 (4 months ago)
Author:
scott
Message:

Sync with PHP 5.3

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/package.xml

    r64 r82  
    3939                        <file name="NEWS" role="doc" /> 
    4040                        <file name="php_sqlite3.h" role="src" /> 
     41                        <file name="php_sqlite3_structs.h" role="src" /> 
    4142                        <file name="sqlite3.c" role="src"> 
    4243                                <tasks:replace from="@PACKAGE_VERSION@" to="version" type="package-info" /> 
     
    4445                        <file name="TODO" role="doc" /> 
    4546                        <dir name="libsqlite"> 
    46                                 <file name="alter.c" role="src" /> 
    47                                 <file name="analyze.c" role="src" /> 
    48                                 <file name="attach.c" role="src" /> 
    49                                 <file name="auth.c" role="src" /> 
    50                                 <file name="bitvec.c" role="src" /> 
    51                                 <file name="btmutex.c" role="src" /> 
    52                                 <file name="btree.c" role="src" /> 
    53                                 <file name="btree.h" role="src" /> 
    54                                 <file name="btreeInt.h" role="src" /> 
    55                                 <file name="build.c" role="src" /> 
    56                                 <file name="callback.c" role="src" /> 
    57                                 <file name="complete.c" role="src" /> 
    58                                 <file name="config.h" role="src" /> 
    59                                 <file name="date.c" role="src" /> 
    60                                 <file name="delete.c" role="src" /> 
    61                                 <file name="expr.c" role="src" /> 
    62                                 <file name="fault.c" role="src" /> 
    63                                 <file name="fts3.c" role="src" /> 
    64                                 <file name="fts3.h" role="src" /> 
    65                                 <file name="fts3_hash.c" role="src" /> 
    66                                 <file name="fts3_hash.h" role="src" /> 
    67                                 <file name="fts3_icu.c" role="src" /> 
    68                                 <file name="fts3_porter.c" role="src" /> 
    69                                 <file name="fts3_tokenizer.c" role="src" /> 
    70                                 <file name="fts3_tokenizer.h" role="src" /> 
    71                                 <file name="fts3_tokenizer1.c" role="src" /> 
    72                                 <file name="func.c" role="src" /> 
    73                                 <file name="hash.c" role="src" /> 
    74                                 <file name="hash.h" role="src" /> 
    75                                 <file name="insert.c" role="src" /> 
    76                                 <file name="journal.c" role="src" /> 
    77                                 <file name="keywordhash.h" role="src" /> 
    78                                 <file name="legacy.c" role="src" /> 
    79                                 <file name="loadext.c" role="src" /> 
    80                                 <file name="main.c" role="src" /> 
    81                                 <file name="malloc.c" role="src" /> 
    82                                 <file name="mem1.c" role="src" /> 
    83                                 <file name="mutex.c" role="src" /> 
    84                                 <file name="mutex.h" role="src" /> 
    85                                 <file name="mutex_os2.c" role="src" /> 
    86                                 <file name="mutex_unix.c" role="src" /> 
    87                                 <file name="mutex_w32.c" role="src" /> 
    88                                 <file name="opcodes.c" role="src" /> 
    89                                 <file name="opcodes.h" role="src" /> 
    90                                 <file name="os.c" role="src" /> 
    91                                 <file name="os.h" role="src" /> 
    92                                 <file name="os_common.h" role="src" /> 
    93                                 <file name="os_os2.c" role="src" /> 
    94                                 <file name="os_unix.c" role="src" /> 
    95                                 <file name="os_win.c" role="src" /> 
    96                                 <file name="pager.c" role="src" /> 
    97                                 <file name="pager.h" role="src" /> 
    98                                 <file name="parse.c" role="src" /> 
    99                                 <file name="parse.h" role="src" /> 
    100                                 <file name="pragma.c" role="src" /> 
    101                                 <file name="prepare.c" role="src" /> 
    102                                 <file name="printf.c" role="src" /> 
    103                                 <file name="random.c" role="src" /> 
    104                                 <file name="select.c" role="src" /> 
     47                                <file name="sqlite3.c" role="src" /> 
    10548                                <file name="sqlite3.h" role="src" /> 
    10649                                <file name="sqlite3ext.h" role="src" /> 
    107                                 <file name="sqliteInt.h" role="src" /> 
    108                                 <file name="sqliteLimit.h" role="src" /> 
    109                                 <file name="table.c" role="src" /> 
    110                                 <file name="tokenize.c" role="src" /> 
    111                                 <file name="trigger.c" role="src" /> 
    112                                 <file name="update.c" role="src" /> 
    113                                 <file name="utf.c" role="src" /> 
    114                                 <file name="util.c" role="src" /> 
    115                                 <file name="vacuum.c" role="src" /> 
    116                                 <file name="vdbe.c" role="src" /> 
    117                                 <file name="vdbe.h" role="src" /> 
    118                                 <file name="vdbeapi.c" role="src" /> 
    119                                 <file name="vdbeaux.c" role="src" /> 
    120                                 <file name="vdbeblob.c" role="src" /> 
    121                                 <file name="vdbefifo.c" role="src" /> 
    122                                 <file name="vdbeInt.h" role="src" /> 
    123                                 <file name="vdbemem.c" role="src" /> 
    124                                 <file name="vtab.c" role="src" /> 
    125                                 <file name="where.c" role="src" /> 
    12650                        </dir> 
    12751                        <dir name="tests"> 
  • trunk/php_sqlite3.h

    r79 r82  
    1515   | Authors: Scott MacVicar <scottmac@php.net>                           | 
    1616   +----------------------------------------------------------------------+ 
    17  
    18    $Id: php_sqlite3.h,v 1.1 2007/08/14 03:13:22 scottmac Exp $ 
    1917*/ 
    2018 
    21 #ifndef PHP_SQLITE_H 
    22 #define PHP_SQLITE_H 
     19/* $Id: php_sqlite3.h,v 1.1.2.5 2008/07/31 22:24:05 scottmac Exp $ */ 
    2320 
    24 #ifdef HAVE_CONFIG_H 
    25 #include "config.h" 
    26 #endif 
    27  
    28 #ifdef ZTS 
    29 #include "TSRM.h" 
    30 #endif 
    31  
    32 /* Include PHP Standard Header */ 
    33 #include "php.h" 
    34  
    35 /* Include headers */ 
    36 #include <sqlite3.h> 
     21#ifndef PHP_SQLITE3_H 
     22#define PHP_SQLITE3_H 
    3723 
    3824#define PHP_SQLITE3_VERSION      "0.7-dev" 
     
    5642#endif 
    5743 
     44#ifndef Z_DELREF_P 
     45#define Z_DELREF_P(x) (x)->refcount-- 
     46#endif 
     47 
    5848#ifndef Z_SET_REFCOUNT_P 
    5949#define Z_SET_REFCOUNT_P(x, n) (x)->refcount = n 
     
    6656 
    6757#define PHP_SQLITE3_ASSOC       1<<0 
    68 #define PHP_SQLITE3_NUM 1<<1 
     58#define PHP_SQLITE3_NUM        1<<1 
    6959#define PHP_SQLITE3_BOTH        (PHP_SQLITE3_ASSOC|PHP_SQLITE3_NUM) 
    7060 
    71 /* for backwards compatability reasons */ 
    72 #ifndef SQLITE_OPEN_READONLY 
    73 #define SQLITE_OPEN_READONLY 0x00000001 
    7461#endif 
    75  
    76 #ifndef SQLITE_OPEN_READWRITE 
    77 #define SQLITE_OPEN_READWRITE 0x00000002 
    78 #endif 
    79  
    80 #ifndef SQLITE_OPEN_CREATE 
    81 #define SQLITE_OPEN_CREATE 0x00000004 
    82 #endif 
    83  
    84 /* Structure for SQLite Statement Parameter. */ 
    85 struct php_sqlite3_bound_param  { 
    86         long param_number; 
    87         char *name; 
    88         int name_len; 
    89         int type; 
    90  
    91         zval *parameter; 
    92 }; 
    93  
    94 struct php_sqlite3_fci { 
    95         zend_fcall_info fci; 
    96         zend_fcall_info_cache fcc; 
    97 }; 
    98  
    99 /* Structure for SQLite function. */ 
    100 typedef struct _php_sqlite3_func { 
    101         struct _php_sqlite3_func *next; 
    102  
    103         const char *func_name; 
    104         int argc; 
    105  
    106         zval *func, *step, *fini; 
    107         struct php_sqlite3_fci afunc, astep, afini; 
    108 } php_sqlite3_func; 
    109  
    110 /* Structure for SQLite Database object. */ 
    111 typedef struct _php_sqlite3_db_object  { 
    112         zend_object zo; 
    113         int initialised; 
    114         sqlite3 *db; 
    115         php_sqlite3_func *funcs; 
    116 } php_sqlite3_db_object; 
    117  
    118 /*typedef struct _php_sqlite3_stmt { 
    119         sqlite3_stmt *stmt; 
    120         int initialised; 
    121 } php_sqlite3_stmt;*/ 
    122  
    123 typedef struct _php_sqlite3_stmt_object php_sqlite3_stmt; 
    124 typedef struct _php_sqlite3_result_object php_sqlite3_result; 
    125  
    126 /* sqlite3 objects to be destroyed */ 
    127 typedef struct _php_sqlite3_stmt_free_list { 
    128         sqlite3_stmt *stmt; 
    129  
    130         zval *statement_object; 
    131         zval *result_object; 
    132 } php_sqlite3_stmt_free_list; 
    133  
    134 /* Structure for SQLite Result object. */ 
    135 struct _php_sqlite3_result_object  { 
    136         zend_object zo; 
    137         php_sqlite3_db_object *db_obj; 
    138         php_sqlite3_stmt *stmt_obj; 
    139         zval *stmt_obj_zval; 
    140  
    141         int initialised; 
    142          
    143         int is_prepared_statement; 
    144         int complete; 
    145 }; 
    146  
    147 /* Structure for SQLite Statement object. */ 
    148 struct _php_sqlite3_stmt_object  { 
    149         zend_object zo; 
    150         sqlite3_stmt *stmt; 
    151         php_sqlite3_db_object *db_obj; 
    152         zval *db_obj_zval; 
    153  
    154         int initialised; 
    155  
    156         /* Keep track of the zvals for bound parameters */ 
    157         HashTable *bound_params; 
    158 }; 
    159  
    160 #endif 
    161  
    16262 
    16363/* 
  • trunk/sqlite3.c

    r79 r82  
    2727#include "ext/standard/info.h" 
    2828#include "php_sqlite3.h" 
     29#include "php_sqlite3_structs.h" 
    2930 
    3031#include <sqlite3.h> 
     
    3839                const char *arg5, const char *arg6); 
    3940static void sqlite3_param_dtor(void *data); 
    40 static int php_sqlite3_compare_stmt_free( php_sqlite3_stmt_free_list **stmt_list, sqlite3_stmt *statement ); 
     41static int php_sqlite3_compare_stmt_zval_free( php_sqlite3_free_list **free_list, zval *statement ); 
    4142 
    4243#define SQLITE3_CHECK_INITIALIZED(member, class_name) \ 
     
    7172        zval *object = getThis(); 
    7273        char *filename, *encryption_key, *fullpath; 
    73         int filename_len, encryption_key_len, flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; 
     74        int filename_len, encryption_key_len; 
     75        long flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; 
    7476        db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); 
    7577 
     
    155157 
    156158        if (db_obj->initialised) { 
     159                zend_llist_clean(&(db_obj->free_list)); 
    157160                errcode = sqlite3_close(db_obj->db); 
    158161                if (errcode != SQLITE_OK) { 
     
    416419                RETURN_FALSE; 
    417420        } 
     421        stmt_obj->initialised = 1; 
    418422} 
    419423/* }}} */ 
     
    469473        } 
    470474 
     475        stmt_obj->initialised = 1; 
     476 
    471477        object_init_ex(return_value, php_sqlite3_result_entry); 
    472478        result = (php_sqlite3_result *)zend_object_store_get_object(return_value TSRMLS_CC); 
     
    475481        result->stmt_obj_zval = stmt; 
    476482 
    477         result->initialised = 1; 
    478483        return_code = sqlite3_step(result->stmt_obj->stmt); 
    479484 
     
    482487                case SQLITE_DONE: /* Valid but no results */ 
    483488                { 
    484                         /*php_sqlite3_stmt_free_list *free_item; 
    485                         free_item = emalloc(sizeof(php_sqlite3_stmt_free_list)); 
    486                         free_item->stmt = result->intern_stmt; 
    487                         free_item->statement_object = NULL; 
    488                         free_item->result_object = return_value; 
    489                         zend_llist_add_element(&(db_obj->stmt_list), &free_item);*/ 
     489                        php_sqlite3_free_list *free_item; 
     490                        free_item = emalloc(sizeof(php_sqlite3_free_list)); 
     491                        free_item->stmt_obj = stmt_obj; 
     492                        free_item->stmt_obj_zval = stmt; 
     493                        zend_llist_add_element(&(db_obj->free_list), &free_item); 
    490494                        sqlite3_reset(result->stmt_obj->stmt); 
    491495                        break; 
     
    493497                default: 
    494498                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to execute statement: %s", sqlite3_errmsg(db_obj->db)); 
    495                         sqlite3_finalize(result->stmt_obj->stmt); 
     499                        sqlite3_finalize(stmt_obj->stmt); 
     500                        stmt_obj->initialised = 0; 
    496501                        zval_dtor(return_value); 
    497502                        RETURN_FALSE; 
     
    540545        zval *object = getThis(); 
    541546        char *sql, *errtext = NULL; 
    542         int sql_len, return_code, entire_row = 0; 
     547        int sql_len, return_code; 
     548        zend_bool entire_row = 0; 
    543549        sqlite3_stmt *stmt; 
    544550        db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); 
     
    921927        } 
    922928 
    923         /*zend_llist_del_element(&(stmt_obj->db_obj->stmt_list), stmt_obj->stmt, 
    924                                                         (int (*)(void *, void *)) php_sqlite3_compare_stmt_free);*/ 
     929        zend_llist_del_element(&(stmt_obj->db_obj->free_list), object, (int (*)(void *, void *)) php_sqlite3_compare_stmt_zval_free); 
    925930 
    926931        RETURN_TRUE; 
     
    11561161 
    11571162                                default: 
    1158                                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown parameter type: %d for parameter %ld", param->type, param->param_number); 
     1163                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown parameter type: %ld for parameter %ld", param->type, param->param_number); 
    11591164                                        RETURN_FALSE; 
    11601165                        } 
     
    11691174                case SQLITE_DONE: /* Valid but no results */ 
    11701175                { 
     1176                        php_sqlite3_free_list *free_item; 
     1177 
    11711178                        sqlite3_reset(stmt_obj->stmt); 
    11721179                        object_init_ex(return_value, php_sqlite3_result_entry); 
     
    11761183         
    11771184                        result->is_prepared_statement = 1; 
    1178                         result->initialised = 1; 
    11791185                        result->db_obj = stmt_obj->db_obj; 
    11801186                        result->stmt_obj = stmt_obj; 
    11811187                        result->stmt_obj_zval = getThis(); 
     1188 
     1189                        free_item = emalloc(sizeof(php_sqlite3_free_list)); 
     1190                        free_item->stmt_obj = stmt_obj; 
     1191                        free_item->stmt_obj_zval = getThis(); 
     1192 
     1193                        zend_llist_add_element(&(stmt_obj->db_obj->free_list), &free_item); 
    11821194 
    11831195                        break; 
     
    12051217        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    12061218 
    1207         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1219        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    12081220 
    12091221        if (zend_parse_parameters_none() == FAILURE) { 
     
    12221234        php_sqlite3_result *result_obj; 
    12231235        zval *object = getThis(); 
    1224         int column = 0; 
     1236        long column = 0; 
    12251237        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    12261238 
    1227         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1239        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    12281240 
    12291241        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &column) == FAILURE) { 
     
    12421254        php_sqlite3_result *result_obj; 
    12431255        zval *object = getThis(); 
    1244         int column = 0; 
     1256        long column = 0; 
    12451257        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    12461258 
    1247         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1259        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    12481260 
    12491261        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &column) == FAILURE) { 
     
    12621274        php_sqlite3_result *result_obj; 
    12631275        zval *object = getThis(); 
    1264         int i, ret, mode = PHP_SQLITE3_BOTH; 
     1276        int i, ret; 
     1277        long mode = PHP_SQLITE3_BOTH; 
    12651278        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    12661279 
    1267         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1280        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    12681281 
    12691282        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &mode) == FAILURE) { 
     
    12971310                                } 
    12981311                        } 
    1299                 break; 
     1312                       break; 
    13001313                case SQLITE_DONE: 
    13011314                        RETURN_FALSE; 
     1315                        break; 
    13021316 
    13031317                default: 
     
    13161330        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    13171331 
    1318         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1332        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    13191333 
    13201334        if (zend_parse_parameters_none() == FAILURE) { 
     
    13411355        result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 
    13421356 
    1343         SQLITE3_CHECK_INITIALIZED(result_obj->initialised, SQLite3_result) 
     1357        SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 
    13441358 
    13451359        if (zend_parse_parameters_none() == FAILURE) { 
     
    13491363        /* We need to finalize an internal statement */ 
    13501364        if (result_obj->is_prepared_statement == 0) { 
    1351                 result_obj->initialised = 0; 
    1352                 sqlite3_finalize(result_obj->stmt_obj->stmt); 
     1365                zend_llist_del_element(&(result_obj->db_obj->free_list), result_obj->stmt_obj_zval, 
     1366                               (int (*)(void *, void *)) php_sqlite3_compare_stmt_zval_free); 
    13531367        } else { 
    13541368                sqlite3_reset(result_obj->stmt_obj->stmt); 
     
    15771591/* }}} */ 
    15781592 
    1579 /* {{{ php_sqlite3_stmt_free 
    1580  */ 
    1581 static void php_sqlite3_stmt_free(void **item) 
    1582 
    1583         php_sqlite3_stmt_free_list *free_item = (php_sqlite3_stmt_free_list *)*item; 
    1584  
    1585         zval_dtor(free_item->result_object); 
    1586         Z_TYPE_P(free_item->result_object) = IS_NULL; 
    1587         if (free_item->statement_object) { 
    1588                 zval_dtor(free_item->statement_object); 
    1589                 Z_TYPE_P(free_item->statement_object) = IS_NULL; 
     1593/* {{{ php_sqlite3_free_list_dtor 
     1594*/ 
     1595static void php_sqlite3_free_list_dtor(void **item) 
     1596
     1597        php_sqlite3_free_list *free_item = (php_sqlite3_free_list *)*item; 
     1598 
     1599        if (free_item->stmt_obj && free_item->stmt_obj->initialised) { 
     1600                sqlite3_finalize(free_item->stmt_obj->stmt); 
     1601                free_item->stmt_obj->initialised = 0; 
    15901602        } 
    15911603        efree(*item); 
     
    15931605/* }}} */ 
    15941606 
    1595  
    1596 static int php_sqlite3_compare_stmt_free( php_sqlite3_stmt_free_list **stmt_list, sqlite3_stmt *statement )  /* {{{ */ 
    1597 
    1598         return (statement == (*stmt_list)->stmt); 
    1599 
     1607static int php_sqlite3_compare_stmt_zval_free( php_sqlite3_free_list **free_list, zval *statement ) /* {{{ */ 
     1608
     1609        return ((*free_list)->stmt_obj->initialised && statement == (*free_list)->stmt_obj_zval); 
     1610
     1611/* }}} */ 
     1612 
     1613static int php_sqlite3_compare_stmt_free( php_sqlite3_free_list **free_list, sqlite3_stmt *statement ) /* {{{ */ 
     1614
     1615        return ((*free_list)->stmt_obj->initialised && statement == (*free_list)->stmt_obj->stmt); 
     1616
     1617/* }}} */ 
    16001618 
    16011619static void php_sqlite3_object_free_storage(void *object TSRMLS_DC) 
     
    16531671 
    16541672        if (intern->initialised) { 
    1655                 intern->initialised = 0; 
    1656                 sqlite3_finalize(intern->stmt); 
     1673                zend_llist_del_element(&(intern->db_obj->free_list), intern->stmt, 
     1674                               (int (*)(void *, void *)) php_sqlite3_compare_stmt_free); 
    16571675        } 
    16581676 
     
    16961714        memset(&intern->zo, 0, sizeof(php_sqlite3_db_object)); 
    16971715 
    1698         /* Non standard stuff, not sure if this is really required still 
    1699         zend_llist_init(&(intern->stmt_list),   sizeof(php_sqlite3_stmt_free_list *), (llist_dtor_func_t)php_sqlite3_stmt_free, 0);*/ 
     1716        /* Need to keep track of things to free */ 
     1717        zend_llist_init(&(intern->free_list), sizeof(php_sqlite3_free_list *), (llist_dtor_func_t)php_sqlite3_free_list_dtor, 0); 
    17001718 
    17011719        zend_object_std_init(&intern->zo, class_type TSRMLS_CC);