executeVerb method
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;
}