on master help sign in
fix IOError exceptions bubbling up to kill the tutd interpreter
commit7e4246eca8a3f66a526e9939a8aeda64b5d55eb6 authorAgentM <agentm@themactionfaction.com> dateFri 24 Jul 2015, 12:12 (11 years ago) parent4f64e9d
3 files changed+19−11
ProjectM36/Error.hs+1 TutorialD/Interpreter/Import/CSV.hs+7−4 TutorialD/Interpreter/Import/TutorialD.hs+11−7
ProjectM36/Error.hs+1
@@ -32,6 +32,7 @@ data RelationalError = NoSuchAttributeNamesError (S.Set AttributeName)
3232 | AtomTypeMismatchError AtomType AtomType
3333 | AtomTypeCountError [AtomType] [AtomType]
3434 | 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
3536 deriving (Show,Eq,Generic)
3637
3738instance NFData RelationalError where rnf = genericRnf
TutorialD/Interpreter/Import/CSV.hs+7−4
@@ -9,6 +9,7 @@ import qualified Data.Map as M
99import qualified Data.Text as T
1010import Text.Parsec.String
1111import TutorialD.Interpreter.Base
12+import Control.Exception
1213
1314importCSVRelation :: RelVarName -> FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
1415importCSVRelation relVarName pathIn context = do
@@ -16,10 +17,12 @@ importCSVRelation relVarName pathIn context = do
1617 Nothing -> return $ Left (RelVarNotDefinedError relVarName)
1718 Just targetRel -> do
1819 --TODO: handle filesystem errors
19− csvData <- BS.readFile pathIn
20− case csvAsRelation csvData (attributes targetRel) of
21− Left err -> return $ Left (ParseError $ T.pack (show err))
22− Right csvRel -> return $ Right (Insert relVarName (ExistingRelation csvRel))
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))
23+ Right csvData' -> case csvAsRelation csvData' (attributes targetRel) of
24+ Left err -> return $ Left (ParseError $ T.pack (show err))
25+ Right csvRel -> return $ Right (Insert relVarName (ExistingRelation csvRel))
2326
2427importCSVP :: Parser DataImportOperator
2528importCSVP = do
TutorialD/Interpreter/Import/TutorialD.hs+11−7
@@ -4,20 +4,24 @@ import TutorialD.Interpreter.Import.Base
44import TutorialD.Interpreter.Base
55import TutorialD.Interpreter.DatabaseExpr
66import Text.Parsec.String
7−import Text.Parsec
7+import Text.Parsec hiding (try)
88import ProjectM36.Error
99import Data.Either
1010import qualified Data.Text as T
11+import Control.Exception
1112--import a file containing TutorialD database context expressions
1213
1314importTutorialD :: FilePath -> DatabaseContext -> IO (Either RelationalError DatabaseExpr)
1415importTutorialD pathIn _ = do
15− tutdData <- readFile pathIn
16− let dbexprsErr = map (parse databaseExprP "") (lines tutdData)
17− errs = lefts dbexprsErr
18− case errs of
19− err:_ -> return $ Left (ParseError (T.pack (show err)))
20− [] -> return $ Right (MultipleExpr (rights dbexprsErr))
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
20+ let dbexprsErr = map (parse databaseExprP "") (lines tutdData')
21+ errs = lefts dbexprsErr
22+ case errs of
23+ err2:_ -> return $ Left (ParseError (T.pack (show err2)))
24+ [] -> return $ Right (MultipleExpr (rights dbexprsErr))
2125
2226tutdImportP :: Parser DataImportOperator
2327tutdImportP = do