Rezervační systém
Veřejné metody | Friends | Seznam všech členů
Dokumentace třídy CMemoryDb

Hlavní třída databáze. ...

#include <MemoryDb.h>

Diagram dědičnosti pro třídu CMemoryDb
CQuery CAdmin CAutoIncrement CReadWriteLock

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
 

Detailní popis

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).

Db.png
Databáze z pohledu jejího uživatele a správce

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.

Dokumentace konstruktoru a destruktoru

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.

Dokumentace k metodám

virtual unsigned CMemoryDb::AddBus ( const RBusInfo prBus)
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.

Parametry
[in]prBusstruktura RBusInfo s daty potřebnými k vytvoření nového autobusu,
Návratová hodnota
ID nově vloženého autobusu nebo 0 v případě chyby (snaha o zavedení duplicitního autobusu)

Implementuje CQuery.

virtual unsigned CMemoryDb::AddBusPlan ( const char *  pszName,
unsigned  uiSeats,
const CBlobEx< std::string > *  cData 
)
virtual

přidání plánu autobusu

Parametry
[in]pszNamenázev plánu/typu autobusu
[in]uiSeatspočet sedadel
[in]cDatabinární data rozvržení sedadel
Návratová hodnota
unikátní číslo přidaného plánu nebo číslo již existujícího plány se zadaným jménem

Implementuje CQuery.

virtual unsigned CMemoryDb::AddCity ( const char *  pszName)
virtual

přidání města

Parametry
[in]pszNamejméno města
Návratová hodnota
unikátní číslo nově přidaného města či číslo již dříve existujícího města

Implementuje CQuery.

virtual bool CMemoryDb::AddCityAlias ( const char *  pszName,
unsigned  uiId 
)
virtual

přidání zkratky k nějakému existujícímu městu

Parametry
[in]pszNamenázev zkratky či dalšího názvu
[in]uiIdID existujícího města, se kterým chceme propojit tuto zkratku
Návratová hodnota
úspěch operace - false v případě, že jméno již existuje (jako město či alias) nebo pokud město s ID není v databázi

Implementuje CQuery.

virtual bool CMemoryDb::AskSeats ( unsigned  uiBus,
std::list< unsigned > *  cSeats,
unsigned  uiCustomer 
)
virtual

dočasné zamluvení sedadel

Dočasné zamluvení sedadel, které po určitém čase vyprší.

Parametry
[in]uiBusID autobusu
[in,out]cSeatsseznam sedadel k rezervaci, neúspěšná sedadla budou smazána ze seznamu
[in]uiCustomerID zákazníka
Návratová hodnota
úspěch operace - false, pokud autobus není nalezen nebo se operace nezdařila pro všechna sedadla

Implementuje CQuery.

virtual bool CMemoryDb::Backup ( std::ostream *  cStream)
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).

Parametry
[in]cStreamvý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í.
Návratová hodnota
výsledek operace
Poznámka
Problematika zálohování databáze, obnovy dat, jejich formátu atd. je podrobněji popsána na zvláštní stránce.

Implementuje CAdmin.

virtual bool CMemoryDb::BusInfo ( unsigned  uiBus,
RBusInfo prInfo,
bool *  pfEnabled,
unsigned *  puiSeats,
std::list< unsigned > *  cFreeSeats 
)
virtual

získání informací o autobusu

Parametry
[in]uiBusID autobusu
[out]prInfostruktura RBusInfo, která bude naplněná daty
[out]pfEnabledpřepínač, zda jsou povoleny změny v autobusu
[out]puiSeatspočet sedadel autobusu
[out]cFreeSeatsseznam volných sedadel
Návratová hodnota
úspěch operace - false, nebyl-li autobus nalezen
Poznámka
Výstupní parametry mohou být i NULL.

Implementuje CQuery.

virtual bool CMemoryDb::BusPlanInfo ( unsigned  uiPlan,
RPlanInfo prInfo,
unsigned *  puiBuses,
CBlobEx< std::string > *  cData 
)
virtual

získání informací o plánu

Parametry
[in]uiPlanID plánu autobusu
[out]prInfostruktura RPlanInfo naplněná daty
[out]puiBusespočet autobusů využívajících tento plán
[out]cDatabinární data s rozložením sedadel
Návratová hodnota
úspěch operace - false, pokud plán nebyl nalezen
Poznámka
Výstupní parametry mohou být i NULL.

Implementuje CQuery.

virtual bool CMemoryDb::CityInfo ( unsigned  uiCity,
RCityInfo prInfo,
unsigned *  puiLinesOut,
unsigned *  puiLinesIn 
)
virtual

získání informací o městě

Parametry
[in]uiCityID města
[out]prInfostruktura RCityInfo k vyplnění daty
[out]puiLinesOutpočet autobusů odjíždějících z tohoto města
[out]puiLinesInpočet autobusů přijíždějících do tohoto města
Návratová hodnota
úspěch operace - false, pokud město nebylo nalezeno
Poznámka
Výstupní parametry mohou být i NULL.

Implementuje CQuery.

virtual bool CMemoryDb::DeleteBus ( unsigned  uiBus)
virtual

smazání autobusu

Parametry
[in]uiBusID autobusu určeného ke smazání
Návratová hodnota
úspěch operace

Implementuje CQuery.

virtual bool CMemoryDb::DeleteBusPlan ( const char *  pszName)
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.

Parametry
[in]pszNamenázev plánu autobusu
Návratová hodnota
úspěch operace

Implementuje CQuery.

virtual bool CMemoryDb::DeleteCity ( const char *  pszName)
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.

Parametry
[in]pszNamenázev či alias města
Návratová hodnota
úspěch operace - false v případě, že město není v databázi nebo existují autobusové linky, které město používají

Implementuje CQuery.

virtual bool CMemoryDb::DisableBus ( unsigned  uiBus)
virtual

zakázání autobusu

Zakáže provádět změny v rezervacích.

Parametry
[in]uiBusID autobusu
Návratová hodnota
úspěch operace - false, nebyl-li autobus nalezen

Implementuje CQuery.

virtual bool CMemoryDb::EnableBus ( unsigned  uiBus)
virtual

povolení autobusu

Povolí provádět změny v rezervacích.

Parametry
[in]uiBusID autobusu
Návratová hodnota
úspěch operace - false, nebyl-li autobus nalezen

Implementuje CQuery.

virtual unsigned CMemoryDb::FindBus ( unsigned  uiFrom,
unsigned  uiTo,
time_t  tLeaveTime 
)
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.

Parametry
[in]uiFromID výchozího města
[in]uiToID cílového města
[in]tLeaveTimečas, od kterého hledáme shodu (tj. dolní hranice času odjezdu)
Návratová hodnota
ID nalezeného autobusu nebo 0

Implementuje CQuery.

virtual unsigned CMemoryDb::FindBusPlan ( const char *  pszName)
virtual

nalezení plánu autobusu

Hledání plánu autobusu podle zadaného jména.

Parametry
[in]pszNamenázev plánu autobusu
Návratová hodnota
ID plánu, 0 v případě neúspěchu

Implementuje CQuery.

virtual unsigned CMemoryDb::FindCity ( const char *  pszName)
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)

Parametry
[in]pszNamenázev či alias města
Návratová hodnota
ID nalezeného města nebo 0 v případě neúspěchu

Implementuje CQuery.

virtual bool CMemoryDb::Info ( RDbInfo prInfo)
virtual

informace o databázi

Získání počtu objektů jednotlivých typů v databázi.

Parametry
[in]prInfoukazatel na struktutu, která bude naplněna požadovanými údaji.
Návratová hodnota
výsledek operace

Implementuje CAdmin.

virtual bool CMemoryDb::ListAlias ( const char *  pszFrom,
std::string *  strAlias,
std::string *  strCity 
)
virtual

nalezení dalšího aliasu města v abecedním pořadí

Najde další alias v abecedním pořadí.

Parametry
[in]pszFromalias, od kterého hledáme následující
[out]strAliasalias dalšího města v pořadí
[out]strCityjméno města odpovídající aliasu
Návratová hodnota
úspěch operace (false pro dosažení konce)

Implementuje CQuery.

virtual bool CMemoryDb::ListCity ( const char *  pszFrom,
std::string *  strName 
)
virtual

nalezení dalšího města v abecedním pořadí

Najde další město v abecedním pořadí.

Parametry
[in]pszFromnázev města, od kterého hledáme následující
[out]strNamejméno dalšího města v pořadí
Návratová hodnota
úspěch operace (false pro dosažení konce)

Implementuje CQuery.

virtual bool CMemoryDb::LockSeats ( unsigned  uiBus,
std::list< unsigned > *  cSeats,
unsigned  uiCustomer 
)
virtual

trvalá rezervace sedadel

Parametry
[in]uiBusID autobusu
[in,out]cSeatsseznam sedadel k rezervaci, neúspěšná sedadla budou smazána ze seznamu
[in]uiCustomerID zákazníka
Návratová hodnota
úspěch operace - false, pokud autobus není nalezen nebo se operace nezdařila pro všechna sedadla

Implementuje CQuery.

virtual unsigned CMemoryDb::NewCustomer ( void  )
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.

Návratová hodnota
unikátní číslo zákazníka

Implementuje CQuery.

virtual unsigned CMemoryDb::NextBus ( unsigned  uiBus)
virtual

nalezení dalšího autobusu v pořadí

Najde další autobus podle ID.

Parametry
[in]uiBusID autobusu, od kterého hledáme následující
Návratová hodnota
ID nalezeného autobusu nebo 0

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ě

unsigned uiId = 0;
while((uiId = cQuery->NextBus(uiId)) != 0) {
// zpracování autobusu s číslem uiId
}

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 unsigned CMemoryDb::NextCity ( unsigned  uiCity)
virtual

nalezení dalšího města v pořadí

Najde další město podle ID.

Parametry
[in]uiCityID města, od kterého hledáme následující
Návratová hodnota
ID nalezeného města nebo 0

Implementuje CQuery.

virtual unsigned CMemoryDb::NextPlan ( unsigned  uiPlan)
virtual

nalezení dalšího plánu v pořadí

Najde další plán podle ID.

Parametry
[in]uiPlanID plánu, od kterého hledáme následující
Návratová hodnota
ID nalezeného plánu nebo 0

Implementuje CQuery.

virtual void CMemoryDb::OnStart ( void  )
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 void CMemoryDb::OnStop ( void  )
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.

Parametry
[in]pszDataDircesta k adresáři - prázdný řetězec pro aktuální adresář, jinak absolutní nebo relativní cesta zakončená backslash.
virtual bool CMemoryDb::UnlockSeats ( unsigned  uiBus,
std::list< unsigned > *  cSeats,
unsigned  uiCustomer 
)
virtual

zrušení rezervace sedadel

Parametry
[in]uiBusID autobusu
[in,out]cSeatsseznam sedadel k uvolnění, neúspěšná sedadla budou smazána ze seznamu
[in]uiCustomerID zákazníka
Návratová hodnota
úspěch operace - false, pokud autobus není nalezen nebo se operace nezdařila pro všechna sedadla
Pozor
K úspěšnému zrušení rezervace je nutné mít zákaznické ID, se kterým byla provedena rezervace.

Implementuje CQuery.


Dokumentace pro tuto třídu byla generována z následujícího souboru: