-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Bindings for libmdbx, an embedded key/value store -- -- Haskell bindings for libmdbx. -- -- See documentation in the main module or check the README on -- GitHub. @package libmdbx @version 0.1.0.3 -- | Low level bindings to libmdbx functions. module Mdbx.FFI -- | Flags for opening and environment. data MdbxEnvFlags MdbxEnvDefaults :: MdbxEnvFlags MdbxSyncDurable :: MdbxEnvFlags MdbxNosubdir :: MdbxEnvFlags MdbxSafeNosync :: MdbxEnvFlags MdbxMapasync :: MdbxEnvFlags MdbxRdonly :: MdbxEnvFlags MdbxNometasync :: MdbxEnvFlags MdbxWritemap :: MdbxEnvFlags MdbxUtterlyNosync :: MdbxEnvFlags MdbxNotls :: MdbxEnvFlags MdbxExclusive :: MdbxEnvFlags MdbxNordahead :: MdbxEnvFlags MdbxNomeminit :: MdbxEnvFlags MdbxCoalesce :: MdbxEnvFlags MdbxLiforeclaim :: MdbxEnvFlags MdbxPageperturb :: MdbxEnvFlags MdbxAccede :: MdbxEnvFlags -- | Environment object, needed for all the operations. newtype MdbxEnv MdbxEnv :: Ptr MdbxEnv -> MdbxEnv -- | UNIX permissions to set on created files. Zero value means to open -- existing, but do not create. type MdbxEnvMode = (CUInt) -- | Creates an environment. Represents a database in the file system. mdbx_env_create :: IO (Int, MdbxEnv) -- | Opens an environment. Receives name, flags and mode. mdbx_env_open :: MdbxEnv -> String -> [MdbxEnvFlags] -> MdbxEnvMode -> IO Int -- | Closes an environment. mdbx_env_close :: MdbxEnv -> IO Int -- | Flags for a transaction. data MdbxTxnFlags MdbxTxnReadwrite :: MdbxTxnFlags MdbxTxnNosync :: MdbxTxnFlags MdbxTxnRdonly :: MdbxTxnFlags MdbxTxnNometasync :: MdbxTxnFlags MdbxTxnRdonlyPrepare :: MdbxTxnFlags MdbxTxnTry :: MdbxTxnFlags -- | Transaction instance. Needed for all operations with data, even -- reading. newtype MdbxTxn MdbxTxn :: Ptr MdbxTxn -> MdbxTxn -- | Begins a new transaction. -- -- Arguments: -- -- mdbx_txn_begin :: MdbxEnv -> Maybe MdbxTxn -> [MdbxTxnFlags] -> IO (Int, MdbxTxn) -- | Commits a transaction. mdbx_txn_commit :: MdbxTxn -> IO Int -- | Aborts a transaction. mdbx_txn_abort :: MdbxTxn -> IO Int -- | Gets the environment from a transaction. mdbx_txn_env :: MdbxTxn -> IO MdbxEnv -- | Flags for a database. data MdbxDbFlags MdbxDbDefaults :: MdbxDbFlags MdbxReversekey :: MdbxDbFlags MdbxDupsort :: MdbxDbFlags MdbxIntegerkey :: MdbxDbFlags MdbxDupfixed :: MdbxDbFlags MdbxIntegerdup :: MdbxDbFlags MdbxReversedup :: MdbxDbFlags MdbxCreate :: MdbxDbFlags MdbxDbAccede :: MdbxDbFlags -- | Database instance. Represents a logical table in the database. type MdbxDbi = (CUInt) -- | Opens a database. -- -- Arguments: -- -- mdbx_dbi_open :: MdbxTxn -> Maybe String -> [MdbxDbFlags] -> IO (Int, MdbxDbi) -- | Closes a database. mdbx_dbi_close :: MdbxEnv -> MdbxDbi -> IO Int -- | Binary blob representing a key or value in the database. data MdbxVal MdbxVal :: {-# UNPACK #-} !CULong -> {-# UNPACK #-} !Ptr () -> MdbxVal [mvlSize] :: MdbxVal -> {-# UNPACK #-} !CULong [mvlData] :: MdbxVal -> {-# UNPACK #-} !Ptr () -- | Sample empty value emptyMdbxVal :: MdbxVal -- | Flags for all data related operations. data MdbxPutFlags MdbxUpsert :: MdbxPutFlags MdbxNooverwrite :: MdbxPutFlags MdbxNodupdata :: MdbxPutFlags MdbxCurrent :: MdbxPutFlags MdbxAlldups :: MdbxPutFlags MdbxReserve :: MdbxPutFlags MdbxAppend :: MdbxPutFlags MdbxAppenddup :: MdbxPutFlags MdbxMultiple :: MdbxPutFlags -- | Stores a key/value pair. -- -- Arguments: -- -- mdbx_put :: MdbxTxn -> MdbxDbi -> MdbxVal -> MdbxVal -> [MdbxPutFlags] -> IO Int -- | Gets a value with the given key. -- -- Arguments: -- -- mdbx_get :: MdbxTxn -> MdbxDbi -> MdbxVal -> IO (Int, MdbxVal) -- | Gets a value with the given key. -- -- Arguments: -- -- mdbx_del :: MdbxTxn -> MdbxDbi -> MdbxVal -> Maybe MdbxVal -> IO Int -- | Flags for cursor operations. data MdbxCursorOp MdbxFirst :: MdbxCursorOp MdbxFirstDup :: MdbxCursorOp MdbxGetBoth :: MdbxCursorOp MdbxGetBothRange :: MdbxCursorOp MdbxGetCurrent :: MdbxCursorOp MdbxGetMultiple :: MdbxCursorOp MdbxLast :: MdbxCursorOp MdbxLastDup :: MdbxCursorOp MdbxNext :: MdbxCursorOp MdbxNextDup :: MdbxCursorOp MdbxNextMultiple :: MdbxCursorOp MdbxNextNodup :: MdbxCursorOp MdbxPrev :: MdbxCursorOp MdbxPrevDup :: MdbxCursorOp MdbxPrevNodup :: MdbxCursorOp MdbxSet :: MdbxCursorOp MdbxSetKey :: MdbxCursorOp MdbxSetRange :: MdbxCursorOp MdbxPrevMultiple :: MdbxCursorOp MdbxSetLowerbound :: MdbxCursorOp -- | Cursor instance. Used for efficient navigation in a database. newtype MdbxCursor MdbxCursor :: Ptr MdbxCursor -> MdbxCursor -- | Opens a new cursor. -- -- Arguments: -- -- mdbx_cursor_open :: MdbxTxn -> MdbxDbi -> IO (Int, MdbxCursor) -- | Closes a cursor. mdbx_cursor_close :: MdbxCursor -> IO () -- | Removes the current key/value pair. mdbx_cursor_del :: MdbxCursor -> [MdbxPutFlags] -> IO Int -- | Returns the current key/value pair. mdbx_cursor_get :: MdbxCursor -> MdbxVal -> MdbxCursorOp -> IO (Int, MdbxVal, MdbxVal) -- | Sets the value for the current key. -- -- Arguments: -- -- mdbx_cursor_put :: MdbxCursor -> MdbxVal -> MdbxVal -> [MdbxPutFlags] -> IO Int -- | Returns the count of duplicates in the current key. mdbx_cursor_count :: MdbxCursor -> IO (Int, CSize) -- | Returns the description of a given error number. mdbx_strerror :: Int -> IO String -- | Compares two values as a binary blob. mdbx_cmp :: MdbxTxn -> MdbxDbi -> MdbxVal -> MdbxVal -> IO Int -- | Error codes for the different operations. data MdbxError MdbxKeyexist :: MdbxError MdbxFirstLmdbErrcode :: MdbxError MdbxNotfound :: MdbxError MdbxPageNotfound :: MdbxError MdbxCorrupted :: MdbxError MdbxPanic :: MdbxError MdbxVersionMismatch :: MdbxError MdbxInvalid :: MdbxError MdbxMapFull :: MdbxError MdbxDbsFull :: MdbxError MdbxReadersFull :: MdbxError MdbxTxnFull :: MdbxError MdbxCursorFull :: MdbxError MdbxPageFull :: MdbxError MdbxUnableExtendMapsize :: MdbxError MdbxIncompatible :: MdbxError MdbxBadRslot :: MdbxError MdbxBadTxn :: MdbxError MdbxBadValsize :: MdbxError MdbxBadDbi :: MdbxError MdbxProblem :: MdbxError MdbxLastLmdbErrcode :: MdbxError MdbxBusy :: MdbxError MdbxFirstAddedErrcode :: MdbxError MdbxEmultival :: MdbxError MdbxEbadsign :: MdbxError MdbxWannaRecovery :: MdbxError MdbxEkeymismatch :: MdbxError MdbxTooLarge :: MdbxError MdbxThreadMismatch :: MdbxError MdbxTxnOverlapping :: MdbxError MdbxLastAddedErrcode :: MdbxError MdbxResultTrue :: MdbxError MdbxSuccess :: MdbxError MdbxResultFalse :: MdbxError MdbxEperm :: MdbxError MdbxEnofile :: MdbxError MdbxEintr :: MdbxError MdbxEio :: MdbxError MdbxEnomem :: MdbxError MdbxEaccess :: MdbxError MdbxEremote :: MdbxError MdbxEinval :: MdbxError MdbxErofs :: MdbxError MdbxEnosys :: MdbxError MdbxEnodata :: MdbxError instance GHC.Classes.Ord Mdbx.FFI.MdbxError instance GHC.Classes.Eq Mdbx.FFI.MdbxError instance GHC.Show.Show Mdbx.FFI.MdbxError instance GHC.Classes.Ord Mdbx.FFI.MdbxEnvFlags instance GHC.Classes.Eq Mdbx.FFI.MdbxEnvFlags instance GHC.Show.Show Mdbx.FFI.MdbxEnvFlags instance GHC.Classes.Ord Mdbx.FFI.MdbxTxnFlags instance GHC.Classes.Eq Mdbx.FFI.MdbxTxnFlags instance GHC.Show.Show Mdbx.FFI.MdbxTxnFlags instance GHC.Classes.Ord Mdbx.FFI.MdbxDbFlags instance GHC.Classes.Eq Mdbx.FFI.MdbxDbFlags instance GHC.Show.Show Mdbx.FFI.MdbxDbFlags instance GHC.Show.Show Mdbx.FFI.MdbxVal instance GHC.Classes.Eq Mdbx.FFI.MdbxVal instance GHC.Classes.Ord Mdbx.FFI.MdbxPutFlags instance GHC.Classes.Eq Mdbx.FFI.MdbxPutFlags instance GHC.Show.Show Mdbx.FFI.MdbxPutFlags instance GHC.Enum.Enum Mdbx.FFI.MdbxCursorOp instance GHC.Classes.Ord Mdbx.FFI.MdbxCursorOp instance GHC.Classes.Eq Mdbx.FFI.MdbxCursorOp instance GHC.Show.Show Mdbx.FFI.MdbxCursorOp instance Foreign.Storable.Storable Mdbx.FFI.MdbxEnv instance Foreign.Storable.Storable Mdbx.FFI.MdbxTxn instance Foreign.Storable.Storable Mdbx.FFI.MdbxCursor instance GHC.Enum.Enum Mdbx.FFI.MdbxPutFlags instance Foreign.Storable.Storable Mdbx.FFI.MdbxVal instance GHC.Enum.Enum Mdbx.FFI.MdbxDbFlags instance GHC.Enum.Enum Mdbx.FFI.MdbxTxnFlags instance GHC.Enum.Enum Mdbx.FFI.MdbxEnvFlags instance GHC.Enum.Enum Mdbx.FFI.MdbxError -- | Thin wrappers over the low level API to provide MonadIO support and -- exception based error handling. module Mdbx.API -- | Compares two keys and returns -1, 0 or 1 if key1 is lower, equal or -- greater than key2. keyCmp :: MonadIO m => MdbxTxn -> MdbxDbi -> MdbxVal -> MdbxVal -> m Int -- | Opens an environment. envOpen :: (MonadIO m, MonadFail m) => String -> [MdbxEnvFlags] -> m MdbxEnv -- | Close an environment. envClose :: (MonadIO m, MonadFail m) => MdbxEnv -> m () -- | Begins a transaction. txnBegin :: (MonadIO m, MonadFail m) => MdbxEnv -> Maybe MdbxTxn -> [MdbxTxnFlags] -> m MdbxTxn -- | Commits a transaction. txnCommit :: (MonadIO m, MonadFail m) => MdbxTxn -> m () -- | Aborts a transaction. txnAbort :: (MonadIO m, MonadFail m) => MdbxTxn -> m () -- | Opens a database (table). dbiOpen :: (MonadIO m, MonadFail m) => MdbxEnv -> Maybe String -> [MdbxDbFlags] -> m MdbxDbi -- | Closes a database. dbiClose :: (MonadIO m, MonadFail m) => MdbxEnv -> MdbxDbi -> m () -- | Saves the provided key/value pair. itemPut :: (MonadIO m, MonadFail m) => MdbxTxn -> MdbxDbi -> MdbxVal -> MdbxVal -> [MdbxPutFlags] -> m () -- | Returns the value associated to the given key, if any. itemGet :: (MonadIO m, MonadFail m) => MdbxTxn -> MdbxDbi -> MdbxVal -> m (Maybe MdbxVal) -- | Deletes the value associated with the given key, if any. itemDel :: (MonadIO m, MonadFail m) => MdbxTxn -> MdbxDbi -> MdbxVal -> Maybe MdbxVal -> m () -- | Opens a cursor. cursorOpen :: (MonadIO m, MonadFail m) => MdbxTxn -> MdbxDbi -> m MdbxCursor -- | Closes a cursor. cursorClose :: (MonadIO m, MonadFail m) => MdbxCursor -> m () -- | Stores the provided value at the given key, positioning the cursor on -- it. cursorPut :: (MonadIO m, MonadFail m) => MdbxCursor -> MdbxVal -> MdbxVal -> [MdbxPutFlags] -> m () -- | Deletes the value at the current position. cursorDel :: (MonadIO m, MonadFail m) => MdbxCursor -> [MdbxPutFlags] -> m () -- | Moves to the first key on the database. cursorFirst :: (MonadIO m, MonadFail m) => MdbxCursor -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves to the last key on the database. cursorLast :: (MonadIO m, MonadFail m) => MdbxCursor -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves to the given key. cursorAt :: (MonadIO m, MonadFail m) => MdbxCursor -> MdbxVal -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves to the given key or first greater than it. Useful for searching. cursorRange :: (MonadIO m, MonadFail m) => MdbxCursor -> MdbxVal -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves to the next key. cursorNext :: (MonadIO m, MonadFail m) => MdbxCursor -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves to the previous key. cursorPrev :: (MonadIO m, MonadFail m) => MdbxCursor -> m (Maybe (MdbxVal, MdbxVal)) -- | Moves the cursor using the provided operation. cursorMove :: (MonadIO m, MonadFail m) => MdbxCursor -> MdbxVal -> MdbxCursorOp -> m (Maybe (MdbxVal, MdbxVal)) -- | Types used by the library. Mainly re exports the types generated by -- c2hs in the FFI module, while also adding some types used by the high -- level interface. module Mdbx.Types -- | Environment object, needed for all the operations. data MdbxEnv -- | Transaction instance. Needed for all operations with data, even -- reading. data MdbxTxn -- | Database instance. Represents a logical table in the database. type MdbxDbi = (CUInt) -- | Binary blob representing a key or value in the database. data MdbxVal MdbxVal :: {-# UNPACK #-} !CULong -> {-# UNPACK #-} !Ptr () -> MdbxVal [mvlSize] :: MdbxVal -> {-# UNPACK #-} !CULong [mvlData] :: MdbxVal -> {-# UNPACK #-} !Ptr () -- | UNIX permissions to set on created files. Zero value means to open -- existing, but do not create. type MdbxEnvMode = (CUInt) -- | Flags for opening and environment. data MdbxEnvFlags MdbxEnvDefaults :: MdbxEnvFlags MdbxSyncDurable :: MdbxEnvFlags MdbxNosubdir :: MdbxEnvFlags MdbxSafeNosync :: MdbxEnvFlags MdbxMapasync :: MdbxEnvFlags MdbxRdonly :: MdbxEnvFlags MdbxNometasync :: MdbxEnvFlags MdbxWritemap :: MdbxEnvFlags MdbxUtterlyNosync :: MdbxEnvFlags MdbxNotls :: MdbxEnvFlags MdbxExclusive :: MdbxEnvFlags MdbxNordahead :: MdbxEnvFlags MdbxNomeminit :: MdbxEnvFlags MdbxCoalesce :: MdbxEnvFlags MdbxLiforeclaim :: MdbxEnvFlags MdbxPageperturb :: MdbxEnvFlags MdbxAccede :: MdbxEnvFlags -- | Flags for a transaction. data MdbxTxnFlags MdbxTxnReadwrite :: MdbxTxnFlags MdbxTxnNosync :: MdbxTxnFlags MdbxTxnRdonly :: MdbxTxnFlags MdbxTxnNometasync :: MdbxTxnFlags MdbxTxnRdonlyPrepare :: MdbxTxnFlags MdbxTxnTry :: MdbxTxnFlags -- | Flags for a database. data MdbxDbFlags MdbxDbDefaults :: MdbxDbFlags MdbxReversekey :: MdbxDbFlags MdbxDupsort :: MdbxDbFlags MdbxIntegerkey :: MdbxDbFlags MdbxDupfixed :: MdbxDbFlags MdbxIntegerdup :: MdbxDbFlags MdbxReversedup :: MdbxDbFlags MdbxCreate :: MdbxDbFlags MdbxDbAccede :: MdbxDbFlags -- | Flags for all data related operations. data MdbxPutFlags MdbxUpsert :: MdbxPutFlags MdbxNooverwrite :: MdbxPutFlags MdbxNodupdata :: MdbxPutFlags MdbxCurrent :: MdbxPutFlags MdbxAlldups :: MdbxPutFlags MdbxReserve :: MdbxPutFlags MdbxAppend :: MdbxPutFlags MdbxAppenddup :: MdbxPutFlags MdbxMultiple :: MdbxPutFlags -- | Flags for cursor operations. data MdbxCursorOp MdbxFirst :: MdbxCursorOp MdbxFirstDup :: MdbxCursorOp MdbxGetBoth :: MdbxCursorOp MdbxGetBothRange :: MdbxCursorOp MdbxGetCurrent :: MdbxCursorOp MdbxGetMultiple :: MdbxCursorOp MdbxLast :: MdbxCursorOp MdbxLastDup :: MdbxCursorOp MdbxNext :: MdbxCursorOp MdbxNextDup :: MdbxCursorOp MdbxNextMultiple :: MdbxCursorOp MdbxNextNodup :: MdbxCursorOp MdbxPrev :: MdbxCursorOp MdbxPrevDup :: MdbxCursorOp MdbxPrevNodup :: MdbxCursorOp MdbxSet :: MdbxCursorOp MdbxSetKey :: MdbxCursorOp MdbxSetRange :: MdbxCursorOp MdbxPrevMultiple :: MdbxCursorOp MdbxSetLowerbound :: MdbxCursorOp -- | Converts an instance to/from the representation needed by libmdbx. -- This type is used for both keys and values. -- -- Only the Text instance is provided, since it is commonly used -- as the key when storing/retrieving a value. -- -- For your own types, in general, you will want to use a serialization -- library such as store, cereal, etc, and apply the -- newtype deriving via trick. -- -- The Store instance can be defined as: -- --
--   newtype MdbxItemStore a = MdbxItemStore {
--     unwrapStore :: a
--   }
--   
--   instance Store a => MdbxItem (MdbxItemStore a) where
--     fromMdbxVal item = MdbxItemStore $ fromMdbxStore item
--     toMdbxVal item = withMdbxStore (unwrapStore item)
--   
--   fromMdbxStore :: Store v => MdbxVal -> IO v
--   fromMdbxStore (MdbxVal size ptr) = do
--     bs <- unsafePackCStringLen (castPtr ptr, fromIntegral size)
--     decodeIO bs
--   
--   withMdbxStore :: Store v => v -> (MdbxVal -> IO a) -> IO a
--   withMdbxStore val fn =
--     unsafeUseAsCStringLen bsV $ (ptrV, sizeV) -> do
--       let mval = MdbxVal (fromIntegral sizeV) (castPtr ptrV)
--       fn mval
--     where
--       bsV = encode val
--   
-- -- This code can be adaptad to other serialization libraries. It is not -- provided as part of libmdbx-hs itself to avoid forcing dependencies. -- -- Then, to derive the instance for your owwn type: -- --
--   data User = User {
--     _username :: Text,
--     _password :: Text
--   } deriving (Eq, Show, Generic, Store)
--   
--   deriving via (MdbxItemStore User) instance MdbxItem User
--   
-- -- Note: if you plan on using a custom type as the key, be careful if it -- contains Text or ByteString instances, since these types -- have a length field which is, in general, before the data. This causes -- issues when using cursors, since they depend on key ordering and the -- length field will make shorter instances lower than longer ones, even -- if the content indicates the opposite. In general, it is simpler to -- use Text as the key. class MdbxItem i -- | Converts a block of memory provided by libmdbx to a user data type. -- There are no guarantees provided by the library that the block of -- memory matches the expected type, and a crash can happen if not -- careful. fromMdbxVal :: MdbxItem i => MdbxVal -> IO i toMdbxVal :: MdbxItem i => i -> (MdbxVal -> IO b) -> IO b instance Mdbx.Types.MdbxItem Data.Text.Internal.Text -- | High level API to create, update, delete and query an MDBX database. module Mdbx.Database -- | Returns the value associated with the given key, if any. getItem :: (MonadIO m, MonadFail m, MdbxItem k, MdbxItem v) => MdbxEnv -> MdbxDbi -> k -> m (Maybe v) -- | Returns the values associated to a list of keys. Returned length may -- not match that of provided keys in case some of them are not found. getItems :: (MonadIO m, MonadFail m, MdbxItem k, MdbxItem v) => MdbxEnv -> MdbxDbi -> [k] -> m [v] -- | Returns the list of values whose keys lie between the provided range. getRange :: (MonadIO m, MonadFail m, MdbxItem k, MdbxItem v) => MdbxEnv -> MdbxDbi -> k -> k -> m [v] -- | Saves the given key/value pair. putItem :: (MonadIO m, MonadFail m, MdbxItem k, MdbxItem v) => MdbxEnv -> MdbxDbi -> k -> v -> m () -- | Saves the given key/value pairs. Runs in a single transaction. putItems :: (MonadIO m, MonadFail m, MdbxItem k, MdbxItem v) => MdbxEnv -> MdbxDbi -> [(k, v)] -> m () -- | Deletes the item associated with the given key, if any. delItem :: (MonadIO m, MonadFail m, MdbxItem k) => MdbxEnv -> MdbxDbi -> k -> m () -- | Deletes the items associated with the given keys, if any. Runs in a -- single transaction. delItems :: (MonadIO m, MonadFail m, MdbxItem k) => MdbxEnv -> MdbxDbi -> [k] -> m () -- | Main module for libmdbx-hs. This is what most applications should -- import. -- -- In case you only need to store, update and retrieve data, check the -- Mdbx.Database module. -- -- You will also want to check Mdbx.Types in order to be able to -- store your data types. In general, you will also want to use a -- serialization library such as store or cereal. -- -- If you want fine grained control or using cursors, check -- Mdbx.API. -- -- The Mdbx.FFI (not exported by this module) provides direct, low -- level, bindings to libmdbx. module Mdbx