+ results <- mapM (import_file cfg) (OC.xml_files opt_config)
+
+ -- Zip the results with the files list to find out which ones can be
+ -- deleted.
+ let result_pairs = zip (OC.xml_files opt_config) results
+ let victims = [ (p,c) | (p, Just c) <- result_pairs ]
+ let imported_count = sum $ map snd victims
+ report_info $ "Imported " ++ (show imported_count) ++ " records total."
+ mapM_ ((kill True) . fst) victims
+
+ where
+ -- | Wrap these two actions into one function so that we don't
+ -- report that the file was removed if the exception handler is
+ -- run.
+ remove_and_report path = do
+ removeFile path
+ report_info $ "Removed processed file " ++ path ++ "."
+
+ -- | Try to remove @path@ and potentially try again.
+ kill try_again path =
+ (remove_and_report path) `catchIOError` exception_handler
+ where
+ -- | A wrapper around threadDelay which takes seconds instead of
+ -- microseconds as its argument.
+ thread_sleep :: Int -> IO ()
+ thread_sleep seconds = do
+ let microseconds = seconds * (10 ^ (6 :: Int))
+ threadDelay microseconds
+
+ -- | If we can't remove the file, report that, and try once
+ -- more after waiting a few seconds.
+ exception_handler :: IOError -> IO ()
+ exception_handler e = do
+ report_error (show e)
+ report_error $ "Failed to remove imported file " ++ path ++ "."
+ if try_again then do
+ report_info "Waiting 5 seconds to attempt removal again..."
+ thread_sleep 5
+ kill False path
+ else
+ report_info $ "Giving up on " ++ path ++ "."