packages feed

memcached-binary-0.1.0: src/Database/Memcached/Binary/Common.hs

--------------------------------------------------------------------------------

get :: Key -> I.Connection -> IO (HasReturn (Flags, Value))
get = I.useConnection . I.get (\f v -> successHasReturn (f,v)) failureHasReturn

get_ :: Key -> I.Connection -> IO (HasReturn Value)
get_ = I.useConnection . I.get (\_ v -> successHasReturn v) failureHasReturn

--------------------------------------------------------------------------------

setAddReplace :: OpCode -> Flags -> Expiry
              -> Key -> Value -> I.Connection -> IO NoReturn
setAddReplace op = \f e key value -> I.useConnection $
    I.setAddReplace successNoReturn failureNoReturn op (CAS 0) key value f e


set :: Flags -> Expiry -> Key -> Value -> I.Connection -> IO NoReturn
set = setAddReplace opSet

add :: Flags -> Expiry -> Key -> Value -> I.Connection -> IO NoReturn
add = setAddReplace opAdd

replace :: Flags -> Expiry -> Key -> Value -> I.Connection -> IO NoReturn
replace = setAddReplace opReplace

--------------------------------------------------------------------------------

delete :: Key -> I.Connection -> IO NoReturn
delete = I.useConnection . I.delete successNoReturn failureNoReturn (CAS 0)

--------------------------------------------------------------------------------

-- | modify value in transaction.
modify :: Expiry -> Key -> (Flags -> Value -> (Flags, Value, a))
       -> I.Connection -> IO (HasReturn a)
modify e key fn = I.useConnection $ \h ->
    I.getWithCAS (\c f v -> 
        let (f', v', r) = fn f v
        in I.setAddReplaceWithCAS (const $ successHasReturn r)
            failureHasReturn opSet c key v' f' e h
    ) failureHasReturn key h

-- | modify value in transaction.
modify_ :: Expiry
        -> Key -> (Flags -> Value -> (Flags, Value))
        -> I.Connection -> IO NoReturn
modify_ e key fn = I.useConnection $ \h ->
    I.getWithCAS (\c f v -> 
        let (f', v') = fn f v
        in I.setAddReplaceWithCAS (const $ successNoReturn)
            failureNoReturn opSet c key v' f' e h
    ) failureNoReturn key h

--------------------------------------------------------------------------------

incrDecr :: OpCode -> Expiry
         -> Key -> Delta -> Initial -> I.Connection -> IO (HasReturn Counter)
incrDecr op e k d i = I.useConnection $
    I.incrDecr successHasReturn failureHasReturn op (CAS 0) k d i e

increment :: Expiry -> Key -> Delta -> Initial
          -> I.Connection -> IO (HasReturn Counter)
increment = incrDecr opIncrement

decrement :: Expiry -> Key -> Delta -> Initial
          -> I.Connection -> IO (HasReturn Counter)
decrement = incrDecr opDecrement

--------------------------------------------------------------------------------

-- | flush all value.
flushAll :: I.Connection -> IO NoReturn
flushAll = I.useConnection $ I.flushAll successNoReturn failureNoReturn

--------------------------------------------------------------------------------

version :: I.Connection -> IO (HasReturn Version)
version = I.useConnection $ I.version (\s -> case readVersion s of
    Nothing -> failureHasReturn (-1) "version parse failed"
    Just v  -> successHasReturn v) failureHasReturn
  where
    readVersion s0 = do
        (x, s1) <- S8.readInt s0
        when (S8.null s1) $ Nothing
        (y, s2) <- S8.readInt (S8.tail s1)
        when (S8.null s2) $ Nothing
        (z, s3) <- S8.readInt (S8.tail s2)
        unless (S8.null s3) $ Nothing
        return (Version [x,y,z] [])


-- | get version string.
versionString :: I.Connection -> IO (HasReturn S.ByteString)
versionString = I.useConnection $ I.version successHasReturn failureHasReturn

--------------------------------------------------------------------------------

-- | noop(use for keepalive).
noOp :: I.Connection -> IO NoReturn
noOp = I.useConnection $ I.noOp successNoReturn failureNoReturn

--------------------------------------------------------------------------------

appendPrepend :: OpCode -> Key -> Value -> I.Connection -> IO NoReturn
appendPrepend o = \k v -> I.useConnection $
    I.appendPrepend successNoReturn failureNoReturn o (CAS 0) k v

append :: Key -> Value -> I.Connection -> IO NoReturn
append  = appendPrepend opAppend

prepend :: Key -> Value -> I.Connection -> IO NoReturn
prepend = appendPrepend opPrepend

--------------------------------------------------------------------------------

-- | change expiry.
touch :: Expiry -> Key -> I.Connection -> IO NoReturn
touch e k = I.useConnection $
    I.touch (\_ _ -> successNoReturn) failureNoReturn opTouch k e

-- | get value/change expiry. 
getAndTouch :: Expiry -> Key -> I.Connection -> IO (HasReturn (Flags, Value))
getAndTouch e k = I.useConnection $
    I.touch (\f v -> successHasReturn (f,v)) failureHasReturn opGAT k e

-- | get value/change expiry. 
getAndTouch_ :: Expiry -> Key -> I.Connection -> IO (HasReturn Value)
getAndTouch_ e k = I.useConnection $
    I.touch (\_ v -> successHasReturn v) failureHasReturn opGAT k e