summaryrefslogtreecommitdiff
path: root/plugins/Dbx_kv/src/hamsterdb/include/ham
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Dbx_kv/src/hamsterdb/include/ham')
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.h2535
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.hpp711
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_int.h319
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_ola.h244
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_srv.h118
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/msstdint.h259
-rw-r--r--plugins/Dbx_kv/src/hamsterdb/include/ham/types.h143
7 files changed, 0 insertions, 4329 deletions
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.h
deleted file mode 100644
index 668cfc7cde..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.h
+++ /dev/null
@@ -1,2535 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-/**
- * @file hamsterdb.h
- * @brief Include file for hamsterdb Embedded Storage
- * @author Christoph Rupp, chris@crupp.de
- * @version 2.1.10
- *
- * @mainpage
- *
- * This manual documents the hamsterdb C API. hamsterdb is a key/value database
- * that is linked directly into your application, avoiding all the overhead
- * that is related to external databases and RDBMS systems.
- *
- * This header file declares all functions and macros that are needed to use
- * hamsterdb. The comments are formatted in Doxygen style and can be extracted
- * to automagically generate documentation. The documentation is also available
- * online here: <a href="http://hamsterdb.com/public/scripts/html_www">
- http://hamsterdb.com/public/scripts/html_www</a>.
- *
- * In addition, there's a tutorial book hosted on github:
- * <a href="http://github.com/cruppstahl/hamsterdb/wiki/Tutorial">
- http://github.com/cruppstahl/hamsterdb/wiki/Tutorial</a>.
- *
- * If you want to create or open Databases or Environments (a collection of
- * multiple Databases), the following functions will be interesting for you:
- * <table>
- * <tr><td>@ref ham_env_create</td><td>Creates an Environment</td></tr>
- * <tr><td>@ref ham_env_open</td><td>Opens an Environment</td></tr>
- * <tr><td>@ref ham_env_close</td><td>Closes an Environment</td></tr>
- * <tr><td>@ref ham_env_create_db</td><td>Creates a Database in an
- Environment</td></tr>
- * <tr><td>@ref ham_env_open_db</td><td>Opens a Database from an
- Environment</td></tr>
- * <tr><td>@ref ham_db_close</td><td>Closes a Database</td></tr>
- * </table>
- *
- * To insert, lookup or delete key/value pairs, the following functions are
- * used:
- * <table>
- * <tr><td>@ref ham_db_insert</td><td>Inserts a key/value pair into a
- Database</td></tr>
- * <tr><td>@ref ham_db_find</td><td>Lookup of a key/value pair in a
- Database</td></tr>
- * <tr><td>@ref ham_db_erase</td><td>Erases a key/value pair from a
- Database</td></tr>
- * </table>
- *
- * Alternatively, you can use Cursors to iterate over a Database:
- * <table>
- * <tr><td>@ref ham_cursor_create</td><td>Creates a new Cursor</td></tr>
- * <tr><td>@ref ham_cursor_find</td><td>Positions the Cursor on a key</td></tr>
- * <tr><td>@ref ham_cursor_insert</td><td>Inserts a new key/value pair with a
- Cursor</td></tr>
- * <tr><td>@ref ham_cursor_erase</td><td>Deletes the key/value pair that
- the Cursor points to</td></tr>
- * <tr><td>@ref ham_cursor_overwrite</td><td>Overwrites the value of the current key</td></tr>
- * <tr><td>@ref ham_cursor_move</td><td>Moves the Cursor to the first, next,
- previous or last key in the Database</td></tr>
- * <tr><td>@ref ham_cursor_close</td><td>Closes the Cursor</td></tr>
- * </table>
- *
- * If you want to use Transactions, then the following functions are required:
- * <table>
- * <tr><td>@ref ham_txn_begin</td><td>Begins a new Transaction</td></tr>
- * <tr><td>@ref ham_txn_commit</td><td>Commits the current
- Transaction</td></tr>
- * <tr><td>@ref ham_txn_abort</td><td>Aborts the current Transaction</td></tr>
- * </table>
- *
- * hamsterdb supports remote Databases. The server can be embedded
- * into your application or run standalone (see tools/hamzilla for a Unix
- * daemon or Win32 service which hosts Databases). If you want to embed the
- * server then the following functions have to be used:
- * <table>
- * <tr><td>@ref ham_srv_init</td><td>Initializes the server</td></tr>
- * <tr><td>@ref ham_srv_add_env</td><td>Adds an Environment to the
- server. The Environment with all its Databases will then be available
- remotely.</td></tr>
- * <tr><td>@ref ham_srv_close</td><td>Closes the server and frees all allocated
- resources</td></tr>
- * </table>
- *
- * If you need help then you're always welcome to use the <a
- href="https://groups.google.com/forum/?fromgroups#!forum/hamsterdb-user">
- mailing list</a>,
- * drop a message (chris at crupp dot de) or use the <a
- href="http://hamsterdb.com/index/contact">contact form</a>.
- *
- * Have fun!
- */
-
-#ifndef HAM_HAMSTERDB_H
-#define HAM_HAMSTERDB_H
-
-#include <ham/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* deprecated */
-#define HAM_API_REVISION 3
-
-/**
- * The version numbers
- *
- * @remark A change of the major revision means a significant update
- * with a lot of new features and API changes.
- *
- * The minor version means a significant update without API changes, and the
- * revision is incremented for each release with minor improvements only.
- *
- * The file version describes the version of the binary database format.
- * hamsterdb is neither backwards- nor forwards-compatible regarding file
- * format changes.
- *
- * If a file was created with hamsterdb pro then the msb of the file version
- * is set. hamsterdb pro is able to open files created with hamsterdb (APL
- * version), but not vice versa.
- *
- * History of file versions:
- * 2.1.0: introduced the file version; version is 0
- * 2.1.3: new btree format, file format cleanups; version is 1
- * 2.1.4: new btree format for duplicate keys/var. length keys; version is 2
- * 2.1.5: new freelist; version is 3
- * 2.1.10: changes in btree node format; version is 4
- */
-#define HAM_VERSION_MAJ 2
-#define HAM_VERSION_MIN 1
-#define HAM_VERSION_REV 10
-#define HAM_FILE_VERSION 4
-
-/**
- * The hamsterdb Database structure
- *
- * This structure is allocated in @ref ham_env_create_db and
- * @ref ham_env_open_db. It is deleted in @a ham_db_close.
- */
-struct ham_db_t;
-typedef struct ham_db_t ham_db_t;
-
-/**
- * The hamsterdb Environment structure
- *
- * This structure is allocated with @ref ham_env_create and @ref ham_env_open
- * and is deleted in @ref ham_env_close.
- */
-struct ham_env_t;
-typedef struct ham_env_t ham_env_t;
-
-/**
- * A Database Cursor
- *
- * A Cursor is used for bi-directionally traversing the Database and
- * for inserting/deleting/searching Database items.
- *
- * This structure is allocated with @ref ham_cursor_create and deleted with
- * @ref ham_cursor_close.
- */
-struct ham_cursor_t;
-typedef struct ham_cursor_t ham_cursor_t;
-
-/**
- * A generic record.
- *
- * A record represents data items in hamsterdb. Before using a record, it
- * is important to initialize all record fields with zeroes, i.e. with
- * the C library routines memset(3) or bzero(2).
- *
- * When hamsterdb returns a record structure, the pointer to the record
- * data is provided in @a data. This pointer is only temporary and will be
- * overwritten by subsequent hamsterdb API calls using the same Transaction
- * (or, if Transactions are disabled, using the same Database). The pointer
- * will also be invalidated after the Transaction is aborted or committed.
- *
- * To avoid this, the calling application can allocate the @a data pointer.
- * In this case, you have to set the flag @ref HAM_RECORD_USER_ALLOC. The
- * @a size parameter will then return the size of the record. It's the
- * responsibility of the caller to make sure that the @a data parameter is
- * large enough for the record.
- *
- * The record->data pointer is not threadsafe. For threadsafe access it is
- * recommended to use @a HAM_RECORD_USER_ALLOC or have each thread manage its
- * own Transaction.
- */
-typedef struct {
- /** The size of the record data, in bytes */
- uint32_t size;
-
- /** Pointer to the record data */
- void *data;
-
- /** The record flags; see @ref HAM_RECORD_USER_ALLOC */
- uint32_t flags;
-
- /** Offset for partial reading/writing; see @ref HAM_PARTIAL */
- uint32_t partial_offset;
-
- /** Size for partial reading/writing; see @ref HAM_PARTIAL */
- uint32_t partial_size;
-
-} ham_record_t;
-
-/** Flag for @ref ham_record_t (only really useful in combination with
- * @ref ham_cursor_move, @ref ham_cursor_find and @ref ham_db_find)
- */
-#define HAM_RECORD_USER_ALLOC 1
-
-/**
- * A macro to statically initialize a @ref ham_record_t structure.
- *
- * Usage:
- * ham_record_t rec = ham_make_record(ptr, size);
- */
-#define ham_make_record(PTR, SIZE) { SIZE, PTR, 0 }
-
-/**
- * A generic key.
- *
- * A key represents key items in hamsterdb. Before using a key, it
- * is important to initialize all key fields with zeroes, i.e. with
- * the C library routines memset(3) or bzero(2).
- *
- * hamsterdb usually uses keys to insert, delete or search for items.
- * However, when using Database Cursors and the function @ref ham_cursor_move,
- * hamsterdb also returns keys. In this case, the pointer to the key
- * data is provided in @a data. This pointer is only temporary and will be
- * overwritten by subsequent calls to @ref ham_cursor_move using the
- * same Transaction (or, if Transactions are disabled, using the same Database).
- * The pointer will also be invalidated after the Transaction is aborted
- * or committed.
- *
- * To avoid this, the calling application can allocate the @a data pointer.
- * In this case, you have to set the flag @ref HAM_KEY_USER_ALLOC. The
- * @a size parameter will then return the size of the key. It's the
- * responsibility of the caller to make sure that the @a data parameter is
- * large enough for the key.
- *
- * The key->data pointer is not threadsafe. For threadsafe access it is
- * recommended to use @a HAM_KEY_USER_ALLOC or have each thread manage its
- * own Transaction.
- */
-typedef struct {
- /** The size of the key, in bytes */
- uint16_t size;
-
- /** The data of the key */
- void *data;
-
- /** The key flags; see @ref HAM_KEY_USER_ALLOC */
- uint32_t flags;
-
- /** For internal use */
- uint32_t _flags;
-
-} ham_key_t;
-
-/**
- * A macro to statically initialize a @ref ham_key_t structure.
- *
- * Usage:
- * ham_key_t key = ham_make_key(ptr, size);
- */
-#define ham_make_key(PTR, SIZE) { SIZE, PTR, 0 }
-
-/** Flag for @ref ham_key_t (only really useful in combination with
- * @ref ham_cursor_move, @ref ham_cursor_find and @ref ham_db_find)
- */
-#define HAM_KEY_USER_ALLOC 1
-
-/**
- * A named parameter.
- *
- * These parameter structures are used for functions like @ref ham_env_open,
- * @ref ham_env_create, etc. to pass variable length parameter lists.
- *
- * The lists are always arrays of type ham_parameter_t, with a terminating
- * element of { 0, NULL}, e.g.
- *
- * <pre>
- * ham_parameter_t parameters[] = {
- * { HAM_PARAM_CACHE_SIZE, 2 * 1024 * 1024 }, // set cache size to 2 mb
- * { HAM_PARAM_PAGE_SIZE, 4096 }, // set page size to 4 kb
- * { 0, NULL }
- * };
- * </pre>
- */
-typedef struct {
- /** The name of the parameter; all HAM_PARAM_*-constants */
- uint32_t name;
-
- /** The value of the parameter. */
- uint64_t value;
-
-} ham_parameter_t;
-
-
-/**
- * @defgroup ham_key_types hamsterdb Key Types
- * @{
- */
-
-/** A binary blob without type; sorted by memcmp */
-#define HAM_TYPE_BINARY 0
-/** A binary blob without type; sorted by callback function */
-#define HAM_TYPE_CUSTOM 1
-/** An unsigned 8-bit integer */
-#define HAM_TYPE_UINT8 3
-/** An unsigned 16-bit integer */
-#define HAM_TYPE_UINT16 5
-/** An unsigned 32-bit integer */
-#define HAM_TYPE_UINT32 7
-/** An unsigned 64-bit integer */
-#define HAM_TYPE_UINT64 9
-/** An 32-bit float */
-#define HAM_TYPE_REAL32 11
-/** An 64-bit double */
-#define HAM_TYPE_REAL64 12
-
-/**
- * @}
- */
-
-
-/**
- * @defgroup ham_status_codes hamsterdb Status Codes
- * @{
- */
-
-/** Operation completed successfully */
-#define HAM_SUCCESS ( 0)
-/** Invalid record size */
-#define HAM_INV_RECORD_SIZE ( -2)
-/** Invalid key size */
-#define HAM_INV_KEY_SIZE ( -3)
-/* deprecated */
-#define HAM_INV_KEYSIZE HAM_INV_KEY_SIZE
-/** Invalid page size (must be 1024 or a multiple of 2048) */
-#define HAM_INV_PAGE_SIZE ( -4)
-/* deprecated */
-#define HAM_INV_PAGESIZE HAM_INV_PAGE_SIZE
-/** Memory allocation failed - out of memory */
-#define HAM_OUT_OF_MEMORY ( -6)
-/** Invalid function parameter */
-#define HAM_INV_PARAMETER ( -8)
-/** Invalid file header */
-#define HAM_INV_FILE_HEADER ( -9)
-/** Invalid file version */
-#define HAM_INV_FILE_VERSION (-10)
-/** Key was not found */
-#define HAM_KEY_NOT_FOUND (-11)
-/** Tried to insert a key which already exists */
-#define HAM_DUPLICATE_KEY (-12)
-/** Internal Database integrity violated */
-#define HAM_INTEGRITY_VIOLATED (-13)
-/** Internal hamsterdb error */
-#define HAM_INTERNAL_ERROR (-14)
-/** Tried to modify the Database, but the file was opened as read-only */
-#define HAM_WRITE_PROTECTED (-15)
-/** Database record not found */
-#define HAM_BLOB_NOT_FOUND (-16)
-/** Generic file I/O error */
-#define HAM_IO_ERROR (-18)
-/** Function is not yet implemented */
-#define HAM_NOT_IMPLEMENTED (-20)
-/** File not found */
-#define HAM_FILE_NOT_FOUND (-21)
-/** Operation would block */
-#define HAM_WOULD_BLOCK (-22)
-/** Object was not initialized correctly */
-#define HAM_NOT_READY (-23)
-/** Database limits reached */
-#define HAM_LIMITS_REACHED (-24)
-/** Object was already initialized */
-#define HAM_ALREADY_INITIALIZED (-27)
-/** Database needs recovery */
-#define HAM_NEED_RECOVERY (-28)
-/** Cursor must be closed prior to Transaction abort/commit */
-#define HAM_CURSOR_STILL_OPEN (-29)
-/** Record filter or file filter not found */
-#define HAM_FILTER_NOT_FOUND (-30)
-/** Operation conflicts with another Transaction */
-#define HAM_TXN_CONFLICT (-31)
-/* internal use: key was erased in a Transaction */
-#define HAM_KEY_ERASED_IN_TXN (-32)
-/** Database cannot be closed because it is modified in a Transaction */
-#define HAM_TXN_STILL_OPEN (-33)
-/** Cursor does not point to a valid item */
-#define HAM_CURSOR_IS_NIL (-100)
-/** Database not found */
-#define HAM_DATABASE_NOT_FOUND (-200)
-/** Database name already exists */
-#define HAM_DATABASE_ALREADY_EXISTS (-201)
-/** Database already open, or: Database handle is already initialized */
-#define HAM_DATABASE_ALREADY_OPEN (-202)
-/** Environment already open, or: Environment handle is already initialized */
-#define HAM_ENVIRONMENT_ALREADY_OPEN (-203)
-/** Invalid log file header */
-#define HAM_LOG_INV_FILE_HEADER (-300)
-/** Remote I/O error/Network error */
-#define HAM_NETWORK_ERROR (-400)
-
-/**
- * @}
- */
-
-
-/**
- * @defgroup ham_static hamsterdb Static Functions
- * @{
- */
-
-/**
- * A typedef for a custom error handler function
- *
- * This error handler can be used in combination with
- * @ref ham_set_errhandler().
- *
- * @param message The error message
- * @param level The error level:
- * <ul>
- * <li>@ref HAM_DEBUG_LEVEL_DEBUG (0) </li> a debug message
- * <li>@ref HAM_DEBUG_LEVEL_NORMAL (1) </li> a normal error message
- * <li>2</li> reserved
- * <li>@ref HAM_DEBUG_LEVEL_FATAL (3) </li> a fatal error message
- * </ul>
- *
- * @sa error_levels
- */
-typedef void HAM_CALLCONV (*ham_errhandler_fun)(int level, const char *message);
-
-/** A debug message */
-#define HAM_DEBUG_LEVEL_DEBUG 0
-
-/** A normal error message */
-#define HAM_DEBUG_LEVEL_NORMAL 1
-
-/** A fatal error message */
-#define HAM_DEBUG_LEVEL_FATAL 3
-
-/**
- * Sets the global error handler
- *
- * This handler will receive all debug messages that are emitted
- * by hamsterdb. You can install the default handler by setting @a f to 0.
- *
- * The default error handler prints all messages to stderr. To install a
- * different logging facility, you can provide your own error handler.
- *
- * Note that the callback function must have the same calling convention
- * as the hamsterdb library.
- *
- * @param f A pointer to the error handler function, or NULL to restore
- * the default handler
- */
-HAM_EXPORT void HAM_CALLCONV
-ham_set_errhandler(ham_errhandler_fun f);
-
-/**
- * Translates a hamsterdb status code to a descriptive error string
- *
- * @param status The hamsterdb status code
- *
- * @return A pointer to a descriptive error string
- */
-HAM_EXPORT const char * HAM_CALLCONV
-ham_strerror(ham_status_t status);
-
-/**
- * Returns the version of the hamsterdb library
- *
- * @param major If not NULL, will return the major version number
- * @param minor If not NULL, will return the minor version number
- * @param revision If not NULL, will return the revision version number
- */
-HAM_EXPORT void HAM_CALLCONV
-ham_get_version(uint32_t *major, uint32_t *minor,
- uint32_t *revision);
-
-/**
- * @}
- */
-
-
-/**
- * @defgroup ham_env hamsterdb Environment Functions
- * @{
- */
-
-/**
- * Creates a Database Environment
- *
- * A Database Environment is a collection of Databases, which are all stored
- * in one physical file (or in-memory). The maximum number of Databases
- * depends on the page size; the default is above 600.
- *
- * Each Database in an Environment is identified by a positive 16bit
- * value (except 0 and values at or above 0xf000).
- * Databases in an Environment can be created with @ref ham_env_create_db
- * or opened with @ref ham_env_open_db.
- *
- * Specify a URL instead of a filename (i.e.
- * "ham://localhost:8080/customers.db") to access a remote hamsterdb Server.
- *
- * To enable ACID Transactions, supply the flag @ref HAM_ENABLE_TRANSACTIONS.
- * By default, hamsterdb will use a Journal for recovering the Environment
- * and its data in case of a crash, and also to re-apply committed Transactions
- * which were not yet flushed to disk. This Journalling can be disabled
- * with the flag @ref HAM_DISABLE_RECOVERY. (It is disabled if the Environment
- * is in-memory.)
- *
- * If Transactions are not required, but hamsterdb should still be able to
- * recover in case of a crash or power outage, then the flag
- * @ref HAM_ENABLE_RECOVERY will enable the Journal (without allowing
- * Transactions.)
- *
- * For performance reasons the Journal does not use fsync(2) (or
- * FlushFileBuffers on Win32) to flush modified buffers to disk. Use the flag
- * @ref HAM_ENABLE_FSYNC to force the use of fsync.
- *
- * @param env A pointer to an Environment handle
- * @param filename The filename of the Environment file. If the file already
- * exists, it is overwritten. Can be NULL for an In-Memory
- * Environment. Can be a URL ("ham://<hostname>:<port>/<environment>")
- * for remote access.
- * @param flags Optional flags for opening the Environment, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_ENABLE_FSYNC</li> Flushes all file handles after
- * committing or aborting a Transaction using fsync(), fdatasync()
- * or FlushFileBuffers(). This file has no effect
- * if Transactions are disabled. Slows down performance but makes
- * sure that all file handles and operating system caches are
- * transferred to disk, thus providing a stronger durability.
- * <li>@ref HAM_IN_MEMORY</li> Creates an In-Memory Environment. No
- * file will be created, and the Database contents are lost after
- * the Environment is closed. The @a filename parameter can
- * be NULL. Do <b>NOT</b> specify @a cache_size other than 0.
- * <li>@ref HAM_DISABLE_MMAP</li> Do not use memory mapped files for I/O.
- * By default, hamsterdb checks if it can use mmap,
- * since mmap is faster than read/write. For performance
- * reasons, this flag should not be used.
- * <li>@ref HAM_CACHE_UNLIMITED</li> Do not limit the cache. Nearly as
- * fast as an In-Memory Database. Not allowed in combination
- * with a limited cache size.
- * <li>@ref HAM_ENABLE_TRANSACTIONS</li> Enables Transactions for this
- * Environment. This flag implies @ref HAM_ENABLE_RECOVERY.
- * <li>@ref HAM_ENABLE_RECOVERY</li> Enables logging/recovery for this
- * Environment. Not allowed in combination with @ref HAM_IN_MEMORY.
- * <li>@ref HAM_DISABLE_RECOVERY</li> Disables logging/recovery for this
- * Environment.
- * <li>@ref HAM_FLUSH_WHEN_COMMITTED</li> Immediately flushes committed
- * Transactions and writes them to the Btree. Disabled by default. If
- * disabled then hamsterdb buffers committed Transactions and only starts
- * flushing when too many Transactions were committed.
- * </ul>
- *
- * @param mode File access rights for the new file. This is the @a mode
- * parameter for creat(2). Ignored on Microsoft Windows. Default
- * is 0644.
- * @param param An array of ham_parameter_t structures. The following
- * parameters are available:
- * <ul>
- * <li>@ref HAM_PARAM_CACHE_SIZE</li> The size of the Database cache,
- * in bytes. The default size is defined in src/config.h
- * as @a HAM_DEFAULT_CACHE_SIZE - usually 2MB
- * <li>@ref HAM_PARAM_POSIX_FADVISE</li> Sets the "advice" for
- * posix_fadvise(). Only on supported platforms. Allowed values are
- * @ref HAM_POSIX_FADVICE_NORMAL (which is the default) or
- * @ref HAM_POSIX_FADVICE_RANDOM.
- * <li>@ref HAM_PARAM_PAGE_SIZE</li> The size of a file page, in
- * bytes. It is recommended not to change the default size. The
- * default size depends on hardware and operating system.
- * Page sizes must be 1024 or a multiple of 2048.
- * <li>@ref HAM_PARAM_FILE_SIZE_LIMIT</li> Sets a file size limit (in bytes).
- * Disabled by default. Not allowed in combination with @ref HAM_IN_MEMORY.
- * If the limit is exceeded, API functions return @ref HAM_LIMITS_REACHED.
- * <li>@ref HAM_PARAM_LOG_DIRECTORY</li> The path of the log file
- * and the journal files; default is the same path as the database
- * file. Ignored for remote Environments.
- * <li>@ref HAM_PARAM_NETWORK_TIMEOUT_SEC</li> Timeout (in seconds) when
- * waiting for data from a remote server. By default, no timeout is set.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or an
- * invalid combination of flags or parameters was specified
- * @return @ref HAM_IO_ERROR if the file could not be opened or
- * reading/writing failed
- * @return @ref HAM_INV_FILE_VERSION if the Environment version is not
- * compatible with the library version
- * @return @ref HAM_OUT_OF_MEMORY if memory could not be allocated
- * @return @ref HAM_INV_PAGE_SIZE if @a page_size is not 1024 or
- * a multiple of 2048
- * @return @ref HAM_INV_KEY_SIZE if @a key_size is too large (at least 4
- * keys must fit in a page)
- * @return @ref HAM_WOULD_BLOCK if another process has locked the file
- * @return @ref HAM_ENVIRONMENT_ALREADY_OPEN if @a env is already in use
- *
- * @sa ham_env_create
- * @sa ham_env_close
- * @sa ham_env_open
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_create(ham_env_t **env, const char *filename,
- uint32_t flags, uint32_t mode, const ham_parameter_t *param);
-
-/**
- * Opens an existing Database Environment
- *
- * This function opens an existing Database Environment.
- *
- * A Database Environment is a collection of Databases, which are all stored
- * in one physical file (or in-memory).
- *
- * Each Database in an Environment is identified by a positive 16bit
- * value (except 0 and values at or above 0xf000).
- * Databases in an Environment can be created with @ref ham_env_create_db
- * or opened with @ref ham_env_open_db.
- *
- * Specify a URL instead of a filename (i.e.
- * "ham://localhost:8080/customers.db") to access a remote hamsterdb Server.
- *
- * Also see the documentation @ref ham_env_create about Transactions, Recovery
- * and the use of fsync.
- *
- * @param env A valid Environment handle
- * @param filename The filename of the Environment file, or URL of a hamsterdb
- * Server
- * @param flags Optional flags for opening the Environment, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_READ_ONLY </li> Opens the file for reading only.
- * Operations that need write access (i.e. @ref ham_db_insert) will
- * return @ref HAM_WRITE_PROTECTED.
- * <li>@ref HAM_ENABLE_FSYNC</li> Flushes all file handles after
- * committing or aborting a Transaction using fsync(), fdatasync()
- * or FlushFileBuffers(). This file has no effect
- * if Transactions are disabled. Slows down performance but makes
- * sure that all file handles and operating system caches are
- * transferred to disk, thus providing a stronger durability.
- * <li>@ref HAM_DISABLE_MMAP </li> Do not use memory mapped files for I/O.
- * By default, hamsterdb checks if it can use mmap,
- * since mmap is faster than read/write. For performance
- * reasons, this flag should not be used.
- * <li>@ref HAM_CACHE_UNLIMITED </li> Do not limit the cache. Nearly as
- * fast as an In-Memory Database. Not allowed in combination
- * with a limited cache size.
- * <li>@ref HAM_ENABLE_TRANSACTIONS </li> Enables Transactions for this
- * Environment. This flag imples @ref HAM_ENABLE_RECOVERY.
- * <li>@ref HAM_ENABLE_RECOVERY </li> Enables logging/recovery for this
- * Environment. Will return @ref HAM_NEED_RECOVERY, if the Environment
- * is in an inconsistent state. Not allowed in combination
- * with @ref HAM_IN_MEMORY.
- * <li>@ref HAM_DISABLE_RECOVERY</li> Disables logging/recovery for this
- * Environment.
- * <li>@ref HAM_AUTO_RECOVERY </li> Automatically recover the Environment,
- * if necessary. This flag implies @ref HAM_ENABLE_RECOVERY.
- * <li>@ref HAM_FLUSH_WHEN_COMMITTED</li> Immediately flushes committed
- * Transactions and writes them to the Btree. Disabled by default. If
- * disabled then hamsterdb buffers committed Transactions and only starts
- * flushing when too many Transactions were committed.
- * </ul>
- * @param param An array of ham_parameter_t structures. The following
- * parameters are available:
- * <ul>
- * <li>@ref HAM_PARAM_CACHE_SIZE </li> The size of the Database cache,
- * in bytes. The default size is defined in src/config.h
- * as @a HAM_DEFAULT_CACHE_SIZE - usually 2MB
- * <li>@ref HAM_PARAM_POSIX_FADVISE</li> Sets the "advice" for
- * posix_fadvise(). Only on supported platforms. Allowed values are
- * @ref HAM_POSIX_FADVICE_NORMAL (which is the default) or
- * @ref HAM_POSIX_FADVICE_RANDOM.
- * <li>@ref HAM_PARAM_FILE_SIZE_LIMIT</li> Sets a file size limit (in bytes).
- * Disabled by default. If the limit is exceeded, API functions
- * return @ref HAM_LIMITS_REACHED.
- * <li>@ref HAM_PARAM_LOG_DIRECTORY</li> The path of the log file
- * and the journal files; default is the same path as the database
- * file. Ignored for remote Environments.
- * <li>@ref HAM_PARAM_NETWORK_TIMEOUT_SEC</li> Timeout (in seconds) when
- * waiting for data from a remote server. By default, no timeout is set.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success.
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL, an
- * invalid combination of flags was specified
- * @return @ref HAM_FILE_NOT_FOUND if the file does not exist
- * @return @ref HAM_IO_ERROR if the file could not be opened or reading failed
- * @return @ref HAM_INV_FILE_VERSION if the Environment version is not
- * compatible with the library version.
- * @return @ref HAM_OUT_OF_MEMORY if memory could not be allocated
- * @return @ref HAM_WOULD_BLOCK if another process has locked the file
- * @return @ref HAM_NEED_RECOVERY if the Database is in an inconsistent state
- * @return @ref HAM_LOG_INV_FILE_HEADER if the logfile is corrupt
- * @return @ref HAM_ENVIRONMENT_ALREADY_OPEN if @a env is already in use
- * @return @ref HAM_NETWORK_ERROR if a remote server is not reachable
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_open(ham_env_t **env, const char *filename,
- uint32_t flags, const ham_parameter_t *param);
-
-/**
- * Retrieve the current value for a given Environment setting
- *
- * Only those values requested by the parameter array will be stored.
- *
- * The following parameters are supported:
- * <ul>
- * <li>HAM_PARAM_CACHE_SIZE</li> returns the cache size
- * <li>HAM_PARAM_PAGE_SIZE</li> returns the page size
- * <li>HAM_PARAM_MAX_DATABASES</li> returns the max. number of
- * Databases of this Database's Environment
- * <li>HAM_PARAM_FLAGS</li> returns the flags which were used to
- * open or create this Database
- * <li>HAM_PARAM_FILEMODE</li> returns the @a mode parameter which
- * was specified when creating this Database
- * <li>HAM_PARAM_FILENAME</li> returns the filename (the @a value
- * of this parameter is a const char * pointer casted to a
- * uint64_t variable)
- * <li>@ref HAM_PARAM_LOG_DIRECTORY</li> The path of the log file
- * and the journal files. Ignored for remote Environments.
- * <li>@ref HAM_PARAM_JOURNAL_COMPRESSION</li> Returns the
- * selected algorithm for journal compression, or 0 if compression
- * is disabled
- * </ul>
- *
- * @param env A valid Environment handle
- * @param param An array of ham_parameter_t structures
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or
- * @a param is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_get_parameters(ham_env_t *env, ham_parameter_t *param);
-
-/**
- * Creates a new Database in a Database Environment
- *
- * An Environment can contain a (limited) amount of Databases; the exact
- * limit depends on the page size and is above 600.
- *
- * Each Database in an Environment is identified by a positive 16bit
- * value. 0 and values at or above 0xf000 are reserved.
- *
- * This function initializes the ham_db_t handle (the second parameter).
- * When the handle is no longer in use, it should be closed with
- * @ref ham_db_close. Alternatively, the Database handle is closed
- * automatically if @ref ham_env_close is called with the flag
- * @ref HAM_AUTO_CLEANUP.
- *
- * A Database can (and should) be configured and optimized for the data that
- * is inserted. The data is described through flags and parameters. hamsterdb
- * differentiates between several data characteristics, and offers predefined
- * "types" to describe the keys. In general, the default key type
- * (@ref HAM_TYPE_BINARY) is slower than the other types, and
- * fixed-length binary keys (@ref HAM_TYPE_BINARY in combination with
- * @ref HAM_PARAM_KEY_SIZE) is faster than variable-length binary
- * keys. It is therefore recommended to always set the key size and record size,
- * although it is not required.
- *
- * Internally, hamsterdb uses two different layouts ("default" and "pax)
- * depending on the settings specified by the user. The "default" layout
- * is enabled for variable-length keys or if duplicate keys are enabled.
- * For fixed-length keys (without duplicates) the "pax" layout is chosen.
- * The "pax" layout is more compact and usually faster.
- *
- * A word of warning regarding the use of fixed length binary keys
- * (@ref HAM_TYPE_CUSTOM or @ref HAM_TYPE_BINARY in combination with
- * @ref HAM_PARAM_KEY_SIZE): if your key size is too large, only few keys
- * will fit in a Btree node. The Btree fanout will be very high, which will
- * decrease performance. In such cases it might be better to NOT specify
- * the key size; then hamsterdb will store keys as blobs if they are too large.
- *
- * See the Wiki documentation for <a href=
- "https://github.com/cruppstahl/hamsterdb/wiki/Evaluating-and-Benchmarking">
- * Evaluating and Benchmarking</a> on how to test different configurations and
- * optimize for performance.
- *
- * The key type is set with @ref HAM_PARAM_KEY_TYPE and can have either
- * of the following values:
- *
- * <ul>
- * <li>HAM_TYPE_BINARY</li> This is the default key type: a binary blob.
- * Internally, hamsterdb uses memcmp(3) for the sort order. Key size depends
- * on @ref HAM_PARAM_KEY_SIZE and is unlimited (@ref HAM_KEY_SIZE_UNLIMITED)
- * by default.
- * <li>HAM_TYPE_CUSTOM</li> Similar to @ref HAM_TYPE_BINARY, but
- * uses a callback function for the sort order. This function is supplied
- * by the application with @sa ham_db_set_compare_func.
- * <li>HAM_TYPE_UINT8</li> Key is a 8bit (1 byte) unsigned integer
- * <li>HAM_TYPE_UINT16</li> Key is a 16bit (2 byte) unsigned integer
- * <li>HAM_TYPE_UINT32</li> Key is a 32bit (4 byte) unsigned integer
- * <li>HAM_TYPE_UINT64</li> Key is a 64bit (8 byte) unsigned integer
- * <li>HAM_TYPE_REAL32</li> Key is a 32bit (4 byte) float
- * <li>HAM_TYPE_REAL64</li> Key is a 64bit (8 byte) double
- * </ul>
- *
- * If the key type is ommitted then @ref HAM_TYPE_BINARY is the default.
- *
- * If binary/custom keys are so big that they cannot be stored in the Btree,
- * then the full key will be stored in an overflow area, which has
- * performance implications when accessing such keys.
- *
- * In addition to the flags above, you can specify @a HAM_ENABLE_DUPLICATE_KEYS
- * to insert duplicate keys, i.e. to model 1:n or n:m relationships.
- *
- * If the size of the records is always constant, then
- * @ref HAM_PARAM_RECORD_SIZE should be used to specify this size. This allows
- * hamsterdb to optimize the record storage, and small records will
- * automatically be stored in the Btree's leaf nodes instead of a separately
- * allocated blob, allowing faster access.
- * A record size of 0 is valid and suited for boolean values ("key exists"
- * vs "key doesn't exist"). The default record size is
- * @ref HAM_RECORD_SIZE_UNLIMITED.
- *
- * @param env A valid Environment handle.
- * @param db A valid Database handle, which will point to the created
- * Database. To close the handle, use @ref ham_db_close.
- * @param name The name of the Database. If a Database with this name
- * already exists, the function will fail with
- * @ref HAM_DATABASE_ALREADY_EXISTS. Database names from 0xf000 to
- * 0xffff and 0 are reserved.
- * @param flags Optional flags for creating the Database, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_ENABLE_DUPLICATE_KEYS </li> Enable duplicate keys for this
- * Database. By default, duplicate keys are disabled.
- * <li>@ref HAM_RECORD_NUMBER32 </li> Creates an "auto-increment" Database.
- * Keys in Record Number Databases are automatically assigned an
- * incrementing 32bit value. If key->data is not NULL
- * (and key->flags is @ref HAM_KEY_USER_ALLOC), the value of the current
- * key is returned in @a key. If key-data is NULL and key->size is 0,
- * key->data is temporarily allocated by hamsterdb.
- * <li>@ref HAM_RECORD_NUMBER64 </li> Creates an "auto-increment" Database.
- * Keys in Record Number Databases are automatically assigned an
- * incrementing 64bit value. If key->data is not NULL
- * (and key->flags is @ref HAM_KEY_USER_ALLOC), the value of the current
- * key is returned in @a key. If key-data is NULL and key->size is 0,
- * key->data is temporarily allocated by hamsterdb.
- * </ul>
- *
- * @param params An array of ham_parameter_t structures. The following
- * parameters are available:
- * <ul>
- * <li>@ref HAM_PARAM_KEY_TYPE </li> The type of the keys in the B+Tree
- * index. The default is @ref HAM_TYPE_BINARY. See above for more
- * information.
- * <li>@ref HAM_PARAM_KEY_SIZE </li> The (fixed) size of the keys in
- * the B+Tree index; or @ref HAM_KEY_SIZE_UNLIMITED for unlimited and
- * variable keys (this is the default).
- * <li>@ref HAM_PARAM_RECORD_SIZE </li> The (fixed) size of the records;
- * or @ref HAM_RECORD_SIZE_UNLIMITED if there was no fixed record size
- * specified (this is the default).
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or an
- * invalid combination of flags was specified
- * @return @ref HAM_DATABASE_ALREADY_EXISTS if a Database with this @a name
- * already exists in this Environment
- * @return @ref HAM_OUT_OF_MEMORY if memory could not be allocated
- * @return @ref HAM_LIMITS_REACHED if the maximum number of Databases per
- * Environment was already created
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_create_db(ham_env_t *env, ham_db_t **db,
- uint16_t name, uint32_t flags, const ham_parameter_t *params);
-
-/**
- * Opens a Database in a Database Environment
- *
- * Each Database in an Environment is identified by a positive 16bit
- * value (except 0 and values at or above 0xf000).
- *
- * This function initializes the ham_db_t handle (the second parameter).
- * When the handle is no longer in use, it should be closed with
- * @ref ham_db_close. Alternatively, the Database handle is closed
- * automatically if @ref ham_env_close is called with the flag
- * @ref HAM_AUTO_CLEANUP.
- *
- * @param env A valid Environment handle
- * @param db A valid Database handle, which will point to the opened
- * Database. To close the handle, use @see ham_db_close.
- * @param name The name of the Database. If a Database with this name
- * does not exist, the function will fail with
- * @ref HAM_DATABASE_NOT_FOUND.
- * @param flags Optional flags for opening the Database, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_READ_ONLY </li> Opens the Database for reading only.
- * Operations that need write access (i.e. @ref ham_db_insert) will
- * return @ref HAM_WRITE_PROTECTED.
- * </ul>
- * @param params Reserved; set to NULL
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or an
- * invalid combination of flags was specified
- * @return @ref HAM_DATABASE_NOT_FOUND if a Database with this @a name
- * does not exist in this Environment.
- * @return @ref HAM_DATABASE_ALREADY_OPEN if this Database was already
- * opened
- * @return @ref HAM_OUT_OF_MEMORY if memory could not be allocated
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_open_db(ham_env_t *env, ham_db_t **db,
- uint16_t name, uint32_t flags, const ham_parameter_t *params);
-
-/**
- * Renames a Database in an Environment.
- *
- * @param env A valid Environment handle.
- * @param oldname The old name of the existing Database. If a Database
- * with this name does not exist, the function will fail with
- * @ref HAM_DATABASE_NOT_FOUND.
- * @param newname The new name of this Database. If a Database
- * with this name already exists, the function will fail with
- * @ref HAM_DATABASE_ALREADY_EXISTS.
- * @param flags Optional flags for renaming the Database, combined with
- * bitwise OR; unused, set to 0.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or if
- * the new Database name is reserved
- * @return @ref HAM_DATABASE_NOT_FOUND if a Database with this @a name
- * does not exist in this Environment
- * @return @ref HAM_DATABASE_ALREADY_EXISTS if a Database with the new name
- * already exists
- * @return @ref HAM_OUT_OF_MEMORY if memory could not be allocated
- * @return @ref HAM_NOT_READY if the Environment @a env was not initialized
- * correctly (i.e. not yet opened or created)
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_rename_db(ham_env_t *env, uint16_t oldname,
- uint16_t newname, uint32_t flags);
-
-/**
- * Deletes a Database from an Environment
- *
- * @param env A valid Environment handle
- * @param name The name of the Database to delete. If a Database
- * with this name does not exist, the function will fail with
- * @ref HAM_DATABASE_NOT_FOUND. If the Database was already opened,
- * the function will fail with @ref HAM_DATABASE_ALREADY_OPEN.
- * @param flags Optional flags for deleting the Database; unused, set to 0.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a env pointer is NULL or if
- * the new Database name is reserved
- * @return @ref HAM_DATABASE_NOT_FOUND if a Database with this @a name
- * does not exist
- * @return @ref HAM_DATABASE_ALREADY_OPEN if a Database with this name is
- * still open
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_erase_db(ham_env_t *env, uint16_t name, uint32_t flags);
-
-/* internal flag - only flush committed transactions, not the btree pages */
-#define HAM_FLUSH_COMMITTED_TRANSACTIONS 1
-
-/**
- * Flushes the Environment
- *
- * This function flushes the Environment caches and writes the whole file
- * to disk. All Databases of this Environment are flushed as well.
- *
- * Since In-Memory Databases do not have a file on disk, the
- * function will have no effect and will return @ref HAM_SUCCESS.
- *
- * @param env A valid Environment handle
- * @param flags Optional flags for flushing; unused, set to 0
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_flush(ham_env_t *env, uint32_t flags);
-
-/* internal use only - don't lock mutex */
-#define HAM_DONT_LOCK 0xf0000000
-
-/**
- * Returns the names of all Databases in an Environment
- *
- * This function returns the names of all Databases and the number of
- * Databases in an Environment.
- *
- * The memory for @a names must be allocated by the user. @a count
- * must be the size of @a names when calling the function, and will be
- * the number of Databases when the function returns. The function returns
- * @ref HAM_LIMITS_REACHED if @a names is not big enough; in this case, the
- * caller should resize the array and call the function again.
- *
- * @param env A valid Environment handle
- * @param names Pointer to an array for the Database names
- * @param count Pointer to the size of the array; will be used to store the
- * number of Databases when the function returns.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a env, @a names or @a count is NULL
- * @return @ref HAM_LIMITS_REACHED if @a names is not large enough to hold
- * all Database names
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_get_database_names(ham_env_t *env, uint16_t *names,
- uint32_t *count);
-
-/**
- * Closes the Database Environment
- *
- * This function closes the Database Environment. It also frees the
- * memory resources allocated in the @a env handle, and tries to truncate
- * the file (see below).
- *
- * If the flag @ref HAM_AUTO_CLEANUP is specified, hamsterdb automatically
- * calls @ref ham_db_close with flag @ref HAM_AUTO_CLEANUP on all open
- * Databases (which closes all open Databases and their Cursors). This
- * invalidates the ham_db_t and ham_cursor_t handles!
- *
- * If the flag is not specified, the application must close all Database
- * handles with @ref ham_db_close to prevent memory leaks.
- *
- * This function also aborts all Transactions which were not yet committed,
- * and therefore renders all Transaction handles invalid. If the flag
- * @ref HAM_TXN_AUTO_COMMIT is specified, all Transactions will be committed.
- *
- * This function also tries to truncate the file and "cut off" unused space
- * at the end of the file to reduce the file size. This feature is disabled
- * on Win32 if memory mapped I/O is used (see @ref HAM_DISABLE_MMAP).
- *
- * @param env A valid Environment handle
- * @param flags Optional flags for closing the handle. Possible flags are:
- * <ul>
- * <li>@ref HAM_AUTO_CLEANUP. Calls @ref ham_db_close with the flag
- * @ref HAM_AUTO_CLEANUP on every open Database
- * <li>@ref HAM_TXN_AUTO_COMMIT. Automatically commit all open
- * Transactions
- * <li>@ref HAM_TXN_AUTO_ABORT. Automatically abort all open
- * Transactions; this is the default behaviour
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a env is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_close(ham_env_t *env, uint32_t flags);
-
-/**
- * @}
- */
-
-
-/**
- * @defgroup ham_txn hamsterdb Transaction Functions
- * @{
- */
-
-/**
- * The hamsterdb Transaction structure
- *
- * This structure is allocated with @ref ham_txn_begin and deleted with
- * @ref ham_txn_commit or @ref ham_txn_abort.
- */
-struct ham_txn_t;
-typedef struct ham_txn_t ham_txn_t;
-
-/**
- * Begins a new Transaction
- *
- * A Transaction is an atomic sequence of Database operations. With @ref
- * ham_txn_begin such a new sequence is started. To write all operations of this
- * sequence to the Database use @ref ham_txn_commit. To abort and cancel
- * this sequence use @ref ham_txn_abort.
- *
- * In order to use Transactions, the Environment has to be created or
- * opened with the flag @ref HAM_ENABLE_TRANSACTIONS.
- *
- * You can create as many Transactions as you want (older versions of
- * hamsterdb did not allow to create more than one Transaction in parallel).
- *
- * @param txn Pointer to a pointer of a Transaction structure
- * @param env A valid Environment handle
- * @param name An optional Transaction name
- * @param reserved A reserved pointer; always set to NULL
- * @param flags Optional flags for beginning the Transaction, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_TXN_READ_ONLY </li> This Transaction is read-only and
- * will not modify the Database.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_OUT_OF_MEMORY if memory allocation failed
- */
-HAM_EXPORT ham_status_t
-ham_txn_begin(ham_txn_t **txn, ham_env_t *env, const char *name,
- void *reserved, uint32_t flags);
-
-/** Flag for @ref ham_txn_begin */
-#define HAM_TXN_READ_ONLY 1
-
-/* Internal flag for @ref ham_txn_begin */
-#define HAM_TXN_TEMPORARY 2
-
-/**
- * Retrieves the Transaction name
- *
- * @returns NULL if the name was not assigned or if @a txn is invalid
- */
-HAM_EXPORT const char *
-ham_txn_get_name(ham_txn_t *txn);
-
-/**
- * Commits a Transaction
- *
- * This function applies the sequence of Database operations.
- *
- * Note that the function will fail with @ref HAM_CURSOR_STILL_OPEN if
- * a Cursor was attached to this Transaction (with @ref ham_cursor_create
- * or @ref ham_cursor_clone), and the Cursor was not closed.
- *
- * @param txn Pointer to a Transaction structure
- * @param flags Optional flags for committing the Transaction, combined with
- * bitwise OR. Unused, set to 0.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_IO_ERROR if writing to the file failed
- * @return @ref HAM_CURSOR_STILL_OPEN if there are Cursors attached to this
- * Transaction
- */
-HAM_EXPORT ham_status_t
-ham_txn_commit(ham_txn_t *txn, uint32_t flags);
-
-/**
- * Aborts a Transaction
- *
- * This function aborts (= cancels) the sequence of Database operations.
- *
- * Note that the function will fail with @ref HAM_CURSOR_STILL_OPEN if
- * a Cursor was attached to this Transaction (with @ref ham_cursor_create
- * or @ref ham_cursor_clone), and the Cursor was not closed.
- *
- * @param txn Pointer to a Transaction structure
- * @param flags Optional flags for aborting the Transaction, combined with
- * bitwise OR. Unused, set to 0.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_IO_ERROR if writing to the Database file or logfile failed
- * @return @ref HAM_CURSOR_STILL_OPEN if there are Cursors attached to this
- * Transaction
- */
-HAM_EXPORT ham_status_t
-ham_txn_abort(ham_txn_t *txn, uint32_t flags);
-
-/**
- * @}
- */
-
-
-/**
- * @defgroup ham_database hamsterdb Database Functions
- * @{
- */
-
-/** Flag for @ref ham_env_open, @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_ENABLE_FSYNC 0x00000001
-
-/* unused 0x00000002 */
-
-/** Flag for @ref ham_env_open, @ref ham_env_open_db.
- * This flag is non persistent. */
-#define HAM_READ_ONLY 0x00000004
-
-/* unused 0x00000008 */
-
-/* unused 0x00000010 */
-
-/* reserved 0x00000020 */
-
-/* unused 0x00000040 */
-
-/** Flag for @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_IN_MEMORY 0x00000080
-
-/* reserved: DB_USE_MMAP (not persistent) 0x00000100 */
-
-/** Flag for @ref ham_env_open, @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_DISABLE_MMAP 0x00000200
-
-/* deprecated */
-#define HAM_RECORD_NUMBER HAM_RECORD_NUMBER64
-
-/** Flag for @ref ham_env_create_db.
- * This flag is persisted in the Database. */
-#define HAM_RECORD_NUMBER32 0x00001000
-
-/** Flag for @ref ham_env_create_db.
- * This flag is persisted in the Database. */
-#define HAM_RECORD_NUMBER64 0x00002000
-
-/** Flag for @ref ham_env_create_db.
- * This flag is persisted in the Database. */
-#define HAM_ENABLE_DUPLICATE_KEYS 0x00004000
-/* deprecated */
-#define HAM_ENABLE_DUPLICATES HAM_ENABLE_DUPLICATE_KEYS
-
-/** Flag for @ref ham_env_create, @ref ham_env_open.
- * This flag is non persistent. */
-#define HAM_ENABLE_RECOVERY 0x00008000
-
-/** Flag for @ref ham_env_open.
- * This flag is non persistent. */
-#define HAM_AUTO_RECOVERY 0x00010000
-
-/** Flag for @ref ham_env_create, @ref ham_env_open.
- * This flag is non persistent. */
-#define HAM_ENABLE_TRANSACTIONS 0x00020000
-
-/** Flag for @ref ham_env_open, @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_CACHE_UNLIMITED 0x00040000
-
-/** Flag for @ref ham_env_create, @ref ham_env_open.
- * This flag is non persistent. */
-#define HAM_DISABLE_RECOVERY 0x00080000
-
-/* internal use only! (not persistent) */
-#define HAM_IS_REMOTE_INTERNAL 0x00200000
-
-/* internal use only! (not persistent) */
-#define HAM_DISABLE_RECLAIM_INTERNAL 0x00400000
-
-/* internal use only! (persistent) */
-#define HAM_FORCE_RECORDS_INLINE 0x00800000
-
-/** Flag for @ref ham_env_open, @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_FLUSH_WHEN_COMMITTED 0x01000000
-
-/** Pro: Flag for @ref ham_env_open, @ref ham_env_create.
- * This flag is non persistent. */
-#define HAM_ENABLE_CRC32 0x02000000
-
-/**
- * Returns the last error code
- *
- * @note This API is deprecated! It will be removed in one of the
- * next versions.
- *
- * @param db A valid Database handle
- *
- * @return The last error code which was returned by one of the
- * hamsterdb API functions. Use @ref ham_strerror to translate
- * this code to a descriptive string
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_get_error(ham_db_t *db);
-
-/**
- * Typedef for a key comparison function
- *
- * @remark This function compares two index keys. It returns -1, if @a lhs
- * ("left-hand side", the parameter on the left side) is smaller than
- * @a rhs ("right-hand side"), 0 if both keys are equal, and 1 if @a lhs
- * is larger than @a rhs.
- */
-typedef int HAM_CALLCONV (*ham_compare_func_t)(ham_db_t *db,
- const uint8_t *lhs, uint32_t lhs_length,
- const uint8_t *rhs, uint32_t rhs_length);
-
-/**
- * Sets the comparison function
- *
- * The comparison function compares two index keys. It returns -1 if the
- * first key is smaller, +1 if the second key is smaller or 0 if both
- * keys are equal.
- *
- * Supplying a comparison function is only allowed for the key type
- * @ref HAM_TYPE_CUSTOM; see the documentation of @sa ham_env_create_db
- * for more information.
- *
- * @param db A valid Database handle
- * @param foo A pointer to the compare function
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- * @return @ref HAM_INV_PARAMETER if the database's key type was not
- * specified as @ref HAM_TYPE_CUSTOM
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_set_compare_func(ham_db_t *db, ham_compare_func_t foo);
-
-/**
- * Searches an item in the Database
- *
- * This function searches the Database for @a key. If the key
- * is found, @a record will receive the record of this item and
- * @ref HAM_SUCCESS is returned. If the key is not found, the function
- * returns @ref HAM_KEY_NOT_FOUND.
- *
- * A ham_record_t structure should be initialized with
- * zeroes before it is being used. This can be done with the C library
- * routines memset(3) or bzero(2).
- *
- * If the function completes successfully, the @a record pointer is
- * initialized with the size of the record (in @a record.size) and the
- * actual record data (in @a record.data). If the record is empty,
- * @a size is 0 and @a data points to NULL.
- *
- * The @a data pointer is a temporary pointer and will be overwritten
- * by subsequent hamsterdb API calls using the same Transaction
- * (or, if Transactions are disabled, using the same Database).
- * You can alter this behaviour by allocating the @a data pointer in
- * the application and setting @a record.flags to @ref HAM_RECORD_USER_ALLOC.
- * Make sure that the allocated buffer is large enough.
- *
- * When specifying @ref HAM_DIRECT_ACCESS, the @a data pointer will point
- * directly to the record that is stored in hamsterdb; the data can be modified,
- * but the pointer must not be reallocated or freed. The flag @ref
- * HAM_DIRECT_ACCESS is only allowed in In-Memory Databases and not if
- * Transactions are enabled.
- *
- * @ref ham_db_find can not search for duplicate keys. If @a key has
- * multiple duplicates, only the first duplicate is returned.
- *
- * You can read only portions of the record by specifying the flag
- * @ref HAM_PARTIAL. In this case, hamsterdb will read
- * <b>record->partial_size</b> bytes of the record data at offset
- * <b>record->partial_offset</b>. If necessary, the record data will
- * be limited to the original record size. The number of actually read
- * bytes is returned in <b>record->partial_size</b>. The original size of
- * the record is stored in <b>record->size</b>.
- *
- * @ref HAM_PARTIAL is not allowed if record->size is <= 8 or if Transactions
- * are enabled. In such a case, @ref HAM_INV_PARAMETER is returned.
- *
- * If Transactions are enabled (see @ref HAM_ENABLE_TRANSACTIONS) and
- * @a txn is NULL then hamsterdb will create a temporary Transaction.
- * When moving the Cursor, and the new key is currently modified in an
- * active Transaction (one that is not yet committed or aborted) then
- * hamsterdb will skip this key and move to the next/previous one. However if
- * @a flags are 0 (and the Cursor is not moved), and @a key or @a rec
- * is NOT NULL, then hamsterdb will return error @ref HAM_TXN_CONFLICT.
- *
- * @param db A valid Database handle
- * @param txn A Transaction handle, or NULL
- * @param key The key of the item
- * @param record The record of the item
- * @param flags Optional flags for searching, which can be combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_FIND_LT_MATCH </li> Cursor 'find' flag 'Less Than': the
- * cursor is moved to point at the last record which' key
- * is less than the specified key. When such a record cannot
- * be located, an error is returned.
- * <li>@ref HAM_FIND_GT_MATCH </li> Cursor 'find' flag 'Greater Than':
- * the cursor is moved to point at the first record which' key is
- * larger than the specified key. When such a record cannot be
- * located, an error is returned.
- * <li>@ref HAM_FIND_LEQ_MATCH </li> Cursor 'find' flag 'Less or EQual':
- * the cursor is moved to point at the record which' key matches
- * the specified key and when such a record is not available
- * the cursor is moved to point at the last record which' key
- * is less than the specified key. When such a record cannot be
- * located, an error is returned.
- * <li>@ref HAM_FIND_GEQ_MATCH </li> Cursor 'find' flag 'Greater or
- * Equal': the cursor is moved to point at the record which' key
- * matches the specified key and when such a record
- * is not available the cursor is moved to point at the first
- * record which' key is larger than the specified key.
- * When such a record cannot be located, an error is returned.
- * <li>@ref HAM_FIND_NEAR_MATCH </li> Cursor 'find' flag 'Any Near Or
- * Equal': the cursor is moved to point at the record which'
- * key matches the specified key and when such a record is
- * not available the cursor is moved to point at either the
- * last record which' key is less than the specified key or
- * the first record which' key is larger than the specified
- * key, whichever of these records is located first.
- * When such records cannot be located, an error is returned.
- * <li>@ref HAM_DIRECT_ACCESS </li> Only for In-Memory Databases
- * and not if Transactions are enabled!
- * Returns a direct pointer to the data blob stored by the
- * hamsterdb engine. This pointer must not be resized or freed,
- * but the data in this memory can be modified.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db, @a key or @a record is NULL
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS is specified,
- * but the Database is not an In-Memory Database.
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS and
- * @a HAM_ENABLE_TRANSACTIONS were both specified.
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is set but record
- * size is <= 8 or Transactions are enabled
- * @return @ref HAM_KEY_NOT_FOUND if the @a key does not exist
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- *
- * @remark When either or both @ref HAM_FIND_LT_MATCH and/or @ref
- * HAM_FIND_GT_MATCH have been specified as flags, the @a key structure
- * will be overwritten when an approximate match was found: the
- * @a key and @a record structures will then point at the located
- * @a key and @a record. In this case the caller should ensure @a key
- * points at a structure which must adhere to the same restrictions
- * and conditions as specified for @ref ham_cursor_move(...,
- * HAM_CURSOR_NEXT).
- *
- * @sa HAM_RECORD_USER_ALLOC
- * @sa HAM_KEY_USER_ALLOC
- * @sa ham_record_t
- * @sa ham_key_t
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_find(ham_db_t *db, ham_txn_t *txn, ham_key_t *key,
- ham_record_t *record, uint32_t flags);
-
-/**
- * Inserts a Database item
- *
- * This function inserts a key/record pair as a new Database item.
- *
- * If the key already exists in the Database, error @ref HAM_DUPLICATE_KEY
- * is returned.
- *
- * If you wish to overwrite an existing entry specify the
- * flag @ref HAM_OVERWRITE.
- *
- * You can write only portions of the record by specifying the flag
- * @ref HAM_PARTIAL. In this case, hamsterdb will write <b>partial_size</b>
- * bytes of the record data at offset <b>partial_offset</b>. The full record
- * size will always be given in <b>record->size</b>! If
- * partial_size+partial_offset exceed record->size then partial_size will
- * be limited. To shrink or grow the record, adjust record->size.
- * @ref HAM_PARTIAL automatically overwrites existing records.
- * Gaps will be filled with null-bytes if the record did not yet exist.
- *
- * @ref HAM_PARTIAL is not allowed if record->size is <= 8 or if Transactions
- * are enabled. In such a case, @ref HAM_INV_PARAMETER is returned.
- *
- * If you wish to insert a duplicate key specify the flag @ref HAM_DUPLICATE.
- * (Note that the Database has to be created with @ref HAM_ENABLE_DUPLICATE_KEYS
- * in order to use duplicate keys.)
- * The duplicate key is inserted after all other duplicate keys (see
- * @ref HAM_DUPLICATE_INSERT_LAST).
- *
- * Record Number Databases (created with @ref HAM_RECORD_NUMBER32 or
- * @ref HAM_RECORD_NUMBER64) expect either an empty @a key (with a size of
- * 0 and data pointing to NULL), or a user-supplied key (with key.flag
- * @ref HAM_KEY_USER_ALLOC and a valid data pointer).
- * If key.size is 0 and key.data is NULL, hamsterdb will temporarily
- * allocate memory for key->data, which will then point to an 4-byte (or 8-byte)
- * unsigned integer.
- *
- * For very fast sequential inserts please use @ref ham_cursor_insert in
- * combination with the flag @ref HAM_HINT_APPEND.
- *
- * @param db A valid Database handle
- * @param txn A Transaction handle, or NULL
- * @param key The key of the new item
- * @param record The record of the new item
- * @param flags Optional flags for inserting. Possible flags are:
- * <ul>
- * <li>@ref HAM_OVERWRITE. If the @a key already exists, the record is
- * overwritten. Otherwise, the key is inserted. Flag is not
- * allowed in combination with @ref HAM_DUPLICATE.
- * <li>@ref HAM_DUPLICATE. If the @a key already exists, a duplicate
- * key is inserted. The key is inserted before the already
- * existing key, or according to the sort order. Flag is not
- * allowed in combination with @ref HAM_OVERWRITE.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db, @a key or @a record is NULL
- * @return @ref HAM_INV_PARAMETER if the Database is a Record Number Database
- * and the key is invalid (see above)
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is set but record
- * size is <= 8 or Transactions are enabled
- * @return @ref HAM_INV_PARAMETER if the flags @ref HAM_OVERWRITE <b>and</b>
- * @ref HAM_DUPLICATE were specified, or if @ref HAM_DUPLICATE
- * was specified, but the Database was not created with
- * flag @ref HAM_ENABLE_DUPLICATE_KEYS.
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is specified and
- * record->partial_offset+record->partial_size exceeds the
- * record->size
- * @return @ref HAM_WRITE_PROTECTED if you tried to insert a key in a read-only
- * Database
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- * @return @ref HAM_INV_KEY_SIZE if the key size is larger than the
- * @a HAM_PARAMETER_KEY_SIZE parameter specified for
- * @ref ham_env_create_db
- * OR if the key's size is greater than the Btree key size (see
- * @ref HAM_PARAM_KEY_SIZE).
- * @return @ref HAM_INV_RECORD_SIZE if the record size is different from
- * the one specified with @a HAM_PARAM_RECORD_SIZE
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_insert(ham_db_t *db, ham_txn_t *txn, ham_key_t *key,
- ham_record_t *record, uint32_t flags);
-
-/**
- * Flag for @ref ham_db_insert and @ref ham_cursor_insert
- *
- * When specified with @ref ham_db_insert and in case a key
- * is specified which stores duplicates in the Database, the first
- * duplicate record will be overwritten.
- *
- * When used with @ref ham_cursor_insert and assuming the same
- * conditions, the duplicate currently referenced by the Cursor
- * will be overwritten.
-*/
-#define HAM_OVERWRITE 0x0001
-
-/** Flag for @ref ham_db_insert and @ref ham_cursor_insert */
-#define HAM_DUPLICATE 0x0002
-
-/** Flag for @ref ham_cursor_insert */
-#define HAM_DUPLICATE_INSERT_BEFORE 0x0004
-
-/** Flag for @ref ham_cursor_insert */
-#define HAM_DUPLICATE_INSERT_AFTER 0x0008
-
-/** Flag for @ref ham_cursor_insert */
-#define HAM_DUPLICATE_INSERT_FIRST 0x0010
-
-/** Flag for @ref ham_cursor_insert */
-#define HAM_DUPLICATE_INSERT_LAST 0x0020
-
-/** Flag for @ref ham_db_find, @ref ham_cursor_find, @ref ham_cursor_move */
-#define HAM_DIRECT_ACCESS 0x0040
-
-/** Flag for @ref ham_db_insert, @ref ham_cursor_insert, @ref ham_db_find,
- * @ref ham_cursor_find, @ref ham_cursor_move */
-#define HAM_PARTIAL 0x0080
-
-/* Internal flag for @ref ham_db_find, @ref ham_cursor_find,
- * @ref ham_cursor_move */
-#define HAM_FORCE_DEEP_COPY 0x0100
-
-/**
- * Flag for @ref ham_cursor_insert
- *
- * Mutually exclusive with flag @ref HAM_HINT_PREPEND.
- *
- * Hints the hamsterdb engine that the current key will
- * compare as @e larger than any key already existing in the Database.
- * The hamsterdb engine will verify this postulation and when found not
- * to be true, will revert to a regular insert operation
- * as if this flag was not specified. The incurred cost then is only one
- * additional key comparison.
- */
-#define HAM_HINT_APPEND 0x00080000
-
-/**
- * Flag for @ref ham_cursor_insert
- *
- * Mutually exclusive with flag @ref HAM_HINT_APPEND.
- *
- * Hints the hamsterdb engine that the current key will
- * compare as @e smaller than any key already existing in the Database.
- * The hamsterdb engine will verify this postulation and when found not
- * to be true, will revert to a regular insert operation
- * as if this flag was not specified. The incurred cost then is only one
- * additional key comparison.
- */
-#define HAM_HINT_PREPEND 0x00100000
-
-/**
- * Flag mask to extract the common hint flags from a find/move/insert/erase
- * flag value.
- */
-#define HAM_HINTS_MASK 0x001F0000
-
-/**
- * Erases a Database item
- *
- * This function erases a Database item. If the item @a key
- * does not exist, @ref HAM_KEY_NOT_FOUND is returned.
- *
- * Note that ham_db_erase can not erase a single duplicate key. If the key
- * has multiple duplicates, all duplicates of this key will be erased. Use
- * @ref ham_cursor_erase to erase a specific duplicate key.
- *
- * @param db A valid Database handle
- * @param txn A Transaction handle, or NULL
- * @param key The key to delete
- * @param flags Optional flags for erasing; unused, set to 0
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db or @a key is NULL
- * @return @ref HAM_WRITE_PROTECTED if you tried to erase a key from a read-only
- * Database
- * @return @ref HAM_KEY_NOT_FOUND if @a key was not found
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_erase(ham_db_t *db, ham_txn_t *txn, ham_key_t *key, uint32_t flags);
-
-/* internal flag for ham_db_erase() - do not use */
-#define HAM_ERASE_ALL_DUPLICATES 1
-
-/**
- * Returns the number of keys stored in the Database
- *
- * You can specify the @ref HAM_SKIP_DUPLICATES if you do now want
- * to include any duplicates in the count. This will also speed up the
- * counting.
- *
- * @param db A valid Database handle
- * @param txn A Transaction handle, or NULL
- * @param flags Optional flags:
- * <ul>
- * <li>@ref HAM_SKIP_DUPLICATES. Excludes any duplicates from
- * the count
- * </ul>
- * @param keycount A reference to a variable which will receive
- * the calculated key count per page
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db or @a keycount is NULL or when
- * @a flags contains an invalid flag set
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_get_key_count(ham_db_t *db, ham_txn_t *txn, uint32_t flags,
- uint64_t *keycount);
-
-/**
- * Retrieve the current value for a given Database setting
- *
- * Only those values requested by the parameter array will be stored.
- *
- * The following parameters are supported:
- * <ul>
- * <li>HAM_PARAM_FLAGS</li> returns the flags which were used to
- * open or create this Database
- * <li>HAM_PARAM_DATABASE_NAME</li> returns the Database name
- * <li>HAM_PARAM_KEY_TYPE</li> returns the Btree key type
- * <li>HAM_PARAM_KEY_SIZE</li> returns the Btree key size
- * or @ref HAM_KEY_SIZE_UNLIMITED if there was no fixed key size
- * specified.
- * <li>HAM_PARAM_RECORD_SIZE</li> returns the record size,
- * or @ref HAM_RECORD_SIZE_UNLIMITED if there was no fixed record size
- * specified.
- * <li>HAM_PARAM_MAX_KEYS_PER_PAGE</li> returns the maximum number
- * of keys per page. This number is precise if the key size is fixed
- * and duplicates are disabled; otherwise it's an estimate.
- * <li>@ref HAM_PARAM_RECORD_COMPRESSION</li> Returns the
- * selected algorithm for record compression, or 0 if compression
- * is disabled
- * <li>@ref HAM_PARAM_KEY_COMPRESSION</li> Returns the
- * selected algorithm for key compression, or 0 if compression
- * is disabled
- * </ul>
- *
- * @param db A valid Database handle
- * @param param An array of ham_parameter_t structures
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if the @a db pointer is NULL or
- * @a param is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_get_parameters(ham_db_t *db, ham_parameter_t *param);
-
-/** Parameter name for @ref ham_env_open, @ref ham_env_create;
- * Journal files are switched whenever the number of new Transactions exceeds
- * this threshold. */
-#define HAM_PARAM_JOURNAL_SWITCH_THRESHOLD 0x00001
-
-/** Parameter name for @ref ham_env_open, @ref ham_env_create;
- * sets the cache size */
-#define HAM_PARAM_CACHE_SIZE 0x00000100
-/* deprecated */
-#define HAM_PARAM_CACHESIZE HAM_PARAM_CACHE_SIZE
-
-/** Parameter name for @ref ham_env_create; sets the page size */
-#define HAM_PARAM_PAGE_SIZE 0x00000101
-/* deprecated */
-#define HAM_PARAM_PAGESIZE HAM_PARAM_PAGE_SIZE
-
-/** Parameter name for @ref ham_env_create_db; sets the key size */
-#define HAM_PARAM_KEY_SIZE 0x00000102
-/* deprecated */
-#define HAM_PARAM_KEYSIZE HAM_PARAM_KEY_SIZE
-
-/** Parameter name for @ref ham_env_get_parameters; retrieves the number
- * of maximum Databases */
-#define HAM_PARAM_MAX_DATABASES 0x00000103
-
-/** Parameter name for @ref ham_env_create_db; sets the key type */
-#define HAM_PARAM_KEY_TYPE 0x00000104
-
-/** Parameter name for @ref ham_env_open, @ref ham_env_create;
- * sets the path of the log files */
-#define HAM_PARAM_LOG_DIRECTORY 0x00000105
-
-/** hamsterdb pro: Parameter name for @ref ham_env_open, @ref ham_env_create;
- * sets the AES encryption key */
-#define HAM_PARAM_ENCRYPTION_KEY 0x00000106
-
-/** Parameter name for @ref ham_env_open, @ref ham_env_create;
- * sets the network timeout (in seconds) */
-#define HAM_PARAM_NETWORK_TIMEOUT_SEC 0x00000107
-
-/** Parameter name for @ref ham_env_create_db; sets the key size */
-#define HAM_PARAM_RECORD_SIZE 0x00000108
-
-/** Parameter name for @ref ham_env_create, @ref ham_env_open; sets a
- * limit for the file size (in bytes) */
-#define HAM_PARAM_FILE_SIZE_LIMIT 0x00000109
-
-/** Parameter name for @ref ham_env_create, @ref ham_env_open; sets the
- * parameter for posix_fadvise() */
-#define HAM_PARAM_POSIX_FADVISE 0x00000110
-
-/** Value for @ref HAM_PARAM_POSIX_FADVISE */
-#define HAM_POSIX_FADVICE_NORMAL 0
-
-/** Value for @ref HAM_PARAM_POSIX_FADVISE */
-#define HAM_POSIX_FADVICE_RANDOM 1
-
-/** Value for unlimited record sizes */
-#define HAM_RECORD_SIZE_UNLIMITED ((uint32_t)-1)
-
-/** Value for unlimited key sizes */
-#define HAM_KEY_SIZE_UNLIMITED ((uint16_t)-1)
-
-/** Retrieves the Database/Environment flags as were specified at the time of
- * @ref ham_env_create/@ref ham_env_open invocation. */
-#define HAM_PARAM_FLAGS 0x00000200
-
-/** Retrieves the filesystem file access mode as was specified at the time
- * of @ref ham_env_create/@ref ham_env_open invocation. */
-#define HAM_PARAM_FILEMODE 0x00000201
-
-/**
- * Return a <code>const char *</code> pointer to the current
- * Environment/Database file name in the @ref uint64_t value
- * member, when the Database is actually stored on disc.
- *
- * In-memory Databases will return a NULL (0) pointer instead.
- */
-#define HAM_PARAM_FILENAME 0x00000202
-
-/**
- * Retrieve the Database 'name' number of this @ref ham_db_t Database within
- * the current @ref ham_env_t Environment.
-*/
-#define HAM_PARAM_DATABASE_NAME 0x00000203
-
-/**
- * Retrieve the maximum number of keys per page; this number depends on the
- * currently active page and key sizes. Can be an estimate if keys do not
- * have constant sizes or if duplicate keys are used.
- */
-#define HAM_PARAM_MAX_KEYS_PER_PAGE 0x00000204
-
-/**
- * hamsterdb pro: Parameter name for @ref ham_env_create, @ref ham_env_open;
- * enables compression for the journal.
- */
-#define HAM_PARAM_JOURNAL_COMPRESSION 0x00001000
-
-/**
- * hamsterdb pro: Parameter name for @ref ham_env_create_db,
- * @ref ham_env_open_db; enables compression for the records of
- * a Database.
- */
-#define HAM_PARAM_RECORD_COMPRESSION 0x00001001
-
-/**
- * hamsterdb pro: Parameter name for @ref ham_env_create_db,
- * @ref ham_env_open_db; enables compression for the records of
- * a Database.
- */
-#define HAM_PARAM_KEY_COMPRESSION 0x00001002
-
-/** hamsterdb pro: helper macro for disabling compression */
-#define HAM_COMPRESSOR_NONE 0
-
-/**
- * hamsterdb pro: selects zlib compression
- * http://www.zlib.net/
- */
-#define HAM_COMPRESSOR_ZLIB 1
-
-/**
- * hamsterdb pro: selects google snappy compression
- * http://code.google.com/p/snappy
- */
-#define HAM_COMPRESSOR_SNAPPY 2
-
-/**
- * hamsterdb pro: selects lzf compression
- * http://oldhome.schmorp.de/marc/liblzf.html
- */
-#define HAM_COMPRESSOR_LZF 3
-
-/**
- * hamsterdb pro: selects lzo compression
- * http://www.oberhumer.com/opensource/lzo
- */
-#define HAM_COMPRESSOR_LZO 4
-
-/**
- * Retrieves the Environment handle of a Database
- *
- * @param db A valid Database handle
- *
- * @return The Environment handle
- */
-HAM_EXPORT ham_env_t *HAM_CALLCONV
-ham_db_get_env(ham_db_t *db);
-
-/**
- * Returns the kind of key match which produced this key as it was
- * returned by one of the @ref ham_db_find() and @ref ham_cursor_find().
- *
- * This routine assumes the key was passed back by one of the @ref ham_db_find
- * and @ref ham_cursor_find functions and not used by any other hamsterdb
- * functions after that.
- *
- * As such, this function produces an answer akin to the 'sign' of the
- * specified key as it was returned by the find operation.
- *
- * @param key A valid key
- *
- * @return 1 (greater than) or -1 (less than) when the given key is an
- * approximate result / zero (0) otherwise. Specifically:
- * <ul>
- * <li>+1 when the key is greater than the item searched for (key
- * was a GT match)
- * <li>-1 when the key is less than the item searched for (key was
- * a LT match)
- * <li>zero (0) otherwise (key was an EQ (EXACT) match)
- * </ul>
- */
-HAM_EXPORT int HAM_CALLCONV
-ham_key_get_approximate_match_type(ham_key_t *key);
-
-/**
- * Closes the Database
- *
- * This function flushes the Database and then closes the file handle.
- * It also free the memory resources allocated in the @a db handle.
- *
- * If the flag @ref HAM_AUTO_CLEANUP is specified, hamsterdb automatically
- * calls @ref ham_cursor_close on all open Cursors. This invalidates the
- * ham_cursor_t handle!
- *
- * If the flag is not specified, the application must close all Database
- * Cursors with @ref ham_cursor_close to prevent memory leaks.
- *
- * This function also aborts all Transactions which were not yet committed,
- * and therefore renders all Transaction handles invalid. If the flag
- * @ref HAM_TXN_AUTO_COMMIT is specified, all Transactions will be committed.
- *
- * @param db A valid Database handle
- * @param flags Optional flags for closing the Database. Possible values are:
- * <ul>
- * <li>@ref HAM_AUTO_CLEANUP. Automatically closes all open Cursors
- * <li>@ref HAM_TXN_AUTO_COMMIT. Automatically commit all open
- * Transactions
- * <li>@ref HAM_TXN_AUTO_ABORT. Automatically abort all open
- * Transactions; this is the default behaviour
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db is NULL
- * @return @ref HAM_CURSOR_STILL_OPEN if not all Cursors of this Database
- * were closed, and @ref HAM_AUTO_CLEANUP was not specified
- * @return @ref HAM_TXN_STILL_OPEN if this Database is modified by a
- * currently active Transaction
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_close(ham_db_t *db, uint32_t flags);
-
-/** Flag for @ref ham_db_close, @ref ham_env_close */
-#define HAM_AUTO_CLEANUP 1
-
-/** @internal (Internal) flag for @ref ham_db_close, @ref ham_env_close */
-#define HAM_DONT_CLEAR_LOG 2
-
-/** Automatically abort all open Transactions (the default) */
-#define HAM_TXN_AUTO_ABORT 4
-
-/** Automatically commit all open Transactions */
-#define HAM_TXN_AUTO_COMMIT 8
-
-/**
- * @}
- */
-
-/**
- * @defgroup ham_cursor hamsterdb Cursor Functions
- * @{
- */
-
-/**
- * Creates a Database Cursor
- *
- * Creates a new Database Cursor. Cursors can be used to
- * traverse the Database from start to end or vice versa. Cursors
- * can also be used to insert, delete or search Database items.
- *
- * A newly created Cursor does not point to any item in the Database.
- *
- * The application should close all Cursors of a Database before closing
- * the Database.
- *
- * If Transactions are enabled (@ref HAM_ENABLE_TRANSACTIONS), but @a txn
- * is NULL, then each Cursor operation (i.e. @ref ham_cursor_insert,
- * @ref ham_cursor_find etc) will create its own, temporary Transaction
- * <b>only</b> for the lifetime of this operation and not for the lifetime
- * of the whole Cursor!
- *
- * @param db A valid Database handle
- * @param txn A Transaction handle, or NULL
- * @param flags Optional flags for creating the Cursor; unused, set to 0
- * @param cursor A pointer to a pointer which is allocated for the
- * new Cursor handle
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a db or @a cursor is NULL
- * @return @ref HAM_OUT_OF_MEMORY if the new structure could not be allocated
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_create(ham_cursor_t **cursor, ham_db_t *db, ham_txn_t *txn,
- uint32_t flags);
-
-/**
- * Clones a Database Cursor
- *
- * Clones an existing Cursor. The new Cursor will point to
- * exactly the same item as the old Cursor. If the old Cursor did not point
- * to any item, so will the new Cursor.
- *
- * If the old Cursor is bound to a Transaction, then the new Cursor will
- * also be bound to this Transaction.
- *
- * @param src The existing Cursor
- * @param dest A pointer to a pointer, which is allocated for the
- * cloned Cursor handle
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a src or @a dest is NULL
- * @return @ref HAM_OUT_OF_MEMORY if the new structure could not be allocated
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_clone(ham_cursor_t *src, ham_cursor_t **dest);
-
-/**
- * Moves the Cursor
- *
- * Moves the Cursor. Use the @a flags to specify the direction.
- * After the move, key and record of the item are returned, if @a key
- * and/or @a record are valid pointers.
- *
- * If the direction is not specified, the Cursor will not move. Do not
- * specify a direction if you want to fetch the key and/or record of
- * the current item.
- *
- * When specifying @ref HAM_DIRECT_ACCESS, the @a data pointer will point
- * directly to the record that is stored in hamsterdb; the data can be modified,
- * but the pointer must not be reallocated or freed. The flag @ref
- * HAM_DIRECT_ACCESS is only allowed in In-Memory Databases and not if
- * Transactions are enabled.
- *
- * You can read only portions of the record by specifying the flag
- * @ref HAM_PARTIAL. In this case, hamsterdb will read
- * <b>record->partial_size</b> bytes of the record data at offset
- * <b>record->partial_offset</b>. If necessary, the record data will
- * be limited to the original record size. The number of actually read
- * bytes is returned in <b>record->partial_size</b>. The original size of
- * the record is stored in <b>record->size</b>.
- *
- * @ref HAM_PARTIAL is not allowed if record->size is <= 8 or if Transactions
- * are enabled. In such a case, @ref HAM_INV_PARAMETER is returned.
- *
- * If Transactions are enabled (see @ref HAM_ENABLE_TRANSACTIONS), and
- * the Cursor moves next or previous to a key which is currently modified
- * in an active Transaction (one that is not yet committed or aborted), then
- * hamsterdb will skip the modified key. (This behavior is different from i.e.
- * @a ham_cursor_find, which would return the error @ref HAM_TXN_CONFLICT).
- *
- * If a key has duplicates and any of the duplicates is currently modified
- * in another active Transaction, then ALL duplicate keys are skipped when
- * moving to the next or previous key.
- *
- * If the first (@ref HAM_CURSOR_FIRST) or last (@ref HAM_CURSOR_LAST) key
- * is requested, and the current key (or any of its duplicates) is currently
- * modified in an active Transaction, then @ref HAM_TXN_CONFLICT is
- * returned.
- *
- * If this Cursor is nil (i.e. because it was not yet used or the Cursor's
- * item was erased) then the flag @a HAM_CURSOR_NEXT (or @a
- * HAM_CURSOR_PREVIOUS) will be identical to @a HAM_CURSOR_FIRST (or
- * @a HAM_CURSOR_LAST).
- *
- * @param cursor A valid Cursor handle
- * @param key An optional pointer to a @ref ham_key_t structure. If this
- * pointer is not NULL, the key of the new item is returned.
- * Note that key->data will point to temporary data. This pointer
- * will be invalidated by subsequent hamsterdb API calls. See
- * @ref HAM_KEY_USER_ALLOC on how to change this behaviour.
- * @param record An optional pointer to a @ref ham_record_t structure. If this
- * pointer is not NULL, the record of the new item is returned.
- * Note that record->data will point to temporary data. This pointer
- * will be invalidated by subsequent hamsterdb API calls. See
- * @ref HAM_RECORD_USER_ALLOC on how to change this behaviour.
- * @param flags The flags for this operation. They are used to specify
- * the direction for the "move". If you do not specify a direction,
- * the Cursor will remain on the current position.
- * <ul>
- * <li>@ref HAM_CURSOR_FIRST </li> positions the Cursor on the first
- * item in the Database
- * <li>@ref HAM_CURSOR_LAST </li> positions the Cursor on the last
- * item in the Database
- * <li>@ref HAM_CURSOR_NEXT </li> positions the Cursor on the next
- * item in the Database; if the Cursor does not point to any
- * item, the function behaves as if direction was
- * @ref HAM_CURSOR_FIRST.
- * <li>@ref HAM_CURSOR_PREVIOUS </li> positions the Cursor on the
- * previous item in the Database; if the Cursor does not point to
- * any item, the function behaves as if direction was
- * @ref HAM_CURSOR_LAST.
- * <li>@ref HAM_SKIP_DUPLICATES </li> skips duplicate keys of the
- * current key. Not allowed in combination with
- * @ref HAM_ONLY_DUPLICATES.
- * <li>@ref HAM_ONLY_DUPLICATES </li> only move through duplicate keys
- * of the current key. Not allowed in combination with
- * @ref HAM_SKIP_DUPLICATES.
- * <li>@ref HAM_DIRECT_ACCESS </li> Only for In-Memory Databases and
- * not if Transactions are enabled!
- * Returns a direct pointer to the data blob stored by the
- * hamsterdb engine. This pointer must not be resized or freed,
- * but the data in this memory can be modified.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a cursor is NULL, or if an invalid
- * combination of flags was specified
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is set but record
- * size is <= 8 or Transactions are enabled
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item, but
- * key and/or record were requested
- * @return @ref HAM_KEY_NOT_FOUND if @a cursor points to the first (or last)
- * item, and a move to the previous (or next) item was
- * requested
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS is specified,
- * but the Database is not an In-Memory Database.
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS and
- * @a HAM_ENABLE_TRANSACTIONS were both specified.
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is specified and
- * record->partial_offset+record->partial_size exceeds the
- * record->size
- * @return @ref HAM_TXN_CONFLICT if @ref HAM_CURSOR_FIRST or @ref
- * HAM_CURSOR_LAST is specified but the first (or last) key or
- * any of its duplicates is currently modified in an active
- * Transaction
- *
- * @sa HAM_RECORD_USER_ALLOC
- * @sa HAM_KEY_USER_ALLOC
- * @sa ham_record_t
- * @sa ham_key_t
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_move(ham_cursor_t *cursor, ham_key_t *key,
- ham_record_t *record, uint32_t flags);
-
-/** Flag for @ref ham_cursor_move */
-#define HAM_CURSOR_FIRST 0x0001
-
-/** Flag for @ref ham_cursor_move */
-#define HAM_CURSOR_LAST 0x0002
-
-/** Flag for @ref ham_cursor_move */
-#define HAM_CURSOR_NEXT 0x0004
-
-/** Flag for @ref ham_cursor_move */
-#define HAM_CURSOR_PREVIOUS 0x0008
-
-/** Flag for @ref ham_cursor_move and @ref ham_db_get_key_count */
-#define HAM_SKIP_DUPLICATES 0x0010
-
-/** Flag for @ref ham_cursor_move */
-#define HAM_ONLY_DUPLICATES 0x0020
-
-/**
- * Overwrites the current record
- *
- * This function overwrites the record of the current item.
- *
- * @param cursor A valid Cursor handle
- * @param record A valid record structure
- * @param flags Optional flags for overwriting the item; unused, set to 0
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a cursor or @a record is NULL
- * @return @ref HAM_INV_PARAMETER if @a cursor points to an item with
- * duplicates and duplicate sorting is enabled
- * @return @ref HAM_INV_PARAMETER if duplicate sorting is enabled
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_overwrite(ham_cursor_t *cursor, ham_record_t *record,
- uint32_t flags);
-
-/**
- * Searches with a key and points the Cursor to the key found, retrieves
- * the located record
- *
- * Searches for an item in the Database and points the Cursor to this item.
- * If the item could not be found, the Cursor is not modified.
- *
- * Note that @ref ham_cursor_find can not search for duplicate keys. If @a key
- * has multiple duplicates, only the first duplicate is returned.
- *
- * When specifying @ref HAM_DIRECT_ACCESS, the @a data pointer will point
- * directly to the record that is stored in hamsterdb; the data can be modified,
- * but the pointer must not be reallocated or freed. The flag @ref
- * HAM_DIRECT_ACCESS is only allowed in In-Memory Databases and not if
- * Transactions are enabled.
- *
- * You can read only portions of the record by specifying the flag
- * @ref HAM_PARTIAL. In this case, hamsterdb will read
- * <b>record->partial_size</b> bytes of the record data at offset
- * <b>record->partial_offset</b>. If necessary, the record data will
- * be limited to the original record size. The number of actually read
- * bytes is returned in <b>record->partial_size</b>. The original size of
- * the record is stored in <b>record->size</b>.
- *
- * @ref HAM_PARTIAL is not allowed if record->size is <= 8 or if Transactions
- * are enabled. In such a case, @ref HAM_INV_PARAMETER is returned.
- *
- * When either or both @ref HAM_FIND_LT_MATCH and/or @ref HAM_FIND_GT_MATCH
- * have been specified as flags, the @a key structure will be overwritten
- * when an approximate match was found: the @a key and @a record
- * structures will then point at the located @a key (and @a record).
- * In this case the caller should ensure @a key points at a structure
- * which must adhere to the same restrictions and conditions as specified
- * for @ref ham_cursor_move(...,HAM_CURSOR_*):
- * key->data will point to temporary data upon return. This pointer
- * will be invalidated by subsequent hamsterdb API calls using the same
- * Transaction (or the same Database, if Transactions are disabled). See
- * @ref HAM_KEY_USER_ALLOC on how to change this behaviour.
- *
- * Further note that the @a key structure must be non-const at all times as its
- * internal flag bits may be written to. This is done for your benefit, as
- * you may pass the returned @a key structure to
- * @ref ham_key_get_approximate_match_type() to retrieve additional info about
- * the precise nature of the returned key: the sign value produced
- * by @ref ham_key_get_approximate_match_type() tells you which kind of match
- * (equal, less than, greater than) occurred. This is very useful to
- * discern between the various possible successful answers produced by the
- * combinations of @ref HAM_FIND_LT_MATCH and @ref HAM_FIND_GT_MATCH.
- *
- * @param cursor A valid Cursor handle
- * @param key A pointer to a @ref ham_key_t structure. If this
- * pointer is not NULL, the key of the new item is returned.
- * Note that key->data will point to temporary data. This pointer
- * will be invalidated by subsequent hamsterdb API calls. See
- * @a HAM_KEY_USER_ALLOC on how to change this behaviour.
- * @param record Optional pointer to a @ref ham_record_t structure. If this
- * pointer is not NULL, the record of the new item is returned.
- * Note that record->data will point to temporary data. This pointer
- * will be invalidated by subsequent hamsterdb API calls. See
- * @ref HAM_RECORD_USER_ALLOC on how to change this behaviour.
- * @param flags Optional flags for searching, which can be combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_FIND_LT_MATCH </li> Cursor 'find' flag 'Less Than': the
- * cursor is moved to point at the last record which' key
- * is less than the specified key. When such a record cannot
- * be located, an error is returned.
- * <li>@ref HAM_FIND_GT_MATCH </li> Cursor 'find' flag 'Greater Than':
- * the cursor is moved to point at the first record which' key is
- * larger than the specified key. When such a record cannot be
- * located, an error is returned.
- * <li>@ref HAM_FIND_LEQ_MATCH </li> Cursor 'find' flag 'Less or EQual':
- * the cursor is moved to point at the record which' key matches
- * the specified key and when such a record is not available
- * the cursor is moved to point at the last record which' key
- * is less than the specified key. When such a record cannot be
- * located, an error is returned.
- * <li>@ref HAM_FIND_GEQ_MATCH </li> Cursor 'find' flag 'Greater or
- * Equal': the cursor is moved to point at the record which' key
- * matches the specified key and when such a record
- * is not available the cursor is moved to point at the first
- * record which' key is larger than the specified key.
- * When such a record cannot be located, an error is returned.
- * <li>@ref HAM_FIND_NEAR_MATCH </li> Cursor 'find' flag 'Any Near Or
- * Equal': the cursor is moved to point at the record which'
- * key matches the specified key and when such a record is
- * not available the cursor is moved to point at either the
- * last record which' key is less than the specified key or
- * the first record which' key is larger than the specified
- * key, whichever of these records is located first.
- * When such records cannot be located, an error is returned.
- * <li>@ref HAM_DIRECT_ACCESS </li> Only for In-Memory Databases and
- * not if Transactions are enabled!
- * Returns a direct pointer to the data blob stored by the
- * hamsterdb engine. This pointer must not be resized or freed,
- * but the data in this memory can be modified.
- * </ul>
- *
- * <b>Remark</b>
- * For Approximate Matching the returned match will either match the
- * key exactly or is either the first key available above or below the
- * given key when an exact match could not be found; 'find' does NOT
- * spend any effort, in the sense of determining which of both is the
- * 'nearest' to the given key, when both a key above and a key below the
- * one given exist; 'find' will simply return the first of both found.
- * As such, this flag is the simplest possible combination of the
- * combined @ref HAM_FIND_LEQ_MATCH and @ref HAM_FIND_GEQ_MATCH flags.
- *
- * Note that these flags may be bitwise OR-ed to form functional combinations.
- *
- * @ref HAM_FIND_LEQ_MATCH, @ref HAM_FIND_GEQ_MATCH and
- * @ref HAM_FIND_LT_MATCH, @ref HAM_FIND_GT_MATCH
- *
- * @return @ref HAM_SUCCESS upon success. Mind the remarks about the
- * @a key flags being adjusted and the useful invocation of
- * @ref ham_key_get_approximate_match_type() afterwards.
- * @return @ref HAM_INV_PARAMETER if @a db, @a key or @a record is NULL
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_KEY_NOT_FOUND if no suitable @a key (record) exists
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS is specified,
- * but the Database is not an In-Memory Database.
- * @return @ref HAM_INV_PARAMETER if @a HAM_DIRECT_ACCESS and
- * @a HAM_ENABLE_TRANSACTIONS were both specified.
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is set but record
- * size is <= 8 or Transactions are enabled
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- *
- * @sa HAM_KEY_USER_ALLOC
- * @sa ham_key_t
- * @sa HAM_RECORD_USER_ALLOC
- * @sa ham_record_t
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_find(ham_cursor_t *cursor, ham_key_t *key,
- ham_record_t *record, uint32_t flags);
-
-/* internal flag */
-#define HAM_FIND_EXACT_MATCH 0x4000
-
-/**
- * Cursor 'find' flag 'Less Than': return the nearest match below the
- * given key, whether an exact match exists or not.
- */
-#define HAM_FIND_LT_MATCH 0x1000
-
-/**
- * Cursor 'find' flag 'Greater Than': return the nearest match above the
- * given key, whether an exact match exists or not.
- */
-#define HAM_FIND_GT_MATCH 0x2000
-
-/**
- * Cursor 'find' flag 'Less or EQual': return the nearest match below the
- * given key, when an exact match does not exist.
- *
- * May be combined with @ref HAM_FIND_GEQ_MATCH to accept any 'near' key, or
- * you can use the @ref HAM_FIND_NEAR_MATCH constant as a shorthand for that.
- */
-#define HAM_FIND_LEQ_MATCH (HAM_FIND_LT_MATCH | HAM_FIND_EXACT_MATCH)
-
-/**
- * Cursor 'find' flag 'Greater or Equal': return the nearest match above
- * the given key, when an exact match does not exist.
- *
- * May be combined with @ref HAM_FIND_LEQ_MATCH to accept any 'near' key,
- * or you can use the @ref HAM_FIND_NEAR_MATCH constant as a shorthand for that.
- */
-#define HAM_FIND_GEQ_MATCH (HAM_FIND_GT_MATCH | HAM_FIND_EXACT_MATCH)
-
-/**
- * Cursor 'find' flag 'Any Near Or Equal': return a match directly below or
- * above the given key, when an exact match does not exist.
- *
- * Be aware that the returned match will either match the key exactly or
- * is either the first key available above or below the given key when an
- * exact match could not be found; 'find' does NOT spend any effort, in the
- * sense of determining which of both is the 'nearest' to the given key,
- * when both a key above and a key below the one given exist; 'find' will
- * simply return the first of both found. As such, this flag is the simplest
- * possible combination of the combined @ref HAM_FIND_LEQ_MATCH and
- * @ref HAM_FIND_GEQ_MATCH flags.
- */
-#define HAM_FIND_NEAR_MATCH (HAM_FIND_LT_MATCH | HAM_FIND_GT_MATCH \
- | HAM_FIND_EXACT_MATCH)
-
-/**
- * Inserts a Database item and points the Cursor to the inserted item
- *
- * This function inserts a key/record pair as a new Database item.
- * If the key already exists in the Database, error @ref HAM_DUPLICATE_KEY
- * is returned.
- *
- * If you wish to overwrite an existing entry specify the
- * flag @ref HAM_OVERWRITE. The use of this flag is not allowed in combination
- * with @ref HAM_DUPLICATE.
- *
- * If you wish to insert a duplicate key specify the flag @ref HAM_DUPLICATE.
- * (In order to use duplicate keys, the Database has to be created with
- * @ref HAM_ENABLE_DUPLICATE_KEYS.)
- * By default, the duplicate key is inserted after all other duplicate keys
- * (see @ref HAM_DUPLICATE_INSERT_LAST). This behaviour can be overwritten by
- * specifying @ref HAM_DUPLICATE_INSERT_FIRST, @ref HAM_DUPLICATE_INSERT_BEFORE
- * or @ref HAM_DUPLICATE_INSERT_AFTER.
- *
- * You can write only portions of the record by specifying the flag
- * @ref HAM_PARTIAL. In this case, hamsterdb will write <b>partial_size</b>
- * bytes of the record data at offset <b>partial_offset</b>. If necessary, the
- * record data will grow. Gaps will be filled with null-bytes, if the record
- * did not yet exist.
- *
- * @ref HAM_PARTIAL is not allowed if record->size is <= 8 or if Transactions
- * are enabled. In such a case, @ref HAM_INV_PARAMETER is returned.
- *
- * Specify the flag @ref HAM_HINT_APPEND if you insert sequential data
- * and the current @a key is greater than any other key in this Database.
- * In this case hamsterdb will optimize the insert algorithm. hamsterdb will
- * verify that this key is the greatest; if not, it will perform a normal
- * insert. This flag is the default for Record Number Databases.
- *
- * Specify the flag @ref HAM_HINT_PREPEND if you insert sequential data
- * and the current @a key is lower than any other key in this Database.
- * In this case hamsterdb will optimize the insert algorithm. hamsterdb will
- * verify that this key is the lowest; if not, it will perform a normal
- * insert.
- *
- * After inserting, the Cursor will point to the new item. If inserting
- * the item failed, the Cursor is not modified.
- *
- * Record Number Databases (created with @ref HAM_RECORD_NUMBER32 or
- * @ref HAM_RECORD_NUMBER64) expect either an empty @a key (with a size of
- * 0 and data pointing to NULL), or a user-supplied key (with key.flag
- * @ref HAM_KEY_USER_ALLOC and a valid data pointer).
- * If key.size is 0 and key.data is NULL, hamsterdb will temporarily
- * allocate memory for key->data, which will then point to an 4-byte (or 8-byte)
- * unsigned integer.
- *
- * @param cursor A valid Cursor handle
- * @param key A valid key structure
- * @param record A valid record structure
- * @param flags Optional flags for inserting the item, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_OVERWRITE. If the @a key already exists, the record is
- * overwritten. Otherwise, the key is inserted. Not allowed in
- * combination with @ref HAM_DUPLICATE.
- * <li>@ref HAM_DUPLICATE. If the @a key already exists, a duplicate
- * key is inserted. Same as @ref HAM_DUPLICATE_INSERT_LAST. Not
- * allowed in combination with @ref HAM_DUPLICATE.
- * <li>@ref HAM_DUPLICATE_INSERT_BEFORE. If the @a key already exists,
- * a duplicate key is inserted before the duplicate pointed
- * to by the Cursor. Not allowed if duplicate sorting is enabled.
- * <li>@ref HAM_DUPLICATE_INSERT_AFTER. If the @a key already exists,
- * a duplicate key is inserted after the duplicate pointed
- * to by the Cursor. Not allowed if duplicate sorting is enabled.
- * <li>@ref HAM_DUPLICATE_INSERT_FIRST. If the @a key already exists,
- * a duplicate key is inserted as the first duplicate of
- * the current key. Not allowed if duplicate sorting is enabled.
- * <li>@ref HAM_DUPLICATE_INSERT_LAST. If the @a key already exists,
- * a duplicate key is inserted as the last duplicate of
- * the current key. Not allowed if duplicate sorting is enabled.
- * <li>@ref HAM_HINT_APPEND. Hints the hamsterdb engine that the
- * current key will compare as @e larger than any key already
- * existing in the Database. The hamsterdb engine will verify
- * this postulation and when found not to be true, will revert
- * to a regular insert operation as if this flag was not
- * specified. The incurred cost then is only one additional key
- * comparison. Mutually exclusive with flag @ref HAM_HINT_PREPEND.
- * This is the default for Record Number Databases.
- * <li>@ref HAM_HINT_PREPEND. Hints the hamsterdb engine that the
- * current key will compare as @e lower than any key already
- * existing in the Database. The hamsterdb engine will verify
- * this postulation and when found not to be true, will revert
- * to a regular insert operation as if this flag was not
- * specified. The incurred cost then is only one additional key
- * comparison. Mutually exclusive with flag @ref HAM_HINT_APPEND.
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a key or @a record is NULL
- * @return @ref HAM_INV_PARAMETER if the Database is a Record Number Database
- * and the key is invalid (see above)
- * @return @ref HAM_INV_PARAMETER if @ref HAM_PARTIAL is set but record
- * size is <= 8 or Transactions are enabled
- * @return @ref HAM_INV_PARAMETER if the flags @ref HAM_OVERWRITE <b>and</b>
- * @ref HAM_DUPLICATE were specified, or if @ref HAM_DUPLICATE
- * was specified, but the Database was not created with
- * flag @ref HAM_ENABLE_DUPLICATE_KEYS.
- * @return @ref HAM_WRITE_PROTECTED if you tried to insert a key to a read-only
- * Database.
- * @return @ref HAM_INV_KEY_SIZE if the key size is different from
- * the one specified with @a HAM_PARAM_KEY_SIZE
- * @return @ref HAM_INV_RECORD_SIZE if the record size is different from
- * the one specified with @a HAM_PARAM_RECORD_SIZE
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_insert(ham_cursor_t *cursor, ham_key_t *key,
- ham_record_t *record, uint32_t flags);
-
-/**
- * Erases the current key
- *
- * Erases a key from the Database. If the erase was
- * successful, the Cursor is invalidated and does no longer point to
- * any item. In case of an error, the Cursor is not modified.
- *
- * If the Database was opened with the flag @ref HAM_ENABLE_DUPLICATE_KEYS,
- * this function erases only the duplicate item to which the Cursor refers.
- *
- * @param cursor A valid Cursor handle
- * @param flags Unused, set to 0
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if @a cursor is NULL
- * @return @ref HAM_WRITE_PROTECTED if you tried to erase a key from a read-only
- * Database
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_erase(ham_cursor_t *cursor, uint32_t flags);
-
-/**
- * Returns the number of duplicate keys
- *
- * Returns the number of duplicate keys of the item to which the
- * Cursor currently refers.
- * Returns 1 if the key has no duplicates.
- *
- * @param cursor A valid Cursor handle
- * @param count Returns the number of duplicate keys
- * @param flags Optional flags; unused, set to 0.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_INV_PARAMETER if @a cursor or @a count is NULL
- * @return @ref HAM_TXN_CONFLICT if the same key was inserted in another
- * Transaction which was not yet committed or aborted
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_get_duplicate_count(ham_cursor_t *cursor,
- uint32_t *count, uint32_t flags);
-
-/**
- * Returns the current cursor position in the duplicate list
- *
- * Returns the position in the duplicate list of the current key. The position
- * is 0-based.
- *
- * @param cursor A valid Cursor handle
- * @param position Returns the duplicate position
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_INV_PARAMETER if @a cursor or @a position is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_get_duplicate_position(ham_cursor_t *cursor,
- uint32_t *position);
-
-/**
- * Returns the record size of the current key
- *
- * Returns the record size of the item to which the Cursor currently refers.
- *
- * @param cursor A valid Cursor handle
- * @param size Returns the record size, in bytes
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_INV_PARAMETER if @a cursor or @a size is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_get_record_size(ham_cursor_t *cursor, uint64_t *size);
-
-/**
- * Closes a Database Cursor
- *
- * Closes a Cursor and frees allocated memory. All Cursors
- * should be closed before closing the Database (see @ref ham_db_close).
- *
- * @param cursor A valid Cursor handle
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_CURSOR_IS_NIL if the Cursor does not point to an item
- * @return @ref HAM_INV_PARAMETER if @a cursor is NULL
- *
- * @sa ham_db_close
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_cursor_close(ham_cursor_t *cursor);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif /* HAM_HAMSTERDB_H */
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.hpp b/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.hpp
deleted file mode 100644
index 68892ac2d7..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb.hpp
+++ /dev/null
@@ -1,711 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-/**
- * @file hamsterdb.hpp
- * @author Christoph Rupp, chris@crupp.de
- * @version 2.1.10
- *
- * This C++ wrapper class is a very tight wrapper around the C API. It does
- * not attempt to be STL compatible.
- *
- * All functions throw exceptions of class @sa ham::error in case of an error.
- * Please refer to the C API documentation for more information. You can find
- * it here: http://hamsterdb.com/?page=doxygen&module=globals.html
- *
- */
-
-#ifndef HAM_HAMSTERDB_HPP
-#define HAM_HAMSTERDB_HPP
-
-#include <ham/hamsterdb.h>
-#include <ham/hamsterdb_int.h>
-#include <cstring>
-#include <vector>
-
-#if defined(_MSC_VER) && defined(_DEBUG) && !defined(_CRTDBG_MAP_ALLOC)
-# define _CRTDBG_MAP_ALLOC
-# include <crtdbg.h>
-#endif
-
-/**
- * @defgroup ham_cpp hamsterdb C++ API wrapper
- * @{
- */
-
-/**
- * The global hamsterdb namespace.
- */
-namespace hamsterdb {
-
-class txn;
-class db;
-class env;
-
-/**
- * An error class.
- *
- * The hamsterdb C++ API throws this class as Exceptions.
- */
-class error {
- public:
- /** Constructor */
- error(ham_status_t st)
- : m_errno(st) {
- };
-
- /** Returns the error code. */
- ham_status_t get_errno() const {
- return (m_errno);
- }
-
- /** Returns an English error description. */
- const char *get_string() const {
- return (ham_strerror(m_errno));
- }
-
-private:
- ham_status_t m_errno;
-};
-
-/**
- * A key class.
- *
- * This class wraps structures of type ham_key_t.
- */
-class key {
- public:
- /** Constructor */
- key(void *data = 0, uint16_t size = 0, uint32_t flags = 0) {
- memset(&m_key, 0, sizeof(m_key));
- m_key.data = data;
- m_key.size = size;
- m_key.flags = flags;
- if (m_key.size != size) // check for overflow
- throw error(HAM_INV_KEYSIZE);
- }
-
- /** Copy constructor. */
- key(const key &other)
- : m_key(other.m_key) {
- }
-
- /** Assignment operator. */
- key &operator=(const key &other) {
- if (&other != this)
- m_key = other.m_key;
- return (*this);
- }
-
- /** Returns the key data. */
- void *get_data() const {
- return (m_key.data);
- }
-
- /** Sets the key data. */
- void set_data(void *data) {
- m_key.data = data;
- }
-
- /** Returns the size of the key. */
- uint16_t get_size() const {
- return (m_key.size);
- }
-
- /** Sets the size of the key. */
- void set_size(uint16_t size) {
- m_key.size = size;
- }
-
- /** Template assignment */
- template <class T>
- void set(T &t) {
- set_data(&t);
- set_size(sizeof(t));
- }
-
- /** Returns the flags of the key. */
- uint32_t get_flags() const {
- return (m_key.flags);
- }
-
- /** Sets the flags of the key. */
- void set_flags(uint32_t flags) {
- m_key.flags = flags;
- }
-
- /** Returns a pointer to the internal ham_key_t structure. */
- ham_key_t *get_handle() {
- return (&m_key);
- }
-
- /** Returns 'sign' of Approximate Match */
- int get_approximate_match_type() {
- return (ham_key_get_approximate_match_type(&m_key));
- }
-
-private:
- ham_key_t m_key;
-};
-
-/**
- * A record class.
- *
- * This class wraps structures of type ham_record_t.
- */
-class record {
- public:
- /** Constructor */
- record(void *data = 0, uint32_t size = 0, uint32_t flags = 0) {
- memset(&m_rec, 0, sizeof(m_rec));
- m_rec.data = data;
- m_rec.size = size;
- m_rec.flags = flags;
- }
-
- /** Copy constructor. */
- record(const record &other)
- : m_rec(other.m_rec) {
- }
-
- /** Assignment operator. */
- record &operator=(const record &other) {
- m_rec = other.m_rec;
- return (*this);
- }
-
- /** Returns the record data. */
- void *get_data() const {
- return (m_rec.data);
- }
-
- /** Sets the record data. */
- void set_data(void *data) {
- m_rec.data = data;
- }
-
- /** Returns the size of the record. */
- uint32_t get_size() const {
- return (m_rec.size);
- }
-
- /** Sets the size of the record. */
- void set_size(uint32_t size) {
- m_rec.size = size;
- }
-
- /** Returns the flags of the record. */
- uint32_t get_flags() const {
- return (m_rec.flags);
- }
-
- /** Sets the flags of the record. */
- void set_flags(uint32_t flags) {
- m_rec.flags = flags;
- }
-
- /** Returns a pointer to the internal ham_record_t structure. */
- ham_record_t *get_handle() {
- return (&m_rec);
- }
-
- protected:
- ham_record_t m_rec;
-};
-
-
-/**
- * A Transaction class
- *
- * This class wraps structures of type ham_txn_t.
- */
-class txn {
- public:
- /** Constructor */
- txn(ham_txn_t *t = 0)
- : m_txn(t) {
- }
-
- /** Abort the Transaction */
- void abort() {
- ham_status_t st = ham_txn_abort(m_txn, 0);
- if (st)
- throw error(st);
- }
-
- /** Commit the Transaction */
- void commit() {
- ham_status_t st = ham_txn_commit(m_txn, 0);
- if (st)
- throw error(st);
- }
-
- std::string get_name() {
- const char *p = ham_txn_get_name(m_txn);
- return (p ? p : "");
- }
-
- /** Returns a pointer to the internal ham_txn_t structure. */
- ham_txn_t *get_handle() {
- return (m_txn);
- }
-
- protected:
- ham_txn_t *m_txn;
-};
-
-
-/**
- * A Database class.
- *
- * This class wraps the ham_db_t Database handles.
- */
-class db {
- public:
- /** Set error handler function. */
- static void set_errhandler(ham_errhandler_fun f) {
- ham_set_errhandler(f);
- }
-
- /** Retrieves the hamsterdb library version. */
- static void get_version(uint32_t *major, uint32_t *minor,
- uint32_t *revision) {
- ham_get_version(major, minor, revision);
- }
-
- /** Constructor */
- db()
- : m_db(0) {
- }
-
- /** Destructor - automatically closes the Database, if necessary. */
- ~db() {
- close();
- }
-
- /**
- * Assignment operator.
- *
- * <b>Important!</b> This operator transfers the ownership of the
- * Database handle.
- */
- db &operator=(const db &other) {
- db &rhs = (db &)other;
- if (this == &other)
- return (*this);
- close();
- m_db = rhs.m_db;
- rhs.m_db = 0;
- return (*this);
- }
-
- /** Returns the last Database error. */
- ham_status_t get_error() {
- return (ham_db_get_error(m_db));
- }
-
- /** Sets the comparison function. */
- void set_compare_func(ham_compare_func_t foo) {
- ham_status_t st = ham_db_set_compare_func(m_db, foo);
- if (st)
- throw error(st);
- }
-
- /** Finds a record by looking up the key. */
- record find(txn *t, key *k, uint32_t flags = 0) {
- record r;
- ham_status_t st = ham_db_find(m_db,
- t ? t->get_handle() : 0,
- k ? k->get_handle() : 0,
- r.get_handle(), flags);
- if (st)
- throw error(st);
- return (r);
- }
-
- /** Finds a record by looking up the key. */
- record &find(txn *t, key *k, record *r, uint32_t flags = 0) {
- ham_status_t st = ham_db_find(m_db,
- t ? t->get_handle() : 0,
- k ? k->get_handle() : 0,
- r->get_handle(), flags);
- if (st)
- throw error(st);
- return (*r);
- }
-
- /** Finds a record by looking up the key. */
- record find(key *k, uint32_t flags = 0) {
- return (find(0, k, flags));
- }
-
- /** Inserts a key/record pair. */
- void insert(txn *t, key *k, record *r, uint32_t flags = 0) {
- ham_status_t st = ham_db_insert(m_db,
- t ? t->get_handle() : 0,
- k ? k->get_handle() : 0,
- r ? r->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
-
- /** Inserts a key/record pair. */
- void insert(key *k, record *r, uint32_t flags=0) {
- insert(0, k, r, flags);
- }
-
- /** Erases a key/record pair. */
- void erase(key *k, uint32_t flags = 0) {
- erase(0, k, flags);
- }
-
- /** Erases a key/record pair. */
- void erase(txn *t, key *k, uint32_t flags = 0) {
- ham_status_t st = ham_db_erase(m_db,
- t ? t->get_handle() : 0,
- k ? k->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
-
- /** Returns number of items in the Database. */
- uint64_t get_key_count(ham_txn_t *txn = 0, uint32_t flags = 0) {
- uint64_t count = 0;
- ham_status_t st = ham_db_get_key_count(m_db, txn, flags, &count);
- if (st)
- throw error(st);
- return (count);
- }
-
- /** Retrieves Database parameters. */
- void get_parameters(ham_parameter_t *param) {
- ham_status_t st = ham_db_get_parameters(m_db, param);
- if (st)
- throw error(st);
- }
-
- /** Closes the Database. */
- void close(uint32_t flags = 0) {
- if (!m_db)
- return;
- // disable auto-cleanup; all objects will be destroyed when
- // going out of scope
- flags &= ~HAM_AUTO_CLEANUP;
- ham_status_t st = ham_db_close(m_db, flags);
- if (st)
- throw error(st);
- m_db = 0;
- }
-
- /** Returns a pointer to the internal ham_db_t structure. */
- ham_db_t *get_handle() {
- return (m_db);
- }
-
-protected:
- friend class env;
-
- /* Copy Constructor. Is protected and should not be used. */
- db(ham_db_t *db)
- : m_db(db) {
- }
-
- private:
- ham_db_t *m_db;
-};
-
-
-/**
- * A Database Cursor.
- *
- * This class wraps the ham_cursor_t Cursor handles.
- */
-class cursor {
- public:
- /** Constructor */
- cursor(db *db = 0, txn *t = 0, uint32_t flags = 0)
- : m_cursor(0) {
- create(db, t, flags);
- }
-
- /** Constructor */
- cursor(txn *t, db *db = 0, uint32_t flags = 0)
- : m_cursor(0) {
- create(db, t, flags);
- }
-
- /** Destructor - automatically closes the Cursor, if necessary. */
- ~cursor() {
- close();
- }
-
- /** Creates a new Cursor. */
- void create(db *db, txn *t = 0, uint32_t flags = 0) {
- if (m_cursor)
- close();
- if (db) {
- ham_status_t st = ham_cursor_create(&m_cursor, db->get_handle(),
- t ? t->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
- }
-
- /** Clones the Cursor. */
- cursor clone() {
- ham_cursor_t *dest;
- ham_status_t st = ham_cursor_clone(m_cursor, &dest);
- if (st)
- throw error(st);
- return (cursor(dest));
- }
-
- /** Moves the Cursor, and retrieves the key/record of the new position. */
- void move(key *k, record *r, uint32_t flags = 0) {
- ham_status_t st = ham_cursor_move(m_cursor, k ? k->get_handle() : 0,
- r ? r->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
-
- /** Moves the Cursor to the first Database element. */
- void move_first(key *k = 0, record *r = 0) {
- move(k, r, HAM_CURSOR_FIRST);
- }
-
- /** Moves the Cursor to the last Database element. */
- void move_last(key *k = 0, record *r = 0) {
- move(k, r, HAM_CURSOR_LAST);
- }
-
- /** Moves the Cursor to the next Database element. */
- void move_next(key *k = 0, record *r = 0) {
- move(k, r, HAM_CURSOR_NEXT);
- }
-
- /** Moves the Cursor to the previous Database element. */
- void move_previous(key *k = 0, record *r = 0) {
- move(k, r, HAM_CURSOR_PREVIOUS);
- }
-
- /** Overwrites the current record. */
- void overwrite(record *r, uint32_t flags = 0) {
- ham_status_t st = ham_cursor_overwrite(m_cursor,
- r ? r->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
-
- /** Finds a key. */
- void find(key *k, record *r = 0, uint32_t flags = 0) {
- ham_status_t st = ham_cursor_find(m_cursor, k->get_handle(),
- (r ? r->get_handle() : 0), flags);
- if (st)
- throw error(st);
- }
-
- /** Inserts a key/record pair. */
- void insert(key *k, record *r, uint32_t flags = 0) {
- ham_status_t st = ham_cursor_insert(m_cursor, k ? k->get_handle() : 0,
- r ? r->get_handle() : 0, flags);
- if (st)
- throw error(st);
- }
-
- /** Erases the current key/record pair. */
- void erase(uint32_t flags = 0) {
- ham_status_t st = ham_cursor_erase(m_cursor, flags);
- if (st)
- throw error(st);
- }
-
- /** Returns the number of duplicate keys. */
- uint32_t get_duplicate_count(uint32_t flags = 0) {
- uint32_t c;
- ham_status_t st = ham_cursor_get_duplicate_count(m_cursor, &c, flags);
- if (st)
- throw error(st);
- return (c);
- }
-
- /** Returns the size of the current record. */
- uint64_t get_record_size() {
- uint64_t s;
- ham_status_t st = ham_cursor_get_record_size(m_cursor, &s);
- if (st)
- throw error(st);
- return (s);
- }
-
- /** Closes the Cursor. */
- void close() {
- if (!m_cursor)
- return;
- ham_status_t st = ham_cursor_close(m_cursor);
- if (st)
- throw error(st);
- m_cursor = 0;
- }
-
- protected:
- /* Copy Constructor. Is protected and should not be used. */
- cursor(ham_cursor_t *c) {
- m_cursor = c;
- }
-
- private:
- ham_cursor_t *m_cursor;
-};
-
-/**
- * An Environment class.
- *
- * This class wraps the ham_env_t structure.
- */
-class env {
- public:
- /** Constructor */
- env()
- : m_env(0) {
- }
-
- /** Destructor - automatically closes the Cursor, if necessary. */
- ~env() {
- close();
- }
-
- /** Creates a new Environment. */
- void create(const char *filename, uint32_t flags = 0,
- uint32_t mode = 0644, const ham_parameter_t *param = 0) {
- ham_status_t st = ham_env_create(&m_env, filename, flags, mode, param);
- if (st)
- throw error(st);
- }
-
- /** Opens an existing Environment. */
- void open(const char *filename, uint32_t flags = 0,
- const ham_parameter_t *param = 0) {
- ham_status_t st = ham_env_open(&m_env, filename, flags, param);
- if (st)
- throw error(st);
- }
-
- /** Flushes the Environment to disk. */
- void flush(uint32_t flags = 0) {
- ham_status_t st = ham_env_flush(m_env, flags);
- if (st)
- throw error(st);
- }
-
- /** Creates a new Database in the Environment. */
- db create_db(uint16_t name, uint32_t flags = 0,
- const ham_parameter_t *param = 0) {
- ham_db_t *dbh;
-
- ham_status_t st = ham_env_create_db(m_env, &dbh, name, flags, param);
- if (st)
- throw error(st);
-
- return (hamsterdb::db(dbh));
- }
-
- /** Opens an existing Database in the Environment. */
- db open_db(uint16_t name, uint32_t flags = 0,
- const ham_parameter_t *param = 0) {
- ham_db_t *dbh;
-
- ham_status_t st = ham_env_open_db(m_env, &dbh, name, flags, param);
- if (st)
- throw error(st);
-
- return (hamsterdb::db(dbh));
- }
-
- /** Renames an existing Database in the Environment. */
- void rename_db(uint16_t oldname, uint16_t newname, uint32_t flags = 0) {
- ham_status_t st = ham_env_rename_db(m_env, oldname, newname, flags);
- if (st)
- throw error(st);
- }
-
- /** Deletes a Database from the Environment. */
- void erase_db(uint16_t name, uint32_t flags = 0) {
- ham_status_t st = ham_env_erase_db(m_env, name, flags);
- if (st)
- throw error(st);
- }
-
- /** Begin a new Transaction */
- txn begin(const char *name = 0) {
- ham_txn_t *h;
- ham_status_t st = ham_txn_begin(&h, m_env, name, 0, 0);
- if (st)
- throw error(st);
- return (txn(h));
- }
-
-
- /** Closes the Environment. */
- void close(uint32_t flags = 0) {
- if (!m_env)
- return;
- // disable auto-cleanup; all objects will be destroyed when
- // going out of scope
- flags &= ~HAM_AUTO_CLEANUP;
- ham_status_t st = ham_env_close(m_env, flags);
- if (st)
- throw error(st);
- m_env = 0;
- }
-
- /** Retrieves Environment parameters. */
- void get_parameters(ham_parameter_t *param) {
- ham_status_t st = ham_env_get_parameters(m_env, param);
- if (st)
- throw error(st);
- }
-
- /** Get all Database names. */
- std::vector<uint16_t> get_database_names() {
- uint32_t count = 32;
- ham_status_t st;
- std::vector<uint16_t> v(count);
-
- for (;;) {
- st = ham_env_get_database_names(m_env, &v[0], &count);
- if (!st)
- break;
- if (st && st!=HAM_LIMITS_REACHED)
- throw error(st);
- count += 16;
- v.resize(count);
- }
-
- v.resize(count);
- return (v);
- }
-
- private:
- ham_env_t *m_env;
-};
-
-} // namespace hamsterdb
-
-/**
- * @}
- */
-
-#endif // HAMSTERDB_HPP
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_int.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_int.h
deleted file mode 100644
index ec05ece264..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_int.h
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-/**
- * @file hamsterdb_int.h
- * @brief Internal hamsterdb Embedded Storage functions.
- * @author Christoph Rupp, chris@crupp.de
- *
- * Please be aware that the interfaces in this file are mostly for internal
- * use. Unlike those in hamsterdb.h they are not stable and can be changed
- * with every new version.
- *
- */
-
-#ifndef HAM_HAMSTERDB_INT_H
-#define HAM_HAMSTERDB_INT_H
-
-#include <ham/hamsterdb.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup ham_extended_api hamsterdb Enhanced API
- * @{
- */
-
-/** get the (non-persisted) flags of a key */
-#define ham_key_get_intflags(key) (key)->_flags
-
-/**
- * set the flags of a key
- *
- * Note that the ham_find/ham_cursor_find/ham_cursor_find_ex flags must
- * be defined such that those can peacefully co-exist with these; that's
- * why those public flags start at the value 0x1000 (4096).
- */
-#define ham_key_set_intflags(key, f) (key)->_flags=(f)
-
-/**
- * Verifies the integrity of the Database
- *
- * This function is only interesting if you want to debug hamsterdb.
- *
- * @param db A valid Database handle
- * @param flags Optional flags for the integrity check, combined with
- * bitwise OR. Possible flags are:
- * <ul>
- * <li>@ref HAM_PRINT_GRAPH</li> Prints the Btree as a graph; stores
- * the image as "graph.png" in the current working directory. It uses
- * the "dot" tool from graphviz to generate the image.
- * This functionality is only available in DEBUG builds!
- * </ul>
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INTEGRITY_VIOLATED if the Database is broken
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_db_check_integrity(ham_db_t *db, uint32_t flags);
-
-/** Flag for ham_db_check_integrity */
-#define HAM_PRINT_GRAPH 1
-
-/**
- * Set a user-provided context pointer
- *
- * This function sets a user-provided context pointer. This can be any
- * arbitrary pointer; it is stored in the Database handle and can be
- * retrieved with @a ham_get_context_data. It is mainly used by Wrappers
- * and language bindings.
- *
- * @param db A valid Database handle
- * @param data The pointer to the context data
- */
-HAM_EXPORT void HAM_CALLCONV
-ham_set_context_data(ham_db_t *db, void *data);
-
-/**
- * Retrieves a user-provided context pointer
- *
- * This function retrieves a user-provided context pointer. This can be any
- * arbitrary pointer which was previously stored with @a ham_set_context_data.
- *
- * @param db A valid Database handle
- * @param dont_lock Whether the Environment mutex should be locked or not
- * this is used to avoid recursive locks when retrieving the context
- * data in a compare function
- *
- * @return The pointer to the context data
- */
-HAM_EXPORT void * HAM_CALLCONV
-ham_get_context_data(ham_db_t *db, ham_bool_t dont_lock);
-
-/**
- * Retrieves the Database handle of a Cursor
- *
- * @param cursor A valid Cursor handle
- *
- * @return @a The Database handle of @a cursor
- */
-HAM_EXPORT ham_db_t * HAM_CALLCONV
-ham_cursor_get_database(ham_cursor_t *cursor);
-
-typedef struct min_max_avg_u32_t {
- uint32_t min;
- uint32_t max;
- uint32_t avg;
- uint32_t _total; /* for calculating the average */
- uint32_t _instances; /* for calculating the average */
-} min_max_avg_u32_t;
-
-/* btree metrics */
-typedef struct btree_metrics_t {
- /* the database name of the btree */
- uint16_t database_name;
-
- /* number of pages */
- uint64_t number_of_pages;
-
- /* number of keys */
- uint64_t number_of_keys;
-
- /* total btree space, including overhead */
- uint64_t total_btree_space;
-
- /* static overhead per page */
- uint32_t overhead_per_page;
-
- /* number of keys stored per page (w/o duplicates) */
- min_max_avg_u32_t keys_per_page;
-
- /* payload storage assigned to the KeyLists */
- min_max_avg_u32_t keylist_ranges;
-
- /* payload storage assigned to the RecordLists */
- min_max_avg_u32_t recordlist_ranges;
-
- /* storage assigned to the Indices (if available) */
- min_max_avg_u32_t keylist_index;
-
- /* storage assigned to the Indices (if available) */
- min_max_avg_u32_t recordlist_index;
-
- /* unused storage (i.e. gaps between pages, underfilled blocks etc) */
- min_max_avg_u32_t keylist_unused;
-
- /* unused storage (i.e. gaps between pages, underfilled blocks etc) */
- min_max_avg_u32_t recordlist_unused;
-
- /* number of blocks per page (if available) */
- min_max_avg_u32_t keylist_blocks_per_page;
-
- /* block sizes (if available) */
- min_max_avg_u32_t keylist_block_sizes;
-} btree_metrics_t;
-
-/**
- * Retrieves collected metrics from the hamsterdb Environment. Used mainly
- * for testing.
- * See below for the structure with the currently available metrics.
- * This structure will change a lot; the first field is a version indicator
- * that applications can use to verify that the structure layout is compatible.
- *
- * These metrics are NOT persisted to disk.
- *
- * Metrics marked "global" are stored globally and shared between multiple
- * Environments.
- */
-#define HAM_METRICS_VERSION 9
-
-typedef struct ham_env_metrics_t {
- /* the version indicator - must be HAM_METRICS_VERSION */
- uint16_t version;
-
- /* number of total allocations for the whole lifetime of the process */
- uint64_t mem_total_allocations;
-
- /* currently active allocations for the whole process */
- uint64_t mem_current_allocations;
-
- /* current amount of memory allocated and tracked by the process
- * (excludes memory used by the kernel or not allocated with
- * malloc/free) */
- uint64_t mem_current_usage;
-
- /* peak usage of memory (for the whole process) */
- uint64_t mem_peak_usage;
-
- /* the heap size of this process */
- uint64_t mem_heap_size;
-
- /* amount of pages fetched from disk */
- uint64_t page_count_fetched;
-
- /* amount of pages written to disk */
- uint64_t page_count_flushed;
-
- /* number of index pages in this Environment */
- uint64_t page_count_type_index;
-
- /* number of blob pages in this Environment */
- uint64_t page_count_type_blob;
-
- /* number of page-manager pages in this Environment */
- uint64_t page_count_type_page_manager;
-
- /* number of successful freelist hits */
- uint64_t freelist_hits;
-
- /* number of freelist misses */
- uint64_t freelist_misses;
-
- /* number of successful cache hits */
- uint64_t cache_hits;
-
- /* number of cache misses */
- uint64_t cache_misses;
-
- /* number of blobs allocated */
- uint64_t blob_total_allocated;
-
- /* number of blobs read */
- uint64_t blob_total_read;
-
- /* (global) number of btree page splits */
- uint64_t btree_smo_split;
-
- /* (global) number of btree page merges */
- uint64_t btree_smo_merge;
-
- /* (global) number of extended keys */
- uint64_t extended_keys;
-
- /* (global) number of extended duplicate tables */
- uint64_t extended_duptables;
-
- /* number of bytes that the log/journal flushes to disk */
- uint64_t journal_bytes_flushed;
-
- /* PRO: log/journal bytes before compression */
- uint64_t journal_bytes_before_compression;
-
- /* PRO: log/journal bytes after compression */
- uint64_t journal_bytes_after_compression;
-
- /* PRO: record bytes before compression */
- uint64_t record_bytes_before_compression;
-
- /* PRO: record bytes after compression */
- uint64_t record_bytes_after_compression;
-
- /* PRO: key bytes before compression */
- uint64_t key_bytes_before_compression;
-
- /* PRO: key bytes after compression */
- uint64_t key_bytes_after_compression;
-
- /* PRO: set to the max. SIMD lane width (0 if SIMD is not available) */
- int simd_lane_width;
-
- /* btree metrics for leaf nodes */
- btree_metrics_t btree_leaf_metrics;
-
- /* btree metrics for internal nodes */
- btree_metrics_t btree_internal_metrics;
-
-} ham_env_metrics_t;
-
-/**
- * Retrieves the current metrics from an Environment
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-ham_env_get_metrics(ham_env_t *env, ham_env_metrics_t *metrics);
-
-/**
- * Returns @ref HAM_TRUE if this hamsterdb library was compiled with debug
- * diagnostics, checks and asserts
- */
-HAM_EXPORT ham_bool_t HAM_CALLCONV
-ham_is_debug();
-
-/**
- * Returns @ref HAM_TRUE if this hamsterdb library is the commercial
- * closed-source "hamsterdb pro" edition
- */
-HAM_EXPORT ham_bool_t HAM_CALLCONV
-ham_is_pro();
-
-/**
- * Returns the end time of the evaluation period, if this is an evaluation
- * license of the commercial closed-source "hamsterdb pro";
- * returns 0 otherwise
- */
-HAM_EXPORT uint32_t HAM_CALLCONV
-ham_is_pro_evaluation();
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif /* HAM_HAMSTERDB_INT_H */
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_ola.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_ola.h
deleted file mode 100644
index f65b98b8b1..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_ola.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-/**
- * @file hamsterdb_hola.h
- * @brief Include file for hamsterdb OnLine Analytical functions
- * @author Christoph Rupp, chris@crupp.de
- * @version 2.1.10
- *
- * This API is EXPERIMENTAL!! The interface is not yet stable.
- */
-
-#ifndef HAM_HAMSTERDB_OLA_H
-#define HAM_HAMSTERDB_OLA_H
-
-#include <ham/hamsterdb.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * A predicate function with context parameters returning a bool value.
- *
- * The predicate function is applied to various analytical functions
- * of this API and is generally used to select keys where a predicate applies.
- */
-typedef struct {
- /** A function pointer; receives a key, returns a bool */
- ham_bool_t (*predicate_func)(const void *key_data, uint16_t key_size,
- void *context);
-
- /** User-supplied context data */
- void *context;
-
-} hola_bool_predicate_t;
-
-
-/**
- * A structure which returns the result of an operation.
- *
- * For now, the result is either a @a uint64_t counter or a @a double value.
- * The @a type parameter specifies which one is used; @a type's value is
- * one of @a HAM_TYPE_UINT64 or @a HAM_TYPE_REAL64.
- */
-typedef struct {
- union {
- /** The result as a 64bit unsigned integer */
- uint64_t result_u64;
-
- /** The result as a 64bit real */
- double result_double;
- } u;
-
- /** The actual type in the union - one of the @a HAM_TYPE_* macros */
- int type;
-
-} hola_result_t;
-
-
-/**
- * Counts the keys in a Database
- *
- * This is a non-distinct count. If the Database has duplicate keys then
- * they are included in the count.
- *
- * The actual count is returned in @a result->u.result_u64. @a result->type
- * is set to @a HAM_TYPE_U64.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_count(ham_db_t *db, ham_txn_t *txn, hola_result_t *result);
-
-/**
- * Selectively counts the keys in a Database
- *
- * This is a non-distinct count. If the Database has duplicate keys then
- * they are included in the count. The predicate function is applied to
- * each key. If it returns true then the key (and its duplicates) is included
- * in the count; otherwise the key is ignored.
- *
- * The actual count is returned in @a result->u.result_u64. @a result->type
- * is set to @a HAM_TYPE_U64.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_count_if(ham_db_t *db, ham_txn_t *txn, hola_bool_predicate_t *pred,
- hola_result_t *result);
-
-/**
- * Counts the distinct keys in a Database
- *
- * This is a distinct count. If the Database has duplicate keys then
- * they are not included in the count.
- *
- * The actual count is returned in @a result->u.result_u64. @a result->type
- * is set to @a HAM_TYPE_U64.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_count_distinct(ham_db_t *db, ham_txn_t *txn, hola_result_t *result);
-
-/**
- * Selectively counts the distinct keys in a Database
- *
- * This is a distinct count. If the Database has duplicate keys then
- * they are not included in the count. The predicate function is applied to
- * each key. If it returns true then the key is included in the count;
- * otherwise the key is ignored.
- *
- * The actual count is returned in @a result->u.result_u64. @a result->type
- * is set to @a HAM_TYPE_U64.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_count_distinct_if(ham_db_t *db, ham_txn_t *txn,
- hola_bool_predicate_t *pred, hola_result_t *result);
-
-/**
- * Calculates the average of all keys.
- *
- * This is a non-distinct function and includes all duplicate keys.
- *
- * Internally, a 64bit counter is used for the calculation. This function
- * does not protect against an overflow of this counter.
- *
- * The keys in the database (@a db) have to be numeric, which means that
- * the Database's type must be one of @a HAM_TYPE_UINT8, @a HAM_TYPE_UINT16,
- * HAM_TYPE_UINT32, @a HAM_TYPE_UINT64, @a HAM_TYPE_REAL32 or
- * @a HAM_TYPE_REAL64.
- *
- * The actual result is returned in @a result->u.result_u64 or
- * @a result->u.result_double, depending on the Database's configuration.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- * @return @ref HAM_INV_PARAMETER if the database is not numeric
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_average(ham_db_t *db, ham_txn_t *txn, hola_result_t *result);
-
-/**
- * Calculates the average of all keys where a predicate applies.
- *
- * This is a non-distinct function and includes all duplicate keys for which
- * the predicate function returns true.
- *
- * Internally, a 64bit counter is used for the calculation. This function
- * does not protect against an overflow of this counter.
- *
- * The keys in the database (@a db) have to be numeric, which means that
- * the Database's type must be one of @a HAM_TYPE_UINT8, @a HAM_TYPE_UINT16,
- * HAM_TYPE_UINT32, @a HAM_TYPE_UINT64, @a HAM_TYPE_REAL32 or
- * @a HAM_TYPE_REAL64.
- *
- * The actual result is returned in @a result->u.result_u64 or
- * @a result->u.result_double, depending on the Database's configuration.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- * @return @ref HAM_INV_PARAMETER if the database is not numeric
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_average_if(ham_db_t *db, ham_txn_t *txn, hola_bool_predicate_t *pred,
- hola_result_t *result);
-
-/**
- * Calculates the sum of all keys.
- *
- * This is a non-distinct function and includes all duplicate keys.
- *
- * Internally, a 64bit counter is used for the calculation. This function
- * does not protect against an overflow of this counter.
- *
- * The keys in the database (@a db) have to be numeric, which means that
- * the Database's type must be one of @a HAM_TYPE_UINT8, @a HAM_TYPE_UINT16,
- * HAM_TYPE_UINT32, @a HAM_TYPE_UINT64, @a HAM_TYPE_REAL32 or
- * @a HAM_TYPE_REAL64.
- *
- * The actual result is returned in @a result->u.result_u64 or
- * @a result->u.result_double, depending on the Database's configuration.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- * @return @ref HAM_INV_PARAMETER if the database is not numeric
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_sum(ham_db_t *db, ham_txn_t *txn, hola_result_t *result);
-
-/**
- * Calculates the sum of all keys where a predicate applies.
- *
- * This is a non-distinct function and includes all duplicate keys for which
- * the predicate function returns true.
- *
- * Internally, a 64bit counter is used for the calculation. This function
- * does not protect against an overflow of this counter.
- *
- * The keys in the database (@a db) have to be numeric, which means that
- * the Database's type must be one of @a HAM_TYPE_UINT8, @a HAM_TYPE_UINT16,
- * HAM_TYPE_UINT32, @a HAM_TYPE_UINT64, @a HAM_TYPE_REAL32 or
- * @a HAM_TYPE_REAL64.
- *
- * The actual result is returned in @a result->u.result_u64 or
- * @a result->u.result_double, depending on the Database's configuration.
- *
- * @return @ref HAM_SUCCESS upon success
- * @return @ref HAM_INV_PARAMETER if one of the parameters is NULL
- * @return @ref HAM_INV_PARAMETER if the database is not numeric
- */
-HAM_EXPORT ham_status_t HAM_CALLCONV
-hola_sum_if(ham_db_t *db, ham_txn_t *txn, hola_bool_predicate_t *pred,
- hola_result_t *result);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif /* HAM_HAMSTERDB_OLA_H */
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_srv.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_srv.h
deleted file mode 100644
index 83ffef8f2e..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/hamsterdb_srv.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-#ifndef HAM_HAMSTERDB_SRV_H
-#define HAM_HAMSTERDB_SRV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <ham/hamsterdb.h>
-
-/**
- * @defgroup ham_server hamsterdb Embedded Server
- * @{
- */
-
-/**
- * A configuration structure
- *
- * It is always recommended to initialize the full structure with zeroes
- * before using it.
- */
-typedef struct {
- /** The server port */
- uint16_t port;
-
- /* Path of the access log, or NULL if no log should be written
- * - currently NOT USED! */
- const char *access_log_path;
-
- /** Path of the error log, or NULL if no log should be written
- * - currently NOT USED! */
- const char *error_log_path;
-
-} ham_srv_config_t;
-
-/**
- * A server handle
- */
-struct ham_srv_t;
-typedef struct ham_srv_t ham_srv_t;
-
-/**
- * Initialize the server
- *
- * This function initializes a ham_srv_t handle and starts the hamsterdb
- * database server on the port specified in the configuration object.
- *
- * @param config A configuration structure
- * @param srv A pointer to a ham_srv_t pointer; will be allocated
- * if this function returns successfully
- *
- * @return HAM_SUCCESS on success
- * @return HAM_OUT_OF_MEMORY if memory could not be allocated
- */
-extern ham_status_t
-ham_srv_init(ham_srv_config_t *config, ham_srv_t **srv);
-
-/**
- * Add a hamsterdb Environment
- *
- * This function adds a new hamsterdb Environment to the server. The
- * Environment has to be initialized properly by the caller. It will be
- * served at ham://localhost:port/urlname, where @a port was specified
- * for @ref ham_srv_init and @a urlname is the third parameter to this
- * function.
- *
- * A client accessing this Environment will specify this URL as a filename,
- * and hamsterdb will transparently connect to this server.
- *
- * @param srv A valid ham_srv_t handle
- * @param env A valid hamsterdb Environment handle
- * @param urlname URL of this Environment
- *
- * @return HAM_SUCCESS on success
- * @return HAM_LIMITS_REACHED if more than the max. number of Environments
- * were added (default limit: 128)
- */
-extern ham_status_t
-ham_srv_add_env(ham_srv_t *srv, ham_env_t *env, const char *urlname);
-
-/*
- * Release memory and clean up
- *
- * @param srv A valid ham_srv_t handle
- *
- * @warning
- * This function will not close open handles (i.e. of Databases, Cursors
- * or Transactions). The caller has to close the remaining Environment
- * handles (@see ham_env_close).
- */
-extern void
-ham_srv_close(ham_srv_t *srv);
-
-/**
- * @}
- */
-
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif /* HAM_HAMSTERDB_SRV_H */
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/msstdint.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/msstdint.h
deleted file mode 100644
index 4fe0ef9a9b..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/msstdint.h
+++ /dev/null
@@ -1,259 +0,0 @@
-// ISO C9x compliant stdint.h for Microsoft Visual Studio
-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
-//
-// Copyright (c) 2006-2013 Alexander Chemeris
-//
-// 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.
-//
-// 3. Neither the name of the product nor the names of its contributors may
-// be used to endorse or promote products derived from this software
-// without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef _MSC_VER // [
-#error "Use this header only with Microsoft Visual C++ compilers!"
-#endif // _MSC_VER ]
-
-#ifndef _MSC_STDINT_H_ // [
-#define _MSC_STDINT_H_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif
-
-#if _MSC_VER >= 1600 // [
-#include <stdint.h>
-#else // ] _MSC_VER >= 1600 [
-
-#include <limits.h>
-
-// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
-// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
-// or compiler give many errors like this:
-// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
-#ifdef __cplusplus
-extern "C" {
-#endif
-# include <wchar.h>
-#ifdef __cplusplus
-}
-#endif
-
-// Define _W64 macros to mark types changing their size, like intptr_t.
-#ifndef _W64
-# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
-# define _W64 __w64
-# else
-# define _W64
-# endif
-#endif
-
-
-// 7.18.1 Integer types
-
-// 7.18.1.1 Exact-width integer types
-
-// Visual Studio 6 and Embedded Visual C++ 4 doesn't
-// realize that, e.g. char has the same size as __int8
-// so we give up on __intX for them.
-#if (_MSC_VER < 1300)
- typedef signed char int8_t;
- typedef signed short int16_t;
- typedef signed int int32_t;
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
-#else
- typedef signed __int8 int8_t;
- typedef signed __int16 int16_t;
- typedef signed __int32 int32_t;
- typedef unsigned __int8 uint8_t;
- typedef unsigned __int16 uint16_t;
- typedef unsigned __int32 uint32_t;
-#endif
-typedef signed __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-
-// 7.18.1.2 Minimum-width integer types
-typedef int8_t int_least8_t;
-typedef int16_t int_least16_t;
-typedef int32_t int_least32_t;
-typedef int64_t int_least64_t;
-typedef uint8_t uint_least8_t;
-typedef uint16_t uint_least16_t;
-typedef uint32_t uint_least32_t;
-typedef uint64_t uint_least64_t;
-
-// 7.18.1.3 Fastest minimum-width integer types
-typedef int8_t int_fast8_t;
-typedef int16_t int_fast16_t;
-typedef int32_t int_fast32_t;
-typedef int64_t int_fast64_t;
-typedef uint8_t uint_fast8_t;
-typedef uint16_t uint_fast16_t;
-typedef uint32_t uint_fast32_t;
-typedef uint64_t uint_fast64_t;
-
-// 7.18.1.4 Integer types capable of holding object pointers
-#ifdef _WIN64 // [
- typedef signed __int64 intptr_t;
- typedef unsigned __int64 uintptr_t;
-#else // _WIN64 ][
- typedef _W64 signed int intptr_t;
- typedef _W64 unsigned int uintptr_t;
-#endif // _WIN64 ]
-
-// 7.18.1.5 Greatest-width integer types
-typedef int64_t intmax_t;
-typedef uint64_t uintmax_t;
-
-
-// 7.18.2 Limits of specified-width integer types
-
-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
-
-// 7.18.2.1 Limits of exact-width integer types
-#define INT8_MIN ((int8_t)_I8_MIN)
-#define INT8_MAX _I8_MAX
-#define INT16_MIN ((int16_t)_I16_MIN)
-#define INT16_MAX _I16_MAX
-#define INT32_MIN ((int32_t)_I32_MIN)
-#define INT32_MAX _I32_MAX
-#define INT64_MIN ((int64_t)_I64_MIN)
-#define INT64_MAX _I64_MAX
-#define UINT8_MAX _UI8_MAX
-#define UINT16_MAX _UI16_MAX
-#define UINT32_MAX _UI32_MAX
-#define UINT64_MAX _UI64_MAX
-
-// 7.18.2.2 Limits of minimum-width integer types
-#define INT_LEAST8_MIN INT8_MIN
-#define INT_LEAST8_MAX INT8_MAX
-#define INT_LEAST16_MIN INT16_MIN
-#define INT_LEAST16_MAX INT16_MAX
-#define INT_LEAST32_MIN INT32_MIN
-#define INT_LEAST32_MAX INT32_MAX
-#define INT_LEAST64_MIN INT64_MIN
-#define INT_LEAST64_MAX INT64_MAX
-#define UINT_LEAST8_MAX UINT8_MAX
-#define UINT_LEAST16_MAX UINT16_MAX
-#define UINT_LEAST32_MAX UINT32_MAX
-#define UINT_LEAST64_MAX UINT64_MAX
-
-// 7.18.2.3 Limits of fastest minimum-width integer types
-#define INT_FAST8_MIN INT8_MIN
-#define INT_FAST8_MAX INT8_MAX
-#define INT_FAST16_MIN INT16_MIN
-#define INT_FAST16_MAX INT16_MAX
-#define INT_FAST32_MIN INT32_MIN
-#define INT_FAST32_MAX INT32_MAX
-#define INT_FAST64_MIN INT64_MIN
-#define INT_FAST64_MAX INT64_MAX
-#define UINT_FAST8_MAX UINT8_MAX
-#define UINT_FAST16_MAX UINT16_MAX
-#define UINT_FAST32_MAX UINT32_MAX
-#define UINT_FAST64_MAX UINT64_MAX
-
-// 7.18.2.4 Limits of integer types capable of holding object pointers
-#ifdef _WIN64 // [
-# define INTPTR_MIN INT64_MIN
-# define INTPTR_MAX INT64_MAX
-# define UINTPTR_MAX UINT64_MAX
-#else // _WIN64 ][
-# define INTPTR_MIN INT32_MIN
-# define INTPTR_MAX INT32_MAX
-# define UINTPTR_MAX UINT32_MAX
-#endif // _WIN64 ]
-
-// 7.18.2.5 Limits of greatest-width integer types
-#define INTMAX_MIN INT64_MIN
-#define INTMAX_MAX INT64_MAX
-#define UINTMAX_MAX UINT64_MAX
-
-// 7.18.3 Limits of other integer types
-
-#ifdef _WIN64 // [
-# define PTRDIFF_MIN _I64_MIN
-# define PTRDIFF_MAX _I64_MAX
-#else // _WIN64 ][
-# define PTRDIFF_MIN _I32_MIN
-# define PTRDIFF_MAX _I32_MAX
-#endif // _WIN64 ]
-
-#define SIG_ATOMIC_MIN INT_MIN
-#define SIG_ATOMIC_MAX INT_MAX
-
-#ifndef SIZE_MAX // [
-# ifdef _WIN64 // [
-# define SIZE_MAX _UI64_MAX
-# else // _WIN64 ][
-# define SIZE_MAX _UI32_MAX
-# endif // _WIN64 ]
-#endif // SIZE_MAX ]
-
-// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
-#ifndef WCHAR_MIN // [
-# define WCHAR_MIN 0
-#endif // WCHAR_MIN ]
-#ifndef WCHAR_MAX // [
-# define WCHAR_MAX _UI16_MAX
-#endif // WCHAR_MAX ]
-
-#define WINT_MIN 0
-#define WINT_MAX _UI16_MAX
-
-#endif // __STDC_LIMIT_MACROS ]
-
-
-// 7.18.4 Limits of other integer types
-
-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
-
-// 7.18.4.1 Macros for minimum-width integer constants
-
-#define INT8_C(val) val##i8
-#define INT16_C(val) val##i16
-#define INT32_C(val) val##i32
-#define INT64_C(val) val##i64
-
-#define UINT8_C(val) val##ui8
-#define UINT16_C(val) val##ui16
-#define UINT32_C(val) val##ui32
-#define UINT64_C(val) val##ui64
-
-// 7.18.4.2 Macros for greatest-width integer constants
-// These #ifndef's are needed to prevent collisions with <boost/cstdint.hpp>.
-// Check out Issue 9 for the details.
-#ifndef INTMAX_C // [
-# define INTMAX_C INT64_C
-#endif // INTMAX_C ]
-#ifndef UINTMAX_C // [
-# define UINTMAX_C UINT64_C
-#endif // UINTMAX_C ]
-
-#endif // __STDC_CONSTANT_MACROS ]
-
-#endif // _MSC_VER >= 1600 ]
-
-#endif // _MSC_STDINT_H_ ]
diff --git a/plugins/Dbx_kv/src/hamsterdb/include/ham/types.h b/plugins/Dbx_kv/src/hamsterdb/include/ham/types.h
deleted file mode 100644
index 54d75aa7e0..0000000000
--- a/plugins/Dbx_kv/src/hamsterdb/include/ham/types.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2005-2015 Christoph Rupp (chris@crupp.de).
- *
- * 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.
- */
-
-/**
- * @file types.h
- * @brief Portable typedefs for hamsterdb Embedded Storage.
- * @author Christoph Rupp, chris@crupp.de
- *
- */
-
-#ifndef HAM_TYPES_H
-#define HAM_TYPES_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Check the operating system and word size
- */
-#ifdef WIN32
-# undef HAM_OS_WIN32
-# define HAM_OS_WIN32 1
-# ifdef WIN64
-# undef HAM_64BIT
-# define HAM_64BIT 1
-# elif WIN32
-# undef HAM_32BIT
-# define HAM_32BIT 1
-# else
-# error "Neither WIN32 nor WIN64 defined!"
-# endif
-#else /* posix? */
-# undef HAM_OS_POSIX
-# define HAM_OS_POSIX 1
-# if defined(__LP64__) || defined(__LP64) || __WORDSIZE == 64
-# undef HAM_64BIT
-# define HAM_64BIT 1
-# else
-# undef HAM_32BIT
-# define HAM_32BIT 1
-# endif
-#endif
-
-#if defined(HAM_OS_POSIX) && defined(HAM_OS_WIN32)
-# error "Unknown arch - neither HAM_OS_POSIX nor HAM_OS_WIN32 defined"
-#endif
-
-/*
- * improve memory debugging on WIN32 by using crtdbg.h (only MSVC
- * compiler and debug builds!)
- *
- * make sure crtdbg.h is loaded before malloc.h!
- */
-#if defined(_MSC_VER) && defined(HAM_OS_WIN32)
-# if (defined(WIN32) || defined(__WIN32)) && !defined(UNDER_CE)
-# if defined(DEBUG) || defined(_DEBUG)
-# ifndef _CRTDBG_MAP_ALLOC
-# define _CRTDBG_MAP_ALLOC 1
-# endif
-# endif
-# include <crtdbg.h>
-# include <malloc.h>
-# endif
-#endif
-
-/*
- * Create the EXPORT macro for Microsoft Visual C++
- */
-#ifndef HAM_EXPORT
-# ifdef _MSC_VER
-# define HAM_EXPORT __declspec(dllexport)
-# else
-# define HAM_EXPORT extern
-# endif
-#endif
-
-/*
- * The default calling convention is cdecl
- */
-#ifndef HAM_CALLCONV
-# define HAM_CALLCONV
-#endif
-
-/*
- * Common typedefs. Since stdint.h is not available on older versions of
- * Microsoft Visual Studio, they get declared here.
- * http://msinttypes.googlecode.com/svn/trunk/stdint.h
- */
-#if _MSC_VER
-# include <ham/msstdint.h>
-#else
-# include <stdint.h>
-#endif
-
-/* Deprecated typedefs; used prior to 2.1.9. Please do not use them! */
-typedef int64_t ham_s64_t;
-typedef uint64_t ham_u64_t;
-typedef int32_t ham_s32_t;
-typedef uint32_t ham_u32_t;
-typedef int16_t ham_s16_t;
-typedef uint16_t ham_u16_t;
-typedef int8_t ham_s8_t;
-typedef uint8_t ham_u8_t;
-
-/*
- * Undefine macros to avoid macro redefinitions
- */
-#undef HAM_INVALID_FD
-#undef HAM_FALSE
-#undef HAM_TRUE
-
-/**
- * a boolean type
- */
-typedef int ham_bool_t;
-#define HAM_FALSE 0
-#define HAM_TRUE (!HAM_FALSE)
-
-/**
- * typedef for error- and status-code
- */
-typedef int ham_status_t;
-
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif /* HAM_TYPES_H */