… | |
… | |
25 | db_sync $db; |
25 | db_sync $db; |
26 | |
26 | |
27 | # when you also use Coro, management is easy: |
27 | # when you also use Coro, management is easy: |
28 | use Coro::BDB; |
28 | use Coro::BDB; |
29 | |
29 | |
30 | # automatic event loop intergration with AnyEvent: |
30 | # automatic event loop integration with AnyEvent: |
31 | use AnyEvent::BDB; |
31 | use AnyEvent::BDB; |
32 | |
32 | |
33 | # automatic result processing with EV: |
33 | # automatic result processing with EV: |
34 | my $WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb; |
34 | my $WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb; |
35 | |
35 | |
… | |
… | |
140 | Functions in the BDB namespace, exported by default: |
140 | Functions in the BDB namespace, exported by default: |
141 | |
141 | |
142 | $env = db_env_create (U32 env_flags = 0) |
142 | $env = db_env_create (U32 env_flags = 0) |
143 | flags: RPCCLIENT |
143 | flags: RPCCLIENT |
144 | |
144 | |
145 | db_env_open (DB_ENV *env, bdb_filename db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) |
145 | db_env_open (DB_ENV *env, bdb_filename db_home, U32 open_flags, int mode, SV *callback = 0) |
146 | open_flags: INIT_CDB INIT_LOCK INIT_LOG INIT_MPOOL INIT_REP INIT_TXN RECOVER RECOVER_FATAL USE_ENVIRON USE_ENVIRON_ROOT CREATE LOCKDOWN PRIVATE REGISTER SYSTEM_MEM |
146 | open_flags: INIT_CDB INIT_LOCK INIT_LOG INIT_MPOOL INIT_REP INIT_TXN RECOVER RECOVER_FATAL USE_ENVIRON USE_ENVIRON_ROOT CREATE LOCKDOWN PRIVATE REGISTER SYSTEM_MEM |
147 | db_env_close (DB_ENV *env, U32 flags = 0, SV *callback = &PL_sv_undef) |
147 | db_env_close (DB_ENV *env, U32 flags = 0, SV *callback = 0) |
148 | db_env_txn_checkpoint (DB_ENV *env, U32 kbyte = 0, U32 min = 0, U32 flags = 0, SV *callback = &PL_sv_undef) |
148 | db_env_txn_checkpoint (DB_ENV *env, U32 kbyte = 0, U32 min = 0, U32 flags = 0, SV *callback = 0) |
149 | flags: FORCE |
149 | flags: FORCE |
150 | db_env_lock_detect (DB_ENV *env, U32 flags = 0, U32 atype = DB_LOCK_DEFAULT, SV *dummy = 0, SV *callback = &PL_sv_undef) |
150 | db_env_lock_detect (DB_ENV *env, U32 flags = 0, U32 atype = DB_LOCK_DEFAULT, SV *dummy = 0, SV *callback = 0) |
151 | atype: LOCK_DEFAULT LOCK_EXPIRE LOCK_MAXLOCKS LOCK_MAXWRITE LOCK_MINLOCKS LOCK_MINWRITE LOCK_OLDEST LOCK_RANDOM LOCK_YOUNGEST |
151 | atype: LOCK_DEFAULT LOCK_EXPIRE LOCK_MAXLOCKS LOCK_MAXWRITE LOCK_MINLOCKS LOCK_MINWRITE LOCK_OLDEST LOCK_RANDOM LOCK_YOUNGEST |
152 | db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = &PL_sv_undef) |
152 | db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = 0) |
153 | db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = &PL_sv_undef) |
153 | db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = 0) |
154 | db_env_dbremove (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, U32 flags = 0, SV *callback = &PL_sv_undef) |
154 | db_env_dbremove (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, U32 flags = 0, SV *callback = 0) |
155 | db_env_dbrename (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, bdb_filename newname, U32 flags = 0, SV *callback = &PL_sv_undef) |
155 | db_env_dbrename (DB_ENV *env, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, bdb_filename newname, U32 flags = 0, SV *callback = 0) |
156 | db_env_log_archive (DB_ENV *env, SV *listp, U32 flags = 0, SV *callback = &PL_sv_undef) |
156 | db_env_log_archive (DB_ENV *env, SV *listp, U32 flags = 0, SV *callback = 0) |
|
|
157 | db_env_lsn_reset (DB_ENV *env, bdb_filename db, U32 flags = 0, SV *callback = 0) |
|
|
158 | db_env_fileid_reset (DB_ENV *env, bdb_filename db, U32 flags = 0, SV *callback = 0) |
157 | |
159 | |
158 | $db = db_create (DB_ENV *env = 0, U32 flags = 0) |
160 | $db = db_create (DB_ENV *env = 0, U32 flags = 0) |
159 | flags: XA_CREATE |
161 | flags: XA_CREATE |
160 | |
162 | |
161 | db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) |
163 | db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = 0) |
162 | flags: AUTO_COMMIT CREATE EXCL MULTIVERSION NOMMAP RDONLY READ_UNCOMMITTED THREAD TRUNCATE |
164 | flags: AUTO_COMMIT CREATE EXCL MULTIVERSION NOMMAP RDONLY READ_UNCOMMITTED THREAD TRUNCATE |
163 | db_close (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef) |
165 | db_close (DB *db, U32 flags = 0, SV *callback = 0) |
164 | flags: DB_NOSYNC |
166 | flags: DB_NOSYNC |
|
|
167 | db_verify (DB *db, bdb_filename file, bdb_filename database = 0, SV *dummy = 0, U32 flags = 0, SV *callback = 0) |
165 | db_upgrade (DB *db, bdb_filename file, U32 flags = 0, SV *callback = &PL_sv_undef) |
168 | db_upgrade (DB *db, bdb_filename file, U32 flags = 0, SV *callback = 0) |
166 | db_compact (DB *db, DB_TXN_ornull *txn = 0, SV *start = 0, SV *stop = 0, SV *unused1 = 0, U32 flags = DB_FREE_SPACE, SV *unused2 = 0, SV *callback = &PL_sv_undef) |
169 | db_compact (DB *db, DB_TXN_ornull *txn = 0, SV *start = 0, SV *stop = 0, SV *unused1 = 0, U32 flags = DB_FREE_SPACE, SV *unused2 = 0, SV *callback = 0) |
167 | flags: FREELIST_ONLY FREE_SPACE |
170 | flags: FREELIST_ONLY FREE_SPACE |
168 | db_sync (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef) |
171 | db_sync (DB *db, U32 flags = 0, SV *callback = 0) |
169 | db_key_range (DB *db, DB_TXN_ornull *txn, SV *key, SV *key_range, U32 flags = 0, SV *callback = &PL_sv_undef) |
172 | db_key_range (DB *db, DB_TXN_ornull *txn, SV *key, SV *key_range, U32 flags = 0, SV *callback = 0) |
170 | db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
173 | db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
171 | flags: APPEND NODUPDATA NOOVERWRITE |
174 | flags: APPEND NODUPDATA NOOVERWRITE |
172 | db_exists (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0) (v4.6) |
175 | db_exists (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0) (v4.6) |
173 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
176 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
174 | flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW |
177 | flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW |
175 | db_pget (DB *db, DB_TXN_ornull *txn, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
178 | db_pget (DB *db, DB_TXN_ornull *txn, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = 0) |
176 | flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW |
179 | flags: CONSUME CONSUME_WAIT GET_BOTH SET_RECNO MULTIPLE READ_COMMITTED READ_UNCOMMITTED RMW |
177 | db_del (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef) |
180 | db_del (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0) |
178 | db_txn_commit (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef) |
181 | db_txn_commit (DB_TXN *txn, U32 flags = 0, SV *callback = 0) |
179 | flags: TXN_NOSYNC TXN_SYNC |
182 | flags: TXN_NOSYNC TXN_SYNC |
180 | db_txn_abort (DB_TXN *txn, SV *callback = &PL_sv_undef) |
183 | db_txn_abort (DB_TXN *txn, SV *callback = 0) |
181 | |
184 | |
182 | db_c_close (DBC *dbc, SV *callback = &PL_sv_undef) |
185 | db_c_close (DBC *dbc, SV *callback = 0) |
183 | db_c_count (DBC *dbc, SV *count, U32 flags = 0, SV *callback = &PL_sv_undef) |
186 | db_c_count (DBC *dbc, SV *count, U32 flags = 0, SV *callback = 0) |
184 | db_c_put (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
187 | db_c_put (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
185 | flags: AFTER BEFORE CURRENT KEYFIRST KEYLAST NODUPDATA |
188 | flags: AFTER BEFORE CURRENT KEYFIRST KEYLAST NODUPDATA |
186 | db_c_get (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
189 | db_c_get (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
187 | flags: CURRENT FIRST GET_BOTH GET_BOTH_RANGE GET_RECNO JOIN_ITEM LAST NEXT NEXT_DUP NEXT_NODUP PREV PREV_DUP PREV_NODUP SET SET_RANGE SET_RECNO READ_UNCOMMITTED MULTIPLE MULTIPLE_KEY RMW |
190 | flags: CURRENT FIRST GET_BOTH GET_BOTH_RANGE GET_RECNO JOIN_ITEM LAST NEXT NEXT_DUP NEXT_NODUP PREV PREV_DUP PREV_NODUP SET SET_RANGE SET_RECNO READ_UNCOMMITTED MULTIPLE MULTIPLE_KEY RMW |
188 | db_c_pget (DBC *dbc, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) |
191 | db_c_pget (DBC *dbc, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = 0) |
189 | db_c_del (DBC *dbc, U32 flags = 0, SV *callback = &PL_sv_undef) |
192 | db_c_del (DBC *dbc, U32 flags = 0, SV *callback = 0) |
190 | |
193 | |
191 | db_sequence_open (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef) |
194 | db_sequence_open (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, SV *key, U32 flags = 0, SV *callback = 0) |
192 | flags: CREATE EXCL |
195 | flags: CREATE EXCL |
193 | db_sequence_close (DB_SEQUENCE *seq, U32 flags = 0, SV *callback = &PL_sv_undef) |
196 | db_sequence_close (DB_SEQUENCE *seq, U32 flags = 0, SV *callback = 0) |
194 | db_sequence_get (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, int delta, SV *seq_value, U32 flags = DB_TXN_NOSYNC, SV *callback = &PL_sv_undef) |
197 | db_sequence_get (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, int delta, SV *seq_value, U32 flags = DB_TXN_NOSYNC, SV *callback = 0) |
195 | flags: TXN_NOSYNC |
198 | flags: TXN_NOSYNC |
196 | db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = &PL_sv_undef) |
199 | db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = 0) |
197 | flags: TXN_NOSYNC |
200 | flags: TXN_NOSYNC |
198 | |
201 | |
199 | db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef) |
202 | db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = 0) |
200 | This is not actually a Berkeley DB function but a BDB module extension. |
203 | This is not actually a Berkeley DB function but a BDB module extension. |
201 | The background for this exytension is: It is very annoying to have to |
204 | The background for this exytension is: It is very annoying to have to |
202 | check every single BDB function for error returns and provide a codepath |
205 | check every single BDB function for error returns and provide a codepath |
203 | out of your transaction. While the BDB module still makes this possible, |
206 | out of your transaction. While the BDB module still makes this possible, |
204 | it contains the following extensions: |
207 | it contains the following extensions: |
… | |
… | |
389 | flags: SEQ_DEC SEQ_INC SEQ_WRAP |
392 | flags: SEQ_DEC SEQ_INC SEQ_WRAP |
390 | $int = $seq->set_range (db_seq_t min, db_seq_t max) |
393 | $int = $seq->set_range (db_seq_t min, db_seq_t max) |
391 | |
394 | |
392 | Example: |
395 | Example: |
393 | my $seq = $db->sequence; |
396 | my $seq = $db->sequence; |
394 | |
397 | |
395 | db_sequence_open $seq, undef, "seq", BDB::CREATE; |
398 | db_sequence_open $seq, undef, "seq", BDB::CREATE; |
396 | db_sequence_get $seq, undef, 1, my $value; |
399 | db_sequence_get $seq, undef, 1, my $value; |
397 | |
400 | |
398 | SUPPORT FUNCTIONS |
401 | SUPPORT FUNCTIONS |
399 | EVENT PROCESSING AND EVENT LOOP INTEGRATION |
402 | EVENT PROCESSING AND EVENT LOOP INTEGRATION |
400 | $msg = BDB::strerror [$errno] |
403 | $msg = BDB::strerror [$errno] |
… | |
… | |
643 | |
646 | |
644 | COMMON PITFALLS |
647 | COMMON PITFALLS |
645 | Unexpected Crashes |
648 | Unexpected Crashes |
646 | Remember that, by default, BDB will execute requests in parallel, in |
649 | Remember that, by default, BDB will execute requests in parallel, in |
647 | somewhat random order. That means that it is easy to run a "db_get" |
650 | somewhat random order. That means that it is easy to run a "db_get" |
648 | request on thesa me database as a concurrent "db_close" request, leading |
651 | request on the same database as a concurrent "db_close" request, leading |
649 | to a crash, silent data corruption, eventually the next world war on |
652 | to a crash, silent data corruption, eventually the next world war on |
650 | terrorism. |
653 | terrorism. |
651 | |
654 | |
652 | If you only ever use foreground requests (without a callback), this will |
655 | If you only ever use foreground requests (without a callback), this will |
653 | not be an issue. |
656 | not be an issue (unless you use threads). |
654 | |
657 | |
655 | Unexpected Freezes or Deadlocks |
658 | Unexpected Freezes or Deadlocks |
656 | Remember that, by default, BDB will execute requests in parallel, which |
659 | Remember that, by default, BDB will execute requests in parallel, which |
657 | easily leads to deadlocks (even concurrent put's on the same database |
660 | easily leads to deadlocks (even concurrent put's on the same database |
658 | can deadlock). |
661 | can deadlock). |