HandlerSocketClient 0.0.3 → 0.0.4
raw patch · 3 files changed
+34/−9 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Database.HandlerSocketClient: runReqFindN :: Integral a => HandSock -> String -> [String] -> a -> IO [[[String]]]
Files
- Database/HandlerSocketClient.hs +31/−8
- HandlerSocketClient.cabal +1/−1
- README +2/−0
Database/HandlerSocketClient.hs view
@@ -23,6 +23,7 @@ -- * Do Special Request runReqOpen, runReqFind,+ runReqFindN, runReqInsert, runReqUpdate, runReqDelete@@ -54,7 +55,20 @@ if B.elem 10 s1 then return s1 else fmap (B.append s1) $ recvOneR sock maxlen+recvN :: Socket -> Int -> Int -> IO [B.ByteString]+recvN sock maxlen count = do+ all <- recvNR sock maxlen count+ return $ init $ B.split 10 all +recvNR :: Socket -> Int -> Int -> IO B.ByteString+recvNR sock maxlen todo+ | todo <= 0 = return B.empty+ | otherwise = do+ s1 <- recv sock maxlen+ if B.null s1+ then return s1+ else fmap (B.append s1) $ recvNR sock maxlen $ todo - (B.count 10 s1)+ escapeW :: [Word8] -> [Word8] escapeW [] = [] escapeW (x:xs) = if x < 16 then 1:(0x40+x):(escapeW xs) else x:(escapeW xs)@@ -137,20 +151,29 @@ runReqOpen :: HandSock -> String -> String -> String -> String -> IO Bool runReqOpen hs db tb ind cs = runReqBool hs $ makeReqOpen db tb ind cs +mygroup :: Int -> [a] -> [[a]]+mygroup _ [] = []+mygroup i xs = l:(mygroup i r) + where (l,r) = splitAt i xs++splitFindResult :: [String] -> [[String]]+splitFindResult ss =+ case ss of+ ("0":i:xs) -> mygroup (read i) xs+ _ -> []+ -- | Do \'find\' request. Returns at most lim results. runReqFind :: (Integral a) => HandSock -> String -> String -> a -> IO [[String]] runReqFind hs op v lim = do let req = makeReqFind op v lim sendAll (getSocket hs) req- resp <- fmap decodeResp $ recvOne (getSocket hs) 4096- case resp of- (o:i:xs) -> return $ mygroup (read i :: Int) xs- _ -> return []- where- mygroup _ [] = []- mygroup i xs = l:(mygroup i r) - where (l,r) = splitAt i xs+ fmap (splitFindResult . decodeResp) $ recvOne (getSocket hs) 4096 +runReqFindN :: (Integral a) => HandSock -> String -> [String] -> a -> IO [[[String]]]+runReqFindN hs op vs lim = do+ mapM_ (\v -> let req = makeReqFind op v lim in sendAll (getSocket hs) req) vs+ map (splitFindResult . decodeResp) `fmap` recvN (getSocket hs) 4096 (length vs)+ -- | Do \'insert\' request, insert one record at a time. runReqInsert :: HandSock -> [String] -> IO Bool runReqInsert hs vs = runReqBool hs $ makeReqInsert vs
HandlerSocketClient.cabal view
@@ -1,5 +1,5 @@ Name: HandlerSocketClient-Version: 0.0.3+Version: 0.0.4 Synopsis: Haskell implementation of a HandlerSocket client (API). Description: This package implemets API for a HandlerSocket client. homepage: https://github.com/wuxb45/HandlerSocket-Haskell-Client
README view
@@ -30,5 +30,7 @@ putStrLn $ show r5 r6 <- runReqGeneric hs ["0","+","2","555","999"] putStrLn $ show r6+ r7 <- runReqFindN hs "=" ["1","2","3","4"] 1+ putStrLn $ show r7