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