@@ -164,9 +164,11 @@ public final class StatsDatabase {
164164
165165 // Create indexes for common queries
166166 let createDateIndex = " CREATE INDEX IF NOT EXISTS idx_recordings_date ON recordings(date); "
167+ let createDateTimeIndex = " CREATE INDEX IF NOT EXISTS idx_recordings_date_time ON recordings(date DESC, time DESC); "
167168 executeSQL ( createRecordingsTable)
168169 executeSQL ( createDailyActivityTable)
169170 executeSQL ( createDateIndex)
171+ executeSQL ( createDateTimeIndex)
170172 }
171173
172174 func executeSQL( _ sql: String ) {
@@ -269,6 +271,41 @@ public final class StatsDatabase {
269271 return recordings
270272 }
271273
274+ /// Get the most recent recordings without materializing the full table.
275+ public func getRecentRecordings( limit: Int ) -> [ RecordingMetadata ] {
276+ guard limit > 0 else { return [ ] }
277+ return queue. sync {
278+ getRecentRecordingsImpl ( limit: limit)
279+ }
280+ }
281+
282+ private func getRecentRecordingsImpl( limit: Int ) -> [ RecordingMetadata ] {
283+ var recordings : [ RecordingMetadata ] = [ ]
284+
285+ let sql = """
286+ SELECT id, date, time, duration_seconds, word_count, speaker_count, processing_time_ms, transcript_path, title
287+ FROM recordings
288+ ORDER BY date DESC, time DESC
289+ LIMIT ?;
290+ """
291+ var statement : OpaquePointer ?
292+
293+ if sqlite3_prepare_v2 ( db, sql, - 1 , & statement, nil ) == SQLITE_OK {
294+ sqlite3_bind_int ( statement, 1 , Int32 ( limit) )
295+
296+ while sqlite3_step ( statement) == SQLITE_ROW {
297+ if let recording = recordingMetadataFromRow ( statement) {
298+ recordings. append ( recording)
299+ }
300+ }
301+ } else {
302+ AppLogger . stats. error ( " Failed to prepare getRecentRecordings " , [ " sqlite_error " : dbErrorMessage ( ) ] )
303+ }
304+
305+ sqlite3_finalize ( statement)
306+ return recordings
307+ }
308+
272309 /// Parses a RecordingMetadata from the current row of a prepared SELECT statement.
273310 /// Expected column order: id(0), date(1), time(2), duration_seconds(3), word_count(4),
274311 /// speaker_count(5), processing_time_ms(6), transcript_path(7), title(8)
0 commit comments