sqlite3_ext 0.1.0

Build loadable extensions for SQLite using Rust
Documentation
# sqlite3_ext

Create SQLite loadable extensions in Rust. The design philosophy of the API is gradual enhancement: extensions written with this crate support versions of SQLite back to 3.6.8, unless they explicitly require newer features.

## Crate features

- `static` - The consumer of this crate is not an SQLite loadable extension. The SQLite API will be provided by the linker. To avoid link errors, sqlite3_ext disables all APIs that are added after 3.6.8.
- `static_modern` - Same as `static`, but sqlite3_ext does not disable any APIs. This will cause link errors if the linked version of SQLite is older than the version supported by sqlite3_ext.

## Compilation Modes

There are three supported compilation modes for sqlite3_ext:

- As a loadable extension. Your crate is `crate-type = [ "cdylib" ]` and is loaded into another process as an SQLite loadable extension.
  - SQLite methods are provided by SQLite at run-time.
- As a statically linked extension. Your crate is `crate-type = [ "staticlib" ]` and is statically linked into another program.
  - Linker provides the SQLite methods.
- As a rust library. Your crate has any type and uses sqlite3_ext like any other crate.
  - You are responsible for providing SQLite (e.g. via Rusqlite).

## Crate configurations

- By default, the crate is configured to be dynamically loaded by SQLite.
- Using feature `static`, the crate is able to be linked into a Rust or C program statically. This is highly compatible, but disables many features of SQLite.
- Using feature `static_modern`, the crate is able to be linked into a Rust or C program statically. This requires that the system's SQLite is at least the version supported by sqlite3_ext, or there will be link errors.

### Test configurations

Tests run with modern SQLite:

- All tests from `Cargo.toml` with crate feature `static`.
- All tests from `Cargo.toml` with crate feature `static_modern`.

Todo:

- Run tests against SQLite 3.6.8.

## Interfaces supported

Here is a compatibility chart showing which parts of the SQLite API are currently covered by sqlite3_ext. Iconography:

- :white_check_mark: - This API is fully exposed via an API in sqlite3_ext
- :grey_exclamation: - This API is available via unsafe ffi, but there are no plans to make an API for it in sqlite3_ext.

| Interface | Object | Status | Details |
| --| :-- | :-: | :-- |
| sqlite3_aggregate_context | sqlite3_context | :white_check_mark: | Arbitrary structs supported |
| sqlite3_auto_extension | - | :white_check_mark: | 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 | :white_check_mark: | ToParam |
| sqlite3_bind_blob64 | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_double | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_int | sqlite3_stmt | :grey_exclamation: | Unnecessary |
| sqlite3_bind_int64 | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_null | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_parameter_count | sqlite3_stmt | :white_check_mark: | Statement::parameter_count |
| sqlite3_bind_parameter_index | sqlite3_stmt | :white_check_mark: | Statement::parameter_position |
| sqlite3_bind_parameter_name | sqlite3_stmt | :white_check_mark: | Statement::parameter_name |
| sqlite3_bind_pointer | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_text | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_text16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_bind_text64 | sqlite3_stmt | :white_check_mark: | ToParam |
| sqlite3_bind_value | sqlite3_stmt | :white_check_mark: | 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 | - | :white_check_mark: | Extension::cancel_auto |
| sqlite3_changes |  | :white_check_mark: | Statement::execute |
| sqlite3_changes64 |  | :white_check_mark: | Statement::execute |
| sqlite3_clear_bindings | sqlite3_stmt | :grey_exclamation: | Unnecessary |
| sqlite3_close |  | | |
| sqlite3_close_v2 |  | | |
| sqlite3_collation_needed | sqlite3 | :white_check_mark: | Connection::set_collation_needed_func |
| sqlite3_collation_needed16 | sqlite3 | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_blob | sqlite3_stmt | :white_check_mark: | Column::get_blob |
| sqlite3_column_bytes | sqlite3_stmt | :grey_exclamation: | Unnecessary |
| sqlite3_column_bytes16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_count | sqlite3_stmt | :white_check_mark: | Statement::column_count |
| sqlite3_column_database_name | sqlite3_stmt | :white_check_mark: | Column::database_name |
| sqlite3_column_database_name16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_decltype | sqlite3_stmt | :white_check_mark: | Column::decltype |
| sqlite3_column_decltype16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_double | sqlite3_stmt | :white_check_mark: | Column::get_f64 |
| sqlite3_column_int | sqlite3_stmt | :white_check_mark: | Column::get_i32 |
| sqlite3_column_int64 | sqlite3_stmt | :white_check_mark: | Column::get_i64 |
| sqlite3_column_name | sqlite3_stmt | :white_check_mark: | Column::name |
| sqlite3_column_name16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_origin_name | sqlite3_stmt | :white_check_mark: | Column::origin_name |
| sqlite3_column_origin_name16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_table_name | sqlite3_stmt | :white_check_mark: | Column::table_name |
| sqlite3_column_table_name16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_text | sqlite3_stmt | :white_check_mark: | Column::get_str |
| sqlite3_column_text16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_column_type | sqlite3_stmt | :white_check_mark: | Column::value_type |
| sqlite3_column_value | sqlite3_stmt | :white_check_mark: | Column::as_ref |
| sqlite3_commit_hook | sqlite3 | | |
| sqlite3_compileoption_get |  | | |
| sqlite3_compileoption_used |  | | |
| sqlite3_complete |  | | |
| sqlite3_complete16 |  | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_config |  | | |
| sqlite3_context_db_handle | sqlite3_context | :white_check_mark: | Context::db |
| sqlite3_create_collation | sqlite3 | :white_check_mark: | Connection::create_collation |
| sqlite3_create_collation16 | sqlite3 | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_create_collation_v2 | sqlite3 | :white_check_mark: | Connection::create_collation |
| sqlite3_create_filename |  | | |
| sqlite3_create_function | sqlite3 | :white_check_mark: | Connection::create_scalar_function |
| sqlite3_create_function16 | sqlite3 | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_create_function_v2 | sqlite3 | :white_check_mark: | Connection::create_scalar_function |
| sqlite3_create_module | sqlite3 | :white_check_mark: | Connection::create_module |
| sqlite3_create_module_v2 | sqlite3 | :white_check_mark: | Connection::create_module |
| sqlite3_create_window_function | sqlite3 | :white_check_mark: | Connection::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 | :white_check_mark: | Statement::db |
| sqlite3_db_mutex | sqlite3 | :white_check_mark: | Connection::lock |
| sqlite3_db_readonly |  | | |
| sqlite3_db_release_memory |  | | |
| sqlite3_db_status |  | | |
| sqlite3_declare_vtab |  | :white_check_mark: | VTab::connect |
| sqlite3_deserialize |  | | |
| sqlite3_drop_modules |  | | |
| sqlite3_enable_load_extension | sqlite3 | :grey_exclamation: | Available via ffi |
| sqlite3_enable_shared_cache |  | | |
| sqlite3_errcode | sqlite3 |  |  |
| sqlite3_errmsg | sqlite3 |  | |
| sqlite3_errmsg16 | sqlite3 | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_error_offset | sqlite3 | | |
| sqlite3_errstr | - | :white_check_mark: | Error::fmt |
| sqlite3_exec | sqlite3 | :grey_exclamation: | Unnecessary |
| 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 | :grey_exclamation: | Unnecessary |
| sqlite3_free |  | :grey_exclamation: | Available via ffi |
| sqlite3_free_filename |  | | |
| sqlite3_free_table |  | :grey_exclamation: | Available via ffi |
| sqlite3_get_autocommit |  | | |
| sqlite3_get_auxdata | sqlite3_context | :white_check_mark: | Context::aux_data |
| sqlite3_get_table |  | :grey_exclamation: | Available via ffi |
| sqlite3_hard_heap_limit64 |  | | |
| sqlite3_initialize |  | :grey_exclamation: | Available via ffi |
| sqlite3_interrupt |  | | |
| sqlite3_keyword_check |  | | |
| sqlite3_keyword_count |  | | |
| sqlite3_keyword_name |  | | |
| sqlite3_last_insert_rowid |  | | |
| sqlite3_libversion |  | :white_check_mark: | SQLITE_VERSION.as_str |
| sqlite3_libversion_number |  | :white_check_mark: | SQLITE_VERSION.get |
| sqlite3_limit | sqlite3 | | |
| sqlite3_load_extension | sqlite3 | | |
| sqlite3_log |  | | |
| sqlite3_malloc |  | :grey_exclamation: | Available via ffi |
| sqlite3_malloc64 |  | :grey_exclamation: | Available via ffi |
| sqlite3_memory_highwater |  | | |
| sqlite3_memory_used |  | | |
| sqlite3_mprintf | char | :grey_exclamation: | Available via ffi |
| sqlite3_msize |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_alloc |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_enter |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_free |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_held |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_leave |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_notheld |  | :grey_exclamation: | Available via ffi |
| sqlite3_mutex_try |  | :grey_exclamation: | Available via ffi |
| sqlite3_next_stmt |  | | |
| sqlite3_normalized_sql | sqlite3_stmt | | |
| sqlite3_open | sqlite3 | | |
| sqlite3_open16 | sqlite3 | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_open_v2 | sqlite3 | | |
| sqlite3_overload_function | sqlite3 | :white_check_mark: | Connection::create_overloaded_function |
| sqlite3_prepare | sqlite3_stmt | :grey_exclamation: | Unnecessary |
| sqlite3_prepare16 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_prepare16_v2 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_prepare16_v3 | sqlite3_stmt | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_prepare_v2 | sqlite3_stmt | :white_check_mark: | Connection::prepare |
| sqlite3_prepare_v3 | sqlite3_stmt | :white_check_mark: | Connection::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 |  | :white_check_mark: | sqlite3_randomness |
| sqlite3_realloc |  | :grey_exclamation: | Available via ffi |
| sqlite3_realloc64 |  | :grey_exclamation: | Available via ffi |
| sqlite3_release_memory |  | | |
| sqlite3_reset | sqlite3_stmt | :white_check_mark: | Statement::query |
| sqlite3_reset_auto_extension |  | :white_check_mark: | Extension::reset_auto |
| sqlite3_result_blob | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_blob64 | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_double | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_error | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_error16 | sqlite3_context | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_result_error_code | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_error_nomem | sqlite3_context | | |
| sqlite3_result_error_toobig | sqlite3_context | | |
| sqlite3_result_int | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_int64 | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_null | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_pointer | sqlite3_context | :white_check_mark: | PassedRef |
| sqlite3_result_subtype | sqlite3_context | :white_check_mark: | UnsafePtr |
| sqlite3_result_text | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_text16 | sqlite3_context | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_result_text16be | sqlite3_context | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_result_text16le | sqlite3_context | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_result_text64 | sqlite3_context | :white_check_mark: | ToContextResult |
| sqlite3_result_value | sqlite3_context | :white_check_mark: | 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 | :white_check_mark: | Context::set_aux_data |
| sqlite3_set_last_insert_rowid | sqlite3 | :grey_exclamation: | Available via ffi |
| sqlite3_shutdown |  | :grey_exclamation: | Available via ffi |
| sqlite3_sleep |  | :grey_exclamation: | Available via ffi |
| sqlite3_snapshot_cmp |  | | |
| sqlite3_snapshot_free |  | | |
| sqlite3_snapshot_get |  | | |
| sqlite3_snapshot_open |  | | |
| sqlite3_snapshot_recover |  | | |
| sqlite3_snprintf | char | :grey_exclamation: | Available via ffi |
| sqlite3_soft_heap_limit64 |  | | |
| sqlite3_sourceid |  | :white_check_mark: | SQLITE_VERSION.sourceid |
| sqlite3_sql | sqlite3_stmt | :white_check_mark: | Statement::sql |
| sqlite3_status |  | | |
| sqlite3_status64 |  | | |
| sqlite3_step | sqlite3_stmt | :white_check_mark: | 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 | :grey_exclamation: | Available via ffi |
| sqlite3_str_appendall | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_appendchar | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_appendf | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_errcode | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_finish | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_length | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_new | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_reset | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_value | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_str_vappendf | sqlite3_str | :grey_exclamation: | Available via ffi |
| sqlite3_strglob | char | :white_check_mark: | sqlite3_strglob |
| sqlite3_stricmp | char | :white_check_mark: | sqlite3_stricmp |
| sqlite3_strlike | char | :white_check_mark: | sqlite3_strlike |
| sqlite3_strnicmp | char | :grey_exclamation: | Unnecessary |
| sqlite3_system_errno | sqlite3 | :grey_exclamation: | Available via ffi |
| sqlite3_table_column_metadata |  | | |
| sqlite3_threadsafe |  | :grey_exclamation: | Available via 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 |  | :grey_exclamation: | Available via ffi |
| sqlite3_uri_int64 |  | :grey_exclamation: | Available via ffi |
| sqlite3_uri_key |  | :grey_exclamation: | Available via ffi |
| sqlite3_uri_parameter |  | :grey_exclamation: | Available via ffi |
| sqlite3_user_data | sqlite3_context | :white_check_mark: | Use a closure for the function |
| sqlite3_value_blob | sqlite3_value | :white_check_mark: | ValueRef::get_blob |
| sqlite3_value_bytes | sqlite3_value | :grey_exclamation: | Unnecessary |
| sqlite3_value_bytes16 | sqlite3_value | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_value_double | sqlite3_value | :white_check_mark: | ValueRef::get_f64 |
| sqlite3_value_dup | sqlite3_value | | |
| sqlite3_value_free | sqlite3_value | :grey_exclamation: | Unnecesary |
| sqlite3_value_frombind | sqlite3_value | :white_check_mark: | ValueRef::is_from_bind |
| sqlite3_value_int | sqlite3_value | :white_check_mark: | ValueRef::get_i32 |
| sqlite3_value_int64 | sqlite3_value | :white_check_mark: | ValueRef::get_i64 |
| sqlite3_value_nochange | sqlite3_value | :white_check_mark: | ValueRef::nochange |
| sqlite3_value_numeric_type | sqlite3_value | :white_check_mark: | ValueRef::numeric_type |
| sqlite3_value_pointer | sqlite3_value | :white_check_mark: | ValueRef::get_ref |
| sqlite3_value_subtype | sqlite3_value | :white_check_mark: | UnsafePtr |
| sqlite3_value_text | sqlite3_value | :white_check_mark: | ValueRef::get_str |
| sqlite3_value_text16 | sqlite3_value | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_value_text16be | sqlite3_value | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_value_text16le | sqlite3_value | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_value_type | sqlite3_value | :white_check_mark: | ValueRef::value_type |
| sqlite3_vfs_find |  | | |
| sqlite3_vfs_register |  | | |
| sqlite3_vfs_unregister |  | | |
| sqlite3_vmprintf | char | :grey_exclamation: | Unnecessary |
| sqlite3_vsnprintf | char | :grey_exclamation: | Unnecessary |
| sqlite3_vtab_collation | sqlite3_index_info | :white_check_mark: | IndexInfoConstraint::collation |
| sqlite3_vtab_config | sqlite3 | :white_check_mark: | VTabConnection |
| sqlite3_vtab_distinct | sqlite3_index_info | :white_check_mark: | IndexInfo::distinct_mode |
| sqlite3_vtab_in | sqlite3_index_info | :white_check_mark: | IndexInfoConstraint::set_value_list_wanted |
| sqlite3_vtab_in_first | sqlite3_value | :white_check_mark: | ValueList |
| sqlite3_vtab_in_next | sqlite3_value | :white_check_mark: | ValueList |
| sqlite3_vtab_nochange | sqlite3_context | :white_check_mark: | ColumnContext::nochange |
| sqlite3_vtab_on_conflict | sqlite3 | :white_check_mark: | ChangeInfo::conflict_mode |
| sqlite3_vtab_rhs_value | sqlite3_index_info | :white_check_mark: | IndexInfoConstraint::rhs |
| sqlite3_wal_autocheckpoint |  | | |
| sqlite3_wal_checkpoint |  | | |
| sqlite3_wal_checkpoint_v2 |  | | |
| sqlite3_wal_hook |  | | |
| sqlite3_win32_set_directory |  | | |
| sqlite3_win32_set_directory16 |  | :grey_exclamation: | Use UTF-8 equivalent |
| sqlite3_win32_set_directory8 |  | | |