/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// NOTE: This type is specified as 'any' in the IndexedDB specification, but is always
// constrained to this union.
typedef (DOMString or sequence<DOMString>) IDBKeyPath;

[
    Conditional=INDEXED_DATABASE,
    GenerateIsReachable=Impl,
    JSCustomMarkFunction,
    SkipVTableValidation,
] interface IDBObjectStore {
    attribute DOMString name;
    readonly attribute IDBKeyPath? keyPath;
    readonly attribute DOMStringList indexNames;
    readonly attribute IDBTransaction transaction;
    readonly attribute boolean autoIncrement;

    [CallWith=ScriptState, MayThrowException] IDBRequest put(any value, optional any key);
    [CallWith=ScriptState, MayThrowException] IDBRequest add(any value, optional any key);
    [CallWith=ScriptState, ImplementedAs=deleteFunction, MayThrowException] IDBRequest delete(IDBKeyRange? keyRange);
    [CallWith=ScriptState, ImplementedAs=deleteFunction, MayThrowException] IDBRequest delete(any key);
    [CallWith=ScriptState, MayThrowException] IDBRequest get(IDBKeyRange? key);
    [CallWith=ScriptState, MayThrowException] IDBRequest get(any key);
    [CallWith=ScriptState, MayThrowException] IDBRequest getKey(IDBKeyRange? key);
    [CallWith=ScriptState, MayThrowException] IDBRequest getKey(any key);
    [CallWith=ScriptState, MayThrowException] IDBRequest clear();
    [CallWith=ScriptState, MayThrowException] IDBRequest openCursor(optional IDBKeyRange? range = null, optional IDBCursorDirection direction = "next");
    [CallWith=ScriptState, MayThrowException] IDBRequest openCursor(any key, optional IDBCursorDirection direction = "next");
    [CallWith=ScriptState, MayThrowException] IDBRequest openKeyCursor(optional IDBKeyRange? range = null, optional IDBCursorDirection direction = "next");
    [CallWith=ScriptState, MayThrowException] IDBRequest openKeyCursor(any key, optional IDBCursorDirection direction = "next");
    [CallWith=ScriptState, MayThrowException] IDBRequest getAll(optional IDBKeyRange? range = null, optional [EnforceRange] unsigned long count);
    [CallWith=ScriptState, MayThrowException] IDBRequest getAll(any key, optional [EnforceRange] unsigned long count);
    [CallWith=ScriptState, MayThrowException] IDBRequest getAllKeys(optional IDBKeyRange? range = null, optional [EnforceRange] unsigned long count);
    [CallWith=ScriptState, MayThrowException] IDBRequest getAllKeys(any key, optional [EnforceRange] unsigned long count);
    [CallWith=ScriptState, MayThrowException] IDBIndex createIndex(DOMString name, (DOMString or sequence<DOMString>) keyPath, optional IDBIndexParameters options);
    [MayThrowException] IDBIndex index(DOMString name);
    [MayThrowException] void deleteIndex(DOMString name);
    [CallWith=ScriptState, MayThrowException] IDBRequest count(optional IDBKeyRange? range = null);
    [CallWith=ScriptState, MayThrowException] IDBRequest count(any key);
};

dictionary IDBIndexParameters {
    boolean unique = false;
    boolean multiEntry = false;
};
