/*
 * 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;

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

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