writeIfRevision method

  1. @override
Future<StorageJdbWriteResult> writeIfRevision(
  1. StorageJdbWriteQuery query
)

Safe transaction write of multiple infos.

Implementation

@override
Future<StorageJdbWriteResult> writeIfRevision(
  StorageJdbWriteQuery query,
) async {
  // Encode before creating the transaction to handle async codec.
  var encodedList = await encodeEntries(query.entries);

  var expectedRevision = query.revision ?? 0;
  var txn = _idbDatabase.transaction([
    idbInfoStore,
    idbEntryStore,
  ], idbModeReadWrite);

  int? readRevision = (await _txnGetRevision(txn)) ?? 0;
  var success = (expectedRevision == readRevision);

  // Notify for the web
  int? shouldNotifyRevision;

  if (success) {
    if (query.entries.isNotEmpty) {
      readRevision = await _txnAddEntries(txn, encodedList);
      // Set revision info
      if (readRevision != null) {
        await _txnPutRevision(txn, readRevision);
        shouldNotifyRevision = readRevision;
      }
    }
    if (query.infoEntries.isNotEmpty) {
      for (var infoEntry in query.infoEntries) {
        await _txnSetInfoEntry(txn, infoEntry);
      }
    }
  }
  await txn.completed;
  if (shouldNotifyRevision != null) {
    notifyRevision(shouldNotifyRevision);
  }
  return StorageJdbWriteResult(
    revision: readRevision,
    query: query,
    success: success,
  );
}