{-# LANGUAGE MagicHash #-}
module Hmssql.Tds.Context
( TdsVersion (..)
, tdsVersionWord
, tdsVersionFromWord
, TransactionDescriptor (..)
, TdsContext (..)
, defaultTdsContext
, minPacketSize
, maxPacketSize
, clampPacketSize
) where
import qualified Data.ByteString as B
import Data.Word (Word32, Word64)
import Hmssql.Internal.Derived
data TdsVersion
= Tds74
| Tds80
deriving stock (TdsVersion -> TdsVersion -> Bool
(TdsVersion -> TdsVersion -> Bool)
-> (TdsVersion -> TdsVersion -> Bool) -> Eq TdsVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TdsVersion -> TdsVersion -> Bool
== :: TdsVersion -> TdsVersion -> Bool
$c/= :: TdsVersion -> TdsVersion -> Bool
/= :: TdsVersion -> TdsVersion -> Bool
Eq, Eq TdsVersion
Eq TdsVersion =>
(TdsVersion -> TdsVersion -> Ordering)
-> (TdsVersion -> TdsVersion -> Bool)
-> (TdsVersion -> TdsVersion -> Bool)
-> (TdsVersion -> TdsVersion -> Bool)
-> (TdsVersion -> TdsVersion -> Bool)
-> (TdsVersion -> TdsVersion -> TdsVersion)
-> (TdsVersion -> TdsVersion -> TdsVersion)
-> Ord TdsVersion
TdsVersion -> TdsVersion -> Bool
TdsVersion -> TdsVersion -> Ordering
TdsVersion -> TdsVersion -> TdsVersion
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
$ccompare :: TdsVersion -> TdsVersion -> Ordering
compare :: TdsVersion -> TdsVersion -> Ordering
$c< :: TdsVersion -> TdsVersion -> Bool
< :: TdsVersion -> TdsVersion -> Bool
$c<= :: TdsVersion -> TdsVersion -> Bool
<= :: TdsVersion -> TdsVersion -> Bool
$c> :: TdsVersion -> TdsVersion -> Bool
> :: TdsVersion -> TdsVersion -> Bool
$c>= :: TdsVersion -> TdsVersion -> Bool
>= :: TdsVersion -> TdsVersion -> Bool
$cmax :: TdsVersion -> TdsVersion -> TdsVersion
max :: TdsVersion -> TdsVersion -> TdsVersion
$cmin :: TdsVersion -> TdsVersion -> TdsVersion
min :: TdsVersion -> TdsVersion -> TdsVersion
Ord, Int -> TdsVersion -> ShowS
[TdsVersion] -> ShowS
TdsVersion -> String
(Int -> TdsVersion -> ShowS)
-> (TdsVersion -> String)
-> ([TdsVersion] -> ShowS)
-> Show TdsVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TdsVersion -> ShowS
showsPrec :: Int -> TdsVersion -> ShowS
$cshow :: TdsVersion -> String
show :: TdsVersion -> String
$cshowList :: [TdsVersion] -> ShowS
showList :: [TdsVersion] -> ShowS
Show, Int -> TdsVersion
TdsVersion -> Int
TdsVersion -> [TdsVersion]
TdsVersion -> TdsVersion
TdsVersion -> TdsVersion -> [TdsVersion]
TdsVersion -> TdsVersion -> TdsVersion -> [TdsVersion]
(TdsVersion -> TdsVersion)
-> (TdsVersion -> TdsVersion)
-> (Int -> TdsVersion)
-> (TdsVersion -> Int)
-> (TdsVersion -> [TdsVersion])
-> (TdsVersion -> TdsVersion -> [TdsVersion])
-> (TdsVersion -> TdsVersion -> [TdsVersion])
-> (TdsVersion -> TdsVersion -> TdsVersion -> [TdsVersion])
-> Enum TdsVersion
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: TdsVersion -> TdsVersion
succ :: TdsVersion -> TdsVersion
$cpred :: TdsVersion -> TdsVersion
pred :: TdsVersion -> TdsVersion
$ctoEnum :: Int -> TdsVersion
toEnum :: Int -> TdsVersion
$cfromEnum :: TdsVersion -> Int
fromEnum :: TdsVersion -> Int
$cenumFrom :: TdsVersion -> [TdsVersion]
enumFrom :: TdsVersion -> [TdsVersion]
$cenumFromThen :: TdsVersion -> TdsVersion -> [TdsVersion]
enumFromThen :: TdsVersion -> TdsVersion -> [TdsVersion]
$cenumFromTo :: TdsVersion -> TdsVersion -> [TdsVersion]
enumFromTo :: TdsVersion -> TdsVersion -> [TdsVersion]
$cenumFromThenTo :: TdsVersion -> TdsVersion -> TdsVersion -> [TdsVersion]
enumFromThenTo :: TdsVersion -> TdsVersion -> TdsVersion -> [TdsVersion]
Enum, TdsVersion
TdsVersion -> TdsVersion -> Bounded TdsVersion
forall a. a -> a -> Bounded a
$cminBound :: TdsVersion
minBound :: TdsVersion
$cmaxBound :: TdsVersion
maxBound :: TdsVersion
Bounded)
tdsVersionWord :: TdsVersion -> Word32
tdsVersionWord :: TdsVersion -> Word32
tdsVersionWord = \case
TdsVersion
Tds74 -> Word32
0x74000004
TdsVersion
Tds80 -> Word32
0x08000000
tdsVersionFromWord :: Word32 -> Maybe TdsVersion
tdsVersionFromWord :: Word32 -> Maybe TdsVersion
tdsVersionFromWord = \case
Word32
0x74000004 -> TdsVersion -> Maybe TdsVersion
forall a. a -> Maybe a
Just TdsVersion
Tds74
Word32
0x08000000 -> TdsVersion -> Maybe TdsVersion
forall a. a -> Maybe a
Just TdsVersion
Tds80
Word32
_ -> Maybe TdsVersion
forall a. Maybe a
Nothing
newtype TransactionDescriptor = TransactionDescriptor Word64
deriving newtype (TransactionDescriptor -> TransactionDescriptor -> Bool
(TransactionDescriptor -> TransactionDescriptor -> Bool)
-> (TransactionDescriptor -> TransactionDescriptor -> Bool)
-> Eq TransactionDescriptor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TransactionDescriptor -> TransactionDescriptor -> Bool
== :: TransactionDescriptor -> TransactionDescriptor -> Bool
$c/= :: TransactionDescriptor -> TransactionDescriptor -> Bool
/= :: TransactionDescriptor -> TransactionDescriptor -> Bool
Eq, Eq TransactionDescriptor
Eq TransactionDescriptor =>
(TransactionDescriptor -> TransactionDescriptor -> Ordering)
-> (TransactionDescriptor -> TransactionDescriptor -> Bool)
-> (TransactionDescriptor -> TransactionDescriptor -> Bool)
-> (TransactionDescriptor -> TransactionDescriptor -> Bool)
-> (TransactionDescriptor -> TransactionDescriptor -> Bool)
-> (TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor)
-> (TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor)
-> Ord TransactionDescriptor
TransactionDescriptor -> TransactionDescriptor -> Bool
TransactionDescriptor -> TransactionDescriptor -> Ordering
TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor
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
$ccompare :: TransactionDescriptor -> TransactionDescriptor -> Ordering
compare :: TransactionDescriptor -> TransactionDescriptor -> Ordering
$c< :: TransactionDescriptor -> TransactionDescriptor -> Bool
< :: TransactionDescriptor -> TransactionDescriptor -> Bool
$c<= :: TransactionDescriptor -> TransactionDescriptor -> Bool
<= :: TransactionDescriptor -> TransactionDescriptor -> Bool
$c> :: TransactionDescriptor -> TransactionDescriptor -> Bool
> :: TransactionDescriptor -> TransactionDescriptor -> Bool
$c>= :: TransactionDescriptor -> TransactionDescriptor -> Bool
>= :: TransactionDescriptor -> TransactionDescriptor -> Bool
$cmax :: TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor
max :: TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor
$cmin :: TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor
min :: TransactionDescriptor
-> TransactionDescriptor -> TransactionDescriptor
Ord)
instance Show TransactionDescriptor where
showsPrec :: Int -> TransactionDescriptor -> ShowS
showsPrec Int
p (TransactionDescriptor Word64
a) = Int -> Addr# -> Word64 -> ShowS
forall a. Show a => Int -> Addr# -> a -> ShowS
showCon1 Int
p Addr#
"TransactionDescriptor"# Word64
a
{-# OPAQUE showsPrec #-}
data TdsContext = TdsContext
{ TdsContext -> TdsVersion
tdsVersion :: !TdsVersion
, TdsContext -> Word32
tdsPacketSize :: !Word32
, TdsContext -> Maybe TransactionDescriptor
tdsTransaction :: !(Maybe TransactionDescriptor)
, TdsContext -> Bool
tdsUtf8Support :: !Bool
, TdsContext -> Maybe ByteString
tdsCollation :: !(Maybe B.ByteString)
}
instance Show TdsContext where
showsPrec :: Int -> TdsContext -> ShowS
showsPrec Int
p (TdsContext TdsVersion
a Word32
b Maybe TransactionDescriptor
c Bool
e Maybe ByteString
f) = Int -> Addr# -> [Field] -> ShowS
showRecord Int
p Addr#
"TdsContext"#
[ Addr#
"tdsVersion"# Addr# -> TdsVersion -> Field
forall a. Show a => Addr# -> a -> Field
:= TdsVersion
a, Addr#
"tdsPacketSize"# Addr# -> Word32 -> Field
forall a. Show a => Addr# -> a -> Field
:= Word32
b, Addr#
"tdsTransaction"# Addr# -> Maybe TransactionDescriptor -> Field
forall a. Show a => Addr# -> a -> Field
:= Maybe TransactionDescriptor
c
, Addr#
"tdsUtf8Support"# Addr# -> Bool -> Field
forall a. Show a => Addr# -> a -> Field
:= Bool
e, Addr#
"tdsCollation"# Addr# -> Maybe ByteString -> Field
forall a. Show a => Addr# -> a -> Field
:= Maybe ByteString
f
]
{-# OPAQUE showsPrec #-}
instance Eq TdsContext where
TdsContext TdsVersion
a Word32
b Maybe TransactionDescriptor
c Bool
e Maybe ByteString
f == :: TdsContext -> TdsContext -> Bool
== TdsContext TdsVersion
a' Word32
b' Maybe TransactionDescriptor
c' Bool
e' Maybe ByteString
f' =
TdsVersion -> TdsVersion -> Bool
forall a. Eq a => a -> a -> Bool
eq TdsVersion
a TdsVersion
a' Bool -> Bool -> Bool
&& Word32
b Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
b' Bool -> Bool -> Bool
&& Maybe TransactionDescriptor -> Maybe TransactionDescriptor -> Bool
forall a. Eq a => a -> a -> Bool
eq Maybe TransactionDescriptor
c Maybe TransactionDescriptor
c' Bool -> Bool -> Bool
&& Bool
e Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
e' Bool -> Bool -> Bool
&& Maybe ByteString -> Maybe ByteString -> Bool
forall a. Eq a => a -> a -> Bool
eq Maybe ByteString
f Maybe ByteString
f'
{-# OPAQUE (==) #-}
minPacketSize, maxPacketSize :: Word32
minPacketSize :: Word32
minPacketSize = Word32
512
maxPacketSize :: Word32
maxPacketSize = Word32
32767
clampPacketSize :: Word32 -> Word32
clampPacketSize :: Word32 -> Word32
clampPacketSize = Word32 -> Word32 -> Word32
forall a. Ord a => a -> a -> a
max Word32
minPacketSize (Word32 -> Word32) -> (Word32 -> Word32) -> Word32 -> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Word32 -> Word32
forall a. Ord a => a -> a -> a
min Word32
maxPacketSize
defaultTdsContext :: TdsContext
defaultTdsContext :: TdsContext
defaultTdsContext = TdsContext
{ tdsVersion :: TdsVersion
tdsVersion = TdsVersion
Tds74
, tdsPacketSize :: Word32
tdsPacketSize = Word32
4096
, tdsTransaction :: Maybe TransactionDescriptor
tdsTransaction = Maybe TransactionDescriptor
forall a. Maybe a
Nothing
, tdsUtf8Support :: Bool
tdsUtf8Support = Bool
False
, tdsCollation :: Maybe ByteString
tdsCollation = Maybe ByteString
forall a. Maybe a
Nothing
}