packages feed

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 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