basex-client 0.1.0.0 → 0.2.0.0
raw patch · 10 files changed
+65/−61 lines, 10 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- BaseXClient.Query: ident :: Query -> String
- BaseXClient.Query: instance Show Query
- BaseXClient.Query: session :: Query -> Handle
- BaseXClient.Session: content :: Result -> String
- BaseXClient.Session: info :: Result -> String
- BaseXClient.Session: instance Show Result
+ BaseXClient.Query: [ident] :: Query -> String
+ BaseXClient.Query: [session] :: Query -> Handle
+ BaseXClient.Query: instance GHC.Show.Show BaseXClient.Query.Query
+ BaseXClient.Session: [content] :: Result -> String
+ BaseXClient.Session: [info] :: Result -> String
+ BaseXClient.Session: instance GHC.Show.Show BaseXClient.Session.Result
- BaseXClient.Query: bind :: Query -> String -> String -> String -> IO String
+ BaseXClient.Query: bind :: String -> String -> String -> Query -> IO String
- BaseXClient.Query: context :: Query -> String -> String -> IO String
+ BaseXClient.Query: context :: String -> String -> Query -> IO String
- BaseXClient.Query: exec :: Query -> Int -> [String] -> IO String
+ BaseXClient.Query: exec :: Int -> [String] -> Query -> IO String
- BaseXClient.Session: add :: Handle -> String -> String -> IO String
+ BaseXClient.Session: add :: String -> String -> Handle -> IO String
- BaseXClient.Session: create :: Handle -> String -> String -> IO String
+ BaseXClient.Session: create :: String -> String -> Handle -> IO String
- BaseXClient.Session: execute :: Handle -> String -> IO Result
+ BaseXClient.Session: execute :: String -> Handle -> IO Result
- BaseXClient.Session: query :: Handle -> String -> IO Query
+ BaseXClient.Session: query :: String -> Handle -> IO Query
- BaseXClient.Session: replace :: Handle -> String -> String -> IO String
+ BaseXClient.Session: replace :: String -> String -> Handle -> IO String
- BaseXClient.Session: sendInput :: Int -> Handle -> String -> String -> IO String
+ BaseXClient.Session: sendInput :: Int -> String -> String -> Handle -> IO String
- BaseXClient.Session: store :: Handle -> String -> String -> IO String
+ BaseXClient.Session: store :: String -> String -> Handle -> IO String
- BaseXClient.Utils: exec :: Handle -> Int -> [String] -> IO String
+ BaseXClient.Utils: exec :: Int -> [String] -> Handle -> IO String
Files
- basex-client.cabal +1/−1
- src/AddExample.hs +5/−5
- src/BaseXClient.hs +4/−4
- src/BaseXClient/Query.hs +16/−17
- src/BaseXClient/Session.hs +23/−22
- src/BaseXClient/Utils.hs +6/−4
- src/CreateExample.hs +3/−3
- src/Example.hs +3/−2
- src/QueryBindExample.hs +1/−1
- src/QueryExample.hs +3/−2
basex-client.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: basex-client-version: 0.1.0.0+version: 0.2.0.0 synopsis: A BaseX client for Haskell description: A BaseX client library for Haskell that connects to the BaseX server using a socket. BaseX is a light-weight, high-performance and scalable XML Database written in Java. license: MIT
src/AddExample.hs view
@@ -4,8 +4,8 @@ main :: IO () main = withSession "localhost" 1984 "admin" "admin" $ \session -> do- execute session "create db database" >>= print- add session "world/World.xml" "<x>Hello World!</x>" >>= print- add session "Universe.xml" "<x>Hello Universe!</x>" >>= print- execute session "xquery /" >>= print- execute session "drop db database" >>= print+ execute "create db database" session >>= print+ add "world/World.xml" "<x>Hello World!</x>" session >>= print+ add "Universe.xml" "<x>Hello Universe!</x>" session >>= print+ execute "xquery /" session >>= print+ execute "drop db database" session >>= print
src/BaseXClient.hs view
@@ -4,19 +4,19 @@ module BaseXClient.Session ) where -import qualified BaseXClient.Query as Query import BaseXClient.Query hiding (info, execute, close, sendCode, exec)+import qualified BaseXClient.Query as Query import BaseXClient.Session hiding (sendInput) import Control.Exception import Network import System.IO executeQuery = Query.execute-closeQuery = Query.close-queryInfo = Query.info+closeQuery = Query.close+queryInfo = Query.info withSession :: String -> PortNumber -> String -> String -> (Handle -> IO a) -> IO a withSession host port user pass = bracket (connect host port user pass) close withQuery :: Handle -> String -> (Query -> IO a) -> IO a-withQuery session q = bracket (query session q) closeQuery+withQuery session q = bracket (query q session) closeQuery
src/BaseXClient/Query.hs view
@@ -6,20 +6,19 @@ import Control.Applicative import System.IO -data Query = Query {- session :: Handle,- ident :: String- }- deriving Show+data Query = Query+ { session :: Handle+ , ident :: String+ } deriving Show -bind :: Query -> String -> String -> String -> IO String-bind query name val ty = exec query 3 [name, val, ty]+bind :: String -> String -> String -> Query -> IO String+bind name val ty = exec 3 [name, val, ty] -context :: Query -> String -> String -> IO String-context query val ty = exec query 14 [val, ty]+context :: String -> String -> Query -> IO String+context val ty = exec 14 [val, ty] results :: Query -> IO [String]-results Query{session, ident} = do+results Query { session, ident } = do writeCode session 4 writeString session ident result <- untilM (ok session) (readString session)@@ -28,14 +27,14 @@ else readString session >>= error execute, info, options, updating, close :: Query -> IO String-execute = sendCode 5-info = sendCode 6-options = sendCode 7+execute = sendCode 5+info = sendCode 6+options = sendCode 7 updating = sendCode 30-close = sendCode 2+close = sendCode 2 sendCode :: Int -> Query -> IO String-sendCode code query = exec query code []+sendCode code = exec code [] -exec :: Query -> Int -> [String] -> IO String-exec Query{session, ident} code strs = Utils.exec session code $ ident : strs+exec :: Int -> [String] -> Query -> IO String+exec code args Query { session, ident } = Utils.exec code (ident : args) session
src/BaseXClient/Session.hs view
@@ -1,25 +1,25 @@ {-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE LambdaCase #-} module BaseXClient.Session where -import BaseXClient.Utils import BaseXClient.Query (Query(..))+import BaseXClient.Utils import Control.Applicative-import qualified Data.Digest.Pure.MD5 as MD5+import Control.Exception import Data.ByteString.Lazy.UTF8 (fromString)+import qualified Data.Digest.Pure.MD5 as MD5 import Data.List import Network import System.IO -data Result = Result {- content :: String,- info :: String- }- deriving Show+data Result = Result+ { content :: String+ , info :: String+ } deriving Show connect :: String -> PortNumber -> String -> String -> IO Handle connect host port user pass = do session <- connectTo host $ PortNumber port+ hSetEncoding session utf8 hSetBuffering session $ BlockBuffering $ Just 4096 resp <- readString session let (code, nonce) = case elemIndex ':' resp of@@ -32,28 +32,29 @@ else error "Access denied." where md5 = show . MD5.md5 . fromString -execute :: Handle -> String -> IO Result-execute session cmd = do+execute :: String -> Handle -> IO Result+execute cmd session = do writeString session cmd content <- readString session info <- readString session- ok session <$$> \b -> if b- then Result{content, info}+ result <- ok session <$$> \b -> if b+ then Result { content, info } else error info+ evaluate result -query :: Handle -> String -> IO Query-query session q = do- ident <- exec session 0 [q]- return $ Query session ident+query :: String -> Handle -> IO Query+query q session = do+ ident <- exec 0 [q] session+ return Query { session, ident } -create, add, replace, store :: Handle -> String -> String -> IO String-create = sendInput 8-add = sendInput 9+create, add, replace, store :: String -> String -> Handle -> IO String+create = sendInput 8+add = sendInput 9 replace = sendInput 12-store = sendInput 13+store = sendInput 13 -sendInput :: Int -> Handle -> String -> String -> IO String-sendInput code session arg input = exec session code [arg, input]+sendInput :: Int -> String -> String -> Handle -> IO String+sendInput code arg input = exec code [arg, input] close :: Handle -> IO () close session = do
src/BaseXClient/Utils.hs view
@@ -1,17 +1,19 @@ module BaseXClient.Utils where import Control.Applicative+import Control.Exception import Data.Char import System.IO -exec :: Handle -> Int -> [String] -> IO String-exec h code strs = do+exec :: Int -> [String] -> Handle -> IO String+exec code args h = do writeCode h code- writeStrings h strs+ writeStrings h args info <- readString h- ok h <$$> \b -> if b+ result <- ok h <$$> \b -> if b then info else error info+ evaluate result readString :: Handle -> IO String readString h = do
src/CreateExample.hs view
@@ -6,6 +6,6 @@ main :: IO () main = withSession "localhost" 1984 "admin" "admin" $ \session -> do- create session "database" "<x>Hello World!</x>" >>= print- execute session "xquery /" >>= print- execute session "drop db database" >>= print+ create "database" "<x>Hello World!</x>" session >>= print+ execute "xquery /" session >>= print+ execute "drop db database" session >>= print
src/Example.hs view
@@ -1,14 +1,15 @@ module Example where import BaseXClient+import Control.Monad import System.CPUTime import Text.Printf main :: IO () main = do start <- getCPUTime- withSession "localhost" 1984 "admin" "admin" $ \session ->- execute session "xquery 1 to 10" >>= print+ withSession "localhost" 1984 "admin" "admin"+ $ execute "xquery 1 to 10" >=> print end <- getCPUTime let diff = fromIntegral (end - start) / (10 ^ 12) printf "Computation time: %0.3f sec\n" (diff :: Double)
src/QueryBindExample.hs view
@@ -8,5 +8,5 @@ main :: IO () main = withSession "localhost" 1984 "admin" "admin" $ \session -> withQuery session query $ \q -> do- bind q "name" "number" ""+ bind "name" "number" "" q executeQuery q >>= print
src/QueryExample.hs view
@@ -1,8 +1,9 @@ module QueryExample where import BaseXClient+import Control.Monad main :: IO () main = withSession "localhost" 1984 "admin" "admin" $ \session ->- withQuery session "for $i in 1 to 10 return <xml>Text { $i }</xml>" $ \q ->- results q >>= print+ withQuery session "for $i in 1 to 10 return <xml>Text { $i }</xml>"+ $ results >=> print