import 'package:isar/isar.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/utilities/stack_file_system.dart'; class MainDB { MainDB._(); static MainDB? _instance; static MainDB get instance => _instance ??= MainDB._(); Isar? _isar; Isar get isar => _isar!; Future isarInit() async { if (_isar != null && isar.isOpen) return false; _isar = await Isar.open( [ TransactionSchema, TransactionNoteSchema, InputSchema, OutputSchema, UTXOSchema, AddressSchema, ], directory: (await StackFileSystem.applicationIsarDirectory()).path, inspector: true, name: "wallet_data", ); return true; } // addresses QueryBuilder getAddresses( String walletId) => isar.addresses.where().walletIdEqualTo(walletId); Future putAddress(Address address) => isar.writeTxn(() async { await isar.addresses.put(address); }); Future putAddresses(List
addresses) => isar.writeTxn(() async { await isar.addresses.putAll(addresses); }); Future updateAddress(Address oldAddress, Address newAddress) => isar.writeTxn(() async { newAddress.id = oldAddress.id; await oldAddress.transaction.load(); final txns = oldAddress.transaction.toList(); await isar.addresses.delete(oldAddress.id); await isar.addresses.put(newAddress); newAddress.transaction.addAll(txns); await newAddress.transaction.save(); }); // transactions QueryBuilder getTransactions( String walletId) => isar.transactions.where().walletIdEqualTo(walletId); Future putTransaction(Transaction transaction) => isar.writeTxn(() async { await isar.transactions.put(transaction); }); Future putTransactions(List transactions) => isar.writeTxn(() async { await isar.transactions.putAll(transactions); }); // utxos QueryBuilder getUTXOs(String walletId) => isar.utxos.where().walletIdEqualTo(walletId); Future putUTXO(UTXO utxo) => isar.writeTxn(() async { await isar.utxos.put(utxo); }); Future putUTXOs(List utxos) => isar.writeTxn(() async { await isar.utxos.putAll(utxos); }); // inputs QueryBuilder getInputs(String walletId) => isar.inputs.where().walletIdEqualTo(walletId); Future putInput(Input input) => isar.writeTxn(() async { await isar.inputs.put(input); }); Future putInputs(List inputs) => isar.writeTxn(() async { await isar.inputs.putAll(inputs); }); // outputs QueryBuilder getOutputs(String walletId) => isar.outputs.where().walletIdEqualTo(walletId); Future putOutput(Output output) => isar.writeTxn(() async { await isar.outputs.put(output); }); Future putOutputs(List outputs) => isar.writeTxn(() async { await isar.outputs.putAll(outputs); }); // transaction notes QueryBuilder getTransactionNotes(String walletId) => isar.transactionNotes.where().walletIdEqualTo(walletId); Future putTransactionNote(TransactionNote transactionNote) => isar.writeTxn(() async { await isar.transactionNotes.put(transactionNote); }); Future putTransactionNotes(List transactionNotes) => isar.writeTxn(() async { await isar.transactionNotes.putAll(transactionNotes); }); // Future deleteWalletBlockchainData(String walletId) async { final transactionCount = await getTransactions(walletId).count(); final addressCount = await getAddresses(walletId).count(); final utxoCount = await getUTXOs(walletId).count(); final inputCount = await getInputs(walletId).count(); final outputCount = await getOutputs(walletId).count(); await isar.writeTxn(() async { const paginateLimit = 50; // transactions for (int i = 0; i < transactionCount; i += paginateLimit) { final txns = await getTransactions(walletId) .offset(i) .limit(paginateLimit) .findAll(); await isar.transactions .deleteAll(txns.map((e) => e.id).toList(growable: false)); } // addresses for (int i = 0; i < addressCount; i += paginateLimit) { final addresses = await getAddresses(walletId) .offset(i) .limit(paginateLimit) .findAll(); await isar.addresses .deleteAll(addresses.map((e) => e.id).toList(growable: false)); } // utxos for (int i = 0; i < utxoCount; i += paginateLimit) { final utxos = await getUTXOs(walletId).offset(i).limit(paginateLimit).findAll(); await isar.utxos .deleteAll(utxos.map((e) => e.id).toList(growable: false)); } // inputs for (int i = 0; i < inputCount; i += paginateLimit) { final inputs = await getInputs(walletId).offset(i).limit(paginateLimit).findAll(); await isar.inputs .deleteAll(inputs.map((e) => e.id).toList(growable: false)); } // outputs for (int i = 0; i < outputCount; i += paginateLimit) { final outputs = await getOutputs(walletId).offset(i).limit(paginateLimit).findAll(); await isar.outputs .deleteAll(outputs.map((e) => e.id).toList(growable: false)); } }); } }