sqlite数据库的C编程接口(八) 工具函数(Utility Functions) by斜风细雨QQ:253786989 2012-02-10
sqlite还有一些比较有用的工具函数,虽然对于基本的数据库任务可能不需要使用它们。
版本管理(VersionManagement)
(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中,而函数调用获取的版本号来自程序所链接的sqlitelibrary中。
如:
if(sqlITE_VERSION_NUMBER > sqlite3_libversion_number()) { /* library too old; report error and exit. */ }
在这段程序中,sqlITE_VERSION_NUMBER的值来自我们的客户应用程序在编译时所使用的sqlite.h头文件中。而sqlite3_libversion_number()函数调用所返回的版本号,来自应用程序运行时所连接的library的版本。所以在我们的应用程序中,可以做如上代码的比较,以判断应用程序运行时,所连接的library是否比我们的应用程序编译时所使用的版本低,如果是则发出错误报告或者退出程序。
内存管理(MemoryManagement)
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