feat(server/gtfs): use transaction for imports

This commit is contained in:
Cilly Leang 2026-04-01 17:00:35 +11:00
parent b568ed547a
commit 91d4fe25a6
Signed by: cilly
GPG key ID: 6500251E087653C9
2 changed files with 22 additions and 31 deletions

View file

@ -132,21 +132,6 @@ fun Application.module() {
routeDao.stops(routeId) routeDao.stops(routeId)
} }
call.respond(stops.map { it.asModel() }) call.respond(stops.map { it.asModel() })
// val stops = withContext(Dispatchers.IO) {
// val stopDao by inject<StopDao>()
// val stopTimeDao by inject<StopTimeDao>()
// val tripDao by inject<TripDao>()
//
// tripDao.getByRoute(routeId)
// .map { it.id }
// .let { stopTimeDao.get(it) }
// .flatMap { it.asModel().stopInfos }
// .map { it.stopId }
// .let { stopDao.get(it) }
// .map { it.asModel() }
// }
// call.respond(stops)
} }
get("/stoptimes/by_stop/{stop_id}") { get("/stoptimes/by_stop/{stop_id}") {
val stopId = call.parameters["stop_id"]!! val stopId = call.parameters["stop_id"]!!

View file

@ -1,5 +1,7 @@
package moe.lava.banksia.server package moe.lava.banksia.server
import androidx.room.immediateTransaction
import androidx.room.useWriterConnection
import io.ktor.util.logging.Logger import io.ktor.util.logging.Logger
import moe.lava.banksia.model.Route import moe.lava.banksia.model.Route
import moe.lava.banksia.model.Service import moe.lava.banksia.model.Service
@ -19,25 +21,29 @@ class GtfsImporter(
private val log: Logger, private val log: Logger,
) { ) {
suspend fun import(url: String, date: Long = Clock.System.now().epochSeconds) { suspend fun import(url: String, date: Long = Clock.System.now().epochSeconds) {
database.routeDao.deleteAll() database.useWriterConnection { transactor ->
database.serviceDao.deleteAll() transactor.immediateTransaction {
database.shapeDao.deleteAll() database.routeDao.deleteAll()
database.stopDao.deleteAll() database.serviceDao.deleteAll()
database.stopTimeDao.deleteAll() database.shapeDao.deleteAll()
database.tripDao.deleteAll() database.stopDao.deleteAll()
database.stopTimeDao.deleteAll()
database.tripDao.deleteAll()
parser.update(url).collect { chunk -> parser.update(url).collect { chunk ->
when (chunk) { when (chunk) {
is GtfsData.RouteChunk -> addRoutes(chunk.routes) is GtfsData.RouteChunk -> addRoutes(chunk.routes)
is GtfsData.ServiceChunk -> addServices(chunk.services) is GtfsData.ServiceChunk -> addServices(chunk.services)
is GtfsData.ShapeChunk -> addShapes(chunk.shapes) is GtfsData.ShapeChunk -> addShapes(chunk.shapes)
is GtfsData.StopChunk -> addStops(chunk.stops) is GtfsData.StopChunk -> addStops(chunk.stops)
is GtfsData.StopTimeChunk -> addStopTimes(chunk.stopTimes) is GtfsData.StopTimeChunk -> addStopTimes(chunk.stopTimes)
is GtfsData.TripChunk -> addTrips(chunk.trips) is GtfsData.TripChunk -> addTrips(chunk.trips)
}
}
updateMetadata(date)
} }
} }
updateMetadata(date)
} }
private suspend fun updateMetadata(date: Long) { private suspend fun updateMetadata(date: Long) {