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()的调用是“有效”调用。只有有效调用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(),因此如果尚未初始化sqlite3_open(),则将在调用sqlite3_open()时自动初始化SQLite库。但是,如果使用SQLITE_OMIT_AUTOINIT编译SQLite 使用compile-time选项,则将省略对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编译时,sqlite3_os_init()和sqlite3_os_end()的适当实现已内置到SQLite中。当为其他平台构建时 (使用SQLITE_OS_OTHER = 1编译时选项),应用程序必须为sqlite3_os_init()和sqlite3_os_end()提供合适的实现。应用程序提供的sqlite3_os_init()或sqlite3_os_end()实现必须在成功时返回SQLITE_OK,并在其他情况下返回SQLITE_OK失败时显示错误代码。