import 'package:flutter/foundation.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import '../log/log.dart'; class Db { late Database _db; Future init() async { if (kIsWeb) { Log.i("Database on web is not supported"); return; } String dbpath = 'previews.db'; if (defaultTargetPlatform == TargetPlatform.android || defaultTargetPlatform == TargetPlatform.iOS) { dbpath = join(await getDatabasesPath(), dbpath); } else { // Initialize FFI sqfliteFfiInit(); // Change the default factory databaseFactory = databaseFactoryFfi; } _db = await openDatabase( dbpath, onCreate: (db, version) { final batch = db.batch(); batch.execute( 'CREATE TABLE previews(id INTEGER PRIMARY KEY, thumbnail BLOB);', ); batch.execute( 'CREATE TABLE settings(domain TEXT, token TEXT, videopath TEXT, tilewidth INTEGER);', ); batch.insert("settings", {"domain": "", "token": "", "videopath": "", "tilewidth": 0}); return batch.commit(); }, // Set the version. This executes the onCreate function and provides a // path to perform database upgrades and downgrades. version: 2, ); } /// delete all data but keep structure Future clear() async { await _db.delete("previews"); // shrink the db file size await _db.execute("VACUUM"); } /// get db size in bytes Future getDbSize() async { final batch = _db.batch(); batch.rawQuery("pragma page_count;"); batch.rawQuery("pragma page_size;"); final result = (await batch.commit(noResult: false)); print(result); final int cnt = ((result[0] as List>)[0]["page_count"] as int); final int pagesize = (result[1] as List>)[0]["page_size"] as int; return cnt * pagesize; } Database db() { return _db; } static final Db _singleton = Db._internal(); factory Db() { return _singleton; } Db._internal(); }