bolt 0.2.2.0 → 0.3.0.1
raw patch · 7 files changed
+63/−31 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Database.Bolt.Types: object :: (Eq k, Hashable k) => [(k, v)] -> HashMap k v
+ Database.Bolt.Types: type Object = HashMap Text PackStream
- Database.Bolt.Exception: reqFail :: Text -> IO a
+ Database.Bolt.Exception: reqFail :: Object -> Text -> IO a
- Database.Bolt.Exception: reqIgnore :: Text -> IO a
+ Database.Bolt.Exception: reqIgnore :: Object -> Text -> IO a
Files
- bolt.cabal +2/−1
- src/Database/Bolt/Exception.hs +8/−7
- src/Database/Bolt/Protocol/Ver1/Message.hs +5/−1
- src/Database/Bolt/Protocol/Ver1/Request.hs +13/−13
- src/Database/Bolt/Protocol/Ver1/Transaction.hs +1/−2
- src/Database/Bolt/Protocol/Ver1/Types.hs +20/−7
- src/Database/Bolt/Types.hs +14/−0
bolt.cabal view
@@ -1,5 +1,5 @@ name: bolt -version: 0.2.2.0 +version: 0.3.0.1 synopsis: Bolt driver for Neo4j description: A Bolt driver to access Neo4j databases using @@ -37,6 +37,7 @@ , Database.Bolt.Transport.Chunked , Database.Bolt.Transport.Message , Database.Bolt.Transport.Socket + , Database.Bolt.Types build-depends: base >= 4.8 && < 5 , bifunctors >= 5.2 && < 5.5 , bytestring >= 0.10.6 && < 0.11
src/Database/Bolt/Exception.hs view
@@ -8,11 +8,12 @@ ) where import Control.Exception -import Data.Text (Text) +import Data.Text (Text) +import Database.Bolt.Types data BoltException = AuthenticationFailure Text - | RequestFailure Text - | RequestIgnored Text + | RequestFailure Object Text + | RequestIgnored Object Text | InternalError Text | TransportError Text | ProtocolError Text @@ -23,11 +24,11 @@ authFail :: Text -> IO a authFail = throwIO . AuthenticationFailure -reqFail :: Text -> IO a -reqFail = throwIO . RequestFailure +reqFail :: Object -> Text -> IO a +reqFail meta = throwIO . RequestFailure meta -reqIgnore :: Text -> IO a -reqIgnore = throwIO . RequestIgnored +reqIgnore :: Object -> Text -> IO a +reqIgnore meta = throwIO . RequestIgnored meta internalErr :: Text -> IO a internalErr = throwIO . InternalError
src/Database/Bolt/Protocol/Ver1/Message.hs view
@@ -9,6 +9,7 @@ import qualified Data.HashMap.Strict as HM import Data.PackStream import Data.Text (Text) +import qualified Data.Text as T import Database.Bolt.Protocol.Ver1.Types @@ -49,8 +50,11 @@ (Struct 0x70 [metadata]) -> Success <$> parsePackStream metadata (Struct 0x71 [record]) -> Record <$> parsePackStream record (Struct 0x7e [metadata]) -> Ignored <$> parsePackStream metadata + (Struct 0x7e []) -> return $ Ignored mempty (Struct 0x7f [metadata]) -> Failure <$> parsePackStream metadata - _ -> error "Invalid Message" + (Struct 0x7f []) -> return $ Failure mempty + (Struct sn xs) -> error $ "Invalid Message: " ++ T.unpack (pretty (Struct sn xs)) + _ -> error "Invalid Message (not a struct)" data AuthToken = NoAuth | Basic Principal Credentials
src/Database/Bolt/Protocol/Ver1/Request.hs view
@@ -18,9 +18,9 @@ import Database.Bolt.Transport import Database.Bolt.Transport.Message -data Response = Success [Record] - | Failed - | Ignored +data Response = Success Metadata [Record] + | Failed Metadata + | Ignored Metadata request :: Transport t => t -> Message -> IO Response request conn msg = do @@ -32,9 +32,9 @@ reply <- recvmsg conn -- print ("recv", reply) case reply of - Msg.Success _meta -> return $ Success (reverse vals) - Msg.Failure _meta -> return Failed - Msg.Ignored _meta -> return Ignored + Msg.Success meta -> return $ Success meta (reverse vals) + Msg.Failure meta -> return $ Failed meta + Msg.Ignored meta -> return $ Ignored meta Msg.Record val -> gather (val : vals) _ -> protocolErr "Unexpected message in response" @@ -42,18 +42,18 @@ simple conn msg = do resp <- request conn msg case resp of - Success [] -> return () - Success _ -> reqFail "Request not expecting records" - Failed -> reqFail "Request failed" - Ignored -> reqIgnore "Request ignored" + Success _ [] -> return () + Success meta _ -> reqFail meta "Request not expecting records" + Failed meta -> reqFail meta "Request failed" + Ignored meta -> reqIgnore meta "Request ignored" detail :: Transport t => t -> Message -> IO [Record] detail conn msg = do resp <- request conn msg case resp of - Success rs -> return rs - Failed -> reqFail "Request failed" - Ignored -> reqIgnore "Request ignored" + Success _ rs -> return rs + Failed meta -> reqFail meta "Request failed" + Ignored meta -> reqIgnore meta "Request ignored" init :: Transport t => t -> UserAgent -> AuthToken -> IO () init conn agent auth = simple conn $ Msg.Init agent auth
src/Database/Bolt/Protocol/Ver1/Transaction.hs view
@@ -11,7 +11,6 @@ import Control.Exception import Control.Monad.IO.Class import Control.Monad.Trans.Reader --- import Database.Bolt.Exception import qualified Data.HashMap.Strict as HM import Database.Bolt.Protocol.Ver1.Request import Database.Bolt.Protocol.Ver1.Types @@ -28,7 +27,7 @@ r <- try $ runReaderT (unTransaction t) conn case r of Left (SomeException ex) -> do - _ <- exec conn "ROLLBACK" HM.empty + reset conn throwIO ex Right a -> do _ <- exec conn "COMMIT" HM.empty
src/Database/Bolt/Protocol/Ver1/Types.hs view
@@ -1,10 +1,27 @@-module Database.Bolt.Protocol.Ver1.Types where +module Database.Bolt.Protocol.Ver1.Types + ( Object + , object + , UserAgent + , Principal + , Credentials + , Statement + , Label + , Type + , Identity + , Parameters + , Properties + , Metadata + , Record + , (#=) + , (#:) + , (#:?) + ) where -import Data.Int -import Data.Hashable import qualified Data.HashMap.Strict as HM +import Data.Int import Data.PackStream import Data.Text (Text) +import Database.Bolt.Types (Object, object) type UserAgent = Text type Principal = Text @@ -14,14 +31,10 @@ type Type = Text type Identity = Int64 -type Object = HM.HashMap Text PackStream type Parameters = Object type Properties = Object type Metadata = Object type Record = [PackStream] - -object :: (Eq k, Hashable k) => [(k, v)] -> HM.HashMap k v -object = HM.fromList (#=) :: ToPackStream a => Text -> a -> (Text, PackStream) k #= v = (k, toPackStream v)
+ src/Database/Bolt/Types.hs view
@@ -0,0 +1,14 @@+module Database.Bolt.Types+ ( Object+ , object+ ) where++import Data.Hashable+import qualified Data.HashMap.Strict as HM+import Data.PackStream+import Data.Text (Text)++type Object = HM.HashMap Text PackStream++object :: (Eq k, Hashable k) => [(k, v)] -> HM.HashMap k v+object = HM.fromList