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
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()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|