module Lmdb.Types where
import Database.LMDB.Raw
import Foreign.C.Types (CSize(..),CInt)
import Foreign.Ptr (Ptr,FunPtr)
import Data.Word
import Data.Primitive.ByteArray (ByteArray)
import qualified Data.Vector.Unboxed as UVector
import qualified Data.Vector.Primitive as PVector
data Mode = ReadOnly | ReadWrite
class ModeBool (x :: Mode) where
modeIsReadOnly :: proxy x -> Bool
instance ModeBool 'ReadOnly where
modeIsReadOnly _ = True
instance ModeBool 'ReadWrite where
modeIsReadOnly _ = False
newtype Environment (x :: Mode) = Environment
{ getEnvironment :: MDB_env
}
newtype Transaction (t :: Mode) = Transaction
{ getTransaction :: MDB_txn
}
data Cursor (t :: Mode) k v = Cursor
{ cursorRef :: !CursorByFfi
, cursorDatabaseSettings :: !(DatabaseSettings k v)
}
data MultiCursor (t :: Mode) k v = MultiCursor
{ multiCursorRef :: !CursorByFfi
, multiCursorDatabaseSettings :: !(MultiDatabaseSettings k v)
}
data KeyValue k v = KeyValue
{ keyValueKey :: !k
, keyValueValue :: !v
}
data CursorByFfi
= CursorSafe !MDB_cursor
| CursorUnsafe !MDB_cursor'
data DbiByFfi
= DbiSafe !MDB_dbi
| DbiUnsafe !MDB_dbi'
data Database k v = Database
{ databaseRef :: !DbiByFfi
, databaseTheSettings :: !(DatabaseSettings k v)
}
data MultiDatabase k v = MultiDatabase
{ multiDatabaseRef :: DbiByFfi
, multiDatabaseTheSettings :: !(MultiDatabaseSettings k v)
}
data DatabaseSettings k v = forall ks vs. DatabaseSettings
{ databaseSettingsSort :: !(Sort ks k)
, databaseSettingsEncodeKey :: !(Encoding ks k)
, databaseSettingsDecodeKey :: !(Decoding k)
, databaseSettingsEncodeValue :: !(Encoding vs v)
, databaseSettingsDecodeValue :: !(Decoding v)
}
data MultiDatabaseSettings k v = forall ks vs. MultiDatabaseSettings
{ multiDatabaseSettingsSortKey :: Sort ks k
, multiDatabaseSettingsSortValue :: Sort vs v
, multiDatabaseSettingsEncodeKey :: !(Encoding ks k)
, multiDatabaseSettingsDecodeKey :: !(Decoding k)
, multiDatabaseSettingsEncodeValue :: !(Encoding vs v)
, multiDatabaseSettingsDecodeValue :: !(Decoding v)
}
data Codec s a = Codec
{ codecEncode :: !(Encoding s a)
, codecDecode :: !(Decoding a)
}
newtype Decoding a = Decoding { getDecoding :: CSize -> Ptr Word8 -> IO a }
data Encoding (s :: Size) a where
EncodingVariable :: (a -> SizedPoke) -> Encoding 'Variable a
EncodingFixed :: CSize -> (a -> FixedPoke) -> Encoding 'Fixed a
EncodingMachineWord :: (a -> FixedPoke) -> Encoding 'MachineWord a
data SizedPoke = SizedPoke
{ sizedPokeSize :: !CSize
, sizedPokePoke :: !(Ptr Word8 -> IO ())
}
newtype FixedPoke = FixedPoke { getFixedPoke :: Ptr Word8 -> IO () }
data Size
= Variable
| Fixed
| MachineWord
data NativeSort (s :: Size) where
NativeSortLexographic :: NativeSort 'Variable
NativeSortLexographicBackward :: NativeSort 'Variable
NativeSortInteger :: NativeSort 'MachineWord
data CustomSort a
= CustomSortSafe (a -> a -> Ordering)
| CustomSortUnsafe (FunPtr (Ptr MDB_val -> Ptr MDB_val -> IO CInt))
data Sort (s :: Size) a where
SortNative :: NativeSort s -> Sort s a
SortCustom :: CustomSort a -> Sort 'Variable a
data Movement k
= MovementNext
| MovementPrev
| MovementFirst
| MovementLast
| MovementAt !k
| MovementAtGte !k
| MovementCurrent