📄 db_file.xs
字号:
if (strEQ(name, "R_SETCURSOR"))#ifdef R_SETCURSOR return R_SETCURSOR;#else goto not_there;#endif if (strEQ(name, "R_SNAPSHOT"))#ifdef R_SNAPSHOT return R_SNAPSHOT;#else goto not_there;#endif break; case 'S': break; case 'T': break; case 'U': break; case 'V': break; case 'W': break; case 'X': break; case 'Y': break; case 'Z': break; case '_': break; } errno = EINVAL; return 0;not_there: errno = ENOENT; return 0;}MODULE = DB_File PACKAGE = DB_File PREFIX = db_BOOT: { __getBerkeleyDBInfo() ; DBT_clear(empty) ; empty.data = &zero ; empty.size = sizeof(recno_t) ; }doubleconstant(name,arg) char * name int argDB_Filedb_DoTie_(isHASH, dbtype, name=undef, flags=O_CREAT|O_RDWR, mode=0666, type=DB_HASH) int isHASH char * dbtype int flags int mode CODE: { char * name = (char *) NULL ; SV * sv = (SV *) NULL ; STRLEN n_a; if (items >= 3 && SvOK(ST(2))) name = (char*) SvPV(ST(2), n_a) ; if (items == 6) sv = ST(5) ; RETVAL = ParseOpenInfo(aTHX_ isHASH, name, flags, mode, sv) ; if (RETVAL->dbp == NULL) RETVAL = NULL ; } OUTPUT: RETVALintdb_DESTROY(db) DB_File db INIT: CurrentDB = db ; CLEANUP: if (db->hash) SvREFCNT_dec(db->hash) ; if (db->compare) SvREFCNT_dec(db->compare) ; if (db->prefix) SvREFCNT_dec(db->prefix) ;#ifdef DBM_FILTERING if (db->filter_fetch_key) SvREFCNT_dec(db->filter_fetch_key) ; if (db->filter_store_key) SvREFCNT_dec(db->filter_store_key) ; if (db->filter_fetch_value) SvREFCNT_dec(db->filter_fetch_value) ; if (db->filter_store_value) SvREFCNT_dec(db->filter_store_value) ;#endif /* DBM_FILTERING */ safefree(db) ;#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ;#endifintdb_DELETE(db, key, flags=0) DB_File db DBTKEY key u_int flags INIT: CurrentDB = db ;intdb_EXISTS(db, key) DB_File db DBTKEY key CODE: { DBT value ; DBT_clear(value) ; CurrentDB = db ; RETVAL = (((db->dbp)->get)(db->dbp, TXN &key, &value, 0) == 0) ; } OUTPUT: RETVALintdb_FETCH(db, key, flags=0) DB_File db DBTKEY key u_int flags CODE: { DBT value ; DBT_clear(value) ; CurrentDB = db ; /* RETVAL = ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) ; */ RETVAL = db_get(db, key, value, flags) ; ST(0) = sv_newmortal(); OutputValue(ST(0), value) }intdb_STORE(db, key, value, flags=0) DB_File db DBTKEY key DBT value u_int flags INIT: CurrentDB = db ;intdb_FIRSTKEY(db) DB_File db CODE: { DBTKEY key ; DBT value ; DBT_clear(key) ; DBT_clear(value) ; CurrentDB = db ; RETVAL = do_SEQ(db, key, value, R_FIRST) ; ST(0) = sv_newmortal(); OutputKey(ST(0), key) ; }intdb_NEXTKEY(db, key) DB_File db DBTKEY key CODE: { DBT value ; DBT_clear(value) ; CurrentDB = db ; RETVAL = do_SEQ(db, key, value, R_NEXT) ; ST(0) = sv_newmortal(); OutputKey(ST(0), key) ; }## These would be nice for RECNO#intunshift(db, ...) DB_File db ALIAS: UNSHIFT = 1 CODE: { DBTKEY key ; DBT value ; int i ; int One ; DB * Db = db->dbp ; STRLEN n_a; DBT_clear(key) ; DBT_clear(value) ; CurrentDB = db ;#ifdef DB_VERSION_MAJOR /* get the first value */ RETVAL = do_SEQ(db, key, value, DB_FIRST) ; RETVAL = 0 ;#else RETVAL = -1 ;#endif for (i = items-1 ; i > 0 ; --i) { value.data = SvPV(ST(i), n_a) ; value.size = n_a ; One = 1 ; key.data = &One ; key.size = sizeof(int) ;#ifdef DB_VERSION_MAJOR RETVAL = (db->cursor->c_put)(db->cursor, &key, &value, DB_BEFORE) ;#else RETVAL = (Db->put)(Db, &key, &value, R_IBEFORE) ;#endif if (RETVAL != 0) break; } } OUTPUT: RETVALI32pop(db) DB_File db ALIAS: POP = 1 CODE: { DBTKEY key ; DBT value ; DBT_clear(key) ; DBT_clear(value) ; CurrentDB = db ; /* First get the final value */ RETVAL = do_SEQ(db, key, value, R_LAST) ; ST(0) = sv_newmortal(); /* Now delete it */ if (RETVAL == 0) { /* the call to del will trash value, so take a copy now */ OutputValue(ST(0), value) ; RETVAL = db_del(db, key, R_CURSOR) ; if (RETVAL != 0) sv_setsv(ST(0), &PL_sv_undef); } }I32shift(db) DB_File db ALIAS: SHIFT = 1 CODE: { DBT value ; DBTKEY key ; DBT_clear(key) ; DBT_clear(value) ; CurrentDB = db ; /* get the first value */ RETVAL = do_SEQ(db, key, value, R_FIRST) ; ST(0) = sv_newmortal(); /* Now delete it */ if (RETVAL == 0) { /* the call to del will trash value, so take a copy now */ OutputValue(ST(0), value) ; RETVAL = db_del(db, key, R_CURSOR) ; if (RETVAL != 0) sv_setsv (ST(0), &PL_sv_undef) ; } }I32push(db, ...) DB_File db ALIAS: PUSH = 1 CODE: { DBTKEY key ; DBT value ; DB * Db = db->dbp ; int i ; STRLEN n_a; int keyval ; DBT_flags(key) ; DBT_flags(value) ; CurrentDB = db ; /* Set the Cursor to the Last element */ RETVAL = do_SEQ(db, key, value, R_LAST) ;#ifndef DB_VERSION_MAJOR if (RETVAL >= 0)#endif { if (RETVAL == 0) keyval = *(int*)key.data ; else keyval = 0 ; for (i = 1 ; i < items ; ++i) { value.data = SvPV(ST(i), n_a) ; value.size = n_a ; ++ keyval ; key.data = &keyval ; key.size = sizeof(int) ; RETVAL = (Db->put)(Db, TXN &key, &value, 0) ; if (RETVAL != 0) break; } } } OUTPUT: RETVALI32length(db) DB_File db ALIAS: FETCHSIZE = 1 CODE: CurrentDB = db ; RETVAL = GetArrayLength(aTHX_ db) ; OUTPUT: RETVAL## Now provide an interface to the rest of the DB functionality#intdb_del(db, key, flags=0) DB_File db DBTKEY key u_int flags CODE: CurrentDB = db ; RETVAL = db_del(db, key, flags) ;#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ; else if (RETVAL == DB_NOTFOUND) RETVAL = 1 ;#endif OUTPUT: RETVALintdb_get(db, key, value, flags=0) DB_File db DBTKEY key DBT value = NO_INIT u_int flags CODE: CurrentDB = db ; DBT_clear(value) ; RETVAL = db_get(db, key, value, flags) ;#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ; else if (RETVAL == DB_NOTFOUND) RETVAL = 1 ;#endif OUTPUT: RETVAL valueintdb_put(db, key, value, flags=0) DB_File db DBTKEY key DBT value u_int flags CODE: CurrentDB = db ; RETVAL = db_put(db, key, value, flags) ;#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ; else if (RETVAL == DB_KEYEXIST) RETVAL = 1 ;#endif OUTPUT: RETVAL key if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) OutputKey(ST(1), key);intdb_fd(db) DB_File db int status = 0 ; CODE: CurrentDB = db ;#ifdef DB_VERSION_MAJOR RETVAL = -1 ; status = (db->in_memory ? -1 : ((db->dbp)->fd)(db->dbp, &RETVAL) ) ; if (status != 0) RETVAL = -1 ;#else RETVAL = (db->in_memory ? -1 : ((db->dbp)->fd)(db->dbp) ) ;#endif OUTPUT: RETVALintdb_sync(db, flags=0) DB_File db u_int flags CODE: CurrentDB = db ; RETVAL = db_sync(db, flags) ;#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ;#endif OUTPUT: RETVALintdb_seq(db, key, value, flags) DB_File db DBTKEY key DBT value = NO_INIT u_int flags CODE: CurrentDB = db ; DBT_clear(value) ; RETVAL = db_seq(db, key, value, flags);#ifdef DB_VERSION_MAJOR if (RETVAL > 0) RETVAL = -1 ; else if (RETVAL == DB_NOTFOUND) RETVAL = 1 ;#endif OUTPUT: RETVAL key value#ifdef DBM_FILTERING#define setFilter(type) \ { \ if (db->type) \ RETVAL = sv_mortalcopy(db->type) ; \ ST(0) = RETVAL ; \ if (db->type && (code == &PL_sv_undef)) { \ SvREFCNT_dec(db->type) ; \ db->type = NULL ; \ } \ else if (code) { \ if (db->type) \ sv_setsv(db->type, code) ; \ else \ db->type = newSVsv(code) ; \ } \ }SV *filter_fetch_key(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: setFilter(filter_fetch_key) ;SV *filter_store_key(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: setFilter(filter_store_key) ;SV *filter_fetch_value(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: setFilter(filter_fetch_value) ;SV *filter_store_value(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: setFilter(filter_store_value) ;#endif /* DBM_FILTERING */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -