upload_locks_db.dart 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 = await getApplicationDocumentsDirectory();
  22. final String path = join(documentsDirectory.path, _databaseName);
  23. return await openDatabase(
  24. path,
  25. version: _databaseVersion,
  26. onCreate: _onCreate,
  27. );
  28. }
  29. Future _onCreate(Database db, int version) async {
  30. await db.execute(
  31. '''
  32. CREATE TABLE $_table (
  33. $_columnID TEXT PRIMARY KEY NOT NULL,
  34. $_columnOwner TEXT NOT NULL,
  35. $_columnTime TEXT NOT NULL
  36. )
  37. ''',
  38. );
  39. }
  40. Future<void> clearTable() async {
  41. final db = await instance.database;
  42. await db.delete(_table);
  43. }
  44. Future<void> acquireLock(String id, String owner, int time) async {
  45. final db = await instance.database;
  46. final row = <String, dynamic>{};
  47. row[_columnID] = id;
  48. row[_columnOwner] = owner;
  49. row[_columnTime] = time;
  50. await db.insert(_table, row, conflictAlgorithm: ConflictAlgorithm.fail);
  51. }
  52. Future<bool> isLocked(String id, String owner) async {
  53. final db = await instance.database;
  54. final rows = await db.query(
  55. _table,
  56. where: '$_columnID = ? AND $_columnOwner = ?',
  57. whereArgs: [id, owner.toString()],
  58. );
  59. return rows.length == 1;
  60. }
  61. Future<int> releaseLock(String id, String owner) async {
  62. final db = await instance.database;
  63. return db.delete(
  64. _table,
  65. where: '$_columnID = ? AND $_columnOwner = ?',
  66. whereArgs: [id, owner],
  67. );
  68. }
  69. Future<int> releaseLocksAcquiredByOwnerBefore(String owner, int time) async {
  70. final db = await instance.database;
  71. return db.delete(
  72. _table,
  73. where: '$_columnOwner = ? AND $_columnTime < ?',
  74. whereArgs: [owner, time],
  75. );
  76. }
  77. Future<int> releaseAllLocksAcquiredBefore(int time) async {
  78. final db = await instance.database;
  79. return db.delete(
  80. _table,
  81. where: '$_columnTime < ?',
  82. whereArgs: [time],
  83. );
  84. }
  85. }