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

📄 merge.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
                                           &i_mode);                /* is next input item the same as current except                   for the delete flag? */                cmp = (*is->method->compare_item)(i_item, f_item);                if (!cmp && i_mode)   /* delete/insert nop? */                {                    /* yes! insert as if it was an insert only */                    memcpy (r_item, i_item, i_item_ptr - i_item);                    i_item_ptr = i_item;                    i_more = (*data->read_item)(data->clientData, &i_item_ptr,                                                &i_mode);                }                else                {                    /* no! delete the item */                    r_item = NULL;		    last_dirty = 1;                    mb[ptr].dirty = 2;                }            }            else            {                memcpy (r_item, f_item, f_item_ptr - f_item);                /* move i */                i_item_ptr = i_item;                i_more = (*data->read_item)(data->clientData, &i_item_ptr,                                           &i_mode);            }            /* move f */            f_item_ptr = f_item;            f_more = isc_read_item (pp, &f_item_ptr);        }        else if (cmp > 0)               /* insert f */        {            memcpy (r_item, f_item, f_item_ptr - f_item);            /* move f */            f_item_ptr = f_item;            f_more = isc_read_item (pp, &f_item_ptr);        }        else                            /* insert i */        {            if (!i_mode)                /* delete item which isn't there? */            {                logf (LOG_FATAL, "Inconsistent register at offset %d",                                 r_offset);                abort ();            }            memcpy (r_item, i_item, i_item_ptr - i_item);            mb[ptr].dirty = 2;	    last_dirty = 1;            /* move i */            i_item_ptr = i_item;            i_more = (*data->read_item)(data->clientData, &i_item_ptr,                                        &i_mode);        }        if (r_item)  /* insert resulting item? */        {            char *r_out_ptr = r_buf + r_offset;            int new_offset;            (*is->method->code_item)(ISAMC_ENCODE, r_clientData,                                     &r_out_ptr, &r_item);            new_offset = r_out_ptr - r_buf;             numKeys++;            if (border < new_offset && border >= r_offset)            {                if (debug > 2)                    logf (LOG_LOG, "isc: border %d %d", ptr, border);                /* Max size of current block category reached ...                   make new virtual block entry */                mb[++ptr].block = 0;                mb[ptr].dirty = 1;                mb[ptr].offset = r_offset;                if (cat == is->max_cat && ptr >= is->method->max_blocks_mem)                {                    /* We are dealing with block(s) of max size. Block(s)                       except one will be flushed. Note: the block(s) are                       surely not the last one(s).                     */                    if (debug > 2)                        logf (LOG_LOG, "isc: flush B %d sections", ptr-1);                    flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat,                                  0, &pp->numKeys);                    mb[0].block = mb[ptr-1].block;                    mb[0].dirty = mb[ptr-1].dirty;                    memcpy (r_buf, r_buf + mb[ptr-1].offset,                            mb[ptr].offset - mb[ptr-1].offset);                    mb[0].offset = 0;                    mb[1].block = mb[ptr].block;                    mb[1].dirty = mb[0].dirty;                    mb[1].offset = mb[ptr].offset - mb[ptr-1].offset;                    memcpy (r_buf + mb[1].offset, r_buf + r_offset,                            new_offset - r_offset);                    new_offset = (new_offset - r_offset) + mb[1].offset;                    ptr = 1;                }                border = get_border (is, mb, ptr, cat, firstpos);            }            r_offset = new_offset;        }        if (cat < is->max_cat && ptr >= is->method->filecat[cat].mblocks)        {            /* Max number blocks in current category reached ->               must switch to next category (with larger block size)             */            int j = 0;            (is->files[cat].no_remap)++;            /* delete all original block(s) read so far */            for (i = 0; i < ptr; i++)                if (mb[i].block)                    isc_release_block (is, pp->cat, mb[i].block);            /* also delete all block to be read in the future */            pp->deleteFlag = 1;            /* remap block offsets */            assert (mb[j].offset == 0);            cat++;            mb[j].dirty = 1;            mb[j].block = 0;	    mb[ptr].offset = r_offset;            for (i = 1; i < ptr; i++)            {                int border = is->method->filecat[cat].ifill -                         ISAMC_BLOCK_OFFSET_1 + mb[j].offset;                if (debug > 3)                    logf (LOG_LOG, "isc: remap %d border=%d", i, border);                if (mb[i+1].offset > border && mb[i].offset <= border)                {                    if (debug > 3)                        logf (LOG_LOG, "isc:  to %d %d", j, mb[i].offset);                    mb[++j].dirty = 1;                    mb[j].block = 0;                    mb[j].offset = mb[i].offset;                }            }            if (debug > 2)                logf (LOG_LOG, "isc: remap from %d to %d sections to cat %d",                      ptr, j, cat);            ptr = j;            border = get_border (is, mb, ptr, cat, firstpos);	    if (debug > 3)		logf (LOG_LOG, "isc: border=%d r_offset=%d", border, r_offset);        }    }    if (mb[ptr].offset < r_offset)    {   /* make the final boundary offset */        mb[++ptr].dirty = 1;         mb[ptr].block = 0;         mb[ptr].offset = r_offset;    }    else    {   /* empty output. Release last block if any */        if (cat == pp->cat && mb[ptr].block)        {            if (debug > 3)                logf (LOG_LOG, "isc: release C");            isc_release_block (is, pp->cat, mb[ptr].block);            mb[ptr].block = 0;	    if (ptr > 0)		mb[ptr-1].dirty = 1;        }    }    if (debug > 2)        logf (LOG_LOG, "isc: flush C, %d sections", ptr);    if (firstpos)    {        /* we have to patch initial block with num keys if that           has changed */        if (numKeys != isc_pp_num (pp))        {            if (debug > 2)                logf (LOG_LOG, "isc: patch num keys firstpos=%d num=%d",                                firstpos, numKeys);            bf_write (is->files[cat].bf, firstpos, ISAMC_BLOCK_OFFSET_N,                      sizeof(numKeys), &numKeys);        }    }    else if (ptr > 0)    {   /* we haven't flushed initial block yet and there surely are some           blocks to flush. Make first block dirty if numKeys differ */        if (numKeys != isc_pp_num (pp))            mb[0].dirty = 1;    }    /* flush rest of block(s) in r_buf */    flush_blocks (is, mb, ptr, r_buf, &firstpos, cat, 1, &numKeys);    (*is->method->code_stop)(ISAMC_ENCODE, r_clientData);    if (!firstpos)        cat = 0;    if (debug > 1)        logf (LOG_LOG, "isc: isc_merge return %d %d", cat, firstpos);    isc_pp_close (pp);    return cat + firstpos * 8;}/* * $Log: merge.c,v $ * Revision 1.23  2003/06/23 15:36:11  adam * Implemented isamb_unlink. * * Revision 1.22  2003/03/05 16:41:10  adam * Fix GCC warnings * * Revision 1.21  2002/08/02 19:26:56  adam * Towards GPL * * Revision 1.20  1999/11/30 13:48:04  adam * Improved installation. Updated for inclusion of YAZ header files. * * Revision 1.19  1999/07/14 12:12:07  heikki * Large-block isam-h  (may not work too well... Abandoning for isam-d) * * Revision 1.17  1999/07/13 14:22:17  heikki * Better allocation strategy in isamh_merge * * Revision 1.16  1999/07/08 14:23:27  heikki * Fixed a bug in isamh_pp_read and cleaned up a bit * * Revision 1.15  1999/07/07 09:36:04  heikki * Fixed an assertion in isamh * * Revision 1.13  1999/07/06 09:37:05  heikki * Working on isamh - not ready yet. * * Revision 1.12  1999/06/30 15:03:55  heikki * first take on isamh, the append-only isam structure * * Revision 1.11  1999/05/26 07:49:14  adam * C++ compilation. * * Revision 1.10  1998/03/19 12:22:09  adam * Minor change. * * Revision 1.9  1998/03/19 10:04:38  adam * Minor changes. * * Revision 1.8  1998/03/18 09:23:55  adam * Blocks are stored in chunks on free list - up to factor 2 in speed. * Fixed bug that could occur in block category rearrangemen. * * Revision 1.7  1998/03/11 11:18:18  adam * Changed the isc_merge to take into account the mfill (minimum-fill). * * Revision 1.6  1998/03/06 13:54:03  adam * Fixed two nasty bugs in isc_merge. * * Revision 1.5  1997/02/12 20:42:43  adam * Bug fix: during isc_merge operations, some pages weren't marked dirty * even though they should be. At this point the merge operation marks * a page dirty if the previous page changed at all. A better approach is * to mark it dirty if the last key written changed in previous page. * * Revision 1.4  1996/11/08 11:15:31  adam * Number of keys in chain are stored in first block and the function * to retrieve this information, isc_pp_num is implemented. * * Revision 1.3  1996/11/04 14:08:59  adam * Optimized free block usage. * * Revision 1.2  1996/11/01 13:36:46  adam * New element, max_blocks_mem, that control how many blocks of max size * to store in memory during isc_merge. * Function isc_merge now ignores delete/update of identical keys and * the proper blocks are then non-dirty and not written in flush_blocks. * * Revision 1.1  1996/11/01  08:59:15  adam * First version of isc_merge that supports update/delete. * */

⌨️ 快捷键说明

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