Files
Pit-Log-App/app/src/main/java/com/racingapp/pitlog/data/AppDatabase.kt
T

265 lines
11 KiB
Kotlin

package com.racingapp.pitlog.data
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
private val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE race_nights ADD COLUMN crossPercent REAL")
db.execSQL("ALTER TABLE race_nights ADD COLUMN springLf INTEGER")
db.execSQL("ALTER TABLE race_nights ADD COLUMN springRf INTEGER")
db.execSQL("ALTER TABLE race_nights ADD COLUMN springLr INTEGER")
db.execSQL("ALTER TABLE race_nights ADD COLUMN springRr INTEGER")
db.execSQL("ALTER TABLE race_nights ADD COLUMN camberLf REAL")
db.execSQL("ALTER TABLE race_nights ADD COLUMN camberRf REAL")
db.execSQL("ALTER TABLE race_nights ADD COLUMN casterLf REAL")
db.execSQL("ALTER TABLE race_nights ADD COLUMN casterRf REAL")
}
}
private val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE race_nights ADD COLUMN swayBarHole INTEGER")
}
}
private val MIGRATION_3_4 = object : Migration(3, 4) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE race_nights ADD COLUMN blockLr REAL")
db.execSQL("ALTER TABLE race_nights ADD COLUMN blockRr REAL")
}
}
private val MIGRATION_4_5 = object : Migration(4, 5) {
override fun migrate(db: SupportSQLiteDatabase) {
db.setForeignKeyConstraintsEnabled(false)
db.execSQL(
"""
CREATE TABLE race_nights_new (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
dateEpochDay INTEGER NOT NULL,
trackName TEXT NOT NULL,
seriesName TEXT NOT NULL,
carName TEXT NOT NULL,
raceClass TEXT NOT NULL,
discipline TEXT NOT NULL,
airTempF INTEGER,
notes TEXT NOT NULL,
createdAt INTEGER NOT NULL,
crossPercent REAL,
springLf INTEGER,
springRf INTEGER,
springLr INTEGER,
springRr INTEGER,
camberLf REAL,
camberRf REAL,
casterLf REAL,
casterRf REAL,
swayBarHole INTEGER,
blockLr REAL,
blockRr REAL
)
""".trimIndent(),
)
db.execSQL(
"""
INSERT INTO race_nights_new (
id, dateEpochDay, trackName, seriesName, carName, raceClass, discipline,
airTempF, notes, createdAt, crossPercent, springLf, springRf, springLr, springRr,
camberLf, camberRf, casterLf, casterRf, swayBarHole, blockLr, blockRr
)
SELECT
id, dateEpochDay, trackName, seriesName, carName, raceClass, discipline,
airTempF, notes, createdAt, crossPercent, springLf, springRf, springLr, springRr,
camberLf, camberRf, casterLf, casterRf, swayBarHole, blockLr, blockRr
FROM race_nights
""".trimIndent(),
)
db.execSQL("DROP TABLE race_nights")
db.execSQL("ALTER TABLE race_nights_new RENAME TO race_nights")
db.setForeignKeyConstraintsEnabled(true)
}
}
private val MIGRATION_5_6 = object : Migration(5, 6) {
override fun migrate(db: SupportSQLiteDatabase) {
db.setForeignKeyConstraintsEnabled(false)
db.execSQL(
"""
CREATE TABLE race_nights_new (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
dateEpochDay INTEGER NOT NULL,
trackName TEXT NOT NULL,
carName TEXT NOT NULL,
raceClass TEXT NOT NULL,
discipline TEXT NOT NULL,
airTempF INTEGER,
notes TEXT NOT NULL,
createdAt INTEGER NOT NULL,
crossPercent REAL,
springLf INTEGER,
springRf INTEGER,
springLr INTEGER,
springRr INTEGER,
camberLf REAL,
camberRf REAL,
casterLf REAL,
casterRf REAL,
swayBarHole INTEGER,
blockLr REAL,
blockRr REAL
)
""".trimIndent(),
)
db.execSQL(
"""
INSERT INTO race_nights_new (
id, dateEpochDay, trackName, carName, raceClass, discipline,
airTempF, notes, createdAt, crossPercent, springLf, springRf, springLr, springRr,
camberLf, camberRf, casterLf, casterRf, swayBarHole, blockLr, blockRr
)
SELECT
id, dateEpochDay, trackName, carName, raceClass, discipline,
airTempF, notes, createdAt, crossPercent, springLf, springRf, springLr, springRr,
camberLf, camberRf, casterLf, casterRf, swayBarHole, blockLr, blockRr
FROM race_nights
""".trimIndent(),
)
db.execSQL("DROP TABLE race_nights")
db.execSQL("ALTER TABLE race_nights_new RENAME TO race_nights")
db.setForeignKeyConstraintsEnabled(true)
}
}
private val MIGRATION_6_7 = object : Migration(6, 7) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"""
CREATE TABLE IF NOT EXISTS setup_sheets (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
recordedAt INTEGER NOT NULL,
note TEXT NOT NULL,
crossPercent REAL,
springLf INTEGER,
springRf INTEGER,
springLr INTEGER,
springRr INTEGER,
camberLf REAL,
camberRf REAL,
casterLf REAL,
casterRf REAL,
swayBarHole INTEGER,
blockLr REAL,
blockRr REAL,
toeFront REAL,
toeRear REAL
)
""".trimIndent(),
)
}
}
internal val MIGRATION_7_8 = object : Migration(7, 8) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE car_profile ADD COLUMN updatedAt INTEGER NOT NULL DEFAULT 0")
db.execSQL(
"""
UPDATE car_profile SET updatedAt = 1
WHERE carName != '1976 Chevy Camaro'
OR raceClass != 'Hobby Stock'
OR discipline != 'Oval'
""".trimIndent(),
)
addSyncColumns(db, "race_nights")
db.execSQL("UPDATE race_nights SET syncId = lower(hex(randomblob(16))) WHERE syncId = ''")
db.execSQL("UPDATE race_nights SET updatedAt = createdAt WHERE updatedAt = 0 AND createdAt != 0")
addSyncColumns(db, "setup_sheets")
db.execSQL("UPDATE setup_sheets SET syncId = lower(hex(randomblob(16))) WHERE syncId = ''")
db.execSQL("UPDATE setup_sheets SET updatedAt = recordedAt WHERE updatedAt = 0 AND recordedAt != 0")
db.execSQL("ALTER TABLE runs ADD COLUMN syncId TEXT NOT NULL DEFAULT ''")
db.execSQL("ALTER TABLE runs ADD COLUMN nightSyncId TEXT NOT NULL DEFAULT ''")
db.execSQL("ALTER TABLE runs ADD COLUMN updatedAt INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE runs ADD COLUMN deleted INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE runs ADD COLUMN pending INTEGER NOT NULL DEFAULT 1")
db.execSQL("UPDATE runs SET syncId = lower(hex(randomblob(16))) WHERE syncId = ''")
db.execSQL(
"""
UPDATE runs SET nightSyncId = (
SELECT race_nights.syncId FROM race_nights WHERE race_nights.id = runs.nightId
) WHERE nightSyncId = ''
""".trimIndent(),
)
db.execSQL("UPDATE runs SET updatedAt = recordedAt WHERE updatedAt = 0 AND recordedAt != 0")
}
private fun addSyncColumns(db: SupportSQLiteDatabase, table: String) {
db.execSQL("ALTER TABLE $table ADD COLUMN syncId TEXT NOT NULL DEFAULT ''")
db.execSQL("ALTER TABLE $table ADD COLUMN updatedAt INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE $table ADD COLUMN deleted INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE $table ADD COLUMN pending INTEGER NOT NULL DEFAULT 1")
}
}
internal val MIGRATION_8_9 = object : Migration(8, 9) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"""
CREATE TABLE IF NOT EXISTS cars (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
carName TEXT NOT NULL,
raceClass TEXT NOT NULL,
discipline TEXT NOT NULL,
token TEXT NOT NULL DEFAULT '',
updatedAt INTEGER NOT NULL DEFAULT 0,
syncRev INTEGER NOT NULL DEFAULT 0,
deleted INTEGER NOT NULL DEFAULT 0,
pending INTEGER NOT NULL DEFAULT 1
)
""".trimIndent(),
)
db.execSQL(
"""
INSERT INTO cars (carName, raceClass, discipline, token, updatedAt, syncRev, deleted, pending)
SELECT carName, raceClass, discipline, '', updatedAt, 0, 0, 1 FROM car_profile WHERE id = 1
""".trimIndent(),
)
db.execSQL("ALTER TABLE race_nights ADD COLUMN carId INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN carId INTEGER NOT NULL DEFAULT 0")
db.execSQL("UPDATE race_nights SET carId = (SELECT id FROM cars ORDER BY id LIMIT 1) WHERE carId = 0")
db.execSQL("UPDATE setup_sheets SET carId = (SELECT id FROM cars ORDER BY id LIMIT 1) WHERE carId = 0")
}
}
internal val MIGRATION_9_10 = object : Migration(9, 10) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN weightLf INTEGER")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN weightRf INTEGER")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN weightLr INTEGER")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN weightRr INTEGER")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN rideHeight REAL")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN pinion REAL")
db.execSQL("ALTER TABLE setup_sheets ADD COLUMN brakeFront REAL")
}
}
@Database(
entities = [RaceNight::class, RunLog::class, Car::class, SetupSheet::class],
version = 10,
exportSchema = false,
)
abstract class AppDatabase : RoomDatabase() {
abstract fun raceDao(): RaceDao
companion object {
fun create(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "pitlog.db")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9, MIGRATION_9_10)
.build()
}
}
}