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

📄 db_file.xs

📁 UNIX下perl实现代码
💻 XS
📖 第 1 页 / 共 4 页
字号:
	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 + -