Rezervační systém
|
Hlavní třída databáze. ...
#include <MemoryDb.h>
Veřejné metody | |
CMemoryDb (void) | |
defaultní konstruktor ... | |
CMemoryDb (std::istream *cStream) | |
konstruktor - obnovení ze zálohy ... | |
virtual | ~CMemoryDb () |
destruktor | |
virtual unsigned | AddCity (const char *pszName) |
přidání města ... | |
virtual bool | AddCityAlias (const char *pszName, unsigned uiId) |
přidání zkratky k nějakému existujícímu městu ... | |
virtual bool | DeleteCity (const char *pszName) |
smazání města podle jména ... | |
virtual unsigned | FindCity (const char *pszName) |
nalezení města podle názvu ... | |
virtual bool | CityInfo (unsigned uiCity, RCityInfo *prInfo, unsigned *puiLinesOut, unsigned *puiLinesIn) |
získání informací o městě ... | |
virtual unsigned | AddBusPlan (const char *pszName, unsigned uiSeats, const CBlobEx< std::string > *cData) |
přidání plánu autobusu ... | |
virtual bool | DeleteBusPlan (const char *pszName) |
smazání plánu autobusu ... | |
virtual unsigned | FindBusPlan (const char *pszName) |
nalezení plánu autobusu ... | |
virtual bool | BusPlanInfo (unsigned uiPlan, RPlanInfo *prInfo, unsigned *puiBuses, CBlobEx< std::string > *cData) |
získání informací o plánu ... | |
virtual unsigned | AddBus (const RBusInfo *prBus) |
přidání autobusu ... | |
virtual bool | DeleteBus (unsigned uiBus) |
smazání autobusu ... | |
virtual unsigned | FindBus (unsigned uiFrom, unsigned uiTo, time_t tLeaveTime) |
nalezení autobusu ... | |
virtual bool | BusInfo (unsigned uiBus, RBusInfo *prInfo, bool *pfEnabled, unsigned *puiSeats, std::list< unsigned > *cFreeSeats) |
získání informací o autobusu ... | |
virtual bool | EnableBus (unsigned uiBus) |
povolení autobusu ... | |
virtual bool | DisableBus (unsigned uiBus) |
zakázání autobusu ... | |
virtual unsigned | NewCustomer (void) |
unikátní ID pro nového zákazníka ... | |
virtual bool | AskSeats (unsigned uiBus, std::list< unsigned > *cSeats, unsigned uiCustomer) |
dočasné zamluvení sedadel ... | |
virtual bool | LockSeats (unsigned uiBus, std::list< unsigned > *cSeats, unsigned uiCustomer) |
trvalá rezervace sedadel ... | |
virtual bool | UnlockSeats (unsigned uiBus, std::list< unsigned > *cSeats, unsigned uiCustomer) |
zrušení rezervace sedadel ... | |
virtual unsigned | NextBus (unsigned uiBus) |
nalezení dalšího autobusu v pořadí ... | |
virtual unsigned | NextCity (unsigned uiCity) |
nalezení dalšího města v pořadí ... | |
virtual unsigned | NextPlan (unsigned uiPlan) |
nalezení dalšího plánu v pořadí ... | |
virtual bool | ListCity (const char *pszFrom, std::string *strName) |
nalezení dalšího města v abecedním pořadí ... | |
virtual bool | ListAlias (const char *pszFrom, std::string *strAlias, std::string *strCity) |
nalezení dalšího aliasu města v abecedním pořadí ... | |
virtual bool | Backup (std::ostream *cStream) |
záloha databáze ... | |
virtual bool | Info (RDbInfo *prInfo) |
informace o databázi ... | |
virtual void | OnStart (void) |
akce při spuštění serveru ... | |
virtual void | OnStop (void) |
akce při zastavení serveru ... | |
void | SetDataDir (const char *pszDataDir) |
adresář pro datové soubory ... | |
Veřejné metody dědí se z CQuery | |
virtual | ~CQuery ()=0 |
destruktor ... | |
Veřejné metody dědí se z CAdmin | |
virtual | ~CAdmin ()=0 |
destruktor ... | |
Friends | |
class | CWriteJournal |
třída pro zápis do žurnálu při modifikaci dat v databázi | |
Hlavní třída databáze.
Třída obsahuje metody pro práci s autobusy, městy a plány autobusů. Implementuje rozhraní CQuery pro klientská volání a CAdmin pro správu a zapouzdřuje tak veškeré operace s databází. Třída vlastně obsahuje jak vlastní databázový stroj, tak zajišťuje uložení dat pomocí kontajnerů C++ (tedy přímo v operační paměti počítače). Kromě vlastních datových kontajnerů pro města, plány a autobusy implementuje i pomocné kontajnery (indexy) pro rychlé vyhledávání podle různých kritérií. Pro snazší vyhledávání měst podporuje i jejich pomocná jména (aliasy).
Základní entity, se kterými databáze pracuje, jsou reprezentovány třídami:
Počet sedadel v konkrétním autobusu je dán jeho plánem a v průběhu životnosti je pevně daný, přístup k jednotlivým sedadlům je pomocí indexu, pro uložení je zvolen std::vector<CSeat>
. Ostatní třídy jsou uloženy ve stromové struktuře, která zaručuje rychlé vyhledávání. Použitým kontajnerem je std::set
(např. tedy std::set<CCity>
), setřídění je podle unikátního čísla. Pro vyhledávání podle dodatečných kritérií (např. města dle názvu nebo autobusu dle koncových měst a času odjezdu) jsou součástí databáze příslušné indexy, také kontajnery typu std::set
, které však pro úsporu místa obsahují pouze odkazy na hledané objekty a jsou setříděny podle požadovaného kritéria. Aliasy měst jsou implementovány jako asociativní pole pomocí std::map
.
Objekty CCity, CPlan a CBus obecně nejsou po dobu svého života konstantní. Přesto mohou být bez problémů uloženy v asociativních kontajnerech, neboť položky použité pro uspořádání konstantní zůstávají (tyto jsou inicializovány v konstruktoru a následně již není možné je měnit).
Předpokládá se, že k databázi může současně přistupovat více klientů najednou (tj. volání metod může probíhat současně z více vláken). Proto je implementace třídy vybavena zámky typu více čtení/jeden zápis, které na jedné straně zajišťují konzistenci dat, na druhé se snaží minimalizovat prostoje (podrobněji viz Zamykání položek databáze v operační paměti).
Řešením otázky bezpečnosti uložení dat v operační paměti se podrobněji zabývá kapitola Otázka nepersitentní povahy databáze.
CMemoryDb::CMemoryDb | ( | void | ) |
defaultní konstruktor
Vytvoření prázdné databáze, tj. inicializace všech součástí a vytvoření prázdných kontajnerů měst, jejich aliasů, plánů a autobusů včetně prázdných indexů.
CMemoryDb::CMemoryDb | ( | std::istream * | cStream | ) |
konstruktor - obnovení ze zálohy
Databáze je vytvořena ve stavu, který odpovídá dříve provedené záloze (pomocí metody CMemoryDb::Backup). Všechny indexy jsou správně synchronizovány s vlastními datovými kontajnery.
Pokud při obnově ze zálohy dojde k nějaké chybě (nesprávný formát dat, chyba při čtení z proudu apod.) je vytvořena prázdná databáze.
Více viz Zálohování a obnova databáze.
|
virtual |
přidání autobusu
Vytvoření autobusu s uvedenými daty a jeho přidání do databáze. Identifikační číslo (položka uiId
struktury RBusInfo
) nemusí být vyplněno, neboť dojde k jeho naplnění jedinečným číslem až při zpracování požadavku.
[in] | prBus | struktura RBusInfo s daty potřebnými k vytvoření nového autobusu, |
Implementuje CQuery.
|
virtual |
přidání plánu autobusu
[in] | pszName | název plánu/typu autobusu |
[in] | uiSeats | počet sedadel |
[in] | cData | binární data rozvržení sedadel |
Implementuje CQuery.
|
virtual |
přidání města
[in] | pszName | jméno města |
Implementuje CQuery.
|
virtual |
přidání zkratky k nějakému existujícímu městu
[in] | pszName | název zkratky či dalšího názvu |
[in] | uiId | ID existujícího města, se kterým chceme propojit tuto zkratku |
Implementuje CQuery.
|
virtual |
dočasné zamluvení sedadel
Dočasné zamluvení sedadel, které po určitém čase vyprší.
[in] | uiBus | ID autobusu |
[in,out] | cSeats | seznam sedadel k rezervaci, neúspěšná sedadla budou smazána ze seznamu |
[in] | uiCustomer | ID zákazníka |
Implementuje CQuery.
|
virtual |
záloha databáze
Provedení zálohy databáze do výstupního proudu je konzistentním zachycením jejího obrazu v nějakém okamžiku. K tomu získá výhradní přístup k databázi (pro CMemoryDb viz Zamykání položek databáze v operační paměti).
[in] | cStream | výstupní proud pro provedení zálohy. Předpokládá se, že proud je již otevřen do režimu umožňující binární zápis dat. Přitom je lhostejno, zda je spojen se souborem, TCP soketem či jiným zařízením. Po dokončení operace není proud uzavřen (je pouze synchronizován), to musí učinit volající. |
Implementuje CAdmin.
|
virtual |
získání informací o autobusu
[in] | uiBus | ID autobusu |
[out] | prInfo | struktura RBusInfo, která bude naplněná daty |
[out] | pfEnabled | přepínač, zda jsou povoleny změny v autobusu |
[out] | puiSeats | počet sedadel autobusu |
[out] | cFreeSeats | seznam volných sedadel |
Implementuje CQuery.
|
virtual |
získání informací o plánu
[in] | uiPlan | ID plánu autobusu |
[out] | prInfo | struktura RPlanInfo naplněná daty |
[out] | puiBuses | počet autobusů využívajících tento plán |
[out] | cData | binární data s rozložením sedadel |
Implementuje CQuery.
|
virtual |
získání informací o městě
[in] | uiCity | ID města |
[out] | prInfo | struktura RCityInfo k vyplnění daty |
[out] | puiLinesOut | počet autobusů odjíždějících z tohoto města |
[out] | puiLinesIn | počet autobusů přijíždějících do tohoto města |
Implementuje CQuery.
|
virtual |
smazání autobusu
[in] | uiBus | ID autobusu určeného ke smazání |
Implementuje CQuery.
|
virtual |
smazání plánu autobusu
Vymazání plánu autobusu z kontajneru, může být provedeno pouze v případě, že neexistuje žádný autobus s tímto plánem.
[in] | pszName | název plánu autobusu |
Implementuje CQuery.
|
virtual |
smazání města podle jména
Provede smazání města z kontajneru a zároveň vymazání všech případných aliasů názvu města.
[in] | pszName | název či alias města |
Implementuje CQuery.
|
virtual |
zakázání autobusu
Zakáže provádět změny v rezervacích.
[in] | uiBus | ID autobusu |
Implementuje CQuery.
|
virtual |
povolení autobusu
Povolí provádět změny v rezervacích.
[in] | uiBus | ID autobusu |
Implementuje CQuery.
|
virtual |
nalezení autobusu
Funkce pro nalezení autobusu z města uiFrom do města uiTo a s časem odjezdu rovným nebo nejbližším větším času tLeaveTime.
[in] | uiFrom | ID výchozího města |
[in] | uiTo | ID cílového města |
[in] | tLeaveTime | čas, od kterého hledáme shodu (tj. dolní hranice času odjezdu) |
Implementuje CQuery.
|
virtual |
nalezení plánu autobusu
Hledání plánu autobusu podle zadaného jména.
[in] | pszName | název plánu autobusu |
Implementuje CQuery.
|
virtual |
nalezení města podle názvu
Hledání města probíhá nejprve v normálních názvech měst a v případě neúspěchu ve zkratkách (aliasech)
[in] | pszName | název či alias města |
Implementuje CQuery.
|
virtual |
informace o databázi
Získání počtu objektů jednotlivých typů v databázi.
[in] | prInfo | ukazatel na struktutu, která bude naplněna požadovanými údaji. |
Implementuje CAdmin.
|
virtual |
nalezení dalšího aliasu města v abecedním pořadí
Najde další alias v abecedním pořadí.
[in] | pszFrom | alias, od kterého hledáme následující |
[out] | strAlias | alias dalšího města v pořadí |
[out] | strCity | jméno města odpovídající aliasu |
Implementuje CQuery.
|
virtual |
nalezení dalšího města v abecedním pořadí
Najde další město v abecedním pořadí.
[in] | pszFrom | název města, od kterého hledáme následující |
[out] | strName | jméno dalšího města v pořadí |
Implementuje CQuery.
|
virtual |
trvalá rezervace sedadel
[in] | uiBus | ID autobusu |
[in,out] | cSeats | seznam sedadel k rezervaci, neúspěšná sedadla budou smazána ze seznamu |
[in] | uiCustomer | ID zákazníka |
Implementuje CQuery.
|
virtual |
unikátní ID pro nového zákazníka
Operace rezervace sedadel je vždy vázána na konkrétního zákazníka identifikovaného jedinečným číslem. Díky tomu pak může zákazník své rezervace dodatečně zrušit nebo potvrdit dočasnou rezervaci.
Implementuje CQuery.
|
virtual |
nalezení dalšího autobusu v pořadí
Najde další autobus podle ID.
[in] | uiBus | ID autobusu, od kterého hledáme následující |
Pomocí této metody je možné sekvenčně procházet kontajner autobusů (zapouzdřený ve třídě CBuses). Odpovídající kousek kódu může vypadat např. následovně
Metodu můžeme využít např. v situaci, kdy potřebujeme zakázat rezervace ve všech autobusech, které odjíždějí během následující hodiny (abychom mohli předat řidičům konečný seznam rezervovaných sedadel).
Implementuje CQuery.
|
virtual |
nalezení dalšího města v pořadí
Najde další město podle ID.
[in] | uiCity | ID města, od kterého hledáme následující |
Implementuje CQuery.
|
virtual |
nalezení dalšího plánu v pořadí
Najde další plán podle ID.
[in] | uiPlan | ID plánu, od kterého hledáme následující |
Implementuje CQuery.
|
virtual |
akce při spuštění serveru
Provádí inicializaci žurnálovacího mechanismu, který zajišťuje zachování dat i v případě neočekávaného pádu aplikace.
Implementuje CAdmin.
|
virtual |
akce při zastavení serveru
Po zastavení komunikačních serverů se provede uložení paměťové databáze do perzistentní podoby (do diskového souboru). Tím je zajištěno uchování dat i po ukončení celého serveru.
Implementuje CAdmin.
void CMemoryDb::SetDataDir | ( | const char * | pszDataDir | ) |
adresář pro datové soubory
Nastavení adresáře pro soubory s interní zálohou databáze a žurnálu.
[in] | pszDataDir | cesta k adresáři - prázdný řetězec pro aktuální adresář, jinak absolutní nebo relativní cesta zakončená backslash. |
|
virtual |
zrušení rezervace sedadel
[in] | uiBus | ID autobusu |
[in,out] | cSeats | seznam sedadel k uvolnění, neúspěšná sedadla budou smazána ze seznamu |
[in] | uiCustomer | ID zákazníka |
Implementuje CQuery.