blob: cb7c21a0bd18a5337cd79d95f4f30753c7d4bebf [file] [log] [blame]
// Copyright 2015 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.v23.services.syncbase.nosql;
import io.v.v23.context.VContext;
import io.v.v23.verror.VException;
/**
* Various utility methods for the NoSql database.
*/
public class NoSql {
public static Database newDatabase(String parentFullName, String relativeName, Schema schema) {
return new DatabaseImpl(parentFullName, relativeName, schema);
}
/**
* Interface for a batch operation that is executed as part of {@link #runInBatch runInBatch()}.
*/
public static interface BatchOperation {
/**
* Performs the batch operation.
*
* @param db batch database on which the operation is performed
* @throws VException if there was an error performing the operation; if thrown, the
* batch operation is aborted
*/
void run(BatchDatabase db) throws VException;
}
/**
* Runs the given batch operation, managing retries and
* {@link BatchDatabase#commit commit()}/{@link BatchDatabase#abort abort()}s.
*
* @param ctx Vanadium context
* @param db database on which the batch operation is to be performed
* @param opts batch configuration
* @param op batch operation
* @throws VException if there was an error executing the given batch operation
*/
public static void runInBatch(VContext ctx, Database db, BatchOptions opts, BatchOperation op)
throws VException {
for (int i = 0; i < 3; ++i) {
BatchDatabase batch = db.beginBatch(ctx, opts);
try {
op.run(batch);
} catch (VException e) {
batch.abort(ctx);
throw e;
}
try {
batch.commit(ctx);
return;
} catch (VException e) {
if (!e.getID().equals(Errors.CONCURRENT_BATCH)) {
throw e;
}
}
}
throw Errors.newConcurrentBatch(ctx);
}
private NoSql() {}
}