tokyo cabinet(以下简称TC)作为一个程序库,其中并没有main函数,那么我们该如何去开始代码阅读工作,这里的基本思路如下:
1. 首先明确TC中数据类型
2. 按照example的示例程序了解TC的运行过程。
TC中仅仅包含了8个头文件,各个头文件作用如下:
1. Md5.h 定义md5算法中需要使用的数据类型,和md5函数原型声明
2. Myconf.h 程序配置信息,通用头文件等
3. Tcadb.h 定义Abstract db类型,并声明相关操作函数
4. Tcbdb.h 定义B+ tree database类型,并声明相关操作函数
5. Tcfdb.h 定义fixed-length database类型,并声明相关操作函数
6. Tchdb.h 定义 Hash database类型,并声明相关操作函数
7. Tctdb.h 定义table database类型,并声明相关操作函数
8. Tcutil.h 定义tc中使用到的数据类型,例如TCLIST,TCXSTR等,并声明相关类型的操作函数。
1. 字符串TCXSTR
typedef struct { /* type of structure for an extensible string object */ char *ptr; /* pointer to the region */ int size; /* size of the region */ int asize; /* size of the allocated region */ } TCXSTR;
2. List类型 TCLIST
// Data type TCLIST // arr1, arr2, arr3 .................. arrN // [start ... start + num - 1 ] typedef struct { /* type of structure for an array list */ TCLISTDATUM *array; /* array of data */ int anum; /* number of the elements of the array */ int start; /* start index of used elements */ int num; /* number of used elements */ } TCLIST;
pointer list:
typedef struct { /* type of structure for a pointer list */ void **array; /* array of pointers */ int anum; /* number of the elements of the array */ int start; /* start index of used elements */ int num; /* number of used elements */ } TCPTRLIST;
typedef struct _TCMAPREC { /* type of structure for an element of a map */ int32_t ksiz; /* size of the region of the key */ int32_t vsiz; /* size of the region of the value */ struct _TCMAPREC *left; /* pointer to the left child */ struct _TCMAPREC *right; /* pointer to the right child */ struct _TCMAPREC *prev; /* pointer to the previous element */ struct _TCMAPREC *next; /* pointer to the next element */ } TCMAPREC; typedef struct { /* type of structure for a map */ TCMAPREC **buckets; /* bucket array */ TCMAPREC *first; /* pointer to the first element */ TCMAPREC *last; /* pointer to the last element */ TCMAPREC *cur; /* pointer to the current element */ uint32_t bnum; /* number of buckets */ uint64_t rnum; /* number of records */ uint64_t msiz; /* total size of records */ } TCMAP;4.ordered tree
typedef struct _TCTREEREC { /* type of structure for an element of a tree */ int32_t ksiz; /* size of the region of the key */ int32_t vsiz; /* size of the region of the value */ struct _TCTREEREC *left; /* pointer to the left child */ struct _TCTREEREC *right; /* pointer to the right child */ } TCTREEREC; typedef struct { /* type of structure for a tree */ TCTREEREC *root; /* pointer to the root element */ TCTREEREC *cur; /* pointer to the current element */ uint64_t rnum; /* number of records */ uint64_t msiz; /* total size of records */ TCCMP cmp; /* pointer to the comparison function */ void *cmpop; /* opaque object for the comparison function */ } TCTREE;
typedef struct { /* type of structure for a on-memory hash database */ void **mmtxs; /* mutexes for method */ void *imtx; /* mutex for iterator */ TCMAP **maps; /* internal map objects */ int iter; /* index of maps for the iterator */ } TCMDB;
typedef struct { /* type of structure for a on-memory tree database */ void *mmtx; /* mutex for method */ TCTREE *tree; /* internal tree object */ } TCNDB;
typedef struct { /* type of an element of memory pool */ void *ptr; /* pointer */ void (*del)(void *); /* deleting function */ } TCMPELEM; typedef struct { /* type of structure for a memory pool object */ void *mutex; /* mutex for operations */ TCMPELEM *elems; /* array of elements */ int anum; /* number of the elements of the array */ int num; /* number of used elements */ } TCMPOOL;
typedef struct { /* type of structure for a consistent hashing node */ uint32_t seq; /* sequential number */ uint32_t hash; /* hash value */ } TCCHIDXNODE; typedef struct { /* type of structure for a consistent hashing object */ TCCHIDXNODE *nodes; /* node array */ int nnum; /* number of the node array */ } TCCHIDX;
// Abstract database // TCADB = Tokyo Cabinet Abstract db typedef struct { /* type of structure for an abstract database */ int omode; /* open mode */ TCMDB *mdb; /* on-memory hash database object */ TCNDB *ndb; /* on-memory tree database object */ TCHDB *hdb; /* hash database object */ TCBDB *bdb; /* B+ tree database object */ TCFDB *fdb; /* fixed-length databae object */ TCTDB *tdb; /* table database object */ int64_t capnum; /* capacity number of records */ int64_t capsiz; /* capacity size of using memory */ uint32_t capcnt; /* count for capacity check */ BDBCUR *cur; /* cursor of B+ tree */ void *skel; /* skeleton database */ } TCADB;
// TCHDB = Tokyo Cabinet Hash database typedef struct { /* type of structure for a hash database */ void *mmtx; /* mutex for method */ void *rmtxs; /* mutexes for records */ void *dmtx; /* mutex for the while database */ void *wmtx; /* mutex for write ahead logging */ void *eckey; /* key for thread specific error code */ char *rpath; /* real path for locking */ uint8_t type; /* database type */ uint8_t flags; /* additional flags */ uint64_t bnum; /* number of the bucket array */ uint8_t apow; /* power of record alignment */ uint8_t fpow; /* power of free block pool number */ uint8_t opts; /* options */ char *path; /* path of the database file */ int fd; /* file descriptor of the database file */ uint32_t omode; /* open mode */ uint64_t rnum; /* number of the records */ uint64_t fsiz; /* size of the database file */ uint64_t frec; /* offset of the first record */ uint64_t dfcur; /* offset of the cursor for defragmentation */ uint64_t iter; /* offset of the iterator */ char *map; /* pointer to the mapped memory */ uint64_t msiz; /* size of the mapped memory */ uint64_t xmsiz; /* size of the extra mapped memory */ uint64_t xfsiz; /* extra size of the file for mapped memory */ uint32_t *ba32; /* 32-bit bucket array */ uint64_t *ba64; /* 64-bit bucket array */ uint32_t align; /* record alignment */ uint32_t runit; /* record reading unit */ bool zmode; /* whether compression is used */ int32_t fbpmax; /* maximum number of the free block pool */ void *fbpool; /* free block pool */ int32_t fbpnum; /* number of the free block pool */ int32_t fbpmis; /* number of missing retrieval of the free block pool */ bool async; /* whether asynchronous storing is called */ TCXSTR *drpool; /* delayed record pool */ TCXSTR *drpdef; /* deferred records of the delayed record pool */ uint64_t drpoff; /* offset of the delayed record pool */ TCMDB *recc; /* cache for records */ uint32_t rcnum; /* maximum number of cached records */ TCCODEC enc; /* pointer to the encoding function */ void *encop; /* opaque object for the encoding functions */ TCCODEC dec; /* pointer to the decoding function */ void *decop; /* opaque object for the decoding functions */ int ecode; /* last happened error code */ bool fatal; /* whether a fatal error occured */ uint64_t inode; /* inode number */ time_t mtime; /* modification time */ uint32_t dfunit; /* unit step number of auto defragmentation */ uint32_t dfcnt; /* counter of auto defragmentation */ bool tran; /* whether in the transaction */ int walfd; /* file descriptor of write ahead logging */ uint64_t walend; /* end offset of write ahead logging */ int dbgfd; /* file descriptor for debugging */ volatile int64_t cnt_writerec; /* tesing counter for record write times */ volatile int64_t cnt_reuserec; /* tesing counter for record reuse times */ volatile int64_t cnt_moverec; /* tesing counter for record move times */ volatile int64_t cnt_readrec; /* tesing counter for record read times */ volatile int64_t cnt_searchfbp; /* tesing counter for FBP search times */ volatile int64_t cnt_insertfbp; /* tesing counter for FBP insert times */ volatile int64_t cnt_splicefbp; /* tesing counter for FBP splice times */ volatile int64_t cnt_dividefbp; /* tesing counter for FBP divide times */ volatile int64_t cnt_mergefbp; /* tesing counter for FBP merge times */ volatile int64_t cnt_reducefbp; /* tesing counter for FBP reduce times */ volatile int64_t cnt_appenddrp; /* tesing counter for DRP append times */ volatile int64_t cnt_deferdrp; /* tesing counter for DRP defer times */ volatile int64_t cnt_flushdrp; /* tesing counter for DRP flush times */ volatile int64_t cnt_adjrecc; /* tesing counter for record cache adjust times */ volatile int64_t cnt_defrag; /* tesing counter for defragmentation times */ volatile int64_t cnt_shiftrec; /* tesing counter for record shift times */ volatile int64_t cnt_trunc; /* tesing counter for truncation times */ } TCHDB;
// B+ tree database // TCBDB = Tokyo Cabinet B+ database typedef struct { /* type of structure for a B+ tree database */ void *mmtx; /* mutex for method */ void *cmtx; /* mutex for cache */ TCHDB *hdb; /* internal database object */ char *opaque; /* opaque buffer */ bool open; /* whether the internal database is opened */ bool wmode; /* whether to be writable */ uint32_t lmemb; /* number of members in each leaf */ uint32_t nmemb; /* number of members in each node */ uint8_t opts; /* options */ uint64_t root; /* ID number of the root page */ uint64_t first; /* ID number of the first leaf */ uint64_t last; /* ID number of the last leaf */ uint64_t lnum; /* number of leaves */ uint64_t nnum; /* number of nodes */ uint64_t rnum; /* number of records */ TCMAP *leafc; /* cache for leaves */ TCMAP *nodec; /* cache for nodes */ TCCMP cmp; /* pointer to the comparison function */ void *cmpop; /* opaque object for the comparison function */ uint32_t lcnum; /* maximum number of cached leaves */ uint32_t ncnum; /* maximum number of cached nodes */ uint32_t lsmax; /* maximum size of each leaf */ uint32_t lschk; /* counter for leaf size checking */ uint64_t capnum; /* capacity number of records */ uint64_t *hist; /* history array of visited nodes */ int hnum; /* number of element of the history array */ volatile uint64_t hleaf; /* ID number of the leaf referred by the history */ volatile uint64_t lleaf; /* ID number of the last visited leaf */ bool tran; /* whether in the transaction */ char *rbopaque; /* opaque for rollback */ volatile uint64_t clock; /* logical clock */ volatile int64_t cnt_saveleaf; /* tesing counter for leaf save times */ volatile int64_t cnt_loadleaf; /* tesing counter for leaf load times */ volatile int64_t cnt_killleaf; /* tesing counter for leaf kill times */ volatile int64_t cnt_adjleafc; /* tesing counter for node cache adjust times */ volatile int64_t cnt_savenode; /* tesing counter for node save times */ volatile int64_t cnt_loadnode; /* tesing counter for node load times */ volatile int64_t cnt_adjnodec; /* tesing counter for node cache adjust times */ } TCBDB;