net/indexeddb/engines/sqlite/
create.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5// Adapted from:
6// https://github.com/mozilla-firefox/firefox/blob/ee102e926521b3e460293b0aea6b54b1a03f6f74/dom/indexedDB/DBSchema.cpp#L78
7
8pub(crate) fn create_tables(conn: &rusqlite::Connection) -> Result<(), rusqlite::Error> {
9    const DATABASE: &str = r#"
10create table database (
11    name    varchar          not null
12        primary key,
13    origin  varchar          not null,
14    version bigint default 0 not null
15) WITHOUT ROWID;"#;
16    conn.execute(DATABASE, [])?;
17
18    const OBJECT_STORE: &str = r#"
19create table object_store (
20    id             integer               not null
21        primary key autoincrement,
22    name           varchar               not null
23        unique,
24    key_path       varbinary_blob,
25    auto_increment integer default FALSE not null
26);"#;
27    conn.execute(OBJECT_STORE, [])?;
28
29    const OBJECT_DATA: &str = r#"
30create table object_data (
31    object_store_id integer not null
32        references object_store,
33    key             blob    not null,
34    data            blob    not null,
35    constraint "pk-object_data"
36        primary key (object_store_id, key)
37) WITHOUT ROWID;"#;
38    conn.execute(OBJECT_DATA, [])?;
39
40    const OBJECT_STORE_INDEX: &str = r#"
41create table object_store_index (
42    id                integer        not null
43    primary key autoincrement,
44    object_store_id   integer        not null
45    references object_store,
46    name              varchar        not null
47    unique,
48    key_path          varbinary_blob not null,
49    unique_index      boolean        not null,
50    multi_entry_index boolean        not null
51);"#;
52    conn.execute(OBJECT_STORE_INDEX, [])?;
53
54    const INDEX_DATA: &str = r#"
55CREATE TABLE index_data (
56    index_id INTEGER NOT NULL,
57    value BLOB NOT NULL,
58    object_data_key BLOB NOT NULL,
59    object_store_id INTEGER NOT NULL,
60    value_locale BLOB,
61    PRIMARY KEY (index_id, value, object_data_key)
62    FOREIGN KEY (index_id) REFERENCES object_store_index(id),
63    FOREIGN KEY (object_store_id, object_data_key)
64    REFERENCES object_data(object_store_id, key)
65) WITHOUT ROWID;"#;
66    conn.execute(INDEX_DATA, [])?;
67
68    const UNIQUE_INDEX_DATA: &str = r#"
69CREATE TABLE unique_index_data (
70    index_id INTEGER NOT NULL,
71    value BLOB NOT NULL,
72    object_store_id INTEGER NOT NULL,
73    object_data_key BLOB NOT NULL,
74    value_locale BLOB,
75    PRIMARY KEY (index_id, value),
76    FOREIGN KEY (index_id) REFERENCES object_store_index(id),
77    FOREIGN KEY (object_store_id, object_data_key)
78    REFERENCES object_data(object_store_id, key)
79) WITHOUT ROWID;"#;
80    conn.execute(UNIQUE_INDEX_DATA, [])?;
81    Ok(())
82}