X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=bfile%2Fcfile.h;h=a658987fc667fe69b18e90cbc425e519e9ea7d45;hp=8a55788e182b6aeea28a440a797234cf4aef69b5;hb=HEAD;hpb=614cde384b649a59922033c64db65409e45ab631 diff --git a/bfile/cfile.h b/bfile/cfile.h index 8a55788..a658987 100644 --- a/bfile/cfile.h +++ b/bfile/cfile.h @@ -1,40 +1,45 @@ -/* - * Copyright (C) 1995, Index Data I/S - * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: cfile.h,v $ - * Revision 1.5 1995-12-15 12:36:52 adam - * Moved hash file information to union. - * Renamed commit files. - * - * Revision 1.4 1995/12/11 09:03:54 adam - * New function: cf_unlink. - * New member of commit file head: state (0) deleted, (1) hash file. - * - * Revision 1.3 1995/12/01 16:24:29 adam - * Commit files use separate meta file area. - * - * Revision 1.2 1995/12/01 11:37:23 adam - * Cached/commit files implemented as meta-files. - * - * Revision 1.1 1995/11/30 08:33:12 adam - * Started work on commit facility. - * - */ +/* This file is part of the Zebra server. + Copyright (C) Index Data + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + #ifndef CFILE_H #define CFILE_H -#define HASH_BUCKET 63 +#include + +YAZ_BEGIN_CDECL + +/** \brief number of blocks in hash bucket */ +#define HASH_BUCKET 15 + +/** \brief CFile hash structure on disc */ +struct CFile_ph_bucket { + zint no[HASH_BUCKET]; /**< block number in original file */ + zint vno[HASH_BUCKET];/**< block number in shadow file */ + zint this_bucket; /**< this bucket number */ + zint next_bucket; /**< next bucket number */ +}; +/** \brief CFile hash structure info in memory */ struct CFile_hash_bucket { - struct CFile_ph_bucket { - int no[HASH_BUCKET]; - int vno[HASH_BUCKET]; - int this_bucket; - int next_bucket; - } ph; + struct CFile_ph_bucket ph; int dirty; struct CFile_hash_bucket *h_next, **h_prev; struct CFile_hash_bucket *lru_next, *lru_prev; @@ -42,37 +47,61 @@ struct CFile_hash_bucket { #define HASH_BSIZE sizeof(struct CFile_ph_bucket) +/** \brief state of CFile is a hash structure */ +#define CFILE_STATE_HASH 1 + +/** \brief state of CFile is a flat file file */ +#define CFILE_STATE_FLAT 2 + +/** \brief CFile file header */ +struct CFile_head { + int state; /**< CFILE_STATE_HASH, CFILE_STATE_FLAT, .. */ + zint next_block; /**< next free block / last block */ + int block_size; /**< mfile/bfile block size */ + int hash_size; /**< no of chains in hash table */ + zint first_bucket; /**< first hash bucket */ + zint next_bucket; /**< last hash bucket + 1 = first flat bucket */ + zint flat_bucket; /**< last flat bucket + 1 */ +}; + +/** \brief All in-memory information per CFile */ typedef struct CFile_struct { - struct CFile_head { - int state; - union { - struct { - int hash_size; - int next_bucket; - int next_block; - int block_size; - } hash; - } u; - } head; - MFile block_mf; - MFile hash_mf; - int *array; - struct CFile_hash_bucket **parray; - struct CFile_hash_bucket *bucket_lru_front, *bucket_lru_back; - int dirty; - int bucket_in_memory; - int max_bucket_in_memory; - char *iobuf; - MFile rmf; + struct CFile_head head; + + MFile block_mf; /**< block meta file */ + MFile hash_mf; /**< hash or index file (depending on state) */ + zint *array; /**< array for hash */ + struct CFile_hash_bucket **parray; /**< holds all hash bucket in memory */ + struct CFile_hash_bucket *bucket_lru_front; /**< LRU front for hash */ + struct CFile_hash_bucket *bucket_lru_back; /**< LRU back for hash */ + int dirty; /**< whether CFile is dirty / header must be rewritten */ + zint bucket_in_memory; /**< number of buckets in memory */ + zint max_bucket_in_memory; /**< max number of buckets in memory */ + char *iobuf; /**< data block .. of size block size */ + MFile rmf; /**< read meta file (original data / not dirty) */ + int no_hits; /**< number of bucket cache hits */ + int no_miss; /**< number of bucket cache misses */ + Zebra_mutex mutex; } *CFile; int cf_close (CFile cf); + CFile cf_open (MFile mf, MFile_area area, const char *fname, int block_size, int wflag, int *firstp); -int cf_read (CFile cf, int no, int offset, int num, void *buf); -int cf_write (CFile cf, int no, int offset, int num, const void *buf); -void cf_unlink (CFile cf); -void cf_commit (CFile cf); +int cf_read (CFile cf, zint no, int offset, int nbytes, void *buf); +int cf_write (CFile cf, zint no, int offset, int nbytes, const void *buf); +int cf_commit (CFile cf) ZEBRA_GCC_ATTR((warn_unused_result)); + +YAZ_END_CDECL #endif +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +