--- BDB/BDB.xs 2008/10/20 04:21:53 1.62 +++ BDB/BDB.xs 2008/10/21 02:21:25 1.63 @@ -151,6 +151,7 @@ REQ_QUIT, REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT, REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME, + REQ_ENV_LOG_ARCHIVE, REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_UPGRADE, REQ_DB_PUT, REQ_DB_EXISTS, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE, REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH, @@ -379,8 +380,11 @@ av_push (av, newSVnv (req->key_range.equal)); av_push (av, newSVnv (req->key_range.greater)); + av = (AV *)newRV_noinc ((SV *)av); + SvREADONLY_off (req->sv1); sv_setsv_mg (req->sv1, newRV_noinc ((SV *)av)); + SvREFCNT_dec (av); SvREFCNT_dec (req->sv1); } break; @@ -397,6 +401,24 @@ SvREFCNT_dec (req->sv1); break; #endif + + case REQ_ENV_LOG_ARCHIVE: + { + AV *av = newAV (); + char **listp = (char **)req->buf1; + + if (listp) + while (*listp) + av_push (av, newSVpv (*listp, 0)), ++listp; + + av = (AV *)newRV_noinc ((SV *)av); + + SvREADONLY_off (req->sv1); + sv_setsv_mg (req->sv1, (SV *)av); + SvREFCNT_dec (av); + SvREFCNT_dec (req->sv1); + } + break; } errno = req->result; @@ -872,6 +894,14 @@ break; #endif + case REQ_ENV_LOG_ARCHIVE: + { + char **listp = 0; /* DB_ARCH_REMOVE does not touch listp, contrary to docs */ + req->result = req->env->log_archive (req->env, &listp, req->uint1); + req->buf1 = (char *)listp; + } + break; + default: req->result = ENOSYS; break; @@ -1280,6 +1310,11 @@ const_iv (SECONDARY_BAD) const_iv (VERIFY_BAD) + const_iv (ARCH_ABS) + const_iv (ARCH_DATA) + const_iv (ARCH_LOG) + const_iv (ARCH_REMOVE) + const_iv (VERB_DEADLOCK) const_iv (VERB_RECOVERY) const_iv (VERB_REPLICATION) @@ -1322,9 +1357,9 @@ const_iv (PRIORITY_DEFAULT) const_iv (PRIORITY_HIGH) const_iv (PRIORITY_VERY_HIGH) + const_iv (IGNORE_LEASE) #endif #if DB_VERSION_MINOR >= 7 - const_iv (IGNORE_LEASE) //const_iv (MULTIPLE_KEY) const_iv (LOG_DIRECT) const_iv (LOG_DSYNC) @@ -1638,6 +1673,19 @@ req->uint1 = flags; REQ_SEND; } + +void +db_env_log_archive (DB_ENV *env, SV_mutable *listp, U32 flags = 0, SV *callback = 0) + PREINIT: + CALLBACK + CODE: +{ + dREQ (REQ_ENV_LOG_ARCHIVE, 1); + req->sv1 = SvREFCNT_inc (listp); + req->env = env; + req->uint1 = flags; + REQ_SEND; +} DB * db_create (DB_ENV *env = 0, U32 flags = 0)