| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ |
| |
| // Adapted from: |
| // https://github.com/mozilla-firefox/firefox/blob/ee102e926521b3e460293b0aea6b54b1a03f6f74/dom/indexedDB/DBSchema.cpp#L78 |
| |
| pub(crate) fn create_tables(conn: &rusqlite::Connection) -> Result<(), rusqlite::Error> { |
| const DATABASE: &str = r#" |
| create table database ( |
| name varchar not null |
| primary key, |
| origin varchar not null, |
| version bigint default 0 not null |
| ) WITHOUT ROWID;"#; |
| conn.execute(DATABASE, [])?; |
| |
| const OBJECT_STORE: &str = r#" |
| create table object_store ( |
| id integer not null |
| primary key autoincrement, |
| name varchar not null |
| unique, |
| key_path varbinary_blob, |
| auto_increment integer default FALSE not null |
| );"#; |
| conn.execute(OBJECT_STORE, [])?; |
| |
| const OBJECT_DATA: &str = r#" |
| create table object_data ( |
| object_store_id integer not null |
| references object_store, |
| key blob not null, |
| data blob not null, |
| constraint "pk-object_data" |
| primary key (object_store_id, key) |
| ) WITHOUT ROWID;"#; |
| conn.execute(OBJECT_DATA, [])?; |
| |
| const OBJECT_STORE_INDEX: &str = r#" |
| create table object_store_index ( |
| id integer not null |
| primary key autoincrement, |
| object_store_id integer not null |
| references object_store, |
| name varchar not null |
| unique, |
| key_path varbinary_blob not null, |
| unique_index boolean not null, |
| multi_entry_index boolean not null |
| );"#; |
| conn.execute(OBJECT_STORE_INDEX, [])?; |
| |
| const INDEX_DATA: &str = r#" |
| CREATE TABLE index_data ( |
| index_id INTEGER NOT NULL, |
| value BLOB NOT NULL, |
| object_data_key BLOB NOT NULL, |
| object_store_id INTEGER NOT NULL, |
| value_locale BLOB, |
| PRIMARY KEY (index_id, value, object_data_key) |
| FOREIGN KEY (index_id) REFERENCES object_store_index(id), |
| FOREIGN KEY (object_store_id, object_data_key) |
| REFERENCES object_data(object_store_id, key) |
| ) WITHOUT ROWID;"#; |
| conn.execute(INDEX_DATA, [])?; |
| |
| const UNIQUE_INDEX_DATA: &str = r#" |
| CREATE TABLE unique_index_data ( |
| index_id INTEGER NOT NULL, |
| value BLOB NOT NULL, |
| object_store_id INTEGER NOT NULL, |
| object_data_key BLOB NOT NULL, |
| value_locale BLOB, |
| PRIMARY KEY (index_id, value), |
| FOREIGN KEY (index_id) REFERENCES object_store_index(id), |
| FOREIGN KEY (object_store_id, object_data_key) |
| REFERENCES object_data(object_store_id, key) |
| ) WITHOUT ROWID;"#; |
| conn.execute(UNIQUE_INDEX_DATA, [])?; |
| Ok(()) |
| } |