putAll method

  1. @override
  2. @client
Future<int?> putAll(
  1. String key,
  2. AtData value,
  3. AtMetaData? metadata
)
override

Writes value and metadata for key atomically. Returns the commit-log sequence number assigned to this write, or null if no sequence number was produced.

Implementation

@override
@client
Future<int?> putAll(String key, AtData value, AtMetaData? metadata) async {
  key = key.toLowerCase();
  final atKeyType = AtKey.getKeyType(key, enforceNameSpace: false);
  if (atKeyType == KeyType.invalidKey) {
    logger.warning('Key $key is invalid');
    throw InvalidAtKeyException('Key $key is invalid');
  }
  try {
    int? result;
    String hive_key = HiveKeyStoreHelper.prepareKey(key);
    _checkMaxLength(hive_key);
    AtData? existingData;
    if (await exists(key)) {
      existingData = await get(key);
    }
    value.metaData = AtMetadataBuilder(
            newAtMetaData: metadata!,
            existingMetaData: existingData?.metaData,
            atSign: atSign)
        .build();
    await getBox().put(hive_key, value);
    _updateMetadataCache(key, value.metaData);
    // `_commitLog` is null on a commit-log-free keystore — the write
    // still succeeds, it just produces no sequence number.
    result = await _commitLog?.commit(hive_key, CommitOp.UPDATE_ALL);
    _changesController
        .add(existingData == null ? KeyAdded(key) : KeyUpdated(key));
    return result;
  } on HiveError catch (error) {
    logger.severe('HiveAtKeyValueStore get error: $error');
    await _restartHiveBox(error);
    throw DataStoreException(error.message);
  }
}