⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_file.xs

📁 关于Berkelay数据库的共享源码
💻 XS
📖 第 1 页 / 共 4 页
字号:
    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 + -