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

📄 db_file.xs

📁 UNIX下perl实现代码
💻 XS
📖 第 1 页 / 共 4 页
字号:
                    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 ;/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ;  */    Zero(RETVAL, 1, DB_File_type) ;    /* Default to HASH */#ifdef DBM_FILTERING    RETVAL->filtering = 0 ;    RETVAL->filter_fetch_key = RETVAL->filter_store_key =     RETVAL->filter_fetch_value = RETVAL->filter_store_value =#endif /* DBM_FILTERING */    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 ;    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, SvIV(*svp)) ;                    svp = hv_fetch(action, "nelem", 5, FALSE);	   if (svp)               (void)dbp->set_h_nelem(dbp, SvIV(*svp)) ;                    svp = hv_fetch(action, "bsize", 5, FALSE);	   if (svp)               (void)dbp->set_pagesize(dbp, SvIV(*svp));                      svp = hv_fetch(action, "cachesize", 9, FALSE);	   if (svp)               (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ;                    svp = hv_fetch(action, "lorder", 6, FALSE);	   if (svp)               (void)dbp->set_lorder(dbp, 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, SvIV(*svp)) ;              svp = hv_fetch(action, "cachesize", 9, FALSE);	   if (svp)               (void)dbp->set_cachesize(dbp, 0, SvIV(*svp), 0) ;                    svp = hv_fetch(action, "psize", 5, FALSE);	   if (svp)               (void)dbp->set_pagesize(dbp, SvIV(*svp)) ;                    svp = hv_fetch(action, "lorder", 6, FALSE);	   if (svp)               (void)dbp->set_lorder(dbp, 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, SvIV(*svp), 0) ;	   }                    svp = hv_fetch(action, "psize", 5, FALSE);	   if (svp) {               status = dbp->set_pagesize(dbp, SvIV(*svp)) ;	    }                    svp = hv_fetch(action, "lorder", 6, FALSE);	   if (svp) {               status = dbp->set_lorder(dbp, 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 = 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 =  (u_int32_t)SvIV(*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, DB_RENUMBER) ;         		if (flags){	            (void)dbp->set_flags(dbp, flags) ;		}            PrintRecno(info) ;        }        else            croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO");    }    {        int	 	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        status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, 	    			Flags, mode) ; 	/* 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 */static double #ifdef CAN_PROTOTYPEconstant(char *name, int arg)#elseconstant(name, arg)char *name;int arg;#endif{    errno = 0;    switch (*name) {    case 'A':	break;    case 'B':	if (strEQ(name, "BTREEMAGIC"))#ifdef BTREEMAGIC	    return BTREEMAGIC;#else	    goto not_there;#endif	if (strEQ(name, "BTREEVERSION"))#ifdef BTREEVERSION	    return BTREEVERSION;#else	    goto not_there;#endif	break;    case 'C':	break;    case 'D':	if (strEQ(name, "DB_LOCK"))#ifdef DB_LOCK	    return DB_LOCK;#else	    goto not_there;#endif	if (strEQ(name, "DB_SHMEM"))#ifdef DB_SHMEM	    return DB_SHMEM;#else	    goto not_there;#endif	if (strEQ(name, "DB_TXN"))#ifdef DB_TXN	    return (U32)DB_TXN;#else	    goto not_there;#endif	break;    case 'E':	break;    case 'F':	break;    case 'G':	break;    case 'H':	if (strEQ(name, "HASHMAGIC"))#ifdef HASHMAGIC	    return HASHMAGIC;#else	    goto not_there;#endif	if (strEQ(name, "HASHVERSION"))#ifdef HASHVERSION	    return HASHVERSION;#else	    goto not_there;#endif	break;    case 'I':	break;    case 'J':	break;    case 'K':	break;    case 'L':	break;    case 'M':	if (strEQ(name, "MAX_PAGE_NUMBER"))#ifdef MAX_PAGE_NUMBER	    return (U32)MAX_PAGE_NUMBER;#else	    goto not_there;#endif	if (strEQ(name, "MAX_PAGE_OFFSET"))#ifdef MAX_PAGE_OFFSET	    return MAX_PAGE_OFFSET;#else	    goto not_there;#endif	if (strEQ(name, "MAX_REC_NUMBER"))#ifdef MAX_REC_NUMBER	    return (U32)MAX_REC_NUMBER;#else	    goto not_there;#endif	break;    case 'N':	break;    case 'O':	break;    case 'P':	break;    case 'Q':	break;    case 'R':	if (strEQ(name, "RET_ERROR"))#ifdef RET_ERROR	    return RET_ERROR;#else	    goto not_there;#endif	if (strEQ(name, "RET_SPECIAL"))#ifdef RET_SPECIAL	    return RET_SPECIAL;#else	    goto not_there;#endif	if (strEQ(name, "RET_SUCCESS"))#ifdef RET_SUCCESS	    return RET_SUCCESS;#else	    goto not_there;#endif	if (strEQ(name, "R_CURSOR"))#ifdef R_CURSOR	    return R_CURSOR;#else	    goto not_there;#endif	if (strEQ(name, "R_DUP"))#ifdef R_DUP	    return R_DUP;#else	    goto not_there;#endif	if (strEQ(name, "R_FIRST"))#ifdef R_FIRST	    return R_FIRST;#else	    goto not_there;#endif	if (strEQ(name, "R_FIXEDLEN"))#ifdef R_FIXEDLEN	    return R_FIXEDLEN;#else	    goto not_there;#endif	if (strEQ(name, "R_IAFTER"))#ifdef R_IAFTER	    return R_IAFTER;#else	    goto not_there;#endif	if (strEQ(name, "R_IBEFORE"))#ifdef R_IBEFORE	    return R_IBEFORE;#else	    goto not_there;#endif	if (strEQ(name, "R_LAST"))#ifdef R_LAST	    return R_LAST;#else	    goto not_there;#endif	if (strEQ(name, "R_NEXT"))#ifdef R_NEXT	    return R_NEXT;#else	    goto not_there;#endif	if (strEQ(name, "R_NOKEY"))#ifdef R_NOKEY	    return R_NOKEY;#else	    goto not_there;#endif	if (strEQ(name, "R_NOOVERWRITE"))#ifdef R_NOOVERWRITE	    return R_NOOVERWRITE;#else	    goto not_there;#endif	if (strEQ(name, "R_PREV"))#ifdef R_PREV	    return R_PREV;#else	    goto not_there;#endif	if (strEQ(name, "R_RECNOSYNC"))#ifdef R_RECNOSYNC	    return R_RECNOSYNC;#else	    goto not_there;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -