Hlavní části
Klientskou aplikaci tvoří tři základní bloky - uživatelské rozhraní, logika klienta a modul pro připojení k serveru. Schematicky to vystihuje obrázek na hlavní stránce včetně jejich vzájemné interakce.
Přeložená klientská aplikace se skládá z jediného spustitelného souboru brs_client.exe
. V závislosti na nastavení souboru projektu mohou být ke spuštění potřeba běhové knihovny Microsoft C++ RTL v příslušné verzi, obvykle se umisťují do systémových adresářů (nebo mohou být přilinkovány přímo do aplikace). Dále aplikace používá jen knihovny, které jsou nedílnou součástí operačního systému.
- Logika klienta je ústředním modulem klientské aplikace. Zpracovává příkazy přijaté od uživatelského rozhraní, dále je rozkládá na jednotlivé "atomické" příkazy (tj. takové, které jsou přímo podporovány databázovým rozhraním CQuery), které pomocí databázového rozhraní postupně zpracovává. Mezivýsledky si interně ukládá a nakonec zobrazuje výsledky obsluze pomocí uživatelského rozhraní. Pokud dojde k nějaké chybě parametrů či nedostatečnému zadání, je tento stav ohlášen obsluze. Na rozdíl od jednoduchých příkazů databázového rozhraní, jež jsou bezstavové, logika klienta si ukládá své mezistavy a v řadě situací je podstatná správná sekvence příkazů. Typickým příkladem může být to, že vlastní rezervace sedadel příkazem
RESERVE
může být úspěšně provedena až po nastavení aktuálního autobusu příkazem BUS
(podrobněji v dalším).
Modul klientské logiky je implementován v třídě CLogic. Rozhraní třídy zhruba odpovídá jednotlivým příkazům přijatým od uživatelského rozhraní. Pomocí uloženého odkazu na rozhraní CQuery (které je implementováno v modulu pro meziprocesovou komunikaci) se dotazuje databáze. Potřebné stavové proměnné jsou uloženy v privátních datových položkách.
- Uživatelské rozhraní slouží k interakci aplikace s obsluhou. V případě konzolové aplikace je poměrně jednoduché - obsluha zadává příkazy pomocí klávesnice (v textové podobě), výsledky jsou zobrazovány na terminálu. Z hlediska programu je zpracováván standardní vstup programu a výsledky jsou odesílány na standardní výstup. To přináší možnost zpracování předem připravených dávkových souborů např. pro pravidelnou údržbu nebo jiné rutinní opakující se činnosti. Provedeme to pomocí přesměrování vstupu prostředky operačního systému, např.
brs_client < fill_db.txt
pro vstup dat z předem připraveného (textového) souboru.
Uživatelské rozhraní je naprogramováno ve třídách CClientApp a CGraphics. První z nich obsluhuje hlavní smyčku - příjem příkazu (rozeznání příkazu a kontrola parametrů), jeho zpracování (předáním modulu logiky) a výstup výsledků. Třída CGraphics pak slouží přímo k obsluze terminálu - obsahuje metody pro čtení ze vstupu a výpis různých druhů údajů.
Klientská aplikace má dva módy - základní pro obyčenou pokladní za přepážkou a pak s rozšířenou funkčností, který je určen pro dispečery. Základní mód obsahuje pouze příkazy find
, next
, bus
, reserve
, unlock
, city
, help
a exit
(viz Popis příkazů). Rozšířená verze obsahuje všechny níže zmíněné příkazy.
- Modul pro meziprocesovou komunikaci zajišťuje spojení se serverem a předávání informací oběma směry. Touto problematikou se podrobně zabývá oddíl Meziprocesová komunikace.
Konfigurace
U klientské aplikace je potřeba konfigurovat jednak parametry připojení k serveru a dále zda chceme základní či rozšířenou verzi klienta. To znamená druh transportu a bližší specifikace přípojného bodu na straně serveru. Uvedené parametry klietská aplikace očekává v souboru brs_client.conf
ve stejném adresáři jako je vlastní spustitelný soubor. Jedná se o jednoduchý textový soubor, jehož příklad následuje:
# Bus Reservation System
#
# konfigurace klientské aplikace
#
# typ transportu pro připojení k serveru - možnosti tcp, msg
transport=tcp
# přípojný bod na straně serveru - IP adresa a port pro TCP, jméno okna pro zprávy Windows
endpoint=localhost:25100
# přepínání mezi základní (defaultní) a rozšířenou verzí klienta
#full_client=1
Podstatné jsou řádky uvozené slovy transport
a endpoint
, za rovnítkem přímo následuje parametr. Řádky uvozené znakem #
jsou komentáře, při zpracování souboru se ignorují.
Na základě zvoleného druhu transportu se v klientské aplikaci vytváří instance třídy CClientTcp nebo CClientMsg, přípojný bod se předává konstruktoru příslušné třídy. Podrobnosti o podporovaných formátech lze nalézt v dokumentaci konstruktorů uvedených tříd.
Je zřejmé, že nastavení klientské a serverové aplikace (viz) spolu musí korespondovat, jinak se nenaváže komunikace mezi nimi. V případě použití TCP protokolu je ještě potřeba zkontrolovat (a případně upravit) nastavení firewallu.
Poslední konfigurační položka (full_client
) určuje, zda aplikace bude pracovat v normálním nebo dispečerském režimu. Odlišnost je v tom, že dispečerský režim má zpřístupněny všechny příkazy, režim normální obsluhy nemá umožněno vkládat a vyjímat objekty (města, autobusy apod.).
Popis příkazů
V okamžiku, kdy je aplikace připravena přijmout další příkaz, zobrazí se prompt ve tvaru >
. Zadání jednotlivého příkazu se potvrdí stiskem ENTER
. Příkazy (jednoduchá anglická slova) lze vkládat bez ohledu na velikost písmen, u parametrů (např. jména měst) však již na velikosti písmen záleží. Víceslovné parametry (např. Nove Mesto nad Metuji) vkládáme do uvozek. Jednotlivé parametry jsou odděleny mezerou.
- Poznámka
- Otázku použití národních znakových sad jsem neřešil (důvody viz dále), proto je v následujícím možno nalézt ceska jména měst.
Vkládání a vyjímání objektů
- Pozor
- Příkazy v této sekci jsou dostupné pouze z rozšířené (dispečerské) verze klientské aplikace.
- ADDCITY
Přidání nového města do databáze. Příkaz se provede, pokud město se zadaným názvem nebo jeho alias již v databázi není.
Příklad:> ADDCITY "Kropacova Vrutice"
OK. City number: 58
- Parametry
-
- ADDCITYALIAS
Přidání aliasu (pomocného jména) k již existujícímu městu. V případě dlouhých názvů měst to může výrazně usnadnit činnost obsluhy. Město může mít i více aliasů.
Příklad:> ADDCITYALIAS vrutice "Kropacova Vrutice"
OK
> ADDCITYALIAS krvrut "Kropacova Vrutice"
OK
- Parametry
-
alias | alias (pomocný název) pro město |
město | název existujícího města |
- DELCITY
Vymazání města z databáze. Operace úspěšně proběhne pouze v případě, kdy se město nevyskytuje jako počáteční nebo koncové město některé autobusové linky. Zároveň s městem jsou vymazány všechny jeho případné aliasy.
Příklad:> DELCITY "Kropacova Vrutice"
OK
- Parametry
-
město | název města, které má být vymazáno |
- ADDBUSPLAN
Přidání nového typu autobusu společně s plánkem rozmístění sedadel. Plánu je přiřazeno jméno pro snadné odkazování. V současné době je podporován pouze plánek v textové podobě.
Příklad:> ADDBUSPLAN Karosa956 49 "C:\Users\Mirek\Dokumenty\brs\karosa956.txt"
OK. Plan number: 5
- Parametry
-
název | symbolické jméno plánu autobusu |
sedadel | počet sedadel, které autobus nabízí cestujícím |
soubor | cesta (relativní či absolutní) k souboru, který obsahuje textovou podobu plánu autobusu |
Textový plánek je používán některými příkazy pro zobrazování volných či rezervovaných sedadel. Sedadla, která do výběru nepatří, jsou proškrtnuta (viz níže příkazy BUS
a CLOSE
). K tomu je potřeba, aby každé sedadlo v plánku bylo před i za číslem odděleno mezerou. Další součásti (popis, umístění sedadla řidiče, dveří, toalety atd.) jsou zcela libovolné. Příklad textového plánku následuje. Irisbus Iliade
+ ----------------- -------------------+
| 1 8 9 16 17 WC 28 29 36 37 44 45 |
| 2 7 10 15 18 27 30 35 38 43 46 |
| 47 |
| 3 6 11 14 19 22 23 26 31 34 39 42 48 |
| D 4 5 12 13 20 21 24 25 32 33 40 41 49 |
+------------------------------------------+
- DELBUSPLAN
Vymazání existujícího druhu autobusu z databáze. Operace úspěšně proběhne pouze v případě, že žádný autobus v databázi odkazovaný plán nevyužívá.
Příklad:> DELBUSPLAN Karosa956
OK
- Parametry
-
název | symbolické jméno plánu autobusu k vymazání |
- ADDBUS
Přidání autobusového spoje do databáze. Spoj je určen počátečním a cílovým městem a časem odjezdu - tento souhrn údajů musí být jedinečný. Zároveň je mu přiřazeno číslo linky (např. pro pozdější návaznost na jízdní řád apod.) a druh autobusu, který mj. určuje i počet sedadel.
Příklad:> ADDBUS 1026 "Usti nad Labem" pha 13:36 Karosa956
OK. Bus number: 615
- Parametry
-
linka | číslo autobusové linky |
počátek | počáteční město autobusové linky (může být i alias) |
konec | koncové město autobusové linky (může být i alias) |
odjezd | čas odjezdu z počátečního města, povolené formáty jsou typu 7:32 pro autobusy, které odjíždění stejného dne nebo 7:32-2.10.2013 s určením datumu |
plán | symbolické jméno plánu autobusu |
- DELBUS
Vymazání autobusového spoje z databáze. Není možné vymazat autobus s povolenými rezervacemi, který ještě neodjel (čas odjezdu je větší než aktuální čas).
Příklad:> DELBUS 615
OK.
- Parametry
-
autobus | číslo autobusovu k vymazání |
- CLEAR
Hromadné vymazání nepotřebných objektů z databáze, konkrétní chování je závislé na uvedeném parametru.
Příklad:> CLEAR CITY
OK. Deleted items: 6.
- Parametry
-
druh | určení typu objektů k vymazání, přípustné hodnoty jsou:
BUS - provede vymazání všech autobusových spojů, které odjely (tj. jejichž čas odjezdu je menší než aktuální čas na počítači),
CITY - provede vymazání měst (včetně odpovídajících aliasů), která nejsou použita žádným autobusovým spojem,
PLAN - provede vymazání všech plánů autobusů, které nejsou využity. |
Rezervace sedadel
- BUS
Zvolení autobusu pro rezervace sedadel. Následně je zobrazen plánek autobusu a seznam volných sedadel (tj. těch, která je možno rezervovat). Příklad:> BUS 14
OK
ID LINE FROM TO TIME PLAN
14 1023 Praha Hradec Kralove 17:00-29.12.2013 KarosaAxer
Bus plan:
Karosa Axer
+ ---------------- --------------------+
| 1 - 9 13 17 25 29 33 37 41 -- |
| 2 - 10 14 18 26 30 -- 38 42 -- |
| 47 |
| 3 7 11 -- -- 21 23 27 31 -- 39 43 48 |
| D 4 8 12 16 20 22 24 28 32 36 40 44 49 |
+------------------------------------------+
Free seats: 1-4 7-14 16-18 20-33 36-44 47-49 (total: 41)
- Parametry
-
autobus | číslo autobusu pro provádění rezervací (lze vyhledat pomocí FIND a NEXT ) |
- RESERVE
Rezervace sedadel v aktuálně vybraném autobuse (viz příkaz BUS
). Existují dvě varianty příkazu - buď uvedeme seznam konkrétních sedadel k rezervaci nebo pouze počet požadovaných sedadel a necháme jejich výběr na systému. Příkaz vypíše nabízená sedadla a čeká na potvrzení. V kladném případě provede rezervaci a vypíše potvrzení. To obsahuje všechny potřebné údaje včetně jedinečného zákaznického čísla, které je vyžadováno při případném rušení rezervace (viz UNLOCK
).
Příklad 1 (se zadáním konkrétních sedadel):> RESERVE 25,26,29,30
Seats to be reserved: 25 26 29 30
Write 'y' to continue: y
OK
Your ticket:
USER ID BUS ID CITY FROM CITY TO LEAVE TIME
2 14 Praha Hradec Kralove 17:00-18.12.2013
Reserved seats: 25-26 29-30
Příklad 2 (se zadáním počtu požadovaných sedadel):> RESERVE #6
Seats to be reserved: 1-6
Write 'y' to continue: y
OK
Your ticket:
USER ID BUS ID CITY FROM CITY TO LEAVE TIME
3 141 Karlovy Vary Plzen 07:34-18.12.2013
Reserved seats: 1-6
- Parametry
-
seznam | varianta 1 - seznam sedadel požadovaných k rezervaci (čísla oddělená čárkami) |
počet | varianta 2 - počet sedadel požadovaných k rezervaci (číslo uvozené # ) |
Současně s vypsáním nabídky sedadel je provedeno jejich dočasné zarezervování, takže sedadla jsou pro ostatní zákazníky blokována. Teprve po potvrzení je rezervace definitivní. Při odmítnutí jsou dotčená sedadla ihned uvolněna, bez odezvy (např. při výpadku spojení se serverem) jsou po uplynutí ochranné doby pokládána za volná.
- UNLOCK
Zrušení rezervace (celé nebo částečné) v aktuálně zvoleném autobuse (viz příkaz BUS
). Je vyžadováno číslo zákazníka vypsané na potvrzení o rezervaci.
Příklad 1 (se zadáním konkrétních sedadel):> UNLOCK 2 25,26
OK
Unlocked seats: 25-26 (total: 2)
Příklad 2 (storno všech sedadel rezervovaných zákazníkem):> UNLOCK 2
OK
Unlocked seats: 25-26 29-30 (total: 4)
- Parametry
-
zákazník | jedinečné číslo zákazníka, pod nímž byla rezervace provedena |
seznam | nepovinný - seznam sedadel ke zrušení rezervace (čísla oddělená čárkami) |
Vzhledem ke skutečnosti, že každá rezervace je provedena s unikátním číslem zákazníka, nehrozí nebezpečí zrušení cizí rezervace (číslo na potvrzení musí pochopitelně zkontrolovat obsluha terminálu).
Ostatní
- CITY
Vypsání existujících měst v databázi. Bez parametrů vypíše všechna města a všechny aliasy, s jedním parametrem se zúží hledání mezi městy a aliasy tak, že vypíše všechny názvy začínající dle parametru.
Příklad 1:> city
Brno
Ceske Budejovice
Pardubice
Plzen
Praha
Usti nad Labem
Zlin
brno -> Brno
cb -> Ceske Budejovice
pardubice -> Pardubice
pce -> Pardubice
pha -> Praha
plzen -> Plzen
usti -> Usti nad Labem
zlin -> Zlin
Příklad 2:> city Pr
Praha
Pr -> Praha
Prh -> Praha
- Parametry
-
prefix | nepovinný - všechny nalezené výsledky budou obsahovat tento parametr jako svůj vlastní prefix |
- HELP
Vypsání seznamu příkazů a stručné nápovědy ke každému z nich.
- EXIT
Ukončení práce s aplikací.