SQLiteC/C++接口详细介绍之sqlite3类(二)

65 篇文章 1 订阅
62 篇文章 2 订阅

 快速跳转文章列表:SQLite—系列文章目录

上篇:SQLiteC/C++接口详细介绍之splite3类(一)

 下篇:SQLiteC/C++接口详细介绍之sqlite3类(二)

编写不易,有用的朋友点个赞或加粉一下万分感谢!300名内回关!

3.sqlite3类的成员函数sqlite3_autovacuum_pages函数

函数形式: 

int sqlite3_autovacuum_pages(
  sqlite3 *db,
  unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int),
  void*,
  void(*)(void*)
);
用于设置自动VACUUM时,保留的未使用页的最小数量。VACUUM是SQLite中的一个操作,用于减小由于删除和更新操作而产生的数据库文件大小。在执行VACUUM时,SQLite查询数据库中的所有对象,并将其重新组织为较小的部分,以减小文件大小并提高性能。当VACUUM完成时,空闲页被释放并添加到可用页面池中,以备后续使用。
sqlite3_autovacuum_pages函数的作用是设置自动执行VACUUM操作时保留的未使用页面的最小数目。VACUUM操作完成后,自动VACUUM机制可以确定保留多少页作为未使用页面,并用于后续的插入操作,以避免频繁的文件增长和收缩。SQLite通常不需要手动执行VACUUM操作,因为它会自动执行此操作。不过,如果需要手动执行VACUUM操作,可以使用该函数设置保留未使用页面的最小数量。

sqlite3_autovacuum_pages(D,C,P,X)接口注册了一个回调函数C,该函数在每次自动执行数据库文件的VACUUM操作之前被调用。回调函数被传递一个通用数据指针的副本(P),正在执行VACUUM操作的数据库附加的模式名称,数据库文件大小(以页为单位),免费页面数以及每个页面的字节数。回调函数应该返回应由自动VACUUM操作移除的免费页数。如果回调函数返回零,则不执行VACUUM操作。如果返回的值大于或等于空闲页面的数量,则进行完整的VACUUM操作。

如果多个已附加的数据库文件作为事务提交的一部分进行了修改,则自动VACUUM页面回调会针对每个文件分别调用。

回调函数不支持线程重入。回调函数不应尝试调用其他SQLite接口。如果这样做,可能会发生错误,包括分段错误和损坏的数据库文件。回调函数应该是一个简单的函数,对其输入参数进行一些算术操作并返回结果。

sqlite3_autovacuum_pages(D,C,P,X)中的X参数是P参数的可选析构函数。如果X不为NULL,则在数据库连接关闭或回调被其他sqlite3_autovacuum_pages()调用覆盖时,将调用X(P)。

每个数据库连接只有一个自动VACUUM页面回调。每次对sqlite3_autovacuum_pages()接口的调用都会覆盖该连接先前的所有调用。如果sqlite3_autovacuum_pages()的回调参数(C)是一个NULL指针,则自动VACUUM页面步骤回调会被取消。sqlite3_autovacuum_pages()的返回值通常为SQLITE_OK,但如果出现错误,则可能是其他错误代码。当前的实现只返回SQLITE_OK或SQLITE_MISUSE,但其他返回代码可能会在未来的版本中添加。

如果未指定自动VACUUM页面回调(通常情况)或为回调提供了NULL指针,那么默认行为是清理所有免费页面。因此,换句话说,默认行为与如果回调函数类似。

如果该函数传入参数NULL函数指针,默认回调一个空行为,而回调函数的需要如下样子才是准确的:

unsigned int demonstration_autovac_pages_callback(
      void *pClientData,
      const char *zSchema,
      unsigned int nDbPage,
      unsigned int nFreePage,
      unsigned int nBytePerPage
    ){
      return nFreePage;
    }

4、sqlite3类的成员函数:sqlite3_db_filename函数

函数类型:

sqlite3_filename sqlite3_db_filename(sqlite3 *db, const char *zDbName);

获取连接到给定数据库文件的数据库实例的文件名。这个文件名可以是一个相对路径、绝对路径或者是一个特殊的“:memory:”字符串,代表一个临时数据库文件。

这个函数需要两个参数:一个sqlite3实例指针和一个整型参数。这个整型参数指定了数据库实例是第几个数据库连接,如果指定为0,函数会返回主数据库实例的文件名。如果指定的连接不合法,函数会返回空指针。

在使用sqlite3_db_filename()函数时,需要传入一个指向sqlite3数据库实例的指针。该函数会返回以NULL结尾的字符串,它是该数据库实例的文件路径名的副本。这个字符串可能是一个以null结尾的UTF-8编码的字符串,而且是只读的。如果指定的连接号不合法,那么该函数将会返回一个空指针。注意,如果已经打开了一个临时数据库,则该函数返回“:memory:”,而不是一个路径名。

