// 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);
    }

    /**
     * Creates a {@link RowRange} representing a single row.
     */
    public static RowRange newSingleRowRange(String row) {
        return new RowRangeImpl(row);
    }

    /**
     * Creates a {@link RowRange} represented by the provided {@code [start, limit)} parameters.
     */
    public static RowRange newRowRange(String start, String limit) {
        return new RowRangeImpl(start, limit);
    }

    /**
     * Creates {@link PrefixRange} with the provided prefix.
     */
    public static PrefixRange newPrefixRange(String prefix) {
        return new PrefixRangeImpl(prefix);
    }

    /**
     * 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() {}
}