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+++で実装すれば、この問題は関数テンプレートで解決できるはずです.