@@ -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
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)
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))
24importCSVP :: Parser DataImportOperator
27importCSVP :: Parser DataImportOperator
25importCSVP = do
28importCSVP = do