• Home
Name Date Size #Lines LOC

..--

benches/03-May-2024-3729

src/03-May-2024-17,19511,882

tests/03-May-2024-158117

.cargo_vcs_info.jsonD03-May-202494 66

.gitignoreD03-May-202426 43

Android.bpD03-May-20241.5 KiB6660

Cargo.tomlD03-May-20244.4 KiB236201

Cargo.toml.origD03-May-20244.2 KiB166148

LICENSED03-May-20241 KiB2016

METADATAD03-May-2024369 2019

MODULE_LICENSE_MITD03-May-20240

OWNERSD03-May-202440 21

README.mdD03-May-202414.1 KiB229185

TEST_MAPPINGD03-May-2024311 2019

cargo2android-extra-module.bpD03-May-2024464 2221

cargo2android.jsonD03-May-2024129 66

test.csvD03-May-202472 76

README.md

1# Rusqlite
2
3[![Latest Version](https://img.shields.io/crates/v/rusqlite.svg)](https://crates.io/crates/rusqlite)
4[![Documentation](https://docs.rs/rusqlite/badge.svg)](https://docs.rs/rusqlite)
5[![Build Status (GitHub)](https://github.com/rusqlite/rusqlite/workflows/CI/badge.svg)](https://github.com/rusqlite/rusqlite/actions)
6[![Build Status (AppVeyor)](https://ci.appveyor.com/api/projects/status/github/rusqlite/rusqlite?branch=master&svg=true)](https://ci.appveyor.com/project/rusqlite/rusqlite)
7[![Code Coverage](https://codecov.io/gh/rusqlite/rusqlite/branch/master/graph/badge.svg)](https://codecov.io/gh/rusqlite/rusqlite)
8[![Dependency Status](https://deps.rs/repo/github/rusqlite/rusqlite/status.svg)](https://deps.rs/repo/github/rusqlite/rusqlite)
9[![Discord Chat](https://img.shields.io/discord/927966344266256434.svg?logo=discord)](https://discord.gg/nFYfGPB8g4)
10
11Rusqlite is an ergonomic wrapper for using SQLite from Rust. It attempts to expose
12an interface similar to [rust-postgres](https://github.com/sfackler/rust-postgres).
13
14```rust
15use rusqlite::{params, Connection, Result};
16
17#[derive(Debug)]
18struct Person {
19    id: i32,
20    name: String,
21    data: Option<Vec<u8>>,
22}
23
24fn main() -> Result<()> {
25    let conn = Connection::open_in_memory()?;
26
27    conn.execute(
28        "CREATE TABLE person (
29                  id              INTEGER PRIMARY KEY,
30                  name            TEXT NOT NULL,
31                  data            BLOB
32                  )",
33        [],
34    )?;
35    let me = Person {
36        id: 0,
37        name: "Steven".to_string(),
38        data: None,
39    };
40    conn.execute(
41        "INSERT INTO person (name, data) VALUES (?1, ?2)",
42        params![me.name, me.data],
43    )?;
44
45    let mut stmt = conn.prepare("SELECT id, name, data FROM person")?;
46    let person_iter = stmt.query_map([], |row| {
47        Ok(Person {
48            id: row.get(0)?,
49            name: row.get(1)?,
50            data: row.get(2)?,
51        })
52    })?;
53
54    for person in person_iter {
55        println!("Found person {:?}", person.unwrap());
56    }
57    Ok(())
58}
59```
60
61### Supported SQLite Versions
62
63The base `rusqlite` package supports SQLite version 3.6.8 or newer. If you need
64support for older versions, please file an issue. Some cargo features require a
65newer SQLite version; see details below.
66
67### Optional Features
68
69Rusqlite provides several features that are behind [Cargo
70features](https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section). They are:
71
72* [`load_extension`](https://docs.rs/rusqlite/~0/rusqlite/struct.LoadExtensionGuard.html)
73  allows loading dynamic library-based SQLite extensions.
74* [`backup`](https://docs.rs/rusqlite/~0/rusqlite/backup/index.html)
75  allows use of SQLite's online backup API. Note: This feature requires SQLite 3.6.11 or later.
76* [`functions`](https://docs.rs/rusqlite/~0/rusqlite/functions/index.html)
77  allows you to load Rust closures into SQLite connections for use in queries.
78  Note: This feature requires SQLite 3.7.3 or later.
79* `window` for [window function](https://www.sqlite.org/windowfunctions.html) support (`fun(...) OVER ...`). (Implies `functions`.)
80* [`trace`](https://docs.rs/rusqlite/~0/rusqlite/trace/index.html)
81  allows hooks into SQLite's tracing and profiling APIs. Note: This feature
82  requires SQLite 3.6.23 or later.
83* [`blob`](https://docs.rs/rusqlite/~0/rusqlite/blob/index.html)
84  gives `std::io::{Read, Write, Seek}` access to SQL BLOBs. Note: This feature
85  requires SQLite 3.7.4 or later.
86* [`limits`](https://docs.rs/rusqlite/~0/rusqlite/struct.Connection.html#method.limit)
87  allows you to set and retrieve SQLite's per connection limits.
88* `chrono` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html)
89  and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for various
90  types from the [`chrono` crate](https://crates.io/crates/chrono).
91* `serde_json` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html)
92  and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for the
93  `Value` type from the [`serde_json` crate](https://crates.io/crates/serde_json).
94* `time` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html)
95   and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for the
96   `time::OffsetDateTime` type from the [`time` crate](https://crates.io/crates/time).
97* `url` implements [`FromSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.FromSql.html)
98  and [`ToSql`](https://docs.rs/rusqlite/~0/rusqlite/types/trait.ToSql.html) for the
99  `Url` type from the [`url` crate](https://crates.io/crates/url).
100* `bundled` uses a bundled version of SQLite.  This is a good option for cases where linking to SQLite is complicated, such as Windows.
101* `sqlcipher` looks for the SQLCipher library to link against instead of SQLite. This feature overrides `bundled`.
102* `bundled-sqlcipher` uses a bundled version of SQLCipher. This searches for and links against a system-installed crypto library to provide the crypto implementation.
103* `bundled-sqlcipher-vendored-openssl` allows using bundled-sqlcipher with a vendored version of OpenSSL (via the `openssl-sys` crate) as the crypto provider.
104  - As the name implies this depends on the `bundled-sqlcipher` feature, and automatically turns it on.
105  - If turned on, this uses the [`openssl-sys`](https://crates.io/crates/openssl-sys) crate, with the `vendored` feature enabled in order to build and bundle the OpenSSL crypto library.
106* `hooks` for [Commit, Rollback](http://sqlite.org/c3ref/commit_hook.html) and [Data Change](http://sqlite.org/c3ref/update_hook.html) notification callbacks.
107* `unlock_notify` for [Unlock](https://sqlite.org/unlock_notify.html) notification.
108* `vtab` for [virtual table](https://sqlite.org/vtab.html) support (allows you to write virtual table implementations in Rust). Currently, only read-only virtual tables are supported.
109* `series` exposes [`generate_series(...)`](https://www.sqlite.org/series.html) Table-Valued Function. (Implies `vtab`.)
110* [`csvtab`](https://sqlite.org/csv.html), CSV virtual table written in Rust. (Implies `vtab`.)
111* [`array`](https://sqlite.org/carray.html), The `rarray()` Table-Valued Function. (Implies `vtab`.)
112* `i128_blob` allows storing values of type `i128` type in SQLite databases. Internally, the data is stored as a 16 byte big-endian blob, with the most significant bit flipped, which allows ordering and comparison between different blobs storing i128s to work as expected.
113* `uuid` allows storing and retrieving `Uuid` values from the [`uuid`](https://docs.rs/uuid/) crate using blobs.
114* [`session`](https://sqlite.org/sessionintro.html), Session module extension. Requires `buildtime_bindgen` feature. (Implies `hooks`.)
115* `extra_check` fail when a query passed to execute is readonly or has a column count > 0.
116* `column_decltype` provides `columns()` method for Statements and Rows; omit if linking to a version of SQLite/SQLCipher compiled with `-DSQLITE_OMIT_DECLTYPE`.
117* `collation` exposes [`sqlite3_create_collation_v2`](https://sqlite.org/c3ref/create_collation.html).
118
119## Notes on building rusqlite and libsqlite3-sys
120
121`libsqlite3-sys` is a separate crate from `rusqlite` that provides the Rust
122declarations for SQLite's C API. By default, `libsqlite3-sys` attempts to find a SQLite library that already exists on your system using pkg-config, or a
123[Vcpkg](https://github.com/Microsoft/vcpkg) installation for MSVC ABI builds.
124
125You can adjust this behavior in a number of ways:
126
127* If you use the `bundled`, `bundled-sqlcipher`, or `bundled-sqlcipher-vendored-openssl` features, `libsqlite3-sys` will use the
128  [cc](https://crates.io/crates/cc) crate to compile SQLite or SQLCipher from source and
129  link against that. This source is embedded in the `libsqlite3-sys` crate and
130  is currently SQLite 3.38.0 (as of `rusqlite` 0.27.0 / `libsqlite3-sys`
131  0.24.0).  This is probably the simplest solution to any build problems. You can enable this by adding the following in your `Cargo.toml` file:
132  ```toml
133  [dependencies.rusqlite]
134  version = "0.27.0"
135  features = ["bundled"]
136  ```
137* When using any of the `bundled` features, the build script will honor `SQLITE_MAX_VARIABLE_NUMBER` and `SQLITE_MAX_EXPR_DEPTH` variables. It will also honor a `LIBSQLITE_FLAGS` variable, which can have a format like `"-USQLITE_ALPHA -DSQLITE_BETA SQLITE_GAMMA ..."`. That would disable the `SQLITE_ALPHA` flag, and set the `SQLITE_BETA` and `SQLITE_GAMMA` flags. (The initial `-D` can be omitted, as on the last one.)
138* When using `bundled-sqlcipher` (and not also using `bundled-sqlcipher-vendored-openssl`), `libsqlite3-sys` will need to
139  link against crypto libraries on the system. If the build script can find a `libcrypto` from OpenSSL or LibreSSL (it will consult `OPENSSL_LIB_DIR`/`OPENSSL_INCLUDE_DIR` and `OPENSSL_DIR` environment variables), it will use that. If building on and for Macs, and none of those variables are set, it will use the system's SecurityFramework instead.
140
141* When linking against a SQLite (or SQLCipher) library already on the system (so *not* using any of the `bundled` features), you can set the `SQLITE3_LIB_DIR` (or `SQLCIPHER_LIB_DIR`) environment variable to point to a directory containing the library. You can also set the `SQLITE3_INCLUDE_DIR` (or `SQLCIPHER_INCLUDE_DIR`) variable to point to the directory containing `sqlite3.h`.
142* Installing the sqlite3 development packages will usually be all that is required, but
143  the build helpers for [pkg-config](https://github.com/alexcrichton/pkg-config-rs)
144  and [vcpkg](https://github.com/mcgoo/vcpkg-rs) have some additional configuration
145  options. The default when using vcpkg is to dynamically link,
146  which must be enabled by setting `VCPKGRS_DYNAMIC=1` environment variable before build.
147  `vcpkg install sqlite3:x64-windows` will install the required library.
148* When linking against a SQLite (or SQLCipher) library already on the system, you can set the `SQLITE3_STATIC` (or `SQLCIPHER_STATIC`) environment variable to 1 to request that the library be statically instead of dynamically linked.
149
150
151### Binding generation
152
153We use [bindgen](https://crates.io/crates/bindgen) to generate the Rust
154declarations from SQLite's C header file. `bindgen`
155[recommends](https://github.com/servo/rust-bindgen#library-usage-with-buildrs)
156running this as part of the build process of libraries that used this. We tried
157this briefly (`rusqlite` 0.10.0, specifically), but it had some annoyances:
158
159* The build time for `libsqlite3-sys` (and therefore `rusqlite`) increased
160  dramatically.
161* Running `bindgen` requires a relatively-recent version of Clang, which many
162  systems do not have installed by default.
163* Running `bindgen` also requires the SQLite header file to be present.
164
165As of `rusqlite` 0.10.1, we avoid running `bindgen` at build-time by shipping
166pregenerated bindings for several versions of SQLite. When compiling
167`rusqlite`, we use your selected Cargo features to pick the bindings for the
168minimum SQLite version that supports your chosen features. If you are using
169`libsqlite3-sys` directly, you can use the same features to choose which
170pregenerated bindings are chosen:
171
172* `min_sqlite_version_3_6_8` - SQLite 3.6.8 bindings (this is the default)
173* `min_sqlite_version_3_6_23` - SQLite 3.6.23 bindings
174* `min_sqlite_version_3_7_7` - SQLite 3.7.7 bindings
175
176If you use any of the `bundled` features, you will get pregenerated bindings for the
177bundled version of SQLite/SQLCipher. If you need other specific pregenerated binding
178versions, please file an issue. If you want to run `bindgen` at buildtime to
179produce your own bindings, use the `buildtime_bindgen` Cargo feature.
180
181If you enable the `modern_sqlite` feature, we'll use the bindings we would have
182included with the bundled build. You generally should have `buildtime_bindgen`
183enabled if you turn this on, as otherwise you'll need to keep the version of
184SQLite you link with in sync with what rusqlite would have bundled, (usually the
185most recent release of SQLite). Failing to do this will cause a runtime error.
186
187## Contributing
188
189Rusqlite has many features, and many of them impact the build configuration in
190incompatible ways. This is unfortunate, and makes testing changes hard.
191
192To help here: you generally should ensure that you run tests/lint for
193`--features bundled`, and `--features "bundled-full session buildtime_bindgen"`.
194
195If running bindgen is problematic for you, `--features bundled-full` enables
196bundled and all features which don't require binding generation, and can be used
197instead.
198
199### Checklist
200
201- Run `cargo fmt` to ensure your Rust code is correctly formatted.
202- Ensure `cargo clippy --workspace --features bundled` passes without warnings.
203- Ensure `cargo clippy --workspace --features "bundled-full session buildtime_bindgen"` passes without warnings.
204- Ensure `cargo test --workspace --features bundled` reports no failures.
205- Ensure `cargo test --workspace --features "bundled-full session buildtime_bindgen"` reports no failures.
206
207## Author
208
209Rusqlite is the product of hard work by a number of people. A list is available
210here: https://github.com/rusqlite/rusqlite/graphs/contributors
211
212## Community
213
214Feel free to join the [Rusqlite Discord Server](https://discord.gg/nFYfGPB8g4) to discuss or get help with `rusqlite` or `libsqlite3-sys`.
215
216## License
217
218Rusqlite and libsqlite3-sys are available under the MIT license. See the LICENSE file for more info.
219
220### Licenses of Bundled Software
221
222Depending on the set of enabled cargo `features`, rusqlite and libsqlite3-sys will also bundle other libraries, which have their own licensing terms:
223
224- If `--features=bundled-sqlcipher` is enabled, the vendored source of [SQLcipher](https://github.com/sqlcipher/sqlcipher) will be compiled and statically linked in. SQLcipher is distributed under a BSD-style license, as described [here](libsqlite3-sys/sqlcipher/LICENSE).
225
226- If `--features=bundled` is enabled, the vendored source of SQLite will be compiled and linked in. SQLite is in the public domain, as described [here](https://www.sqlite.org/copyright.html).
227
228Both of these are quite permissive, have no bearing on the license of the code in `rusqlite` or `libsqlite3-sys` themselves, and can be entirely ignored if you do not use the feature in question.
229