put method

  1. @override
Future<int?> put(
  1. String key,
  2. AtData value, {
  3. bool skipCommit = false,
})
override

hive does not support directly storing emoji characters, therefore keys are encoded in HiveKeyStoreHelper.prepareKey using utf7 before storing.

Implementation

@override
Future<int?> put(String key, AtData value, {bool skipCommit = false}) async {
  key = key.toLowerCase();
  final atKey = AtKey.getKeyType(key, enforceNameSpace: false);
  if (atKey == KeyType.invalidKey) {
    logger.warning('Key $key is invalid');
    throw InvalidAtKeyException('Key $key is invalid');
  }
  int? result;

  CommitOp commitOp = CommitOp.UPDATE_ALL;

  try {
    // If does not exist, create a new key,
    // else update existing key.
    if (!await exists(key)) {
      result = await create(key, value, skipCommit: skipCommit);
    } else {
      AtData? existingData = await get(key);
      String hive_key = HiveKeyStoreHelper.prepareKey(key);
      var hive_value = HiveKeyStoreHelper.prepareDataForKeystoreOperation(
          value,
          existingAtData: existingData!,
          atSign: atSign);
      logger.finest('hive key:$hive_key');
      logger.finest('hive value:$hive_value');
      await getBox().put(hive_key, hive_value);
      _updateMetadataCache(key, hive_value.metaData);
      if (skipCommit) {
        result = -1;
      } else {
        // `_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);
      }
      _changesController.add(KeyUpdated(key));
    }
  } on DataStoreException {
    rethrow;
  } on Exception catch (exception) {
    logger.severe('HiveAtKeyValueStore put exception: $exception');
    throw DataStoreException('exception in put: ${exception.toString()}');
  } on HiveError catch (error) {
    await _restartHiveBox(error);
    logger.severe('HiveAtKeyValueStore error: $error');
    throw DataStoreException(error.message);
  }
  return result;
}