You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

77 lines
2.7 KiB

package net.aiterp.git.ykonsole2.infrastructure.repositories
import net.aiterp.git.ykonsole2.domain.models.WorkoutState
import net.aiterp.git.ykonsole2.domain.models.WorkoutStateRepository
import net.aiterp.git.ykonsole2.domain.runtime.Calories
import net.aiterp.git.ykonsole2.domain.runtime.Distance
import net.aiterp.git.ykonsole2.domain.runtime.Level
import net.aiterp.git.ykonsole2.domain.runtime.Time
import net.aiterp.git.ykonsole2.infrastructure.getIntOrNull
import net.aiterp.git.ykonsole2.infrastructure.prepare
import net.aiterp.git.ykonsole2.infrastructure.runQuery
import net.aiterp.git.ykonsole2.infrastructure.withConnection
import java.sql.Types
import javax.sql.DataSource
val DataSource.workoutStateRepo get() = object : WorkoutStateRepository {
override fun fetchByWorkoutId(workoutId: String) = withConnection {
prepare("SELECT * FROM workout_state WHERE workout_id = ?") {
setString(1, workoutId)
runQuery {
sequence {
while (next()) yield(
WorkoutState(
workoutId = getString("workout_id"),
time = Time(getInt("ws_seconds")),
calories = getIntOrNull("ws_kcal")?.let { Calories(it) },
level = getIntOrNull("ws_level")?.let { Level(it) },
distance = getIntOrNull("ws_meters")?.let { Distance(it) },
),
)
}.toList()
}
}
}
override fun save(state: WorkoutState) {
withConnection {
prepare(
"""
INSERT INTO workout_state (workout_id, ws_seconds, ws_kcal, ws_level, ws_meters)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE ws_kcal = VALUES(ws_kcal),
ws_level = VALUES(ws_level),
ws_meters = VALUES(ws_meters)
""".trimIndent()
) {
setString(1, state.workoutId)
setInt(2, state.time.seconds)
if (state.calories != null) setInt(3, state.calories!!.kcal) else setNull(3, Types.INTEGER)
if (state.level != null) setInt(4, state.level!!.raw) else setNull(4, Types.INTEGER)
if (state.distance != null) setInt(5, state.distance!!.meters) else setNull(5, Types.INTEGER)
execute()
}
}
}
override fun deleteAll(states: Collection<WorkoutState>) {
withConnection {
prepare("DELETE FROM workout_state WHERE workout_id = ? AND ws_seconds = ?") {
states.forEachIndexed { index, state ->
setString(1, state.workoutId)
setInt(2, state.time.seconds)
addBatch()
if ((index + 1) % 100 == 0) {
executeBatch()
}
}
if (states.size % 100 != 0) {
executeBatch()
}
}
}
}
}