Changeset 82
- Timestamp:
- 08/06/08 15:13:51 (4 months ago)
- Files:
-
- trunk/package.xml (modified) (2 diffs)
- trunk/php_sqlite3.h (modified) (3 diffs)
- trunk/php_sqlite3_structs.h (added)
- trunk/sqlite3.c (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/package.xml
r64 r82 39 39 <file name="NEWS" role="doc" /> 40 40 <file name="php_sqlite3.h" role="src" /> 41 <file name="php_sqlite3_structs.h" role="src" /> 41 42 <file name="sqlite3.c" role="src"> 42 43 <tasks:replace from="@PACKAGE_VERSION@" to="version" type="package-info" /> … … 44 45 <file name="TODO" role="doc" /> 45 46 <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" /> 105 48 <file name="sqlite3.h" role="src" /> 106 49 <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" />126 50 </dir> 127 51 <dir name="tests"> trunk/php_sqlite3.h
r79 r82 15 15 | Authors: Scott MacVicar <scottmac@php.net> | 16 16 +----------------------------------------------------------------------+ 17 18 $Id: php_sqlite3.h,v 1.1 2007/08/14 03:13:22 scottmac Exp $19 17 */ 20 18 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 $ */ 23 20 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 37 23 38 24 #define PHP_SQLITE3_VERSION "0.7-dev" … … 56 42 #endif 57 43 44 #ifndef Z_DELREF_P 45 #define Z_DELREF_P(x) (x)->refcount-- 46 #endif 47 58 48 #ifndef Z_SET_REFCOUNT_P 59 49 #define Z_SET_REFCOUNT_P(x, n) (x)->refcount = n … … 66 56 67 57 #define PHP_SQLITE3_ASSOC 1<<0 68 #define PHP_SQLITE3_NUM 1<<158 #define PHP_SQLITE3_NUM 1<<1 69 59 #define PHP_SQLITE3_BOTH (PHP_SQLITE3_ASSOC|PHP_SQLITE3_NUM) 70 60 71 /* for backwards compatability reasons */72 #ifndef SQLITE_OPEN_READONLY73 #define SQLITE_OPEN_READONLY 0x0000000174 61 #endif 75 76 #ifndef SQLITE_OPEN_READWRITE77 #define SQLITE_OPEN_READWRITE 0x0000000278 #endif79 80 #ifndef SQLITE_OPEN_CREATE81 #define SQLITE_OPEN_CREATE 0x0000000482 #endif83 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 #endif161 162 62 163 63 /* trunk/sqlite3.c
r79 r82 27 27 #include "ext/standard/info.h" 28 28 #include "php_sqlite3.h" 29 #include "php_sqlite3_structs.h" 29 30 30 31 #include <sqlite3.h> … … 38 39 const char *arg5, const char *arg6); 39 40 static void sqlite3_param_dtor(void *data); 40 static int php_sqlite3_compare_stmt_ free( php_sqlite3_stmt_free_list **stmt_list, sqlite3_stmt*statement );41 static int php_sqlite3_compare_stmt_zval_free( php_sqlite3_free_list **free_list, zval *statement ); 41 42 42 43 #define SQLITE3_CHECK_INITIALIZED(member, class_name) \ … … 71 72 zval *object = getThis(); 72 73 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; 74 76 db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); 75 77 … … 155 157 156 158 if (db_obj->initialised) { 159 zend_llist_clean(&(db_obj->free_list)); 157 160 errcode = sqlite3_close(db_obj->db); 158 161 if (errcode != SQLITE_OK) { … … 416 419 RETURN_FALSE; 417 420 } 421 stmt_obj->initialised = 1; 418 422 } 419 423 /* }}} */ … … 469 473 } 470 474 475 stmt_obj->initialised = 1; 476 471 477 object_init_ex(return_value, php_sqlite3_result_entry); 472 478 result = (php_sqlite3_result *)zend_object_store_get_object(return_value TSRMLS_CC); … … 475 481 result->stmt_obj_zval = stmt; 476 482 477 result->initialised = 1;478 483 return_code = sqlite3_step(result->stmt_obj->stmt); 479 484 … … 482 487 case SQLITE_DONE: /* Valid but no results */ 483 488 { 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); 490 494 sqlite3_reset(result->stmt_obj->stmt); 491 495 break; … … 493 497 default: 494 498 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; 496 501 zval_dtor(return_value); 497 502 RETURN_FALSE; … … 540 545 zval *object = getThis(); 541 546 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; 543 549 sqlite3_stmt *stmt; 544 550 db_obj = (php_sqlite3_db_object *)zend_object_store_get_object(object TSRMLS_CC); … … 921 927 } 922 928 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); 925 930 926 931 RETURN_TRUE; … … 1156 1161 1157 1162 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); 1159 1164 RETURN_FALSE; 1160 1165 } … … 1169 1174 case SQLITE_DONE: /* Valid but no results */ 1170 1175 { 1176 php_sqlite3_free_list *free_item; 1177 1171 1178 sqlite3_reset(stmt_obj->stmt); 1172 1179 object_init_ex(return_value, php_sqlite3_result_entry); … … 1176 1183 1177 1184 result->is_prepared_statement = 1; 1178 result->initialised = 1;1179 1185 result->db_obj = stmt_obj->db_obj; 1180 1186 result->stmt_obj = stmt_obj; 1181 1187 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); 1182 1194 1183 1195 break; … … 1205 1217 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1206 1218 1207 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1219 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1208 1220 1209 1221 if (zend_parse_parameters_none() == FAILURE) { … … 1222 1234 php_sqlite3_result *result_obj; 1223 1235 zval *object = getThis(); 1224 intcolumn = 0;1236 long column = 0; 1225 1237 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1226 1238 1227 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1239 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1228 1240 1229 1241 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &column) == FAILURE) { … … 1242 1254 php_sqlite3_result *result_obj; 1243 1255 zval *object = getThis(); 1244 intcolumn = 0;1256 long column = 0; 1245 1257 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1246 1258 1247 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1259 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1248 1260 1249 1261 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &column) == FAILURE) { … … 1262 1274 php_sqlite3_result *result_obj; 1263 1275 zval *object = getThis(); 1264 int i, ret, mode = PHP_SQLITE3_BOTH; 1276 int i, ret; 1277 long mode = PHP_SQLITE3_BOTH; 1265 1278 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1266 1279 1267 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1280 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1268 1281 1269 1282 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &mode) == FAILURE) { … … 1297 1310 } 1298 1311 } 1299 break;1312 break; 1300 1313 case SQLITE_DONE: 1301 1314 RETURN_FALSE; 1315 break; 1302 1316 1303 1317 default: … … 1316 1330 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1317 1331 1318 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1332 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1319 1333 1320 1334 if (zend_parse_parameters_none() == FAILURE) { … … 1341 1355 result_obj = (php_sqlite3_result *)zend_object_store_get_object(object TSRMLS_CC); 1342 1356 1343 SQLITE3_CHECK_INITIALIZED(result_obj-> initialised, SQLite3_result)1357 SQLITE3_CHECK_INITIALIZED(result_obj->stmt_obj->initialised, SQLite3_result) 1344 1358 1345 1359 if (zend_parse_parameters_none() == FAILURE) { … … 1349 1363 /* We need to finalize an internal statement */ 1350 1364 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); 1353 1367 } else { 1354 1368 sqlite3_reset(result_obj->stmt_obj->stmt); … … 1577 1591 /* }}} */ 1578 1592 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 */ 1595 static 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; 1590 1602 } 1591 1603 efree(*item); … … 1593 1605 /* }}} */ 1594 1606 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 } 1607 static 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 1613 static 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 /* }}} */ 1600 1618 1601 1619 static void php_sqlite3_object_free_storage(void *object TSRMLS_DC) … … 1653 1671 1654 1672 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); 1657 1675 } 1658 1676 … … 1696 1714 memset(&intern->zo, 0, sizeof(php_sqlite3_db_object)); 1697 1715 1698 /* N on standard stuff, not sure if this is really required still1699 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); 1700 1718 1701 1719 zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
