int sqlite3_initialize(void); int sqlite3_shutdown(void); int sqlite3_os_init(void); int sqlite3_os_end(void);
sqlite3_initialize() 函数初始化 SQLite 库。sqlite3_shutdown() 函数释放 sqlite3_initialize() 分配的任何资源。这些函数旨在帮助嵌入式系统进行进程初始化和关闭。使用 SQLite 的工作站应用程序通常不需要调用这两个函数。
如果 sqlite3_initialize() 在进程生命周期中第一次被调用,或者是在调用 sqlite3_shutdown() 之后第一次被调用,则对 sqlite3_initialize() 的调用是“有效”调用。只有有效的 sqlite3_initialize() 调用才会执行初始化操作。所有其他调用都是无害的空操作。
如果自上次 sqlite3_initialize() 调用以来,它是对 sqlite3_shutdown() 的第一次调用,则对 sqlite3_shutdown() 的调用是“有效”调用。只有有效的 sqlite3_shutdown() 调用才会执行任何反初始化操作。所有其他有效的 sqlite3_shutdown() 调用都是无害的空操作。
sqlite3_initialize() 接口是线程安全的,但 sqlite3_shutdown() 不是。sqlite3_shutdown() 接口只能从单个线程调用。在调用 sqlite3_shutdown() 之前,必须关闭所有打开的数据库连接,并且必须释放所有其他 SQLite 资源。
除其他事项外,sqlite3_initialize() 将调用 sqlite3_os_init()。类似地,sqlite3_shutdown() 将调用 sqlite3_os_end()。
sqlite3_initialize() 函数在成功时返回SQLITE_OK。如果由于某种原因,sqlite3_initialize() 无法初始化库(也许它无法分配所需的资源,例如互斥量),则它会返回错误代码,而不是SQLITE_OK。
sqlite3_initialize() 函数由许多其他 SQLite 接口内部调用,因此应用程序通常不需要直接调用 sqlite3_initialize()。例如,sqlite3_open() 调用 sqlite3_initialize(),以便如果 SQLite 库尚未初始化,则在调用sqlite3_open() 时会自动初始化。但是,如果 SQLite 使用SQLITE_OMIT_AUTOINIT编译时选项进行编译,则会省略对 sqlite3_initialize() 的自动调用,并且应用程序必须在使用任何其他 SQLite 接口之前直接调用 sqlite3_initialize()。为了获得最大的可移植性,建议应用程序在使用任何其他 SQLite 接口之前始终直接调用 sqlite3_initialize()。SQLite 的未来版本可能需要这样做。换句话说,当 SQLite 使用SQLITE_OMIT_AUTOINIT编译时,所表现出的行为可能会在 SQLite 的某个未来版本中成为默认行为。
sqlite3_os_init() 函数执行 SQLite 库的操作系统特定初始化。sqlite3_os_end() 函数撤消 sqlite3_os_init() 的效果。这些函数通常执行的任务包括分配或释放静态资源、初始化全局变量、设置默认sqlite3_vfs模块或使用sqlite3_config()设置默认配置。
应用程序永远不应该直接调用 sqlite3_os_init() 或 sqlite3_os_end()。应用程序只能调用 sqlite3_initialize() 和 sqlite3_shutdown()。sqlite3_os_init() 接口由 sqlite3_initialize() 自动调用,sqlite3_os_end() 由 sqlite3_shutdown() 调用。当 SQLite 为 Unix、Windows 或 OS/2 编译时,SQLite 中内置了 sqlite3_os_init() 和 sqlite3_os_end() 的适当实现。当为其他平台构建(使用SQLITE_OS_OTHER=1编译时选项)时,应用程序必须为 sqlite3_os_init() 和 sqlite3_os_end() 提供合适的实现。应用程序提供的 sqlite3_os_init() 或 sqlite3_os_end() 实现必须在成功时返回SQLITE_OK,并在失败时返回其他错误代码。