import 'dart:async'; import 'dart:io'; import 'package:path/path.dart'; import 'package:photos/models/public_key.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path_provider/path_provider.dart'; class PublicKeysDB { static final _databaseName = "ente.public_keys.db"; static final _databaseVersion = 1; static final table = 'public_keys'; static final columnEmail = 'email'; static final columnPublicKey = 'public_key'; PublicKeysDB._privateConstructor(); static final PublicKeysDB instance = PublicKeysDB._privateConstructor(); static Database _database; Future get database async { if (_database != null) return _database; _database = await _initDatabase(); return _database; } _initDatabase() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); 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 ( $columnEmail TEXT PRIMARY KEY NOT NULL, $columnPublicKey TEXT NOT NULL ) '''); } Future setKey(PublicKey key) async { final db = await instance.database; return db.insert(table, _getRow(key), conflictAlgorithm: ConflictAlgorithm.replace); } Future> searchByEmail(String email) async { final db = await instance.database; return _convertRows(await db.query( table, where: '$columnEmail LIKE ?', whereArgs: ['%$email%'], )); } Map _getRow(PublicKey key) { var row = new Map(); row[columnEmail] = key.email; row[columnPublicKey] = key.publicKey; return row; } List _convertRows(List> rows) { final keys = List(); for (final row in rows) { keys.add(PublicKey(row[columnEmail], row[columnPublicKey])); } return keys; } }