4个版本
| 0.1.3 | 2022年12月14日 |
|---|---|
| 0.1.2 | 2022年12月14日 |
| 0.1.1 | 2022年12月14日 |
| 0.1.0 | 2022年12月14日 |
#2019 in 数据库接口
690KB
17K SLoC
sqlite3_ext
在Rust中创建SQLite可加载扩展。API的设计理念是渐进式增强:所有使用SQLite功能的调用都返回一个Result,当宿主版本的SQLite不支持所询问的功能时,返回Err。
早期版本警告
这个crate是预1.0版本,API允许自由更改。特别是,如果发现一个安全API是不安全的,它将被更改。一旦crate达到1.0版本,API将受到语义版本控制。
作为一个预1.0版本、年轻的crate,可能存在尚未发现的bug。crate附带了一个适度覆盖所有功能(目前超过100个测试)的测试套件。
Crate文档适度覆盖,仓库中有示例扩展可以作为指南。还可以查看根目录下的“test”文件夹中的集成测试。
功能
- 类似于Rusqlite的查询接口。
- 应用程序定义的标量和聚合函数,以及排序序列。
- 比其他任何已发布的Rust crate更全面的虚拟表实现,支持所有SQLite虚拟表方法。
- 支持SQLite最新的功能,最高到版本3.38.5。
crate功能
static- 这个crate的消费者不是一个SQLite可加载扩展。SQLite API将由链接器提供。为了避免链接错误,sqlite3_ext禁用了3.6.8之后添加的所有API。static_modern- 与static相同,但sqlite3_ext不会禁用任何API。如果链接的SQLite版本低于sqlite3_ext支持的版本,这将导致链接错误。bundled- 与static_modern相同,但使用从libsqlite3-sys捆绑的SQLite版本(而不是系统版本)。这是为Rust程序构建静态可加载扩展的推荐方式。with_rusqlite- 添加了对将静态链接的扩展注册到Rusqlite连接对象的支持。请参阅此测试的示例。
编译模式
sqlite3_ext支持三种编译模式
- 作为一个可加载的扩展。您的crate类型为
crate-type = [ "cdylib" ],并作为SQLite的可加载扩展被加载到另一个进程中。- SQLite方法在运行时由SQLite提供。
- 作为一个静态链接的扩展。您的crate类型为
crate-type = [ "staticlib" ],并将其静态链接到另一个程序中。- 链接器提供SQLite方法。
- 作为一个Rust库。您的crate具有任何类型,并像其他crate一样使用sqlite3_ext。
- 您负责提供SQLite(例如通过Rusqlite)。
crate配置
- 默认情况下,crate被配置为动态加载SQLite。
- 使用功能
static,crate能够静态链接到Rust或C程序。这非常兼容,但会禁用许多SQLite功能。 - 使用功能
static_modern,crate能够静态链接到Rust或C程序。这要求系统的SQLite版本至少与sqlite3_ext支持的版本相同,否则将出现链接错误。
测试配置
使用现代SQLite运行的测试
Cargo.toml中所有具有crate功能static的测试。Cargo.toml中所有具有crate功能static_modern的测试。
待办事项
- 针对SQLite 3.6.8运行测试。
支持接口
以下是一个兼容性图表,显示sqlite3_ext目前覆盖了SQLite API的哪些部分。图标
- ✅ - 此API通过sqlite3_ext中的API完全公开
- ❕ - 此API通过unsafe ffi提供,但sqlite3_ext中没有计划为它创建API。
| 接口 | 对象 | 状态 | 详情 |
|---|---|---|---|
| sqlite3_aggregate_context | sqlite3_context | ✅ | 支持任意结构体 |
| sqlite3_auto_extension | - | ✅ | Extension::register_auto |
| sqlite3_autovacuum_pages | |||
| sqlite3_backup_finish | |||
| sqlite3_backup_init | |||
| sqlite3_backup_pagecount | |||
| sqlite3_backup_remaining | |||
| sqlite3_backup_step | |||
| sqlite3_bind_blob | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_blob64 | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_double | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_int | sqlite3_stmt | ❕ | 不必要的 |
| sqlite3_bind_int64 | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_null | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_parameter_count | sqlite3_stmt | ✅ | Statement::parameter_count |
| sqlite3_bind_parameter_index | sqlite3_stmt | ✅ | Statement::parameter_position |
| sqlite3_bind_parameter_name | sqlite3_stmt | ✅ | Statement::parameter_name |
| sqlite3_bind_pointer | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_text | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_text16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_bind_text64 | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_value | sqlite3_stmt | ✅ | ToParam |
| sqlite3_bind_zeroblob | sqlite3_stmt | ||
| sqlite3_bind_zeroblob64 | sqlite3_stmt | ||
| sqlite3_blob_bytes | |||
| sqlite3_blob_close | |||
| sqlite3_blob_open | |||
| sqlite3_blob_read | |||
| sqlite3_blob_reopen | |||
| sqlite3_blob_write | |||
| sqlite3_busy_handler | |||
| sqlite3_busy_timeout | |||
| sqlite3_cancel_auto_extension | - | ✅ | Extension::cancel_auto |
| sqlite3_changes | ✅ | Statement::execute | |
| sqlite3_changes64 | ✅ | Statement::execute | |
| sqlite3_clear_bindings | sqlite3_stmt | ❕ | 不必要的 |
| sqlite3_close | |||
| sqlite3_close_v2 | |||
| sqlite3_collation_needed | sqlite3 | ✅ | Connection::set_collation_needed_func |
| sqlite3_collation_needed16 | sqlite3 | ❕ | 使用UTF-8等效 |
| sqlite3_column_blob | sqlite3_stmt | ✅ | Column::get_blob |
| sqlite3_column_bytes | sqlite3_stmt | ❕ | 不必要的 |
| sqlite3_column_bytes16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_count | sqlite3_stmt | ✅ | Statement::column_count |
| sqlite3_column_database_name | sqlite3_stmt | ✅ | Column::database_name |
| sqlite3_column_database_name16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_decltype | sqlite3_stmt | ✅ | Column::decltype |
| sqlite3_column_decltype16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_double | sqlite3_stmt | ✅ | 列::get_f64 |
| sqlite3_column_int | sqlite3_stmt | ✅ | 列::get_i32 |
| sqlite3_column_int64 | sqlite3_stmt | ✅ | 列::get_i64 |
| sqlite3_column_name | sqlite3_stmt | ✅ | 列::name |
| sqlite3_column_name16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_origin_name | sqlite3_stmt | ✅ | 列::origin_name |
| sqlite3_column_origin_name16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_table_name | sqlite3_stmt | ✅ | 列::table_name |
| sqlite3_column_table_name16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_text | sqlite3_stmt | ✅ | 列::get_str |
| sqlite3_column_text16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_column_type | sqlite3_stmt | ✅ | 列::value_type |
| sqlite3_column_value | sqlite3_stmt | ✅ | 列::as_ref |
| sqlite3_commit_hook | sqlite3 | ||
| sqlite3_compileoption_get | |||
| sqlite3_compileoption_used | |||
| sqlite3_complete | |||
| sqlite3_complete16 | ❕ | 使用UTF-8等效 | |
| sqlite3_config | |||
| sqlite3_context_db_handle | sqlite3_context | ✅ | 上下文::db |
| sqlite3_create_collation | sqlite3 | ✅ | 连接::create_collation |
| sqlite3_create_collation16 | sqlite3 | ❕ | 使用UTF-8等效 |
| sqlite3_create_collation_v2 | sqlite3 | ✅ | 连接::create_collation |
| sqlite3_create_filename | |||
| sqlite3_create_function | sqlite3 | ✅ | 连接::create_scalar_function |
| sqlite3_create_function16 | sqlite3 | ❕ | 使用UTF-8等效 |
| sqlite3_create_function_v2 | sqlite3 | ✅ | 连接::create_scalar_function |
| sqlite3_create_module | sqlite3 | ✅ | 连接::create_module |
| sqlite3_create_module_v2 | sqlite3 | ✅ | 连接::create_module |
| sqlite3_create_window_function | sqlite3 | ✅ | 连接::create_aggregate_function |
| sqlite3_data_count | sqlite3_stmt | ||
| sqlite3_database_file_object | |||
| sqlite3_db_cacheflush | |||
| sqlite3_db_config | |||
| sqlite3_db_filename | |||
| sqlite3_db_handle | sqlite3_stmt | ✅ | 语句::db |
| sqlite3_db_mutex | sqlite3 | ✅ | 连接::lock |
| sqlite3_db_readonly | |||
| sqlite3_db_release_memory | |||
| sqlite3_db_status | |||
| sqlite3_declare_vtab | ✅ | VTab::connect | |
| sqlite3_deserialize | |||
| sqlite3_drop_modules | |||
| sqlite3_enable_load_extension | sqlite3 | ❕ | 通过 ffi 可用 |
| sqlite3_enable_shared_cache | |||
| sqlite3_errcode | sqlite3 | ||
| sqlite3_errmsg | sqlite3 | ||
| sqlite3_errmsg16 | sqlite3 | ❕ | 使用UTF-8等效 |
| sqlite3_error_offset | sqlite3 | ||
| sqlite3_errstr | - | ✅ | 错误::fmt |
| sqlite3_exec | sqlite3 | ❕ | 不必要的 |
| sqlite3_expanded_sql | sqlite3_stmt | ||
| sqlite3_extended_errcode | sqlite3 | ||
| sqlite3_extended_result_codes | sqlite3 | ||
| sqlite3_file_control | |||
| sqlite3_filename_database | |||
| sqlite3_filename_journal | |||
| sqlite3_filename_wal | |||
| sqlite3_finalize | sqlite3_stmt | ❕ | 不必要的 |
| sqlite3_free | ❕ | 通过 ffi 可用 | |
| sqlite3_free_filename | |||
| sqlite3_free_table | ❕ | 通过 ffi 可用 | |
| sqlite3_get_autocommit | |||
| sqlite3_get_auxdata | sqlite3_context | ✅ | 上下文::aux_data |
| sqlite3_get_table | ❕ | 通过 ffi 可用 | |
| sqlite3_hard_heap_limit64 | |||
| sqlite3_initialize | ❕ | 通过 ffi 可用 | |
| sqlite3_interrupt | |||
| sqlite3_keyword_check | |||
| sqlite3_keyword_count | |||
| sqlite3_keyword_name | |||
| sqlite3_last_insert_rowid | |||
| sqlite3_libversion | ✅ | SQLITE_VERSION.as_str | |
| sqlite3_libversion_number | ✅ | SQLITE_VERSION.get | |
| sqlite3_limit | sqlite3 | ||
| sqlite3_load_extension | sqlite3 | ||
| sqlite3_log | |||
| sqlite3_malloc | ❕ | 通过 ffi 可用 | |
| sqlite3_malloc64 | ❕ | 通过 ffi 可用 | |
| sqlite3_memory_highwater | |||
| sqlite3_memory_used | |||
| sqlite3_mprintf | char | ❕ | 通过 ffi 可用 |
| sqlite3_msize | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_alloc | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_enter | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_free | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_held | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_leave | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_notheld | ❕ | 通过 ffi 可用 | |
| sqlite3_mutex_try | ❕ | 通过 ffi 可用 | |
| sqlite3_next_stmt | |||
| sqlite3_normalized_sql | sqlite3_stmt | ||
| sqlite3_open | sqlite3 | ||
| sqlite3_open16 | sqlite3 | ❕ | 使用UTF-8等效 |
| sqlite3_open_v2 | sqlite3 | ||
| sqlite3_overload_function | sqlite3 | ✅ | 连接::create_overloaded_function |
| sqlite3_prepare | sqlite3_stmt | ❕ | 不必要的 |
| sqlite3_prepare16 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_prepare16_v2 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_prepare16_v3 | sqlite3_stmt | ❕ | 使用UTF-8等效 |
| sqlite3_prepare_v2 | sqlite3_stmt | ✅ | 连接::prepare |
| sqlite3_prepare_v3 | sqlite3_stmt | ✅ | 连接::prepare |
| sqlite3_preupdate_blobwrite | |||
| sqlite3_preupdate_count | |||
| sqlite3_preupdate_depth | |||
| sqlite3_preupdate_hook | |||
| sqlite3_preupdate_new | |||
| sqlite3_preupdate_old | |||
| sqlite3_profile | |||
| sqlite3_progress_handler | |||
| sqlite3_randomness | ✅ | sqlite3_randomness | |
| sqlite3_realloc | ❕ | 通过 ffi 可用 | |
| sqlite3_realloc64 | ❕ | 通过 ffi 可用 | |
| sqlite3_release_memory | |||
| sqlite3_reset | sqlite3_stmt | ✅ | 语句::query |
| sqlite3_reset_auto_extension | ✅ | 扩展::reset_auto | |
| sqlite3_result_blob | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_blob64 | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_double | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_error | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_error16 | sqlite3_context | ❕ | 使用UTF-8等效 |
| sqlite3_result_error_code | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_error_nomem | sqlite3_context | ||
| sqlite3_result_error_toobig | sqlite3_context | ||
| sqlite3_result_int | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_int64 | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_null | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_pointer | sqlite3_context | ✅ | PassedRef |
| sqlite3_result_subtype | sqlite3_context | ✅ | UnsafePtr |
| sqlite3_result_text | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_text16 | sqlite3_context | ❕ | 使用UTF-8等效 |
| sqlite3_result_text16be | sqlite3_context | ❕ | 使用UTF-8等效 |
| sqlite3_result_text16le | sqlite3_context | ❕ | 使用UTF-8等效 |
| sqlite3_result_text64 | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_value | sqlite3_context | ✅ | ToContextResult |
| sqlite3_result_zeroblob | sqlite3_context | ||
| sqlite3_result_zeroblob64 | sqlite3_context | ||
| sqlite3_rollback_hook | sqlite3 | ||
| sqlite3_serialize | |||
| sqlite3_set_authorizer | |||
| sqlite3_set_auxdata | sqlite3_context | ✅ | Context::set_aux_data |
| sqlite3_set_last_insert_rowid | sqlite3 | ❕ | 通过 ffi 可用 |
| sqlite3_shutdown | ❕ | 通过 ffi 可用 | |
| sqlite3_sleep | ❕ | 通过 ffi 可用 | |
| sqlite3_snapshot_cmp | |||
| sqlite3_snapshot_free | |||
| sqlite3_snapshot_get | |||
| sqlite3_snapshot_open | |||
| sqlite3_snapshot_recover | |||
| sqlite3_snprintf | char | ❕ | 通过 ffi 可用 |
| sqlite3_soft_heap_limit64 | |||
| sqlite3_sourceid | ✅ | SQLITE_VERSION.sourceid | |
| sqlite3_sql | sqlite3_stmt | ✅ | Statement::sql |
| sqlite3_status | |||
| sqlite3_status64 | |||
| sqlite3_step | sqlite3_stmt | ✅ | ResultSet::next |
| sqlite3_stmt_busy | sqlite3_stmt | ||
| sqlite3_stmt_isexplain | sqlite3_stmt | ||
| sqlite3_stmt_readonly | sqlite3_stmt | ||
| sqlite3_stmt_scanstatus | sqlite3_stmt | ||
| sqlite3_stmt_scanstatus_reset | sqlite3_stmt | ||
| sqlite3_stmt_status | sqlite3_stmt | ||
| sqlite3_str_append | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_appendall | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_appendchar | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_appendf | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_errcode | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_finish | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_length | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_new | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_reset | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_value | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_str_vappendf | sqlite3_str | ❕ | 通过 ffi 可用 |
| sqlite3_strglob | char | ✅ | sqlite3_strglob |
| sqlite3_stricmp | char | ✅ | sqlite3_stricmp |
| sqlite3_strlike | char | ✅ | sqlite3_strlike |
| sqlite3_strnicmp | char | ❕ | 不必要的 |
| sqlite3_system_errno | sqlite3 | ❕ | 通过 ffi 可用 |
| sqlite3_table_column_metadata | |||
| sqlite3_threadsafe | ❕ | 通过 ffi 可用 | |
| sqlite3_total_changes | sqlite3 | ||
| sqlite3_total_changes64 | sqlite3 | ||
| sqlite3_trace | |||
| sqlite3_trace_v2 | |||
| sqlite3_txn_state | |||
| sqlite3_unlock_notify | |||
| sqlite3_update_hook | |||
| sqlite3_uri_boolean | ❕ | 通过 ffi 可用 | |
| sqlite3_uri_int64 | ❕ | 通过 ffi 可用 | |
| sqlite3_uri_key | ❕ | 通过 ffi 可用 | |
| sqlite3_uri_parameter | ❕ | 通过 ffi 可用 | |
| sqlite3_user_data | sqlite3_context | ✅ | 使用闭包作为函数 |
| sqlite3_value_blob | sqlite3_value | ✅ | ValueRef::get_blob |
| sqlite3_value_bytes | sqlite3_value | ❕ | 不必要的 |
| sqlite3_value_bytes16 | sqlite3_value | ❕ | 使用UTF-8等效 |
| sqlite3_value_double | sqlite3_value | ✅ | ValueRef::get_f64 |
| sqlite3_value_dup | sqlite3_value | ||
| sqlite3_value_free | sqlite3_value | ❕ | 不必要的 |
| sqlite3_value_frombind | sqlite3_value | ✅ | ValueRef::is_from_bind |
| sqlite3_value_int | sqlite3_value | ✅ | ValueRef::get_i32 |
| sqlite3_value_int64 | sqlite3_value | ✅ | ValueRef::get_i64 |
| sqlite3_value_nochange | sqlite3_value | ✅ | ValueRef::nochange |
| sqlite3_value_numeric_type | sqlite3_value | ✅ | ValueRef::numeric_type |
| sqlite3_value_pointer | sqlite3_value | ✅ | ValueRef::get_ref |
| sqlite3_value_subtype | sqlite3_value | ✅ | UnsafePtr |
| sqlite3_value_text | sqlite3_value | ✅ | ValueRef::get_str |
| sqlite3_value_text16 | sqlite3_value | ❕ | 使用UTF-8等效 |
| sqlite3_value_text16be | sqlite3_value | ❕ | 使用UTF-8等效 |
| sqlite3_value_text16le | sqlite3_value | ❕ | 使用UTF-8等效 |
| sqlite3_value_type | sqlite3_value | ✅ | ValueRef::value_type |
| sqlite3_vfs_find | |||
| sqlite3_vfs_register | |||
| sqlite3_vfs_unregister | |||
| sqlite3_vmprintf | char | ❕ | 不必要的 |
| sqlite3_vsnprintf | char | ❕ | 不必要的 |
| sqlite3_vtab_collation | sqlite3_index_info | ✅ | IndexInfoConstraint::collation |
| sqlite3_vtab_config | sqlite3 | ✅ | VTabConnection |
| sqlite3_vtab_distinct | sqlite3_index_info | ✅ | IndexInfo::distinct_mode |
| sqlite3_vtab_in | sqlite3_index_info | ✅ | IndexInfoConstraint::set_value_list_wanted |
| sqlite3_vtab_in_first | sqlite3_value | ✅ | ValueList |
| sqlite3_vtab_in_next | sqlite3_value | ✅ | ValueList |
| sqlite3_vtab_nochange | sqlite3_context | ✅ | ColumnContext::nochange |
| sqlite3_vtab_on_conflict | sqlite3 | ✅ | ChangeInfo::conflict_mode |
| sqlite3_vtab_rhs_value | sqlite3_index_info | ✅ | IndexInfoConstraint::rhs |
| sqlite3_wal_autocheckpoint | |||
| sqlite3_wal_checkpoint | |||
| sqlite3_wal_checkpoint_v2 | |||
| sqlite3_wal_hook | |||
| sqlite3_win32_set_directory | |||
| sqlite3_win32_set_directory16 | ❕ | 使用UTF-8等效 | |
| sqlite3_win32_set_directory8 |
依赖关系
~4–12MB
~219K SLoC