📄 db_file.xs
字号:
} else info->db_HA_hash = NULL ; svp = hv_fetch(action, "ffactor", 7, FALSE); info->db_HA_ffactor = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "nelem", 5, FALSE); info->db_HA_nelem = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "bsize", 5, FALSE); info->db_HA_bsize = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "cachesize", 9, FALSE); info->db_HA_cachesize = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "lorder", 6, FALSE); info->db_HA_lorder = svp ? SvIV(*svp) : 0; 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 ; openinfo = (void*)info ; svp = hv_fetch(action, "compare", 7, FALSE); if (svp && SvOK(*svp)) { info->db_BT_compare = btree_compare ; RETVAL->compare = newSVsv(*svp) ; } else info->db_BT_compare = NULL ; svp = hv_fetch(action, "prefix", 6, FALSE); if (svp && SvOK(*svp)) { info->db_BT_prefix = btree_prefix ; RETVAL->prefix = newSVsv(*svp) ; } else info->db_BT_prefix = NULL ; svp = hv_fetch(action, "flags", 5, FALSE); info->db_BT_flags = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "cachesize", 9, FALSE); info->db_BT_cachesize = svp ? SvIV(*svp) : 0; #ifndef DB_VERSION_MAJOR svp = hv_fetch(action, "minkeypage", 10, FALSE); info->btree.minkeypage = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "maxkeypage", 10, FALSE); info->btree.maxkeypage = svp ? SvIV(*svp) : 0;#endif svp = hv_fetch(action, "psize", 5, FALSE); info->db_BT_psize = svp ? SvIV(*svp) : 0; svp = hv_fetch(action, "lorder", 6, FALSE); info->db_BT_lorder = svp ? SvIV(*svp) : 0; PrintBtree(info) ; } else if (sv_isa(sv, "DB_File::RECNOINFO")) { if (isHASH) croak("DB_File can only tie an array to a DB_RECNO database"); RETVAL->type = DB_RECNO ; openinfo = (void *)info ; info->db_RE_flags = 0 ; svp = hv_fetch(action, "flags", 5, FALSE); info->db_RE_flags = (u_long) (svp ? SvIV(*svp) : 0); svp = hv_fetch(action, "reclen", 6, FALSE); info->db_RE_reclen = (size_t) (svp ? SvIV(*svp) : 0); svp = hv_fetch(action, "cachesize", 9, FALSE); info->db_RE_cachesize = (u_int) (svp ? SvIV(*svp) : 0); svp = hv_fetch(action, "psize", 5, FALSE); info->db_RE_psize = (u_int) (svp ? SvIV(*svp) : 0); svp = hv_fetch(action, "lorder", 6, FALSE); info->db_RE_lorder = (int) (svp ? SvIV(*svp) : 0);#ifdef DB_VERSION_MAJOR info->re_source = name ; name = NULL ;#endif svp = hv_fetch(action, "bfname", 6, FALSE); if (svp && SvOK(*svp)) { char * ptr = SvPV(*svp,n_a) ;#ifdef DB_VERSION_MAJOR name = (char*) n_a ? ptr : NULL ;#else info->db_RE_bfname = (char*) (n_a ? ptr : NULL) ;#endif } else#ifdef DB_VERSION_MAJOR name = NULL ;#else info->db_RE_bfname = NULL ;#endif svp = hv_fetch(action, "bval", 4, FALSE);#ifdef DB_VERSION_MAJOR if (svp && SvOK(*svp)) { int value ; if (SvPOK(*svp)) value = (int)*SvPV(*svp, n_a) ; else value = SvIV(*svp) ; if (info->flags & DB_FIXEDLEN) { info->re_pad = value ; info->flags |= DB_PAD ; } else { info->re_delim = value ; info->flags |= DB_DELIMITER ; } }#else if (svp && SvOK(*svp)) { if (SvPOK(*svp)) info->db_RE_bval = (u_char)*SvPV(*svp, n_a) ; else info->db_RE_bval = (u_char)(unsigned long) SvIV(*svp) ; DB_flags(info->flags, DB_DELIMITER) ; } else { if (info->db_RE_flags & R_FIXEDLEN) 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 ; dMY_CXT;/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */ Zero(RETVAL, 1, DB_File_type) ; /* Default to HASH */ RETVAL->filtering = 0 ; RETVAL->filter_fetch_key = RETVAL->filter_store_key = RETVAL->filter_fetch_value = RETVAL->filter_store_value = 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 ;#ifdef WANT_ERROR RETVAL->dbp->set_errcall(RETVAL->dbp, db_errcall_cb) ;#endif 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, my_SvUV32(*svp)) ; svp = hv_fetch(action, "nelem", 5, FALSE); if (svp) (void)dbp->set_h_nelem(dbp, my_SvUV32(*svp)) ; svp = hv_fetch(action, "bsize", 5, FALSE); if (svp) (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)); svp = hv_fetch(action, "cachesize", 9, FALSE); if (svp) (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) (void)dbp->set_lorder(dbp, (int)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, my_SvUV32(*svp)) ; svp = hv_fetch(action, "cachesize", 9, FALSE); if (svp) (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; svp = hv_fetch(action, "psize", 5, FALSE); if (svp) (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) (void)dbp->set_lorder(dbp, (int)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, my_SvUV32(*svp), 0) ; } svp = hv_fetch(action, "psize", 5, FALSE); if (svp) { status = dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; } svp = hv_fetch(action, "lorder", 6, FALSE); if (svp) { status = dbp->set_lorder(dbp, (int)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 = (int)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 = my_SvUV32(*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, (u_int32_t)DB_RENUMBER) ; if (flags){ (void)dbp->set_flags(dbp, (u_int32_t)flags) ; } PrintRecno(info) ; } else croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); } { u_int32_t 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#ifdef AT_LEAST_DB_4_4 /* need this for recno */ if ((flags & O_TRUNC) == O_TRUNC) Flags |= DB_CREATE ;#endif#ifdef AT_LEAST_DB_4_1 status = (RETVAL->dbp->open)(RETVAL->dbp, NULL, name, NULL, RETVAL->type, Flags, mode) ; #else status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, Flags, mode) ; #endif /* 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 */#include "constants.h" MODULE = DB_File PACKAGE = DB_File PREFIX = db_INCLUDE: constants.xsBOOT: {#ifdef dTHX dTHX;#endif #ifdef WANT_ERROR SV * sv_err = perl_get_sv(ERR_BUFF, GV_ADD|GV_ADDMULTI) ; #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -