📄 db_file.xs
字号:
info->db_RE_bval = (u_char) ' ' ; else info->db_RE_bval = (u_char) '\n' ; DB_flags(info->flags, DB_DELIMITER) ; }#endif#ifdef DB_RENUMBER info->flags |= DB_RENUMBER ;#endif PrintRecno(info) ; } else croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); } /* OS2 Specific Code */#ifdef OS2#ifdef __EMX__ flags |= O_BINARY;#endif /* __EMX__ */#endif /* OS2 */#ifdef DB_VERSION_MAJOR { int Flags = 0 ; int status ; /* Map 1.x flags to 2.x flags */ if ((flags & O_CREAT) == O_CREAT) Flags |= DB_CREATE ;#if O_RDONLY == 0 if (flags == O_RDONLY)#else if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR)#endif Flags |= DB_RDONLY ;#ifdef O_TRUNC if ((flags & O_TRUNC) == O_TRUNC) Flags |= DB_TRUNCATE ;#endif status = db_open(name, RETVAL->type, Flags, mode, NULL, openinfo, &RETVAL->dbp) ; if (status == 0)#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ;#else status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, 0) ;#endif if (status) RETVAL->dbp = NULL ; }#else#if defined(DB_LIBRARY_COMPATIBILITY_API) && DB_VERSION_MAJOR > 2 RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, openinfo) ; #else RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, openinfo) ; #endif /* DB_LIBRARY_COMPATIBILITY_API */#endif return (RETVAL) ;#else /* Berkeley DB Version > 2 */ SV ** svp; HV * action ; DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; DB * dbp ; STRLEN n_a; int status ;/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */ Zero(RETVAL, 1, DB_File_type) ; /* Default to HASH */#ifdef DBM_FILTERING RETVAL->filtering = 0 ; RETVAL->filter_fetch_key = RETVAL->filter_store_key = RETVAL->filter_fetch_value = RETVAL->filter_store_value =#endif /* DBM_FILTERING */ RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; RETVAL->type = DB_HASH ; /* DGH - Next line added to avoid SEGV on existing hash DB */ CurrentDB = RETVAL; /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */ RETVAL->in_memory = (name == NULL) ; status = db_create(&RETVAL->dbp, NULL,0) ; /* printf("db_create returned %d %s\n", status, db_strerror(status)) ; */ if (status) { RETVAL->dbp = NULL ; return (RETVAL) ; } dbp = RETVAL->dbp ; if (sv) { if (! SvROK(sv) ) croak ("type parameter is not a reference") ; svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ; if (svp && SvOK(*svp)) action = (HV*) SvRV(*svp) ; else croak("internal error") ; if (sv_isa(sv, "DB_File::HASHINFO")) { if (!isHASH) croak("DB_File can only tie an associative array to a DB_HASH database") ; RETVAL->type = DB_HASH ; svp = hv_fetch(action, "hash", 4, FALSE); if (svp && SvOK(*svp)) { (void)dbp->set_h_hash(dbp, hash_cb) ; RETVAL->hash = newSVsv(*svp) ; } svp = hv_fetch(action, "ffactor", 7, FALSE); if (svp) (void)dbp->set_h_ffactor(dbp, SvIV(*svp)) ; svp = hv_fetch(action, "nelem", 5, FALSE); if (svp) (void)dbp->set_h_nelem(dbp, SvIV(*svp)) ; svp = hv_fetch(action, "bsize", 5, FALSE); if (svp) (void)dbp->set_pagesize(dbp, SvIV(*svp)); svp = hv_fetch(action, "cachesize", 9, FALSE); if (svp) (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ; svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) (void)dbp->set_lorder(dbp, SvIV(*svp)) ; PrintHash(info) ; } else if (sv_isa(sv, "DB_File::BTREEINFO")) { if (!isHASH) croak("DB_File can only tie an associative array to a DB_BTREE database"); RETVAL->type = DB_BTREE ; svp = hv_fetch(action, "compare", 7, FALSE); if (svp && SvOK(*svp)) { (void)dbp->set_bt_compare(dbp, btree_compare) ; RETVAL->compare = newSVsv(*svp) ; } svp = hv_fetch(action, "prefix", 6, FALSE); if (svp && SvOK(*svp)) { (void)dbp->set_bt_prefix(dbp, btree_prefix) ; RETVAL->prefix = newSVsv(*svp) ; } svp = hv_fetch(action, "flags", 5, FALSE); if (svp) (void)dbp->set_flags(dbp, SvIV(*svp)) ; svp = hv_fetch(action, "cachesize", 9, FALSE); if (svp) (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ; svp = hv_fetch(action, "psize", 5, FALSE); if (svp) (void)dbp->set_pagesize(dbp, SvIV(*svp)) ; svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) (void)dbp->set_lorder(dbp, SvIV(*svp)) ; PrintBtree(info) ; } else if (sv_isa(sv, "DB_File::RECNOINFO")) { int fixed = FALSE ; if (isHASH) croak("DB_File can only tie an array to a DB_RECNO database"); RETVAL->type = DB_RECNO ; svp = hv_fetch(action, "flags", 5, FALSE); if (svp) { int flags = SvIV(*svp) ; /* remove FIXDLEN, if present */ if (flags & DB_FIXEDLEN) { fixed = TRUE ; flags &= ~DB_FIXEDLEN ; } } svp = hv_fetch(action, "cachesize", 9, FALSE); if (svp) { status = dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ; } svp = hv_fetch(action, "psize", 5, FALSE); if (svp) { status = dbp->set_pagesize(dbp, SvIV(*svp)) ; } svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) { status = dbp->set_lorder(dbp, SvIV(*svp)) ; } svp = hv_fetch(action, "bval", 4, FALSE); if (svp && SvOK(*svp)) { int value ; if (SvPOK(*svp)) value = (int)*SvPV(*svp, n_a) ; else value = SvIV(*svp) ; if (fixed) { status = dbp->set_re_pad(dbp, value) ; } else { status = dbp->set_re_delim(dbp, value) ; } } if (fixed) { svp = hv_fetch(action, "reclen", 6, FALSE); if (svp) { u_int32_t len = (u_int32_t)SvIV(*svp) ; status = dbp->set_re_len(dbp, len) ; } } if (name != NULL) { status = dbp->set_re_source(dbp, name) ; name = NULL ; } svp = hv_fetch(action, "bfname", 6, FALSE); if (svp && SvOK(*svp)) { char * ptr = SvPV(*svp,n_a) ; name = (char*) n_a ? ptr : NULL ; } else name = NULL ; status = dbp->set_flags(dbp, DB_RENUMBER) ; if (flags){ (void)dbp->set_flags(dbp, flags) ; } PrintRecno(info) ; } else croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); } { int Flags = 0 ; int status ; /* Map 1.x flags to 3.x flags */ if ((flags & O_CREAT) == O_CREAT) Flags |= DB_CREATE ;#if O_RDONLY == 0 if (flags == O_RDONLY)#else if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR)#endif Flags |= DB_RDONLY ;#ifdef O_TRUNC if ((flags & O_TRUNC) == O_TRUNC) Flags |= DB_TRUNCATE ;#endif status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, Flags, mode) ; /* printf("open returned %d %s\n", status, db_strerror(status)) ; */ if (status == 0) status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, 0) ; /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */ if (status) RETVAL->dbp = NULL ; } return (RETVAL) ;#endif /* Berkeley DB Version > 2 */} /* ParseOpenInfo */static double #ifdef CAN_PROTOTYPEconstant(char *name, int arg)#elseconstant(name, arg)char *name;int arg;#endif{ errno = 0; switch (*name) { case 'A': break; case 'B': if (strEQ(name, "BTREEMAGIC"))#ifdef BTREEMAGIC return BTREEMAGIC;#else goto not_there;#endif if (strEQ(name, "BTREEVERSION"))#ifdef BTREEVERSION return BTREEVERSION;#else goto not_there;#endif break; case 'C': break; case 'D': if (strEQ(name, "DB_LOCK"))#ifdef DB_LOCK return DB_LOCK;#else goto not_there;#endif if (strEQ(name, "DB_SHMEM"))#ifdef DB_SHMEM return DB_SHMEM;#else goto not_there;#endif if (strEQ(name, "DB_TXN"))#ifdef DB_TXN return (U32)DB_TXN;#else goto not_there;#endif break; case 'E': break; case 'F': break; case 'G': break; case 'H': if (strEQ(name, "HASHMAGIC"))#ifdef HASHMAGIC return HASHMAGIC;#else goto not_there;#endif if (strEQ(name, "HASHVERSION"))#ifdef HASHVERSION return HASHVERSION;#else goto not_there;#endif break; case 'I': break; case 'J': break; case 'K': break; case 'L': break; case 'M': if (strEQ(name, "MAX_PAGE_NUMBER"))#ifdef MAX_PAGE_NUMBER return (U32)MAX_PAGE_NUMBER;#else goto not_there;#endif if (strEQ(name, "MAX_PAGE_OFFSET"))#ifdef MAX_PAGE_OFFSET return MAX_PAGE_OFFSET;#else goto not_there;#endif if (strEQ(name, "MAX_REC_NUMBER"))#ifdef MAX_REC_NUMBER return (U32)MAX_REC_NUMBER;#else goto not_there;#endif break; case 'N': break; case 'O': break; case 'P': break; case 'Q': break; case 'R': if (strEQ(name, "RET_ERROR"))#ifdef RET_ERROR return RET_ERROR;#else goto not_there;#endif if (strEQ(name, "RET_SPECIAL"))#ifdef RET_SPECIAL return RET_SPECIAL;#else goto not_there;#endif if (strEQ(name, "RET_SUCCESS"))#ifdef RET_SUCCESS return RET_SUCCESS;#else goto not_there;#endif if (strEQ(name, "R_CURSOR"))#ifdef R_CURSOR return R_CURSOR;#else goto not_there;#endif if (strEQ(name, "R_DUP"))#ifdef R_DUP return R_DUP;#else goto not_there;#endif if (strEQ(name, "R_FIRST"))#ifdef R_FIRST return R_FIRST;#else goto not_there;#endif if (strEQ(name, "R_FIXEDLEN"))#ifdef R_FIXEDLEN return R_FIXEDLEN;#else goto not_there;#endif if (strEQ(name, "R_IAFTER"))#ifdef R_IAFTER return R_IAFTER;#else goto not_there;#endif if (strEQ(name, "R_IBEFORE"))#ifdef R_IBEFORE return R_IBEFORE;#else goto not_there;#endif if (strEQ(name, "R_LAST"))#ifdef R_LAST return R_LAST;#else goto not_there;#endif if (strEQ(name, "R_NEXT"))#ifdef R_NEXT return R_NEXT;#else goto not_there;#endif if (strEQ(name, "R_NOKEY"))#ifdef R_NOKEY return R_NOKEY;#else goto not_there;#endif if (strEQ(name, "R_NOOVERWRITE"))#ifdef R_NOOVERWRITE return R_NOOVERWRITE;#else goto not_there;#endif if (strEQ(name, "R_PREV"))#ifdef R_PREV return R_PREV;#else goto not_there;#endif if (strEQ(name, "R_RECNOSYNC"))#ifdef R_RECNOSYNC return R_RECNOSYNC;#else goto not_there;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -