upload_locks_db.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'package:path/path.dart';
  4. import 'package:path_provider/path_provider.dart';
  5. import 'package:sqflite/sqflite.dart';
  6. class UploadLocksDB {
  7. static const _databaseName = "ente.upload_locks.db";
  8. static const _databaseVersion = 1;
  9. static const _table = "upload_locks";
  10. static const _columnID = "id";
  11. static const _columnOwner = "owner";
  12. static const _columnTime = "time";
  13. UploadLocksDB._privateConstructor();
  14. static final UploadLocksDB instance = UploadLocksDB._privateConstructor();
  15. static Future<Database>? _dbFuture;
  16. Future<Database> get database async {
  17. _dbFuture ??= _initDatabase();
  18. return _dbFuture!;
  19. }
  20. Future<Database> _initDatabase() async {
  21. final Directory documentsDirectory =
  22. await getApplicationDocumentsDirectory();
  23. final String path = join(documentsDirectory.path, _databaseName);
  24. return await openDatabase(
  25. path,
  26. version: _databaseVersion,
  27. onCreate: _onCreate,
  28. );
  29. }
  30. Future _onCreate(Database db, int version) async {
  31. await db.execute(
  32. '''
  33. CREATE TABLE $_table (
  34. $_columnID TEXT PRIMARY KEY NOT NULL,
  35. $_columnOwner TEXT NOT NULL,
  36. $_columnTime TEXT NOT NULL
  37. )
  38. ''',
  39. );
  40. }
  41. Future<void> clearTable() async {
  42. final db = await instance.database;
  43. await db.delete(_table);
  44. }
  45. Future<void> acquireLock(String id, String owner, int time) async {
  46. final db = await instance.database;
  47. final row = <String, dynamic>{};
  48. row[_columnID] = id;
  49. row[_columnOwner] = owner;
  50. row[_columnTime] = time;
  51. await db.insert(_table, row, conflictAlgorithm: ConflictAlgorithm.fail);
  52. }
  53. Future<bool> isLocked(String id, String owner) async {
  54. final db = await instance.database;
  55. final rows = await db.query(
  56. _table,
  57. where: '$_columnID = ? AND $_columnOwner = ?',
  58. whereArgs: [id, owner],
  59. );
  60. return rows.length == 1;
  61. }
  62. Future<int> releaseLock(String id, String owner) async {
  63. final db = await instance.database;
  64. return db.delete(
  65. _table,
  66. where: '$_columnID = ? AND $_columnOwner = ?',
  67. whereArgs: [id, owner],
  68. );
  69. }
  70. Future<int> releaseLocksAcquiredByOwnerBefore(String owner, int time) async {
  71. final db = await instance.database;
  72. return db.delete(
  73. _table,
  74. where: '$_columnOwner = ? AND $_columnTime < ?',
  75. whereArgs: [owner, time],
  76. );
  77. }
  78. Future<int> releaseAllLocksAcquiredBefore(int time) async {
  79. final db = await instance.database;
  80. return db.delete(
  81. _table,
  82. where: '$_columnTime < ?',
  83. whereArgs: [time],
  84. );
  85. }
  86. }