sqlite3_db_filename()函数提供了一种非常方便的方法,可以确定指定数据库连接的文件名。它对于需要大量访问SQLite数据库的应用程序来说非常有用,可以从数据库实例路径中提取数据,并执行预期的操作。该函数可用于调试,错误处理和其他应用程序中的许多场景,可以帮助确定有问题的数据库文件的位置。

sqlite3_db_filename(D,N)接口返回指向文件名的指针与连接D的数据库N关联。如果数据库上没有附加的数据库N连接D,或者如果数据库N是临时数据库或内存中数据库,则此函数将返回NULL指针或空字符串。此例程返回的字符串值由数据库连接。该值将一直有效,直到数据库N是DETACH或直到数据库连接关闭。此函数返回的文件名是VFS的xFullPathname方法。换句话说,文件名将是绝对路径名,即使使用的文件名也是如此打开数据库最初是URI或相对路径名。

如果返回指针不是NULL,则返回值可以为以下函数提供参数:

sqlite3_uri_parameter()
sqlite3_uri_boolean()
sqlite3_uri_int64()
sqlite3_filename_database()
sqlite3_filename_journal()
sqlite3_filename_wal()

5.sqlite3类的成员函数:sqlite3_get_table函数

函数类型:

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result);

 这是为向后兼容而保留的旧接口。不建议使用此接口。
定义:结果表是由sqlite3_get_table()接口创建的内存数据结构。结果表记录了完成一个或多个查询的查询结果。
从概念上讲,该表具有许多行和列。但这些数字不是结果表本身的一部分。这些数字是单独获得的。设N为行数M是列数。
结果表是指向以零结尾的UTF-8字符串的指针数组。数组中有(N+1)*M个元素。第一个M指针点转换为包含列名称的以零结尾的字符串。其余条目都指向查询结果。NULL值结果在NULL指针中。所有其他值都以UTF-8零结尾sqlite3_column_text()返回的字符串表示形式。
结果表可能由一个或多个内存分配组成。将结果表直接传递给sqlite3_free()是不安全的。应使用sqlite3_free_table()解除分配结果表。
作为结果表格式的示例,假设查询结果具体如下:
Name|Age
-----------------------
Alice   |43
Bob    |28
Cindy  |21
有两列(M==2)和三行(N==3)。因此,结果表有8个条目。假设结果表已存储在名为azResult的数组中。然后azResult保存以下内容:
azResult[0]="Name";
azResult[1]="Age";
azResult[2]="Alice";
azResult[3]="43";
azResult[4]="Bob";
azResult[5]="28";
azResult[6]="Cindy";
azResult[7]="21";
sqlite3_get_table()函数计算一个或多个以分号分隔的SQL语句,以零结尾的UTF-8string并返回结果表给在其第3个参数中给出的指针。
在应用程序完成sqlite3_get_table()的结果后,它必须将结果表指针传递给sqlite3_free_table()才能释放被错误分配的内存。由于sqlite3_malloc()在sqlite3_get_table()中发生的方式,调用函数不得尝试直接调用sqlite3_free()。只有sqlite3_free_table()能够正确安全地释放内存。
sqlite3_get_table()接口是作为sqlite3_exec()的包装器实现的。sqlite3_get_table()例程没有访问权限到SQLite的任何内部数据结构。它只使用公众此处定义的接口。因此,在内部sqlite3_exec()调用之外的包装层不是反映在对sqlite3_errcode()或sqlite3_errmsg()的后续调用中。

扩展:执行一个 SELECT 查询,并将结果存储在一个char**类型的二维数组中,该二维数组以NULL结尾。
函数执行SELECT查询语句并将结果存储在一个字符数组中,这个字符数组中包含了查询语句的所有结果,包括表头和每一行的数据。函数的使用必须通过sqlite3_free()函数来释放该函数返回指针指向的内存空间。
sqlite3_get_table()函数需要传递6个参数,它们分别是:数据库连接、需要执行的SQL语句、指向二维字符数组的指针、行数(包含表头)、列数(包含列名)和错误信息(两者都是输出参数)。其中,前三个参数是必须的,后三个参数是可选的。
sqlite3_get_table()函数可以方便地将执行结果返回到字符数组中,而无需使用sqlite3_step()循环来逐行获取结果。由于这个函数能够减少SQL查询的复杂性,因此对于需要执行简单SELECT查询的应用程序来说是非常有用的。但是当数据库中的数据量很大时,使用sqlite3_get_table()可能会导致内存泄漏和响应时间变慢。

参考文献:

1. C-language Interface Specification for SQLite官方说明文档

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坊垚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值