sqliteソース分析(一)
5221 ワード
まず、カタログ全体の構成を見てから、sqliteのデータ構造から見始めるつもりです.hash.hには2つのデータ構造が定義されています.Hash類は以下のメンバーを含みます.
struct Hash {
char keyClass; /* hash , 4 SQLITE_HASH_INT, _POINTER, _STRING, _BINARY */
char copyKey; /* , pointer 、binary */
int count; /* */
HashElem *first; /* */
void *(*xMalloc)(int); /* */
void (*xFree)(void *); /* */
int htsize; /* */
struct _ht { /* */
int count; /* */
HashElem *chain; /* */
} *ht;
};
このうちcopyKeyは、Hashelemクラスのキーポインタが深くコピーされる必要があるかどうかを判断します.Hashelem類には以下のメンバーが含まれています.struct HashElem {
HashElem *next, *prev; /* */
void *data; /* */
void *pKey; int nKey; /* pKey ,nKey */
};
この中でdataはメモリを動的に割り当てていません.単なるポインタです.hash.cは、関数の追加、検索、削除の他に、いくつかの比較関数、およびハッシュ関数を追加しました.static int binHash(const void *pKey, int nKey);
static int binCompare(const void *pKey1, int n1, const void *pKey2, int n2);
static int strHash(const void *pKey, int nKey);
static int strCompare(const void *pKey1, int n1, const void *pKey2, int n2);
static int ptrHash(const void *pKey, int nKey);
static int ptrCompare(const void *pKey1, int n1, const void *pKey2, int n2);
static int intHash(const void *pKey, int nKey);
static int intCompare(const void *pKey1, int n1, const void *pKey2, int n2);
これらの関数に加えて、Hashクラスのユーザーがどの関数を呼び出すかを考えずに、より良いパッケージを実現するために、2つの関数を使用することを保証しました.static int (*compareFunction(int keyClass))(const void*,int,const void*,int);// keyClass,
static int (*hashFunction(int keyClass))(const void*,int);// keyClass, hash
ここのhash構造は非常に簡潔で分かりやすく、より良いパッケージ性を実現しています.また、異なる種類のhash構造を宣言することなく、直接変数keyclassとvoid*を使ってこの問題を解決します.c+++で実装すれば、この問題は関数テンプレートで解決できるはずです.