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

📄 db_file.xs

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