2 * Copyright (c) 2004-2009 Oracle. All rights reserved.
4 * http://www.apache.org/licenses/LICENSE-2.0.txt
6 * authors: George Schlossnagle <george@omniti.com>
13 // this is here to work around a PHP build issue on Windows
20 #include "ext/standard/info.h"
24 #include "mod_db4_export.h"
30 #define my_db_create mod_db4_db_create
31 #define my_db_env_create mod_db4_db_env_create
33 #define my_db_create db_create
34 #define my_db_env_create db_env_create
37 #if PHP_MAJOR_VERSION <= 4
38 unsigned char second_arg_force_ref[] = { 2, BYREF_NONE, BYREF_FORCE };
39 unsigned char third_arg_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
42 /* True global resources - no need for thread safety here */
50 struct my_llist *open_cursors;
51 struct my_llist *open_dbs;
56 struct php_DB_TXN *parent_txn;
57 struct php_DB *parent_db;
62 struct my_llist *open_cursors;
69 static void _free_php_db_txn(zend_rsrc_list_entry *rsrc TSRMLS_DC)
71 struct php_DB_TXN *pdbtxn = (struct php_DB_TXN *) rsrc->ptr;
72 /* should probably iterate over open_cursors */
74 if(pdbtxn->db_txn) pdbtxn->db_txn->abort(pdbtxn->db_txn);
75 pdbtxn->db_txn = NULL;
77 if(pdbtxn) efree(pdbtxn);
80 static void _free_php_dbc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
82 struct php_DBC *pdbc = (struct php_DBC *) rsrc->ptr;
90 static void _free_php_db(zend_rsrc_list_entry *rsrc TSRMLS_DC)
92 struct php_DB *pdb = (struct php_DB *) rsrc->ptr;
94 if(pdb->db) pdb->db->close(pdb->db, 0);
100 static void _free_php_dbenv(zend_rsrc_list_entry *rsrc TSRMLS_DC)
102 struct php_DB_ENV *pdb = (struct php_DB_ENV *)rsrc->ptr;
106 dbe = DbEnv::get_DbEnv(pdb->dbenv);
107 if(dbe) dbe->close(0);
114 static zend_class_entry *db_txn_ce;
115 static zend_class_entry *dbc_ce;
116 static zend_class_entry *db_ce;
117 static zend_class_entry *db_env_ce;
122 struct my_llist *next;
123 struct my_llist *prev;
126 static struct my_llist *my_llist_add(struct my_llist *list, void *data) {
128 list = (struct my_llist *)emalloc(sizeof(*list));
130 list->next = list->prev = NULL;
133 struct my_llist *node;
134 node = (struct my_llist *)emalloc(sizeof(*node));
142 static struct my_llist *my_llist_del(struct my_llist *list, void *data) {
143 struct my_llist *ptr = list;
144 if(!ptr) return NULL;
145 if(ptr->data == data) { /* special case, first element */
151 if(data == ptr->data) {
152 if(ptr->prev) ptr->prev->next = ptr->next;
153 if(ptr->next) ptr->next->prev = ptr->prev;
162 /* {{{ db4_functions[]
164 * Every user visible function must have an entry in db4_functions[].
166 function_entry db4_functions[] = {
167 /* PHP_FE(db4_dbenv_create, NULL) */
168 {NULL, NULL, NULL} /* Must be the last line in db4_functions[] */
172 PHP_MINIT_FUNCTION(db4);
173 PHP_MSHUTDOWN_FUNCTION(db4);
174 PHP_RINIT_FUNCTION(db4);
175 PHP_RSHUTDOWN_FUNCTION(db4);
176 PHP_MINFO_FUNCTION(db4);
178 /* {{{ db4_module_entry
180 zend_module_entry db4_module_entry = {
181 #if ZEND_MODULE_API_NO >= 20010901
182 STANDARD_MODULE_HEADER,
191 "0.9", /* Replace with version number for your extension */
192 STANDARD_MODULE_PROPERTIES
199 /* {{{ DB4Txn method forward declarations
202 zend_class_entry *db_txn_ce_get(void)
207 ZEND_NAMED_FUNCTION(_wrap_db_txn_abort);
208 ZEND_NAMED_FUNCTION(_wrap_db_txn_commit);
209 ZEND_NAMED_FUNCTION(_wrap_db_txn_discard);
210 ZEND_NAMED_FUNCTION(_wrap_db_txn_id);
211 ZEND_NAMED_FUNCTION(_wrap_db_txn_set_timeout);
212 ZEND_NAMED_FUNCTION(_wrap_db_txn_set_name);
213 ZEND_NAMED_FUNCTION(_wrap_db_txn_get_name);
214 ZEND_NAMED_FUNCTION(_wrap_new_DbTxn);
216 static zend_function_entry DbTxn_functions[] = {
217 ZEND_NAMED_FE(abort, _wrap_db_txn_abort, NULL)
218 ZEND_NAMED_FE(commit, _wrap_db_txn_commit, NULL)
219 ZEND_NAMED_FE(discard, _wrap_db_txn_discard, NULL)
220 ZEND_NAMED_FE(id, _wrap_db_txn_id, NULL)
221 ZEND_NAMED_FE(set_timeout, _wrap_db_txn_set_timeout, NULL)
222 ZEND_NAMED_FE(set_name, _wrap_db_txn_set_name, NULL)
223 ZEND_NAMED_FE(get_name, _wrap_db_txn_get_name, NULL)
224 ZEND_NAMED_FE(db4txn, _wrap_new_DbTxn, NULL)
229 /* {{{ DB4Cursor method forward declarations
232 zend_class_entry *dbc_ce_get(void)
237 ZEND_NAMED_FUNCTION(_wrap_dbc_close);
238 ZEND_NAMED_FUNCTION(_wrap_dbc_count);
239 ZEND_NAMED_FUNCTION(_wrap_dbc_del);
240 ZEND_NAMED_FUNCTION(_wrap_dbc_dup);
241 ZEND_NAMED_FUNCTION(_wrap_dbc_get);
242 ZEND_NAMED_FUNCTION(_wrap_dbc_put);
243 ZEND_NAMED_FUNCTION(_wrap_dbc_pget);
246 ZEND_BEGIN_ARG_INFO(first_and_second_args_force_ref, 0)
247 ZEND_ARG_PASS_INFO(1)
248 ZEND_ARG_PASS_INFO(1)
251 ZEND_BEGIN_ARG_INFO(first_and_second_and_third_args_force_ref, 0)
252 ZEND_ARG_PASS_INFO(1)
253 ZEND_ARG_PASS_INFO(1)
257 static unsigned char first_and_second_args_force_ref[] = {2, BYREF_FORCE, BYREF_FORCE };
258 static unsigned char first_and_second_and_third_args_force_ref[] = {3, BYREF_FORCE, BYREF_FORCE, BYREF_FORCE };
261 static zend_function_entry Dbc_functions[] = {
262 ZEND_NAMED_FE(close, _wrap_dbc_close, NULL)
263 ZEND_NAMED_FE(count, _wrap_dbc_count, NULL)
264 ZEND_NAMED_FE(del, _wrap_dbc_del, NULL)
265 ZEND_NAMED_FE(dup, _wrap_dbc_dup, NULL)
266 ZEND_NAMED_FE(get, _wrap_dbc_get, first_and_second_args_force_ref)
267 ZEND_NAMED_FE(put, _wrap_dbc_put, NULL)
268 ZEND_NAMED_FE(pget, _wrap_dbc_pget, first_and_second_and_third_args_force_ref)
273 /* {{{ DB4Env method forward declarations
276 zend_class_entry *db_env_ce_get(void)
281 ZEND_NAMED_FUNCTION(_wrap_new_DbEnv);
282 ZEND_NAMED_FUNCTION(_wrap_db_env_close);
283 ZEND_NAMED_FUNCTION(_wrap_db_env_dbremove);
284 ZEND_NAMED_FUNCTION(_wrap_db_env_dbrename);
285 ZEND_NAMED_FUNCTION(_wrap_db_env_get_encrypt_flags);
286 ZEND_NAMED_FUNCTION(_wrap_db_env_open);
287 ZEND_NAMED_FUNCTION(_wrap_db_env_remove);
288 ZEND_NAMED_FUNCTION(_wrap_db_env_set_data_dir);
289 ZEND_NAMED_FUNCTION(_wrap_db_env_set_encrypt);
290 ZEND_NAMED_FUNCTION(_wrap_db_env_txn_begin);
291 ZEND_NAMED_FUNCTION(_wrap_db_env_txn_checkpoint);
293 static zend_function_entry DbEnv_functions[] = {
294 ZEND_NAMED_FE(db4env, _wrap_new_DbEnv, NULL)
295 ZEND_NAMED_FE(close, _wrap_db_env_close, NULL)
296 ZEND_NAMED_FE(dbremove, _wrap_db_env_dbremove, NULL)
297 ZEND_NAMED_FE(dbrename, _wrap_db_env_dbrename, NULL)
298 ZEND_NAMED_FE(get_encrypt, _wrap_db_env_get_encrypt_flags, NULL)
299 ZEND_NAMED_FE(open, _wrap_db_env_open, NULL)
300 ZEND_NAMED_FE(remove, _wrap_db_env_remove, NULL)
301 ZEND_NAMED_FE(set_data_dir, _wrap_db_env_set_data_dir, NULL)
302 ZEND_NAMED_FE(set_encrypt, _wrap_db_env_set_encrypt, NULL)
303 ZEND_NAMED_FE(txn_begin, _wrap_db_env_txn_begin, NULL)
304 ZEND_NAMED_FE(txn_checkpoint, _wrap_db_env_txn_checkpoint, NULL)
310 /* {{{ DB4 method forward declarations
313 zend_class_entry *db_ce_get(void)
318 ZEND_NAMED_FUNCTION(_wrap_new_db4);
319 ZEND_NAMED_FUNCTION(_wrap_db_open);
320 ZEND_NAMED_FUNCTION(_wrap_db_close);
321 ZEND_NAMED_FUNCTION(_wrap_db_del);
322 ZEND_NAMED_FUNCTION(_wrap_db_get);
323 ZEND_NAMED_FUNCTION(_wrap_db_get_encrypt_flags);
324 ZEND_NAMED_FUNCTION(_wrap_db_pget);
325 ZEND_NAMED_FUNCTION(_wrap_db_get_type);
326 ZEND_NAMED_FUNCTION(_wrap_db_join);
327 ZEND_NAMED_FUNCTION(_wrap_db_put);
328 ZEND_NAMED_FUNCTION(_wrap_db_set_encrypt);
329 ZEND_NAMED_FUNCTION(_wrap_db_stat);
330 ZEND_NAMED_FUNCTION(_wrap_db_sync);
331 ZEND_NAMED_FUNCTION(_wrap_db_truncate);
332 ZEND_NAMED_FUNCTION(_wrap_db_cursor);
334 static zend_function_entry Db4_functions[] = {
335 ZEND_NAMED_FE(db4, _wrap_new_db4, NULL)
336 ZEND_NAMED_FE(open, _wrap_db_open, NULL)
337 ZEND_NAMED_FE(close, _wrap_db_close, NULL)
338 ZEND_NAMED_FE(cursor, _wrap_db_cursor, NULL)
339 ZEND_NAMED_FE(del, _wrap_db_del, NULL)
340 ZEND_NAMED_FE(get, _wrap_db_get, NULL)
341 ZEND_NAMED_FE(get_encrypt_flags, _wrap_db_get_encrypt_flags, NULL)
342 ZEND_NAMED_FE(pget, _wrap_db_pget, second_arg_force_ref)
343 ZEND_NAMED_FE(get_type, _wrap_db_get_type, NULL)
344 ZEND_NAMED_FE(join, _wrap_db_join, NULL)
345 ZEND_NAMED_FE(put, _wrap_db_put, NULL)
346 ZEND_NAMED_FE(set_encrypt, _wrap_db_set_encrypt, NULL)
347 ZEND_NAMED_FE(stat, _wrap_db_stat, NULL)
348 ZEND_NAMED_FE(sync, _wrap_db_sync, NULL)
349 ZEND_NAMED_FE(truncate, _wrap_db_truncate, NULL)
355 #ifdef COMPILE_DL_DB4
357 #include "zend_arg_defs.c"
366 /* Remove comments and fill if you need to have entries in php.ini
372 /* {{{ php_db4_init_globals
374 /* Uncomment this function if you have INI entries
375 static void php_db4_init_globals(zend_db4_globals *db4_globals)
381 /* {{{ PHP_MINIT_FUNCTION
383 PHP_MINIT_FUNCTION(db4)
385 /* If you have INI entries, uncomment these lines
386 ZEND_INIT_MODULE_GLOBALS(db4, php_db4_init_globals, NULL);
387 REGISTER_INI_ENTRIES();
389 static zend_class_entry _db_txn_ce;
390 static zend_class_entry _dbc_ce;
391 static zend_class_entry _db_ce;
392 static zend_class_entry _db_env_ce;
394 INIT_CLASS_ENTRY(_db_txn_ce, "db4txn", DbTxn_functions);
395 db_txn_ce = zend_register_internal_class(&_db_txn_ce TSRMLS_CC);
397 INIT_CLASS_ENTRY(_dbc_ce, "db4cursor", Dbc_functions);
398 dbc_ce = zend_register_internal_class(&_dbc_ce TSRMLS_CC);
400 INIT_CLASS_ENTRY(_db_ce, "db4", Db4_functions);
401 db_ce = zend_register_internal_class(&_db_ce TSRMLS_CC);
403 INIT_CLASS_ENTRY(_db_env_ce, "db4env", DbEnv_functions);
404 db_env_ce = zend_register_internal_class(&_db_env_ce TSRMLS_CC);
406 le_db_txn = zend_register_list_destructors_ex(_free_php_db_txn, NULL, "Db4Txn", module_number);
407 le_dbc = zend_register_list_destructors_ex(_free_php_dbc, NULL, "Db4Cursor", module_number);
408 le_db = zend_register_list_destructors_ex(_free_php_db, NULL, "Db4", module_number);
409 le_dbenv = zend_register_list_destructors_ex(_free_php_dbenv, NULL, "Db4Env", module_number);
411 REGISTER_LONG_CONSTANT("DB_VERSION_MAJOR", DB_VERSION_MAJOR, CONST_CS | CONST_PERSISTENT);
412 REGISTER_LONG_CONSTANT("DB_VERSION_MINOR", DB_VERSION_MINOR, CONST_CS | CONST_PERSISTENT);
413 REGISTER_LONG_CONSTANT("DB_VERSION_PATCH", DB_VERSION_PATCH, CONST_CS | CONST_PERSISTENT);
414 REGISTER_STRING_CONSTANT("DB_VERSION_STRING", DB_VERSION_STRING, CONST_CS | CONST_PERSISTENT);
415 REGISTER_LONG_CONSTANT("DB_MAX_PAGES", DB_MAX_PAGES, CONST_CS | CONST_PERSISTENT);
416 REGISTER_LONG_CONSTANT("DB_MAX_RECORDS", DB_MAX_RECORDS, CONST_CS | CONST_PERSISTENT);
417 REGISTER_LONG_CONSTANT("DB_DBT_APPMALLOC", DB_DBT_APPMALLOC, CONST_CS | CONST_PERSISTENT);
418 REGISTER_LONG_CONSTANT("DB_DBT_ISSET", DB_DBT_ISSET, CONST_CS | CONST_PERSISTENT);
419 REGISTER_LONG_CONSTANT("DB_DBT_MALLOC", DB_DBT_MALLOC, CONST_CS | CONST_PERSISTENT);
420 REGISTER_LONG_CONSTANT("DB_DBT_PARTIAL", DB_DBT_PARTIAL, CONST_CS | CONST_PERSISTENT);
421 REGISTER_LONG_CONSTANT("DB_DBT_REALLOC", DB_DBT_REALLOC, CONST_CS | CONST_PERSISTENT);
422 REGISTER_LONG_CONSTANT("DB_DBT_USERMEM", DB_DBT_USERMEM, CONST_CS | CONST_PERSISTENT);
423 REGISTER_LONG_CONSTANT("DB_DBT_DUPOK", DB_DBT_DUPOK, CONST_CS | CONST_PERSISTENT);
424 REGISTER_LONG_CONSTANT("DB_CREATE", DB_CREATE, CONST_CS | CONST_PERSISTENT);
425 REGISTER_LONG_CONSTANT("DB_CXX_NO_EXCEPTIONS", DB_CXX_NO_EXCEPTIONS, CONST_CS | CONST_PERSISTENT);
426 REGISTER_LONG_CONSTANT("DB_FORCE", DB_FORCE, CONST_CS | CONST_PERSISTENT);
427 REGISTER_LONG_CONSTANT("DB_NOMMAP", DB_NOMMAP, CONST_CS | CONST_PERSISTENT);
428 REGISTER_LONG_CONSTANT("DB_RDONLY", DB_RDONLY, CONST_CS | CONST_PERSISTENT);
429 REGISTER_LONG_CONSTANT("DB_RECOVER", DB_RECOVER, CONST_CS | CONST_PERSISTENT);
430 REGISTER_LONG_CONSTANT("DB_MULTIVERSION", DB_MULTIVERSION, CONST_CS | CONST_PERSISTENT);
431 REGISTER_LONG_CONSTANT("DB_TXN_SNAPSHOT", DB_TXN_SNAPSHOT, CONST_CS | CONST_PERSISTENT);
432 REGISTER_LONG_CONSTANT("DB_THREAD", DB_THREAD, CONST_CS | CONST_PERSISTENT);
433 REGISTER_LONG_CONSTANT("DB_TRUNCATE", DB_TRUNCATE, CONST_CS | CONST_PERSISTENT);
434 REGISTER_LONG_CONSTANT("DB_TXN_NOSYNC", DB_TXN_NOSYNC, CONST_CS | CONST_PERSISTENT);
435 REGISTER_LONG_CONSTANT("DB_TXN_NOT_DURABLE", DB_TXN_NOT_DURABLE, CONST_CS | CONST_PERSISTENT);
436 REGISTER_LONG_CONSTANT("DB_USE_ENVIRON", DB_USE_ENVIRON, CONST_CS | CONST_PERSISTENT);
437 REGISTER_LONG_CONSTANT("DB_USE_ENVIRON_ROOT", DB_USE_ENVIRON_ROOT, CONST_CS | CONST_PERSISTENT);
438 REGISTER_LONG_CONSTANT("DB_AUTO_COMMIT", DB_AUTO_COMMIT, CONST_CS | CONST_PERSISTENT);
439 REGISTER_LONG_CONSTANT("DB_DIRTY_READ", DB_READ_UNCOMMITTED, CONST_CS | CONST_PERSISTENT);
440 REGISTER_LONG_CONSTANT("DB_DEGREE_2", DB_READ_COMMITTED, CONST_CS | CONST_PERSISTENT);
441 REGISTER_LONG_CONSTANT("DB_READ_COMMITTED", DB_READ_COMMITTED, CONST_CS | CONST_PERSISTENT);
442 REGISTER_LONG_CONSTANT("DB_READ_UNCOMMITTED", DB_READ_UNCOMMITTED, CONST_CS | CONST_PERSISTENT);
443 REGISTER_LONG_CONSTANT("DB_NO_AUTO_COMMIT", DB_NO_AUTO_COMMIT, CONST_CS | CONST_PERSISTENT);
444 REGISTER_LONG_CONSTANT("DB_RPCCLIENT", DB_RPCCLIENT, CONST_CS | CONST_PERSISTENT);
445 REGISTER_LONG_CONSTANT("DB_INIT_CDB", DB_INIT_CDB, CONST_CS | CONST_PERSISTENT);
446 REGISTER_LONG_CONSTANT("DB_INIT_LOCK", DB_INIT_LOCK, CONST_CS | CONST_PERSISTENT);
447 REGISTER_LONG_CONSTANT("DB_INIT_LOG", DB_INIT_LOG, CONST_CS | CONST_PERSISTENT);
448 REGISTER_LONG_CONSTANT("DB_INIT_MPOOL", DB_INIT_MPOOL, CONST_CS | CONST_PERSISTENT);
449 REGISTER_LONG_CONSTANT("DB_INIT_REP", DB_INIT_REP, CONST_CS | CONST_PERSISTENT);
450 REGISTER_LONG_CONSTANT("DB_INIT_TXN", DB_INIT_TXN, CONST_CS | CONST_PERSISTENT);
451 REGISTER_LONG_CONSTANT("DB_JOINENV", DB_JOINENV, CONST_CS | CONST_PERSISTENT);
452 REGISTER_LONG_CONSTANT("DB_LOCKDOWN", DB_LOCKDOWN, CONST_CS | CONST_PERSISTENT);
453 REGISTER_LONG_CONSTANT("DB_PRIVATE", DB_PRIVATE, CONST_CS | CONST_PERSISTENT);
454 REGISTER_LONG_CONSTANT("DB_RECOVER_FATAL", DB_RECOVER_FATAL, CONST_CS | CONST_PERSISTENT);
455 REGISTER_LONG_CONSTANT("DB_SYSTEM_MEM", DB_SYSTEM_MEM, CONST_CS | CONST_PERSISTENT);
456 REGISTER_LONG_CONSTANT("DB_EXCL", DB_EXCL, CONST_CS | CONST_PERSISTENT);
457 REGISTER_LONG_CONSTANT("DB_FCNTL_LOCKING", DB_FCNTL_LOCKING, CONST_CS | CONST_PERSISTENT);
458 REGISTER_LONG_CONSTANT("DB_RDWRMASTER", DB_RDWRMASTER, CONST_CS | CONST_PERSISTENT);
459 REGISTER_LONG_CONSTANT("DB_WRITEOPEN", DB_WRITEOPEN, CONST_CS | CONST_PERSISTENT);
460 REGISTER_LONG_CONSTANT("DB_TXN_NOWAIT", DB_TXN_NOWAIT, CONST_CS | CONST_PERSISTENT);
461 REGISTER_LONG_CONSTANT("DB_TXN_SYNC", DB_TXN_SYNC, CONST_CS | CONST_PERSISTENT);
462 REGISTER_LONG_CONSTANT("DB_ENCRYPT_AES", DB_ENCRYPT_AES, CONST_CS | CONST_PERSISTENT);
463 REGISTER_LONG_CONSTANT("DB_CDB_ALLDB", DB_CDB_ALLDB, CONST_CS | CONST_PERSISTENT);
464 REGISTER_LONG_CONSTANT("DB_DIRECT_DB", DB_DIRECT_DB, CONST_CS | CONST_PERSISTENT);
465 REGISTER_LONG_CONSTANT("DB_NOLOCKING", DB_NOLOCKING, CONST_CS | CONST_PERSISTENT);
466 REGISTER_LONG_CONSTANT("DB_NOPANIC", DB_NOPANIC, CONST_CS | CONST_PERSISTENT);
467 REGISTER_LONG_CONSTANT("DB_OVERWRITE", DB_OVERWRITE, CONST_CS | CONST_PERSISTENT);
468 REGISTER_LONG_CONSTANT("DB_PANIC_ENVIRONMENT", DB_PANIC_ENVIRONMENT, CONST_CS | CONST_PERSISTENT);
469 REGISTER_LONG_CONSTANT("DB_REGION_INIT", DB_REGION_INIT, CONST_CS | CONST_PERSISTENT);
470 REGISTER_LONG_CONSTANT("DB_TIME_NOTGRANTED", DB_TIME_NOTGRANTED, CONST_CS | CONST_PERSISTENT);
471 REGISTER_LONG_CONSTANT("DB_TXN_WRITE_NOSYNC", DB_TXN_WRITE_NOSYNC, CONST_CS | CONST_PERSISTENT);
472 REGISTER_LONG_CONSTANT("DB_YIELDCPU", DB_YIELDCPU, CONST_CS | CONST_PERSISTENT);
473 REGISTER_LONG_CONSTANT("DB_UPGRADE", DB_UPGRADE, CONST_CS | CONST_PERSISTENT);
474 REGISTER_LONG_CONSTANT("DB_VERIFY", DB_VERIFY, CONST_CS | CONST_PERSISTENT);
475 REGISTER_LONG_CONSTANT("DB_DIRECT", DB_DIRECT, CONST_CS | CONST_PERSISTENT);
476 REGISTER_LONG_CONSTANT("DB_EXTENT", DB_EXTENT, CONST_CS | CONST_PERSISTENT);
477 REGISTER_LONG_CONSTANT("DB_ODDFILESIZE", DB_ODDFILESIZE, CONST_CS | CONST_PERSISTENT);
478 REGISTER_LONG_CONSTANT("DB_CHKSUM", DB_CHKSUM, CONST_CS | CONST_PERSISTENT);
479 REGISTER_LONG_CONSTANT("DB_DUP", DB_DUP, CONST_CS | CONST_PERSISTENT);
480 REGISTER_LONG_CONSTANT("DB_DUPSORT", DB_DUPSORT, CONST_CS | CONST_PERSISTENT);
481 REGISTER_LONG_CONSTANT("DB_ENCRYPT", DB_ENCRYPT, CONST_CS | CONST_PERSISTENT);
482 REGISTER_LONG_CONSTANT("DB_RECNUM", DB_RECNUM, CONST_CS | CONST_PERSISTENT);
483 REGISTER_LONG_CONSTANT("DB_RENUMBER", DB_RENUMBER, CONST_CS | CONST_PERSISTENT);
484 REGISTER_LONG_CONSTANT("DB_REVSPLITOFF", DB_REVSPLITOFF, CONST_CS | CONST_PERSISTENT);
485 REGISTER_LONG_CONSTANT("DB_SNAPSHOT", DB_SNAPSHOT, CONST_CS | CONST_PERSISTENT);
486 REGISTER_LONG_CONSTANT("DB_STAT_CLEAR", DB_STAT_CLEAR, CONST_CS | CONST_PERSISTENT);
487 REGISTER_LONG_CONSTANT("DB_JOIN_NOSORT", DB_JOIN_NOSORT, CONST_CS | CONST_PERSISTENT);
488 REGISTER_LONG_CONSTANT("DB_AGGRESSIVE", DB_AGGRESSIVE, CONST_CS | CONST_PERSISTENT);
489 REGISTER_LONG_CONSTANT("DB_NOORDERCHK", DB_NOORDERCHK, CONST_CS | CONST_PERSISTENT);
490 REGISTER_LONG_CONSTANT("DB_ORDERCHKONLY", DB_ORDERCHKONLY, CONST_CS | CONST_PERSISTENT);
491 REGISTER_LONG_CONSTANT("DB_PR_PAGE", DB_PR_PAGE, CONST_CS | CONST_PERSISTENT);
492 REGISTER_LONG_CONSTANT("DB_PR_RECOVERYTEST", DB_PR_RECOVERYTEST, CONST_CS | CONST_PERSISTENT);
493 REGISTER_LONG_CONSTANT("DB_PRINTABLE", DB_PRINTABLE, CONST_CS | CONST_PERSISTENT);
494 REGISTER_LONG_CONSTANT("DB_SALVAGE", DB_SALVAGE, CONST_CS | CONST_PERSISTENT);
495 REGISTER_LONG_CONSTANT("DB_REP_NOBUFFER", DB_REP_NOBUFFER, CONST_CS | CONST_PERSISTENT);
496 REGISTER_LONG_CONSTANT("DB_REP_PERMANENT", DB_REP_PERMANENT, CONST_CS | CONST_PERSISTENT);
497 REGISTER_LONG_CONSTANT("DB_LOCKVERSION", DB_LOCKVERSION, CONST_CS | CONST_PERSISTENT);
498 REGISTER_LONG_CONSTANT("DB_FILE_ID_LEN", DB_FILE_ID_LEN, CONST_CS | CONST_PERSISTENT);
499 REGISTER_LONG_CONSTANT("DB_LOCK_NORUN", DB_LOCK_NORUN, CONST_CS | CONST_PERSISTENT);
500 REGISTER_LONG_CONSTANT("DB_LOCK_DEFAULT", DB_LOCK_DEFAULT, CONST_CS | CONST_PERSISTENT);
501 REGISTER_LONG_CONSTANT("DB_LOCK_EXPIRE", DB_LOCK_EXPIRE, CONST_CS | CONST_PERSISTENT);
502 REGISTER_LONG_CONSTANT("DB_LOCK_MAXLOCKS", DB_LOCK_MAXLOCKS, CONST_CS | CONST_PERSISTENT);
503 REGISTER_LONG_CONSTANT("DB_LOCK_MINLOCKS", DB_LOCK_MINLOCKS, CONST_CS | CONST_PERSISTENT);
504 REGISTER_LONG_CONSTANT("DB_LOCK_MINWRITE", DB_LOCK_MINWRITE, CONST_CS | CONST_PERSISTENT);
505 REGISTER_LONG_CONSTANT("DB_LOCK_OLDEST", DB_LOCK_OLDEST, CONST_CS | CONST_PERSISTENT);
506 REGISTER_LONG_CONSTANT("DB_LOCK_RANDOM", DB_LOCK_RANDOM, CONST_CS | CONST_PERSISTENT);
507 REGISTER_LONG_CONSTANT("DB_LOCK_YOUNGEST", DB_LOCK_YOUNGEST, CONST_CS | CONST_PERSISTENT);
508 REGISTER_LONG_CONSTANT("DB_LOCK_NOWAIT", DB_LOCK_NOWAIT, CONST_CS | CONST_PERSISTENT);
509 REGISTER_LONG_CONSTANT("DB_LOCK_RECORD", DB_LOCK_RECORD, CONST_CS | CONST_PERSISTENT);
510 REGISTER_LONG_CONSTANT("DB_LOCK_SET_TIMEOUT", DB_LOCK_SET_TIMEOUT, CONST_CS | CONST_PERSISTENT);
511 REGISTER_LONG_CONSTANT("DB_LOCK_SWITCH", DB_LOCK_SWITCH, CONST_CS | CONST_PERSISTENT);
512 REGISTER_LONG_CONSTANT("DB_LOCK_UPGRADE", DB_LOCK_UPGRADE, CONST_CS | CONST_PERSISTENT);
513 REGISTER_LONG_CONSTANT("DB_HANDLE_LOCK", DB_HANDLE_LOCK, CONST_CS | CONST_PERSISTENT);
514 REGISTER_LONG_CONSTANT("DB_RECORD_LOCK", DB_RECORD_LOCK, CONST_CS | CONST_PERSISTENT);
515 REGISTER_LONG_CONSTANT("DB_PAGE_LOCK", DB_PAGE_LOCK, CONST_CS | CONST_PERSISTENT);
516 REGISTER_LONG_CONSTANT("DB_LOGVERSION", DB_LOGVERSION, CONST_CS | CONST_PERSISTENT);
517 REGISTER_LONG_CONSTANT("DB_LOGOLDVER", DB_LOGOLDVER, CONST_CS | CONST_PERSISTENT);
518 REGISTER_LONG_CONSTANT("DB_LOGMAGIC", DB_LOGMAGIC, CONST_CS | CONST_PERSISTENT);
519 REGISTER_LONG_CONSTANT("DB_ARCH_ABS", DB_ARCH_ABS, CONST_CS | CONST_PERSISTENT);
520 REGISTER_LONG_CONSTANT("DB_ARCH_DATA", DB_ARCH_DATA, CONST_CS | CONST_PERSISTENT);
521 REGISTER_LONG_CONSTANT("DB_ARCH_LOG", DB_ARCH_LOG, CONST_CS | CONST_PERSISTENT);
522 REGISTER_LONG_CONSTANT("DB_ARCH_REMOVE", DB_ARCH_REMOVE, CONST_CS | CONST_PERSISTENT);
523 REGISTER_LONG_CONSTANT("DB_FLUSH", DB_FLUSH, CONST_CS | CONST_PERSISTENT);
524 REGISTER_LONG_CONSTANT("DB_LOG_CHKPNT", DB_LOG_CHKPNT, CONST_CS | CONST_PERSISTENT);
525 REGISTER_LONG_CONSTANT("DB_LOG_COMMIT", DB_LOG_COMMIT, CONST_CS | CONST_PERSISTENT);
526 REGISTER_LONG_CONSTANT("DB_LOG_NOCOPY", DB_LOG_NOCOPY, CONST_CS | CONST_PERSISTENT);
527 REGISTER_LONG_CONSTANT("DB_LOG_NOT_DURABLE", DB_LOG_NOT_DURABLE, CONST_CS | CONST_PERSISTENT);
528 REGISTER_LONG_CONSTANT("DB_LOG_WRNOSYNC", DB_LOG_WRNOSYNC, CONST_CS | CONST_PERSISTENT);
529 REGISTER_LONG_CONSTANT("DB_user_BEGIN", DB_user_BEGIN, CONST_CS | CONST_PERSISTENT);
530 REGISTER_LONG_CONSTANT("DB_debug_FLAG", DB_debug_FLAG, CONST_CS | CONST_PERSISTENT);
531 REGISTER_LONG_CONSTANT("DB_LOG_DISK", DB_LOG_DISK, CONST_CS | CONST_PERSISTENT);
532 REGISTER_LONG_CONSTANT("DB_LOG_LOCKED", DB_LOG_LOCKED, CONST_CS | CONST_PERSISTENT);
533 REGISTER_LONG_CONSTANT("DB_LOG_SILENT_ERR", DB_LOG_SILENT_ERR, CONST_CS | CONST_PERSISTENT);
534 REGISTER_LONG_CONSTANT("DB_MPOOL_CREATE", DB_MPOOL_CREATE, CONST_CS | CONST_PERSISTENT);
535 REGISTER_LONG_CONSTANT("DB_MPOOL_LAST", DB_MPOOL_LAST, CONST_CS | CONST_PERSISTENT);
536 REGISTER_LONG_CONSTANT("DB_MPOOL_NEW", DB_MPOOL_NEW, CONST_CS | CONST_PERSISTENT);
537 REGISTER_LONG_CONSTANT("DB_MPOOL_DIRTY", DB_MPOOL_DIRTY, CONST_CS | CONST_PERSISTENT);
538 REGISTER_LONG_CONSTANT("DB_MPOOL_DISCARD", DB_MPOOL_DISCARD, CONST_CS | CONST_PERSISTENT);
539 REGISTER_LONG_CONSTANT("DB_MPOOL_NOFILE", DB_MPOOL_NOFILE, CONST_CS | CONST_PERSISTENT);
540 REGISTER_LONG_CONSTANT("DB_MPOOL_UNLINK", DB_MPOOL_UNLINK, CONST_CS | CONST_PERSISTENT);
541 REGISTER_LONG_CONSTANT("DB_TXNVERSION", DB_TXNVERSION, CONST_CS | CONST_PERSISTENT);
542 REGISTER_LONG_CONSTANT("DB_GID_SIZE", DB_GID_SIZE, CONST_CS | CONST_PERSISTENT);
543 REGISTER_LONG_CONSTANT("DB_EID_BROADCAST", DB_EID_BROADCAST, CONST_CS | CONST_PERSISTENT);
544 REGISTER_LONG_CONSTANT("DB_EID_INVALID", DB_EID_INVALID, CONST_CS | CONST_PERSISTENT);
545 REGISTER_LONG_CONSTANT("DB_REP_CLIENT", DB_REP_CLIENT, CONST_CS | CONST_PERSISTENT);
546 REGISTER_LONG_CONSTANT("DB_REP_MASTER", DB_REP_MASTER, CONST_CS | CONST_PERSISTENT);
547 REGISTER_LONG_CONSTANT("DB_RENAMEMAGIC", DB_RENAMEMAGIC, CONST_CS | CONST_PERSISTENT);
548 REGISTER_LONG_CONSTANT("DB_BTREEVERSION", DB_BTREEVERSION, CONST_CS | CONST_PERSISTENT);
549 REGISTER_LONG_CONSTANT("DB_BTREEOLDVER", DB_BTREEOLDVER, CONST_CS | CONST_PERSISTENT);
550 REGISTER_LONG_CONSTANT("DB_BTREEMAGIC", DB_BTREEMAGIC, CONST_CS | CONST_PERSISTENT);
551 REGISTER_LONG_CONSTANT("DB_HASHVERSION", DB_HASHVERSION, CONST_CS | CONST_PERSISTENT);
552 REGISTER_LONG_CONSTANT("DB_HASHOLDVER", DB_HASHOLDVER, CONST_CS | CONST_PERSISTENT);
553 REGISTER_LONG_CONSTANT("DB_HASHMAGIC", DB_HASHMAGIC, CONST_CS | CONST_PERSISTENT);
554 REGISTER_LONG_CONSTANT("DB_QAMVERSION", DB_QAMVERSION, CONST_CS | CONST_PERSISTENT);
555 REGISTER_LONG_CONSTANT("DB_QAMOLDVER", DB_QAMOLDVER, CONST_CS | CONST_PERSISTENT);
556 REGISTER_LONG_CONSTANT("DB_QAMMAGIC", DB_QAMMAGIC, CONST_CS | CONST_PERSISTENT);
557 REGISTER_LONG_CONSTANT("DB_AFTER", DB_AFTER, CONST_CS | CONST_PERSISTENT);
558 REGISTER_LONG_CONSTANT("DB_APPEND", DB_APPEND, CONST_CS | CONST_PERSISTENT);
559 REGISTER_LONG_CONSTANT("DB_BEFORE", DB_BEFORE, CONST_CS | CONST_PERSISTENT);
560 REGISTER_LONG_CONSTANT("DB_CONSUME", DB_CONSUME, CONST_CS | CONST_PERSISTENT);
561 REGISTER_LONG_CONSTANT("DB_CONSUME_WAIT", DB_CONSUME_WAIT, CONST_CS | CONST_PERSISTENT);
562 REGISTER_LONG_CONSTANT("DB_CURRENT", DB_CURRENT, CONST_CS | CONST_PERSISTENT);
563 REGISTER_LONG_CONSTANT("DB_FAST_STAT", DB_FAST_STAT, CONST_CS | CONST_PERSISTENT);
564 REGISTER_LONG_CONSTANT("DB_FIRST", DB_FIRST, CONST_CS | CONST_PERSISTENT);
565 REGISTER_LONG_CONSTANT("DB_GET_BOTH", DB_GET_BOTH, CONST_CS | CONST_PERSISTENT);
566 REGISTER_LONG_CONSTANT("DB_GET_BOTHC", DB_GET_BOTHC, CONST_CS | CONST_PERSISTENT);
567 REGISTER_LONG_CONSTANT("DB_GET_BOTH_RANGE", DB_GET_BOTH_RANGE, CONST_CS | CONST_PERSISTENT);
568 REGISTER_LONG_CONSTANT("DB_GET_RECNO", DB_GET_RECNO, CONST_CS | CONST_PERSISTENT);
569 REGISTER_LONG_CONSTANT("DB_JOIN_ITEM", DB_JOIN_ITEM, CONST_CS | CONST_PERSISTENT);
570 REGISTER_LONG_CONSTANT("DB_KEYFIRST", DB_KEYFIRST, CONST_CS | CONST_PERSISTENT);
571 REGISTER_LONG_CONSTANT("DB_KEYLAST", DB_KEYLAST, CONST_CS | CONST_PERSISTENT);
572 REGISTER_LONG_CONSTANT("DB_LAST", DB_LAST, CONST_CS | CONST_PERSISTENT);
573 REGISTER_LONG_CONSTANT("DB_NEXT", DB_NEXT, CONST_CS | CONST_PERSISTENT);
574 REGISTER_LONG_CONSTANT("DB_NEXT_DUP", DB_NEXT_DUP, CONST_CS | CONST_PERSISTENT);
575 REGISTER_LONG_CONSTANT("DB_NEXT_NODUP", DB_NEXT_NODUP, CONST_CS | CONST_PERSISTENT);
576 REGISTER_LONG_CONSTANT("DB_NODUPDATA", DB_NODUPDATA, CONST_CS | CONST_PERSISTENT);
577 REGISTER_LONG_CONSTANT("DB_NOOVERWRITE", DB_NOOVERWRITE, CONST_CS | CONST_PERSISTENT);
578 REGISTER_LONG_CONSTANT("DB_NOSYNC", DB_NOSYNC, CONST_CS | CONST_PERSISTENT);
579 REGISTER_LONG_CONSTANT("DB_POSITION", DB_POSITION, CONST_CS | CONST_PERSISTENT);
580 REGISTER_LONG_CONSTANT("DB_PREV", DB_PREV, CONST_CS | CONST_PERSISTENT);
581 REGISTER_LONG_CONSTANT("DB_PREV_NODUP", DB_PREV_NODUP, CONST_CS | CONST_PERSISTENT);
582 REGISTER_LONG_CONSTANT("DB_SET", DB_SET, CONST_CS | CONST_PERSISTENT);
583 REGISTER_LONG_CONSTANT("DB_SET_LOCK_TIMEOUT", DB_SET_LOCK_TIMEOUT, CONST_CS | CONST_PERSISTENT);
584 REGISTER_LONG_CONSTANT("DB_SET_RANGE", DB_SET_RANGE, CONST_CS | CONST_PERSISTENT);
585 REGISTER_LONG_CONSTANT("DB_SET_RECNO", DB_SET_RECNO, CONST_CS | CONST_PERSISTENT);
586 REGISTER_LONG_CONSTANT("DB_SET_TXN_NOW", DB_SET_TXN_NOW, CONST_CS | CONST_PERSISTENT);
587 REGISTER_LONG_CONSTANT("DB_SET_TXN_TIMEOUT", DB_SET_TXN_TIMEOUT, CONST_CS | CONST_PERSISTENT);
588 REGISTER_LONG_CONSTANT("DB_UPDATE_SECONDARY", DB_UPDATE_SECONDARY, CONST_CS | CONST_PERSISTENT);
589 REGISTER_LONG_CONSTANT("DB_WRITECURSOR", DB_WRITECURSOR, CONST_CS | CONST_PERSISTENT);
590 REGISTER_LONG_CONSTANT("DB_WRITELOCK", DB_WRITELOCK, CONST_CS | CONST_PERSISTENT);
591 REGISTER_LONG_CONSTANT("DB_OPFLAGS_MASK", DB_OPFLAGS_MASK, CONST_CS | CONST_PERSISTENT);
592 REGISTER_LONG_CONSTANT("DB_MULTIPLE", DB_MULTIPLE, CONST_CS | CONST_PERSISTENT);
593 REGISTER_LONG_CONSTANT("DB_MULTIPLE_KEY", DB_MULTIPLE_KEY, CONST_CS | CONST_PERSISTENT);
594 REGISTER_LONG_CONSTANT("DB_RMW", DB_RMW, CONST_CS | CONST_PERSISTENT);
595 REGISTER_LONG_CONSTANT("DB_DONOTINDEX", DB_DONOTINDEX, CONST_CS | CONST_PERSISTENT);
596 REGISTER_LONG_CONSTANT("DB_KEYEMPTY", DB_KEYEMPTY, CONST_CS | CONST_PERSISTENT);
597 REGISTER_LONG_CONSTANT("DB_KEYEXIST", DB_KEYEXIST, CONST_CS | CONST_PERSISTENT);
598 REGISTER_LONG_CONSTANT("DB_LOCK_DEADLOCK", DB_LOCK_DEADLOCK, CONST_CS | CONST_PERSISTENT);
599 REGISTER_LONG_CONSTANT("DB_LOCK_NOTGRANTED", DB_LOCK_NOTGRANTED, CONST_CS | CONST_PERSISTENT);
600 REGISTER_LONG_CONSTANT("DB_NOSERVER", DB_NOSERVER, CONST_CS | CONST_PERSISTENT);
601 REGISTER_LONG_CONSTANT("DB_NOSERVER_HOME", DB_NOSERVER_HOME, CONST_CS | CONST_PERSISTENT);
602 REGISTER_LONG_CONSTANT("DB_NOSERVER_ID", DB_NOSERVER_ID, CONST_CS | CONST_PERSISTENT);
603 REGISTER_LONG_CONSTANT("DB_NOTFOUND", DB_NOTFOUND, CONST_CS | CONST_PERSISTENT);
604 REGISTER_LONG_CONSTANT("DB_OLD_VERSION", DB_OLD_VERSION, CONST_CS | CONST_PERSISTENT);
605 REGISTER_LONG_CONSTANT("DB_PAGE_NOTFOUND", DB_PAGE_NOTFOUND, CONST_CS | CONST_PERSISTENT);
606 REGISTER_LONG_CONSTANT("DB_REP_DUPMASTER", DB_REP_DUPMASTER, CONST_CS | CONST_PERSISTENT);
607 REGISTER_LONG_CONSTANT("DB_REP_HANDLE_DEAD", DB_REP_HANDLE_DEAD, CONST_CS | CONST_PERSISTENT);
608 REGISTER_LONG_CONSTANT("DB_REP_HOLDELECTION", DB_REP_HOLDELECTION, CONST_CS | CONST_PERSISTENT);
609 REGISTER_LONG_CONSTANT("DB_REP_ISPERM", DB_REP_ISPERM, CONST_CS | CONST_PERSISTENT);
610 REGISTER_LONG_CONSTANT("DB_REP_NEWMASTER", DB_REP_NEWMASTER, CONST_CS | CONST_PERSISTENT);
611 REGISTER_LONG_CONSTANT("DB_REP_NEWSITE", DB_REP_NEWSITE, CONST_CS | CONST_PERSISTENT);
612 REGISTER_LONG_CONSTANT("DB_REP_NOTPERM", DB_REP_NOTPERM, CONST_CS | CONST_PERSISTENT);
613 REGISTER_LONG_CONSTANT("DB_REP_UNAVAIL", DB_REP_UNAVAIL, CONST_CS | CONST_PERSISTENT);
614 REGISTER_LONG_CONSTANT("DB_RUNRECOVERY", DB_RUNRECOVERY, CONST_CS | CONST_PERSISTENT);
615 REGISTER_LONG_CONSTANT("DB_SECONDARY_BAD", DB_SECONDARY_BAD, CONST_CS | CONST_PERSISTENT);
616 REGISTER_LONG_CONSTANT("DB_VERIFY_BAD", DB_VERIFY_BAD, CONST_CS | CONST_PERSISTENT);
617 REGISTER_LONG_CONSTANT("DB_VERB_DEADLOCK", DB_VERB_DEADLOCK, CONST_CS | CONST_PERSISTENT);
618 REGISTER_LONG_CONSTANT("DB_VERB_RECOVERY", DB_VERB_RECOVERY, CONST_CS | CONST_PERSISTENT);
619 REGISTER_LONG_CONSTANT("DB_VERB_REPLICATION", DB_VERB_REPLICATION, CONST_CS | CONST_PERSISTENT);
620 REGISTER_LONG_CONSTANT("DB_VERB_WAITSFOR", DB_VERB_WAITSFOR, CONST_CS | CONST_PERSISTENT);
621 REGISTER_LONG_CONSTANT("DB_DBM_HSEARCH", DB_DBM_HSEARCH, CONST_CS | CONST_PERSISTENT);
626 /* {{{ PHP_MSHUTDOWN_FUNCTION
628 PHP_MSHUTDOWN_FUNCTION(db4)
630 /* uncomment this line if you have INI entries
631 UNREGISTER_INI_ENTRIES();
637 /* {{{ PHP_MINFO_FUNCTION
639 PHP_MINFO_FUNCTION(db4)
641 php_info_print_table_start();
642 php_info_print_table_header(2, "db4 support", "enabled");
643 php_info_print_table_end();
645 /* Remove comments if you have entries in php.ini
646 DISPLAY_INI_ENTRIES();
652 /* {{{ resource accessors
654 void setDbEnv(zval *z, DB_ENV *dbenv TSRMLS_DC)
657 struct php_DB_ENV *pdb = (struct php_DB_ENV *) emalloc(sizeof(*pdb));
659 rsrc_id = zend_register_resource(NULL, pdb, le_dbenv);
660 zend_list_addref(rsrc_id);
661 add_property_resource(z, "_dbenv_ptr", rsrc_id);
664 DB_ENV *php_db4_getDbEnvFromObj(zval *z TSRMLS_DC)
666 struct php_DB_ENV *pdb;
668 if(zend_hash_find(HASH_OF(z), "_dbenv_ptr", sizeof("_dbenv_ptr"),
669 (void **) &rsrc) == SUCCESS)
671 pdb = (struct php_DB_ENV *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Env", NULL, 1, le_dbenv);
677 struct php_DB_ENV *php_db4_getPhpDbEnvFromObj(zval *z TSRMLS_DC)
679 struct php_DB_ENV *pdb;
681 if(zend_hash_find(HASH_OF(z), "_dbenv_ptr", sizeof("_dbenv_ptr"),
682 (void **) &rsrc) == SUCCESS)
684 pdb = (struct php_DB_ENV *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Env", NULL, 1, le_dbenv);
690 #define getDbEnvFromThis(a) \
692 zval *_self = getThis(); \
694 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
697 (a) = php_db4_getDbEnvFromObj(_self TSRMLS_CC); \
699 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4Env object"); \
704 void setDb(zval *z, DB *db TSRMLS_DC)
707 struct php_DB *pdb = (struct php_DB *) emalloc(sizeof(*pdb));
708 memset(pdb, 0, sizeof(*pdb));
710 rsrc_id = ZEND_REGISTER_RESOURCE(NULL, pdb, le_db);
711 add_property_resource(z, "_db_ptr", rsrc_id);
714 struct php_DB *getPhpDbFromObj(zval *z TSRMLS_DC)
718 if(zend_hash_find(HASH_OF(z), "_db_ptr", sizeof("_db_ptr"), (void **) &rsrc) == SUCCESS) {
719 pdb = (struct php_DB *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4", NULL, 1, le_db);
725 DB *php_db4_getDbFromObj(zval *z TSRMLS_DC)
729 if(zend_hash_find(HASH_OF(z), "_db_ptr", sizeof("_db_ptr"), (void **) &rsrc) == SUCCESS) {
730 pdb = (struct php_DB *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4", NULL, 1, le_db);
736 #define getDbFromThis(a) \
738 struct php_DB *pdb; \
739 zval *_self = getThis(); \
741 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
744 pdb = getPhpDbFromObj(_self TSRMLS_CC); \
745 if(!pdb || !pdb->db) { \
747 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4 object"); \
753 #define getPhpDbFromThis(a) \
755 struct php_DB *pdb; \
756 zval *_self = getThis(); \
758 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
761 pdb = getPhpDbFromObj(_self TSRMLS_CC); \
764 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4 object"); \
770 void setDbTxn(zval *z, DB_TXN *dbtxn TSRMLS_DC)
773 struct php_DB_TXN *txn = (struct php_DB_TXN *) emalloc(sizeof(*txn));
774 memset(txn, 0, sizeof(*txn));
776 rsrc_id = ZEND_REGISTER_RESOURCE(NULL, txn, le_db_txn);
777 zend_list_addref(rsrc_id);
778 add_property_resource(z, "_dbtxn_ptr", rsrc_id);
781 DB_TXN *php_db4_getDbTxnFromObj(zval *z TSRMLS_DC)
783 struct php_DB_TXN *pdbtxn;
785 if(zend_hash_find(HASH_OF(z), "_dbtxn_ptr", sizeof("_dbtxn_ptr"),
786 (void **) &rsrc) == SUCCESS)
788 pdbtxn = (struct php_DB_TXN *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Txn", NULL, 1, le_db_txn);
789 return pdbtxn->db_txn;
794 struct php_DB_TXN *getPhpDbTxnFromObj(zval *z TSRMLS_DC)
796 struct php_DB_TXN *pdbtxn;
798 if(zend_hash_find(HASH_OF(z), "_dbtxn_ptr", sizeof("_dbtxn_ptr"),
799 (void **) &rsrc) == SUCCESS)
801 pdbtxn = (struct php_DB_TXN *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Txn", NULL, 1, le_db_txn);
807 #define getDbTxnFromThis(a) \
809 zval *_self = getThis(); \
811 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
814 (a) = php_db4_getDbTxnFromObj(_self TSRMLS_CC); \
816 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4txn object"); \
821 #define getPhpDbTxnFromThis(a) \
823 zval *_self = getThis(); \
825 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
828 (a) = getPhpDbTxnFromObj(_self TSRMLS_CC); \
829 if(!(a) || !(a)->db_txn) { \
830 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4txn object"); \
835 void closeDbTxnDependencies(zval *obj TSRMLS_DC) {
836 struct php_DB_TXN *pdbtxn = getPhpDbTxnFromObj(obj TSRMLS_CC);
838 while(pdbtxn->open_cursors) {
839 struct my_llist *el = pdbtxn->open_cursors;
840 struct php_DBC *pdbc = (struct php_DBC *) el->data;
843 pdbc->dbc->c_close(pdbc->dbc);
846 pdbc->parent_txn = NULL;
849 pdbtxn->open_cursors = el->next;
851 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attempting to end a transaction without closing it's child cursors.");
853 /* should handle open dbs with pending transactions */
858 void setDbc(zval *z, DBC *dbc, struct php_DB_TXN *txn TSRMLS_DC)
861 struct php_DBC *pdbc = (struct php_DBC *) emalloc(sizeof(*pdbc));
862 memset(pdbc, 0, sizeof(*pdbc));
865 pdbc->parent_txn = txn;
866 txn->open_cursors = my_llist_add(txn->open_cursors, pdbc);
868 rsrc_id = zend_register_resource(NULL, pdbc, le_dbc);
869 zend_list_addref(rsrc_id);
870 add_property_resource(z, "_dbc_ptr", rsrc_id);
873 DBC *php_db4_getDbcFromObj(zval *z TSRMLS_DC)
875 struct php_DBC *pdbc;
877 if(zend_hash_find(HASH_OF(z), "_dbc_ptr", sizeof("_dbc_ptr"),
878 (void **) &rsrc) == SUCCESS)
880 pdbc = (struct php_DBC *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Cursor", NULL, 1, le_dbc);
886 struct php_DBC *getPhpDbcFromObj(zval *z TSRMLS_DC)
888 struct php_DBC *pdbc;
890 if(zend_hash_find(HASH_OF(z), "_dbc_ptr", sizeof("_dbc_ptr"),
891 (void **) &rsrc) == SUCCESS)
893 pdbc = (struct php_DBC *) zend_fetch_resource(rsrc TSRMLS_CC, -1, "Db4Cursor", NULL, 1, le_dbc);
899 #define getDbcFromThis(a) \
901 zval *_self = getThis(); \
903 php_error_docref(NULL TSRMLS_CC, E_WARNING, "must be called as a method"); \
906 (a) = php_db4_getDbcFromObj(_self TSRMLS_CC); \
908 php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a valid db4Cursor object"); \
913 int closeDbc(zval *obj TSRMLS_DC)
916 struct php_DBC *pdbc = getPhpDbcFromObj(obj TSRMLS_CC);
918 if(pdbc->parent_txn) {
919 pdbc->parent_txn->open_cursors =
920 my_llist_del(pdbc->parent_txn->open_cursors, pdbc);
922 ret = pdbc->dbc->c_close(pdbc->dbc);
924 pdbc->parent_txn = NULL;
931 /* {{{ DB4Txn method definitions
934 /* {{{ proto bool Db4Txn::abort()
936 ZEND_NAMED_FUNCTION(_wrap_db_txn_abort)
938 struct php_DB_TXN *ptxn;
942 if(ZEND_NUM_ARGS()) {
946 getPhpDbTxnFromThis(ptxn);
947 closeDbTxnDependencies(self TSRMLS_CC);
948 if((ret = ptxn->db_txn->abort(ptxn->db_txn)) != 0) {
949 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
957 /* {{{ proto bool Db4Txn::commit()
959 ZEND_NAMED_FUNCTION(_wrap_db_txn_commit)
961 struct php_DB_TXN *ptxn;
967 getPhpDbTxnFromThis(ptxn);
968 closeDbTxnDependencies(self TSRMLS_CC);
969 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE)
973 if((ret = ptxn->db_txn->commit(ptxn->db_txn, flags)) != 0) {
974 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
982 /* {{{ proto bool Db4Txn::discard()
984 ZEND_NAMED_FUNCTION(_wrap_db_txn_discard)
986 struct php_DB_TXN *ptxn;
991 getPhpDbTxnFromThis(ptxn);
992 closeDbTxnDependencies(self TSRMLS_CC);
993 if(ZEND_NUM_ARGS()) WRONG_PARAM_COUNT;
994 if((ret = ptxn->db_txn->discard(ptxn->db_txn, 0)) != 0) {
995 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
999 /* FIXME should destroy $self */
1004 /* {{{ proto long Db4Txn::id()
1006 ZEND_NAMED_FUNCTION(_wrap_db_txn_id)
1010 getDbTxnFromThis(txn);
1011 if(ZEND_NUM_ARGS()) WRONG_PARAM_COUNT;
1012 RETURN_LONG(txn->id(txn));
1016 /* {{{ proto bool Db4Txn::set_timeout(long $timeout [, long $flags])
1018 ZEND_NAMED_FUNCTION(_wrap_db_txn_set_timeout)
1021 u_int32_t flags = 0;
1025 getDbTxnFromThis(txn);
1026 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &timeout, &flags) == FAILURE)
1030 if((ret = txn->set_timeout(txn, timeout, flags)) != 0) {
1031 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1038 /* {{{ proto bool Db4Txn::set_name(string $name)
1040 ZEND_NAMED_FUNCTION(_wrap_db_txn_set_name)
1046 getDbTxnFromThis(txn);
1047 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE)
1051 txn->set_name(txn, name);
1056 /* {{{ proto bool Db4Txn::get_name()
1058 ZEND_NAMED_FUNCTION(_wrap_db_txn_get_name)
1064 getDbTxnFromThis(txn);
1069 if((ret = txn->get_name(txn, &name)) != 0) {
1070 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1073 RETURN_STRING((char *)name, 1);
1077 /* {{{ private Db4Txn::Db4Txn()
1079 ZEND_NAMED_FUNCTION(_wrap_new_DbTxn)
1081 php_error_docref(NULL TSRMLS_CC, E_ERROR, "DB4Txn objects must be created with Db4Env::begin_txn()");
1088 /* {{{ DB4 method definitions
1091 /* {{{ proto object DB4::DB4([object $dbenv])
1093 ZEND_NAMED_FUNCTION(_wrap_new_db4)
1096 DB_ENV *dbenv = NULL;
1097 zval *dbenv_obj = NULL;
1102 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|O",
1103 &dbenv_obj, db_env_ce) == FAILURE)
1108 dbenv = php_db4_getDbEnvFromObj(dbenv_obj TSRMLS_CC);
1109 zval_add_ref(&dbenv_obj);
1110 add_property_zval(self, "dbenv", dbenv_obj);
1112 if((ret = my_db_create(&db, dbenv, 0)) != 0) {
1113 php_error_docref(NULL TSRMLS_CC,
1114 E_WARNING, "error occurred during open");
1117 setDb(self, db TSRMLS_CC);
1121 /* {{{ proto bool DB4::open([object $txn [, string $file [, string $database [, long $flags [, long $mode]]]]])
1123 ZEND_NAMED_FUNCTION(_wrap_db_open)
1126 DB_TXN *dbtxn = NULL;
1127 zval *dbtxn_obj = NULL;
1128 char *file = NULL, *database = NULL;
1129 long filelen = 0, databaselen = 0;
1130 DBTYPE type = DB_BTREE;
1131 u_int32_t flags = DB_CREATE;
1139 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|O!sslll",
1140 &dbtxn_obj, db_txn_ce,
1142 &database, &databaselen,
1143 &type, &flags, &mode) == FAILURE)
1148 dbtxn = php_db4_getDbTxnFromObj(dbtxn_obj TSRMLS_CC);
1150 add_property_string(self, "file", file, 1);
1151 add_property_string(self, "database", database, 1);
1152 if(strcmp(file, "") == 0) file = NULL;
1153 if(strcmp(database, "") == 0) database = NULL;
1154 /* add type and other introspection data */
1155 if((ret = db->open(db, dbtxn, file, database, type, flags, mode)) == 0) {
1159 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1160 add_property_string(self, "lastError", db_strerror(ret), 1);
1166 /* {{{ proto bool DB4::close()
1168 ZEND_NAMED_FUNCTION(_wrap_db_close)
1170 struct php_DB *pdb = NULL;
1171 getPhpDbFromThis(pdb);
1173 if(ZEND_NUM_ARGS()) {
1176 if(pdb && pdb->db) {
1177 pdb->db->close(pdb->db, 0);
1184 /* {{{ proto bool DB4::del(string $key [, object $txn])
1186 ZEND_NAMED_FUNCTION(_wrap_db_del)
1190 zval *txn_obj = NULL;
1197 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|O", &keyname, &keylen,
1198 &txn_obj, db_txn_ce) == FAILURE)
1203 getDbTxnFromThis(txn);
1206 memset(&key, 0, sizeof(DBT));
1209 RETURN_LONG(db->del(db, txn, &key, flags));
1213 /* {{{ proto string DB4::get(string $key [,object $txn [, long flags]])
1215 ZEND_NAMED_FUNCTION(_wrap_db_get)
1219 zval *txn_obj = NULL;
1223 u_int32_t flags = 0;
1226 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|Ol", &keyname, &keylen,
1227 &txn_obj, db_txn_ce, &flags) == FAILURE)
1232 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1234 memset(&key, 0, sizeof(DBT));
1237 memset(&value, 0, sizeof(DBT));
1238 if(db->get(db, txn, &key, &value, flags) == 0) {
1239 RETURN_STRINGL((char *)value.data, value.size, 1);
1245 /* {{{ proto string DB4::pget(string $key, string &$pkey [,object $txn [, long flags]])
1247 ZEND_NAMED_FUNCTION(_wrap_db_pget)
1251 zval *txn_obj = NULL;
1252 DBT key, value, pkey;
1256 u_int32_t flags = 0;
1259 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|Ol",
1260 &keyname, &keylen, &z_pkey,
1261 &txn_obj, db_txn_ce, &flags) == FAILURE)
1266 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1268 memset(&key, 0, sizeof(DBT));
1271 memset(&pkey, 0, sizeof(DBT));
1272 memset(&value, 0, sizeof(DBT));
1273 if(db->pget(db, txn, &key, &pkey, &value, flags) == 0) {
1274 if(Z_STRLEN_P(z_pkey) == 0) {
1275 Z_STRVAL_P(z_pkey) = (char *) emalloc(pkey.size);
1277 Z_STRVAL_P(z_pkey) = (char *) erealloc(Z_STRVAL_P(z_pkey), pkey.size);
1279 memcpy(Z_STRVAL_P(z_pkey), pkey.data, pkey.size);
1280 Z_STRLEN_P(z_pkey) = pkey.size;
1281 RETURN_STRINGL((char *)value.data, value.size, 1);
1287 /* {{{ proto string DB4::get_type()
1289 ZEND_NAMED_FUNCTION(_wrap_db_get_type)
1295 if(db->get_type(db, &type)) {
1300 RETURN_STRING("DB_BTREE", 1);
1303 RETURN_STRING("DB_HASH", 1);
1306 RETURN_STRING("DB_RECNO", 1);
1309 RETURN_STRING("DB_QUEUE", 1);
1312 RETURN_STRING("UNKNOWN", 1);
1318 /* {{{ proto bool DB4::set_encrypt(string $password [, long $flags])
1320 ZEND_NAMED_FUNCTION(_wrap_db_set_encrypt)
1325 u_int32_t flags = 0;
1327 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &pass, &passlen,
1332 RETURN_BOOL(db->set_encrypt(db, pass, flags)?0:1);
1336 /* {{{ proto int DB4::get_encrypt_flags()
1338 ZEND_NAMED_FUNCTION(_wrap_db_get_encrypt_flags)
1343 u_int32_t flags = 0;
1344 if (db->get_encrypt_flags(db, &flags) != 0)
1350 /* {{{ proto array DB4::stat([object $txn [, long flags]])
1352 ZEND_NAMED_FUNCTION(_wrap_db_stat)
1356 zval *txn_obj = NULL;
1358 u_int32_t flags = 0;
1361 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|zl", &txn_obj, db_txn_ce, &flags) == FAILURE) {
1364 if(db->get_type(db, &type)) {
1368 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1371 #define ADD_STAT_LONG(a) add_assoc_long(return_value, #a, sb.a)
1375 if(db->stat(db, txn, (void *)&sb, flags)) {
1378 array_init(return_value);
1379 if(flags & DB_FAST_STAT) {
1380 ADD_STAT_LONG(hash_magic);
1381 ADD_STAT_LONG(hash_version);
1382 ADD_STAT_LONG(hash_nkeys);
1383 ADD_STAT_LONG(hash_ndata);
1384 ADD_STAT_LONG(hash_pagesize);
1385 ADD_STAT_LONG(hash_ffactor);
1386 ADD_STAT_LONG(hash_buckets);
1388 ADD_STAT_LONG(hash_free);
1389 ADD_STAT_LONG(hash_bfree);
1390 ADD_STAT_LONG(hash_bigpages);
1391 ADD_STAT_LONG(hash_bfree);
1392 ADD_STAT_LONG(hash_overflows);
1393 ADD_STAT_LONG(hash_ovfl_free);
1394 ADD_STAT_LONG(hash_dup);
1395 ADD_STAT_LONG(hash_dup_free);
1402 if(db->stat(db, txn, (void *)&sb, flags)) {
1405 array_init(return_value);
1406 if(flags & DB_FAST_STAT) {
1407 ADD_STAT_LONG(bt_magic);
1408 ADD_STAT_LONG(bt_version);
1409 ADD_STAT_LONG(bt_nkeys);
1410 ADD_STAT_LONG(bt_ndata);
1411 ADD_STAT_LONG(bt_pagesize);
1412 ADD_STAT_LONG(bt_minkey);
1413 ADD_STAT_LONG(bt_re_len);
1414 ADD_STAT_LONG(bt_re_pad);
1416 ADD_STAT_LONG(bt_levels);
1417 ADD_STAT_LONG(bt_int_pg);
1418 ADD_STAT_LONG(bt_leaf_pg);
1419 ADD_STAT_LONG(bt_dup_pg);
1420 ADD_STAT_LONG(bt_over_pg);
1421 ADD_STAT_LONG(bt_free);
1422 ADD_STAT_LONG(bt_int_pgfree);
1423 ADD_STAT_LONG(bt_leaf_pgfree);
1424 ADD_STAT_LONG(bt_dup_pgfree);
1425 ADD_STAT_LONG(bt_over_pgfree);
1431 if(db->stat(db, txn, (void *)&sb, flags)) {
1434 array_init(return_value);
1435 if(flags & DB_FAST_STAT) {
1436 ADD_STAT_LONG(qs_magic);
1437 ADD_STAT_LONG(qs_version);
1438 ADD_STAT_LONG(qs_nkeys);
1439 ADD_STAT_LONG(qs_ndata);
1440 ADD_STAT_LONG(qs_pagesize);
1441 ADD_STAT_LONG(qs_extentsize);
1442 ADD_STAT_LONG(qs_re_len);
1443 ADD_STAT_LONG(qs_re_pad);
1444 ADD_STAT_LONG(qs_first_recno);
1445 ADD_STAT_LONG(qs_cur_recno);
1447 ADD_STAT_LONG(qs_pages);
1448 ADD_STAT_LONG(qs_pgfree);
1457 /* {{{ proto DBCursor DB4::join(array $curslist [, long $flags])
1459 ZEND_NAMED_FUNCTION(_wrap_db_join)
1468 int num_cursors, rv, i;
1470 u_int32_t flags = 0;
1473 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|l",
1474 &z_array, &flags) == FAILURE)
1478 array = HASH_OF(z_array);
1479 num_cursors = zend_hash_num_elements(array);
1480 curslist = (DBC **) calloc(sizeof(DBC *), num_cursors + 1);
1481 for(zend_hash_internal_pointer_reset_ex(array, &pos), i=0;
1482 zend_hash_get_current_data_ex(array, (void **) &z_cursor, &pos) == SUCCESS;
1483 zend_hash_move_forward_ex(array, &pos), i++) {
1484 curslist[i] = php_db4_getDbcFromObj(*z_cursor TSRMLS_CC);
1486 rv = db->join(db, curslist, &dbcp, flags);
1491 object_init_ex(return_value, dbc_ce);
1492 setDbc(return_value, dbcp, NULL TSRMLS_CC);
1497 /* {{{ proto bool DB4::put(string $key, string $value [, object $txn [, long flags]])
1499 ZEND_NAMED_FUNCTION(_wrap_db_put)
1503 zval *txn_obj = NULL;
1505 char *keyname, *dataname;
1506 int keylen, datalen;
1513 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|Ol", &keyname, &keylen,
1514 &dataname, &datalen, &txn_obj, db_txn_ce, &flags) == FAILURE)
1519 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1521 memset(&key, 0, sizeof(DBT));
1524 memset(&value, 0, sizeof(DBT));
1525 value.data = dataname;
1526 value.size = datalen;
1527 if((ret = db->put(db, txn, &key, &value, flags)) != 0) {
1528 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1529 add_property_string(self, "lastError", db_strerror(ret), 1);
1536 /* {{{ proto bool DB4::sync()
1538 ZEND_NAMED_FUNCTION(_wrap_db_sync)
1542 if(ZEND_NUM_ARGS()) {
1550 /* {{{ proto bool DB4::truncate([object $txn [, long $flags]])
1552 ZEND_NAMED_FUNCTION(_wrap_db_truncate)
1556 zval *txn_obj = NULL;
1557 long flags = DB_AUTO_COMMIT;
1561 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|Ol",
1562 &txn_obj, db_txn_ce, &flags) == FAILURE)
1567 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1570 if(db->truncate(db, txn, &countp, flags) == 0) {
1571 RETURN_LONG(countp);
1577 /* {{{ proto DB4Cursor DB4::cursor([object $txn [, long flags]])
1579 ZEND_NAMED_FUNCTION(_wrap_db_cursor)
1583 zval *txn_obj = NULL, *self;
1585 u_int32_t flags = 0;
1590 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|Ol", &txn_obj, db_txn_ce, &flags) == FAILURE)
1595 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1597 if((ret = db->cursor(db, txn, &cursor, flags)) != 0 ) {
1598 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1599 add_property_string(self, "lastError", db_strerror(ret), 1);
1603 object_init_ex(return_value, dbc_ce);
1604 setDbc(return_value, cursor, txn_obj?getPhpDbTxnFromObj(txn_obj TSRMLS_CC):NULL TSRMLS_CC);
1610 /* }}} end DB4 method definitions */
1612 /* {{{ DB4Cursor method definitions
1615 /* {{{ proto bool Db4Cursor::close()
1617 ZEND_NAMED_FUNCTION(_wrap_dbc_close)
1623 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) return;
1625 getDbcFromThis(dbc);
1626 if((ret = closeDbc(self TSRMLS_CC)) != 0) {
1627 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1634 /* {{{ proto long Db4Cursor::count()
1636 ZEND_NAMED_FUNCTION(_wrap_dbc_count)
1642 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) return;
1643 getDbcFromThis(dbc);
1644 if((ret = dbc->c_count(dbc, &count, 0)) != 0) {
1645 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1652 /* {{{ proto bool Db4Cursor::del()
1654 ZEND_NAMED_FUNCTION(_wrap_dbc_del)
1659 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) return;
1660 getDbcFromThis(dbc);
1661 if((ret = dbc->c_del(dbc, 0)) != 0) {
1662 if(ret != DB_KEYEMPTY) {
1663 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1671 /* {{{ proto object Db4Cursor::dup([long $flags])
1673 ZEND_NAMED_FUNCTION(_wrap_dbc_dup)
1676 u_int32_t flags = 0;
1679 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) return;
1680 getDbcFromThis(dbc);
1681 if((ret = dbc->c_dup(dbc, &newdbc, flags)) != 0) {
1682 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1685 object_init_ex(return_value, dbc_ce);
1686 /* FIXME should pass in dbc's parent txn */
1687 setDbc(return_value, newdbc, NULL TSRMLS_CC);
1691 /* {{{ proto string Db4Cursor::get(string &$key, string &$data [, long $flags])
1693 ZEND_NAMED_FUNCTION(_wrap_dbc_get)
1697 zval *zkey, *zvalue;
1698 u_int32_t flags = DB_NEXT;
1703 getDbcFromThis(dbc);
1704 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z/|l", &zkey, &zvalue, &flags) == FAILURE)
1708 memset(&key, 0, sizeof(DBT));
1709 key.data = Z_STRVAL_P(zkey);
1710 key.size = Z_STRLEN_P(zkey);
1711 memset(&value, 0, sizeof(DBT));
1712 value.data = Z_STRVAL_P(zvalue);
1713 value.size = Z_STRLEN_P(zvalue);
1714 if((ret = dbc->c_get(dbc, &key, &value, flags)) == 0) {
1715 zval_dtor(zkey); ZVAL_STRINGL(zkey, (char *) key.data, key.size, 1);
1716 zval_dtor(zvalue); ZVAL_STRINGL(zvalue, (char *) value.data, value.size, 1);
1719 if(ret != DB_NOTFOUND) {
1720 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1721 add_property_string(self, "lastError", db_strerror(ret), 1);
1727 /* {{{ proto string Db4Cursor::pget(string &$key, string &$pkey, string &$data [, long $flags])
1729 ZEND_NAMED_FUNCTION(_wrap_dbc_pget)
1732 DBT key, pkey, value;
1733 zval *zkey, *zvalue, *zpkey;
1734 u_int32_t flags = DB_NEXT;
1739 getDbcFromThis(dbc);
1740 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z/z/|l", &zkey, &zpkey, &zvalue, &flags) == FAILURE)
1744 memset(&key, 0, sizeof(DBT));
1745 key.data = Z_STRVAL_P(zkey);
1746 key.size = Z_STRLEN_P(zkey);
1747 memset(&pkey, 0, sizeof(DBT));
1748 pkey.data = Z_STRVAL_P(zpkey);
1749 pkey.size = Z_STRLEN_P(zpkey);
1750 memset(&value, 0, sizeof(DBT));
1751 value.data = Z_STRVAL_P(zvalue);
1752 value.size = Z_STRLEN_P(zvalue);
1753 if((ret = dbc->c_pget(dbc, &key, &pkey, &value, flags)) == 0) {
1754 zval_dtor(zkey); ZVAL_STRINGL(zkey, (char *) key.data, key.size, 1);
1755 zval_dtor(zpkey); ZVAL_STRINGL(zpkey, (char *) pkey.data, pkey.size, 1);
1756 zval_dtor(zvalue); ZVAL_STRINGL(zvalue, (char *) value.data, value.size, 1);
1759 if(ret != DB_NOTFOUND) {
1760 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1761 add_property_string(self, "lastError", db_strerror(ret), 1);
1767 /* {{{ proto bool Db4Cursor::put(string $key, string $data [, long $flags])
1769 ZEND_NAMED_FUNCTION(_wrap_dbc_put)
1773 char *keyname, *dataname;
1774 int keylen, datalen;
1775 u_int32_t flags = 0;
1778 getDbcFromThis(dbc);
1779 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &keyname, &keylen,
1780 &dataname, &datalen, &flags) == FAILURE)
1784 memset(&key, 0, sizeof(DBT));
1787 memset(&value, 0, sizeof(DBT));
1788 value.data = dataname;
1789 value.size = datalen;
1790 if((ret = dbc->c_put(dbc, &key, &value, flags)) == 0) {
1793 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
1801 /* {{{ DB4Env method definitions
1804 /* {{{ php_db4_error ( zend_error wrapper )
1807 void php_db4_error(const DB_ENV *dp, const char *errpfx, const char *msg)
1810 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s %s\n", errpfx, msg);
1814 /* {{{ proto object DB4Env::Db4Env([long $flags])
1816 ZEND_NAMED_FUNCTION(_wrap_new_DbEnv)
1819 u_int32_t flags = 0;
1821 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE)
1825 if(my_db_env_create(&dbenv, flags) != 0) {
1826 php_error_docref(NULL TSRMLS_CC, E_WARNING, "bad things here: %s:%d\n", __FILE__, __LINE__);
1829 #ifndef HAVE_MOD_DB4
1830 DbEnv::wrap_DB_ENV(dbenv);
1832 dbenv->set_errcall(dbenv, php_db4_error);
1833 setDbEnv(this_ptr, dbenv TSRMLS_CC);
1837 /* {{{ proto bool DB4Env::close([long $flags])
1839 ZEND_NAMED_FUNCTION(_wrap_db_env_close)
1841 struct php_DB_ENV *pdb;
1843 u_int32_t flags = 0;
1845 pdb = php_db4_getPhpDbEnvFromObj(getThis() TSRMLS_CC);
1846 if(!pdb || !pdb->dbenv) {
1849 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags) == FAILURE) {
1852 dbe = DbEnv::get_DbEnv(pdb->dbenv);
1859 /* {{{ proto bool DB4Env::dbremove(object $txn, string $file [, string $database [, long flags]])
1861 ZEND_NAMED_FUNCTION(_wrap_db_env_dbremove)
1866 char *filename=NULL, *database=NULL;
1867 int filenamelen, databaselen;
1868 u_int32_t flags = 0;
1870 getDbEnvFromThis(dbenv);
1871 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O!s|sl", &txn_obj, db_txn_ce,
1872 &filename, &filenamelen, &database, &databaselen, &flags) == FAILURE)
1877 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1880 if(dbenv->dbremove(dbenv, txn, filename, database, flags) == 0) {
1887 /* {{{ proto bool DB4Env::dbrename(object $txn, string $file, string $database, string $newdatabase [, long flags])
1889 ZEND_NAMED_FUNCTION(_wrap_db_env_dbrename)
1894 char *filename=NULL, *database=NULL, *newname=NULL;
1895 int filenamelen, databaselen, newnamelen;
1896 u_int32_t flags = 0;
1898 getDbEnvFromThis(dbenv);
1899 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O!sss|l", &txn_obj, db_txn_ce,
1900 &filename, &filenamelen, &database, &databaselen,
1901 &newname, &newnamelen, &flags) == FAILURE)
1906 txn = php_db4_getDbTxnFromObj(txn_obj TSRMLS_CC);
1909 if(dbenv->dbrename(dbenv, txn, filename, database, newname, flags) == 0) {
1916 /* {{{ proto bool DB4Env::open(string $home [, long flags [, long mode]])
1918 ZEND_NAMED_FUNCTION(_wrap_db_env_open)
1924 u_int32_t flags = DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | \
1925 DB_INIT_MPOOL | DB_INIT_TXN ;
1929 getDbEnvFromThis(dbenv);
1931 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!ll", &home, &homelen,
1932 &flags, &mode) == FAILURE)
1936 if((ret = dbenv->open(dbenv, home, flags, mode) != 0)) {
1937 php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, %d, %o) failed: %s (%d) %s:%d\n", home, flags, mode, strerror(ret), ret, __FILE__, __LINE__);
1940 if(home) add_property_stringl(self, "home", home, homelen, 1);
1944 /* {{{ proto bool DB4Env::remove(string $home [, long flags])
1946 ZEND_NAMED_FUNCTION(_wrap_db_env_remove)
1953 u_int32_t flags = 0;
1955 getDbEnvFromThis(dbenv);
1956 dbe = DbEnv::get_DbEnv(dbenv);
1957 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &home, &homelen, &flags) == FAILURE)
1961 RETURN_BOOL(dbe->remove(home, flags)?0:1);
1965 /* {{{ proto bool DB4Env::set_data_dir(string $dir)
1967 ZEND_NAMED_FUNCTION(_wrap_db_env_set_data_dir)
1974 getDbEnvFromThis(dbenv);
1975 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &dir, &dirlen) == FAILURE)
1979 RETURN_BOOL(dbenv->set_data_dir(dbenv, dir)?0:1);
1983 /* {{{ proto bool DB4Env::set_encrypt(string $password [, long $flags])
1985 ZEND_NAMED_FUNCTION(_wrap_db_env_set_encrypt)
1991 u_int32_t flags = 0;
1993 getDbEnvFromThis(dbenv);
1994 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &pass, &passlen,
1999 RETURN_BOOL(dbenv->set_encrypt(dbenv, pass, flags)?0:1);
2003 /* {{{ proto int DB4Env::get_encrypt_flags()
2005 ZEND_NAMED_FUNCTION(_wrap_db_env_get_encrypt_flags)
2009 u_int32_t flags = 0;
2011 getDbEnvFromThis(dbenv);
2012 if (dbenv->get_encrypt_flags(dbenv, &flags) != 0)
2018 /* {{{ proto object Db4Env::txn_begin([object $parent_txn [, long $flags]])
2020 ZEND_NAMED_FUNCTION(_wrap_db_env_txn_begin)
2023 DB_TXN *txn, *parenttxn = NULL;
2026 zval *parenttxn_obj = NULL;
2027 u_int32_t flags = 0;
2031 getDbEnvFromThis(dbenv);
2032 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|Ol", &parenttxn_obj, db_txn_ce,
2038 parenttxn = php_db4_getDbTxnFromObj(parenttxn_obj TSRMLS_CC);
2040 if((ret = dbenv->txn_begin(dbenv, parenttxn, &txn, flags)) != 0) {
2041 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", db_strerror(ret));
2042 add_property_string(self, "lastError", db_strerror(ret), 1);
2045 object_init_ex(return_value, db_txn_ce);
2046 MAKE_STD_ZVAL(cursor_array);
2047 array_init(cursor_array);
2048 add_property_zval(return_value, "openCursors", cursor_array);
2049 setDbTxn(return_value, txn TSRMLS_CC);
2053 /* {{{ Db4Env::txn_checkpoint(long $kbytes, long $minutes [, long $flags])
2055 ZEND_NAMED_FUNCTION(_wrap_db_env_txn_checkpoint)
2059 u_int32_t kbytes = 0;
2061 u_int32_t flags = 0;
2065 getDbEnvFromThis(dbenv);
2066 if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll|l", &kbytes, &mins, &flags) == FAILURE)
2070 if((ret = dbenv->txn_checkpoint(dbenv, kbytes, mins, flags)) != 0) {
2071 add_property_string(self, "lastError", db_strerror(ret), 1);
2078 /* }}} end db4env */
2085 * vim600: noet sw=4 ts=4 fdm=marker
2086 * vim<600: noet sw=4 ts=4