HealthImport/HealthImport/Model/Tables/WorkoutsTable.swift
2024-02-02 13:55:22 +01:00

98 lines
3.0 KiB
Swift

import Foundation
import SQLite
import HealthKit
struct WorkoutsTable {
private let database: Connection
let events: WorkoutEventsTable
init(database: Connection) {
self.database = database
self.events = .init(database: database)
}
let table = Table("workouts")
// INTEGER PRIMARY KEY AUTOINCREMENT
let dataId = Expression<Int>("data_id")
// REAL
let totalDistance = Expression<Double?>("total_distance")
// INTEGER
let goalType = Expression<Int?>("goal_type")
// REAL
let goal = Expression<Double?>("goal")
// INTEGER
let condenserVersion = Expression<Int?>("condenser_version")
// REAL
let condenserDate = Expression<Double?>("condenser_date")
func workouts() throws -> [Workout] {
let metadataKeys = try Metadata.allKeys(in: database)
return try database.prepare(table).map { row in
let id = row[dataId]
let events = try events.events(for: id, in: database)
let activities = try WorkoutActivityTable.activities(for: id, in: database)
let metadata = try Metadata.metadata(for: id, in: database, keyMap: metadataKeys)
return .init(
id: id,
totalDistance: row[totalDistance],
goalType: row[goalType],
goal: row[goal],
condenserVersion: row[condenserVersion],
condenserDate: row[condenserDate].map { Date.init(timeIntervalSinceReferenceDate: $0) },
events: events,
activities: activities,
metadata: metadata)
}
}
func create() throws {
try database.run(table.create { t in
t.column(dataId, primaryKey: .autoincrement)
t.column(totalDistance)
t.column(goalType)
t.column(goal)
t.column(condenserVersion)
t.column(condenserDate)
})
// try database.execute("CREATE TABLE workouts (data_id INTEGER PRIMARY KEY AUTOINCREMENT, total_distance REAL, goal_type INTEGER, goal REAL, condenser_version INTEGER, condenser_date REAL)")
}
func createAll() throws {
try create()
try events.create(referencing: self)
}
func insert(_ element: Workout) throws {
let rowid = try database.run(table.insert(
totalDistance <- element.totalDistance,
goalType <- element.goal?.goalType,
goal <- element.goal?.gaol,
condenserVersion <- element.condenserVersion,
condenserDate <- element.condenserDate?.timeIntervalSinceReferenceDate)
)
let dataId = Int(rowid)
for event in element.events {
try events.insert(event, dataId: dataId)
}
for activity in element.activities {
try WorkoutActivityTable.insert(activity, isPrimaryActivity: true, dataId: dataId, in: database)
}
for (key, value) in element.metadata {
try Metadata.insert(value, for: key, of: dataId, in: database)
}
}
}