// Copyright 2015 The Chromium 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 leveldb.mojom; import "components/filesystem/public/interfaces/directory.mojom"; import "mojo/common/unguessable_token.mojom"; import "mojo/common/memory_allocator_dump_cross_process_uid.mojom"; enum DatabaseError { OK, NOT_FOUND, CORRUPTION, NOT_SUPPORTED, INVALID_ARGUMENT, IO_ERROR }; enum BatchOperationType { PUT_KEY, DELETE_KEY, DELETE_PREFIXED_KEY, // |key| is source prefixed key, |value| is destination prefixed key. COPY_PREFIXED_KEY }; // TODO(dmurph): change to a union type for value population. struct BatchedOperation { BatchOperationType type; array key; // Populated for operations of types PUT_KEY and COPY_PREFIXED_KEY. array? value; }; struct KeyValue { array key; array value; }; enum SharedReadCache { Default, Web, }; // Options which control the behavior of a database. (This struct corresponds // with the struct in leveldb's options.h.) // // Note: This struct does not have default values. The values are set by a // struct trait which copies values to/from a leveldb_env::Options instance. struct OpenOptions { // TODO(erg): Find all comparators and copy them into the service. // If true, the database will be created if it is missing. bool create_if_missing; // If true, an error is raised if the database already exists. bool error_if_exists; // If true, the implementation will do aggressive checking of the // data it is processing and will stop early if it detects any // errors. bool paranoid_checks; // Amount of data to build up in memory (backed by an unsorted log // on disk) before converting to a sorted on-disk file. uint64 write_buffer_size; // Number of open files that can be used by the DB. int32 max_open_files; // The shared read cache to use. SharedReadCache shared_block_read_cache = SharedReadCache.Default; }; // Service which hands out databases. interface LevelDBService { // Open the database with the specified "name" in the specified "directory". // Fails if the database doesn't already exist. Open(filesystem.mojom.Directory directory, string dbname, mojo.common.mojom.MemoryAllocatorDumpCrossProcessUid? memory_dump_id, associated LevelDBDatabase& database) => (DatabaseError status); // Open the database with the specified "name" in the specified "directory". OpenWithOptions(OpenOptions options, filesystem.mojom.Directory directory, string dbname, mojo.common.mojom.MemoryAllocatorDumpCrossProcessUid? memory_dump_id, associated LevelDBDatabase& database) => (DatabaseError status); // Opens a database stored purely in memory. OpenInMemory(mojo.common.mojom.MemoryAllocatorDumpCrossProcessUid? memory_dump_id, associated LevelDBDatabase& database) => (DatabaseError status); // Destroys the contents of the specified database. Returns OK if the database // already didn't exist. Destroy(filesystem.mojom.Directory directory, string dbname) => (DatabaseError status); }; // A leveldb database. interface LevelDBDatabase { // Basic Interface ------------------------------------------------------- // Sets the database entry for "key" to "value". Returns OK on success. Put(array key, array value) => (DatabaseError status); // Remove the database entry (if any) for "key". Returns OK on // success, and a non-OK status on error. It is not an error if "key" // did not exist in the database. Delete(array key) => (DatabaseError status); DeletePrefixed(array key_prefix) => (DatabaseError status); // Atomically performs all |operations|. // The DELETE_PREFIXED_KEY applies to all keys that exist before these // operations execute. If a 'put' operation precedes a delete prefix, then it // will only be deleted if it was a previously-populated key in the database. // The COPY_PREFIXED_KEY operations will always ignore all other changes in // the operations batch. It will not copy records that were inserted earlier // in the operations list. Write(array operations) => (DatabaseError status); Get(array key) => (DatabaseError status, array value); GetPrefixed(array key_prefix) => (DatabaseError status, array data); // Copies all data from the source prefix to the destination prefix. Useful // for deep copies. CopyPrefixed(array source_key_prefix, array destination_key_prefix) => (DatabaseError status); // Snapshots ------------------------------------------------------------- // Returns a handle to the current database state. GetSnapshot() => (mojo.common.mojom.UnguessableToken snapshot); // Releases a previously acquired snapshot. ReleaseSnapshot(mojo.common.mojom.UnguessableToken snapshot); // If |key| exists at the time |snapshot_id| was taken, return OK and the // value. Otherwise return NOT_FOUND. GetFromSnapshot(mojo.common.mojom.UnguessableToken snapshot, array key) => (DatabaseError status, array value); // Iteartors ------------------------------------------------------------- // Creates an iterator, either from the current view or from a snapshot. NewIterator() => (mojo.common.mojom.UnguessableToken iterator); NewIteratorFromSnapshot(mojo.common.mojom.UnguessableToken snapshot) => (mojo.common.mojom.UnguessableToken? iterator); ReleaseIterator(mojo.common.mojom.UnguessableToken iterator); // Positions the iterator at the first key, last key, or the first key after // |target|. [Sync] IteratorSeekToFirst(mojo.common.mojom.UnguessableToken iterator) => (bool valid, DatabaseError status, array? key, array? value); [Sync] IteratorSeekToLast(mojo.common.mojom.UnguessableToken iterator) => (bool valid, DatabaseError status, array? key, array? value); [Sync] IteratorSeek(mojo.common.mojom.UnguessableToken iterator, array target) => (bool valid, DatabaseError status, array? key, array? value); // Moves forward or backwards in iterator space. [Sync] IteratorNext(mojo.common.mojom.UnguessableToken iterator) => (bool valid, DatabaseError status, array? key, array? value); [Sync] IteratorPrev(mojo.common.mojom.UnguessableToken iterator) => (bool valid, DatabaseError status, array? key, array? value); };