📄 berkeleydb.xs
字号:
return RETVAL ; } if (info->bt_minkey) { Status = dbp->set_bt_minkey(dbp, info->bt_minkey) ; Trace(("set_bt_minkey [%d] returned %s\n", info->bt_minkey, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->bt_compare) { Status = dbp->set_bt_compare(dbp, info->bt_compare) ; Trace(("set_bt_compare [%p] returned %s\n", info->bt_compare, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->h_hash) { Status = dbp->set_h_hash(dbp, info->h_hash) ; Trace(("set_h_hash [%d] returned %s\n", info->h_hash, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->dup_compare) { Status = dbp->set_dup_compare(dbp, info->dup_compare) ; Trace(("set_dup_compare [%d] returned %s\n", info->dup_compare, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->bt_prefix) { Status = dbp->set_bt_prefix(dbp, info->bt_prefix) ; Trace(("set_bt_prefix [%d] returned %s\n", info->bt_prefix, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->re_len) { Status = dbp->set_re_len(dbp, info->re_len) ; Trace(("set_re_len [%d] returned %s\n", info->re_len, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->re_delim) { Status = dbp->set_re_delim(dbp, info->re_delim) ; Trace(("set_re_delim [%d] returned %s\n", info->re_delim, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->re_pad) { Status = dbp->set_re_pad(dbp, info->re_pad) ; Trace(("set_re_pad [%d] returned %s\n", info->re_pad, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->flags) { Status = dbp->set_flags(dbp, info->flags) ; Trace(("set_flags [%d] returned %s\n", info->flags, my_db_strerror(Status))); if (Status) return RETVAL ; } if (info->q_extentsize) {#ifdef AT_LEAST_DB_3_2 Status = dbp->set_q_extentsize(dbp, info->q_extentsize) ; Trace(("set_q_extentsize [%d] returned %s\n", info->q_extentsize, my_db_strerror(Status))); if (Status) return RETVAL ;#else softCrash("-ExtentSize needs at least Berkeley DB 3.2.x") ;#endif } /* In-memory database need DB_CREATE from 4.4 */ if (! file) flags |= DB_CREATE; Trace(("db_open'ing\n"));#ifdef AT_LEAST_DB_4_1 if ((Status = (dbp->open)(dbp, txnid, file, subname, type, flags, mode)) == 0) {#else if ((Status = (dbp->open)(dbp, file, subname, type, flags, mode)) == 0) {#endif /* AT_LEAST_DB_4_1 */#else /* DB_VERSION_MAJOR == 2 */ if ((Status = db_open(file, type, flags, mode, env, info, &dbp)) == 0) { CurrentDB = db ;#endif /* DB_VERSION_MAJOR == 2 */ Trace(("db_opened ok\n")); RETVAL = db ; RETVAL->dbp = dbp ; RETVAL->txn = txnid ;#if DB_VERSION_MAJOR == 2 RETVAL->type = dbp->type ;#else /* DB_VERSION_MAJOR > 2 */#ifdef AT_LEAST_DB_3_3 dbp->get_type(dbp, &RETVAL->type) ;#else /* DB 3.0 -> 3.2 */ RETVAL->type = dbp->get_type(dbp) ;#endif#endif /* DB_VERSION_MAJOR > 2 */ RETVAL->primary_recno_or_queue = FALSE; RETVAL->recno_or_queue = (RETVAL->type == DB_RECNO || RETVAL->type == DB_QUEUE) ; RETVAL->filename = my_strdup(file) ; RETVAL->Status = Status ; RETVAL->active = TRUE ; hash_store_iv("BerkeleyDB::Term::Db", (char *)RETVAL, 1) ; Trace((" storing %p %p in BerkeleyDB::Term::Db\n", RETVAL, dbp)) ; if (dbenv) { RETVAL->cds_enabled = dbenv->cds_enabled ; RETVAL->parent_env = dbenv ; dbenv->Status = Status ; ++ dbenv->open_dbs ; } } else {#if DB_VERSION_MAJOR > 2 (dbp->close)(dbp, 0) ;#endif destroyDB(db) ; Trace(("db open returned %s\n", my_db_strerror(Status))) ; } Trace(("End of _db_open\n")); return RETVAL ;}#include "constants.h"MODULE = BerkeleyDB PACKAGE = BerkeleyDB PREFIX = env_INCLUDE: constants.xs#define env_db_version(maj, min, patch) db_version(&maj, &min, &patch)char *env_db_version(maj, min, patch) int maj int min int patch PREINIT: dMY_CXT; OUTPUT: RETVAL maj min patchintdb_value_set(value, which) int value int which NOT_IMPLEMENTED_YETDualType_db_remove(ref) SV * ref PREINIT: dMY_CXT; CODE: {#if DB_VERSION_MAJOR == 2 softCrash("BerkeleyDB::db_remove needs Berkeley DB 3.x or better") ;#else HV * hash ; DB * dbp ; SV * sv ; const char * db = NULL ; const char * subdb = NULL ; BerkeleyDB__Env env = NULL ; BerkeleyDB__Txn txn = NULL ; DB_ENV * dbenv = NULL ; u_int32_t flags = 0 ; hash = (HV*) SvRV(ref) ; SetValue_pv(db, "Filename", char *) ; SetValue_pv(subdb, "Subname", char *) ; SetValue_iv(flags, "Flags") ; SetValue_ov(env, "Env", BerkeleyDB__Env) ; if (txn) {#ifdef AT_LEAST_DB_4_1 if (!env) softCrash("transactional db_remove requires an environment"); RETVAL = env->Status = env->Env->dbremove(env->Env, txn->txn, db, subdb, flags);#else softCrash("transactional db_remove requires Berkeley DB 4.1 or better");#endif } else { if (env) dbenv = env->Env ; RETVAL = db_create(&dbp, dbenv, 0) ; if (RETVAL == 0) { RETVAL = dbp->remove(dbp, db, subdb, flags) ; } }#endif } OUTPUT: RETVALDualType_db_verify(ref) SV * ref PREINIT: dMY_CXT; CODE: {#ifndef AT_LEAST_DB_3_1 softCrash("BerkeleyDB::db_verify needs Berkeley DB 3.1.x or better") ;#else HV * hash ; DB * dbp ; SV * sv ; const char * db = NULL ; const char * subdb = NULL ; const char * outfile = NULL ; FILE * ofh = NULL; BerkeleyDB__Env env = NULL ; DB_ENV * dbenv = NULL ; u_int32_t flags = 0 ; hash = (HV*) SvRV(ref) ; SetValue_pv(db, "Filename", char *) ; SetValue_pv(subdb, "Subname", char *) ; SetValue_pv(outfile, "Outfile", char *) ; SetValue_iv(flags, "Flags") ; SetValue_ov(env, "Env", BerkeleyDB__Env) ; RETVAL = 0; if (outfile){ ofh = fopen(outfile, "w"); if (! ofh) RETVAL = errno; } if (! RETVAL) { if (env) dbenv = env->Env ; RETVAL = db_create(&dbp, dbenv, 0) ; if (RETVAL == 0) { RETVAL = dbp->verify(dbp, db, subdb, ofh, flags) ; } if (outfile) fclose(ofh); }#endif } OUTPUT: RETVALDualType_db_rename(ref) SV * ref PREINIT: dMY_CXT; CODE: {#ifndef AT_LEAST_DB_3_1 softCrash("BerkeleyDB::db_rename needs Berkeley DB 3.1.x or better") ;#else HV * hash ; DB * dbp ; SV * sv ; const char * db = NULL ; const char * subdb = NULL ; const char * newname = NULL ; BerkeleyDB__Env env = NULL ; BerkeleyDB__Txn txn = NULL ; DB_ENV * dbenv = NULL ; u_int32_t flags = 0 ; hash = (HV*) SvRV(ref) ; SetValue_pv(db, "Filename", char *) ; SetValue_pv(subdb, "Subname", char *) ; SetValue_pv(newname, "Newname", char *) ; SetValue_iv(flags, "Flags") ; SetValue_ov(env, "Env", BerkeleyDB__Env) ; SetValue_ov(txn, "Txn", BerkeleyDB__Txn) ; if (txn) {#ifdef AT_LEAST_DB_4_1 if (!env) softCrash("transactional db_rename requires an environment"); RETVAL = env->Status = env->Env->dbrename(env->Env, txn->txn, db, subdb, newname, flags);#else softCrash("transactional db_rename requires Berkeley DB 4.1 or better");#endif } else { if (env) dbenv = env->Env ; RETVAL = db_create(&dbp, dbenv, 0) ; if (RETVAL == 0) { RETVAL = (dbp->rename)(dbp, db, subdb, newname, flags) ; } }#endif } OUTPUT: RETVALMODULE = BerkeleyDB::Env PACKAGE = BerkeleyDB::Env PREFIX = env_BerkeleyDB::Env::Rawcreate(flags=0) u_int32_t flags PREINIT: dMY_CXT; CODE: {#ifndef AT_LEAST_DB_4_1 softCrash("$env->create needs Berkeley DB 4.1 or better") ;#else DB_ENV * env ; int status; RETVAL = NULL; Trace(("in BerkeleyDB::Env::create flags=%d\n", flags)) ; status = db_env_create(&env, flags) ; Trace(("db_env_create returned %s\n", my_db_strerror(status))) ; if (status == 0) { ZMALLOC(RETVAL, BerkeleyDB_ENV_type) ; RETVAL->Env = env ; RETVAL->active = TRUE ; RETVAL->opened = FALSE; env->set_alloc(env, safemalloc, MyRealloc, safefree) ; env->set_errcall(env, db_errcall_cb) ; }#endif } OUTPUT: RETVALintopen(env, db_home=NULL, flags=0, mode=0777) BerkeleyDB::Env env char * db_home u_int32_t flags int mode PREINIT: dMY_CXT; CODE:#ifndef AT_LEAST_DB_4_1 softCrash("$env->create needs Berkeley DB 4.1 or better") ;#else RETVAL = env->Env->open(env->Env, db_home, flags, mode); env->opened = TRUE;#endif OUTPUT: RETVALboolcds_enabled(env) BerkeleyDB::Env env PREINIT: dMY_CXT; CODE: RETVAL = env->cds_enabled ; OUTPUT: RETVALintset_encrypt(env, passwd, flags) BerkeleyDB::Env env const char * passwd u_int32_t flags PREINIT: dMY_CXT; CODE:#ifndef AT_LEAST_DB_4_1 softCrash("$env->set_encrypt needs Berkeley DB 4.1 or better") ;#else dieIfEnvOpened(env, "set_encrypt"); RETVAL = env->Env->set_encrypt(env->Env, passwd, flags); env->opened = TRUE;#endif OUTPUT: RETVALBerkeleyDB::Env::Raw_db_appinit(self, ref, errfile=NULL) char * self SV * ref SV * errfile PREINIT: dMY_CXT; CODE: { HV * hash ; SV * sv ; char * enc_passwd = NULL ; int enc_flags = 0 ; char * home = NULL ; char * server = NULL ; char ** config = NULL ; int flags = 0 ; int setflags = 0 ; int cachesize = 0 ; int lk_detect = 0 ; long shm_key = 0 ; SV * errprefix = NULL; DB_ENV * env ; int status ; Trace(("in _db_appinit [%s] %d\n", self, ref)) ; hash = (HV*) SvRV(ref) ; SetValue_pv(home, "Home", char *) ; SetValue_pv(enc_passwd,"Enc_Passwd", char *) ; SetValue_iv(enc_flags, "Enc_Flags") ; SetValue_pv(config, "Config", char **) ; SetValue_sv(errprefix, "ErrPrefix") ; SetValue_iv(flags, "Flags") ; SetValue_iv(setflags, "SetFlags") ; SetValue_pv(server, "Server", char *) ; SetValue_iv(cachesize, "Cachesize") ; SetValue_iv(lk_detect, "LockDetect") ; SetValue_iv(shm_key, "SharedMemKey") ;#ifndef AT_LEAST_DB_3_2 if (setflags) softCrash("-SetFlags needs Berkeley DB 3.x or better") ;#endif /* ! AT_LEAST_DB_3 */#ifndef AT_LEAST_DB_3_1 if (shm_key) softCrash("-SharedMemKey needs Berkeley DB 3.1 or better") ; if (server) softCrash("-Server needs Berkeley DB 3.1 or better") ;#endif /* ! AT_LEAST_DB_3_1 */#ifndef AT_LEAST_DB_4_1 if (enc_passwd) softCrash("-Encrypt needs Berkeley DB 4.x or better") ;#endif /* ! AT_LEAST_DB_4_1 */ Trace(("_db_appinit(config=[%d], home=[%s],errprefix=[%s],flags=[%d]\n", config, home, errprefix, flags)) ;#ifdef TRACE if (config) { int i ; for (i = 0 ; i < 10 ; ++ i) { if (config[i] == NULL) { printf(" End\n") ; break ; } printf(" config = [%s]\n", config[i]) ; } }#endif /* TRACE */ ZMALLOC(RETVAL, BerkeleyDB_ENV_type) ; if (flags & DB_INIT_TXN) RETVAL->txn_enabled = TRUE ;#if DB_VERSION_MAJOR == 2 ZMALLOC(RETVAL->Env, DB_ENV) ; env = RETVAL->Env ; { /* Take a copy of the error prefix */ if (errprefix) { Trace(("copying errprefix\n" )) ; RETVAL->ErrPrefix = newSVsv(errprefix) ; SvPOK_only(RETVAL->ErrPrefix) ; } if (RETVAL->ErrPrefix) RETVAL->Env->db_errpfx = SvPVX(RETVAL->ErrPrefix) ; if (SvGMAGICAL(errfile)) mg_get(errfile); if (SvOK(errfile)) { FILE * ef = GetFILEptr(errfile) ; if (! ef) croak("Cannot open file ErrFile", Strerror(errno)); RETVAL->ErrHandle = newSVsv(errfile) ; env->db_errfile = ef; } SetValue_iv(env->db_verbose, "Verbose") ; env->db_errcall = db_errcall_cb ; RETVAL->active = TRUE ; RETVAL->opened = TRUE; RETVAL->cds_enabled = ((flags & DB_INIT_CDB) != 0 ? TRUE : FALSE) ; status = db_appinit(home, config, env, flags) ; printf(" status = %d errno %d \n", status, errno) ; Trace((" status = %d env %d Env %d\n", status, RETVAL, env)) ; if (status == 0) hash_store_iv("BerkeleyDB::Term::Env", (char *)RETVAL, 1) ; else { if (RETVAL->ErrHandle) SvREFCNT_dec(RETVAL->ErrHandle) ; if (RETVAL->ErrPrefix) SvREFCNT_dec(RETVAL->ErrPrefix) ; Safefree(RETVAL->Env) ; Safefree(RETVAL) ; RETVAL = NULL ; } }#else /* DB_VERSION_MAJOR > 2 */#ifndef AT_LEAST_DB_3_1# define DB_CLIENT 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -