memcache-0.2.0.0: Database/Memcache/Types.hs
{-|
Module : Database.Memcache.Types
Description : Memcached Types
Copyright : (c) David Terei, 2016
License : BSD
Maintainer : code@davidterei.com
Stability : stable
Portability : GHC
Stores the various types needed by Memcached. Mostly concerned with the
representation of the protocol.
-}
module Database.Memcache.Types (
-- * SASL Authentication
Authentication(..), Username, Password,
-- * Fields & Values
Q(..), K(..), Key, Value, Extras, Initial, Delta, Expiration, Flags,
Version, Status(..),
-- * Header
Header(..), mEMCACHE_HEADER_SIZE, PktType(..),
-- * Requests
Request(..), OpRequest(..), SESet(..), SEIncr(..), SETouch(..), emptyReq,
-- * Responses
Response(..), OpResponse(..), emptyRes
) where
import Data.ByteString (ByteString)
import Data.Word
-- | SASL Authentication information for a server.
data Authentication
= Auth { username :: !Username, password :: !Password }
| NoAuth
deriving (Eq, Show)
-- | Username for authentication.
type Username = ByteString
-- | Password for authentication.
type Password = ByteString
{- MEMCACHED MESSAGE:
header {
magic :: Word8
op :: Word8
keyLen :: Word16
extraLen :: Word8
datatype :: Word8
status / reserved :: Word16
bodyLen :: Word32 (total body length)
opaque :: Word32
cas :: Word64
}
extras :: ByteString
key :: ByteString
value :: ByteString
-}
mEMCACHE_HEADER_SIZE :: Int
mEMCACHE_HEADER_SIZE = 24
-- | Memcached packet header (for both 'Request' and 'Response').
data Header = Header {
op :: Word8,
keyLen :: Word16,
extraLen :: Word8,
status :: Status,
bodyLen :: Word32,
opaque :: Word32,
cas :: Version
} deriving (Eq, Show)
data PktType = PktRequest | PktResponse
deriving (Eq, Show)
data Q = Loud | Quiet deriving (Eq, Show)
data K = NoKey | IncludeKey deriving (Eq, Show)
type Key = ByteString
type Value = ByteString
type Extras = ByteString
type Initial = Word64
type Delta = Word64
type Expiration = Word32
type Flags = Word32
type Version = Word64
data OpRequest
= ReqGet Q K Key
| ReqSet Q Key Value SESet
| ReqAdd Q Key Value SESet
| ReqReplace Q Key Value SESet
| ReqDelete Q Key
| ReqIncrement Q Key SEIncr
| ReqDecrement Q Key SEIncr
| ReqAppend Q Key Value
| ReqPrepend Q Key Value
| ReqTouch Key SETouch
| ReqGAT Q K Key SETouch
| ReqFlush Q (Maybe SETouch)
| ReqNoop
| ReqVersion
| ReqStat (Maybe Key)
| ReqQuit Q
| ReqSASLList
| ReqSASLStart Key Value -- key: auth method, value: auth data
| ReqSASLStep Key Value -- key: auth method, value: auth data (continued)
deriving (Eq, Show)
data SESet = SESet Flags Expiration deriving (Eq, Show)
data SEIncr = SEIncr Initial Delta Expiration deriving (Eq, Show)
data SETouch = SETouch Expiration deriving (Eq, Show)
data Request = Req {
reqOp :: OpRequest,
reqOpaque :: Word32,
reqCas :: Version
} deriving (Eq, Show)
-- | Noop request.
emptyReq :: Request
emptyReq = Req { reqOp = ReqNoop, reqOpaque = 0, reqCas = 0 }
data OpResponse
= ResGet Q Value Flags
| ResGetK Q Key Value Flags
| ResSet Q
| ResAdd Q
| ResReplace Q
| ResDelete Q
| ResIncrement Q Word64
| ResDecrement Q Word64
| ResAppend Q
| ResPrepend Q
| ResTouch
| ResGAT Q Value Flags
| ResGATK Q Key Value Flags
| ResFlush Q
| ResNoop
| ResVersion Value
| ResStat Key Value
| ResQuit Q
| ResSASLList Value
| ResSASLStart
| ResSASLStep
deriving (Eq, Show)
-- | The status (success or error) of a Memcached operation returned in a
-- 'Response'.
data Status
-- | Operation successful.
= NoError -- All
-- | Key not found.
| ErrKeyNotFound -- Get, GAT, Touch, Replace, Del, Inc, Dec, App, Pre, Set (key not there and version specified...)
-- | Key exists when not expected.
| ErrKeyExists -- Add, (version): Set, Rep, Del, Inc, Dec, App, Pre
-- | Value too large to store at server.
| ErrValueTooLarge -- Set, Add, Rep, Pre, App
-- | Invalid arguments for operation.
| ErrInvalidArgs -- All
-- | Key-Value pair not stored at server (internal error).
| ErrItemNotStored -- ?
-- | Value not numeric when increment or decrement requested.
| ErrValueNonNumeric -- Incr, Decr
-- | Server doesn't know requested command.
| ErrUnknownCommand -- All
-- | Server out of memory.
| ErrOutOfMemory -- All
-- | SASL authentication failed.
| SaslAuthFail -- SASL
-- | SASL authentication requires more steps.
| SaslAuthContinue -- SASL
deriving (Eq, Show)
-- | Memcached response packet.
data Response = Res {
resOp :: OpResponse,
resStatus :: Status,
resOpaque :: Word32,
resCas :: Version
} deriving (Eq, Show)
-- | Noop response.
emptyRes :: Response
emptyRes = Res { resOp = ResNoop, resStatus = NoError, resOpaque = 0, resCas = 0 }