亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? physical.c

?? harvest是一個下載html網頁得機器人
?? C
字號:
/* $Id: physical.c,v 1.18 2002/08/02 19:26:56 adam Exp $   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002   Index Data ApsThis file is part of the Zebra server.Zebra is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.Zebra is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public Licensealong with Zebra; see the file LICENSE.zebra.  If not, write to theFree Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.*//* * This module handles the representation of tables in the bfiles. */#include <assert.h>#include <stdio.h>#include <string.h>#include <yaz/log.h>#include <isam.h>static int is_freestore_alloc(ISAM is, int type){    int tmp;    if (is->types[type].freelist >= 0)    {    	tmp = is->types[type].freelist;    	if (bf_read(is->types[type].bf, tmp, 0, sizeof(tmp),	    &is->types[type].freelist) <=0)	{	    logf (LOG_FATAL, "Failed to allocate block");	    exit(1);	}    }    else    	tmp = is->types[type].top++;    logf (LOG_DEBUG, "Allocating block #%d", tmp);    return tmp;}static void is_freestore_free(ISAM is, int type, int block){    int tmp;    logf (LOG_DEBUG, "Releasing block #%d", block);    tmp = is->types[type].freelist;    is->types[type].freelist = block;    if (bf_write(is->types[type].bf, block, 0, sizeof(tmp), &tmp) < 0)    {    	logf (LOG_FATAL, "Failed to deallocate block.");    	exit(1);    }}/* this code must be modified to handle an index */int is_p_read_partial(is_mtable *tab, is_mblock *block){    int toread;    is_mbuf *buf;    assert(block->state == IS_MBSTATE_UNREAD);    block->data = buf = xmalloc_mbuf(IS_MBUF_TYPE_LARGE);    toread = tab->is->types[tab->pos_type].blocksize;    if (toread > is_mbuf_size[buf->type])    {    	toread = is_mbuf_size[buf->type];    	block->state = IS_MBSTATE_PARTIAL;    }    else    	block->state = IS_MBSTATE_CLEAN;    if (bf_read(tab->is->types[tab->pos_type].bf, block->diskpos, 0, toread,	buf->data) < 0)    {    	logf (LOG_FATAL, "bfread failed.");    	return -1;    }    /* extract header info */    buf->offset = 0;    memcpy(&block->num_records, buf->data, sizeof(block->num_records));    assert(block->num_records > 0);    buf->offset += sizeof(block->num_records);    memcpy(&block->nextpos, buf->data + buf->offset,	sizeof(block->nextpos));    buf->offset += sizeof(block->nextpos);    if (block == tab->data) /* first block */    {        memcpy(&tab->num_records, buf->data + buf->offset,	    sizeof(tab->num_records));	buf->offset +=sizeof(tab->num_records);    }    logf(LOG_DEBUG, "R: Block #%d: num %d nextpos %d total %d",        block->diskpos, block->num_records, block->nextpos,	block == tab->data ? tab->num_records : -1);    buf->num = (toread - buf->offset) / is_keysize(tab->is);    if (buf->num >= block->num_records)    {    	buf->num = block->num_records;    	block->state = IS_MBSTATE_CLEAN;    }    else    	block->bread = buf->offset + buf->num * is_keysize(tab->is);    return 0;}int is_p_read_full(is_mtable *tab, is_mblock *block){    is_mbuf *buf;    int dread, toread;    if (block->state == IS_MBSTATE_UNREAD && is_p_read_partial(tab, block) < 0)    {    	logf (LOG_FATAL, "partial read failed.");    	return -1;    }    if (block->state == IS_MBSTATE_PARTIAL)    {    	buf = block->data;    	dread = block->data->num;    	while (dread < block->num_records)    	{	    buf->next = xmalloc_mbuf(IS_MBUF_TYPE_LARGE);	    buf = buf->next;	    toread = is_mbuf_size[buf->type] / is_keysize(tab->is);	    if (toread > block->num_records - dread)	    	toread = block->num_records - dread;	    if (bf_read(tab->is->types[tab->pos_type].bf, block->diskpos, block->bread, toread *		is_keysize(tab->is), buf->data) < 0)	    {	    	logf (LOG_FATAL, "bfread failed.");	    	return -1;	    }	    buf->offset = 0;	    buf->num = toread;	    dread += toread;	    block->bread += toread * is_keysize(tab->is);    	}	block->state = IS_MBSTATE_CLEAN;    }    logf (LOG_DEBUG, "R: Block #%d contains %d records.", block->diskpos, block->num_records);    return 0;}/* * write dirty blocks to bfile. * Allocate blocks as necessary. */void is_p_sync(is_mtable *tab){    is_mblock *p;    is_mbuf *b;    int sum, v;    isam_blocktype *type;    type = &tab->is->types[tab->pos_type];    for (p = tab->data; p; p = p->next)    {    	if (p->state < IS_MBSTATE_DIRTY)	    continue;	/* make sure that blocks are allocated. */    	if (p->diskpos < 0)	    p->diskpos = is_freestore_alloc(tab->is, tab->pos_type);	if (p->next)	{	    if (p->next->diskpos < 0)		p->nextpos = p->next->diskpos = is_freestore_alloc(tab->is,		    tab->pos_type);	    else	    	p->nextpos = p->next->diskpos;	}	else	    p->nextpos = 0;	sum = 0;	memcpy(type->dbuf, &p->num_records, sizeof(p->num_records));	sum += sizeof(p->num_records);	memcpy(type->dbuf + sum, &p->nextpos, sizeof(p->nextpos));	sum += sizeof(p->nextpos);	if (p == tab->data)  /* first block */	{	    memcpy(type->dbuf + sum, &tab->num_records,		sizeof(tab->num_records));	    sum += sizeof(tab->num_records);	}	logf (LOG_DEBUG, "W: Block #%d contains %d records.", p->diskpos,	    p->num_records);	assert(p->num_records > 0);	for (b = p->data; b; b = b->next)	{            logf(LOG_DEBUG, "   buf: offset %d, keys %d, type %d, ref %d",	    	b->offset, b->num, b->type, b->refcount);	    if ((v = b->num * is_keysize(tab->is)) > 0)		memcpy(type->dbuf + sum, b->data + b->offset, v);	    sum += v;	    assert(sum <= type->blocksize);	}	if (bf_write(type->bf, p->diskpos, 0, sum, type->dbuf) < 0)	{	    logf (LOG_FATAL, "Failed to write block.");	    exit(1);	}    }}/* * Free all disk blocks associated with table. */void is_p_unmap(is_mtable *tab){    is_mblock *p;    for (p = tab->data; p; p = p->next)    {    	if (p->diskpos >= 0)    	{	    is_freestore_free(tab->is, tab->pos_type, p->diskpos);	    p->diskpos = -1;	}    }}static is_mbuf *mbuf_takehead(is_mbuf **mb, int *num, int keysize){    is_mbuf *p = 0, **pp = &p, *inew;    int toget = *num;    if (!toget)    	return 0;    while (*mb && toget >= (*mb)->num)    {	toget -= (*mb)->num;	*pp = *mb;	*mb = (*mb)->next;	(*pp)->next = 0;	pp = &(*pp)->next;    }    if (toget > 0 && *mb)    {	inew = xmalloc_mbuf(IS_MBUF_TYPE_SMALL);	inew->next = (*mb)->next;	(*mb)->next = inew;	inew->data = (*mb)->data;	(*mb)->refcount++;	inew->offset = (*mb)->offset + toget * keysize;	inew->num = (*mb)->num - toget;	(*mb)->num = toget;	*pp = *mb;	*mb = (*mb)->next;	(*pp)->next = 0;	toget = 0;    }    *num -= toget;    return p;}/* * Split up individual blocks which have grown too large. * is_p_align and is_p_remap are alternative functions which trade off * speed in updating versus optimum usage of disk blocks. */void is_p_align(is_mtable *tab){    is_mblock *mblock, *inew, *last = 0, *next;    is_mbuf *mbufs, *mbp;    int blocks, recsblock;    logf (LOG_DEBUG, "Realigning table.");    for (mblock = tab->data; mblock; mblock = next)    {        next = mblock->next;        if (mblock->state == IS_MBSTATE_DIRTY && mblock->num_records == 0)        {	    if (last)	    {	    	last->next = mblock->next;	    	last->state = IS_MBSTATE_DIRTY;	    	next = mblock->next;	    }	    else	    {	    	next = tab->data->next;		if (next)		{		    if (next->state < IS_MBSTATE_CLEAN)		    {			if (is_p_read_full(tab, next) < 0)			{			    logf(LOG_FATAL, "Error during re-alignment");			    abort();			}			if (next->nextpos && !next->next)			{			    next->next = xmalloc_mblock();			    next->next->diskpos = next->nextpos;			    next->next->state = IS_MBSTATE_UNREAD;			    next->next->data = 0;			}		    }		    next->state = IS_MBSTATE_DIRTY; /* force re-process */		    tab->data = next;		}	    }	    if (mblock->diskpos >= 0)		is_freestore_free(tab->is, tab->pos_type, mblock->diskpos);	    xrelease_mblock(mblock);	}    	else if (mblock->state == IS_MBSTATE_DIRTY && mblock->num_records >	    (mblock == tab->data ?	    tab->is->types[tab->pos_type].max_keys_block0 :	    tab->is->types[tab->pos_type].max_keys_block))	{	    blocks = tab->num_records /	    tab->is->types[tab->pos_type].nice_keys_block;	    if (tab->num_records %		tab->is->types[tab->pos_type].nice_keys_block)		blocks++;	    recsblock = tab->num_records / blocks;	    if (recsblock < 1)		recsblock = 1;	    mbufs = mblock->data;	    while ((mbp = mbuf_takehead(&mbufs, &recsblock,		is_keysize(tab->is))) && recsblock)	    {	    	if (mbufs)	    	{		    inew = xmalloc_mblock();		    inew->diskpos = -1;		    inew->state = IS_MBSTATE_DIRTY;		    inew->next = mblock->next;		    mblock->next = inew;		}	    	mblock->data = mbp;	    	mblock->num_records = recsblock;	    	last = mblock;	    	mblock = mblock->next;	    }	    next = mblock; 	}	else	    last = mblock;    }}/* * Reorganize data in blocks for minimum block usage and quick access. * Free surplus blocks. * is_p_align and is_p_remap are alternative functions which trade off * speed in updating versus optimum usage of disk blocks. */void is_p_remap(is_mtable *tab){    is_mbuf *mbufs, **bufpp, *mbp;    is_mblock *blockp, **blockpp;    int recsblock, blocks;    logf (LOG_DEBUG, "Remapping table.");    /* collect all data */    bufpp = &mbufs;    for (blockp = tab->data; blockp; blockp = blockp->next)    {    	if (blockp->state < IS_MBSTATE_CLEAN && is_m_read_full(tab, blockp) < 0)	{	    logf (LOG_FATAL, "Read-full failed in remap.");	    exit(1);	}    	*bufpp = blockp->data;    	while (*bufpp)	    bufpp = &(*bufpp)->next;        blockp->data = 0;    }    blocks = tab->num_records / tab->is->types[tab->pos_type].nice_keys_block;    if (tab->num_records % tab->is->types[tab->pos_type].nice_keys_block)    	blocks++;    if (blocks == 0)    	blocks = 1;    recsblock = tab->num_records / blocks + 1;    if (recsblock > tab->is->types[tab->pos_type].nice_keys_block)    	recsblock--;    blockpp = &tab->data;    while ((mbp = mbuf_takehead(&mbufs, &recsblock, is_keysize(tab->is))) &&    	recsblock)    {    	if (!*blockpp)    	{	    *blockpp = xmalloc_mblock();	    (*blockpp)->diskpos = -1;	}    	(*blockpp)->data = mbp;    	(*blockpp)->num_records = recsblock;    	(*blockpp)->state = IS_MBSTATE_DIRTY;    	blockpp = &(*blockpp)->next;    }    if (mbp)    	xfree_mbufs(mbp);    if (*blockpp)    {    	for (blockp = *blockpp; blockp; blockp = blockp->next)	    if (blockp->diskpos >= 0)		is_freestore_free(tab->is, tab->pos_type, blockp->diskpos);    	xfree_mblocks(*blockpp);    	*blockpp = 0;    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费高清在线观看| 亚洲电影视频在线| 91麻豆精品国产91久久久使用方法| 日韩精品电影一区亚洲| 欧美极品aⅴ影院| 91精品国产欧美一区二区| 成人精品鲁一区一区二区| 美女高潮久久久| 亚洲成人av一区| 亚洲女人****多毛耸耸8| 久久久亚洲午夜电影| 日韩小视频在线观看专区| 91国内精品野花午夜精品 | 久久久久久麻豆| 91国偷自产一区二区三区观看| 国产成人av一区二区| 麻豆成人综合网| 午夜国产精品一区| 亚洲va天堂va国产va久| 一区二区欧美精品| 亚洲精品欧美激情| 伊人婷婷欧美激情| 亚洲v日本v欧美v久久精品| 又紧又大又爽精品一区二区| 亚洲欧美在线aaa| 亚洲欧美日韩国产综合| 亚洲欧洲日韩在线| 国产精品第五页| 尤物av一区二区| 亚洲一区二区三区自拍| 亚洲国产精品久久久久婷婷884| 亚洲天堂成人在线观看| 一区二区三区精品久久久| 夜夜嗨av一区二区三区四季av | 亚洲欧洲另类国产综合| 国产精品高潮呻吟| 亚洲国产日日夜夜| 免费观看30秒视频久久| 国产精品羞羞答答xxdd| 国产91色综合久久免费分享| 91在线porny国产在线看| 欧美日韩在线精品一区二区三区激情 | 图片区小说区区亚洲影院| 婷婷久久综合九色综合伊人色| 久久99国产精品免费| 成人a免费在线看| 3751色影院一区二区三区| 精品人在线二区三区| 亚洲激情校园春色| 国产一区在线不卡| 欧美这里有精品| 中文字幕国产精品一区二区| 天使萌一区二区三区免费观看| 国产成人自拍高清视频在线免费播放| 色就色 综合激情| 国产亚洲欧美中文| 玖玖九九国产精品| 欧美日韩一区二区欧美激情| 久久久久久久久久看片| 一区二区三区中文字幕精品精品 | 国产欧美日韩亚州综合| 日韩精品乱码av一区二区| 97久久精品人人爽人人爽蜜臀| 日韩午夜精品视频| 久久精品国产久精国产| 欧美日韩黄视频| 亚洲a一区二区| 在线免费观看一区| 有码一区二区三区| 欧美自拍丝袜亚洲| 国产精品免费aⅴ片在线观看| 一区二区免费在线| 91免费在线视频观看| 4438x亚洲最大成人网| 国产拍揄自揄精品视频麻豆| 精品无人区卡一卡二卡三乱码免费卡 | 一区二区三区免费| 91免费小视频| 一区二区三区四区视频精品免费| 懂色av一区二区三区蜜臀| 亚洲国产高清不卡| 色综合久久久久| 亚洲午夜精品在线| 精品国产一区二区三区不卡 | 日本午夜精品视频在线观看 | 日韩欧美中文字幕精品| 久久99久久精品欧美| 久久在线免费观看| yourporn久久国产精品| 亚洲已满18点击进入久久| 欧美一区在线视频| 日韩午夜中文字幕| 成人性生交大片免费看中文网站| 国产精品免费久久| 欧美一区三区二区| 成人一区二区三区视频在线观看 | 国产成人午夜片在线观看高清观看| 中文字幕乱码一区二区免费| 欧美在线你懂的| 国产毛片一区二区| 日韩成人精品视频| 国产精品久久久久影院色老大 | 午夜日韩在线观看| 国产亚洲精品aa| 欧美电影免费观看高清完整版在线 | 亚洲福利视频导航| 国产香蕉久久精品综合网| 欧美电影一区二区| 色婷婷久久久久swag精品| 韩国精品一区二区| 日韩av一区二| 亚洲国产美女搞黄色| 中文字幕亚洲电影| 国产亚洲精品资源在线26u| 精品久久五月天| 欧美人xxxx| 欧美久久久一区| 欧美少妇xxx| 欧美亚洲国产怡红院影院| 成人福利视频在线看| 成人污视频在线观看| 粉嫩一区二区三区性色av| 国内成人自拍视频| 激情小说亚洲一区| 精品一区二区三区免费播放| 美脚の诱脚舐め脚责91| 日本高清免费不卡视频| 一本大道久久a久久综合| 成人h版在线观看| 色综合色狠狠综合色| 色综合天天综合给合国产| 91香蕉视频mp4| 欧美日韩一区二区三区高清| 欧美体内she精视频| 日韩一级免费观看| 国产亚洲欧美一级| 亚洲欧美日韩国产中文在线| 夜夜亚洲天天久久| 蜜臀久久99精品久久久久宅男| 精品一区二区三区在线视频| 国产精华液一区二区三区| 99久久99久久精品免费观看| 在线视频你懂得一区二区三区| 欧美精品 日韩| 国产婷婷一区二区| 亚洲大片一区二区三区| 久久精品国产亚洲一区二区三区| 国产高清在线观看免费不卡| 91麻豆免费视频| 欧美一区二区精品久久911| 国产三级欧美三级| 亚洲国产精品久久艾草纯爱| 激情五月婷婷综合网| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 色综合天天综合网国产成人综合天 | 欧美成人bangbros| 中文字幕一区二区三区精华液| 婷婷国产在线综合| 99在线精品观看| 欧美精品一区二区三区蜜臀 | 91黄色免费版| 国产精品理论在线观看| 欧美综合亚洲图片综合区| 久久久久久麻豆| 麻豆国产欧美一区二区三区| 91黄色小视频| 亚洲三级在线看| www.久久久久久久久| 国产欧美一区在线| 国产一区欧美一区| 日韩女优av电影| 精品无码三级在线观看视频| 欧美丰满美乳xxx高潮www| 性久久久久久久久久久久| 色综合网色综合| 亚洲激情av在线| 欧美视频一区二区| 午夜精品福利一区二区蜜股av| 欧美丝袜自拍制服另类| 亚洲一区二区三区视频在线播放| 色综合久久天天| 亚洲一区二区精品久久av| 欧美天堂一区二区三区| 日韩电影一区二区三区四区| 777午夜精品视频在线播放| 热久久国产精品| 久久久精品人体av艺术| av在线一区二区| 亚洲一区在线看| 91精品福利在线一区二区三区| 狠狠色丁香婷婷综合久久片| 精品国产一区二区国模嫣然| 成人免费va视频| 亚洲午夜一区二区三区| 日韩精品一区二区三区swag| 国产一区二区三区香蕉| 亚洲免费伊人电影| 欧美一区二区三区四区久久| 国产激情一区二区三区四区| 国产精品日日摸夜夜摸av|