Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9932ed3b authored by cketti's avatar cketti
Browse files

Move "extra values" code from K9BackendStorage to MessageStore

parent 3dd7d1b6
Loading
Loading
Loading
Loading
+4 −51
Original line number Diff line number Diff line
package com.fsck.k9.mailstore

import android.content.ContentValues
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import androidx.core.database.getStringOrNull
import com.fsck.k9.backend.api.BackendFolder
import com.fsck.k9.backend.api.BackendFolderUpdater
import com.fsck.k9.backend.api.BackendStorage
@@ -31,64 +28,20 @@ class K9BackendStorage(
    }

    override fun getExtraString(name: String): String? {
        return database.execute(false) { db ->
            val cursor = db.query(
                "account_extra_values",
                arrayOf("value_text"),
                "name = ?",
                arrayOf(name),
                null, null, null
            )
            cursor.use {
                if (it.moveToFirst()) {
                    it.getStringOrNull(0)
                } else {
                    null
                }
            }
        }
        return messageStore.getExtraString(name)
    }

    override fun setExtraString(name: String, value: String) {
        database.execute(false) { db ->
            val contentValues = ContentValues().apply {
                put("name", name)
                put("value_text", value)
            }
            db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE)
        }
        messageStore.setExtraString(name, value)
    }

    override fun getExtraNumber(name: String): Long? {
        return database.execute(false) { db ->
            val cursor = db.query(
                "account_extra_values",
                arrayOf("value_integer"),
                "name = ?",
                arrayOf(name),
                null, null, null
            )
            cursor.use {
                if (it.moveToFirst()) {
                    it.getLongOrNull(0)
                } else {
                    null
                }
            }
        }
        return messageStore.getExtraNumber(name)
    }

    override fun setExtraNumber(name: String, value: Long) {
        database.execute(false) { db ->
            val contentValues = ContentValues().apply {
                put("name", name)
                put("value_integer", value)
            }
            db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE)
        messageStore.setExtraNumber(name, value)
    }
    }

    private fun Cursor.getLongOrNull(columnIndex: Int): Long? = if (isNull(columnIndex)) null else getLong(columnIndex)

    private inner class K9BackendFolderUpdater : BackendFolderUpdater {
        init {
+22 −0
Original line number Diff line number Diff line
@@ -107,4 +107,26 @@ interface MessageStore {
     * Update the notification class of a folder.
     */
    fun setNotificationClass(folderId: Long, folderClass: FolderClass)

    /**
     * Retrieve a string property by name.
     *
     * For everything that doesn't fit into existing structures this message store offers a generic key/value store.
     */
    fun getExtraString(name: String): String?

    /**
     * Create or update a string property.
     */
    fun setExtraString(name: String, value: String)

    /**
     * Retrieve a number property by name.
     */
    fun getExtraNumber(name: String): Long?

    /**
     * Create or update a number property.
     */
    fun setExtraNumber(name: String, value: Long)
}
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ dependencies {
    api "org.koin:koin-core:${versions.koin}"

    implementation project(":app:core")
    implementation "androidx.core:core-ktx:${versions.androidxCore}"
    implementation "com.jakewharton.timber:timber:${versions.timber}"
    implementation "org.apache.james:apache-mime4j-core:${versions.mime4j}"
    implementation "com.squareup.moshi:moshi:${versions.moshi}"
+17 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore {
    private val retrieveMessageOperations = RetrieveMessageOperations(database)
    private val retrieveFolderOperations = RetrieveFolderOperations(database)
    private val updateFolderOperations = UpdateFolderOperations(database)
    private val keyValueStoreOperations = KeyValueStoreOperations(database)

    override fun moveMessage(messageId: Long, destinationFolderId: Long): Long {
        return moveMessageOperations.moveMessage(messageId, destinationFolderId).also {
@@ -82,4 +83,20 @@ class K9MessageStore(private val localStore: LocalStore) : MessageStore {
    override fun setNotificationClass(folderId: Long, folderClass: FolderClass) {
        updateFolderOperations.setNotificationClass(folderId, folderClass)
    }

    override fun getExtraString(name: String): String? {
        return keyValueStoreOperations.getExtraString(name)
    }

    override fun setExtraString(name: String, value: String) {
        keyValueStoreOperations.setExtraString(name, value)
    }

    override fun getExtraNumber(name: String): Long? {
        return keyValueStoreOperations.getExtraNumber(name)
    }

    override fun setExtraNumber(name: String, value: Long) {
        keyValueStoreOperations.setExtraNumber(name, value)
    }
}
+65 −0
Original line number Diff line number Diff line
package com.fsck.k9.storage.messages

import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import androidx.core.database.getLongOrNull
import androidx.core.database.getStringOrNull
import com.fsck.k9.mailstore.LockableDatabase

internal class KeyValueStoreOperations(private val lockableDatabase: LockableDatabase) {
    fun getExtraString(name: String): String? {
        return lockableDatabase.execute(false) { db ->
            db.query(
                "account_extra_values",
                arrayOf("value_text"),
                "name = ?",
                arrayOf(name),
                null, null, null
            ).use { cursor ->
                if (cursor.moveToFirst()) {
                    cursor.getStringOrNull(0)
                } else {
                    null
                }
            }
        }
    }

    fun setExtraString(name: String, value: String) {
        lockableDatabase.execute(false) { db ->
            val contentValues = ContentValues().apply {
                put("name", name)
                put("value_text", value)
            }
            db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE)
        }
    }

    fun getExtraNumber(name: String): Long? {
        return lockableDatabase.execute(false) { db ->
            db.query(
                "account_extra_values",
                arrayOf("value_integer"),
                "name = ?",
                arrayOf(name),
                null, null, null
            ).use { cursor ->
                if (cursor.moveToFirst()) {
                    cursor.getLongOrNull(0)
                } else {
                    null
                }
            }
        }
    }

    fun setExtraNumber(name: String, value: Long) {
        lockableDatabase.execute(false) { db ->
            val contentValues = ContentValues().apply {
                put("name", name)
                put("value_integer", value)
            }
            db.insertWithOnConflict("account_extra_values", null, contentValues, SQLiteDatabase.CONFLICT_REPLACE)
        }
    }
}
Loading