003 File Manager
Current Path:
/usr/local/share/doc/db5/programmer_reference
usr
/
local
/
share
/
doc
/
db5
/
programmer_reference
/
📁
..
📄
BDB_Prog_Reference.pdf
(1.9 MB)
📄
am.html
(13.27 KB)
📄
am_close.html
(4.17 KB)
📄
am_conf.html
(13.76 KB)
📄
am_conf_logrec.html
(7.32 KB)
📄
am_conf_select.html
(24.85 KB)
📄
am_cursor.html
(36.58 KB)
📄
am_delete.html
(2.95 KB)
📄
am_foreign.html
(9.84 KB)
📄
am_get.html
(4.07 KB)
📄
am_misc.html
(6.3 KB)
📄
am_misc_bulk.html
(17.31 KB)
📄
am_misc_db_sql.html
(4.79 KB)
📄
am_misc_dbsizes.html
(4.06 KB)
📄
am_misc_diskspace.html
(11.57 KB)
📄
am_misc_error.html
(4.83 KB)
📄
am_misc_faq.html
(10.34 KB)
📄
am_misc_partial.html
(7.81 KB)
📄
am_misc_perm.html
(4.19 KB)
📄
am_misc_stability.html
(4.82 KB)
📄
am_misc_struct.html
(5.06 KB)
📄
am_misc_tune.html
(9.91 KB)
📄
am_opensub.html
(7.84 KB)
📄
am_partition.html
(17.19 KB)
📄
am_put.html
(4.68 KB)
📄
am_second.html
(14.76 KB)
📄
am_stat.html
(3.11 KB)
📄
am_sync.html
(3.63 KB)
📄
am_truncate.html
(2.54 KB)
📄
am_upgrade.html
(4.72 KB)
📄
am_verify.html
(4.77 KB)
📄
apprec.html
(8.14 KB)
📄
apprec_auto.html
(12.16 KB)
📄
apprec_config.html
(10 KB)
📄
apprec_def.html
(9.13 KB)
📄
arch.html
(11.09 KB)
📄
arch_apis.html
(10.27 KB)
📄
arch_bigpic.gif
(2.53 KB)
📄
arch_progmodel.html
(3.1 KB)
📄
arch_script.html
(4.39 KB)
📄
arch_smallpic.gif
(1.58 KB)
📄
arch_utilities.html
(8 KB)
📄
bdb_usenix.pdf
(79.81 KB)
📄
bt_conf.html
(29.94 KB)
📄
cam.html
(11.77 KB)
📄
cam_app.html
(16.91 KB)
📄
cam_fail.html
(7.77 KB)
📄
ch13s02.html
(4.19 KB)
📄
csharp.html
(7.48 KB)
📄
dumpload.html
(5.42 KB)
📄
dumpload_format.html
(6.58 KB)
📄
dumpload_text.html
(3.39 KB)
📄
embedded.html
(31.62 KB)
📄
env.html
(7.43 KB)
📄
env_create.html
(10.06 KB)
📄
env_db_config.html
(4.21 KB)
📄
env_encrypt.html
(10.19 KB)
📄
env_error.html
(4.77 KB)
📄
env_faq.html
(5.54 KB)
📄
env_naming.html
(15.54 KB)
📄
env_open.html
(4.95 KB)
📄
env_region.html
(8.11 KB)
📄
env_remote.html
(5.28 KB)
📄
env_security.html
(5.64 KB)
📄
env_size.html
(8.11 KB)
📄
ext.html
(7.13 KB)
📄
ext_perl.html
(3.84 KB)
📄
ext_php.html
(5.47 KB)
📄
general_am_conf.html
(21.43 KB)
📄
gettingStarted.css
(1.13 KB)
📄
group_membership.html
(20.37 KB)
📄
hash_conf.html
(6.96 KB)
📄
hash_usenix.pdf
(256.14 KB)
📄
heap_conf.html
(4.14 KB)
📄
index.html
(77.48 KB)
📄
intro.html
(9.57 KB)
📄
intro_dbis.html
(15.02 KB)
📄
intro_dbisnot.html
(13.49 KB)
📄
intro_distrib.html
(2.92 KB)
📄
intro_need.html
(5.06 KB)
📄
intro_products.html
(14.3 KB)
📄
intro_terrain.html
(19.43 KB)
📄
intro_what.html
(4.94 KB)
📄
intro_where.html
(3.75 KB)
📄
java.html
(7.62 KB)
📄
java_compat.html
(2.57 KB)
📄
java_faq.html
(7.5 KB)
📄
java_program.html
(6.69 KB)
📄
libtp_usenix.pdf
(243.14 KB)
📄
lock.html
(11.29 KB)
📄
lock_am_conv.html
(10.62 KB)
📄
lock_cam_conv.html
(4.95 KB)
📄
lock_config.html
(4.67 KB)
📄
lock_dead.html
(7.25 KB)
📄
lock_deaddbg.html
(10.32 KB)
📄
lock_max.html
(11.04 KB)
📄
lock_nondb.html
(4.94 KB)
📄
lock_notxn.html
(4.55 KB)
📄
lock_page.html
(5.71 KB)
📄
lock_stdmode.html
(5.27 KB)
📄
lock_timeout.html
(6.16 KB)
📄
lock_twopl.html
(4.48 KB)
📄
log.html
(7.08 KB)
📄
log_config.html
(5.06 KB)
📄
log_limits.html
(4.24 KB)
📄
magic.s5.be.txt
(3.54 KB)
📄
magic.s5.le.txt
(3.56 KB)
📄
magic.txt
(1.98 KB)
📄
moreinfo.html
(7.45 KB)
📄
mp.html
(8.86 KB)
📄
mp_config.html
(6.08 KB)
📄
mp_warm.html
(13.45 KB)
📄
preface.html
(5.1 KB)
📄
program.html
(7.21 KB)
📄
program_cache.html
(3.3 KB)
📄
program_compatible.html
(3.66 KB)
📄
program_copy.html
(7.35 KB)
📄
program_environ.html
(3.58 KB)
📄
program_errorret.html
(10.38 KB)
📄
program_faq.html
(4.58 KB)
📄
program_mt.html
(7.54 KB)
📄
program_namespace.html
(5.66 KB)
📄
program_perfmon.html
(32.07 KB)
📄
program_ram.html
(12.58 KB)
📄
program_runtime.html
(7.09 KB)
📄
program_scope.html
(9.8 KB)
📄
refs.html
(11.84 KB)
📄
rep.html
(16.57 KB)
📄
rep_app.html
(9.75 KB)
📄
rep_base_meth.html
(8.59 KB)
📄
rep_bulk.html
(4.01 KB)
📄
rep_clock_skew.html
(5.38 KB)
📄
rep_comm.html
(11.28 KB)
📄
rep_elect.html
(13.17 KB)
📄
rep_ex.html
(9.64 KB)
📄
rep_ex_chan.html
(8.52 KB)
📄
rep_ex_comm.html
(7.58 KB)
📄
rep_ex_rq.html
(5.52 KB)
📄
rep_faq.html
(9.2 KB)
📄
rep_filename.html
(7.7 KB)
📄
rep_id.html
(4.76 KB)
📄
rep_init.html
(5.14 KB)
📄
rep_lease.html
(18.32 KB)
📄
rep_mastersync.html
(11.24 KB)
📄
rep_mgr_ack.html
(8.5 KB)
📄
rep_mgr_meth.html
(11.06 KB)
📄
rep_mgrmulti.html
(10.28 KB)
📄
rep_newsite.html
(5.29 KB)
📄
rep_partition.html
(9.21 KB)
📄
rep_pri.html
(3.64 KB)
📄
rep_replicate.html
(18.8 KB)
📄
rep_ryw.html
(9.82 KB)
📄
rep_trans.html
(21.58 KB)
📄
rep_twosite.html
(6.76 KB)
📄
repmgr_channels.html
(13.34 KB)
📄
rq_conf.html
(18.29 KB)
📄
second.javas
(3.87 KB)
📄
sequence.html
(4.43 KB)
📄
solaris.txt
(5.62 KB)
📄
stl.html
(16.28 KB)
📄
stl_complex_rw.html
(19.31 KB)
📄
stl_container_specific.html
(9.04 KB)
📄
stl_db_advanced_usage.html
(9.68 KB)
📄
stl_db_usage.html
(13.27 KB)
📄
stl_efficienct_use.html
(11.87 KB)
📄
stl_examples.html
(8.24 KB)
📄
stl_known_issues.html
(4.54 KB)
📄
stl_memory_mgmt.html
(9.22 KB)
📄
stl_misc.html
(8.22 KB)
📄
stl_mt_usage.html
(9.06 KB)
📄
stl_persistence.html
(14.74 KB)
📄
stl_primitive_rw.html
(8.18 KB)
📄
stl_txn_usage.html
(4.88 KB)
📄
stl_usecase.html
(3.67 KB)
📄
tcl.html
(7.88 KB)
📄
tcl_error.html
(5.2 KB)
📄
tcl_faq.html
(4.89 KB)
📄
tcl_program.html
(3.78 KB)
📄
tcl_using.html
(4.43 KB)
📄
transapp.cs
(10.34 KB)
📄
transapp.html
(8.55 KB)
📄
transapp_admin.html
(4.8 KB)
📄
transapp_app.html
(25.08 KB)
📄
transapp_archival.html
(15.5 KB)
📄
transapp_atomicity.html
(5.46 KB)
📄
transapp_checkpoint.html
(6.18 KB)
📄
transapp_cursor.html
(6.79 KB)
📄
transapp_data_open.html
(7.52 KB)
📄
transapp_deadlock.html
(7.35 KB)
📄
transapp_env_open.html
(8.39 KB)
📄
transapp_fail.html
(6.8 KB)
📄
transapp_faq.html
(11.26 KB)
📄
transapp_filesys.html
(5.89 KB)
📄
transapp_hotfail.html
(10.54 KB)
📄
transapp_inc.html
(8.09 KB)
📄
transapp_journal.html
(4.72 KB)
📄
transapp_logfile.html
(5.3 KB)
📄
transapp_nested.html
(5.42 KB)
📄
transapp_put.html
(12.47 KB)
📄
transapp_read.html
(9.9 KB)
📄
transapp_reclimit.html
(12.6 KB)
📄
transapp_recovery.html
(8.74 KB)
📄
transapp_term.html
(6.02 KB)
📄
transapp_throughput.html
(9.06 KB)
📄
transapp_tune.html
(13.99 KB)
📄
transapp_why.html
(3.94 KB)
📄
txn.html
(8.63 KB)
📄
txn_config.html
(4.5 KB)
📄
txn_limits.html
(5.77 KB)
📄
witold.html
(745 B)
📄
writetest.cs
(2.26 KB)
📄
xa.html
(6.69 KB)
📄
xa_build.html
(19.12 KB)
📄
xa_faq.html
(7.27 KB)
📄
xa_xa_config.html
(8.1 KB)
📄
xa_xa_intro.html
(4.46 KB)
📄
xa_xa_restrict.html
(6.02 KB)
Editing: transapp.cs
#include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <pthread.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <db.h> #define ENV_DIRECTORY "TXNAPP" void add_cat(DB_ENV *, DB *, char *, ...); void add_color(DB_ENV *, DB *, char *, int); void add_fruit(DB_ENV *, DB *, char *, char *); void *checkpoint_thread(void *); void log_archlist(DB_ENV *); void *logfile_thread(void *); void db_open(DB_ENV *, DB **, char *, int); void env_dir_create(void); void env_open(DB_ENV **); void usage(void); int main(int argc, char *argv[]) { extern int optind; DB *db_cats, *db_color, *db_fruit; DB_ENV *dbenv; pthread_t ptid; int ch, ret; while ((ch = getopt(argc, argv, "")) != EOF) switch (ch) { case '?': default: usage(); } argc -= optind; argv += optind; env_dir_create(); env_open(&dbenv); /* Start a checkpoint thread. */ if ((ret = pthread_create( &ptid, NULL, checkpoint_thread, (void *)dbenv)) != 0) { fprintf(stderr, "txnapp: failed spawning checkpoint thread: %s\n", strerror(ret)); exit (1); } /* Start a logfile removal thread. */ if ((ret = pthread_create( &ptid, NULL, logfile_thread, (void *)dbenv)) != 0) { fprintf(stderr, "txnapp: failed spawning log file removal thread: %s\n", strerror(ret)); exit (1); } /* Open database: Key is fruit class; Data is specific type. */ db_open(dbenv, &db_fruit, "fruit", 0); /* Open database: Key is a color; Data is an integer. */ db_open(dbenv, &db_color, "color", 0); /* * Open database: * Key is a name; Data is: company name, address, cat breeds. */ db_open(dbenv, &db_cats, "cats", 1); add_fruit(dbenv, db_fruit, "apple", "yellow delicious"); add_color(dbenv, db_color, "blue", 0); add_color(dbenv, db_color, "blue", 3); add_cat(dbenv, db_cats, "Amy Adams", "Oracle", "394 E. Riding Dr., Carlisle, MA 01741, USA", "abyssinian", "bengal", "chartreaux", NULL); return (0); } void env_dir_create() { struct stat sb; /* * If the directory exists, we're done. We do not further check * the type of the file, DB will fail appropriately if it's the * wrong type. */ if (stat(ENV_DIRECTORY, &sb) == 0) return; /* Create the directory, read/write/access owner only. */ if (mkdir(ENV_DIRECTORY, S_IRWXU) != 0) { fprintf(stderr, "txnapp: mkdir: %s: %s\n", ENV_DIRECTORY, strerror(errno)); exit (1); } } void env_open(DB_ENV **dbenvp) { DB_ENV *dbenv; int ret; /* Create the environment handle. */ if ((ret = db_env_create(&dbenv, 0)) != 0) { fprintf(stderr, "txnapp: db_env_create: %s\n", db_strerror(ret)); exit (1); } /* Set up error handling. */ dbenv->set_errpfx(dbenv, "txnapp"); dbenv->set_errfile(dbenv, stderr); /* Do deadlock detection internally. */ if ((ret = dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT)) != 0) { dbenv->err(dbenv, ret, "set_lk_detect: DB_LOCK_DEFAULT"); exit (1); } /* * Open a transactional environment: * create if it doesn't exist * free-threaded handle * run recovery * read/write owner only */ if ((ret = dbenv->open(dbenv, ENV_DIRECTORY, DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_THREAD, S_IRUSR | S_IWUSR)) != 0) { dbenv->err(dbenv, ret, "dbenv->open: %s", ENV_DIRECTORY); exit (1); } *dbenvp = dbenv; } void * checkpoint_thread(void *arg) { DB_ENV *dbenv; int ret; dbenv = arg; dbenv->errx(dbenv, "Checkpoint thread: %lu", (u_long)pthread_self()); /* Checkpoint once a minute. */ for (;; sleep(60)) if ((ret = dbenv->txn_checkpoint(dbenv, 0, 0, 0)) != 0) { dbenv->err(dbenv, ret, "checkpoint thread"); exit (1); } /* NOTREACHED */ } void * logfile_thread(void *arg) { DB_ENV *dbenv; int ret; char **begin, **list; dbenv = arg; dbenv->errx(dbenv, "Log file removal thread: %lu", (u_long)pthread_self()); /* Check once every 5 minutes. */ for (;; sleep(300)) { /* Get the list of log files. */ if ((ret = dbenv->log_archive(dbenv, &list, DB_ARCH_ABS)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->log_archive"); exit (1); } /* Remove the log files. */ if (list != NULL) { for (begin = list; *list != NULL; ++list) if ((ret = remove(*list)) != 0) { dbenv->err(dbenv, ret, "remove %s", *list); exit (1); } free (begin); } } /* NOTREACHED */ } void log_archlist(DB_ENV *dbenv) { int ret; char **begin, **list; /* Get the list of database files. */ if ((ret = dbenv->log_archive(dbenv, &list, DB_ARCH_ABS | DB_ARCH_DATA)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->log_archive: DB_ARCH_DATA"); exit (1); } if (list != NULL) { for (begin = list; *list != NULL; ++list) printf("database file: %s\n", *list); free (begin); } /* Get the list of log files. */ if ((ret = dbenv->log_archive(dbenv, &list, DB_ARCH_ABS | DB_ARCH_LOG)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->log_archive: DB_ARCH_LOG"); exit (1); } if (list != NULL) { for (begin = list; *list != NULL; ++list) printf("log file: %s\n", *list); free (begin); } } void db_open(DB_ENV *dbenv, DB **dbp, char *name, int dups) { DB *db; int ret; /* Create the database handle. */ if ((ret = db_create(&db, dbenv, 0)) != 0) { dbenv->err(dbenv, ret, "db_create"); exit (1); } /* Optionally, turn on duplicate data items. */ if (dups && (ret = db->set_flags(db, DB_DUP)) != 0) { dbenv->err(dbenv, ret, "db->set_flags: DB_DUP"); exit (1); } /* * Open a database in the environment: * create if it doesn't exist * free-threaded handle * read/write owner only */ if ((ret = db->open(db, NULL, name, NULL, DB_BTREE, DB_AUTO_COMMIT | DB_CREATE | DB_THREAD, S_IRUSR | S_IWUSR)) != 0) { (void)db->close(db, 0); dbenv->err(dbenv, ret, "db->open: %s", name); exit (1); } *dbp = db; } void add_fruit(DB_ENV *dbenv, DB *db, char *fruit, char *name) { DBT key, data; DB_TXN *tid; int ret; /* Initialization. */ memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); key.data = fruit; key.size = strlen(fruit); data.data = name; data.size = strlen(name); for (;;) { /* Begin the transaction. */ if ((ret = dbenv->txn_begin(dbenv, NULL, &tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->txn_begin"); exit (1); } /* Store the value. */ switch (ret = db->put(db, tid, &key, &data, 0)) { case 0: /* Success: commit the change. */ if ((ret = tid->commit(tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->commit"); exit (1); } return; case DB_LOCK_DEADLOCK: /* Deadlock: retry the operation. */ if ((ret = tid->abort(tid)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->abort"); exit (1); } break; default: /* Error: run recovery. */ dbenv->err(dbenv, ret, "dbc->put: %s/%s", fruit, name); exit (1); } } } void add_color(DB_ENV *dbenv, DB *dbp, char *color, int increment) { DBT key, data; DB_TXN *tid; int original, ret; char buf[64]; /* Initialization. */ memset(&key, 0, sizeof(key)); key.data = color; key.size = strlen(color); memset(&data, 0, sizeof(data)); data.flags = DB_DBT_MALLOC; for (;;) { /* Begin the transaction. */ if ((ret = dbenv->txn_begin(dbenv, NULL, &tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->txn_begin"); exit (1); } /* * Get the key. If it exists, we increment the value. If it * doesn't exist, we create it. */ switch (ret = dbp->get(dbp, tid, &key, &data, 0)) { case 0: original = atoi(data.data); break; case DB_LOCK_DEADLOCK: /* Deadlock: retry the operation. */ if ((ret = tid->abort(tid)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->abort"); exit (1); } continue; case DB_NOTFOUND: original = 0; break; default: /* Error: run recovery. */ dbenv->err( dbenv, ret, "dbc->get: %s/%d", color, increment); exit (1); } if (data.data != NULL) free(data.data); /* Create the new data item. */ (void)snprintf(buf, sizeof(buf), "%d", original + increment); data.data = buf; data.size = strlen(buf) + 1; /* Store the new value. */ switch (ret = dbp->put(dbp, tid, &key, &data, 0)) { case 0: /* Success: commit the change. */ if ((ret = tid->commit(tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->commit"); exit (1); } return; case DB_LOCK_DEADLOCK: /* Deadlock: retry the operation. */ if ((ret = tid->abort(tid)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->abort"); exit (1); } break; default: /* Error: run recovery. */ dbenv->err( dbenv, ret, "dbc->put: %s/%d", color, increment); exit (1); } } } void add_cat(DB_ENV *dbenv, DB *db, char *name, ...) { va_list ap; DBC *dbc; DBT key, data; DB_TXN *tid; int ret; char *s; /* Initialization. */ memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); key.data = name; key.size = strlen(name); retry: /* Begin the transaction. */ if ((ret = dbenv->txn_begin(dbenv, NULL, &tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_ENV->txn_begin"); exit (1); } /* Delete any previously existing item. */ switch (ret = db->del(db, tid, &key, 0)) { case 0: case DB_NOTFOUND: break; case DB_LOCK_DEADLOCK: /* Deadlock: retry the operation. */ if ((ret = tid->abort(tid)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->abort"); exit (1); } goto retry; default: dbenv->err(dbenv, ret, "db->del: %s", name); exit (1); } /* Create a cursor. */ if ((ret = db->cursor(db, tid, &dbc, 0)) != 0) { dbenv->err(dbenv, ret, "db->cursor"); exit (1); } /* Append the items, in order. */ va_start(ap, name); while ((s = va_arg(ap, char *)) != NULL) { data.data = s; data.size = strlen(s); switch (ret = dbc->c_put(dbc, &key, &data, DB_KEYLAST)) { case 0: break; case DB_LOCK_DEADLOCK: va_end(ap); /* Deadlock: retry the operation. */ if ((ret = dbc->c_close(dbc)) != 0) { dbenv->err( dbenv, ret, "dbc->c_close"); exit (1); } if ((ret = tid->abort(tid)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->abort"); exit (1); } goto retry; default: /* Error: run recovery. */ dbenv->err(dbenv, ret, "dbc->put: %s/%s", name, s); exit (1); } } va_end(ap); /* Success: commit the change. */ if ((ret = dbc->c_close(dbc)) != 0) { dbenv->err(dbenv, ret, "dbc->c_close"); exit (1); } if ((ret = tid->commit(tid, 0)) != 0) { dbenv->err(dbenv, ret, "DB_TXN->commit"); exit (1); } } void usage() { (void)fprintf(stderr, "usage: txnapp\n"); exit(1); }
Upload File
Create Folder