import 'dart:async'; import 'dart:io'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photos/models/memory.dart'; import 'package:sqflite/sqflite.dart'; class MemoriesDB { static const _databaseName = "ente.memories.db"; static const _databaseVersion = 1; static const table = 'memories'; static const columnFileID = 'file_id'; static const columnSeenTime = 'seen_time'; MemoriesDB._privateConstructor(); static final MemoriesDB instance = MemoriesDB._privateConstructor(); static Future? _dbFuture; Future get database async { _dbFuture ??= _initDatabase(); return _dbFuture!; } Future _initDatabase() async { final Directory documentsDirectory = await getApplicationDocumentsDirectory(); final String path = join(documentsDirectory.path, _databaseName); return await openDatabase( path, version: _databaseVersion, onCreate: _onCreate, ); } Future _onCreate(Database db, int version) async { await db.execute( ''' CREATE TABLE $table ( $columnFileID INTEGER PRIMARY KEY NOT NULL, $columnSeenTime TEXT NOT NULL ) ''', ); } Future clearTable() async { final db = await instance.database; await db.delete(table); } Future clearMemoriesSeenBeforeTime(int timestamp) async { final db = await instance.database; return db.delete( table, where: '$columnSeenTime < ?', whereArgs: [timestamp], ); } Future markMemoryAsSeen(Memory memory, int timestamp) async { final db = await instance.database; return await db.insert( table, _getRowForSeenMemory(memory, timestamp), conflictAlgorithm: ConflictAlgorithm.replace, ); } Future> getSeenTimes() async { final db = await instance.database; return _convertToSeenTimes(await db.query(table)); } Map _getRowForSeenMemory(Memory memory, int timestamp) { final row = {}; row[columnFileID] = memory.file.generatedID; row[columnSeenTime] = timestamp; return row; } Map _convertToSeenTimes(List> rows) { final seenTimes = {}; for (final row in rows) { seenTimes[row[columnFileID]] = int.parse(row[columnSeenTime]); } return seenTimes; } }