blob: de536de6bb961b1f6c96fe8b49260c9731dad5dc [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.syncbase.core;
import java.util.List;
public class Database extends DatabaseHandle {
protected Database(Id id) {
super(id);
}
public VersionedPermissions getPermissions() throws VError {
return io.v.syncbase.internal.Database.GetPermissions(fullName);
}
public void setPermissions(VersionedPermissions permissions) throws VError {
io.v.syncbase.internal.Database.SetPermissions(fullName, permissions);
}
public void create(Permissions permissions) throws VError {
io.v.syncbase.internal.Database.Create(fullName, permissions);
}
public void destroy() throws VError {
io.v.syncbase.internal.Database.Destroy(fullName);
}
public boolean exists() throws VError {
return io.v.syncbase.internal.Database.Exists(fullName);
}
public BatchDatabase beginBatch(BatchOptions options) throws VError {
String batchHandle = io.v.syncbase.internal.Database.BeginBatch(fullName, options);
return new BatchDatabase(this.id, batchHandle);
}
public Syncgroup syncgroup(String name) throws VError {
return syncgroup(new Id(io.v.syncbase.internal.Blessings.UserBlessingFromContext(), name));
}
public Syncgroup syncgroup(Id id) {
return new Syncgroup(this, id);
}
public List<Id> listSyncgroups() throws VError {
return io.v.syncbase.internal.Database.ListSyncgroups(fullName);
}
public interface WatchPatternsCallbacks {
void onChange(WatchChange watchChange);
void onError(VError vError);
}
public void watch(byte[] resumeMarker, List<CollectionRowPattern> patterns,
final WatchPatternsCallbacks callbacks) {
try {
io.v.syncbase.internal.Database.WatchPatterns(fullName, resumeMarker, patterns,
new io.v.syncbase.internal.Database.WatchPatternsCallbacks() {
@Override
public void onChange(WatchChange watchChange) {
callbacks.onChange(watchChange);
}
@Override
public void onError(VError vError) {
callbacks.onError(vError);
}
});
} catch (VError vError) {
callbacks.onError(vError);
}
}
public interface BatchOperation {
void run(BatchDatabase batchDatabase);
}
public void runInBatch(final BatchOperation op, BatchOptions options) throws VError {
// TODO(sadovsky): Make the number of attempts configurable.
for (int i = 0; i < 3; i++) {
BatchDatabase batchDatabase = beginBatch(options);
op.run(batchDatabase);
// A readonly batch should be Aborted; Commit would fail.
if (options.readOnly) {
batchDatabase.abort();
return;
}
try {
batchDatabase.commit();
return;
} catch (VError vError) {
// TODO(sadovsky): Commit() can fail for a number of reasons, e.g. RPC
// failure or ErrConcurrentTransaction. Depending on the cause of failure,
// it may be desirable to retry the Commit() and/or to call Abort().
if (!vError.id.equals(VError.SYNCBASE_CONCURRENT_BATCH)) {
throw vError;
}
}
}
}
}