1 parent
0421994fe6
commit
425ea7449b
138 files changed
+5705
-1012
No files matched your search
+79
-71
@@ -32,198 +32,204 @@ impl UserDb {
|
||||
}
|
||||
|
||||
const MIGRATIONS: &[(u32, &str)] = &[
|
||||
(1, include_str!("../../migrations/V001__initial_schema.sql")),
|
||||
(
|
||||
1,
|
||||
include_str!("../../migrations/sqlite/V001__initial_schema.sql"),
|
||||
),
|
||||
(
|
||||
2,
|
||||
include_str!("../../migrations/V002__folders_and_messages.sql"),
|
||||
include_str!("../../migrations/sqlite/V002__folders_and_messages.sql"),
|
||||
),
|
||||
(
|
||||
3,
|
||||
include_str!("../../migrations/sqlite/V003__add_date_epoch.sql"),
|
||||
),
|
||||
(3, include_str!("../../migrations/V003__add_date_epoch.sql")),
|
||||
(
|
||||
4,
|
||||
include_str!("../../migrations/V004__folder_messages_updated_at.sql"),
|
||||
include_str!("../../migrations/sqlite/V004__folder_messages_updated_at.sql"),
|
||||
),
|
||||
(
|
||||
5,
|
||||
include_str!("../../migrations/V005__drafts_and_attachments.sql"),
|
||||
include_str!("../../migrations/sqlite/V005__drafts_and_attachments.sql"),
|
||||
),
|
||||
(
|
||||
6,
|
||||
include_str!("../../migrations/V006__cache_attachments_and_headers.sql"),
|
||||
include_str!("../../migrations/sqlite/V006__cache_attachments_and_headers.sql"),
|
||||
),
|
||||
(
|
||||
7,
|
||||
include_str!("../../migrations/sqlite/V007__contacts.sql"),
|
||||
),
|
||||
(
|
||||
8,
|
||||
include_str!("../../migrations/sqlite/V008__identities.sql"),
|
||||
),
|
||||
(7, include_str!("../../migrations/V007__contacts.sql")),
|
||||
(8, include_str!("../../migrations/V008__identities.sql")),
|
||||
(
|
||||
9,
|
||||
include_str!("../../migrations/V009__notification_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V009__notification_preferences.sql"),
|
||||
),
|
||||
(
|
||||
10,
|
||||
include_str!("../../migrations/V010__contact_groups.sql"),
|
||||
include_str!("../../migrations/sqlite/V010__contact_groups.sql"),
|
||||
),
|
||||
(
|
||||
11,
|
||||
include_str!("../../migrations/V011__message_reaction.sql"),
|
||||
include_str!("../../migrations/sqlite/V011__message_reaction.sql"),
|
||||
),
|
||||
(12, include_str!("../../migrations/V012__tags.sql")),
|
||||
(12, include_str!("../../migrations/sqlite/V012__tags.sql")),
|
||||
(
|
||||
13,
|
||||
include_str!("../../migrations/V013__display_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V013__display_preferences.sql"),
|
||||
),
|
||||
(
|
||||
14,
|
||||
include_str!("../../migrations/V014__compose_format.sql"),
|
||||
include_str!("../../migrations/sqlite/V014__compose_format.sql"),
|
||||
),
|
||||
(
|
||||
15,
|
||||
include_str!("../../migrations/sqlite/V015__deep_index.sql"),
|
||||
),
|
||||
(
|
||||
16,
|
||||
include_str!("../../migrations/sqlite/V016__calendar.sql"),
|
||||
),
|
||||
(15, include_str!("../../migrations/V015__deep_index.sql")),
|
||||
(16, include_str!("../../migrations/V016__calendar.sql")),
|
||||
(
|
||||
17,
|
||||
include_str!("../../migrations/V017__add_email_theme.sql"),
|
||||
include_str!("../../migrations/sqlite/V017__add_email_theme.sql"),
|
||||
),
|
||||
(
|
||||
18,
|
||||
include_str!("../../migrations/V018__animation_mode.sql"),
|
||||
include_str!("../../migrations/sqlite/V018__animation_mode.sql"),
|
||||
),
|
||||
(
|
||||
19,
|
||||
include_str!("../../migrations/V019__known_addresses.sql"),
|
||||
include_str!("../../migrations/sqlite/V019__known_addresses.sql"),
|
||||
),
|
||||
(
|
||||
20,
|
||||
include_str!("../../migrations/V020__appearance_personalization.sql"),
|
||||
include_str!("../../migrations/sqlite/V020__appearance_personalization.sql"),
|
||||
),
|
||||
(
|
||||
21,
|
||||
include_str!("../../migrations/V021__special_folders.sql"),
|
||||
include_str!("../../migrations/sqlite/V021__special_folders.sql"),
|
||||
),
|
||||
(
|
||||
22,
|
||||
include_str!("../../migrations/V022__identity_options.sql"),
|
||||
include_str!("../../migrations/sqlite/V022__identity_options.sql"),
|
||||
),
|
||||
(
|
||||
23,
|
||||
include_str!("../../migrations/V023__saved_searches.sql"),
|
||||
include_str!("../../migrations/sqlite/V023__saved_searches.sql"),
|
||||
),
|
||||
(
|
||||
24,
|
||||
include_str!("../../migrations/V024__notification_dnd.sql"),
|
||||
include_str!("../../migrations/sqlite/V024__notification_dnd.sql"),
|
||||
),
|
||||
(
|
||||
25,
|
||||
include_str!("../../migrations/V025__custom_theme_colors.sql"),
|
||||
include_str!("../../migrations/sqlite/V025__custom_theme_colors.sql"),
|
||||
),
|
||||
(
|
||||
26,
|
||||
include_str!("../../migrations/V026__mail_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V026__mail_preferences.sql"),
|
||||
),
|
||||
(
|
||||
27,
|
||||
include_str!("../../migrations/V027__contact_profile.sql"),
|
||||
include_str!("../../migrations/sqlite/V027__contact_profile.sql"),
|
||||
),
|
||||
(
|
||||
28,
|
||||
include_str!("../../migrations/V028__contact_multi_values.sql"),
|
||||
include_str!("../../migrations/sqlite/V028__contact_multi_values.sql"),
|
||||
),
|
||||
(
|
||||
29,
|
||||
include_str!("../../migrations/V029__draft_send_options.sql"),
|
||||
include_str!("../../migrations/sqlite/V029__draft_send_options.sql"),
|
||||
),
|
||||
(
|
||||
30,
|
||||
include_str!("../../migrations/V030__folder_list_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V030__folder_list_preferences.sql"),
|
||||
),
|
||||
(
|
||||
31,
|
||||
include_str!("../../migrations/V031__compose_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V031__compose_preferences.sql"),
|
||||
),
|
||||
(
|
||||
32,
|
||||
include_str!("../../migrations/V032__advanced_appearance.sql"),
|
||||
include_str!("../../migrations/sqlite/V032__advanced_appearance.sql"),
|
||||
),
|
||||
(
|
||||
33,
|
||||
include_str!("../../migrations/V033__draft_compose_format.sql"),
|
||||
include_str!("../../migrations/sqlite/V033__draft_compose_format.sql"),
|
||||
),
|
||||
(
|
||||
34,
|
||||
include_str!("../../migrations/V034__imap_keyword_sync.sql"),
|
||||
include_str!("../../migrations/sqlite/V034__imap_keyword_sync.sql"),
|
||||
),
|
||||
(
|
||||
35,
|
||||
include_str!("../../migrations/V035__compose_behavior_preferences.sql"),
|
||||
include_str!("../../migrations/sqlite/V035__compose_behavior_preferences.sql"),
|
||||
),
|
||||
(
|
||||
36,
|
||||
include_str!("../../migrations/V036__remote_draft_tracking.sql"),
|
||||
include_str!("../../migrations/sqlite/V036__remote_draft_tracking.sql"),
|
||||
),
|
||||
(
|
||||
37,
|
||||
include_str!("../../migrations/V037__openpgp_keyring.sql"),
|
||||
include_str!("../../migrations/sqlite/V037__openpgp_keyring.sql"),
|
||||
),
|
||||
(
|
||||
38,
|
||||
include_str!("../../migrations/V038__identity_openpgp.sql"),
|
||||
include_str!("../../migrations/sqlite/V038__identity_openpgp.sql"),
|
||||
),
|
||||
(
|
||||
39,
|
||||
include_str!("../../migrations/V039__draft_openpgp_options.sql"),
|
||||
include_str!("../../migrations/sqlite/V039__draft_openpgp_options.sql"),
|
||||
),
|
||||
(
|
||||
40,
|
||||
include_str!("../../migrations/V040__draft_openpgp_attach_key.sql"),
|
||||
include_str!("../../migrations/sqlite/V040__draft_openpgp_attach_key.sql"),
|
||||
),
|
||||
(
|
||||
41,
|
||||
include_str!("../../migrations/V041__draft_openpgp_recipient_keys.sql"),
|
||||
include_str!("../../migrations/sqlite/V041__draft_openpgp_recipient_keys.sql"),
|
||||
),
|
||||
(
|
||||
42,
|
||||
include_str!("../../migrations/V042__trusted_senders.sql"),
|
||||
include_str!("../../migrations/sqlite/V042__trusted_senders.sql"),
|
||||
),
|
||||
(
|
||||
43,
|
||||
include_str!("../../migrations/V043__response_templates.sql"),
|
||||
include_str!("../../migrations/sqlite/V043__response_templates.sql"),
|
||||
),
|
||||
(
|
||||
44,
|
||||
include_str!("../../migrations/V044__interface_skin.sql"),
|
||||
include_str!("../../migrations/sqlite/V044__interface_skin.sql"),
|
||||
),
|
||||
(
|
||||
45,
|
||||
include_str!("../../migrations/V045__response_template_format.sql"),
|
||||
include_str!("../../migrations/sqlite/V045__response_template_format.sql"),
|
||||
),
|
||||
(
|
||||
46,
|
||||
include_str!("../../migrations/V046__preset_scale_unlock.sql"),
|
||||
include_str!("../../migrations/sqlite/V046__preset_scale_unlock.sql"),
|
||||
),
|
||||
];
|
||||
|
||||
fn run_migrations(conn: &Connection) -> Result<(), String> {
|
||||
let mut current: u32 = conn
|
||||
.query_row("PRAGMA user_version", [], |row| row.get(0))
|
||||
let current: u32 = conn
|
||||
.query_row(crate::queries::sqlite::queries::db_pool::Q_001, [], |row| {
|
||||
row.get(0)
|
||||
})
|
||||
.map_err(|e| format!("Failed to read user_version: {e}"))?;
|
||||
|
||||
let refinery_max: Option<u32> = conn
|
||||
.query_row(
|
||||
"SELECT MAX(version) FROM refinery_schema_history",
|
||||
[],
|
||||
|row| row.get(0),
|
||||
)
|
||||
.unwrap_or(None);
|
||||
|
||||
if let Some(v) = refinery_max
|
||||
&& v > current
|
||||
{
|
||||
current = v;
|
||||
conn.execute_batch(&format!("PRAGMA user_version = {current};"))
|
||||
.map_err(|e| format!("Failed to sync user_version from refinery: {e}"))?;
|
||||
}
|
||||
|
||||
for &(version, sql) in MIGRATIONS {
|
||||
if version > current {
|
||||
conn.execute_batch(sql)
|
||||
.map_err(|e| format!("Migration V{version:03} failed: {e}"))?;
|
||||
conn.execute_batch(&format!("PRAGMA user_version = {version};"))
|
||||
.map_err(|e| format!("Failed to set user_version to {version}: {e}"))?;
|
||||
conn.execute_batch(&crate::queries::sqlite::queries::db_pool::set_user_version(
|
||||
version,
|
||||
))
|
||||
.map_err(|e| format!("Failed to set user_version to {version}: {e}"))?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,10 +243,10 @@ pub fn open_user_db(data_dir: &str, user_hash: &str) -> Result<Connection, Strin
|
||||
let db_path = dir.join("db.sqlite");
|
||||
let conn = Connection::open(&db_path).map_err(|e| format!("Failed to open SQLite: {e}"))?;
|
||||
|
||||
conn.execute_batch("PRAGMA journal_mode=WAL;")
|
||||
conn.execute_batch(crate::queries::sqlite::queries::db_pool::Q_002)
|
||||
.map_err(|e| format!("Failed to set WAL mode: {e}"))?;
|
||||
|
||||
conn.execute_batch("PRAGMA foreign_keys=ON;")
|
||||
conn.execute_batch(crate::queries::sqlite::queries::db_pool::Q_003)
|
||||
.map_err(|e| format!("Failed to enable foreign keys: {e}"))?;
|
||||
|
||||
run_migrations(&conn)?;
|
||||
@@ -252,7 +258,7 @@ pub fn open_user_db(data_dir: &str, user_hash: &str) -> Result<Connection, Strin
|
||||
pub fn open_test_db() -> Connection {
|
||||
let conn = Connection::open_in_memory().expect("Failed to open in-memory SQLite");
|
||||
|
||||
conn.execute_batch("PRAGMA foreign_keys=ON;")
|
||||
conn.execute_batch(crate::queries::sqlite::queries::db_pool::Q_004)
|
||||
.expect("Failed to enable foreign keys");
|
||||
|
||||
run_migrations(&conn).expect("Test migrations failed");
|
||||
@@ -269,7 +275,7 @@ mod tests {
|
||||
let conn = open_test_db();
|
||||
|
||||
let tables: Vec<String> = conn
|
||||
.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
|
||||
.prepare(crate::queries::sqlite::queries::db_pool::Q_005)
|
||||
.unwrap()
|
||||
.query_map([], |row| row.get(0))
|
||||
.unwrap()
|
||||
@@ -294,7 +300,9 @@ mod tests {
|
||||
assert!(db_file.exists());
|
||||
|
||||
let fk: i32 = conn
|
||||
.query_row("PRAGMA foreign_keys", [], |row| row.get(0))
|
||||
.query_row(crate::queries::sqlite::queries::db_pool::Q_006, [], |row| {
|
||||
row.get(0)
|
||||
})
|
||||
.unwrap();
|
||||
assert_eq!(fk, 1);
|
||||
|
||||
|
||||
Reference in new issue
Block a user