#sqlite #ffi

sqlite3_ext

使用Rust为SQLite构建可加载的扩展

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

Crates.io docs.rs

在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