SQlite資料庫的C編程介面(八)
工具函數(Utility Functions) by斜風細雨QQ:253786989 2012-02-10
SQLite還有一些比較有用的工具函數,雖然對於基本的資料庫任務可能不需要使用它們。
版本管理(Version Management)
(1)
const char *sqlite3_libversion(void);
以UTF-8編碼字串的形式,返回SQLite庫的版本。SQLite還定義了一個宏:SQLITE_VERSION,它的值也是代表SQLite庫版本的UTF-8編碼字串。
如:#define SQLITE_VERSION "3.7.10"
(2)
以一個整形數的形式,返回SQLite庫的版本,格式是MNNNPPP。M是主要版本號,對於SQLite3資料庫,M的值為3。N是次版本號碼,P代表發行點。
宏定義SQLITE_VERSION_NUMBER,與sqlite3_libversion_number函數功能相同。
如:#define SQLITE_VERSION_NUMBER 3007010
(3)
const char *sqlite3_sourceid(void);
返回一個字串指標,指向的字串中包含日期、時間戳記和一個SHA1雜湊值。宏定義SQLITE_SOURCE_ID的功能與該函數相同。
如:#define SQLITE_SOURCE_ID "2012-01-16 16:56:31 93aa17d866873e11dde5ffbefe74497f229977c1"
程式員可以利用上面的幾個函數和對應的宏定義來驗證SQLite庫的版本。宏定義來自標頭檔sqlite.h中,而函數調用擷取的版本號碼來自程式所連結的SQLite library中。
如:
if(SQLITE_VERSION_NUMBER > sqlite3_libversion_number()) { /* library too old; report error and exit. */}
在這段程式中,SQLITE_VERSION_NUMBER的值來自我們的客戶應用程式在編譯時間所使用的sqlite.h標頭檔中。而sqlite3_libversion_number()函數調用所返回的版本號碼,來自應用程式運行時所串連的library的版本。所以在我們的應用程式中,可以做如上代碼的比較,以判斷應用程式運行時,所串連的library是否比我們的應用程式編譯時間所使用的版本低,如果是則發出錯誤報表或者退出程式。
記憶體管理(Memory Management)
SQLite需要動態分配一塊記憶體時,它通常是調用底層作業系統預設的記憶體處理函數,使SQLite從應用程式堆中分配記憶體。然而,程式員可以通過sqlite3_config函數配置SQLite,使其進行自己的內部的記憶體管理。這對於嵌入式和手持終端等記憶體受限的裝置來說非常重要,資源過度分派記憶體會給系統穩定性帶來問題。
(1)
void *sqlite3_malloc(int);
分配一塊由參數指定的位元組大小的buffer,返回buffer指標。如果記憶體配置失敗,則返回NULL。所分配的記憶體總是8位元組(64位)對齊,該函數是c標準庫函數malloc的替代品。
(2)
void *sqlite3_realloc(void*, int);
該函數用於重新調整記憶體配置。第1個參數是由sqlite3_malloc函數返回的buffer指標,第2個參數是調整之後的buffer位元組大小。sqlite3_realloc函數將根據其第2個參數所指定的位元組大小,分配一塊新的buffer。然後將第1個參數所指向的舊buffer中的內容儘可能多的copy到新的buffer中。然後釋放舊buffer,並返回新buffer指標。如果新buffer分配失敗,將返回NULL,並且舊的buffer不會被釋放。
如果調用sqlite3_realloc函數時,給其第2個參數傳遞0或者負值,則該函數調用相當於調用sqlite3_free函數釋放記憶體。
sqlite3_realloc函數是c標準庫函數realloc的替代品。
(3)
void sqlite3_free(void*);
釋放由sqlite3_malloc函數或者sqlite3_realloc函數分配的記憶體。該函數是c標準庫函數free的替代品。
因為sqlite3_xxx版本的記憶體管理函數是在SQLite內部環境中進行操作,所以使用這些函數比使用作業系統底層的記憶體管理函數有更好的可移植性和可靠性。
SQlite資料庫的C編程介面(八)
工具函數(Utility Functions) by斜風細雨QQ:253786989 2012-02-10