Skip to content

Commit cb4a9b5

Browse files
Merge pull request #887 from cypherstack/testing
Various fixes and tweaks
2 parents b871057 + 130e1b3 commit cb4a9b5

37 files changed

+5253
-391
lines changed

lib/db/db_version_migration.dart

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
*
99
*/
1010

11-
import 'package:hive/hive.dart';
1211
import 'package:isar/isar.dart';
1312
import 'package:tuple/tuple.dart';
1413

@@ -40,14 +39,18 @@ class DbVersionMigrator with WalletDB {
4039
int fromVersion, {
4140
required SecureStorageInterface secureStore,
4241
}) async {
42+
if (AppConfig.appName == "Campfire" && fromVersion < 12) {
43+
// safe to skip to v11 for campfire
44+
fromVersion = 11;
45+
}
4346
Logging.instance.log(
4447
"Running migrate fromVersion $fromVersion",
4548
level: LogLevel.Warning,
4649
);
4750
switch (fromVersion) {
4851
case 0:
49-
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
50-
await Hive.openBox<dynamic>(DB.boxNamePrefs);
52+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAllWalletsData);
53+
await DB.instance.hive.openBox<dynamic>(DB.boxNamePrefs);
5154
final walletsService = WalletsService();
5255
final nodeService = NodeService(secureStorageInterface: secureStore);
5356
final prefs = Prefs.instance;
@@ -61,8 +64,8 @@ class DbVersionMigrator with WalletDB {
6164
// only instantiate client if there are firo wallets
6265
if (walletInfoList.values
6366
.any((element) => element.coinIdentifier == firo.identifier)) {
64-
await Hive.openBox<NodeModel>(DB.boxNameNodeModels);
65-
await Hive.openBox<NodeModel>(DB.boxNamePrimaryNodes);
67+
await DB.instance.hive.openBox<NodeModel>(DB.boxNameNodeModels);
68+
await DB.instance.hive.openBox<NodeModel>(DB.boxNamePrimaryNodes);
6669
final node =
6770
nodeService.getPrimaryNodeFor(currency: firo) ?? firo.defaultNode;
6871
final List<ElectrumXNode> failovers = nodeService
@@ -106,7 +109,7 @@ class DbVersionMigrator with WalletDB {
106109
for (final walletInfo in walletInfoList.values) {
107110
// migrate each firo wallet's lelantus coins
108111
if (walletInfo.coinIdentifier == firo.identifier) {
109-
await Hive.openBox<dynamic>(walletInfo.walletId);
112+
await DB.instance.hive.openBox<dynamic>(walletInfo.walletId);
110113
final _lelantusCoins = DB.instance.get<dynamic>(
111114
boxName: walletInfo.walletId,
112115
key: '_lelantus_coins',
@@ -157,8 +160,8 @@ class DbVersionMigrator with WalletDB {
157160
return await migrate(1, secureStore: secureStore);
158161

159162
case 1:
160-
await Hive.openBox<ExchangeTransaction>(DB.boxNameTrades);
161-
await Hive.openBox<Trade>(DB.boxNameTradesV2);
163+
await DB.instance.hive.openBox<ExchangeTransaction>(DB.boxNameTrades);
164+
await DB.instance.hive.openBox<Trade>(DB.boxNameTradesV2);
162165
final trades =
163166
DB.instance.values<ExchangeTransaction>(boxName: DB.boxNameTrades);
164167

@@ -184,7 +187,7 @@ class DbVersionMigrator with WalletDB {
184187
return await migrate(2, secureStore: secureStore);
185188

186189
case 2:
187-
await Hive.openBox<dynamic>(DB.boxNamePrefs);
190+
await DB.instance.hive.openBox<dynamic>(DB.boxNamePrefs);
188191
final prefs = Prefs.instance;
189192
await prefs.init();
190193
if (!(await prefs.isExternalCallsSet())) {
@@ -233,8 +236,8 @@ class DbVersionMigrator with WalletDB {
233236

234237
case 5:
235238
// migrate
236-
await Hive.openBox<dynamic>("theme");
237-
await Hive.openBox<dynamic>(DB.boxNamePrefs);
239+
await DB.instance.hive.openBox<dynamic>("theme");
240+
await DB.instance.hive.openBox<dynamic>(DB.boxNamePrefs);
238241

239242
final themeName =
240243
DB.instance.get<dynamic>(boxName: "theme", key: "colorScheme")
@@ -347,7 +350,7 @@ class DbVersionMigrator with WalletDB {
347350

348351
case 8:
349352
// migrate
350-
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
353+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAllWalletsData);
351354
final walletsService = WalletsService();
352355
final walletInfoList = await walletsService.walletNames;
353356
await MainDB.instance.initMainDB();
@@ -443,8 +446,8 @@ class DbVersionMigrator with WalletDB {
443446
}
444447

445448
Future<void> _v4(SecureStorageInterface secureStore) async {
446-
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
447-
await Hive.openBox<dynamic>(DB.boxNamePrefs);
449+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAllWalletsData);
450+
await DB.instance.hive.openBox<dynamic>(DB.boxNamePrefs);
448451
final walletsService = WalletsService();
449452
final prefs = Prefs.instance;
450453
final walletInfoList = await walletsService.walletNames;
@@ -455,7 +458,7 @@ class DbVersionMigrator with WalletDB {
455458
final info = walletInfoList[walletId]!;
456459
assert(info.walletId == walletId);
457460

458-
final walletBox = await Hive.openBox<dynamic>(info.walletId);
461+
final walletBox = await DB.instance.hive.openBox<dynamic>(info.walletId);
459462

460463
const receiveAddressesPrefix = "receivingAddresses";
461464
const changeAddressesPrefix = "changeAddresses";
@@ -560,7 +563,7 @@ class DbVersionMigrator with WalletDB {
560563
}
561564

562565
Future<void> _v7(SecureStorageInterface secureStore) async {
563-
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
566+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAllWalletsData);
564567
final walletsService = WalletsService();
565568
final walletInfoList = await walletsService.walletNames;
566569
await MainDB.instance.initMainDB();
@@ -601,7 +604,8 @@ class DbVersionMigrator with WalletDB {
601604
}
602605

603606
Future<void> _v9() async {
604-
final addressBookBox = await Hive.openBox<dynamic>(DB.boxNameAddressBook);
607+
final addressBookBox =
608+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAddressBook);
605609
await MainDB.instance.initMainDB();
606610

607611
final keys = List<String>.from(addressBookBox.keys);
@@ -649,8 +653,8 @@ class DbVersionMigrator with WalletDB {
649653
}
650654

651655
Future<void> _v10(SecureStorageInterface secureStore) async {
652-
await Hive.openBox<dynamic>(DB.boxNameAllWalletsData);
653-
await Hive.openBox<dynamic>(DB.boxNamePrefs);
656+
await DB.instance.hive.openBox<dynamic>(DB.boxNameAllWalletsData);
657+
await DB.instance.hive.openBox<dynamic>(DB.boxNamePrefs);
654658
final walletsService = WalletsService();
655659
final prefs = Prefs.instance;
656660
final walletInfoList = await walletsService.walletNames;
@@ -669,7 +673,7 @@ class DbVersionMigrator with WalletDB {
669673
.walletIdEqualTo(walletId)
670674
.countSync() ==
671675
0) {
672-
final walletBox = await Hive.openBox<dynamic>(walletId);
676+
final walletBox = await DB.instance.hive.openBox<dynamic>(walletId);
673677

674678
final hiveLCoins = DB.instance.get<dynamic>(
675679
boxName: walletId,

lib/db/hive/db.dart

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
import 'dart:isolate';
1212

1313
import 'package:cw_core/wallet_info.dart' as xmr;
14-
import 'package:hive/hive.dart';
14+
import 'package:hive/hive.dart' show Box;
15+
import 'package:hive/src/hive_impl.dart';
1516
import 'package:mutex/mutex.dart';
1617

1718
import '../../app_config.dart';
@@ -24,6 +25,8 @@ import '../../utilities/logger.dart';
2425
import '../../wallets/crypto_currency/crypto_currency.dart';
2526

2627
class DB {
28+
final hive = HiveImpl();
29+
2730
// legacy (required for migrations)
2831
@Deprecated("Left over for migration from old versions of Stack Wallet")
2932
static const String boxNameAddressBook = "addressBook";
@@ -104,52 +107,52 @@ class DB {
104107

105108
// open hive boxes
106109
Future<void> init() async {
107-
if (Hive.isBoxOpen(boxNameDBInfo)) {
108-
_boxDBInfo = Hive.box<dynamic>(boxNameDBInfo);
110+
if (hive.isBoxOpen(boxNameDBInfo)) {
111+
_boxDBInfo = hive.box<dynamic>(boxNameDBInfo);
109112
} else {
110-
_boxDBInfo = await Hive.openBox<dynamic>(boxNameDBInfo);
113+
_boxDBInfo = await hive.openBox<dynamic>(boxNameDBInfo);
111114
}
112-
await Hive.openBox<String>(boxNameWalletsToDeleteOnStart);
115+
await hive.openBox<String>(boxNameWalletsToDeleteOnStart);
113116

114-
if (Hive.isBoxOpen(boxNamePrefs)) {
115-
_boxPrefs = Hive.box<dynamic>(boxNamePrefs);
117+
if (hive.isBoxOpen(boxNamePrefs)) {
118+
_boxPrefs = hive.box<dynamic>(boxNamePrefs);
116119
} else {
117-
_boxPrefs = await Hive.openBox<dynamic>(boxNamePrefs);
120+
_boxPrefs = await hive.openBox<dynamic>(boxNamePrefs);
118121
}
119122

120-
if (Hive.isBoxOpen(boxNameNodeModels)) {
121-
_boxNodeModels = Hive.box<NodeModel>(boxNameNodeModels);
123+
if (hive.isBoxOpen(boxNameNodeModels)) {
124+
_boxNodeModels = hive.box<NodeModel>(boxNameNodeModels);
122125
} else {
123-
_boxNodeModels = await Hive.openBox<NodeModel>(boxNameNodeModels);
126+
_boxNodeModels = await hive.openBox<NodeModel>(boxNameNodeModels);
124127
}
125128

126-
if (Hive.isBoxOpen(boxNamePrimaryNodes)) {
127-
_boxPrimaryNodes = Hive.box<NodeModel>(boxNamePrimaryNodes);
129+
if (hive.isBoxOpen(boxNamePrimaryNodes)) {
130+
_boxPrimaryNodes = hive.box<NodeModel>(boxNamePrimaryNodes);
128131
} else {
129-
_boxPrimaryNodes = await Hive.openBox<NodeModel>(boxNamePrimaryNodes);
132+
_boxPrimaryNodes = await hive.openBox<NodeModel>(boxNamePrimaryNodes);
130133
}
131134

132-
if (Hive.isBoxOpen(boxNameAllWalletsData)) {
133-
_boxAllWalletsData = Hive.box<dynamic>(boxNameAllWalletsData);
135+
if (hive.isBoxOpen(boxNameAllWalletsData)) {
136+
_boxAllWalletsData = hive.box<dynamic>(boxNameAllWalletsData);
134137
} else {
135-
_boxAllWalletsData = await Hive.openBox<dynamic>(boxNameAllWalletsData);
138+
_boxAllWalletsData = await hive.openBox<dynamic>(boxNameAllWalletsData);
136139
}
137140

138141
_boxNotifications =
139-
await Hive.openBox<NotificationModel>(boxNameNotifications);
142+
await hive.openBox<NotificationModel>(boxNameNotifications);
140143
_boxWatchedTransactions =
141-
await Hive.openBox<NotificationModel>(boxNameWatchedTransactions);
144+
await hive.openBox<NotificationModel>(boxNameWatchedTransactions);
142145
_boxWatchedTrades =
143-
await Hive.openBox<NotificationModel>(boxNameWatchedTrades);
144-
_boxTradesV2 = await Hive.openBox<Trade>(boxNameTradesV2);
145-
_boxTradeNotes = await Hive.openBox<String>(boxNameTradeNotes);
146-
_boxTradeLookup = await Hive.openBox<TradeWalletLookup>(boxNameTradeLookup);
146+
await hive.openBox<NotificationModel>(boxNameWatchedTrades);
147+
_boxTradesV2 = await hive.openBox<Trade>(boxNameTradesV2);
148+
_boxTradeNotes = await hive.openBox<String>(boxNameTradeNotes);
149+
_boxTradeLookup = await hive.openBox<TradeWalletLookup>(boxNameTradeLookup);
147150
_walletInfoSource =
148-
await Hive.openBox<xmr.WalletInfo>(xmr.WalletInfo.boxName);
149-
_boxFavoriteWallets = await Hive.openBox<String>(boxNameFavoriteWallets);
151+
await hive.openBox<xmr.WalletInfo>(xmr.WalletInfo.boxName);
152+
_boxFavoriteWallets = await hive.openBox<String>(boxNameFavoriteWallets);
150153

151154
await Future.wait([
152-
Hive.openBox<dynamic>(boxNamePriceCache),
155+
hive.openBox<dynamic>(boxNamePriceCache),
153156
_loadWalletBoxes(),
154157
]);
155158
}
@@ -177,12 +180,12 @@ class DB {
177180
);
178181

179182
for (final entry in mapped.entries) {
180-
if (Hive.isBoxOpen(entry.value.walletId)) {
183+
if (hive.isBoxOpen(entry.value.walletId)) {
181184
_walletBoxes[entry.value.walletId] =
182-
Hive.box<dynamic>(entry.value.walletId);
185+
hive.box<dynamic>(entry.value.walletId);
183186
} else {
184187
_walletBoxes[entry.value.walletId] =
185-
await Hive.openBox<dynamic>(entry.value.walletId);
188+
await hive.openBox<dynamic>(entry.value.walletId);
186189
}
187190
}
188191
}
@@ -192,7 +195,7 @@ class DB {
192195
_txCacheBoxes.remove(currency.identifier);
193196
}
194197
return _txCacheBoxes[currency.identifier] ??=
195-
await Hive.openBox<dynamic>(_boxNameTxCache(currency: currency));
198+
await hive.openBox<dynamic>(_boxNameTxCache(currency: currency));
196199
}
197200

198201
Future<void> closeTxCacheBox({required CryptoCurrency currency}) async {
@@ -206,7 +209,7 @@ class DB {
206209
_setCacheBoxes.remove(currency.identifier);
207210
}
208211
return _setCacheBoxes[currency.identifier] ??=
209-
await Hive.openBox<dynamic>(_boxNameSetCache(currency: currency));
212+
await hive.openBox<dynamic>(_boxNameSetCache(currency: currency));
210213
}
211214

212215
Future<void> closeAnonymitySetCacheBox({
@@ -222,7 +225,7 @@ class DB {
222225
_usedSerialsCacheBoxes.remove(currency.identifier);
223226
}
224227
return _usedSerialsCacheBoxes[currency.identifier] ??=
225-
await Hive.openBox<dynamic>(
228+
await hive.openBox<dynamic>(
226229
_boxNameUsedSerialsCache(currency: currency),
227230
);
228231
}
@@ -252,7 +255,7 @@ class DB {
252255
if (_walletBoxes[walletId] != null) {
253256
throw Exception("Attempted overwrite of existing wallet box!");
254257
}
255-
_walletBoxes[walletId] = await Hive.openBox<dynamic>(walletId);
258+
_walletBoxes[walletId] = await hive.openBox<dynamic>(walletId);
256259
}
257260

258261
Future<void> removeWalletBox({required String walletId}) async {
@@ -264,19 +267,19 @@ class DB {
264267
// reads
265268

266269
List<dynamic> keys<T>({required String boxName}) =>
267-
Hive.box<T>(boxName).keys.toList(growable: false);
270+
hive.box<T>(boxName).keys.toList(growable: false);
268271

269272
List<T> values<T>({required String boxName}) =>
270-
Hive.box<T>(boxName).values.toList(growable: false);
273+
hive.box<T>(boxName).values.toList(growable: false);
271274

272275
T? get<T>({
273276
required String boxName,
274277
required dynamic key,
275278
}) =>
276-
Hive.box<T>(boxName).get(key);
279+
hive.box<T>(boxName).get(key);
277280

278281
bool containsKey<T>({required String boxName, required dynamic key}) =>
279-
Hive.box<T>(boxName).containsKey(key);
282+
hive.box<T>(boxName).containsKey(key);
280283

281284
// writes
282285

@@ -286,33 +289,33 @@ class DB {
286289
required T value,
287290
}) async =>
288291
await mutex
289-
.protect(() async => await Hive.box<T>(boxName).put(key, value));
292+
.protect(() async => await hive.box<T>(boxName).put(key, value));
290293

291294
Future<void> add<T>({required String boxName, required T value}) async =>
292-
await mutex.protect(() async => await Hive.box<T>(boxName).add(value));
295+
await mutex.protect(() async => await hive.box<T>(boxName).add(value));
293296

294297
Future<void> addAll<T>({
295298
required String boxName,
296299
required Iterable<T> values,
297300
}) async =>
298301
await mutex
299-
.protect(() async => await Hive.box<T>(boxName).addAll(values));
302+
.protect(() async => await hive.box<T>(boxName).addAll(values));
300303

301304
Future<void> delete<T>({
302305
required dynamic key,
303306
required String boxName,
304307
}) async =>
305-
await mutex.protect(() async => await Hive.box<T>(boxName).delete(key));
308+
await mutex.protect(() async => await hive.box<T>(boxName).delete(key));
306309

307310
Future<void> deleteAll<T>({required String boxName}) async {
308311
await mutex.protect(() async {
309-
final box = await Hive.openBox<T>(boxName);
312+
final box = await hive.openBox<T>(boxName);
310313
await box.clear();
311314
});
312315
}
313316

314317
Future<void> deleteBoxFromDisk({required String boxName}) async =>
315-
await mutex.protect(() async => await Hive.deleteBoxFromDisk(boxName));
318+
await mutex.protect(() async => await hive.deleteBoxFromDisk(boxName));
316319

317320
///////////////////////////////////////////////////////////////////////////
318321
Future<bool> deleteEverything() async {

0 commit comments

Comments
 (0)