📄 db_file.xs
字号:
MY_CXT_INIT; __getBerkeleyDBInfo() ; DBT_clear(empty) ; empty.data = &zero ; empty.size = sizeof(recno_t) ; }DB_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) { Safefree(RETVAL); RETVAL = NULL ; } } OUTPUT: RETVALintdb_DESTROY(db) DB_File db PREINIT: dMY_CXT; INIT: CurrentDB = db ; Trace(("DESTROY %p\n", db)); CLEANUP: Trace(("DESTROY %p done\n", db)); if (db->hash) SvREFCNT_dec(db->hash) ; if (db->compare) SvREFCNT_dec(db->compare) ; if (db->prefix) SvREFCNT_dec(db->prefix) ; 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) ; 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 PREINIT: dMY_CXT; INIT: CurrentDB = db ;intdb_EXISTS(db, key) DB_File db DBTKEY key PREINIT: dMY_CXT; CODE: { DBT value ; DBT_clear(value) ; CurrentDB = db ; RETVAL = (((db->dbp)->get)(db->dbp, TXN &key, &value, 0) == 0) ; } OUTPUT: RETVALvoiddb_FETCH(db, key, flags=0) DB_File db DBTKEY key u_int flags PREINIT: dMY_CXT ; int RETVAL ; CODE: { DBT value ; DBT_clear(value) ; CurrentDB = db ; 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 PREINIT: dMY_CXT; INIT: CurrentDB = db ;voiddb_FIRSTKEY(db) DB_File db PREINIT: dMY_CXT ; int RETVAL ; 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) ; }voiddb_NEXTKEY(db, key) DB_File db DBTKEY key = NO_INIT PREINIT: dMY_CXT ; int RETVAL ; CODE: { DBT value ; DBT_clear(key) ; 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 PREINIT: dMY_CXT; CODE: { DBTKEY key ; DBT value ; int i ; int One ; 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) { DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); value.data = SvPVbyte(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->dbp->put)(db->dbp, &key, &value, R_IBEFORE) ;#endif if (RETVAL != 0) break; } } OUTPUT: RETVALvoidpop(db) DB_File db PREINIT: dMY_CXT; ALIAS: POP = 1 PREINIT: I32 RETVAL; 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); } }voidshift(db) DB_File db PREINIT: dMY_CXT; ALIAS: SHIFT = 1 PREINIT: I32 RETVAL; 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 PREINIT: dMY_CXT; 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) { DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); value.data = SvPVbyte(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 PREINIT: dMY_CXT; 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 PREINIT: dMY_CXT; 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 PREINIT: dMY_CXT; 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 PREINIT: dMY_CXT; 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 PREINIT: dMY_CXT ; CODE: CurrentDB = db ;#ifdef DB_VERSION_MAJOR RETVAL = -1 ; { int status = 0 ; 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 PREINIT: dMY_CXT; 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 PREINIT: dMY_CXT; 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 valueSV *filter_fetch_key(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: DBM_setFilter(db->filter_fetch_key, code) ;SV *filter_store_key(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: DBM_setFilter(db->filter_store_key, code) ;SV *filter_fetch_value(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: DBM_setFilter(db->filter_fetch_value, code) ;SV *filter_store_value(db, code) DB_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: DBM_setFilter(db->filter_store_value, code) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -