on master help sign in
fix IOError exceptions bubbling up to kill the tutd interpreter
7e4246eAgentM
ProjectM36/Error.hs+1
@@ -32,6 +32,7 @@ data RelationalError = NoSuchAttributeNamesError (S.Set AttributeName)
32 | AtomTypeMismatchError AtomType AtomType
32 | AtomTypeMismatchError AtomType AtomType
33 | AtomTypeCountError [AtomType] [AtomType]
33 | AtomTypeCountError [AtomType] [AtomType]
34 | AtomFunctionTypeError AtomFunctionName Int AtomType AtomType --arg number
34 | AtomFunctionTypeError AtomFunctionName Int AtomType AtomType --arg number
35+ | ImportError T.Text -- really? This should be broken out into some other error type- this has nothing to do with relational algebra
35 deriving (Show,Eq,Generic)
36 deriving (Show,Eq,Generic)
36
37
37instance NFData RelationalError where rnf = genericRnf
38instance NFData RelationalError where rnf = genericRnf
TutorialD/Interpreter/Import/CSV.hs+7−4
@@ -9,6 +9,7 @@ import qualified Data.Map as M
9import qualified Data.Text as T
9import qualified Data.Text as T
10import Text.Parsec.String
10import Text.Parsec.String
11import TutorialD.Interpreter.Base
11import TutorialD.Interpreter.Base
12+import Control.Exception
12
13
13importCSVRelation :: RelVarName -> FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
14importCSVRelation :: RelVarName -> FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
14importCSVRelation relVarName pathIn context = do
15importCSVRelation relVarName pathIn context = do
@@ -16,10 +17,12 @@ importCSVRelation relVarName pathIn context = do
16 Nothing -> return $ Left (RelVarNotDefinedError relVarName)
17 Nothing -> return $ Left (RelVarNotDefinedError relVarName)
17 Just targetRel -> do
18 Just targetRel -> do
18 --TODO: handle filesystem errors
19 --TODO: handle filesystem errors
19− csvData <- BS.readFile pathIn
20+ csvData <- try (BS.readFile pathIn) :: IO (Either IOError BS.ByteString)
21+ case csvData of
22+ Left err -> return $ Left (ImportError $ T.pack (show err))
20− case csvAsRelation csvData (attributes targetRel) of
23+ Right csvData' -> case csvAsRelation csvData' (attributes targetRel) of
21− Left err -> return $ Left (ParseError $ T.pack (show err))
24+ Left err -> return $ Left (ParseError $ T.pack (show err))
22− Right csvRel -> return $ Right (Insert relVarName (ExistingRelation csvRel))
25+ Right csvRel -> return $ Right (Insert relVarName (ExistingRelation csvRel))
23
26
24importCSVP :: Parser DataImportOperator
27importCSVP :: Parser DataImportOperator
25importCSVP = do
28importCSVP = do
TutorialD/Interpreter/Import/TutorialD.hs+11−7
@@ -4,20 +4,24 @@ import TutorialD.Interpreter.Import.Base
4import TutorialD.Interpreter.Base
4import TutorialD.Interpreter.Base
5import TutorialD.Interpreter.DatabaseExpr
5import TutorialD.Interpreter.DatabaseExpr
6import Text.Parsec.String
6import Text.Parsec.String
7−import Text.Parsec
7+import Text.Parsec hiding (try)
8import ProjectM36.Error
8import ProjectM36.Error
9import Data.Either
9import Data.Either
10import qualified Data.Text as T
10import qualified Data.Text as T
11+import Control.Exception
11--import a file containing TutorialD database context expressions
12--import a file containing TutorialD database context expressions
12
13
13importTutorialD :: FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
14importTutorialD :: FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
14importTutorialD pathIn _ = do
15importTutorialD pathIn _ = do
15− tutdData <- readFile pathIn
16+ tutdData <- try (readFile pathIn) :: IO (Either IOError String)
17+ case tutdData of
18+ Left err -> return $ Left (ImportError $ T.pack (show err))
19+ Right tutdData' -> do
16− let dbexprsErr = map (parse databaseExprP "") (lines tutdData)
20+ let dbexprsErr = map (parse databaseExprP "") (lines tutdData')
17− errs = lefts dbexprsErr
21+ errs = lefts dbexprsErr
18− case errs of
22+ case errs of
19− err:_ -> return $ Left (ParseError (T.pack (show err)))
23+ err2:_ -> return $ Left (ParseError (T.pack (show err2)))
20− [] -> return $ Right (MultipleExpr (rights dbexprsErr))
24+ [] -> return $ Right (MultipleExpr (rights dbexprsErr))
21
25
22tutdImportP :: Parser DataImportOperator
26tutdImportP :: Parser DataImportOperator
23tutdImportP = do
27tutdImportP = do