From f1770744dbd07998f8ccd9fb79c1c4699cc29f47 Mon Sep 17 00:00:00 2001 From: Cilly Leang Date: Sat, 2 May 2026 02:31:18 +1000 Subject: [PATCH] refactor(core): switch from room to sqldelight sqldelight provides far more control over the sql and allows me to make more optimisations such as removing generated rowid etc. sql also just looks better than the annotation hell from room. --- build.gradle.kts | 1 + core/build.gradle.kts | 15 - core/data/client/build.gradle.kts | 2 +- .../banksia/core/data/ClientDataDiModule.kt | 4 +- .../repositories/ClientRouteRepository.kt | 1 + .../data/repositories/ClientStopRepository.kt | 1 + .../sources/route/RouteLocalDataSource.kt | 23 +- .../data/sources/stop/StopLocalDataSource.kt | 24 +- .../stoptime/StopTimeLocalDataSource.kt | 27 +- core/data/server/build.gradle.kts | 1 - .../1.json | 72 --- .../10.json | 477 ----------------- .../11.json | 498 ------------------ .../2.json | 315 ----------- .../3.json | 339 ------------ .../4.json | 368 ------------- .../5.json | 368 ------------- .../6.json | 368 ------------- .../7.json | 415 --------------- .../8.json | 426 --------------- .../9.json | 426 --------------- .../core/room/DatabaseManager.android.kt | 22 - .../moe/lava/banksia/core/room/Database.kt | 83 --- .../lava/banksia/core/room/RoomDiModule.kt | 18 - .../core/room/converter/RouteTypeConverter.kt | 12 - .../core/room/converter/ShapePathConverter.kt | 43 -- .../lava/banksia/core/room/dao/RouteDao.kt | 58 -- .../lava/banksia/core/room/dao/ServiceDao.kt | 29 - .../core/room/dao/ServiceExceptionDao.kt | 29 - .../lava/banksia/core/room/dao/ShapeDao.kt | 26 - .../moe/lava/banksia/core/room/dao/StopDao.kt | 42 -- .../lava/banksia/core/room/dao/StopTimeDao.kt | 46 -- .../moe/lava/banksia/core/room/dao/TripDao.kt | 32 -- .../core/room/dao/VersionMetadataDao.kt | 27 - .../banksia/core/room/entity/RouteEntity.kt | 18 - .../banksia/core/room/entity/ServiceEntity.kt | 31 -- .../room/entity/ServiceExceptionEntity.kt | 28 - .../banksia/core/room/entity/ShapeEntity.kt | 19 - .../banksia/core/room/entity/StopEntity.kt | 36 -- .../core/room/entity/StopTimeEntity.kt | 53 -- .../banksia/core/room/entity/TripEntity.kt | 49 -- .../core/room/entity/VersionMetadataEntity.kt | 19 - .../banksia/core/room/DatabaseManager.ios.kt | 8 - .../banksia/core/room/DatabaseManager.jvm.kt | 69 --- core/{room => sqld}/build.gradle.kts | 36 +- .../core/sqld/DatabaseManager.android.kt | 14 + .../banksia/core/sqld}/DatabaseManager.kt | 4 +- .../lava/banksia/core/sqld/SqldDiModule.kt | 16 + .../lava/banksia/core/sqld/mappers/Route.kt | 14 + .../lava/banksia/core/sqld/mappers/Service.kt | 21 + .../core/sqld/mappers/ServiceException.kt | 17 + .../lava/banksia/core/sqld/mappers/Shape.kt | 52 ++ .../lava/banksia/core/sqld/mappers/Stop.kt | 26 + .../banksia/core/sqld/mappers/StopTime.kt | 25 + .../lava/banksia/core/sqld/mappers/Trip.kt | 32 ++ .../moe/lava/banksia/core/sqld/Route.sq | 15 + .../moe/lava/banksia/core/sqld/Service.sq | 11 + .../banksia/core/sqld/ServiceException.sq | 9 + .../moe/lava/banksia/core/sqld/Shape.sq | 7 + .../moe/lava/banksia/core/sqld/Stop.sq | 54 ++ .../moe/lava/banksia/core/sqld/StopTime.sq | 23 + .../moe/lava/banksia/core/sqld/Trip.sq | 15 + .../banksia/core/sqld/DatabaseManager.ios.kt | 10 + .../banksia/core/sqld/DatabaseManager.jvm.kt | 58 ++ .../moe/lava/banksia/core/model/Stop.kt | 4 +- .../moe/lava/banksia/core/model/Trip.kt | 6 +- gradle/libs.versions.toml | 11 +- server/build.gradle.kts | 4 +- .../lava/banksia/server/gtfs/GtfsParser.kt | 16 +- .../moe/lava/banksia/server/Application.kt | 60 +-- .../moe/lava/banksia/server/GtfsDataFixer.kt | 22 +- .../moe/lava/banksia/server/GtfsImporter.kt | 82 +-- .../lava/banksia/server/di/ServerModules.kt | 4 +- settings.gradle.kts | 2 +- 74 files changed, 601 insertions(+), 5037 deletions(-) delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/1.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/10.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/11.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/2.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/3.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/4.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/5.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/6.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/7.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/8.json delete mode 100644 core/room/schemas/moe.lava.banksia.core.room.Database/9.json delete mode 100644 core/room/src/androidMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.android.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/Database.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/RoomDiModule.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/RouteTypeConverter.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/ShapePathConverter.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/RouteDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceExceptionDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ShapeDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopTimeDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/TripDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/VersionMetadataDao.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/RouteEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceExceptionEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ShapeEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopTimeEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/TripEntity.kt delete mode 100644 core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/VersionMetadataEntity.kt delete mode 100644 core/room/src/iosMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.ios.kt delete mode 100644 core/room/src/jvmMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.jvm.kt rename core/{room => sqld}/build.gradle.kts (55%) create mode 100644 core/sqld/src/androidMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.android.kt rename core/{room/src/commonMain/kotlin/moe/lava/banksia/core/room => sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld}/DatabaseManager.kt (58%) create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/SqldDiModule.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Route.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Service.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/ServiceException.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Shape.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Stop.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/StopTime.kt create mode 100644 core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Trip.kt create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Route.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Service.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/ServiceException.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Shape.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Stop.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/StopTime.sq create mode 100644 core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Trip.sq create mode 100644 core/sqld/src/iosMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.ios.kt create mode 100644 core/sqld/src/jvmMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.jvm.kt diff --git a/build.gradle.kts b/build.gradle.kts index 0687328..9434477 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.composeCompiler) apply false alias(libs.plugins.kotlinJvm) apply false alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.sqldelight) apply false alias(libs.plugins.wire) apply false } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 99f7156..3dd2ee6 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -4,12 +4,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) alias(libs.plugins.androidMultiplatformLibrary) - alias(libs.plugins.ksp) - alias(libs.plugins.room) -} - -room { - schemaDirectory("$projectDir/schemas") } kotlin { @@ -46,18 +40,9 @@ kotlin { implementation(libs.kotlinx.datetime) implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.protobuf) - implementation(libs.room.runtime) - implementation(libs.sqlite.bundled) } iosMain.dependencies { implementation(libs.ktor.client.darwin) } } } - -dependencies { - add("kspAndroid", libs.room.compiler) - add("kspIosArm64", libs.room.compiler) - add("kspIosSimulatorArm64", libs.room.compiler) - add("kspJvm", libs.room.compiler) -} diff --git a/core/data/client/build.gradle.kts b/core/data/client/build.gradle.kts index e9848f3..c6d5e5d 100644 --- a/core/data/client/build.gradle.kts +++ b/core/data/client/build.gradle.kts @@ -45,7 +45,7 @@ kotlin { implementation(libs.kotlinx.serialization.protobuf) implementation(projects.core) - implementation(projects.core.room) + implementation(projects.core.sqld) } iosMain.dependencies { implementation(libs.ktor.client.darwin) diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt index 01e961c..2cbfcaa 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/ClientDataDiModule.kt @@ -20,7 +20,7 @@ import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource import moe.lava.banksia.core.data.sources.stoptime.StopTimeLocalDataSource import moe.lava.banksia.core.data.sources.stoptime.StopTimeRemoteDataSource -import moe.lava.banksia.core.room.roomDiModule +import moe.lava.banksia.core.sqld.sqldDiModule import moe.lava.banksia.core.util.log import moe.lava.banksia.data.ptv.PtvService import org.koin.core.module.dsl.singleOf @@ -28,7 +28,7 @@ import org.koin.dsl.bind import org.koin.dsl.module val clientDataDiModule = module { - includes(roomDiModule) + includes(sqldDiModule) // HTTP Clients singleOf(::PtvService) diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt index 70a8905..467399a 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientRouteRepository.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import moe.lava.banksia.core.data.sources.route.RouteLocalDataSource import moe.lava.banksia.core.data.sources.route.RouteRemoteDataSource +import moe.lava.banksia.core.sqld.mappers.asModel internal class ClientRouteRepository internal constructor( private val local: RouteLocalDataSource, diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt index a5fd300..0aee84e 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/repositories/ClientStopRepository.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import moe.lava.banksia.core.data.sources.stop.StopLocalDataSource import moe.lava.banksia.core.data.sources.stop.StopRemoteDataSource +import moe.lava.banksia.core.sqld.mappers.asModel internal class ClientStopRepository internal constructor( private val local: StopLocalDataSource, diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt index ca267c3..8e6af0e 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/route/RouteLocalDataSource.kt @@ -1,11 +1,22 @@ package moe.lava.banksia.core.data.sources.route +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext import moe.lava.banksia.core.model.Route -import moe.lava.banksia.core.room.dao.RouteDao -import moe.lava.banksia.core.room.entity.asEntity +import moe.lava.banksia.core.sqld.RouteQueries +import moe.lava.banksia.core.sqld.mappers.asDb -internal class RouteLocalDataSource(private val dao: RouteDao) { - suspend fun get(id: String) = dao.get(id) - suspend fun getAll() = dao.getAll() - suspend fun save(vararg routes: Route) = dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray()) +internal class RouteLocalDataSource(private val queries: RouteQueries) { + suspend fun get(id: String) = withContext(Dispatchers.IO) { queries.get(id).executeAsOneOrNull() } + suspend fun getAll() = withContext(Dispatchers.IO) { queries.getAll().executeAsList() } + suspend fun save(vararg routes: Route) { + withContext(Dispatchers.IO) { + queries.transaction { + routes.forEach { + queries.insert(it.asDb()) + } + } + } + } } diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt index 8e0d8ab..524d123 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stop/StopLocalDataSource.kt @@ -1,12 +1,22 @@ package moe.lava.banksia.core.data.sources.stop +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext import moe.lava.banksia.core.model.Stop -import moe.lava.banksia.core.room.dao.RouteDao -import moe.lava.banksia.core.room.dao.StopDao -import moe.lava.banksia.core.room.entity.asEntity +import moe.lava.banksia.core.sqld.StopQueries +import moe.lava.banksia.core.sqld.mappers.asDb -internal class StopLocalDataSource(private val dao: StopDao, private val routeDao: RouteDao) { - suspend fun get(id: String) = dao.get(id) - suspend fun getByRoute(id: String) = routeDao.stops(id) - suspend fun save(vararg stops: Stop) = dao.insertOrReplaceAll(*stops.map { it.asEntity() }.toTypedArray()) +internal class StopLocalDataSource(private val queries: StopQueries) { + suspend fun get(id: String) = withContext(Dispatchers.IO) { queries.get(id).executeAsOneOrNull() } + suspend fun getByRoute(id: String) = withContext(Dispatchers.IO) { queries.getByRoute(id).executeAsList() } + suspend fun save(vararg stops: Stop) { + withContext(Dispatchers.IO) { + queries.transaction { + stops.forEach { + queries.insert(it.asDb()) + } + } + } + } } diff --git a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt index c5ce4e7..78ca64b 100644 --- a/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt +++ b/core/data/client/src/commonMain/kotlin/moe/lava/banksia/core/data/sources/stoptime/StopTimeLocalDataSource.kt @@ -1,28 +1,35 @@ package moe.lava.banksia.core.data.sources.stoptime +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext import kotlinx.datetime.LocalDate import kotlinx.datetime.TimeZone import kotlinx.datetime.todayIn import moe.lava.banksia.core.model.StopTimeDated import moe.lava.banksia.core.model.atDate -import moe.lava.banksia.core.room.dao.StopTimeDao +import moe.lava.banksia.core.sqld.StopTimeQueries +import moe.lava.banksia.core.sqld.mappers.asModel import moe.lava.banksia.core.util.serialise import kotlin.time.Clock internal class StopTimeLocalDataSource( - private val stopTimeDao: StopTimeDao, + private val queries: StopTimeQueries, ) { suspend fun getAtStop( stopId: String, date: LocalDate = Clock.System.todayIn(TimeZone.currentSystemDefault()), ): List { - return stopTimeDao - .getForStopDated( - stopId, - listOf(date.dayOfWeek).serialise(), - date.toEpochDays().toInt(), - ) - .map { it.asModel().atDate(date) } - .sortedBy { it.departureTime } + return withContext(Dispatchers.IO) { + queries + .getForStopDated( + listOf(date.dayOfWeek).serialise().toLong(), + date.toEpochDays(), + stopId, + ) + .executeAsList() + .map { it.asModel().atDate(date) } + .sortedBy { it.departureTime } + } } } diff --git a/core/data/server/build.gradle.kts b/core/data/server/build.gradle.kts index eaa309b..d2296d7 100644 --- a/core/data/server/build.gradle.kts +++ b/core/data/server/build.gradle.kts @@ -17,5 +17,4 @@ dependencies { api(projects.core.data) implementation(projects.core) - implementation(projects.core.room) } diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/1.json b/core/room/schemas/moe.lava.banksia.core.room.Database/1.json deleted file mode 100644 index 037062e..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/1.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 1, - "identityHash": "e536f5a9b1408377bcc449195169648c", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e536f5a9b1408377bcc449195169648c')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/10.json b/core/room/schemas/moe.lava.banksia.core.room.Database/10.json deleted file mode 100644 index 751e946..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/10.json +++ /dev/null @@ -1,477 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 10, - "identityHash": "5b90bc800bfae6d22124ea0a6a906ca7", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Service", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `days` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "days", - "columnName": "days", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "start", - "columnName": "start", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "end", - "columnName": "end", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Service_days", - "unique": false, - "columnNames": [ - "days" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Service_days` ON `${TABLE_NAME}` (`days`)" - } - ] - }, - { - "tableName": "ServiceException", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serviceId` TEXT NOT NULL, `date` INTEGER NOT NULL, `type` INTEGER NOT NULL, PRIMARY KEY(`serviceId`, `date`))", - "fields": [ - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "date", - "columnName": "date", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "serviceId", - "date" - ] - }, - "indices": [ - { - "name": "index_ServiceException_serviceId", - "unique": false, - "columnNames": [ - "serviceId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_ServiceException_serviceId` ON `${TABLE_NAME}` (`serviceId`)" - }, - { - "name": "index_ServiceException_type", - "unique": false, - "columnNames": [ - "type" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_ServiceException_type` ON `${TABLE_NAME}` (`type`)" - } - ] - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`serviceId`) REFERENCES `Service`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Service", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "serviceId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5b90bc800bfae6d22124ea0a6a906ca7')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/11.json b/core/room/schemas/moe.lava.banksia.core.room.Database/11.json deleted file mode 100644 index 6fc2976..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/11.json +++ /dev/null @@ -1,498 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 11, - "identityHash": "c4be3d0c2a25f8c5c33132646a070d0e", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Service", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `days` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "days", - "columnName": "days", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "start", - "columnName": "start", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "end", - "columnName": "end", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Service_days", - "unique": false, - "columnNames": [ - "days" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Service_days` ON `${TABLE_NAME}` (`days`)" - } - ] - }, - { - "tableName": "ServiceException", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serviceId` TEXT NOT NULL, `date` INTEGER NOT NULL, `type` INTEGER NOT NULL, PRIMARY KEY(`serviceId`, `date`))", - "fields": [ - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "date", - "columnName": "date", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "serviceId", - "date" - ] - }, - "indices": [ - { - "name": "index_ServiceException_serviceId", - "unique": false, - "columnNames": [ - "serviceId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_ServiceException_serviceId` ON `${TABLE_NAME}` (`serviceId`)" - }, - { - "name": "index_ServiceException_type", - "unique": false, - "columnNames": [ - "type" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_ServiceException_type` ON `${TABLE_NAME}` (`type`)" - } - ] - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`parent`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED)", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT" - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ], - "foreignKeys": [ - { - "table": "Stop", - "onDelete": "SET NULL", - "onUpdate": "NO ACTION", - "columns": [ - "parent" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`serviceId`) REFERENCES `Service`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_serviceId", - "unique": false, - "columnNames": [ - "serviceId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_serviceId` ON `${TABLE_NAME}` (`serviceId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Service", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "serviceId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c4be3d0c2a25f8c5c33132646a070d0e')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/2.json b/core/room/schemas/moe.lava.banksia.core.room.Database/2.json deleted file mode 100644 index 04a14e3..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/2.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 2, - "identityHash": "83ece554400bb035c267dc2414c23293", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '83ece554400bb035c267dc2414c23293')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/3.json b/core/room/schemas/moe.lava.banksia.core.room.Database/3.json deleted file mode 100644 index e769926..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/3.json +++ /dev/null @@ -1,339 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 3, - "identityHash": "5a7252ab3bcae4d0d0950024b19ba002", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5a7252ab3bcae4d0d0950024b19ba002')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/4.json b/core/room/schemas/moe.lava.banksia.core.room.Database/4.json deleted file mode 100644 index 783b3ee..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/4.json +++ /dev/null @@ -1,368 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 4, - "identityHash": "4426fd2ccc826d9d9d9021546b105850", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": true, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": true, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4426fd2ccc826d9d9d9021546b105850')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/5.json b/core/room/schemas/moe.lava.banksia.core.room.Database/5.json deleted file mode 100644 index c4a786d..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/5.json +++ /dev/null @@ -1,368 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 5, - "identityHash": "4426fd2ccc826d9d9d9021546b105850", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": true, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": true, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4426fd2ccc826d9d9d9021546b105850')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/6.json b/core/room/schemas/moe.lava.banksia.core.room.Database/6.json deleted file mode 100644 index 5ab26dc..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/6.json +++ /dev/null @@ -1,368 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 6, - "identityHash": "5f52de4cc0ddbcf02a0d8be4cf4d4cfd", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5f52de4cc0ddbcf02a0d8be4cf4d4cfd')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/7.json b/core/room/schemas/moe.lava.banksia.core.room.Database/7.json deleted file mode 100644 index d4c62b2..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/7.json +++ /dev/null @@ -1,415 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 7, - "identityHash": "15c94df0a62438ff28d451c074c94c59", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Service", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `days` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "days", - "columnName": "days", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "start", - "columnName": "start", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "end", - "columnName": "end", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Service_days", - "unique": false, - "columnNames": [ - "days" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Service_days` ON `${TABLE_NAME}` (`days`)" - } - ] - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '15c94df0a62438ff28d451c074c94c59')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/8.json b/core/room/schemas/moe.lava.banksia.core.room.Database/8.json deleted file mode 100644 index 9240dd5..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/8.json +++ /dev/null @@ -1,426 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 8, - "identityHash": "6e0f07bf1af88b2e37b5ad7c38a3fb2a", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Service", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `days` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "days", - "columnName": "days", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "start", - "columnName": "start", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "end", - "columnName": "end", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Service_days", - "unique": false, - "columnNames": [ - "days" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Service_days` ON `${TABLE_NAME}` (`days`)" - } - ] - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`serviceId`) REFERENCES `Service`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Service", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "serviceId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6e0f07bf1af88b2e37b5ad7c38a3fb2a')" - ] - } -} \ No newline at end of file diff --git a/core/room/schemas/moe.lava.banksia.core.room.Database/9.json b/core/room/schemas/moe.lava.banksia.core.room.Database/9.json deleted file mode 100644 index 2359dbd..0000000 --- a/core/room/schemas/moe.lava.banksia.core.room.Database/9.json +++ /dev/null @@ -1,426 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 9, - "identityHash": "6e0f07bf1af88b2e37b5ad7c38a3fb2a", - "entities": [ - { - "tableName": "Route", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` INTEGER NOT NULL, `number` TEXT, `name` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "number", - "columnName": "number", - "affinity": "TEXT" - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Service", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `days` INTEGER NOT NULL, `start` INTEGER NOT NULL, `end` INTEGER NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "days", - "columnName": "days", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "start", - "columnName": "start", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "end", - "columnName": "end", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Service_days", - "unique": false, - "columnNames": [ - "days" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Service_days` ON `${TABLE_NAME}` (`days`)" - } - ] - }, - { - "tableName": "Shape", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `path` BLOB NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "path", - "columnName": "path", - "affinity": "BLOB", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "Stop", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT NOT NULL, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lat", - "columnName": "lat", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "lng", - "columnName": "lng", - "affinity": "REAL", - "notNull": true - }, - { - "fieldPath": "parent", - "columnName": "parent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hasWheelChairBoarding", - "columnName": "hasWheelChairBoarding", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "platformCode", - "columnName": "platformCode", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Stop_parent", - "unique": false, - "columnNames": [ - "parent" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `${TABLE_NAME}` (`parent`)" - } - ] - }, - { - "tableName": "StopTime", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`tripId` TEXT NOT NULL, `stopId` TEXT NOT NULL, `arrivalTime` INTEGER NOT NULL, `departureTime` INTEGER NOT NULL, `headsign` TEXT, `pickupType` INTEGER NOT NULL, `dropOffType` INTEGER NOT NULL, PRIMARY KEY(`tripId`, `stopId`), FOREIGN KEY(`tripId`) REFERENCES `Trip`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`stopId`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "tripId", - "columnName": "tripId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "stopId", - "columnName": "stopId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "arrivalTime", - "columnName": "arrivalTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "departureTime", - "columnName": "departureTime", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "headsign", - "columnName": "headsign", - "affinity": "TEXT" - }, - { - "fieldPath": "pickupType", - "columnName": "pickupType", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "dropOffType", - "columnName": "dropOffType", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "tripId", - "stopId" - ] - }, - "indices": [ - { - "name": "index_StopTime_tripId", - "unique": false, - "columnNames": [ - "tripId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_tripId` ON `${TABLE_NAME}` (`tripId`)" - }, - { - "name": "index_StopTime_stopId", - "unique": false, - "columnNames": [ - "stopId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_StopTime_stopId` ON `${TABLE_NAME}` (`stopId`)" - } - ], - "foreignKeys": [ - { - "table": "Trip", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "tripId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Stop", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "stopId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Trip", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `routeId` TEXT NOT NULL, `serviceId` TEXT NOT NULL, `shapeId` TEXT, `tripHeadsign` TEXT NOT NULL, `directionId` TEXT NOT NULL, `blockId` TEXT NOT NULL, `wheelchairAccessible` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`routeId`) REFERENCES `Route`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`serviceId`) REFERENCES `Service`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`shapeId`) REFERENCES `Shape`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "routeId", - "columnName": "routeId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "serviceId", - "columnName": "serviceId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "shapeId", - "columnName": "shapeId", - "affinity": "TEXT" - }, - { - "fieldPath": "tripHeadsign", - "columnName": "tripHeadsign", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "directionId", - "columnName": "directionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "blockId", - "columnName": "blockId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "wheelchairAccessible", - "columnName": "wheelchairAccessible", - "affinity": "TEXT", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Trip_shapeId", - "unique": false, - "columnNames": [ - "shapeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_shapeId` ON `${TABLE_NAME}` (`shapeId`)" - }, - { - "name": "index_Trip_routeId", - "unique": false, - "columnNames": [ - "routeId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Trip_routeId` ON `${TABLE_NAME}` (`routeId`)" - } - ], - "foreignKeys": [ - { - "table": "Route", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "routeId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Service", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "serviceId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Shape", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "shapeId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "VersionMetadata", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `lastUpdated` INTEGER NOT NULL, PRIMARY KEY(`type`))", - "fields": [ - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "lastUpdated", - "columnName": "lastUpdated", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "type" - ] - } - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6e0f07bf1af88b2e37b5ad7c38a3fb2a')" - ] - } -} \ No newline at end of file diff --git a/core/room/src/androidMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.android.kt b/core/room/src/androidMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.android.kt deleted file mode 100644 index 999ee4b..0000000 --- a/core/room/src/androidMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.android.kt +++ /dev/null @@ -1,22 +0,0 @@ -package moe.lava.banksia.core.room - -import android.content.Context -import androidx.room.Room -import org.koin.core.component.KoinComponent -import org.koin.core.component.get -import org.koin.core.component.inject - -actual class DatabaseManager actual constructor() : KoinComponent { - private val ctx by inject() - - actual val database by lazy { - val ctx = get().applicationContext - val dbFile = ctx.getDatabasePath("room.db") - val builder = Room.databaseBuilder( - context = ctx, - name = dbFile.absolutePath, - ) - - Database.build(builder) - } -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/Database.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/Database.kt deleted file mode 100644 index 006b749..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/Database.kt +++ /dev/null @@ -1,83 +0,0 @@ -package moe.lava.banksia.core.room - -import androidx.room.AutoMigration -import androidx.room.RoomDatabase -import androidx.room.TypeConverters -import androidx.room.migration.Migration -import androidx.room.util.foreignKeyCheck -import androidx.sqlite.SQLiteConnection -import androidx.sqlite.driver.bundled.BundledSQLiteDriver -import androidx.sqlite.execSQL -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO -import moe.lava.banksia.core.room.converter.RouteTypeConverter -import moe.lava.banksia.core.room.dao.RouteDao -import moe.lava.banksia.core.room.dao.ServiceDao -import moe.lava.banksia.core.room.dao.ServiceExceptionDao -import moe.lava.banksia.core.room.dao.ShapeDao -import moe.lava.banksia.core.room.dao.StopDao -import moe.lava.banksia.core.room.dao.StopTimeDao -import moe.lava.banksia.core.room.dao.TripDao -import moe.lava.banksia.core.room.dao.VersionMetadataDao -import moe.lava.banksia.core.room.entity.RouteEntity -import moe.lava.banksia.core.room.entity.ServiceEntity -import moe.lava.banksia.core.room.entity.ServiceExceptionEntity -import moe.lava.banksia.core.room.entity.ShapeEntity -import moe.lava.banksia.core.room.entity.StopEntity -import moe.lava.banksia.core.room.entity.StopTimeEntity -import moe.lava.banksia.core.room.entity.TripEntity -import moe.lava.banksia.core.room.entity.VersionMetadataEntity -import androidx.room.Database as DatabaseAnnotation - -@DatabaseAnnotation( - version = 11, - entities = [ - RouteEntity::class, - ServiceEntity::class, - ServiceExceptionEntity::class, - ShapeEntity::class, - StopEntity::class, - StopTimeEntity::class, - TripEntity::class, - VersionMetadataEntity::class, - ], - autoMigrations = [ - AutoMigration(from = 1, to = 2), - AutoMigration(from = 2, to = 3), - AutoMigration(from = 9, to = 10), - ] -) -@TypeConverters(RouteTypeConverter::class) -abstract class Database : RoomDatabase() { - abstract val versionMetadataDao: VersionMetadataDao - abstract val routeDao: RouteDao - abstract val serviceDao: ServiceDao - abstract val serviceExceptionDao: ServiceExceptionDao - abstract val shapeDao: ShapeDao - abstract val stopDao: StopDao - abstract val stopTimeDao: StopTimeDao - abstract val tripDao: TripDao - - companion object { - fun build(base: Builder) = - base.fallbackToDestructiveMigration(true) - .setDriver(BundledSQLiteDriver()) - .setQueryCoroutineContext(Dispatchers.IO) - .addMigrations(MIGRATION_10_11) -// .fallbackToDestructiveMigration(true) - .build() - } -} - -val MIGRATION_10_11 = object : Migration(10, 11) { - override fun migrate(connection: SQLiteConnection) { - connection.execSQL("CREATE TABLE IF NOT EXISTS `_new_Stop` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `lat` REAL NOT NULL, `lng` REAL NOT NULL, `parent` TEXT, `hasWheelChairBoarding` INTEGER NOT NULL, `level` TEXT NOT NULL, `platformCode` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`parent`) REFERENCES `Stop`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED)") - connection.execSQL("INSERT INTO `_new_Stop` (`id`,`name`,`lat`,`lng`,`parent`,`hasWheelChairBoarding`,`level`,`platformCode`) SELECT `id`,`name`,`lat`,`lng`,`parent`,`hasWheelChairBoarding`,`level`,`platformCode` FROM `Stop`") - connection.execSQL("UPDATE `_new_Stop` SET `parent` = NULL WHERE `parent` == \"\"") - connection.execSQL("DROP TABLE `Stop`") - connection.execSQL("ALTER TABLE `_new_Stop` RENAME TO `Stop`") - connection.execSQL("CREATE INDEX IF NOT EXISTS `index_Stop_parent` ON `Stop` (`parent`)") - connection.execSQL("CREATE INDEX IF NOT EXISTS `index_Trip_serviceId` ON `Trip` (`serviceId`)") - foreignKeyCheck(connection, "Stop") - } -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/RoomDiModule.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/RoomDiModule.kt deleted file mode 100644 index 85c56fc..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/RoomDiModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package moe.lava.banksia.core.room - -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.module - -val roomDiModule = module { - singleOf(::DatabaseManager) - factory { get().database } - - factory { get().versionMetadataDao } - factory { get().routeDao } - factory { get().serviceDao } - factory { get().serviceExceptionDao } - factory { get().shapeDao } - factory { get().stopDao } - factory { get().stopTimeDao } - factory { get().tripDao } -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/RouteTypeConverter.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/RouteTypeConverter.kt deleted file mode 100644 index f588a66..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/RouteTypeConverter.kt +++ /dev/null @@ -1,12 +0,0 @@ -package moe.lava.banksia.core.room.converter - -import androidx.room.TypeConverter -import moe.lava.banksia.core.model.RouteType - -object RouteTypeConverter { - @TypeConverter - fun from(value: Int) = RouteType.from(value) - - @TypeConverter - fun to(routeType: RouteType) = routeType.value -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/ShapePathConverter.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/ShapePathConverter.kt deleted file mode 100644 index b914cff..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/converter/ShapePathConverter.kt +++ /dev/null @@ -1,43 +0,0 @@ -package moe.lava.banksia.core.room.converter - -import androidx.room.TypeConverter -import moe.lava.banksia.core.model.ShapePath -import moe.lava.banksia.core.util.Point - -object ShapePathConverter { - @TypeConverter - fun from(value: ByteArray): ShapePath { - return value - .asIterable() - .chunked(8) { - (it[0].toLong() and 0xFF) or - (it[1].toLong() and 0xFF shl 8) or - (it[2].toLong() and 0xFF shl 16) or - (it[3].toLong() and 0xFF shl 24) or - (it[4].toLong() and 0xFF shl 32) or - (it[5].toLong() and 0xFF shl 40) or - (it[6].toLong() and 0xFF shl 48) or - (it[7].toLong() and 0xFF shl 56) - } - .map { Double.fromBits(it) } - .chunked(2) - .map { (lat, lng) -> Point(lat, lng) } - } - - @TypeConverter - fun to(path: ShapePath): ByteArray { - return path - .flatMap { (lat, lng) -> listOf(lat.toBits(), lng.toBits()) } - .flatMap { i -> listOf( - i.toByte(), - (i shr 8).toByte(), - (i shr 16).toByte(), - (i shr 24).toByte(), - (i shr 32).toByte(), - (i shr 40).toByte(), - (i shr 48).toByte(), - (i shr 56).toByte(), - ) } - .toByteArray() - } -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/RouteDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/RouteDao.kt deleted file mode 100644 index c791f81..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/RouteDao.kt +++ /dev/null @@ -1,58 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.RouteEntity -import moe.lava.banksia.core.room.entity.StopEntity - -@Dao -interface RouteDao { - @Query("SELECT * FROM Route") - suspend fun getAll(): List - - @Query("SELECT * FROM Route WHERE id == :id") - suspend fun get(id: String): RouteEntity? - - @Insert - suspend fun insertAll(vararg routes: RouteEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg routes: RouteEntity) - - @Delete - suspend fun delete(route: RouteEntity) - - @Query("DELETE FROM Route") - suspend fun deleteAll() - - @Query(""" - SELECT Stop.* FROM Stop - INNER JOIN StopTime ON StopTime.stopId == Stop.id - INNER JOIN Trip ON Trip.id == StopTime.tripId - WHERE Trip.routeId == :id - GROUP BY Stop.id - """) - suspend fun stops(id: String): List - - // I vibecoded this, sorry - @Query(""" - WITH Tree AS ( - SELECT Stop.* FROM Stop - INNER JOIN StopTime ON StopTime.stopId == Stop.id - INNER JOIN Trip ON Trip.id == StopTime.tripId - WHERE Trip.routeId == :id - GROUP BY Stop.id - - UNION ALL - - SELECT s.* - FROM Stop s - INNER JOIN Tree t ON s.id = t.parent - ) - SELECT DISTINCT * FROM Tree WHERE parent IS NULL; - """) - suspend fun stopsParent(id: String): List -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceDao.kt deleted file mode 100644 index e459cdf..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceDao.kt +++ /dev/null @@ -1,29 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.ServiceEntity - -@Dao -interface ServiceDao { - @Query("SELECT * FROM Service") - suspend fun getAll(): List - - @Query("SELECT * FROM Service WHERE id == :id") - suspend fun get(id: String): ServiceEntity? - - @Insert - suspend fun insertAll(vararg services: ServiceEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg services: ServiceEntity) - - @Delete - suspend fun delete(service: ServiceEntity) - - @Query("DELETE FROM Service") - suspend fun deleteAll() -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceExceptionDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceExceptionDao.kt deleted file mode 100644 index 86feb75..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ServiceExceptionDao.kt +++ /dev/null @@ -1,29 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.ServiceExceptionEntity - -@Dao -interface ServiceExceptionDao { - @Query("SELECT * FROM ServiceException") - suspend fun getAll(): List - - @Query("SELECT * FROM ServiceException WHERE serviceId == :id") - suspend fun get(id: String): List - - @Insert - suspend fun insertAll(vararg exceptions: ServiceExceptionEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg exceptions: ServiceExceptionEntity) - - @Delete - suspend fun delete(service: ServiceExceptionEntity) - - @Query("DELETE FROM ServiceException") - suspend fun deleteAll() -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ShapeDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ShapeDao.kt deleted file mode 100644 index 446a923..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/ShapeDao.kt +++ /dev/null @@ -1,26 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.ShapeEntity - -@Dao -interface ShapeDao { - @Query("SELECT * FROM Shape WHERE id == :id") - suspend fun get(id: String): ShapeEntity? - - @Insert - suspend fun insertAll(vararg shapes: ShapeEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg shapes: ShapeEntity) - - @Delete - suspend fun delete(shape: ShapeEntity) - - @Query("DELETE FROM Shape") - suspend fun deleteAll() -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopDao.kt deleted file mode 100644 index 7edb560..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopDao.kt +++ /dev/null @@ -1,42 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.StopEntity - -@Dao -interface StopDao { - @Query("SELECT * FROM Stop") - suspend fun getAll(): List - - @Query(""" - SELECT * FROM Stop - WHERE platformCode <> "" - AND parent IS NULL - """) - suspend fun getAllParentless(): List - - @Query("SELECT * FROM Stop WHERE id == :id") - suspend fun get(id: String): StopEntity? - - @Query("SELECT * FROM Stop WHERE id IN (:ids)") - suspend fun get(ids: List): List - - @Insert - suspend fun insertAll(vararg stops: StopEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg stops: StopEntity) - - @Delete - suspend fun delete(stop: StopEntity) - - @Query("DELETE FROM Stop") - suspend fun deleteAll() - - @Query("UPDATE Stop SET parent = :parent WHERE id IN (:ids)") - suspend fun updateParents(ids: List, parent: String) -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopTimeDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopTimeDao.kt deleted file mode 100644 index 4670b6e..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/StopTimeDao.kt +++ /dev/null @@ -1,46 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.StopTimeEntity - -@Dao -interface StopTimeDao { - @Query("SELECT * FROM StopTime") - suspend fun getAll(): List - - @Query("SELECT * FROM StopTime WHERE tripId == :tripId") - suspend fun getForTrip(tripId: String): StopTimeEntity? - - @Query("SELECT * FROM StopTime WHERE tripId IN (:tripIds)") - suspend fun getForTrips(tripIds: List): List - - @Query("SELECT * FROM StopTime WHERE stopId == :stopId") - suspend fun getForStop(stopId: String): List - - @Query(""" - SELECT DISTINCT StopTime.* FROM StopTime - INNER JOIN Service ON Service.days & :days = :days AND :date BETWEEN Service.start AND Service.`end` - INNER JOIN Trip ON Trip.serviceId == Service.id - LEFT JOIN ServiceException ON ServiceException.serviceId == Service.id AND ServiceException.date == :date - WHERE StopTime.tripId == Trip.id - AND StopTime.stopId IN (SELECT Stop.id FROM Stop WHERE Stop.parent == :stopId OR Stop.id == :stopId) - AND ServiceException.type IS NULL - """) - suspend fun getForStopDated(stopId: String, days: Int, date: Int): List - - @Insert - suspend fun insertAll(vararg stopTimes: StopTimeEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg stopTimes: StopTimeEntity) - - @Delete - suspend fun delete(stopTime: StopTimeEntity) - - @Query("DELETE FROM StopTime") - suspend fun deleteAll() -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/TripDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/TripDao.kt deleted file mode 100644 index 1798f61..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/TripDao.kt +++ /dev/null @@ -1,32 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.TripEntity - -@Dao -interface TripDao { - @Query("SELECT * FROM Trip") - suspend fun getAll(): List - - @Query("SELECT * FROM Trip WHERE id == :id") - suspend fun get(id: String): TripEntity? - - @Query("SELECT * FROM Trip WHERE routeId == :id") - suspend fun getByRoute(id: String): List - - @Insert - suspend fun insertAll(vararg trips: TripEntity) - - @Insert(onConflict = REPLACE) - suspend fun insertOrReplaceAll(vararg trips: TripEntity) - - @Delete - suspend fun delete(trip: TripEntity) - - @Query("DELETE FROM Trip") - suspend fun deleteAll() -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/VersionMetadataDao.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/VersionMetadataDao.kt deleted file mode 100644 index 357770d..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/dao/VersionMetadataDao.kt +++ /dev/null @@ -1,27 +0,0 @@ -package moe.lava.banksia.core.room.dao - -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy.Companion.REPLACE -import androidx.room.Query -import moe.lava.banksia.core.room.entity.VersionMetadataEntity - -@Dao -interface VersionMetadataDao { - @Query("SELECT * FROM VersionMetadata WHERE type == :type") - suspend fun get(type: String): VersionMetadataEntity? - - @Query("SELECT * FROM VersionMetadata") - suspend fun getAll(): List - - @Insert(onConflict = REPLACE) - suspend fun update(vararg data: VersionMetadataEntity) - - suspend fun update(vararg data: Pair) { - update(*data.map { (type, lastUpdated) -> VersionMetadataEntity(type, lastUpdated) }.toTypedArray()) - } - - suspend fun update(lastUpdated: Long, types: Collection) { - update(*types.map { VersionMetadataEntity(it, lastUpdated) }.toTypedArray()) - } -} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/RouteEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/RouteEntity.kt deleted file mode 100644 index 8feda0b..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/RouteEntity.kt +++ /dev/null @@ -1,18 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey -import moe.lava.banksia.core.model.Route -import moe.lava.banksia.core.model.RouteType - -@Entity("Route") -data class RouteEntity( - @PrimaryKey val id: String, - val type: RouteType, - val number: String?, - val name: String, -) { - fun asModel() = Route(id, type, number, name) -} - -fun Route.asEntity() = RouteEntity(id, type, number, name) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceEntity.kt deleted file mode 100644 index 4a1c8b7..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceEntity.kt +++ /dev/null @@ -1,31 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey -import kotlinx.datetime.LocalDate -import moe.lava.banksia.core.model.Service -import moe.lava.banksia.core.util.deserialiseDaysBitflag -import moe.lava.banksia.core.util.serialise - -@Entity("Service") -data class ServiceEntity( - @PrimaryKey val id: String, - @ColumnInfo(index = true) val days: Int, - val start: Int, - val end: Int, -) { - fun asModel() = Service( - id, - days.deserialiseDaysBitflag(), - LocalDate.fromEpochDays(start), - LocalDate.fromEpochDays(end), - ) -} - -fun Service.asEntity() = ServiceEntity( - id, - days.serialise(), - start.toEpochDays().toInt(), - end.toEpochDays().toInt(), -) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceExceptionEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceExceptionEntity.kt deleted file mode 100644 index 1ac45d3..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ServiceExceptionEntity.kt +++ /dev/null @@ -1,28 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.ColumnInfo -import androidx.room.Entity -import kotlinx.datetime.LocalDate -import moe.lava.banksia.core.model.ServiceException - -@Entity( - "ServiceException", - primaryKeys = ["serviceId", "date"] -) -data class ServiceExceptionEntity( - @ColumnInfo(index = true) val serviceId: String, - val date: Int, - @ColumnInfo(index = true) val type: Int, -) { - fun asModel() = ServiceException( - serviceId, - LocalDate.fromEpochDays(date), - type, - ) -} - -fun ServiceException.asEntity() = ServiceExceptionEntity( - serviceId, - date.toEpochDays().toInt(), - type, -) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ShapeEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ShapeEntity.kt deleted file mode 100644 index a19147d..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/ShapeEntity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey -import androidx.room.TypeConverters -import moe.lava.banksia.core.model.Shape -import moe.lava.banksia.core.model.ShapePath -import moe.lava.banksia.core.room.converter.ShapePathConverter - -@Entity("Shape") -@TypeConverters(ShapePathConverter::class) -data class ShapeEntity( - @PrimaryKey val id: String, - val path: ShapePath, -) { - fun asModel() = Shape(id, path) -} - -fun Shape.asEntity() = ShapeEntity(id, path) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopEntity.kt deleted file mode 100644 index f59c5da..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopEntity.kt +++ /dev/null @@ -1,36 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.SET_NULL -import androidx.room.PrimaryKey -import moe.lava.banksia.core.model.Stop -import moe.lava.banksia.core.util.Point - -@Entity( - "Stop", - foreignKeys = [ - ForeignKey( - StopEntity::class, - parentColumns = ["id"], - childColumns = ["parent"], - onDelete = SET_NULL, - deferred = true, - ), - ] -) -data class StopEntity( - @PrimaryKey val id: String, - val name: String, - val lat: Double, - val lng: Double, - @ColumnInfo(index = true) val parent: String?, - val hasWheelChairBoarding: Boolean, - val level: String, - val platformCode: String, -) { - fun asModel() = Stop(id, name, Point(lat, lng), parent, hasWheelChairBoarding, level, platformCode) -} - -fun Stop.asEntity() = StopEntity(id, name, pos.lat, pos.lng, parent, hasWheelChairBoarding, level, platformCode) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopTimeEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopTimeEntity.kt deleted file mode 100644 index d96036d..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/StopTimeEntity.kt +++ /dev/null @@ -1,53 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.CASCADE -import androidx.room.Index -import kotlinx.serialization.ExperimentalSerializationApi -import moe.lava.banksia.core.model.FutureTime -import moe.lava.banksia.core.model.FutureTime.Companion.asInt -import moe.lava.banksia.core.model.StopTime - -@Entity( - "StopTime", - primaryKeys = ["tripId", "stopId"], - indices = [ - Index("tripId", unique = false), - Index("stopId", unique = false), - ], - foreignKeys = [ - ForeignKey(TripEntity::class, parentColumns = ["id"], childColumns = ["tripId"], onDelete = CASCADE), - ForeignKey(StopEntity::class, parentColumns = ["id"], childColumns = ["stopId"], onDelete = CASCADE), - ] -) -data class StopTimeEntity( - val tripId: String, - val stopId: String, - val arrivalTime: Int, - val departureTime: Int, - val headsign: String?, - val pickupType: Int, - val dropOffType: Int, -) { - fun asModel() = StopTime( - tripId, - stopId, - FutureTime.fromInt(arrivalTime), - FutureTime.fromInt(departureTime), - headsign, - pickupType, - dropOffType, - ) -} - -@OptIn(ExperimentalSerializationApi::class) -fun StopTime.asEntity() = StopTimeEntity( - tripId, - stopId, - arrivalTime.asInt(), - departureTime.asInt(), - headsign, - pickupType, - dropOffType, -) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/TripEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/TripEntity.kt deleted file mode 100644 index 7928c60..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/TripEntity.kt +++ /dev/null @@ -1,49 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.CASCADE -import androidx.room.Index -import androidx.room.PrimaryKey -import moe.lava.banksia.core.model.Trip - -@Entity( - "Trip", - foreignKeys = [ - ForeignKey(RouteEntity::class, parentColumns = ["id"], childColumns = ["routeId"], onDelete = CASCADE), - ForeignKey(ServiceEntity::class, parentColumns = ["id"], childColumns = ["serviceId"], onDelete = CASCADE), - ForeignKey(ShapeEntity::class, parentColumns = ["id"], childColumns = ["shapeId"], onDelete = CASCADE), - ], - indices = [Index("shapeId"), Index("serviceId")], -) -data class TripEntity( - @PrimaryKey val id: String, - @ColumnInfo(index = true) val routeId: String, - val serviceId: String, - val shapeId: String?, - val tripHeadsign: String, - val directionId: String, - val blockId: String, - val wheelchairAccessible: String, -) - -fun Trip.Companion.from(tripEntity: TripEntity, serviceEntity: ServiceEntity): Trip { - if (tripEntity.serviceId != serviceEntity.id) { - throw IllegalArgumentException("trip and service id mismatch (${tripEntity.serviceId} != ${serviceEntity.id})") - } - return with(tripEntity) { - Trip( - id = id, - routeId = routeId, - service = serviceEntity.asModel(), - shapeId = shapeId, - tripHeadsign = tripHeadsign, - directionId = directionId, - blockId = blockId, - wheelchairAccessible = wheelchairAccessible - ) - } -} - -fun Trip.asEntity() = TripEntity(id, routeId, service.id, shapeId, tripHeadsign, directionId, blockId, wheelchairAccessible) diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/VersionMetadataEntity.kt b/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/VersionMetadataEntity.kt deleted file mode 100644 index 1e7cab9..0000000 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/entity/VersionMetadataEntity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package moe.lava.banksia.core.room.entity - -import androidx.room.Entity -import androidx.room.PrimaryKey -import moe.lava.banksia.core.model.VersionMetadata - -@Entity( - "VersionMetadata", -) -data class VersionMetadataEntity( - /** Entity type this metadata applies to */ - @PrimaryKey val type: String, - /** Last updated */ - val lastUpdated: Long, -) { - fun asModel() = VersionMetadata(type, lastUpdated) -} - -fun VersionMetadata.asEntity() = VersionMetadataEntity(type, lastUpdated) diff --git a/core/room/src/iosMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.ios.kt b/core/room/src/iosMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.ios.kt deleted file mode 100644 index 34e370e..0000000 --- a/core/room/src/iosMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.ios.kt +++ /dev/null @@ -1,8 +0,0 @@ -package moe.lava.banksia.core.room - -import org.koin.core.component.KoinComponent - -actual class DatabaseManager actual constructor() : KoinComponent { - actual val database: Database - get() = TODO("Not yet implemented") -} diff --git a/core/room/src/jvmMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.jvm.kt b/core/room/src/jvmMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.jvm.kt deleted file mode 100644 index 360d2dd..0000000 --- a/core/room/src/jvmMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.jvm.kt +++ /dev/null @@ -1,69 +0,0 @@ -package moe.lava.banksia.core.room - -import androidx.room.Room -import androidx.room.RoomDatabase -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import moe.lava.banksia.core.util.error -import org.koin.core.component.KoinComponent -import java.io.File -import kotlin.system.exitProcess - -actual class DatabaseManager : KoinComponent { - private var liveDatabase: Database = Database.build(getBuilder()) - actual val database get() = liveDatabase - - private fun getBuilder(path: String = "./data/room.db"): RoomDatabase.Builder { - val dbFile = File(path) - return Room.databaseBuilder( - name = dbFile.absolutePath, - ).setJournalMode(RoomDatabase.JournalMode.TRUNCATE) - } - - fun makeAlt() = Database.build(getBuilder("./data/room_alt.db")) - - private fun deleteAll(file: File): Boolean { - val r1 = file.takeIf { it.exists() }?.delete() - val r2 = File(file.parentFile, file.name + ".lck").takeIf { it.exists() }?.delete() - val r3 = File(file.parentFile, file.name + "-journal").takeIf { it.exists() }?.delete() - return r1 != false && r2 != false && r3 != false - } - - private fun renameAll(from: File, to: File): Boolean { - val r1 = from.takeIf { it.exists() }?.renameTo(to) - val r2 = File(from.parentFile, from.name + ".lck").takeIf { it.exists() }?.renameTo(File(to.parentFile, to.name + ".lck")) - val r3 = File(from.parentFile, from.name + "-journal").takeIf { it.exists() }?.renameTo(File(to.parentFile, to.name + "-journal")) - return r1 != false && r2 != false && r3 != false - } - - fun swap(scope: CoroutineScope = CoroutineScope(Dispatchers.IO)) { - val live = File("./data/room.db") - val alt = File("./data/room_alt.db") - val old = File("./data/room_old.db") - - if (!renameAll(live, old)) { - error("DatabaseManager", "Failed to rename database from live to old (${live.absolutePath} -> ${old.absolutePath})") - return - } - if (!renameAll(alt, live)) { - error("DatabaseManager", "Failed to rename database from alt to live, trying to undo.. (${alt.absolutePath} -> ${live.absolutePath})") - if (!live.renameTo(old)) { - error("DatabaseManager", "Failed to undo, critical failure, exiting..") - exitProcess(1) - } - return - } - val oldDatabase = liveDatabase - liveDatabase = Database.build(getBuilder()) - - scope.launch { - delay(5000) - if (!deleteAll(old)) { - error("DatabaseManager", "Failed to unlink old database, stray files! (${old.absolutePath})") - } - oldDatabase.close() - } - } -} diff --git a/core/room/build.gradle.kts b/core/sqld/build.gradle.kts similarity index 55% rename from core/room/build.gradle.kts rename to core/sqld/build.gradle.kts index 31a7393..d86247a 100644 --- a/core/room/build.gradle.kts +++ b/core/sqld/build.gradle.kts @@ -4,17 +4,12 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) alias(libs.plugins.androidMultiplatformLibrary) - alias(libs.plugins.ksp) - alias(libs.plugins.room) -} - -room { - schemaDirectory("$projectDir/schemas") + alias(libs.plugins.sqldelight) } kotlin { android { - namespace = "moe.lava.banksia.core.room" + namespace = "moe.lava.banksia.core.sqld" compileSdk = libs.versions.android.compileSdk.get().toInt() compilerOptions { @@ -22,33 +17,36 @@ kotlin { } } - compilerOptions { - freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") - } - iosArm64() iosSimulatorArm64() jvm() sourceSets { + androidMain.dependencies { + implementation(libs.sqldelight.driver.android) + } commonMain.dependencies { implementation(libs.okio) implementation(libs.koin.core) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) - implementation(libs.room.runtime) - implementation(libs.sqlite.bundled) implementation(projects.core) } + nativeMain.dependencies { + implementation(libs.sqldelight.driver.native) + } + jvmMain.dependencies { + implementation(libs.sqldelight.driver.jvm) + } } } -dependencies { - add("kspAndroid", libs.room.compiler) - add("kspIosArm64", libs.room.compiler) - add("kspIosSimulatorArm64", libs.room.compiler) - add("kspJvm", libs.room.compiler) +sqldelight { + databases { + register("BanksiaDatabase") { + packageName.set("moe.lava.banksia.core.sqld") + } + } } diff --git a/core/sqld/src/androidMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.android.kt b/core/sqld/src/androidMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.android.kt new file mode 100644 index 0000000..b9f2247 --- /dev/null +++ b/core/sqld/src/androidMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.android.kt @@ -0,0 +1,14 @@ +package moe.lava.banksia.core.sqld + +import android.content.Context +import app.cash.sqldelight.driver.android.AndroidSqliteDriver +import org.koin.core.component.KoinComponent +import org.koin.core.component.get + +actual class DatabaseManager actual constructor() : KoinComponent { + actual val database by lazy { + val ctx = get().applicationContext + val driver = AndroidSqliteDriver(BanksiaDatabase.Schema, ctx, "timetable.db") + BanksiaDatabase(driver) + } +} diff --git a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.kt similarity index 58% rename from core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.kt rename to core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.kt index bfe32a9..c6b29f1 100644 --- a/core/room/src/commonMain/kotlin/moe/lava/banksia/core/room/DatabaseManager.kt +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.kt @@ -1,7 +1,7 @@ -package moe.lava.banksia.core.room +package moe.lava.banksia.core.sqld import org.koin.core.component.KoinComponent expect class DatabaseManager() : KoinComponent { - val database: Database + val database: BanksiaDatabase } diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/SqldDiModule.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/SqldDiModule.kt new file mode 100644 index 0000000..24ab9bd --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/SqldDiModule.kt @@ -0,0 +1,16 @@ +package moe.lava.banksia.core.sqld + +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val sqldDiModule = module { + singleOf(::DatabaseManager) + factory { get().database } + factory { get().routeQueries } + factory { get().serviceQueries } + factory { get().serviceExceptionQueries } + factory { get().shapeQueries } + factory { get().stopQueries } + factory { get().stopTimeQueries } + factory { get().tripQueries } +} diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Route.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Route.kt new file mode 100644 index 0000000..f3a5521 --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Route.kt @@ -0,0 +1,14 @@ +package moe.lava.banksia.core.sqld.mappers + +import moe.lava.banksia.core.model.Route +import moe.lava.banksia.core.model.RouteType +import moe.lava.banksia.core.sqld.Route as DbRoute + +fun DbRoute.asModel() = Route( + id = id, + type = RouteType.from(type.toInt()), + number = number, + name = name, +) + +fun Route.asDb() = DbRoute(id, type.value.toLong(), number, name) diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Service.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Service.kt new file mode 100644 index 0000000..dbda5ea --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Service.kt @@ -0,0 +1,21 @@ +package moe.lava.banksia.core.sqld.mappers + +import kotlinx.datetime.LocalDate +import moe.lava.banksia.core.model.Service +import moe.lava.banksia.core.util.deserialiseDaysBitflag +import moe.lava.banksia.core.util.serialise +import moe.lava.banksia.core.sqld.Service as DbService + +fun DbService.asModel() = Service( + id = id, + days = days.toInt().deserialiseDaysBitflag(), + start = LocalDate.fromEpochDays(start), + end = LocalDate.fromEpochDays(end), +) + +fun Service.asDb() = DbService( + id = id, + days = days.serialise().toLong(), + start = start.toEpochDays(), + end = end.toEpochDays(), +) diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/ServiceException.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/ServiceException.kt new file mode 100644 index 0000000..ef0d201 --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/ServiceException.kt @@ -0,0 +1,17 @@ +package moe.lava.banksia.core.sqld.mappers + +import kotlinx.datetime.LocalDate +import moe.lava.banksia.core.model.ServiceException +import moe.lava.banksia.core.sqld.ServiceException as DbServiceException + +fun DbServiceException.asModel() = ServiceException( + serviceId = serviceId, + date = LocalDate.fromEpochDays(date), + type = type.toInt(), +) + +fun ServiceException.asDb() = DbServiceException( + serviceId = serviceId, + type = date.toEpochDays(), + date = type.toLong(), +) diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Shape.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Shape.kt new file mode 100644 index 0000000..4a8d7db --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Shape.kt @@ -0,0 +1,52 @@ +package moe.lava.banksia.core.sqld.mappers + +import moe.lava.banksia.core.model.Shape +import moe.lava.banksia.core.model.ShapePath +import moe.lava.banksia.core.util.Point +import moe.lava.banksia.core.sqld.Shape as DbShape + +fun DbShape.asModel() = Shape( + id = id, + path = bytesToPath(path), +) + +fun Shape.asDb() = DbShape( + id = id, + path = bytesFromPath(path), +) + +private fun bytesToPath(value: ByteArray): ShapePath { + return value + .asSequence() + .asIterable() + .chunked(8) { + (it[0].toLong() and 0xFF) or + (it[1].toLong() and 0xFF shl 8) or + (it[2].toLong() and 0xFF shl 16) or + (it[3].toLong() and 0xFF shl 24) or + (it[4].toLong() and 0xFF shl 32) or + (it[5].toLong() and 0xFF shl 40) or + (it[6].toLong() and 0xFF shl 48) or + (it[7].toLong() and 0xFF shl 56) + } + .map { Double.fromBits(it) } + .chunked(2) + .map { (lat, lng) -> Point(lat, lng) } + .toList() +} + +private fun bytesFromPath(path: ShapePath): ByteArray { + return path + .flatMap { (lat, lng) -> listOf(lat.toBits(), lng.toBits()) } + .flatMap { i -> listOf( + i.toByte(), + (i shr 8).toByte(), + (i shr 16).toByte(), + (i shr 24).toByte(), + (i shr 32).toByte(), + (i shr 40).toByte(), + (i shr 48).toByte(), + (i shr 56).toByte(), + ) } + .toByteArray() +} diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Stop.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Stop.kt new file mode 100644 index 0000000..3bf6b54 --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Stop.kt @@ -0,0 +1,26 @@ +package moe.lava.banksia.core.sqld.mappers + +import moe.lava.banksia.core.model.Stop +import moe.lava.banksia.core.util.Point +import moe.lava.banksia.core.sqld.Stop as DbStop + +fun DbStop.asModel() = Stop( + id = id, + name = name, + pos = Point(lat, lng), + parent = parent, + hasWheelChairBoarding = hasWheelChairBoarding == 1L, + level = level, + platformCode = platformCode, +) + +fun Stop.asDb() = DbStop( + id = id, + name = name, + lat = pos.lat, + lng = pos.lng, + parent = parent, + hasWheelChairBoarding = if (hasWheelChairBoarding) 1L else 0L, + level = level, + platformCode = platformCode +) diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/StopTime.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/StopTime.kt new file mode 100644 index 0000000..c8b1c44 --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/StopTime.kt @@ -0,0 +1,25 @@ +package moe.lava.banksia.core.sqld.mappers + +import moe.lava.banksia.core.model.FutureTime +import moe.lava.banksia.core.model.FutureTime.Companion.asInt +import moe.lava.banksia.core.model.StopTime +import moe.lava.banksia.core.sqld.StopTime as DbStopTime + +fun DbStopTime.asModel() = StopTime( + tripId = tripId, + stopId = stopId, + arrivalTime = FutureTime.fromInt(arrivalTime.toInt()), + departureTime = FutureTime.fromInt(departureTime.toInt()), + headsign = null, + pickupType = pickupType.toInt(), + dropOffType = dropOffType.toInt(), +) + +fun StopTime.asDb() = DbStopTime( + tripId = tripId, + stopId = stopId, + arrivalTime = arrivalTime.asInt().toLong(), + departureTime = departureTime.asInt().toLong(), + pickupType = pickupType.toLong(), + dropOffType = dropOffType.toLong(), +) diff --git a/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Trip.kt b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Trip.kt new file mode 100644 index 0000000..36cdad5 --- /dev/null +++ b/core/sqld/src/commonMain/kotlin/moe/lava/banksia/core/sqld/mappers/Trip.kt @@ -0,0 +1,32 @@ +package moe.lava.banksia.core.sqld.mappers + +import moe.lava.banksia.core.model.Service +import moe.lava.banksia.core.model.Trip +import moe.lava.banksia.core.sqld.Trip as DbTrip + +fun DbTrip.asModel(service: Service): Trip { + if (serviceId != service.id) { + throw IllegalArgumentException("trip and service id mismatch (${serviceId} != ${service.id})") + } + return Trip( + id = id, + routeId = routeId, + service = service, + shapeId = shapeId, + tripHeadsign = tripHeadsign, + directionId = directionId, + blockId = blockId, + wheelchairAccessible = wheelchairAccessible == 1L + ) +} + +fun Trip.asDb() = DbTrip( + id = id, + routeId = routeId, + serviceId = service.id, + shapeId = shapeId, + tripHeadsign = tripHeadsign, + directionId = directionId, + blockId = blockId, + wheelchairAccessible = if (wheelchairAccessible) 1L else 0L +) diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Route.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Route.sq new file mode 100644 index 0000000..f1617f7 --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Route.sq @@ -0,0 +1,15 @@ +CREATE TABLE Route ( + id TEXT PRIMARY KEY NOT NULL, + type INTEGER NOT NULL, + number TEXT, + name TEXT NOT NULL +); + +getAll: +SELECT * FROM Route; + +get: +SELECT * FROM Route WHERE id == ?; + +insert: +INSERT INTO Route VALUES ?; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Service.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Service.sq new file mode 100644 index 0000000..a1c5fad --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Service.sq @@ -0,0 +1,11 @@ +CREATE TABLE Service ( + id TEXT PRIMARY KEY NOT NULL, + days INTEGER NOT NULL, + start INTEGER NOT NULL, + end INTEGER NOT NULL +); + +CREATE INDEX idx_Service_days ON Service (days); + +insert: +INSERT INTO Service VALUES ?; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/ServiceException.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/ServiceException.sq new file mode 100644 index 0000000..332f198 --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/ServiceException.sq @@ -0,0 +1,9 @@ +CREATE TABLE ServiceException ( + serviceId TEXT NOT NULL, + type INTEGER NOT NULL, + date INTEGER NOT NULL, + PRIMARY KEY (serviceId, type) +); + +insert: +INSERT INTO ServiceException VALUES ?; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Shape.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Shape.sq new file mode 100644 index 0000000..8734200 --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Shape.sq @@ -0,0 +1,7 @@ +CREATE TABLE Shape ( + id TEXT PRIMARY KEY NOT NULL, + path BLOB NOT NULL +); + +insert: +INSERT INTO Shape VALUES ?; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Stop.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Stop.sq new file mode 100644 index 0000000..3ac06b9 --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Stop.sq @@ -0,0 +1,54 @@ +CREATE TABLE Stop ( + id TEXT PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + lat REAL NOT NULL, + lng REAL NOT NULL, + parent TEXT REFERENCES Stop(id), + hasWheelChairBoarding INTEGER NOT NULL, + level TEXT, + platformCode TEXT +); + +CREATE INDEX idx_Stop_parent ON Stop (parent); + +getAll: +SELECT * FROM Stop; + +getAllParentless: +SELECT * FROM Stop WHERE platformCode IS NULL AND parent IS NULL; + +get: +SELECT * FROM Stop WHERE id == ?; + +getMany: +SELECT * FROM Stop WHERE id IN ?; + +insert: +INSERT INTO Stop VALUES ?; + +updateParents: +UPDATE Stop SET parent = ? WHERE id IN ?; + +getByRoute: +SELECT Stop.* FROM Stop +INNER JOIN StopTime ON StopTime.stopId == Stop.id +INNER JOIN Trip ON Trip.id == StopTime.tripId +WHERE Trip.routeId == :id +GROUP BY Stop.id; + +-- I vibecoded this, sorry +getParentsByRoute: +WITH RECURSIVE Tree AS ( + SELECT Stop.* FROM Stop + INNER JOIN StopTime ON StopTime.stopId == Stop.id + INNER JOIN Trip ON Trip.id == StopTime.tripId + WHERE Trip.routeId == :id + GROUP BY Stop.id + + UNION ALL + + SELECT s.* + FROM Stop s + INNER JOIN Tree t ON s.id = t.parent +) +SELECT DISTINCT * FROM Tree WHERE parent IS NULL; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/StopTime.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/StopTime.sq new file mode 100644 index 0000000..f2dc824 --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/StopTime.sq @@ -0,0 +1,23 @@ +CREATE TABLE StopTime ( + tripId TEXT NOT NULL REFERENCES Trip (id), + stopId TEXT NOT NULL REFERENCES Stop (id), + arrivalTime INTEGER NOT NULL, + departureTime INTEGER NOT NULL, + pickupType INTEGER NOT NULL, + dropOffType INTEGER NOT NULL, + PRIMARY KEY (tripId, stopId) +) WITHOUT ROWID; + +CREATE INDEX idx_StopTime_stopId ON StopTime (stopId); + +insert: +INSERT OR REPLACE INTO StopTime VALUES ?; + +getForStopDated: +SELECT DISTINCT StopTime.* FROM StopTime +INNER JOIN Service ON Service.days & :days = :days AND :date BETWEEN Service.start AND Service.`end` +INNER JOIN Trip ON Trip.serviceId == Service.id +LEFT JOIN ServiceException ON ServiceException.serviceId == Service.id AND ServiceException.date == :date +WHERE StopTime.tripId == Trip.id + AND StopTime.stopId IN (SELECT Stop.id FROM Stop WHERE Stop.parent == :stopId OR Stop.id == :stopId) + AND ServiceException.type IS NULL; diff --git a/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Trip.sq b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Trip.sq new file mode 100644 index 0000000..0fd3c1f --- /dev/null +++ b/core/sqld/src/commonMain/sqldelight/moe/lava/banksia/core/sqld/Trip.sq @@ -0,0 +1,15 @@ +CREATE TABLE Trip ( + id TEXT PRIMARY KEY NOT NULL, + routeId TEXT NOT NULL REFERENCES Route (id), + serviceId TEXT NOT NULL REFERENCES Service (id), + shapeId TEXT NOT NULL REFERENCES Shape (id), + tripHeadsign TEXT NOT NULL, + directionId TEXT NOT NULL, + blockId TEXT, + wheelchairAccessible INTEGER NOT NULL +); + +CREATE INDEX idx_Trip_serviceId ON Trip (serviceId); + +insert: +INSERT OR REPLACE INTO Trip VALUES ?; diff --git a/core/sqld/src/iosMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.ios.kt b/core/sqld/src/iosMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.ios.kt new file mode 100644 index 0000000..b91b786 --- /dev/null +++ b/core/sqld/src/iosMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.ios.kt @@ -0,0 +1,10 @@ +package moe.lava.banksia.core.sqld + +import app.cash.sqldelight.driver.native.NativeSqliteDriver + +actual class DatabaseManager actual constructor() : org.koin.core.component.KoinComponent { + actual val database by lazy { + val driver = NativeSqliteDriver(BanksiaDatabase.Schema, "timetable.db") + BanksiaDatabase(driver) + } +} diff --git a/core/sqld/src/jvmMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.jvm.kt b/core/sqld/src/jvmMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.jvm.kt new file mode 100644 index 0000000..5bf9f5c --- /dev/null +++ b/core/sqld/src/jvmMain/kotlin/moe/lava/banksia/core/sqld/DatabaseManager.jvm.kt @@ -0,0 +1,58 @@ +package moe.lava.banksia.core.sqld + +import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import moe.lava.banksia.core.util.error +import org.koin.core.component.KoinComponent +import java.io.File +import java.util.Properties +import kotlin.system.exitProcess + +private const val DBNAME = "timetable" + +actual class DatabaseManager actual constructor() : KoinComponent { + private var driver = connect() + actual val database get() = BanksiaDatabase(driver) + + private fun connect(path: String = "./data/${DBNAME}.db") = + JdbcSqliteDriver("jdbc:sqlite:${path}", Properties(), BanksiaDatabase.Schema) + .apply { execute(null, "PRAGMA journal_mode = OFF;", 0) } + + fun makeAlt() = run { + File("./data/${DBNAME}_alt.db").takeIf { it.exists() }?.delete() + val driver = connect("./data/${DBNAME}_alt.db") + BanksiaDatabase(driver) to { driver.close() } + } + + fun swap(scope: CoroutineScope = CoroutineScope(Dispatchers.IO)) { + val live = File("./data/${DBNAME}.db") + val alt = File("./data/${DBNAME}_alt.db") + val old = File("./data/${DBNAME}_old.db") + + if (live.takeIf { it.exists() }?.renameTo(old) == false) { + error("DatabaseManager", "Failed to rename database from live to old (${live.absolutePath} -> ${old.absolutePath})") + return + } + if (alt.takeIf { it.exists() }?.renameTo(live) == false) { + error("DatabaseManager", "Failed to rename database from alt to live, trying to undo.. (${alt.absolutePath} -> ${live.absolutePath})") + if (!live.renameTo(old)) { + error("DatabaseManager", "Failed to undo, critical failure, exiting..") + exitProcess(1) + } + return + } + val oldDriver = driver + driver = connect() + + scope.launch { + delay(5000) + if (old.takeIf { it.exists() }?.delete() == false) { + error("DatabaseManager", "Failed to unlink old database, stray files! (${old.absolutePath})") + } + oldDriver.close() + } + } +} diff --git a/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Stop.kt b/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Stop.kt index 73e6f02..bbe6fbf 100644 --- a/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Stop.kt +++ b/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Stop.kt @@ -10,6 +10,6 @@ data class Stop( val pos: Point, val parent: String?, val hasWheelChairBoarding: Boolean, - val level: String, - val platformCode: String, + val level: String?, + val platformCode: String?, ) diff --git a/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Trip.kt b/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Trip.kt index 753f653..6edb538 100644 --- a/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Trip.kt +++ b/core/src/commonMain/kotlin/moe/lava/banksia/core/model/Trip.kt @@ -7,9 +7,9 @@ data class Trip( val id: String, val routeId: String, val service: Service, - val shapeId: String?, + val shapeId: String, val tripHeadsign: String, val directionId: String, - val blockId: String, - val wheelchairAccessible: String, + val blockId: String?, + val wheelchairAccessible: Boolean, ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e171b55..02ca8cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,9 +22,8 @@ material = "1.7.3" material3 = "1.11.0-alpha04" okio = "3.17.0" playServicesLocation = "21.3.0" -sqlite = "2.6.2" -room = "2.8.4" secretsGradlePlugin = "2.0.1" +sqldelight = "2.3.2" wire = "6.1.0" [libraries] @@ -67,10 +66,10 @@ moko-geo = { module = "dev.icerock.moko:geo", version.ref = "geo" } moko-geo-compose = { module = "dev.icerock.moko:geo-compose", version.ref = "geo" } okio = { module = "com.squareup.okio:okio", version.ref = "okio" } play-services-location = { module = "com.google.android.gms:play-services-location", version.ref = "playServicesLocation" } -room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } -room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } -sqlite-bundled = { group = "androidx.sqlite", name = "sqlite-bundled", version.ref = "sqlite" } secrets-gradle-plugin = { module = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin", version.ref = "secretsGradlePlugin" } +sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } +sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } +sqldelight-driver-native = { module = "app.cash.sqldelight:native-driver", version.ref = "sqldelight" } ui-backhandler = { module = "org.jetbrains.compose.ui:ui-backhandler", version.ref = "compose-multiplatform" } [plugins] @@ -83,6 +82,6 @@ kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" } -room = { id = "androidx.room", version.ref = "room" } secretsGradle = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin" } +sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } wire = { id = "com.squareup.wire", version.ref = "wire" } diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 4150bb2..93da532 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -20,7 +20,7 @@ kotlin { dependencies { implementation(projects.core) - implementation(projects.core.room) + implementation(projects.core.sqld) implementation(projects.server.gtfs) implementation(projects.server.gtfsRt) @@ -36,8 +36,6 @@ dependencies { implementation(libs.ktor.server.contentnegotiation) implementation(libs.ktor.server.core) implementation(libs.ktor.server.netty) - implementation(libs.room.runtime) - implementation(libs.sqlite.bundled) testImplementation(libs.ktor.server.tests) testImplementation(libs.kotlin.test.junit) } diff --git a/server/gtfs/src/main/kotlin/moe/lava/banksia/server/gtfs/GtfsParser.kt b/server/gtfs/src/main/kotlin/moe/lava/banksia/server/gtfs/GtfsParser.kt index f8d9832..1a5ec29 100644 --- a/server/gtfs/src/main/kotlin/moe/lava/banksia/server/gtfs/GtfsParser.kt +++ b/server/gtfs/src/main/kotlin/moe/lava/banksia/server/gtfs/GtfsParser.kt @@ -175,8 +175,8 @@ class GtfsParser( pos = Point(stop_lat, stop_lon), parent = parent_station.ifEmpty { null }, hasWheelChairBoarding = wheelchair_boarding == "1", - level = level_id, - platformCode = platform_code, + level = level_id.ifEmpty { null }, + platformCode = platform_code.ifEmpty { null }, ) } } @@ -210,7 +210,7 @@ class GtfsParser( if (sunday == 1) add(DayOfWeek.SUNDAY) } Service( - id = service_id, + id = "${fd.parentFile.name}_${service_id}", days = days, start = LocalDate.parse(start_date, LocalDate.Formats.ISO_BASIC), end = LocalDate.parse(end_date, LocalDate.Formats.ISO_BASIC), @@ -221,7 +221,7 @@ class GtfsParser( fd.parseCsv() .map { with(it) { ServiceException( - serviceId = service_id, + serviceId = "${fd.parentFile.name}_${service_id}", date = LocalDate.parse(date, LocalDate.Formats.ISO_BASIC), type = exception_type, ) @@ -233,12 +233,12 @@ class GtfsParser( Trip( id = trip_id, routeId = route_id, - service = services[service_id]!!, - shapeId = shape_id.ifEmpty { null }, + service = services["${fd.parentFile.name}_${service_id}"]!!, + shapeId = shape_id, tripHeadsign = trip_headsign, directionId = direction_id, - blockId = block_id, - wheelchairAccessible = wheelchair_accessible, + blockId = block_id.ifEmpty { null }, + wheelchairAccessible = wheelchair_accessible == "1", ) } } diff --git a/server/src/main/kotlin/moe/lava/banksia/server/Application.kt b/server/src/main/kotlin/moe/lava/banksia/server/Application.kt index 73e7888..9ffd03a 100644 --- a/server/src/main/kotlin/moe/lava/banksia/server/Application.kt +++ b/server/src/main/kotlin/moe/lava/banksia/server/Application.kt @@ -20,10 +20,10 @@ import kotlinx.datetime.TimeZone import kotlinx.datetime.todayIn import moe.lava.banksia.core.Constants import moe.lava.banksia.core.model.atDate -import moe.lava.banksia.core.room.dao.RouteDao -import moe.lava.banksia.core.room.dao.StopDao -import moe.lava.banksia.core.room.dao.StopTimeDao -import moe.lava.banksia.core.room.dao.VersionMetadataDao +import moe.lava.banksia.core.sqld.RouteQueries +import moe.lava.banksia.core.sqld.StopQueries +import moe.lava.banksia.core.sqld.StopTimeQueries +import moe.lava.banksia.core.sqld.mappers.asModel import moe.lava.banksia.core.util.serialise import moe.lava.banksia.server.di.ServerModules import moe.lava.banksia.server.gtfsrt.GtfsrtService @@ -88,25 +88,9 @@ fun Application.module() { } } - get("/metadata/{type?}") { - val dao = get() - val type = call.parameters["type"] - if (type == null) { - call.respond(dao.getAll().map { it.asModel() }) - return@get - } - - val data = dao.get(type)?.asModel() - if (data == null) { - call.respond(HttpStatusCode.NotFound) - } else { - call.respond(data) - } - } - get("/routes") { val routes = withContext(context = Dispatchers.IO) { - get().getAll() + get().getAll().executeAsList() } val res = routes.map { it.asModel() } call.respond(res) @@ -114,16 +98,17 @@ fun Application.module() { get("/routes/{route_id}") { val routeId = call.parameters["route_id"]!! val route = withContext(context = Dispatchers.IO) { - get().get(routeId) + get().get(routeId).executeAsOneOrNull() } - if (route != null) + if (route != null) { call.respond(route.asModel()) - else + } else { call.respond(HttpStatusCode.NotFound) + } } get("/stops") { val routes = withContext(context = Dispatchers.IO) { - get().getAll() + get().getAll().executeAsList() } val res = routes.map { it.asModel() } call.respond(res) @@ -131,22 +116,24 @@ fun Application.module() { get("/stops/{stop_id}") { val stopId = call.parameters["stop_id"]!! val stop = withContext(context = Dispatchers.IO) { - get().get(stopId) + get().get(stopId).executeAsOneOrNull() } - if (stop != null) + if (stop != null) { call.respond(stop.asModel()) - else + } else { call.respond(HttpStatusCode.NotFound) + } } get("/route_stops/{route_id}") { val routeId = call.parameters["route_id"]!! val useParent = call.queryParameters["parent"] !in listOf("false", "0") val stops = withContext(Dispatchers.IO) { - val routeDao = get() - if (useParent) - routeDao.stopsParent(routeId) - else - routeDao.stops(routeId) + val queries = get() + if (useParent) { + queries.getParentsByRoute(routeId).executeAsList() + } else { + queries.getByRoute(routeId).executeAsList() + } } call.respond(stops.map { it.asModel() }) } @@ -156,12 +143,13 @@ fun Application.module() { ?.let { LocalDate.parse(it, LocalDate.Formats.ISO) } ?: Clock.System.todayIn(TimeZone.currentSystemDefault()) val times = withContext(context = Dispatchers.IO) { - get() + get() .getForStopDated( + listOf(date.dayOfWeek).serialise().toLong(), + date.toEpochDays(), stopId, - listOf(date.dayOfWeek).serialise(), - date.toEpochDays().toInt(), ) + .executeAsList() .map { it.asModel().atDate(date) } .sortedBy { it.departureTime } } diff --git a/server/src/main/kotlin/moe/lava/banksia/server/GtfsDataFixer.kt b/server/src/main/kotlin/moe/lava/banksia/server/GtfsDataFixer.kt index c74930d..97892e0 100644 --- a/server/src/main/kotlin/moe/lava/banksia/server/GtfsDataFixer.kt +++ b/server/src/main/kotlin/moe/lava/banksia/server/GtfsDataFixer.kt @@ -1,16 +1,16 @@ package moe.lava.banksia.server -import moe.lava.banksia.core.room.Database -import moe.lava.banksia.core.room.entity.StopEntity +import moe.lava.banksia.core.sqld.BanksiaDatabase import moe.lava.banksia.core.util.log import java.security.MessageDigest +import moe.lava.banksia.core.sqld.Stop as DbStop class GtfsDataFixer( - private val database: Database, + private val database: BanksiaDatabase, ) { - suspend fun addParentsToStops() { - val dao = database.stopDao - val stops = dao.getAllParentless() + fun addParentsToStops() { + val queries = database.stopQueries + val stops = queries.getAllParentless().executeAsList() stops .groupBy { it.name.split("/")[0] } .filter { (_, stops) -> stops.size > 1 } @@ -19,19 +19,21 @@ class GtfsDataFixer( val avgLng = stops.map { it.lng }.average() val hash = name.sha256().substring(0, 7) val parentId = "bsia:df1:$hash" - val parent = StopEntity( + val parent = DbStop( id = parentId, name = name, lat = avgLat, lng = avgLng, parent = null, - hasWheelChairBoarding = stops.all { it.hasWheelChairBoarding }, + hasWheelChairBoarding = if (stops.all { it.hasWheelChairBoarding == 1L }) 1L else 0L, level = "", platformCode = "", ) log("datafixer", "inserting ${parentId} for ${stops.size} children") - dao.insertAll(parent) - dao.updateParents(stops.map { it.id }, parentId) + queries.transaction { + queries.insert(parent) + queries.updateParents(parentId, stops.map { it.id }) + } } } } diff --git a/server/src/main/kotlin/moe/lava/banksia/server/GtfsImporter.kt b/server/src/main/kotlin/moe/lava/banksia/server/GtfsImporter.kt index 5c8dc37..17ab1f5 100644 --- a/server/src/main/kotlin/moe/lava/banksia/server/GtfsImporter.kt +++ b/server/src/main/kotlin/moe/lava/banksia/server/GtfsImporter.kt @@ -8,12 +8,12 @@ import moe.lava.banksia.core.model.Shape import moe.lava.banksia.core.model.Stop import moe.lava.banksia.core.model.StopTime import moe.lava.banksia.core.model.Trip -import moe.lava.banksia.core.room.Database -import moe.lava.banksia.core.room.DatabaseManager -import moe.lava.banksia.core.room.entity.asEntity +import moe.lava.banksia.core.sqld.DatabaseManager +import moe.lava.banksia.core.sqld.mappers.asDb import moe.lava.banksia.server.gtfs.GtfsData import moe.lava.banksia.server.gtfs.GtfsParser import kotlin.time.Clock +import moe.lava.banksia.core.sqld.BanksiaDatabase as Database class GtfsImporter( private val parser: GtfsParser, @@ -21,7 +21,7 @@ class GtfsImporter( private val log: Logger, ) { suspend fun import(url: String, date: Long = Clock.System.now().epochSeconds) { - val database = dbm.makeAlt() + val (database, close) = dbm.makeAlt() parser.update(url).collect { chunk -> when (chunk) { @@ -35,48 +35,51 @@ class GtfsImporter( } } - database.updateMetadata(date) - database.close() + close() dbm.swap() } - private suspend fun Database.updateMetadata(date: Long) { - val dao = versionMetadataDao - log.info("updating metadata...") - dao.update(date, listOf("routes", "stops", "shapes", "trips", "stop_times")) - log.info("done") - } - - private suspend fun Database.addRoutes(routes: List) { - val dao = routeDao + private fun Database.addRoutes(routes: List) { log.info("inserting routes...") - dao.insertOrReplaceAll(*routes.map { it.asEntity() }.toTypedArray()) + routeQueries.transaction { + routes.forEach { + routeQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addServices(services: List) { - val dao = serviceDao + private fun Database.addServices(services: List) { log.info("inserting services...") - dao.insertOrReplaceAll(*services.map { it.asEntity() }.toTypedArray()) + serviceQueries.transaction { + services.forEach { + serviceQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addServiceExceptions(exceptions: List) { - val dao = serviceExceptionDao + private fun Database.addServiceExceptions(exceptions: List) { log.info("inserting exceptions...") - dao.insertOrReplaceAll(*exceptions.map { it.asEntity() }.toTypedArray()) + serviceExceptionQueries.transaction { + exceptions.forEach { + serviceExceptionQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addShapes(shapes: List) { - val dao = shapeDao + private fun Database.addShapes(shapes: List) { log.info("inserting shapes...") - dao.insertOrReplaceAll(*shapes.map { it.asEntity() }.toTypedArray()) + shapeQueries.transaction { + shapes.forEach { + shapeQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addStops(stops: List) { - val dao = stopDao + private fun Database.addStops(stops: List) { log.info("inserting stops...") stops .groupBy { it.id } @@ -89,21 +92,32 @@ class GtfsImporter( } } } - dao.insertOrReplaceAll(*stops.map { it.asEntity() }.toTypedArray()) + + stopQueries.transaction { + stops.forEach { + stopQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addStopTimes(stopTimes: List) { - val dao = stopTimeDao + private fun Database.addStopTimes(stopTimes: List) { log.info("inserting ${stopTimes.size} stoptimes...") - dao.insertOrReplaceAll(*stopTimes.map { it.asEntity() }.toTypedArray()) + stopTimeQueries.transaction { + stopTimes.forEach { + stopTimeQueries.insert(it.asDb()) + } + } log.info("done") } - private suspend fun Database.addTrips(trips: List) { - val dao = tripDao + private fun Database.addTrips(trips: List) { log.info("inserting ${trips.size} trips...") - dao.insertOrReplaceAll(*trips.map { it.asEntity() }.toTypedArray()) + tripQueries.transaction { + trips.forEach { + tripQueries.insert(it.asDb()) + } + } log.info("done") } } diff --git a/server/src/main/kotlin/moe/lava/banksia/server/di/ServerModules.kt b/server/src/main/kotlin/moe/lava/banksia/server/di/ServerModules.kt index a8a7541..881becf 100644 --- a/server/src/main/kotlin/moe/lava/banksia/server/di/ServerModules.kt +++ b/server/src/main/kotlin/moe/lava/banksia/server/di/ServerModules.kt @@ -1,7 +1,7 @@ package moe.lava.banksia.server.di import io.ktor.client.HttpClient -import moe.lava.banksia.core.room.roomDiModule +import moe.lava.banksia.core.sqld.sqldDiModule import moe.lava.banksia.server.GtfsDataFixer import moe.lava.banksia.server.GtfsImporter import moe.lava.banksia.server.gtfs.GtfsParser @@ -11,7 +11,7 @@ import org.koin.core.module.dsl.singleOf import org.koin.dsl.module val ServerModules = module { - includes(roomDiModule) + includes(sqldDiModule) single { HttpClient() } singleOf(::GtfsParser) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9abcf7f..78831ff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -39,7 +39,7 @@ include(":core") include(":core:data") include(":core:data:client") include(":core:data:server") -include(":core:room") +include(":core:sqld") include(":ui") include(":ui:maps") include(":ui:shared")