// Copyright 2008 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gwtorm.client;

/**
 * Application database definition and top-level schema access.
 * <p>
 * Applications should extend this interface and declare relation methods for
 * each entity/table used. Relation methods must be marked with the
 * {@link Relation} annotation and return an interface extending {@link Access}.
 * At runtime the application extension of Schema will be automatically
 * implemented with a generated class, providing implementations of the Access
 * extensions from each of the declared relation methods.
 * <p>
 * Instances of a schema should be obtained through the
 * {@link com.google.gwtorm.jdbc.Database} class on a pure-JDBC implementation
 * and through <code>GWT.create()</code> on the GWT client side.
 * <p>
 * In the JDBC implementation each Schema instance wraps around a single JDBC
 * Connection object. Therefore a Schema instance has a 1:1 relationship with an
 * active database handle.
 * <p>
 * A Schema instance (as well as its returned Access instances) is not thread
 * safe. Applications must provide their own synchronization, or ensure that at
 * most 1 thread access a Schema instance (or any returned Access instance) at a
 * time. The safest mapping is 1 schema instance per thread, never shared.
 * <p>
 * For example the OurDb schema creates two tables (identical structure) named
 * <code>someFoos</code> and <code>otherFoos</code>:
 *
 * <pre>
 * public interface FooAccess extends Access&lt;Foo, Foo.Key&gt; {
 *   &#064;PrimaryKey(&quot;key&quot;)
 *   Foo byKey(Foo.Key k) throws OrmException;
 * }
 * public interface OurDb extends Schema {
 *   &#064;Relation
 *   FooAccess someFoos();
 *
 *   &#064;Relation
 *   FooAccess otherFoos();
 * }
 * </pre>
 */
public interface Schema {
  /**
   * Automatically create the database tables.
   *
   * @throws OrmException tables already exist or create permission is denied.
   */
  void createSchema() throws OrmException;

  /**
   * Begin a new transaction.
   * <p>
   * Only one transaction can be in-flight at a time on any given Schema
   * instance. Applications must commit or rollback a previously created
   * transaction before beginning another transaction on the same Schema.
   *
   * @return the new transaction.
   * @throws OrmException the schema has been closed or another transaction has
   *         already been begun on this schema instance.
   */
  Transaction beginTransaction() throws OrmException;

  /**
   * Execute a task within a transaction, restarting it if necessary.
   *
   * @param <T> type of return value for the task.
   * @param <S> type of <code>this</code>.
   * @param task the task to execute.
   * @return the return value of the task.
   * @throws OrmException the task could not be completed successfully.
   */
  <T, S extends Schema> T run(OrmRunnable<T, S> task) throws OrmException;

  /**
   * Close the schema and release all resources.
   */
  void close();
}
