265 lines
11 KiB
Kotlin
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()
|
|
}
|
|
}
|
|
}
|