bitsy-wallet/app/src/main/java/cy/agorise/bitsybitshareswallet/database/BitsyDatabase.kt

98 lines
4.5 KiB
Kotlin

package cy.agorise.bitsybitshareswallet.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import cy.agorise.bitsybitshareswallet.database.daos.*
import cy.agorise.bitsybitshareswallet.database.entities.*
import cy.agorise.bitsybitshareswallet.database.joins.BalanceDetailDao
import cy.agorise.bitsybitshareswallet.database.joins.TransferDetailDao
@Database(entities = [
Asset::class,
Authority::class,
Balance::class,
EquivalentValue::class,
Transfer::class,
UserAccount::class,
Merchant::class,
Teller::class,
Node::class
],
version = 5,
exportSchema = true)
abstract class BitsyDatabase : RoomDatabase() {
abstract fun assetDao(): AssetDao
abstract fun authorityDao(): AuthorityDao
abstract fun balanceDao(): BalanceDao
abstract fun equivalentValueDao(): EquivalentValueDao
abstract fun transferDao(): TransferDao
abstract fun userAccountDao(): UserAccountDao
abstract fun balanceDetailDao(): BalanceDetailDao
abstract fun transferDetailDao(): TransferDetailDao
abstract fun merchantDao(): MerchantDao
abstract fun tellerDao(): TellerDao
abstract fun nodeDao(): NodeDao
companion object {
// To make sure there is always only one instance of the database open
@Volatile
private var INSTANCE: BitsyDatabase? = null
internal fun getDatabase(context: Context): BitsyDatabase? {
if (INSTANCE == null) {
synchronized(BitsyDatabase::class.java) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
BitsyDatabase::class.java, "BiTSyWallet.db"
).addMigrations(MIGRATION_1_2)
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.addMigrations(MIGRATION_4_5)
.build()
}
}
return INSTANCE
}
private val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS 'merchants' ('id' TEXT NOT NULL PRIMARY KEY, 'name' TEXT NOT NULL, 'address' TEXT, 'lat' REAL NOT NULL, 'lon' REAL NOT NULL, 'phone' TEXT, 'telegram' TEXT, 'website' TEXT)")
database.execSQL("CREATE TABLE IF NOT EXISTS 'tellers' ('id' TEXT NOT NULL PRIMARY KEY, 'name' TEXT NOT NULL, 'address' TEXT, 'lat' REAL NOT NULL, 'lon' REAL NOT NULL, 'phone' TEXT, 'telegram' TEXT, 'website' TEXT)")
}
}
val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("DROP TABLE 'equivalent_values'")
database.execSQL("CREATE TABLE IF NOT EXISTS 'equivalent_values' ('transfer_id' TEXT NOT NULL, 'value' INTEGER NOT NULL, 'symbol' TEXT NOT NULL, PRIMARY KEY(transfer_id, symbol), FOREIGN KEY (transfer_id) REFERENCES transfers(id))")
database.execSQL("ALTER TABLE transfers ADD bts_value INTEGER")
database.execSQL("UPDATE transfers SET bts_value = transfer_amount WHERE transfer_asset_id = '1.3.0'")
database.execSQL("UPDATE transfers SET bts_value = -1 WHERE transfer_asset_id != '1.3.0'")
database.execSQL("DROP TABLE assets")
database.execSQL("CREATE TABLE IF NOT EXISTS assets (`id` TEXT NOT NULL, `symbol` TEXT NOT NULL, `precision` INTEGER NOT NULL, `description` TEXT NOT NULL, `issuer` TEXT NOT NULL, PRIMARY KEY(`id`))")
}
}
private val MIGRATION_3_4 = object : Migration(3,4) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("DROP TABLE tellers")
database.execSQL("CREATE TABLE IF NOT EXISTS tellers (id TEXT NOT NULL PRIMARY KEY, name TEXT NOT NULL, address TEXT, lat REAL NOT NULL, lon REAL NOT NULL, phone TEXT, telegram TEXT, keybase TEXT, whatsapp TEXT, viber TEXT, email TEXT, website TEXT)")
}
}
private val MIGRATION_4_5 = object : Migration(4,5) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS nodes (url TEXT NOT NULL PRIMARY KEY, latency INTEGER NOT NULL, last_update INTEGER NOT NULL)")
}
}
}
}