{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Mdbx.Types (
MdbxEnv,
MdbxTxn,
MdbxDbi,
MdbxVal(..),
MdbxEnvMode(..),
MdbxEnvFlags(..),
MdbxTxnFlags(..),
MdbxDbFlags(..),
MdbxPutFlags(..),
MdbxCursorOp(..),
MdbxEnvGeometry(..),
MdbxItem(..),
NullByteString(..),
NullText(..)
) where
import Data.ByteString (ByteString, packCStringLen, useAsCStringLen)
import Data.ByteString.Short (ShortByteString)
import Data.Default
import Data.String (IsString(..))
import Data.Text (Text)
import Data.Text.Foreign (fromPtr, useAsPtr)
import Foreign.Ptr (castPtr)
import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString.Short as BSH
import qualified Data.Text as T
import Mdbx.FFI
data MdbxEnvGeometry = MdbxEnvGeometry {
MdbxEnvGeometry -> Int
envSizeMin :: Int,
MdbxEnvGeometry -> Int
envSizeNow :: Int,
MdbxEnvGeometry -> Int
envSizeMax :: Int,
MdbxEnvGeometry -> Int
envGrowthStep :: Int,
MdbxEnvGeometry -> Int
envShrinkThreshold :: Int,
MdbxEnvGeometry -> Int
envPageSize :: Int
} deriving (MdbxEnvGeometry -> MdbxEnvGeometry -> Bool
(MdbxEnvGeometry -> MdbxEnvGeometry -> Bool)
-> (MdbxEnvGeometry -> MdbxEnvGeometry -> Bool)
-> Eq MdbxEnvGeometry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MdbxEnvGeometry -> MdbxEnvGeometry -> Bool
$c/= :: MdbxEnvGeometry -> MdbxEnvGeometry -> Bool
== :: MdbxEnvGeometry -> MdbxEnvGeometry -> Bool
$c== :: MdbxEnvGeometry -> MdbxEnvGeometry -> Bool
Eq, Int -> MdbxEnvGeometry -> ShowS
[MdbxEnvGeometry] -> ShowS
MdbxEnvGeometry -> String
(Int -> MdbxEnvGeometry -> ShowS)
-> (MdbxEnvGeometry -> String)
-> ([MdbxEnvGeometry] -> ShowS)
-> Show MdbxEnvGeometry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MdbxEnvGeometry] -> ShowS
$cshowList :: [MdbxEnvGeometry] -> ShowS
show :: MdbxEnvGeometry -> String
$cshow :: MdbxEnvGeometry -> String
showsPrec :: Int -> MdbxEnvGeometry -> ShowS
$cshowsPrec :: Int -> MdbxEnvGeometry -> ShowS
Show)
instance Default MdbxEnvGeometry where
def :: MdbxEnvGeometry
def = MdbxEnvGeometry :: Int -> Int -> Int -> Int -> Int -> Int -> MdbxEnvGeometry
MdbxEnvGeometry {
envSizeMin :: Int
envSizeMin = -Int
1,
envSizeNow :: Int
envSizeNow = -Int
1,
envSizeMax :: Int
envSizeMax = Int
1024 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
1024 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
1024,
envGrowthStep :: Int
envGrowthStep = -Int
1,
envShrinkThreshold :: Int
envShrinkThreshold = -Int
1,
envPageSize :: Int
envPageSize = -Int
1
}
class MdbxItem i where
fromMdbxVal :: MdbxVal -> IO i
toMdbxVal :: i -> (MdbxVal -> IO b) -> IO b
instance MdbxItem Text where
fromMdbxVal :: MdbxVal -> IO Text
fromMdbxVal (MdbxVal CULong
sz Ptr ()
ptr) =
Ptr Word16 -> I16 -> IO Text
fromPtr (Ptr () -> Ptr Word16
forall a b. Ptr a -> Ptr b
castPtr Ptr ()
ptr) (CULong -> I16
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
sz I16 -> I16 -> I16
forall a. Integral a => a -> a -> a
`div` I16
2)
toMdbxVal :: Text -> (MdbxVal -> IO b) -> IO b
toMdbxVal Text
val MdbxVal -> IO b
fn = Text -> (Ptr Word16 -> I16 -> IO b) -> IO b
forall a. Text -> (Ptr Word16 -> I16 -> IO a) -> IO a
useAsPtr Text
val ((Ptr Word16 -> I16 -> IO b) -> IO b)
-> (Ptr Word16 -> I16 -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr Word16
ptr I16
size ->
MdbxVal -> IO b
fn (MdbxVal -> IO b) -> MdbxVal -> IO b
forall a b. (a -> b) -> a -> b
$ CULong -> Ptr () -> MdbxVal
MdbxVal (I16 -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral I16
size CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
* CULong
2) (Ptr Word16 -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr Word16
ptr)
instance MdbxItem ByteString where
fromMdbxVal :: MdbxVal -> IO ByteString
fromMdbxVal (MdbxVal CULong
sz Ptr ()
ptr) =
CStringLen -> IO ByteString
packCStringLen (Ptr () -> Ptr CChar
forall a b. Ptr a -> Ptr b
castPtr Ptr ()
ptr, CULong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
sz)
toMdbxVal :: ByteString -> (MdbxVal -> IO b) -> IO b
toMdbxVal ByteString
val MdbxVal -> IO b
fn = ByteString -> (CStringLen -> IO b) -> IO b
forall a. ByteString -> (CStringLen -> IO a) -> IO a
useAsCStringLen ByteString
val ((CStringLen -> IO b) -> IO b) -> (CStringLen -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \(Ptr CChar
ptr, Int
size) ->
MdbxVal -> IO b
fn (MdbxVal -> IO b) -> MdbxVal -> IO b
forall a b. (a -> b) -> a -> b
$ CULong -> Ptr () -> MdbxVal
MdbxVal (Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
size) (Ptr CChar -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CChar
ptr)
newtype NullByteString = NullByteString {
NullByteString -> ShortByteString
unNullByteString :: ShortByteString
} deriving newtype (NullByteString -> NullByteString -> Bool
(NullByteString -> NullByteString -> Bool)
-> (NullByteString -> NullByteString -> Bool) -> Eq NullByteString
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NullByteString -> NullByteString -> Bool
$c/= :: NullByteString -> NullByteString -> Bool
== :: NullByteString -> NullByteString -> Bool
$c== :: NullByteString -> NullByteString -> Bool
Eq, Eq NullByteString
Eq NullByteString
-> (NullByteString -> NullByteString -> Ordering)
-> (NullByteString -> NullByteString -> Bool)
-> (NullByteString -> NullByteString -> Bool)
-> (NullByteString -> NullByteString -> Bool)
-> (NullByteString -> NullByteString -> Bool)
-> (NullByteString -> NullByteString -> NullByteString)
-> (NullByteString -> NullByteString -> NullByteString)
-> Ord NullByteString
NullByteString -> NullByteString -> Bool
NullByteString -> NullByteString -> Ordering
NullByteString -> NullByteString -> NullByteString
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NullByteString -> NullByteString -> NullByteString
$cmin :: NullByteString -> NullByteString -> NullByteString
max :: NullByteString -> NullByteString -> NullByteString
$cmax :: NullByteString -> NullByteString -> NullByteString
>= :: NullByteString -> NullByteString -> Bool
$c>= :: NullByteString -> NullByteString -> Bool
> :: NullByteString -> NullByteString -> Bool
$c> :: NullByteString -> NullByteString -> Bool
<= :: NullByteString -> NullByteString -> Bool
$c<= :: NullByteString -> NullByteString -> Bool
< :: NullByteString -> NullByteString -> Bool
$c< :: NullByteString -> NullByteString -> Bool
compare :: NullByteString -> NullByteString -> Ordering
$ccompare :: NullByteString -> NullByteString -> Ordering
$cp1Ord :: Eq NullByteString
Ord)
instance Show NullByteString where
show :: NullByteString -> String
show (NullByteString ShortByteString
nbs) = ByteString -> String
BC.unpack (ShortByteString -> ByteString
BSH.fromShort ShortByteString
nbs)
instance IsString NullByteString where
fromString :: String -> NullByteString
fromString = ShortByteString -> NullByteString
NullByteString (ShortByteString -> NullByteString)
-> (String -> ShortByteString) -> String -> NullByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ShortByteString
BSH.toShort (ByteString -> ShortByteString)
-> (String -> ByteString) -> String -> ShortByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BC.pack
newtype NullText = NullText {
NullText -> Text
unNullText :: Text
} deriving newtype (NullText -> NullText -> Bool
(NullText -> NullText -> Bool)
-> (NullText -> NullText -> Bool) -> Eq NullText
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NullText -> NullText -> Bool
$c/= :: NullText -> NullText -> Bool
== :: NullText -> NullText -> Bool
$c== :: NullText -> NullText -> Bool
Eq, Eq NullText
Eq NullText
-> (NullText -> NullText -> Ordering)
-> (NullText -> NullText -> Bool)
-> (NullText -> NullText -> Bool)
-> (NullText -> NullText -> Bool)
-> (NullText -> NullText -> Bool)
-> (NullText -> NullText -> NullText)
-> (NullText -> NullText -> NullText)
-> Ord NullText
NullText -> NullText -> Bool
NullText -> NullText -> Ordering
NullText -> NullText -> NullText
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NullText -> NullText -> NullText
$cmin :: NullText -> NullText -> NullText
max :: NullText -> NullText -> NullText
$cmax :: NullText -> NullText -> NullText
>= :: NullText -> NullText -> Bool
$c>= :: NullText -> NullText -> Bool
> :: NullText -> NullText -> Bool
$c> :: NullText -> NullText -> Bool
<= :: NullText -> NullText -> Bool
$c<= :: NullText -> NullText -> Bool
< :: NullText -> NullText -> Bool
$c< :: NullText -> NullText -> Bool
compare :: NullText -> NullText -> Ordering
$ccompare :: NullText -> NullText -> Ordering
$cp1Ord :: Eq NullText
Ord)
instance Show NullText where
show :: NullText -> String
show (NullText Text
nts) = Text -> String
T.unpack Text
nts
instance IsString NullText where
fromString :: String -> NullText
fromString = Text -> NullText
NullText (Text -> NullText) -> (String -> Text) -> String -> NullText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack