v0.1.0
RustBox CI / rustbox (push) Canceled after 0s

This commit is contained in:
Mateusz Gruszczyński committed 2026-10-30 17:22:17 +01:00
1 parent 0421994fe6
commit 425ea7449b
138 files changed
+5705 -1012

No files matched your search

+79 -71
View File
@@ -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);