// 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.

module.exports = Database;

// Database represents a collection of Tables. Batches, queries, sync, watch,
// etc. all operate at the Database level.
function Database(fullName, name) {
  if (typeof this !== Database) {
    return new Database(fullName, name);
  }

  /**
   * @property name
   * @type {string}
   */
  Object.defineProperty(this, 'name', {
    value: name,
    writable: false
  });

  /**
   * @property name
   * @type {string}
   */
  Object.defineProperty(this, 'fullName', {
    value: fullName,
    writable: false
  });
}

// Table returns the Table with the given name.
// relativeName must not contain slashes.
Database.prototype.table = function(relativeName) {};

// ListTables returns a list of all Table names.
Database.prototype.listTables = function(ctx) {};

// Create creates this Database.
// If perms is nil, we inherit (copy) the App perms.
Database.prototype.create = function(ctx, perms) {};

// Delete deletes this Database.
Database.prototype.delete = function(ctx) {};

// Create creates the specified Table.
// If perms is nil, we inherit (copy) the Database perms.
// relativeName must not contain slashes.
Database.prototype.createTable = function(ctx, relativeName, perms) {};

// DeleteTable deletes the specified Table.
Database.prototype.deleteTable = function(ctx, relativeName) {};

// SetPermissions replaces the current Permissions for an object.
Database.prototype.setPermissions = function(ctx, perms, version) {};

// GetPermissions returns the current Permissions for an object.
Database.prototype.getPermissions = function(ctx) {};

// BeginBatch creates a new batch. Instead of calling this function directly,
// clients are recommended to use the RunInBatch() helper function, which
// detects "concurrent batch" errors and handles retries internally.
//
// Default concurrency semantics:
// - Reads inside a batch see a consistent snapshot, taken during
//   BeginBatch(), and will not see the effect of writes inside the batch.
// - Commit() may fail with ErrConcurrentBatch, indicating that after
//   BeginBatch() but before Commit(), some concurrent routine wrote to a key
//   that matches a key or row-range read inside this batch. (Writes inside a
//   batch cannot cause that batch's Commit() to fail.)
// - Other methods (e.g. Get) will never fail with error ErrConcurrentBatch,
//   even if it is known that Commit() will fail with this error.
//
// Concurrency semantics can be configured using BatchOptions.
Database.prototype.beginBatch = function(ctx, opts) {};

// BatchDatabase is a handle to a set of reads and writes to the database that
// should be considered an atomic unit. See BeginBatch() for concurrency
// semantics.
function BatchDatabase(db) {
  if (typeof this !== BatchDatabase) {
    return new BatchDatabase(db);
  }

  this._db = db;
}

// Table returns the Table with the given name.
// relativeName must not contain slashes.
BatchDatabase.prototype.table = function(relativeName) {
  return this._db.table(relativeName);
};

// ListTables returns a list of all Table names.
BatchDatabase.prototype.listTables = function(ctx) {
  return this._db.listTables(ctx);
};

// Commit persists the pending changes to the database.
BatchDatabase.prototype.commit = function(relativeName) {};

// Abort notifies the server that any pending changes can be discarded.
// It is not strictly required, but it may allow the server to release locks
// or other resources sooner than if it was not called.
BatchDatabase.prototype.abort = function(ctx) {};