diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/database/FlowCryptRoomDatabase.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/database/FlowCryptRoomDatabase.kt index f29e8c9e45..abd62b4bc5 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/database/FlowCryptRoomDatabase.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/database/FlowCryptRoomDatabase.kt @@ -94,96 +94,244 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { private val MIGRATION_1_3 = object : FlowCryptMigration(1, 3) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE messages ADD COLUMN is_message_has_attachments INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN is_enable INTEGER DEFAULT 1;") - database.execSQL("ALTER TABLE accounts ADD COLUMN is_active INTEGER DEFAULT 0;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN is_message_has_attachments INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN is_enable INTEGER DEFAULT 1;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN is_active INTEGER DEFAULT 0;" + ) } } private val MIGRATION_3_4 = object : FlowCryptMigration(3, 4) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE accounts ADD COLUMN username TEXT NOT NULL DEFAULT '';") - database.execSQL("ALTER TABLE accounts ADD COLUMN password TEXT NOT NULL DEFAULT '';") - database.execSQL("ALTER TABLE accounts ADD COLUMN imap_server TEXT NOT NULL DEFAULT '';") - database.execSQL("ALTER TABLE accounts ADD COLUMN imap_port INTEGER DEFAULT 143;") - database.execSQL("ALTER TABLE accounts ADD COLUMN imap_is_use_ssl_tls INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN imap_is_use_starttls INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN imap_auth_mechanisms TEXT;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_server TEXT NOT NULL DEFAULT '';") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_port INTEGER DEFAULT 25;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_is_use_ssl_tls INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_is_use_starttls INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_auth_mechanisms TEXT;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_is_use_custom_sign INTEGER DEFAULT 0;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_username TEXT DEFAULT NULL;") - database.execSQL("ALTER TABLE accounts ADD COLUMN smtp_password TEXT DEFAULT NULL;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN username TEXT NOT NULL DEFAULT '';" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN password TEXT NOT NULL DEFAULT '';" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN imap_server TEXT NOT NULL DEFAULT '';" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN imap_port INTEGER DEFAULT 143;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN imap_is_use_ssl_tls INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN imap_is_use_starttls INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN imap_auth_mechanisms TEXT;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_server TEXT NOT NULL DEFAULT '';" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_port INTEGER DEFAULT 25;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_is_use_ssl_tls INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_is_use_starttls INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_auth_mechanisms TEXT;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_is_use_custom_sign INTEGER DEFAULT 0;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_username TEXT DEFAULT NULL;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN smtp_password TEXT DEFAULT NULL;" + ) } } private val MIGRATION_4_5 = object : FlowCryptMigration(4, 5) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TABLE `accounts_aliases` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `account_type` TEXT NOT NULL, `send_as_email` TEXT NOT NULL, `display_name` TEXT DEFAULT NULL, `is_default` INTEGER DEFAULT 0, `verification_status` TEXT NOT NULL)") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS`email_account_type_send_as_email_in_accounts_aliases` ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)") + database.execSQL( + "CREATE TABLE `accounts_aliases` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`account_type` TEXT NOT NULL, " + + "`send_as_email` TEXT NOT NULL, " + + "`display_name` TEXT DEFAULT NULL, " + + "`is_default` INTEGER DEFAULT 0, " + + "`verification_status` TEXT NOT NULL)" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`email_account_type_send_as_email_in_accounts_aliases` " + + "ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)" + ) } } private val MIGRATION_5_6 = object : FlowCryptMigration(5, 6) { override fun doMigration(database: SupportSQLiteDatabase) { database.execSQL("DROP INDEX IF EXISTS email_account_type_in_accounts_aliases") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS`email_account_type_send_as_email_in_accounts_aliases` ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)") + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`email_account_type_send_as_email_in_accounts_aliases` " + + "ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)" + ) } } private val MIGRATION_6_7 = object : FlowCryptMigration(6, 7) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TABLE `action_queue` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `action_type` TEXT NOT NULL, `action_json` TEXT NOT NULL)") + database.execSQL( + "CREATE TABLE `action_queue` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`action_type` TEXT NOT NULL, " + + "`action_json` TEXT NOT NULL)" + ) } } private val MIGRATION_7_8 = object : FlowCryptMigration(7, 8) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE accounts ADD COLUMN ic_contacts_loaded INTEGER DEFAULT 0;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN ic_contacts_loaded INTEGER DEFAULT 0;" + ) } } private val MIGRATION_8_9 = object : FlowCryptMigration(8, 9) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE messages ADD COLUMN is_encrypted INTEGER DEFAULT -1;") - database.execSQL("ALTER TABLE messages ADD COLUMN cc_address TEXT DEFAULT NULL;") - database.execSQL("ALTER TABLE messages ADD COLUMN is_new INTEGER DEFAULT 0;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN is_encrypted INTEGER DEFAULT -1;" + ) + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN cc_address TEXT DEFAULT NULL;" + ) + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN is_new INTEGER DEFAULT 0;" + ) - database.execSQL("ALTER TABLE accounts ADD COLUMN is_show_only_encrypted INTEGER DEFAULT 0;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN is_show_only_encrypted INTEGER DEFAULT 0;" + ) - database.execSQL("CREATE TABLE user_id_emails_and_keys (_id INTEGER PRIMARY KEY AUTOINCREMENT, long_id TEXT NOT NULL, user_id_email TEXT NOT NULL )") - database.execSQL("CREATE UNIQUE INDEX long_id_user_id_email_in_user_id_emails_and_keys ON user_id_emails_and_keys (long_id, user_id_email)") - database.execSQL("INSERT INTO `action_queue` (email,action_type,action_json) VALUES ('system','fill_user_id_emails_keys_table','{\"email\":\"system\",\"id\":0,\"actionType\":\"FILL_USER_ID_EMAILS_KEYS_TABLE\",\"version\":0}');") + database.execSQL( + "CREATE TABLE user_id_emails_and_keys (" + + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "long_id TEXT NOT NULL, " + + "user_id_email TEXT NOT NULL )" + ) + database.execSQL( + "CREATE UNIQUE INDEX " + + "long_id_user_id_email_in_user_id_emails_and_keys " + + "ON user_id_emails_and_keys (long_id, user_id_email)" + ) + database.execSQL( + "INSERT INTO `action_queue` (" + + "email," + + "action_type," + + "action_json)" + + " VALUES (" + + "'system'," + + "'fill_user_id_emails_keys_table'," + + "'{\"email\":\"system\",\"id\":0,\"actionType\":\"FILL_USER_ID_EMAILS_KEYS_TABLE\",\"version\":0}');" + ) } } private val MIGRATION_9_10 = object : FlowCryptMigration(9, 10) { override fun doMigration(database: SupportSQLiteDatabase) { val tempTableName = "messages_temp" - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS $tempTableName AS SELECT * FROM messages;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS $tempTableName" + + " AS SELECT * FROM messages;" + ) database.execSQL("DROP TABLE IF EXISTS messages;") - database.execSQL("CREATE TABLE messages (_id INTEGER PRIMARY KEY AUTOINCREMENT, email VARCHAR(100) NOT NULL, folder TEXT NOT NULL, uid INTEGER NOT NULL, received_date INTEGER DEFAULT NULL, sent_date INTEGER DEFAULT NULL, from_address TEXT DEFAULT NULL, to_address TEXT DEFAULT NULL, cc_address TEXT DEFAULT NULL, subject TEXT DEFAULT NULL, flags TEXT DEFAULT NULL, raw_message_without_attachments TEXT DEFAULT NULL, is_message_has_attachments INTEGER DEFAULT 0, is_encrypted INTEGER DEFAULT -1, is_new INTEGER DEFAULT -1 )") + database.execSQL( + "CREATE TABLE messages (" + + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "email VARCHAR(100) NOT NULL, " + + "folder TEXT NOT NULL, " + + "uid INTEGER NOT NULL, " + + "received_date INTEGER DEFAULT NULL, " + + "sent_date INTEGER DEFAULT NULL, " + + "from_address TEXT DEFAULT NULL, " + + "to_address TEXT DEFAULT NULL, " + + "cc_address TEXT DEFAULT NULL, " + + "subject TEXT DEFAULT NULL, " + + "flags TEXT DEFAULT NULL, " + + "raw_message_without_attachments TEXT DEFAULT NULL, " + + "is_message_has_attachments INTEGER DEFAULT 0, " + + "is_encrypted INTEGER DEFAULT -1, " + + "is_new INTEGER DEFAULT -1 )" + ) database.execSQL("CREATE INDEX email_in_messages ON messages (email)") - database.execSQL("CREATE UNIQUE INDEX email_uid_folder_in_messages ON messages (email, uid, folder)") + database.execSQL( + "CREATE UNIQUE INDEX email_uid_folder_in_messages " + + "ON messages (email, uid, folder)" + ) database.execSQL("INSERT INTO messages SELECT * FROM $tempTableName;") database.execSQL("DROP TABLE IF EXISTS $tempTableName;") - database.execSQL("ALTER TABLE messages ADD COLUMN state INTEGER DEFAULT -1;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN state INTEGER DEFAULT -1;" + ) } } private val MIGRATION_10_11 = object : FlowCryptMigration(10, 11) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE attachment ADD COLUMN forwarded_folder TEXT;") - database.execSQL("ALTER TABLE attachment ADD COLUMN forwarded_uid INTEGER DEFAULT -1;") - database.execSQL("ALTER TABLE messages ADD COLUMN attachments_directory TEXT;") + database.execSQL( + "ALTER TABLE attachment " + + "ADD COLUMN forwarded_folder TEXT;" + ) + database.execSQL( + "ALTER TABLE attachment " + + "ADD COLUMN forwarded_uid INTEGER DEFAULT -1;" + ) + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN attachments_directory TEXT;" + ) } } private val MIGRATION_11_12 = object : FlowCryptMigration(11, 12) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE messages ADD COLUMN error_msg TEXT DEFAULT NULL;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN error_msg TEXT DEFAULT NULL;" + ) } } @@ -209,12 +357,35 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { val tempTableName = "attachment_temp" - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS $tempTableName AS SELECT * FROM attachment") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS $tempTableName " + + "AS SELECT * FROM attachment" + ) database.execSQL("DROP TABLE IF EXISTS attachment") - database.execSQL("CREATE TABLE `attachment` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `folder` TEXT NOT NULL, `uid` INTEGER NOT NULL, `name` TEXT NOT NULL, `encodedSize` INTEGER DEFAULT 0, `type` TEXT NOT NULL, `attachment_id` TEXT, `file_uri` TEXT, `forwarded_folder` TEXT, `forwarded_uid` INTEGER DEFAULT -1, `path` TEXT NOT NULL)") - database.execSQL("CREATE UNIQUE INDEX `email_uid_folder_path_in_attachment` ON `attachment` (`email`, `uid`, `folder`, `path`)") + database.execSQL( + "CREATE TABLE `attachment` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`folder` TEXT NOT NULL, " + + "`uid` INTEGER NOT NULL, " + + "`name` TEXT NOT NULL, " + + "`encodedSize` INTEGER DEFAULT 0, " + + "`type` TEXT NOT NULL, " + + "`attachment_id` TEXT, " + + "`file_uri` TEXT, " + + "`forwarded_folder` TEXT, " + + "`forwarded_uid` INTEGER DEFAULT -1, " + + "`path` TEXT NOT NULL)" + ) + database.execSQL( + "CREATE UNIQUE INDEX `email_uid_folder_path_in_attachment` " + + "ON `attachment` (`email`, `uid`, `folder`, `path`)" + ) - database.execSQL("INSERT INTO attachment SELECT *, 0 FROM $tempTableName") + database.execSQL( + "INSERT INTO attachment " + + "SELECT *, 0 FROM $tempTableName" + ) database.execSQL("DROP TABLE IF EXISTS $tempTableName") } } @@ -238,20 +409,32 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { private val MIGRATION_16_17 = object : FlowCryptMigration(16, 17) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE messages ADD COLUMN reply_to TEXT DEFAULT NULL;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN reply_to TEXT DEFAULT NULL;" + ) } } private val MIGRATION_17_18 = object : FlowCryptMigration(17, 18) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE accounts ADD COLUMN uuid TEXT DEFAULT NULL;") - database.execSQL("ALTER TABLE accounts ADD COLUMN domain_rules TEXT DEFAULT NULL;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN uuid TEXT DEFAULT NULL;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN domain_rules TEXT DEFAULT NULL;" + ) } } private val MIGRATION_18_19 = object : FlowCryptMigration(18, 19) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE accounts ADD COLUMN is_restore_access_required INTEGER DEFAULT 0;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN is_restore_access_required INTEGER DEFAULT 0;" + ) } } @@ -261,24 +444,91 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { //to prevent problems in users which have an app since database version = 9 or lower //(default value for 'is_new' should = -1) we have to recreate 'messages' table val tempTableMsgs = "messages_temp" - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS $tempTableMsgs AS SELECT * FROM messages;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS $tempTableMsgs " + + "AS SELECT * FROM messages;" + ) database.execSQL("DROP TABLE IF EXISTS messages;") - database.execSQL("CREATE TABLE messages (_id INTEGER PRIMARY KEY AUTOINCREMENT, email VARCHAR(100) NOT NULL, folder TEXT NOT NULL, uid INTEGER NOT NULL, received_date INTEGER DEFAULT NULL, sent_date INTEGER DEFAULT NULL, from_address TEXT DEFAULT NULL, to_address TEXT DEFAULT NULL, cc_address TEXT DEFAULT NULL, subject TEXT DEFAULT NULL, flags TEXT DEFAULT NULL, raw_message_without_attachments TEXT DEFAULT NULL, is_message_has_attachments INTEGER DEFAULT 0, is_encrypted INTEGER DEFAULT -1, is_new INTEGER DEFAULT -1 , state INTEGER DEFAULT -1, attachments_directory TEXT, error_msg TEXT DEFAULT NULL, reply_to TEXT DEFAULT NULL)") - database.execSQL("CREATE INDEX email_in_messages ON messages (email)") - database.execSQL("CREATE UNIQUE INDEX email_uid_folder_in_messages ON messages (email, uid, folder)") - database.execSQL("INSERT INTO messages SELECT * FROM $tempTableMsgs;") + database.execSQL( + "CREATE TABLE messages (" + + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "email VARCHAR(100) NOT NULL, " + + "folder TEXT NOT NULL, " + + "uid INTEGER NOT NULL, " + + "received_date INTEGER DEFAULT NULL, " + + "sent_date INTEGER DEFAULT NULL, " + + "from_address TEXT DEFAULT NULL, " + + "to_address TEXT DEFAULT NULL, " + + "cc_address TEXT DEFAULT NULL, " + + "subject TEXT DEFAULT NULL, " + + "flags TEXT DEFAULT NULL, " + + "raw_message_without_attachments TEXT DEFAULT NULL, " + + "is_message_has_attachments INTEGER DEFAULT 0, " + + "is_encrypted INTEGER DEFAULT -1, " + + "is_new INTEGER DEFAULT -1 , " + + "state INTEGER DEFAULT -1, " + + "attachments_directory TEXT, " + + "error_msg TEXT DEFAULT NULL, " + + "reply_to TEXT DEFAULT NULL)" + ) + database.execSQL( + "CREATE INDEX email_in_messages " + + "ON messages (email)" + ) + database.execSQL( + "CREATE UNIQUE INDEX email_uid_folder_in_messages " + + "ON messages (email, uid, folder)" + ) + database.execSQL( + "INSERT INTO messages " + + "SELECT * FROM $tempTableMsgs;" + ) database.execSQL("DROP TABLE IF EXISTS $tempTableMsgs;") //recreate 'contacts' table because of wrong column type BOOLEAN - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS contacts_temp AS SELECT * FROM contacts;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS contacts_temp " + + "AS SELECT * FROM contacts;" + ) database.execSQL("DROP TABLE IF EXISTS contacts;") - database.execSQL("CREATE TABLE IF NOT EXISTS contacts (_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL, name TEXT DEFAULT NULL, public_key BLOB DEFAULT NULL, has_pgp INTEGER NOT NULL, client TEXT DEFAULT NULL, attested INTEGER DEFAULT NULL, fingerprint TEXT DEFAULT NULL, long_id TEXT DEFAULT NULL, keywords TEXT DEFAULT NULL, last_use INTEGER DEFAULT 0 NOT NULL);") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS email_in_contacts ON contacts (email);") - database.execSQL("CREATE INDEX IF NOT EXISTS name_in_contacts ON contacts (name);") - database.execSQL("CREATE INDEX IF NOT EXISTS has_pgp_in_contacts ON contacts (has_pgp);") - database.execSQL("CREATE INDEX IF NOT EXISTS long_id_in_contacts ON contacts (long_id);") - database.execSQL("CREATE INDEX IF NOT EXISTS last_use_in_contacts ON contacts (last_use);") - database.execSQL("INSERT INTO contacts SELECT * FROM contacts_temp;") + database.execSQL( + "CREATE TABLE IF NOT EXISTS contacts (" + + "_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " + + "email TEXT NOT NULL, " + + "name TEXT DEFAULT NULL, " + + "public_key BLOB DEFAULT NULL, " + + "has_pgp INTEGER NOT NULL, " + + "client TEXT DEFAULT NULL, " + + "attested INTEGER DEFAULT NULL, " + + "fingerprint TEXT DEFAULT NULL, " + + "long_id TEXT DEFAULT NULL, " + + "keywords TEXT DEFAULT NULL, " + + "last_use INTEGER DEFAULT 0 NOT NULL);" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS email_in_contacts " + + "ON contacts (email);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS name_in_contacts " + + "ON contacts (name);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS has_pgp_in_contacts " + + "ON contacts (has_pgp);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS long_id_in_contacts " + + "ON contacts (long_id);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS last_use_in_contacts " + + "ON contacts (last_use);" + ) + database.execSQL( + "INSERT INTO contacts " + + "SELECT * FROM contacts_temp;" + ) database.execSQL("DROP TABLE IF EXISTS contacts_temp;") //Recreate 'attachment' table to use an ability of foreign keys @@ -290,12 +540,41 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { ) val tempTableAtts = "attachment_temp" - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS $tempTableAtts AS SELECT * FROM attachment;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS $tempTableAtts " + + "AS SELECT * FROM attachment;" + ) database.execSQL("DROP TABLE IF EXISTS attachment;") - database.execSQL("CREATE TABLE `attachment` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `folder` TEXT NOT NULL, `uid` INTEGER NOT NULL, `name` TEXT NOT NULL, `encodedSize` INTEGER DEFAULT 0, `type` TEXT NOT NULL, `attachment_id` TEXT, `file_uri` TEXT, `forwarded_folder` TEXT, `forwarded_uid` INTEGER DEFAULT -1, `path` TEXT NOT NULL, FOREIGN KEY(`email`, `folder`, `uid`) REFERENCES `messages`(`email`, `folder`, `uid`) ON UPDATE NO ACTION ON DELETE CASCADE );") - database.execSQL("CREATE UNIQUE INDEX `email_uid_folder_path_in_attachment` ON `attachment` (`email`, `uid`, `folder`, `path`);") - database.execSQL("CREATE INDEX `email_folder_uid_in_attachment` ON `attachment` (`email`, `folder`, `uid`);") - database.execSQL("INSERT INTO attachment SELECT * FROM $tempTableAtts;") + database.execSQL( + "CREATE TABLE `attachment` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`folder` TEXT NOT NULL, " + + "`uid` INTEGER NOT NULL, " + + "`name` TEXT NOT NULL, " + + "`encodedSize` INTEGER DEFAULT 0, " + + "`type` TEXT NOT NULL, " + + "`attachment_id` TEXT, " + + "`file_uri` TEXT, " + + "`forwarded_folder` TEXT, " + + "`forwarded_uid` INTEGER DEFAULT -1, " + + "`path` TEXT NOT NULL, " + + "FOREIGN KEY(`email`, `folder`, `uid`) " + + "REFERENCES `messages`(`email`, `folder`, `uid`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE );" + ) + database.execSQL( + "CREATE UNIQUE INDEX `email_uid_folder_path_in_attachment` " + + "ON `attachment` (`email`, `uid`, `folder`, `path`);" + ) + database.execSQL( + "CREATE INDEX `email_folder_uid_in_attachment` " + + "ON `attachment` (`email`, `folder`, `uid`);" + ) + database.execSQL( + "INSERT INTO attachment " + + "SELECT * FROM $tempTableAtts;" + ) database.execSQL("DROP TABLE IF EXISTS $tempTableAtts;") } } @@ -305,8 +584,24 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { override fun doMigration(database: SupportSQLiteDatabase) { //Recreate 'accounts_aliases' table to use an ability of foreign keys database.execSQL("DROP TABLE IF EXISTS `accounts_aliases`;") - database.execSQL("CREATE TABLE `accounts_aliases` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `account_type` TEXT NOT NULL, `send_as_email` TEXT NOT NULL, `display_name` TEXT DEFAULT NULL, `is_default` INTEGER DEFAULT 0, `verification_status` TEXT NOT NULL, FOREIGN KEY(`email`, `account_type`) REFERENCES `accounts`(`email`, `account_type`) ON UPDATE NO ACTION ON DELETE CASCADE )") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS`email_account_type_send_as_email_in_accounts_aliases` ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)") + database.execSQL( + "CREATE TABLE `accounts_aliases` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`account_type` TEXT NOT NULL, " + + "`send_as_email` TEXT NOT NULL, " + + "`display_name` TEXT DEFAULT NULL, " + + "`is_default` INTEGER DEFAULT 0, " + + "`verification_status` TEXT NOT NULL, " + + "FOREIGN KEY(`email`, `account_type`) " + + "REFERENCES `accounts`(`email`, `account_type`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE )" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`email_account_type_send_as_email_in_accounts_aliases` " + + "ON `accounts_aliases` (`email`, `account_type`, `send_as_email`)" + ) } } @@ -314,15 +609,49 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { val MIGRATION_21_22 = object : FlowCryptMigration(21, 22) { override fun doMigration(database: SupportSQLiteDatabase) { //recreate 'contacts' table because of wrong '_id' column - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS contacts_temp AS SELECT * FROM contacts;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS contacts_temp " + + "AS SELECT * FROM contacts;" + ) database.execSQL("DROP TABLE IF EXISTS contacts;") - database.execSQL("CREATE TABLE `contacts` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `name` TEXT DEFAULT NULL, `public_key` BLOB DEFAULT NULL, `has_pgp` INTEGER NOT NULL, `client` TEXT DEFAULT NULL, `attested` INTEGER DEFAULT NULL, `fingerprint` TEXT DEFAULT NULL, `long_id` TEXT DEFAULT NULL, `keywords` TEXT DEFAULT NULL, `last_use` INTEGER NOT NULL DEFAULT 0)") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `email_in_contacts` ON `contacts` (`email`)") - database.execSQL("CREATE INDEX IF NOT EXISTS name_in_contacts ON contacts (name);") - database.execSQL("CREATE INDEX IF NOT EXISTS has_pgp_in_contacts ON contacts (has_pgp);") - database.execSQL("CREATE INDEX IF NOT EXISTS long_id_in_contacts ON contacts (long_id);") - database.execSQL("CREATE INDEX IF NOT EXISTS last_use_in_contacts ON contacts (last_use);") - database.execSQL("INSERT INTO contacts SELECT * FROM contacts_temp;") + database.execSQL( + "CREATE TABLE `contacts` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`name` TEXT DEFAULT NULL, " + + "`public_key` BLOB DEFAULT NULL, " + + "`has_pgp` INTEGER NOT NULL, " + + "`client` TEXT DEFAULT NULL, " + + "`attested` INTEGER DEFAULT NULL, " + + "`fingerprint` TEXT DEFAULT NULL, " + + "`long_id` TEXT DEFAULT NULL, " + + "`keywords` TEXT DEFAULT NULL, " + + "`last_use` INTEGER NOT NULL DEFAULT 0)" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS `email_in_contacts` " + + "ON `contacts` (`email`)" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS name_in_contacts " + + "ON contacts (name);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS has_pgp_in_contacts " + + "ON contacts (has_pgp);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS long_id_in_contacts " + + "ON contacts (long_id);" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS last_use_in_contacts " + + "ON contacts (last_use);" + ) + database.execSQL( + "INSERT INTO contacts " + + "SELECT * FROM contacts_temp;" + ) database.execSQL("DROP TABLE IF EXISTS contacts_temp;") } } @@ -334,15 +663,54 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { val MIGRATION_22_23 = object : FlowCryptMigration(22, 23) { override fun doMigration(database: SupportSQLiteDatabase) { //create temp table with existed content - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS keys_temp AS SELECT * FROM keys;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS keys_temp " + + "AS SELECT * FROM keys;" + ) //drop old table database.execSQL("DROP TABLE IF EXISTS keys;") //create a new table 'keys' with additional fields: 'account', 'account_type' - database.execSQL("CREATE TABLE IF NOT EXISTS `keys` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `long_id` TEXT NOT NULL, `account` TEXT NOT NULL, `account_type` TEXT DEFAULT NULL, `source` TEXT NOT NULL, `public_key` BLOB NOT NULL, `private_key` BLOB NOT NULL, `passphrase` TEXT DEFAULT NULL, FOREIGN KEY(`account`, `account_type`) REFERENCES `accounts`(`email`, `account_type`) ON UPDATE NO ACTION ON DELETE CASCADE )") + database.execSQL( + "CREATE TABLE IF NOT EXISTS `keys` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`long_id` TEXT NOT NULL, " + + "`account` TEXT NOT NULL, " + + "`account_type` TEXT DEFAULT NULL, " + + "`source` TEXT NOT NULL, " + + "`public_key` BLOB NOT NULL, " + + "`private_key` BLOB NOT NULL, " + + "`passphrase` TEXT DEFAULT NULL, " + + "FOREIGN KEY(`account`, `account_type`) " + + "REFERENCES `accounts`(`email`, `account_type`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE )" + ) //create indices for new table - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `long_id_account_account_type_in_keys` ON `keys` (`long_id`, `account`, `account_type`)") - //fill new keys table with combination of existed keys and existed accounts using JOIN instruction - database.execSQL("INSERT INTO keys(long_id, account, account_type, source, public_key, private_key, passphrase) SELECT K.long_id, A.email, A.account_type, K.source, K.public_key, K.private_key, K.passphrase FROM keys_temp as K JOIN accounts as A;") + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`long_id_account_account_type_in_keys` " + + "ON `keys` (`long_id`, `account`, `account_type`)" + ) + //fill new keys table with combination of existing keys + //and existing accounts using JOIN instruction + database.execSQL( + "INSERT INTO keys(" + + "long_id, " + + "account, " + + "account_type, " + + "source, " + + "public_key, " + + "private_key, " + + "passphrase) " + + "SELECT " + + "K.long_id, " + + "A.email, " + + "A.account_type, " + + "K.source, " + + "K.public_key, " + + "K.private_key, " + + "K.passphrase " + + "FROM keys_temp as K JOIN accounts as A;" + ) //drop temp table database.execSQL("DROP TABLE IF EXISTS keys_temp;") @@ -350,7 +718,10 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { database.execSQL("DROP TABLE IF EXISTS user_id_emails_and_keys;") //remove unused actions - database.execSQL("DELETE FROM action_queue WHERE action_type = 'fill_user_id_emails_keys_table'") + database.execSQL( + "DELETE FROM action_queue " + + "WHERE action_type = 'fill_user_id_emails_keys_table'" + ) } } @@ -361,11 +732,39 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { val MIGRATION_23_24 = object : FlowCryptMigration(23, 24) { override fun doMigration(database: SupportSQLiteDatabase) { database.execSQL("DROP TABLE IF EXISTS imap_labels;") - database.execSQL("CREATE TABLE IF NOT EXISTS `labels` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `account_type` TEXT DEFAULT NULL, `name` TEXT NOT NULL, `alias` TEXT DEFAULT NULL, `is_custom` INTEGER NOT NULL DEFAULT 0, `messages_total` INTEGER NOT NULL DEFAULT 0, `message_unread` INTEGER NOT NULL DEFAULT 0, `attributes` TEXT DEFAULT NULL, `next_page_token` TEXT DEFAULT NULL, `history_id` TEXT DEFAULT NULL, FOREIGN KEY(`email`, `account_type`) REFERENCES `accounts`(`email`, `account_type`) ON UPDATE NO ACTION ON DELETE CASCADE )") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `email_account_type_name_in_labels` ON `labels` (`email`, `account_type`, `name`)") - database.execSQL("ALTER TABLE messages ADD COLUMN thread_id TEXT DEFAULT NULL;") - database.execSQL("ALTER TABLE messages ADD COLUMN history_id TEXT DEFAULT NULL;") - database.execSQL("ALTER TABLE accounts ADD COLUMN use_api INTEGER NOT NULL DEFAULT 0;") + database.execSQL( + "CREATE TABLE IF NOT EXISTS `labels` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`account_type` TEXT DEFAULT NULL, " + + "`name` TEXT NOT NULL, " + + "`alias` TEXT DEFAULT NULL, " + + "`is_custom` INTEGER NOT NULL DEFAULT 0, " + + "`messages_total` INTEGER NOT NULL DEFAULT 0, " + + "`message_unread` INTEGER NOT NULL DEFAULT 0, " + + "`attributes` TEXT DEFAULT NULL, " + + "`next_page_token` TEXT DEFAULT NULL, " + + "`history_id` TEXT DEFAULT NULL, " + + "FOREIGN KEY(`email`, `account_type`) " + + "REFERENCES `accounts`(`email`, `account_type`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE )" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`email_account_type_name_in_labels` ON `labels` (`email`, `account_type`, `name`)" + ) + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN thread_id TEXT DEFAULT NULL;" + ) + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN history_id TEXT DEFAULT NULL;" + ) + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN use_api INTEGER NOT NULL DEFAULT 0;" + ) } } @@ -373,15 +772,47 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { val MIGRATION_24_25 = object : FlowCryptMigration(24, 25) { override fun doMigration(database: SupportSQLiteDatabase) { //create temp table with existed content - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS keys_temp AS SELECT * FROM keys;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS keys_temp " + + "AS SELECT * FROM keys;" + ) //drop old table database.execSQL("DROP TABLE IF EXISTS keys;") //create a new table 'keys' with 'fingerprint' instead of 'long_id' - database.execSQL("CREATE TABLE IF NOT EXISTS `keys` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `fingerprint` TEXT NOT NULL, `account` TEXT NOT NULL, `account_type` TEXT DEFAULT NULL, `source` TEXT NOT NULL, `public_key` BLOB NOT NULL, `private_key` BLOB NOT NULL, `passphrase` TEXT DEFAULT NULL, `passphrase_type` INTEGER NOT NULL DEFAULT 0, FOREIGN KEY(`account`, `account_type`) REFERENCES `accounts`(`email`, `account_type`) ON UPDATE NO ACTION ON DELETE CASCADE )") + database.execSQL( + "CREATE TABLE IF NOT EXISTS `keys` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`fingerprint` TEXT NOT NULL, " + + "`account` TEXT NOT NULL, " + + "`account_type` TEXT DEFAULT NULL, " + + "`source` TEXT NOT NULL, " + + "`public_key` BLOB NOT NULL, " + + "`private_key` BLOB NOT NULL, " + + "`passphrase` TEXT DEFAULT NULL, " + + "`passphrase_type` INTEGER NOT NULL DEFAULT 0, " + + "FOREIGN KEY(`account`, `account_type`) " + + "REFERENCES `accounts`(`email`, `account_type`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE )" + ) //create indices for new table - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `fingerprint_account_account_type_in_keys` ON `keys` (`fingerprint`, `account`, `account_type`)") + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`fingerprint_account_account_type_in_keys` " + + "ON `keys` (`fingerprint`, `account`, `account_type`)" + ) //fill new keys table with existed data. Later we will update fingerprints - database.execSQL("INSERT INTO keys(_id, fingerprint, account, account_type, source, public_key, private_key, passphrase) SELECT * FROM keys_temp;") + database.execSQL( + "INSERT INTO keys(" + + "_id, " + + "fingerprint, " + + "account, " + + "account_type, " + + "source, " + + "public_key, " + + "private_key, " + + "passphrase) " + + "SELECT * FROM keys_temp;" + ) //drop temp table database.execSQL("DROP TABLE IF EXISTS keys_temp;") @@ -523,21 +954,65 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { @VisibleForTesting val MIGRATION_26_27 = object : FlowCryptMigration(26, 27) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("CREATE TEMP TABLE IF NOT EXISTS contacts_temp AS SELECT * FROM contacts;") + database.execSQL( + "CREATE TEMP TABLE IF NOT EXISTS " + + "contacts_temp AS SELECT * FROM contacts;" + ) //create `recipients` table - database.execSQL("CREATE TABLE IF NOT EXISTS `recipients` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `email` TEXT NOT NULL, `name` TEXT DEFAULT NULL, `last_use` INTEGER NOT NULL DEFAULT 0)") - database.execSQL("CREATE INDEX IF NOT EXISTS `name_in_recipients` ON `recipients` (`name`)") - database.execSQL("CREATE INDEX IF NOT EXISTS `last_use_in_recipients` ON `recipients` (`last_use`)") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `email_in_recipients` ON `recipients` (`email`)") - database.execSQL("INSERT INTO recipients(email, name, last_use) SELECT email, name, last_use FROM contacts_temp") + database.execSQL( + "CREATE TABLE IF NOT EXISTS `recipients` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`email` TEXT NOT NULL, " + + "`name` TEXT DEFAULT NULL, " + + "`last_use` INTEGER NOT NULL DEFAULT 0)" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS `name_in_recipients` " + + "ON `recipients` (`name`)" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS `last_use_in_recipients` " + + "ON `recipients` (`last_use`)" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS `email_in_recipients` " + + "ON `recipients` (`email`)" + ) + database.execSQL( + "INSERT INTO recipients(email, name, last_use) " + + "SELECT email, name, last_use FROM contacts_temp" + ) //create `public_keys` table - database.execSQL("CREATE TABLE IF NOT EXISTS `public_keys` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `recipient` TEXT NOT NULL, `fingerprint` TEXT NOT NULL, `public_key` BLOB NOT NULL, FOREIGN KEY(`recipient`) REFERENCES `recipients`(`email`) ON UPDATE NO ACTION ON DELETE CASCADE )") - database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `recipient_fingerprint_in_public_keys` ON `public_keys` (`recipient`, `fingerprint`)") - database.execSQL("CREATE INDEX IF NOT EXISTS `recipient_in_public_keys` ON `public_keys` (`recipient`)") - database.execSQL("CREATE INDEX IF NOT EXISTS `fingerprint_in_public_keys` ON `public_keys` (`fingerprint`)") - database.execSQL("INSERT INTO public_keys(recipient, fingerprint, public_key) SELECT email, fingerprint, public_key FROM contacts_temp WHERE contacts_temp.public_key NOT NULL AND contacts_temp.fingerprint NOT NULL") + database.execSQL( + "CREATE TABLE IF NOT EXISTS `public_keys` (" + + "`_id` INTEGER PRIMARY KEY AUTOINCREMENT, " + + "`recipient` TEXT NOT NULL, " + + "`fingerprint` TEXT NOT NULL, " + + "`public_key` BLOB NOT NULL, " + + "FOREIGN KEY(`recipient`) " + + "REFERENCES `recipients`(`email`) " + + "ON UPDATE NO ACTION ON DELETE CASCADE )" + ) + database.execSQL( + "CREATE UNIQUE INDEX IF NOT EXISTS " + + "`recipient_fingerprint_in_public_keys` ON `public_keys` (`recipient`, `fingerprint`)" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS `recipient_in_public_keys` " + + "ON `public_keys` (`recipient`)" + ) + database.execSQL( + "CREATE INDEX IF NOT EXISTS `fingerprint_in_public_keys` " + + "ON `public_keys` (`fingerprint`)" + ) + database.execSQL( + "INSERT INTO public_keys(recipient, fingerprint, public_key) " + + "SELECT email, fingerprint, public_key " + + "FROM contacts_temp " + + "WHERE contacts_temp.public_key NOT NULL AND contacts_temp.fingerprint NOT NULL" + ) //delete unused tables database.execSQL("DROP TABLE IF EXISTS contacts_temp;") @@ -548,21 +1023,30 @@ abstract class FlowCryptRoomDatabase : RoomDatabase() { @VisibleForTesting val MIGRATION_27_28 = object : FlowCryptMigration(27, 28) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE attachment ADD COLUMN decrypt_when_forward INTEGER NOT NULL DEFAULT 0;") + database.execSQL( + "ALTER TABLE attachment " + + "ADD COLUMN decrypt_when_forward INTEGER NOT NULL DEFAULT 0;" + ) } } @VisibleForTesting val MIGRATION_28_29 = object : FlowCryptMigration(28, 29) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE messages ADD COLUMN password BLOB DEFAULT NULL;") + database.execSQL( + "ALTER TABLE messages " + + "ADD COLUMN password BLOB DEFAULT NULL;" + ) } } @VisibleForTesting val MIGRATION_29_30 = object : FlowCryptMigration(29, 30) { override fun doMigration(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE accounts ADD COLUMN use_fes INTEGER NOT NULL DEFAULT 0;") + database.execSQL( + "ALTER TABLE accounts " + + "ADD COLUMN use_fes INTEGER NOT NULL DEFAULT 0;" + ) } } diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/LabelDao.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/LabelDao.kt index 581b570d45..050fb40f24 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/LabelDao.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/LabelDao.kt @@ -23,10 +23,16 @@ import com.flowcrypt.email.database.entity.LabelEntity */ @Dao interface LabelDao : BaseDao { - @Query("SELECT * FROM labels WHERE email = :account AND account_type = :accountType AND name = :label") + @Query( + "SELECT * FROM labels " + + "WHERE email = :account AND account_type = :accountType AND name = :label" + ) suspend fun getLabelSuspend(account: String, accountType: String?, label: String): LabelEntity? - @Query("SELECT * FROM labels WHERE email = :account AND account_type = :accountType AND name = :label") + @Query( + "SELECT * FROM labels " + + "WHERE email = :account AND account_type = :accountType AND name = :label" + ) fun getLabel(account: String, accountType: String?, label: String): LabelEntity? @Query("SELECT * FROM labels WHERE email = :account AND account_type = :accountType") diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/MessageDao.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/MessageDao.kt index c80583d4a1..b6161c8fe1 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/MessageDao.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/MessageDao.kt @@ -51,36 +51,50 @@ abstract class MessageDao : BaseDao { account: String, folder: String, msgsID: Collection? - ): - List + ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder AND is_new = 1 ORDER BY :orderBy") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder AND is_new = 1 ORDER BY :orderBy" + ) abstract fun getNewMsgs( account: String, folder: String, orderBy: String = "received_date ASC" ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder AND is_new = 1 ORDER BY :orderBy") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder AND is_new = 1 ORDER BY :orderBy" + ) abstract suspend fun getNewMsgsSuspend( account: String, folder: String, orderBy: String = "received_date ASC" ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder AND uid IN (:msgsUID)") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder AND uid IN (:msgsUID)" + ) abstract fun getMsgsByUids( account: String?, folder: String?, msgsUID: Collection? ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder AND uid IN (:msgsUID)") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder AND uid IN (:msgsUID)" + ) abstract suspend fun getMsgsByUidsSuspend( account: String?, folder: String?, msgsUID: Collection? ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder ORDER BY received_date DESC") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder ORDER BY received_date DESC" + ) abstract fun getMessagesDataSourceFactory( account: String, folder: String @@ -122,20 +136,29 @@ abstract class MessageDao : BaseDao { label: String = JavaEmailConstants.FOLDER_OUTBOX ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :label AND state IN (:msgStates)") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :label AND state IN (:msgStates)" + ) abstract fun getOutboxMsgsByStates( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, msgStates: Collection ): List - @Query("SELECT * FROM messages WHERE email = :account AND folder = :label AND state IN (:msgStates)") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :label AND state IN (:msgStates)" + ) abstract suspend fun getOutboxMsgsByStatesSuspend( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, msgStates: Collection ): List - @Query("DELETE FROM messages WHERE email = :email AND folder = :label AND uid = :uid AND (state NOT IN (:msgStates) OR state IS NULL)") + @Query( + "DELETE FROM messages WHERE email = :email " + + "AND folder = :label AND uid = :uid AND (state NOT IN (:msgStates) OR state IS NULL)" + ) abstract suspend fun deleteOutgoingMsg( email: String?, label: String?, uid: Long?, msgStates: Collection = listOf( @@ -145,7 +168,10 @@ abstract class MessageDao : BaseDao { ) ): Int - @Query("SELECT COUNT(*) FROM messages WHERE email = :account AND folder = :label AND (state IN (:msgStates) OR state IS NULL)") + @Query( + "SELECT COUNT(*) FROM messages WHERE email = :account " + + "AND folder = :label AND (state IN (:msgStates) OR state IS NULL)" + ) abstract fun getFailedOutgoingMsgsCount( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, @@ -161,7 +187,10 @@ abstract class MessageDao : BaseDao { ) ): Int - @Query("SELECT COUNT(*) FROM messages WHERE email = :account AND folder = :label AND (state IN (:msgStates) OR state IS NULL)") + @Query( + "SELECT COUNT(*) FROM messages WHERE email = :account " + + "AND folder = :label AND (state IN (:msgStates) OR state IS NULL)" + ) abstract suspend fun getFailedOutgoingMsgsCountSuspend( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, @@ -186,7 +215,10 @@ abstract class MessageDao : BaseDao { @Query("SELECT max(uid) FROM messages WHERE email = :account AND folder = :folder") abstract fun getLastUIDOfMsgForLabel(account: String?, folder: String?): Int - @Query("SELECT * FROM messages WHERE email = :account AND folder = :folder ORDER BY uid DESC LIMIT 1") + @Query( + "SELECT * FROM messages " + + "WHERE email = :account AND folder = :folder ORDER BY uid DESC LIMIT 1" + ) abstract suspend fun getNewestMsg(account: String?, folder: String?): MessageEntity? @Query("SELECT max(uid) FROM messages WHERE email = :account AND folder = :folder") @@ -208,7 +240,10 @@ abstract class MessageDao : BaseDao { * @param label The label name. * @return The list of UID of selected messages in the database for some label. */ - @Query("SELECT uid FROM messages WHERE email = :account AND folder = :label AND is_encrypted = -1") + @Query( + "SELECT uid FROM messages " + + "WHERE email = :account AND folder = :label AND is_encrypted = -1" + ) abstract suspend fun getNotCheckedUIDs(account: String?, label: String): List /** @@ -218,7 +253,10 @@ abstract class MessageDao : BaseDao { * @param label The label name. * @return The list of UID and flags of all unseen messages in the database for some label. */ - @Query("SELECT uid FROM messages WHERE email = :account AND folder = :label AND flags NOT LIKE '%\\SEEN'") + @Query( + "SELECT uid FROM messages " + + "WHERE email = :account AND folder = :label AND flags NOT LIKE '%\\SEEN'" + ) abstract fun getUIDOfUnseenMsgs(account: String?, label: String): List /** @@ -230,20 +268,32 @@ abstract class MessageDao : BaseDao { * @param newValues The new value. * @return The count of the changed rows or -1 up. */ - @Query("UPDATE messages SET state=:newValues WHERE email = :account AND folder = :label AND state = :oldValue") + @Query( + "UPDATE messages SET state=:newValues " + + "WHERE email = :account AND folder = :label AND state = :oldValue" + ) abstract fun changeMsgsState(account: String?, label: String?, oldValue: Int, newValues: Int): Int - @Query("UPDATE messages SET state=:newValue WHERE email = :account AND folder = :label") + @Query( + "UPDATE messages SET state=:newValue " + + "WHERE email = :account AND folder = :label" + ) abstract fun changeMsgsState(account: String?, label: String?, newValue: Int? = null): Int - @Query("UPDATE messages SET state=:newValue WHERE email = :account AND folder = :label") + @Query( + "UPDATE messages SET state=:newValue " + + "WHERE email = :account AND folder = :label" + ) abstract suspend fun changeMsgsStateSuspend( account: String?, label: String?, newValue: Int? = null ): Int - @Query("UPDATE messages SET state=:newValues WHERE email = :account AND folder = :label AND state = :oldValue") + @Query( + "UPDATE messages SET state=:newValues " + + "WHERE email = :account AND folder = :label AND state = :oldValue" + ) abstract suspend fun changeMsgsStateSuspend( account: String?, label: String?, oldValue: Int, newValues: Int @@ -254,7 +304,10 @@ abstract class MessageDao : BaseDao { * * @param account The email that the message linked */ - @Query("UPDATE messages SET state=2 WHERE email = :account AND folder = :label AND state =:oldValue") + @Query( + "UPDATE messages SET state=2 " + + "WHERE email = :account AND folder = :label AND state =:oldValue" + ) abstract fun resetMsgsWithSendingState( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, @@ -266,7 +319,10 @@ abstract class MessageDao : BaseDao { * * @param account The email that the message linked */ - @Query("UPDATE messages SET state=2 WHERE email = :account AND folder = :label AND state =:oldValue") + @Query( + "UPDATE messages SET state=2 " + + "WHERE email = :account AND folder = :label AND state =:oldValue" + ) abstract suspend fun resetMsgsWithSendingStateSuspend( account: String?, label: String = JavaEmailConstants.FOLDER_OUTBOX, @@ -305,7 +361,10 @@ abstract class MessageDao : BaseDao { stateValue: Int ): List - @Query("UPDATE messages SET is_new = 0 WHERE email = :account AND folder = :label AND uid IN (:uidList)") + @Query( + "UPDATE messages SET is_new = 0 " + + "WHERE email = :account AND folder = :label AND uid IN (:uidList)" + ) abstract suspend fun markMsgsAsOld( account: String?, label: String?, @@ -400,7 +459,7 @@ abstract class MessageDao : BaseDao { */ @Transaction open fun getMapOfUIDAndMsgFlags(email: String, label: String): Map { - return getUIDAndFlagsPairs(email, label).map { it.uid to it.flags }.toMap() + return getUIDAndFlagsPairs(email, label).associate { it.uid to it.flags } } /** @@ -413,7 +472,7 @@ abstract class MessageDao : BaseDao { @Transaction open suspend fun getMapOfUIDAndMsgFlagsSuspend(email: String, label: String): Map = withContext(Dispatchers.IO) { - return@withContext getUIDAndFlagsPairsSuspend(email, label).map { it.uid to it.flags }.toMap() + return@withContext getUIDAndFlagsPairsSuspend(email, label).associate { it.uid to it.flags } } /** diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/RecipientDao.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/RecipientDao.kt index 40e458c17c..11fe170d35 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/RecipientDao.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/database/dao/RecipientDao.kt @@ -30,13 +30,26 @@ interface RecipientDao : BaseDao { @Query("SELECT * FROM recipients") fun getAllRecipientsLD(): LiveData> - @Query("SELECT recipients.* FROM recipients INNER JOIN public_keys ON recipients.email = public_keys.recipient GROUP BY recipients.email ORDER BY recipients._id") + @Query( + "SELECT recipients.* FROM recipients INNER JOIN public_keys " + + "ON recipients.email = public_keys.recipient " + + "GROUP BY recipients.email ORDER BY recipients._id" + ) fun getAllRecipientsWithPgpFlow(): Flow> - @Query("SELECT recipients.* FROM recipients INNER JOIN public_keys ON recipients.email = public_keys.recipient GROUP BY recipients.email ORDER BY recipients._id") + @Query( + "SELECT recipients.* FROM recipients INNER JOIN public_keys " + + "ON recipients.email = public_keys.recipient " + + "GROUP BY recipients.email ORDER BY recipients._id" + ) suspend fun getAllRecipientsWithPgp(): List - @Query("SELECT recipients.* FROM recipients INNER JOIN public_keys ON recipients.email = public_keys.recipient WHERE (email LIKE :searchPattern OR name LIKE :searchPattern) GROUP BY recipients.email ORDER BY recipients._id") + @Query( + "SELECT recipients.* FROM recipients INNER JOIN public_keys " + + "ON recipients.email = public_keys.recipient " + + "WHERE (email LIKE :searchPattern OR name LIKE :searchPattern) " + + "GROUP BY recipients.email ORDER BY recipients._id" + ) suspend fun getAllRecipientsWithPgpWhichMatched(searchPattern: String): List @Query("SELECT * FROM recipients WHERE email = :email") @@ -58,7 +71,8 @@ interface RecipientDao : BaseDao { @Transaction @Query("SELECT * FROM recipients WHERE email IN (:emails)") - suspend fun getRecipientsWithPubKeysByEmailsSuspend(emails: Collection): List + suspend fun getRecipientsWithPubKeysByEmailsSuspend(emails: Collection): + List @Query("SELECT * FROM recipients WHERE email LIKE :searchPattern ORDER BY last_use DESC") fun getFilteredCursor(searchPattern: String): Cursor?