executeVerb method

  1. @override
Future<String?> executeVerb(
  1. VerbBuilder builder, {
  2. bool? sync,
})

Executes a verb builder on the local secondary. For update and delete operation, if sync is set to true or if SyncStrategy is SyncStrategy.IMMEDIATE then data is synced from local to remote. if sync is set to false, no sync operation is done.

Implementation

@override
Future<String?> executeVerb(VerbBuilder builder, {sync}) async {
  var verbResult;
  try {
    sync ??= (_preference!.syncStrategy == SyncStrategy.IMMEDIATE);
    if (builder is UpdateVerbBuilder || builder is DeleteVerbBuilder) {
      var syncManager = SyncManagerImpl.getInstance().getSyncManager(_atSign);
      //1. if local and server are out of sync, first sync before updating current key-value
      if (sync) {
        await syncManager!.sync(regex: _preference!.syncRegex);
      }
      //2 . update/delete to local store
      var operation;
      if (builder is UpdateVerbBuilder) {
        verbResult = await _update(builder);
        switch (builder.operation) {
          case UPDATE_META:
            operation = CommitOp.UPDATE_META;
            break;
          case UPDATE_ALL:
            operation = CommitOp.UPDATE_ALL;
            break;
          default:
            operation = CommitOp.UPDATE;
        }
      } else if (builder is DeleteVerbBuilder) {
        verbResult = await _delete(builder);
        operation = CommitOp.DELETE;
      }
      // 3. sync latest update/delete if strategy is immediate
      if (sync && _preference!.syncStrategy == SyncStrategy.IMMEDIATE) {
        var local_commit_seq = verbResult.split(':')[1];
        await syncManager!
            .syncImmediate(local_commit_seq, builder, operation);
      }
    } else if (builder is LLookupVerbBuilder) {
      verbResult = await _llookup(builder);
    } else if (builder is ScanVerbBuilder) {
      verbResult = await _scan(builder);
    }
  } on Exception catch (e) {
    if (e is AtLookUpException) {
      return Future.error(AtClientException(e.errorCode, e.errorMessage));
    } else {
      rethrow;
    }
  }
  return verbResult;
}