在线文档教程
Sqlite
C界面 | C Interface

Initialize The SQLite Library

初始化SQLite库

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_initialize(),或者是在调用sqlite3_shutdown()后第一次调用sqlite3_initialize(),则调用sqlite3_initialize()是一个“effective”调用。只有有效的sqlite3_initialize()调用才会进行初始化。所有其他呼叫都是无害的无操作。

如果sqlite3_shutdown()调用自上次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的未来版本可能需要这样做。换一种说法,

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()调用。适用于sqlite3_os_init()和sqlite3_os_end()的实现在为Unix,Windows或OS/2编译时内置于SQLite中。当为其他平台构建时(使用SQLITE_OS_OTHER = 1编译时选项),应用程序必须为sqlite3_os_init()和sqlite3_os_end()提供合适的实现。应用程序提供的sqlite3_os_init()或sqlite3_os_end()实现必须在成功时返回SQLITE_OK,并在失败时返回一些其他错误代码。