diff options
author | stuebinm | 2022-11-23 23:39:27 +0100 |
---|---|---|
committer | stuebinm | 2022-11-23 23:39:27 +0100 |
commit | f0f5fa44dd3dbc2a5a6308e2dce047a82c8b1be2 (patch) | |
tree | 6ff1a8a97cc78b6e2664a0fa97227bcbf539eb0f /vdv-server | |
parent | 97b99ed70f900716e17771f14a210dbed2ab9841 (diff) |
VDV 452 instances for serialisation
this may occasionally produce wrong output. In a lot of places I'm
not entirey sure if I understood the standard correctly …
Diffstat (limited to '')
-rw-r--r-- | vdv-server/VDV451.hs | 37 | ||||
-rw-r--r-- | vdv-server/VDV452.hs | 593 |
2 files changed, 529 insertions, 101 deletions
diff --git a/vdv-server/VDV451.hs b/vdv-server/VDV451.hs index 1d56e1c..b962208 100644 --- a/vdv-server/VDV451.hs +++ b/vdv-server/VDV451.hs @@ -47,10 +47,6 @@ instance ÖPNVEncode Text where instance ÖPNVEncode Day where encode day = "\""+|crop 2 d|+"."+|crop 2 m|+"."+|crop 4 y|+"\"" where (y,m,d) = toGregorian day - crop n thing = if T.length shown < n - then T.replicate (n - T.length shown) "0" <> shown - else T.takeEnd n shown - where shown = T.pack $ show thing -- | for things which can be encoded as either string or number, -- this module defaults to strings. Add this newtype to the schema @@ -69,6 +65,32 @@ instance ÖPNVEncode Int instance ÖPNVEncode Integer +-- | these are encoded in a horrible format +newtype Longitude = Longitude Double +newtype Latitude = Latitude Double + +encodeGeoLength :: Double -> ByteString +encodeGeoLength d' = ""+|sign|+""+|crop 3 deg|+""+|crop 2 min|+""+|crop 5 sec|+"" + where deg = truncate d + min = truncate (d * 60) `mod` 60 + sec = truncate (d * 3600 * 1000) `mod` (60 * 1000) + d = abs d' + sign :: Text + sign = if d' < 0 then "-" else "" + +instance ÖPNVEncode Latitude where + encode (Latitude d) = encodeGeoLength d +instance ÖPNVEncode Longitude where + encode (Longitude d) = encodeGeoLength d + +-- | this isn't specified anywhere, but seems to be what VDV 452 implies +instance ÖPNVEncode a => ÖPNVEncode (Maybe a) where + encode (Just a) = encode a + encode Nothing = "NULL" + +instance ÖPNVEncode Bool where + encode False = "0" + encode True = "1" data ÖPNVBefehl = MOD | SRC | CHS | VER | IFV @@ -102,6 +124,7 @@ instance ÖPNVEncode ÖPNVType where class ÖPNVDatum a where tableName :: Proxy a -> ByteString + tableNumber :: Proxy a -> Int tableSchema :: Proxy a -> [(ByteString, ÖPNVType, a -> Feld)] encodeRow :: forall a. ÖPNVDatum a => a -> [Feld] @@ -145,3 +168,9 @@ data ÖPNVOptions = ÖPNVOptions . C8.intercalate "; " . fmap (\case { (F a) -> encode a; Raw a -> a }) (colNames, colTypes) = unzip (tableInfo (Proxy @a)) + + +crop n thing = if T.length shown < n + then T.replicate (n - T.length shown) "0" <> shown + else T.takeEnd n shown + where shown = T.pack $ show thing diff --git a/vdv-server/VDV452.hs b/vdv-server/VDV452.hs index 0a54a38..38e6a8d 100644 --- a/vdv-server/VDV452.hs +++ b/vdv-server/VDV452.hs @@ -7,7 +7,8 @@ module VDV452 where import Data.Time (Day) import Data.Text (Text) -import VDV451 (ÖPNVEncode, ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber)) +import VDV451 (ÖPNVEncode (encode), ÖPNVDatum (..), ÖPNVType (..), Feld (F), AsNumber (AsNumber), Longitude, Latitude) +import Data.ByteString (ByteString) @@ -21,6 +22,7 @@ data BasisVerGueltigkeit = BasisVerGueltigkeit instance ÖPNVDatum BasisVerGueltigkeit where tableName _ = "BASIS_VER_GUELTIGKEIT" + tableNumber _ = 993 tableSchema _ = [ ("VER_GUELTIGKEIT", ÖNum 8, F . AsNumber . basisVerGueltigkeit) , ("BASIS_VERSION", ÖNum 9, F . basisBasisVersion)] @@ -35,13 +37,14 @@ data MengeBasisVersionen = MengeBasisVersionen instance ÖPNVDatum MengeBasisVersionen where tableName _ = "MENGE_BASIS_VERSIONEN" + tableNumber _ = 485 tableSchema _ = [ ("BASIS_VERSION", ÖNum 9, F . mengeBasisVersion) , ("BASIS_VERSION_TEXT", ÖChar 40, F . mengeBasisVersionText)] -- | 348 data Firmenkalender = Firmenkalender - { firmenkalenderBasisVersion :: Integer + { firmenkalenderBasisVersion :: Int -- ^ Fremdschlüssel von MengeBasisVersionen , firmenkalenderBetriebstag :: Day , firmenkalenderBetriebstagText :: Text @@ -49,14 +52,33 @@ data Firmenkalender = Firmenkalender -- TODO this is probably en enum } +instance ÖPNVDatum Firmenkalender where + tableName _ = "FIRMENKALENDER" + tableNumber _ = 348 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . firmenkalenderBasisVersion) + , ("BETRIEBSTAG", ÖNum 8, F . firmenkalenderBetriebstag) + , ("BETRIEBSTAG_TEXT", ÖChar 40, F . firmenkalenderBetriebstagText) + , ("TAGESART_NR", ÖNum 3, F . firmenkalenderTagesArtNr) + ] + + data MengeTagesart = MengeTagesart - { tagesartBasisVersion :: Integer + { tagesartBasisVersion :: Int -- ^ P1, Fremdschlüssel von MengeBasisVersionen , tagesartTagesartNr :: Int -- ^ P2 , tagesartTagesartText :: Text } +instance ÖPNVDatum MengeTagesart where + tableName _ = "MENGE_TAGESART" + tableNumber _ = 290 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . tagesartBasisVersion) + , ("TAGESART_NR", ÖNum 3, F . tagesartTagesartNr) + , ("TAGESART_TEXT", ÖChar 40, F . tagesartTagesartText) + ] @@ -66,53 +88,100 @@ data OnrTypNr = OnrHaltepunkt | OnrBetriebshofpunkt | OnrOrtsmarke | OnrLSAPunkt | OnrRoutenzwischenpunkt | OnrBetriebspunkt | OnrGrenzpunkt + deriving (Show, Enum) + +instance ÖPNVEncode OnrTypNr where + encode typ = encode (1 + fromEnum typ) data MengeOnrTyp = MengeOnrTyp - { onrtypBasisVersion :: Integer + { onrtypBasisVersion :: Int , onrtypTypNr :: OnrTypNr - , onrStrTyp :: Text + , onrtypStrTyp :: Text -- TODO: this might be an enum? - , onrTypText :: Text + , onrtypText :: Text } +instance ÖPNVDatum MengeOnrTyp where + tableName _ = "MENGE_ONR_TYP" + tableNumber _ = 998 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . onrtypBasisVersion) + , ("ONR_TYP_NR", ÖNum 2, F . onrtypTypNr) + , ("STR_ONR_TYP", ÖChar 6, F . onrtypStrTyp) + , ("ONR_TYP_TEXT", ÖChar 40, F . onrtypText) + ] + data OrtTypNr = OrtHaltestelle | OrtBetriebshof + deriving Show + +instance ÖPNVEncode OrtTypNr where + encode OrtHaltestelle = encode (1 :: Int) + encode OrtBetriebshof = encode (2 :: Int) data MengeOrtTyp = MengeOrtTyp - { orttypBasisVersion :: Integer + { orttypBasisVersion :: Int , orttypTypNr :: OrtTypNr , orttypText :: Text } +instance ÖPNVDatum MengeOrtTyp where + tableName _ = "MENGE_ONR_TYP" + tableNumber _ = 997 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . orttypBasisVersion) + , ("ORT_TYP_NR", ÖNum 2, F . orttypTypNr) + , ("ORT_TYP_TEXT", ÖChar 40, F . orttypText) + ] + data RecHp = RecHp - { rechpBasisVersion :: Integer + { rechpBasisVersion :: Int , rechpOnrTypNr :: OrtTypNr - , rechpOrtNr :: Integer + , rechpOrtNr :: Int , rechpHaltepunktNr :: Int , rechpZusatzInfo :: Text } +instance ÖPNVDatum RecHp where + tableName _ = "REC_HP" + tableNumber _ = 229 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . rechpBasisVersion) + , ("ONR_TYP_NR", ÖNum 2, F . rechpOnrTypNr) + , ("ORT_NR", ÖNum 6, F . rechpOrtNr) + , ("HALTEPUNKT_NR", ÖNum 2, F . rechpHaltepunktNr) + , ("ZUSATZ_INFO", ÖChar 40, F . rechpZusatzInfo) + ] + data RecOm = RecOm - { recomBasisVersion :: Integer + { recomBasisVersion :: Int , recomOnrTypNr :: OnrTypNr -- ^ nur 3..4 - , recomOrtNr :: Integer + , recomOrtNr :: Int , recomOrmKuerzel :: Text , recomOrmacode :: Int - , recOrmText :: Text + , recomOrmText :: Text } --- | these are encoded in a horrible format -newtype Longitude = Longitude Int -newtype Latitude = Latitude Int +instance ÖPNVDatum RecOm where + tableName _ = "REC_OM" + tableNumber _ = 295 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recomBasisVersion) + , ("ONR_TYP_NR", ÖNum 2, F . recomOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recomOrtNr) + , ("ORM_KUERZEL", ÖChar 6, F . recomOrmKuerzel) + , ("ORMACODE", ÖNum 5, F . recomOrmacode) + , ("ORM_TEXT", ÖChar 40, F . recomOrmText) + ] -- | tatsächliche Ortsbeschreibung data RecOrt = RecOrt - { recortBasisVersion :: Integer + { recortBasisVersion :: Int , recortOnrTypNr :: OnrTypNr - , recortOrtNr :: Integer + , recortOrtNr :: Int , recortOrtName :: Text , recortHastNrLokal :: Int - , recortHstNrNational :: Integer + , recortHstNrNational :: Int , recortHstNrInternational :: Text -- these only if recortOnrTypNr = 1 or 2 , recortOrtRefOrt :: Int @@ -122,19 +191,41 @@ data RecOrt = RecOrt , recortOrtRefOrtName :: Text , recortZoneWabeNr :: Maybe Int --- these are entirely optional - , recortOrtPosLaenge :: Longitude - , rocortOrtPosBreite :: Latitude - , recortPosHoehe :: Int - , recortOrtRichtung :: Int + , recortOrtPosLaenge :: Maybe Longitude + , recortOrtPosBreite :: Maybe Latitude + , recortPosHoehe :: Maybe Int + , recortOrtRichtung :: Maybe Int } +instance ÖPNVDatum RecOrt where + tableName _ = "REC_ORT" + tableNumber _ = 253 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recortBasisVersion) + , ("ONR_TYP_NR", ÖNum 2, F . recortOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recortOrtNr) + , ("ORT_NAME", ÖChar 40, F . recortOrtName) + , ("ORT_REF_ORT", ÖNum 6, F . recortOrtRefOrt) + , ("ORT_REF_ORT_TYP", ÖNum 2, F . recortOrtRefOrtTyp) + , ("ORT_REF_ORT_LangNr", ÖNum 7, F . recortOrtRefOrtLangNr) + , ("ORT_REF_ORT_KUERZEL", ÖChar 8, F . recortOrtRefOrtKuerzel) + , ("ORT_REF_ORT_NAME", ÖChar 40, F . recortOrtRefOrtName) + , ("ZONE_WABE_NR", ÖNum 5, F . recortZoneWabeNr) + , ("ORT_POS_LAENGE", ÖNum 10, F . recortOrtPosLaenge) + , ("ORT_POS_BREITE", ÖNum 10, F . recortOrtPosBreite) + , ("ORT_POS_HOEHE", ÖNum 10, F . recortPosHoehe) + , ("ORT_RICHTUNG", ÖNum 3, F . recortOrtRichtung) + , ("HAST_NR_LOKAL", ÖNum 9, F . recortHastNrLokal) + , ("HST_NR_NATIONAL", ÖNum 9, F . recortHstNrNational) + , ("HST_NR_INTERNATIONAL", ÖChar 30, F . recortHstNrInternational) + ] -- Betriebsdaten data Fahrzeug = Fahrzeug - { fzgBasisVersion :: Integer + { fzgBasisVersion :: Int , fzgNr :: Int , fzgTypNr :: Maybe Int , fzgPolKenn :: Text @@ -143,24 +234,56 @@ data Fahrzeug = Fahrzeug , fzgFIN :: Text } +instance ÖPNVDatum Fahrzeug where + tableName _ = "FAHRZEUG" + tableNumber _ = 443 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . fzgBasisVersion) + , ("FZG_NR", ÖNum 4, F . fzgNr) + , ("FZG_TYP_NR", ÖNum 3, F . fzgTypNr) + , ("POLKENN", ÖChar 20, F . fzgPolKenn) + , ("FIN", ÖChar 17, F . fzgFIN) + ] + + data ZulVerkehsbetrieb = ZulVerkehsbetrieb - { zulBasisVersion :: Integer + { zulBasisVersion :: Int , zulUnternehmen :: Int , zulAbkUnternehmen :: Text , zulBetriebsgebietBez :: Text } +instance ÖPNVDatum ZulVerkehsbetrieb where + tableName _ = "ZUL_VERKEHRSBETRIEB" + tableNumber _ = 992 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . zulBasisVersion) + , ("UNTERNEHMEN", ÖNum 3, F . zulUnternehmen) + , ("ABK_UNTERNEHMEN", ÖChar 6, F . zulAbkUnternehmen) + , ("BETRIEBSGEBIET_BEZ", ÖChar 40, F . zulBetriebsgebietBez) + ] + -- | 333 data MengeBereich = MengeBereich - { mengebereichBasisVersion :: Integer + { mengebereichBasisVersion :: Int , mengebereichBereichNr :: Text , mengebereichStrBereich :: Text , mengebereichBereichText :: Text } +instance ÖPNVDatum MengeBereich where + tableName _ = "MENGE_BEREICH" + tableNumber _ = 333 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . mengebereichBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . mengebereichBereichNr) + , ("STR_BEREICH", ÖChar 6, F . mengebereichStrBereich) + , ("BEREICH_TEXT", ÖChar 40, F . mengebereichBereichText) + ] + -- | 293 data MengeFzgTyp = MengeFzgTyp - { fzgtypBasisVersion :: Integer + { fzgtypBasisVersion :: Int , fzgtypFzgTypNr :: Int , fzgtypFzgLaenge :: Int -- ^ given in metres @@ -168,12 +291,12 @@ data MengeFzgTyp = MengeFzgTyp -- ^ given in centimetres , fzgtypHoehe :: Int -- ^ given in centimetres - , fzgtypGewicht :: Integer + , fzgtypGewicht :: Int -- ^ kilograms - , fzgtypSitz :: Integer - , fzgtypSteh :: Integer + , fzgtypSitz :: Int + , fzgtypSteh :: Int , fzgtypText :: Text - , fzgtypSonderPlatz :: Integer + , fzgtypSonderPlatz :: Int , fzgtypStrFzgTyp :: Text -- ^ kursbezeichnung des fahrzeugtyps -- , fzgtypBatterieTypNr :: Maybe Int @@ -183,20 +306,49 @@ data MengeFzgTyp = MengeFzgTyp -- , fzgtypVerbrauchZeit :: Int } +instance ÖPNVDatum MengeFzgTyp where + tableName _ = "MENGE_FZG_TYP" + tableNumber _ = 293 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . fzgtypBasisVersion) + , ("FZG_TYP_NR", ÖNum 3, F . fzgtypFzgTypNr) + , ("FZG_LAENGE", ÖNum 2, F . fzgtypFzgLaenge) + , ("FZG_TYP_BREITE", ÖNum 3, F . fzgtypBreite) + , ("FZG_TYP_HOEHE", ÖNum 3, F . fzgtypHoehe) + , ("FZG_TYP_GEWICHT", ÖNum 6, F . fzgtypGewicht) + , ("FZG_TYP_SITZ", ÖNum 3, F . fzgtypSitz) + , ("FZG_TYP_STEH", ÖNum 3, F . fzgtypSteh) + , ("FZG_TYP_TEXT", ÖChar 40, F . fzgtypText) + , ("SONDER_PLATZ", ÖNum 3, F . fzgtypSonderPlatz) + , ("STR_FZG_TYP", ÖChar 6, F . fzgtypStrFzgTyp) + ] + -- | 996: Aufzählung von Fahrzeug-Ansagetexten -- this one seems to be optional data RecAnr = RecAnr - { recanrBasisVersion :: Integer + { recanrBasisVersion :: Int , recanrAnrNr :: Int , recanrAnrKuerzel :: Text , recanrAnrText :: Text } +instance ÖPNVDatum RecAnr where + tableName _ = "REC_ANR" + tableNumber _ = 996 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recanrBasisVersion) + , ("ANR_NR", ÖNum 4, F . recanrAnrNr) + , ("ANR_KUERZEL", ÖChar 10, F . recanrAnrKuerzel) + , ("ANR_TEXT", ÖChar 200, F . recanrAnrText) + ] + + + -- | 995: Aufzählung der am Fahrzeug angezeigten Fahrtziele -- this one is probably optional as well data RecZnr = RecZnr - { recznrBasisVersion :: Integer - , recznrZnrNr :: Integer + { recznrBasisVersion :: Int + , recznrZnrNr :: Int , recznrKuerzel :: Text , recznrFahrerkurztext :: Text , recznrSeitentext :: Text @@ -204,7 +356,18 @@ data RecZnr = RecZnr , recznrCode :: Text } - +instance ÖPNVDatum RecZnr where + tableName _ = "REC_ZNR" + tableNumber _ = 994 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recznrBasisVersion) + , ("ZNR_NR", ÖNum 4, F . recznrZnrNr) + , ("ZNR_KUERZEL", ÖChar 10, F . recznrKuerzel) + , ("FAHRERKURZTEXT", ÖChar 44, F . recznrFahrerkurztext) + , ("SEITENTEXT", ÖChar 160, F . recznrSeitentext) + , ("ZNR_TEXT", ÖChar 160, F . recznrZnrText) + , ("ZNR_CODE", ÖChar 68, F . recznrCode) + ] @@ -212,150 +375,304 @@ data RecZnr = RecZnr -- 299 data RecSel = RecSel - { recselBasisVersion :: Integer + { recselBasisVersion :: Int , recselBereichNr :: Int -- ^ fremdschlüssel MangeBereich , recselOnrTypNr :: OnrTypNr -- ^ fremdschlüssel MengeOnrTyp - , recselOrtNr :: Integer + , recselOrtNr :: Int -- ^ fremdschlüssel RecOrt - , recselSelZiel :: Integer + , recselSelZiel :: Int , recselSelZielTyp :: OrtTypNr - , recselSelLaenge :: Integer + , recselSelLaenge :: Int } +instance ÖPNVDatum RecSel where + tableName _ = "REC_SEL" + tableNumber _ = 299 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recselBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . recselBereichNr) + , ("ONR_TYP_NR", ÖNum 2, F . recselOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recselOrtNr) + , ("SEL_ZIEL", ÖNum 6, F . recselSelZiel) + , ("SEL_ZIEL_TYP", ÖNum 2, F . recselSelZielTyp) + , ("SEL_LAENGE", ÖNum 5, F . recselSelLaenge) + ] + + + -- | 995: definition von zwischenpunkten -- honestly i hope this one's optional data RecSelZp = RecSelZp - { recselzpBasisVersion :: Integer + { recselzpBasisVersion :: Int , recselzpBereichNr :: Int , recselzpOnrTypNr :: OrtTypNr - , recselzpOrtNr :: Integer - , recselzpSelZiel :: Integer + , recselzpOrtNr :: Int + , recselzpSelZiel :: Int , recselzpSelZielTyp :: OrtTypNr - , recselzpZpOnr :: Integer + , recselzpZpOnr :: Int , recselzpZpTyp :: Int -- this one only takes values 3..7??? , recselzpSelZpLaenge :: Maybe Int - , recselzpZpLfdNr :: Maybe Integer + , recselzpZpLfdNr :: Maybe Int } +instance ÖPNVDatum RecSelZp where + tableName _ = "REC_SEL_ZP" + tableNumber _ = 995 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recselzpBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . recselzpBereichNr) + , ("ONR_TYP_NR", ÖNum 2, F . recselzpOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recselzpOrtNr) + , ("SEL_ZIEL", ÖNum 6, F . recselzpSelZiel) + , ("SEL_ZIEL_TYP", ÖNum 2, F . recselzpSelZielTyp) + , ("ZP_ONR", ÖNum 6, F . recselzpZpOnr) + , ("ZP_TYP", ÖNum 2, F . recselzpZpTyp) + , ("SEL_ZP_LAENGE", ÖNum 5, F . recselzpSelZpLaenge) + , ("ZP_LFD_NR", ÖNum 3, F . recselzpZpLfdNr) + ] + -- | 222: Fahrzeitgruppen (whatever that is) -- seems to be optional? data MengeFgr = MengeFgr - { mengefgrBasisVersion :: Integer - , mengefgrFgrNr :: Integer + { mengefgrBasisVersion :: Int + , mengefgrFgrNr :: Int , mengefgrText :: Text , mengefgrTypNr :: Int } +instance ÖPNVDatum MengeFgr where + tableName _ = "MENGE_FGR" + tableNumber _ = 222 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . mengefgrBasisVersion) + , ("FGR_NR", ÖNum 9, F . mengefgrFgrNr) + , ("FGR_TEXT", ÖChar 40, F . mengefgrText) + , ("FGR_TYP_NR", ÖNum 3, F . mengefgrTypNr) + ] + --- | 999: Angabe von Haltezeiten je Fahrzeitgruppe und Ort -- definitely optional, which is a good thing because -- i don't know what it's even for data OrtHztf = OrtHztf - { orthztfBasisVersion :: Integer - , orthztfFgrNr :: Integer + { orthztfBasisVersion :: Int + , orthztfFgrNr :: Int , orthztfOnrTypNr :: OrtTypNr - , orthztfOrtNr :: Integer + , orthztfOrtNr :: Int , orthztfHpHzt :: Int } +instance ÖPNVDatum OrtHztf where + tableName _ = "ORT_HZTF" + tableNumber _ = 999 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . orthztfBasisVersion) + , ("FGR_NR", ÖNum 9, F . orthztfFgrNr) + , ("ONR_TYP_NR", ÖNum 2, F . orthztfOnrTypNr) + , ("ORT_NR", ÖNum 6, F . orthztfOrtNr) + , ("HP_HZT", ÖNum 6, F . orthztfHpHzt) + ] + -- | 282: für streckenabschnitte planmäßig vorgesehen Fahrzeit -- nie als fremdschlüssel benutzt, ist optional data SelFztFeld = SelFztFeld - { selfztBasisVersion :: Integer + { selfztBasisVersion :: Int , selfztBereichNr :: Int - , selfztFgrNr :: Integer + , selfztFgrNr :: Int , selfztOnrTypNr :: OrtTypNr - , selfztOrtNr :: Integer - , selfztSelZiel :: Integer + , selfztOrtNr :: Int + , selfztSelZiel :: Int , selfztSelZielTyp :: OrtTypNr , selfztSelFzt :: Int } +instance ÖPNVDatum SelFztFeld where + tableName _ = "SEL_FZT_FELD" + tableNumber _ = 282 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . selfztBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . selfztBereichNr) + , ("FGR_NR", ÖNum 9, F . selfztFgrNr) + , ("ONR_TYP_NR", ÖNum 2, F . selfztOnrTypNr) + , ("ORT_NR", ÖNum 6, F . selfztOrtNr) + , ("SEL_ZIEL", ÖNum 6, F . selfztSelZiel) + , ("SEL_ZIEL_TYP", ÖNum 2, F . selfztSelZielTyp) + , ("SEL_FZT", ÖNum 6, F . selfztSelFzt) + ] + -- | 225: keine ahnung, irgendwas halt data RecUeb = RecUeb - { recuebBasisVersion :: Integer + { recuebBasisVersion :: Int , recuebBereichNr :: Int , recuebOnrTypNr :: OrtTypNr - , recuebOrtNr :: Integer - , recuebUebZielTyp :: OrtTypNr - , recuebZiel :: Integer + , recuebOrtNr :: Int + , recuebZielTyp :: OrtTypNr + , recuebZiel :: Int , recuebLaenge :: Int } +instance ÖPNVDatum RecUeb where + tableName _ = "REC_UEB" + tableNumber _ = 225 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recuebBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . recuebBereichNr) + , ("ONR_TYP_NR", ÖNum 2, F . recuebOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recuebOrtNr) + , ("UEB_ZIEL_TYP", ÖNum 2, F . recuebZielTyp) + , ("UEB_ZIEL", ÖNum 6, F . recuebZiel) + , ("UEB_LAENGE", ÖNum 6, F . recuebLaenge) + ] + -- | 247 -- nirgendwo anders benutzt, ist wohl optional data UebFzt = UebFzt - { uebfztBasisVersion :: Integer + { uebfztBasisVersion :: Int , uebfztBereichNr :: Int - , uebfztFgrNr :: Integer + , uebfztFgrNr :: Int , uebfztOnrTypNr :: OrtTypNr - , uebfztOrtNr :: Integer - , uebZielTyp :: OrtTypNr - , uebZiel :: Integer - , uebFahrzeit :: Int + , uebfztOrtNr :: Int + , uebfztZielTyp :: OrtTypNr + , uebfztZiel :: Int + , uebfztFahrzeit :: Int } +instance ÖPNVDatum UebFzt where + tableName _ = "UEB_FZT" + tableNumber _ = 247 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . uebfztBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . uebfztBereichNr) + , ("FGR_NR", ÖNum 9, F . uebfztFgrNr) + , ("ONR_TYP_NR", ÖNum 2, F . uebfztOnrTypNr) + , ("ORT_NR", ÖNum 6, F . uebfztOrtNr) + , ("UEB_ZIEL_TYP", ÖNum 2, F . uebfztZielTyp) + , ("UEB_ZIEL", ÖNum 6, F . uebfztZiel) + , ("UEB_Fahrzeit", ÖNum 6, F . uebfztFahrzeit)] + data Fahrtart = Normalfahrt | Betriebshofausfahrt | Betriebshofeinfahrt | Zufahrt + deriving (Show, Enum) + +instance ÖPNVEncode Fahrtart where + encode a = encode (1 + fromEnum a) -- | 332: Aufzählung von Fahrtarten data MengeFahrtart = MengeFahrtart - { fahrtartBasisVersion :: Integer + { fahrtartBasisVersion :: Int , fahrtartNr :: Fahrtart , fahrtartStrFahrtart :: Text } +instance ÖPNVDatum MengeFahrtart where + tableName _ = "MENGE_FAHRTART" + tableNumber _ = 332 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . fahrtartBasisVersion) + , ("FAHRTART_NR", ÖNum 2, F . fahrtartNr) + , ("STR_FAHRTART", ÖChar 6, F . fahrtartStrFahrtart)] + -- | 571: Beschreibung von Flächenzonen data FlaechenZone = FlaechenZone - { flaechenBasisVersion :: Integer + { flaechenBasisVersion :: Int , flaechenZoneTypNr :: Int - , flaechenZoneNr :: Integer + , flaechenZoneNr :: Int , flaechenZoneKuerzel :: Text , flaechenZoneName :: Text , flaechenZoneAmtlicheNr :: Text } +instance ÖPNVDatum FlaechenZone where + tableName _ = "FLAECHEN_ZONE" + tableNumber _ = 571 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . flaechenBasisVersion) + , ("FL_ZONE_TYP_NR", ÖNum 1, F . flaechenZoneTypNr) + , ("FL_ZONE_NR", ÖNum 6, F . flaechenZoneNr) + , ("FL_ZONE_KUERZEL", ÖChar 8, F . flaechenZoneKuerzel) + , ("FL_ZONE_NAME", ÖChar 40, F . flaechenZoneName) + , ("FL_AMTLICHE_NR", ÖChar 20, F . flaechenZoneAmtlicheNr) + ] -- | 539: Zuordnung der Orte zu Flächenzonen -- nirgendwo referenziert, ist optional data FlZoneOrt = FlZoneOrt - { flzoneortBasisVersion :: Integer - , flzoneortTypNr :: Int - , flzoneortNr :: Integer - , flzoneortOnrTypNr :: OnrTypNr - , flzoneortOrtNr :: Integer + { flzoneBasisVersion :: Int + , flzoneTypNr :: Int + , flzoneNr :: Int + , flzoneOnrTypNr :: OnrTypNr + , flzoneOrtNr :: Int } +instance ÖPNVDatum FlZoneOrt where + tableName _ = "FL_ZONE_ORT" + tableNumber _ = 539 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . flzoneBasisVersion) + , ("FL_ZONE_TYP_NR", ÖNum 1, F . flzoneTypNr) + , ("FL_ZONE_NR", ÖNum 6, F . flzoneNr) + , ("ONR_TYP_NR", ÖNum 2, F . flzoneOnrTypNr) + , ("ORT_NR", ÖNum 6, F . flzoneOrtNr) + ] + -- TODO: this probably has more fields? data ZoneTypNr = Gebietskörperschaft | Verkehrszonen + deriving Show + +instance ÖPNVEncode ZoneTypNr where + encode Gebietskörperschaft = encode (1 :: Int) + encode Verkehrszonen = encode (1 ::Int) -- | 572: Typen von Flächenzonen (Gebietskörperschaft) data MengeFlaechenZoneTyp = MengeFlaechenZoneTyp - { flaechenzoneBasisVeresion :: Integer - , flaechenzoneZoneTypNr :: ZoneTypNr - , flaechenzoneTypText :: Text + { mflzoneBasisVersion :: Int + , mflzoneTypNr :: ZoneTypNr + , mflzoneTypText :: Text } +instance ÖPNVDatum MengeFlaechenZoneTyp where + tableName _ = "MENGE_FLAECHEN_ZONE_TYP" + tableNumber _ = 572 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . mflzoneBasisVersion) + , ("FL_ZONE_TYP_NR", ÖNum 1, F . mflzoneTypNr) + , ("FL_ZONE_TYP_TEXT", ÖChar 40, F . mflzoneTypText) + ] + -- | 540 -- nirgendwo fremdschlüssel, optional data SelFztFeldZp = SelFztFeldZp - { selfztfeldBasisVersion :: Integer - , selfztfeldBereichnr :: Int - , selfztfeldFgrNr :: Integer + { selfztfeldBasisVersion :: Int + , selfztfeldBereichNr :: Int + , selfztfeldFgrNr :: Int , selfztfeldOnrTypNr :: OrtTypNr - , selfztfeldOrtNr :: Integer - , selfztfeldSelZiel :: Integer + , selfztfeldOrtNr :: Int + , selfztfeldSelZiel :: Int , selfztfeldSelZielTyp :: Int -- this one can only be 1 or 2?? - , selfztfeldZpOnr :: Integer + , selfztfeldZpOnr :: Int , selfztfeldZpTyp :: Int -- this one must always be 7??? , selfztfeldSelFztZp :: Int } - +instance ÖPNVDatum SelFztFeldZp where + tableName _ = "SEL_FZT_FELD_ZP" + tableNumber _ = 540 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . selfztfeldBasisVersion) + , ("BEREICH_NR", ÖNum 3, F . selfztfeldBereichNr) + , ("FGR_NR", ÖNum 9, F . selfztfeldFgrNr) + , ("ONR_TYP_NR", ÖNum 2, F . selfztfeldOnrTypNr) + , ("ORT_NR", ÖNum 6, F . selfztfeldOrtNr) + , ("SEL_ZIEL", ÖNum 6, F . selfztfeldSelZiel) + , ("SEL_ZIEL_TYP", ÖNum 2, F . selfztfeldSelZielTyp) + , ("ZP_ONR", ÖNum 6, F . selfztfeldZpOnr) + , ("ZP_TYP", ÖNum 2, F . selfztfeldZpTyp) + , ("SEL_FZT_ZP", ÖNum 6, F . selfztfeldSelFztZp) + ] ---- Liniendaten @@ -363,12 +680,12 @@ data SelFztFeldZp = SelFztFeldZp -- | 246: Linienverlauf als aufzählung von halten -- nirgendwo sonst fremdschlüssel data LidVerlauf = LidVerlauf - { verlaufBasisVersion :: Integer - , verlaufLfdNr :: Integer + { verlaufBasisVersion :: Int + , verlaufLfdNr :: Int , verlaufNr :: Int , verlaufStrLiVar :: Text , verlaufOnrTypNr :: OrtTypNr - , verlaufOrtNr :: Integer + , verlaufOrtNr :: Int , verlaufZnrNr :: Int , verlaufAnrNr :: Maybe Int , verlaufEinfangbereich :: Int @@ -380,10 +697,30 @@ data LidVerlauf = LidVerlauf , verlaufBedarfshalt :: Bool } +instance ÖPNVDatum LidVerlauf where + tableName _ = "LID_VERLAUF" + tableNumber _ = 246 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . verlaufBasisVersion) + , ("LI_LFD_NR", ÖNum 3, F . verlaufLfdNr) + , ("LI_NR", ÖNum 6, F . verlaufNr) + , ("STR_LI_VAR", ÖChar 6, F . verlaufStrLiVar) + , ("ONR_TYP_NR", ÖNum 2, F . verlaufOnrTypNr) + , ("ORT_NR", ÖNum 6, F . verlaufOrtNr) + , ("ZNR_NR", ÖNum 4, F . verlaufZnrNr) + , ("ANR_NR", ÖNum 4, F . verlaufAnrNr) + , ("EINFANGBEREICH", ÖNum 3, F . verlaufEinfangbereich) + , ("LI_KNOTEN", ÖNum 1, F . verlaufLiKnoten) + , ("PRODUKTIV", ÖNum 1, F . verlaufProduktiv) + , ("EINSTEIGEVERBOT", ÖNum 1, F . verlaufEinsteigeverbot) + , ("AUSSTEIGEVERBOT", ÖNum 1, F . verlaufAussteigeverbot) + , ("INNERORTSVERBOT", ÖNum 1, F . verlaufInnerortsverbot) + , ("BEDARFSHALT", ÖNum 1, F . verlaufBedarfshalt) + ] -- | 226 data RecLid = RecLid - { reclidBasisVersion :: Integer + { reclidBasisVersion :: Int , reclidLiNr :: Int , reclidStrLiVar :: Text , reclidRoutenNr :: Int @@ -393,46 +730,95 @@ data RecLid = RecLid , reclidLiKuerzel :: Text , reclidLidname :: Text , reclidRoutenArt :: Fahrtart - , reclidLinienCode :: Maybe Integer + , reclidLinienCode :: Maybe Int , reclidLinienId :: Text -- ^ this one might just be a byte array?? } +instance ÖPNVDatum RecLid where + tableName _ = "REC_LID" + tableNumber _ = 226 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . reclidBasisVersion) + , ("LI_NR", ÖNum 6, F . reclidLiNr) + , ("STR_LI_VAR", ÖChar 6, F . reclidStrLiVar) + , ("ROUTEN_NR", ÖNum 4, F . reclidRoutenNr) + , ("LI_RI_NR", ÖNum 3, F . reclidLiRiNr) + , ("BEREICH_NR", ÖNum 3, F . reclidBereichNr) + , ("LI_KUERZEL", ÖChar 6, F . reclidLiKuerzel) + , ("LIDNAME", ÖChar 40, F . reclidLidname) + , ("ROUTEN_ART", ÖNum 2, F . reclidRoutenArt) + , ("LINIEN_CODE", ÖNum 2, F . reclidLinienCode) + , ("LinienID", ÖChar 128, F . reclidLinienId) + ] ------ Fahrplandaten -- | 715 data RecFrt = RecFrt - { recfrtBasisVersion :: Integer - , recfrtFid :: Integer + { recfrtBasisVersion :: Int + , recfrtFid :: Int , recfrtStart :: Int , recfrtLiNr :: Int , recfrtTagesartNr :: Int , recfrtLiKuNr :: Int , recfrtFahrtartNr :: Fahrtart - , recfrtFgrNr :: Integer - , recfrtUmUid :: Maybe Integer - , recfrtZugNr :: Integer + , recfrtFgrNr :: Int + , recfrtStrLiVar :: Text + , recfrtUmUid :: Maybe Int + , recfrtZugNr :: Int , recfrtDurchbiFrtStart :: Bool , recfrtDurchbiFrtEnde :: Bool , recfrtFahrtBezeichner :: Text - , recfrtZielEnergieMenge :: Integer + , recfrtZielEnergieMenge :: Int } +instance ÖPNVDatum RecFrt where + tableName _ = "REC_FRT" + tableNumber _ = 715 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recfrtBasisVersion) + , ("FRT_FID", ÖNum 10, F . recfrtFid) + , ("FRT_START", ÖNum 6, F . recfrtStart) + , ("LI_NR", ÖNum 6, F . recfrtLiNr) + , ("TAGESART_NR", ÖNum 3, F . recfrtTagesartNr) + , ("LI_KU_NR", ÖNum 6, F . recfrtLiKuNr) + , ("FAHRTART_NR", ÖNum 2, F . recfrtFahrtartNr) + , ("FGR_NR", ÖNum 9, F . recfrtFgrNr) + , ("STR_LI_VAR", ÖChar 6, F . recfrtStrLiVar) + , ("UM_UID", ÖNum 8, F . recfrtUmUid) + , ("ZUGNR", ÖNum 7, F . recfrtZugNr) + , ("DURCHBI_FRT_START", ÖNum 1, F . recfrtDurchbiFrtStart) + , ("DURCHBI_FRT_ENDE", ÖNum 1, F . recfrtDurchbiFrtEnde) + , ("FahrtBezeichner", ÖChar 128, F . recfrtFahrtBezeichner) + , ("ZIEL_ENERGIE_MENGE", ÖNum 6, F . recfrtZielEnergieMenge) + ] + -- | 308: Fahrtabhängiges Warten am Haltepunkt (e.g. Anschlusssicherung) -- nicht in fremdschlüsseln erwähnt, optional data RecFrtHzt = RecFrtHzt - { recfrthztBasisVersion :: Integer - , recfrthztFid :: Integer + { recfrthztBasisVersion :: Int + , recfrthztFid :: Int , recfrthztOnrTypNr :: OrtTypNr - , recfrthztOrtNr :: Integer + , recfrthztOrtNr :: Int , recfrthztZeit :: Int } +instance ÖPNVDatum RecFrtHzt where + tableName _ = "REC_FRT_HZT" + tableNumber _ = 308 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . recfrthztBasisVersion) + , ("FRT_FID", ÖNum 10, F . recfrthztFid) + , ("ONR_TYP_NR", ÖNum 2, F . recfrthztOnrTypNr) + , ("ORT_NR", ÖNum 6, F . recfrthztOrtNr) + , ("FRT_HZT_ZEIT", ÖNum 6, F . recfrthztZeit) + ] + -- | 310: Fahrzeugumläufe data RecUmlauf = RecUmlauf - { umlaufBasisVersion :: Integer + { umlaufBasisVersion :: Int , umlaufTagesartNr :: Int , umlaufUmUid :: Int , umlaufAnfOrt :: Int @@ -442,6 +828,19 @@ data RecUmlauf = RecUmlauf , umlaufFzgTypNr :: Maybe Int } +instance ÖPNVDatum RecUmlauf where + tableName _ = "REC_UMLAUF" + tableNumber _ = 310 + tableSchema _ = + [ ("BASIS_VERSION", ÖNum 9, F . umlaufBasisVersion) + , ("TAGESART_NR", ÖNum 3, F . umlaufTagesartNr) + , ("UM_UID", ÖNum 8, F . umlaufUmUid) + , ("ANF_ORT", ÖNum 6, F . umlaufAnfOrt) + , ("ANF_ONR_TYP", ÖNum 2, F . umlaufAnfOnrTyp) + , ("END_ORT", ÖNum 6, F . umlaufEndOrt) + , ("END_ONR_TYP", ÖNum 2, F . umlaufEndOnrTyp) + , ("FZG_TYP_NR", ÖNum 3, F . umlaufFzgTypNr) + ] -- TODO: ÖPNV DM 4.1 UMS_Z_RI Bezeichner der Linien-Richtung data Richtung @@ -449,7 +848,7 @@ data Richtung ------ Anschlussdaten data Einzelanschluss = Einzelanschluss - { einzelBasisVersion :: Integer + { einzelBasisVersion :: Int , einzelBasisEinanNr :: Int , einzelBasisAnschlussName :: Text , einzelBasisAnschlussGruppe :: Text @@ -471,7 +870,7 @@ data Einzelanschluss = Einzelanschluss } data RecUms = RecUms - { recumsBasisVersion :: Integer + { recumsBasisVersion :: Int , recumsEinanNr :: Int , recumsTagesartNr :: Int , recumsUmsBeginn :: Int |