设为首页 收藏本站
查看: 1258|回复: 0

[经验分享] SQlite数据库的C编程接口(八) 工具函数(Utility Functions) ——《Using SQlite》读书笔记

[复制链接]

尚未签到

发表于 2016-11-30 10:30:51 | 显示全部楼层 |阅读模式
  SQlite数据库的C编程接口(八)
工具函数(Utility Functions) by斜风细雨QQ:253786989 2012-02-10

  SQLite还有一些比较有用的工具函数,虽然对于基本的数据库任务可能不需要使用它们。
  版本管理(VersionManagement

  (1)


[cpp]
view plaincopyprint?





  • constchar*sqlite3_libversion(void);



const char *sqlite3_libversion(void);
  以UTF-8编码字符串的形式,返回SQLite库的版本。SQLite还定义了一个宏:SQLITE_VERSION,它的值也是代表SQLite库版本的UTF-8编码字符串。
  如:#define SQLITE_VERSION "3.7.10"
  (2)
  以一个整形数的形式,返回SQLite库的版本,格式是MNNNPPPM是主版本号,对于SQLite3数据库,M的值为3。N是次版本号,P代表发行点。
  宏定义SQLITE_VERSION_NUMBER,与sqlite3_libversion_number函数功能相同。
  如:#define SQLITE_VERSION_NUMBER 3007010


  (3)


[cpp]
view plaincopyprint?





  • constchar*sqlite3_sourceid(void);



const char *sqlite3_sourceid(void);
  返回一个字符串指针,指向的字符串中包含日期、时间戳和一个SHA1哈希值。宏定义SQLITE_SOURCE_ID的功能与该函数相同。
  如:#define SQLITE_SOURCE_ID "2012-01-16 16:56:31 93aa17d866873e11dde5ffbefe74497f229977c1"
  程序员可以利用上面的几个函数和对应的宏定义来验证SQLite库的版本。宏定义来自头文件sqlite.h中,而函数调用获取的版本号来自程序所链接的SQLitelibrary中。
  如:


[cpp]
view plaincopyprint?





  • if(SQLITE_VERSION_NUMBER>sqlite3_libversion_number()){

  • /*librarytooold;reporterrorandexit.*/
  • }



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)


[cpp]
view plaincopyprint?





  • void*sqlite3_malloc(int);



void *sqlite3_malloc(int);
  分配一块由参数指定的字节大小的buffer,返回buffer指针。如果内存分配失败,则返回NULL。所分配的内存总是8字节(64位)对齐,该函数是c标准库函数malloc的替代品。

  (2)


[cpp]
view plaincopyprint?





  • void*sqlite3_realloc(void*,int);



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)


[cpp]
view plaincopyprint?





  • voidsqlite3_free(void*);



void sqlite3_free(void*);
  释放由sqlite3_malloc函数或者sqlite3_realloc函数分配的内存。该函数是c标准库函数free的替代品。
  因为sqlite3_xxx版本的内存管理函数是在SQLite内部环境中进行操作,所以使用这些函数比使用操作系统底层的内存管理函数有更好的可移植性和可靠性。
  SQlite数据库的C编程接口(八)
工具函数(Utility Functions) by斜风细雨QQ:253786989 2012-02-10







  SQlite数据库的C编程接口(八)
工具函数(Utility Functions) by斜风细雨QQ:253786989 2012-02-10

  SQLite还有一些比较有用的工具函数,虽然对于基本的数据库任务可能不需要使用它们。
  版本管理(VersionManagement

  (1)


[cpp]
view plaincopyprint?





  • constchar*sqlite3_libversion(void);



const char *sqlite3_libversion(void);
  以UTF-8编码字符串的形式,返回SQLite库的版本。SQLite还定义了一个宏:SQLITE_VERSION,它的值也是代表SQLite库版本的UTF-8编码字符串。
  如:#define SQLITE_VERSION "3.7.10"
  (2)
  以一个整形数的形式,返回SQLite库的版本,格式是MNNNPPPM是主版本号,对于SQLite3数据库,M的值为3。N是次版本号,P代表发行点。
  宏定义SQLITE_VERSION_NUMBER,与sqlite3_libversion_number函数功能相同。
  如:#define SQLITE_VERSION_NUMBER 3007010


  (3)


[cpp]
view plaincopyprint?





  • constchar*sqlite3_sourceid(void);



const char *sqlite3_sourceid(void);
  返回一个字符串指针,指向的字符串中包含日期、时间戳和一个SHA1哈希值。宏定义SQLITE_SOURCE_ID的功能与该函数相同。
  如:#define SQLITE_SOURCE_ID "2012-01-16 16:56:31 93aa17d866873e11dde5ffbefe74497f229977c1"
  程序员可以利用上面的几个函数和对应的宏定义来验证SQLite库的版本。宏定义来自头文件sqlite.h中,而函数调用获取的版本号来自程序所链接的SQLitelibrary中。
  如:


[cpp]
view plaincopyprint?





  • if(SQLITE_VERSION_NUMBER>sqlite3_libversion_number()){

  • /*librarytooold;reporterrorandexit.*/
  • }



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)


[cpp]
view plaincopyprint?





  • void*sqlite3_malloc(int);



void *sqlite3_malloc(int);
  分配一块由参数指定的字节大小的buffer,返回buffer指针。如果内存分配失败,则返回NULL。所分配的内存总是8字节(64位)对齐,该函数是c标准库函数malloc的替代品。

  (2)


[cpp]
view plaincopyprint?





  • void*sqlite3_realloc(void*,int);



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)


[cpp]
view plaincopyprint?





  • voidsqlite3_free(void*);



void sqlite3_free(void*);
  释放由sqlite3_malloc函数或者sqlite3_realloc函数分配的内存。该函数是c标准库函数free的替代品。
  因为sqlite3_xxx版本的内存管理函数是在SQLite内部环境中进行操作,所以使用这些函数比使用操作系统底层的内存管理函数有更好的可移植性和可靠性。
  SQlite数据库的C编程接口(八)
工具函数(Utility Functions) by斜风细雨QQ:253786989 2012-02-10

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307609-1-1.html 上篇帖子: 【转】Android 中SQLite事务处理的简单例子 下篇帖子: android 数据库 sqlite数据类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表