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

📄 extkeys.c

📁 About: hamsterdb is a database engine written in ANSI C. It supports a B+Tree index structure, uses
💻 C
字号:
/** * Copyright (C) 2005-2007 Christoph Rupp (chris@crupp.de). * All rights reserved. See file LICENSE for licence and copyright * information. * */#include <string.h>#include <ham/hamsterdb.h>#include "extkeys.h"#include "db.h"#include "mem.h"#include "error.h"#include "cache.h"#define EXTKEY_CACHE_BUCKETSIZE         251#define EXTKEY_MAX_AGE                    5extkey_cache_t *extkey_cache_new(ham_db_t *db){    extkey_cache_t *c;    int memsize;    memsize=sizeof(extkey_cache_t)+EXTKEY_CACHE_BUCKETSIZE*sizeof(void *);    c=(extkey_cache_t *)ham_mem_alloc(db, memsize);    if (!c) {        db_set_error(db, HAM_OUT_OF_MEMORY);        return (0);    }    memset(c, 0, memsize);    extkey_cache_set_db(c, db);    extkey_cache_set_bucketsize(c, EXTKEY_CACHE_BUCKETSIZE);    return (c);}voidextkey_cache_destroy(extkey_cache_t *cache){    ham_size_t i;    extkey_t *e, *n;    ham_db_t *db=extkey_cache_get_db(cache);    /*     * make sure that all entries are empty     */    for (i=0; i<extkey_cache_get_bucketsize(cache); i++) {        e=extkey_cache_get_bucket(cache, i);        while (e) {#if HAM_DEBUG            /*             * make sure that the extkey-cache is empty - only for in-memory             * databases and DEBUG builds.             */            if (db_get_rt_flags(db)&HAM_IN_MEMORY_DB)                ham_assert(!"extkey-cache is not empty!", (""));#endif            n=extkey_get_next(e);            ham_mem_free(db, e);            e=n;        }    }    ham_mem_free(extkey_cache_get_db(cache), cache);}#define my_calc_hash(cache, o)                                              \    (extkey_cache_get_bucketsize(cache)==0                                  \        ? 0                                                                 \        : (((o)%(cache_get_bucketsize(cache)))))ham_status_textkey_cache_insert(extkey_cache_t *cache, ham_offset_t blobid,             ham_size_t size, const ham_u8_t *data){    ham_size_t h=(ham_size_t)my_calc_hash(cache, blobid);    extkey_t *e;    ham_db_t *db=extkey_cache_get_db(cache);    /*     * DEBUG build: make sure that the item is not inserted twice!     */#ifdef HAM_DEBUG    e=extkey_cache_get_bucket(cache, h);    while (e) {        ham_assert(extkey_get_blobid(e)!=blobid,                 ("extkey (blob id %llu) is already in the cache!",                 (unsigned long long)blobid));        e=extkey_get_next(e);    }#endif    e=(extkey_t *)ham_mem_alloc(db, SIZEOF_EXTKEY_T+size);    if (!e)        return (HAM_OUT_OF_MEMORY);    extkey_set_blobid(e, blobid);    extkey_set_txn_id(e, db_get_txn_id(db));    extkey_set_next(e, extkey_cache_get_bucket(cache, h));    extkey_set_size(e, size);    memcpy(extkey_get_data(e), data, size);    extkey_cache_set_bucket(cache, h, e);    extkey_cache_set_usedsize(cache, extkey_cache_get_usedsize(cache)+size);    return (0);}ham_status_textkey_cache_remove(extkey_cache_t *cache, ham_offset_t blobid){    ham_size_t h=(ham_size_t)my_calc_hash(cache, blobid);    extkey_t *e, *prev=0;    e=extkey_cache_get_bucket(cache, h);    while (e) {        if (extkey_get_blobid(e)==blobid)            break;        prev=e;        e=extkey_get_next(e);    }    if (!e)        return (HAM_KEY_NOT_FOUND);    if (prev)        extkey_set_next(prev, extkey_get_next(e));    else        extkey_cache_set_bucket(cache, h, extkey_get_next(e));    extkey_cache_set_usedsize(cache,             extkey_cache_get_usedsize(cache)-extkey_get_size(e));    ham_mem_free(extkey_cache_get_db(cache), e);    return (0);}ham_status_textkey_cache_fetch(extkey_cache_t *cache, ham_offset_t blobid,             ham_size_t *size, ham_u8_t **data){    ham_size_t h=(ham_size_t)my_calc_hash(cache, blobid);    extkey_t *e;    e=extkey_cache_get_bucket(cache, h);    while (e) {        if (extkey_get_blobid(e)==blobid)            break;        e=extkey_get_next(e);    }    if (!e)        return (HAM_KEY_NOT_FOUND);    *size=extkey_get_size(e);    *data=extkey_get_data(e);    extkey_set_txn_id(e, db_get_txn_id(extkey_cache_get_db(cache)));    return (0);}ham_status_textkey_cache_purge(extkey_cache_t *cache){    ham_size_t i;    extkey_t *e, *n;    ham_db_t *db=extkey_cache_get_db(cache);    /*     * delete all entries which are "too old" (were not      * used in the last EXTKEY_MAX_AGE transactions)     */    for (i=0; i<extkey_cache_get_bucketsize(cache); i++) {        extkey_t *p=0;        e=extkey_cache_get_bucket(cache, i);        while (e) {            n=extkey_get_next(e);            if (db_get_txn_id(db)-extkey_get_txn_id(e)>EXTKEY_MAX_AGE) {                /* deleted the head element of the list? */                if (!p)                    extkey_cache_set_bucket(cache, i, n);                else                    extkey_set_next(p, n);                ham_mem_free(db, e);            }            else                p=e;            e=n;        }    }    return (0);}

⌨️ 快捷键说明

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