-
Notifications
You must be signed in to change notification settings - Fork 3
/
logs_database.dart
99 lines (77 loc) · 2.59 KB
/
logs_database.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import 'dart:async';
import 'package:my_logger/logger.dart';
import 'package:my_logger/core/encryption/gcm.dart';
import 'package:my_logger/logger_core.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sembast/sembast.dart';
import 'package:sembast/sembast_io.dart';
class LogsDatabase {
static final LogsDatabase _singleton = LogsDatabase._();
static LogsDatabase get instance => _singleton;
// Completer is used for transforming synchronous code into asynchronous code.
Completer<Database>? _dbOpenCompleter;
final _dbStore = intMapStoreFactory.store(Constants.STORE_NAME);
String encryptionKey = "";
LogsDatabase._();
Future<Database> get database async {
if (_dbOpenCompleter == null) {
_dbOpenCompleter = Completer();
_setup();
}
return _dbOpenCompleter!.future;
}
Future _setup() async {
// Get a platform-specific directory where persistent app data can be stored
final directory = await getApplicationSupportDirectory();
final configuration = MyLogger.config;
final dbPath = join(directory.path, Constants.DB_NAME);
var codec;
// Initialize the encryption codec with a user password
if (configuration.encryptionKey.isNotEmpty) {
switch (configuration.encryption) {
case EncryptionType.XXTEA:
codec = getXXTeaSembastCodec(password: configuration.encryptionKey);
break;
case EncryptionType.AES_GCM:
codec = getGCMSembastCodec(password: configuration.encryptionKey);
break;
case EncryptionType.NONE:
break;
}
}
final database = await databaseFactoryIo.openDatabase(dbPath, codec: codec);
_dbOpenCompleter!.complete(database);
}
Future<List<Log>> select({List<Filter>? filters}) async {
Finder? finder;
if (filters != null) {
finder = Finder(filter: Filter.and(filters), sortOrders: [SortOrder(LogFields.timeInMillis)]);
}
final recordSnapshots = await (_dbStore.find(
await database,
finder: finder,
));
return recordSnapshots.map((snapshot) {
final log = Log.fromJson(snapshot.value);
log.id = snapshot.key;
return log;
}).toList();
}
Future<int> insert(Log log) async {
return await _dbStore.add(await database, log.toJson());
}
Future<int> delete({List<Filter>? filters}) async {
Finder? finder;
if (filters != null) {
finder = Finder(
filter: Filter.and(filters),
);
}
var deleted = await _dbStore.delete(
await database,
finder: finder,
);
return deleted;
}
}