ImportResult(..),
run_dbmigrate )
import TSN.Parse (
+ ParseError,
+ parse_game_id,
parse_message,
+ parse_schedule_id,
parse_xmlfid,
parse_xml_time_stamp )
import Xml ( unsafe_read_document )
-- | This serves as both the database and XML representation of a
-- GameInfo \<message\>.
--
+-- The 'game_id' and 'schedule_id' fields are foreign keys, but they
+-- key into multiple tables and key on records which may not exist
+-- when we import the GameInfo document. We therefore don't declare
+-- them as foreign keys; i.e. we don't require them to point
+-- anywhere in particular. But if they do, that's nice.
+--
data GameInfo =
GameInfo {
dtd :: String,
xml_file_id :: Int,
+ game_id :: Maybe Int, -- ^ These are optional because they are missing
+ -- from at least the MLB_Matchup_XML.dtd documents.
+ -- They provide foreign keys into any tables storing
+ -- games with their IDs.
+
+ schedule_id :: Maybe Int, -- ^ Optional key into any table storing a
+ -- schedule along with its ID. We've noticed
+ -- them missing in e.g. recapxml.dtd documents.
time_stamp :: UTCTime,
xml :: String }
deriving (Eq, Show)
-- | Attempt to parse a 'GameInfo' from an 'XmlTree'. If we cannot,
-- we fail with an error message.
--
-parse_xml :: String -> XmlTree -> Either String GameInfo
+parse_xml :: String -> XmlTree -> Either ParseError GameInfo
parse_xml dtdname xmltree = do
xmlfid <- parse_xmlfid xmltree
+ game_id <- parse_game_id xmltree
+ schedule_id <- parse_schedule_id xmltree
timestamp <- parse_xml_time_stamp xmltree
message <- parse_message xmltree
- return $ GameInfo dtdname (fromInteger xmlfid) timestamp (xshow [message])
+ return $ GameInfo
+ dtdname
+ xmlfid
+ game_id
+ schedule_id
+ timestamp
+ (xshow [message])
--
--- Database code
+-- * Database code
--
instance DbImport GameInfo where
let ex2 = 21201550
let a3 = show $ time_stamp t
let ex3 = "2014-05-31 15:13:00 UTC"
- let a4 = take 9 (xml t)
- let ex4 = "<message>"
- let actual = (a1,a2,a3,a4)
- let expected = (ex1,ex2,ex3,ex4)
+ let a4 = game_id t
+ let ex4 = Just 39978
+ let a5 = schedule_id t
+ let ex5 = Just 39978
+ let a6 = take 9 (xml t)
+ let ex6 = "<message>"
+ let actual = (a1,a2,a3,a4,a5,a6)
+ let expected = (ex1,ex2,ex3,ex4,ex5,ex6)
actual @?= expected