• No results found

INFORMATION_SCHEMA.KEY_COLUMN_USAGE

In document Liberec 2014 Jakub Jirouš (Page 38-75)

TABLE_SCHEMA - název databáze

TABLE_NAME - název tabulky

COLUMN_NAME - název sloupce

REFERENCED_TABLE_SCHEMA - název cílové databáze REFERENCED_TABLE_NAME - název cílové tabulky REFERENCED_COLUMN_NAME - název cílového sloupce

Zobrazování vazby mezi jednotlivými tabulkami je zpracováváno signálem, který je zavolán nad daným sloupcem. Signálu jsou jako parametr p edávány následující hod-noty: název databáze, název tabulky, název sloupce a aktuální hodnota sloupce. V rámci zpracování se do session prom nných uloží pot ebné informace identifikující, že se apli-kace nachází v režimu zobrazování cizích klí . Poté dochází k p esm rování na view vypisující všechny data z databázové tabulky. Oproti klasickému výpisu všech dat je zde na základ získaných údaj z tabulky KEY_COLUMN_USAGE zobrazen vždy pouze konkrétní ádek, se kterým tvo í sloupec z tabulky, ze které se volal signál, spole nou vazbu.

Deaktivací režimu zobrazování cizích klí se aplikace op t p epne do standardního režimu, kde již není vypisován pouze jeden ádek, ale všechny data obsažené v databá-zové tabulce.

6.11 Editace obsahu databáze

Jednou z požadovaných vlastností na aplikaci je možnost editace obsahu i struktury databáze.

( 3- /5

Prvotní navrhovaný zp sob m l využívat zp sobu p ímé editace dat za použití kni-hovny X-editable (http://vitalets.github.io/x-editable/). Knihovna umož ovala vytvá et edita ní formulá ové prvky p ímo na webové stránce bez nutnosti dalšího p esm rová-vání za použití technologií Bootstrap, jQuery-UI nebo pouze jQuery s možností výb ru z režimu zobrazení v samostatném dialogovém okn nebo v ádku.

Tento zp sob m l fungovat velmi rychle a efektivn na principu editace vždy jedné konkrétní vypsané hodnoty. Po kliknutí na vypsanou hodnotu z databázové tabulky uvnit HTML tabulky se m l zobrazit edita ní formulá ový prvek. Uživatel by provedl požado-vanou zm nu a po kliknutí mimo fokus formulá ového prvku, by došlo k odeslání formulá e, což by m lo za následek editaci hodnoty v databázi.

Navrhované ešení nefungovalo podle prvotních p edpoklad . Skript ve výchozím nastavení provád l editaci pouze nad vypsanými hodnotami. V p ípad , kdy byl p i ode-sílání edita ního formulá e na tuto událost navázán signál, který realizoval editaci dat, nebylo možné dosáhnout správné synchronizace mezi údaji uloženými v databázi a údaji, které zobrazoval skript z vypsaných hodnot.

( ! , / 0

Zp sob p ímé editace pomocí knihovny X-editable nevedl k úsp šnému ešení. Pro editaci byl tedy zvolen alternativní zp sob využívající modal okna za podpory Bootstrap pro Nette.

Modal okno je efektivní, flexibilní dialogové okno sou ástí Bootstrap, umož ující své zobrazení za pomocí jednoduchých funkcí s inteligentním nastavením výchozích hod-not [20].

Tento odlišný zp sob nabízí funk ní ešení a možnost editace všech hodnot v da-ném ádku databázové tabulky sou asn , což je nepatrn asov náro n jší o proti p edchozímu návrhu, a to p edevším z hlediska editace dlouhých datových v t u rozsáh-lých tabulek.

P ed samotnou editací hodnot je každá tabulka testována, zda obsahuje alespo je-den sloupec disponující unikátní hodnotou. Protože pokud by se provád la editace dat nad tabulkou bez sloupce s unikátní hodnotou, nebylo by možné jednozna n identifiko-vat hodnotu v tabulce ur enou k editaci. Nap íklad p i editaci tabulky bez sloupce s unikátní hodnotou, kde se v jednom sloupci vyskytují duplicitní data, by docházelo k nežádoucí zm n všech t chto dat. Proto není možnost editace dat v tabulce neobsahu-jící žádný sloupec s unikátní hodnotou povolena a uživatel je na tuto skute nost upozorn n prost ednictvím informa ní hlášky.

Po kliknutí na ikonu editace na stránce s výpisem dat z databáze, je proveden signál, kterému je jako parametr p edán unikátní název sloupce a jeho hodnota. P i zpracování signálu se nastaví prom nná $openEditModal, zap í i ující zobrazení modal okna, na hodnotu TRUE. V tomto okamžiku, z d vod p edchozího vykreslení šablony s výpisem dat z databáze, je již modal okno v šablon obsaženo, ale má pomocí javascriptové funkce deaktivovanou viditelnost.

Následn se provede požadavek na p ekreslení snippetu, ve kterém je obsaženo mo-dální okno. Presenter se ve svém cyklu dostává z fáze interak ní do fáze vykreslovací.

Do šablony se dostává prom nná $openEditModal s hodnotou TRUE pro zobrazení modal okna, kde je pomocí javascriptové funkce na základ spln né podmínky aktivována vidi-telnost edita ního modal okna.

Zdrojový kód 12: Aktivace viditelnosti edita ního modal okna

{snippet editModal}

<div class="modal fade" id="editModal" tabindex="-1"

role="dialog" aria-labelledby="editModalLabel"

aria-hidden="true">

<div class="modal-dialog">

<div class="modal-content">

<div class="modal-header">

<button type="button" class="close"

data-dismiss="modal" aria-hidden="true">

&times;

</button>

<h4 class="modal-title" id="editModalLabel">

{$table|upper}

<div class="modal-footer"></div>

</div>

</div>

</div>

{/snippet}

Zdrojový kód 13: Konstrukce modal okna v šablon Latte

Uvnit t la modal okna je umíst na komponenta rowEdit. S komponentami se v Nette zachází tak, že se jejich nová instance vytvá í p ímo v presenteru v tzv. továrni ce, za použití metody createComponent<NazevKomponenty>.

V továrni ce komponenty rowEdit dochází k vytvá ení celého edita ního formu-lá e. Pomocí d íve použitých SQL dotaz pro zjišt ní struktury databázové tabulky je zjišt na struktura všech sloupc u editovaného ádku tabulky.

Dle zjišt né struktury jednotlivého sloupce je vytvo en odpovídající formulá ový prvek. U íselných datových typ je velikost vkládaného ísla limitována rozsahem kon-krétního datového typu a údajem o znaménkovosti. Využívá se zde podpora pro vkládání specifických dat za podpory HTML5 atribut .

U textových datových typ je velikost vkládaného textu limitována délkou, která je definována strukturou tabulky.

U datových typ p edstavující údaje o ase nebo datu je využíváno rozší ení datepicker z distribuce Bootstrap pro možnost jednoduchého výb ru asu a data pomocí dialogového okna a zárove toto rozší ení zajiš uje validaci.

Obrázek 7: Dialogové okno pro výb r asu a data

U editace hodnot reprezentovaných pomocí množinového datového typu ENUM je vždy zobrazena aktuální nabídka hodnot, které lze nastavit. Nabídka je tvo ena prost ed-nictvím formulá ového prvku typu select box a hodnoty jsou získávány ze struktury dané tabulky, kde je jejich p esné zn ní definované. Obdobn je realizovaná i editace datového typu SET. Nabídka všech hodnot je shodn získávána ze struktury tabulky, ale je zobra-zována pomocí formulá ových prvk check box, u kterých je možné zaškrtnout více položek sou asn .

Možnost editace datových typ typu BINARY nebo BLOB, obsahující binární data, není v této aplikaci implementovaná. Stávající editace ostatních datových typ je prová-d na pomocí AJAX požaprová-davk . Tohoto zp sobu by nebylo možné u eprová-ditace velkých binárních soubor docílit, protože AJAX požadavky jsou pro p enos dat limitované. Celý zp sob editace by musel být zm n n, ímž by se narušil dosavadní koncept pro vytvo ení jednoduché a rychlé aplikace. Docházelo by ke zpomalení v d sledku odesílání velkého množství dat prost ednictvím HTTP požadavku.

Pokud je ve struktu e sloupce nastaveno, že nesmí obsahovat nulovou hodnotu, for-mulá ovému prvku je nastaven valida ní atribut, který nedovolí odeslání forfor-mulá e d íve, než je daný prvek vypln n tzv. required.

V p ípad , že je provád na editace nad sloupcem, jehož hodnota odpovídá klí ové hodnot , je pomocí formulá ového prvku select box uveden aktuální dostupný výpis na-stavitelných hodnot. Tímto zp sobem je provád na zm na závislostí jednotlivých ádk mezi tabulkami v databázi.

Po provedení všech pot ebných zm n a zajišt ní správného vypln ní všech formu-lá ových prvk díky nastaveným valida ním pravidl m je formuformu-lá odesformu-lán. Obslužná funkce zpracovávající odeslaný formulá používá funkci z modelové vrstvy, která vyko-nává SQL dotazy nad databází. Funkce z modelové vrstvy následn provede aktualizaci dat v p íslušné databázové tabulce. Aktualizace dat je následn provedena i v šablon vypisující data. Na záv r je viditelnost edita ního modal okna op t deaktivována.

6.12 SQL p íkazy

V aplikaci je možné krom akcí popsaných v p edchozích krocích provád t i zpra-cování libovolných SQL p íkaz .

Vstupním bodem sloužícím pro zadávání SQL dotaz je p íkazové okno tvo ené formulá ovým prvkem textarea. K následnému zpracování jsou použity metody obsažené v knihovn Nette\Database\Helpers.

( ! > ,5 ? - )*

P íkazové okno m že obsahovat více než jeden SQL p íkaz. V p ípad , že jich ob-sahuje více, musí být od sebe vzájemn odd leny st edníkem.

Zpracování p íkaz je provád no funkcí z modelové vrstvy, která daný p íkaz vy-koná nad aktuáln p ipojenou databází, nebo pouze nad samotným serverem. Zmi ovaná funkce vrací sadu výsledk Nette\Database\ResultSet, která je využita jako vstupní para-metr metody dumpResult. Metoda dumpResult se následn postará o vykreslení výsledku zpracovaného SQL p íkazu do HTML tabulky. Proto je její volání použito až v šablon .

public static dumpResult(Nette\Database\ResultSet $result)

Zdrojový kód 14: Definice metody pro zobrazování výsledku SQL p íkazu

( ! ! >,; ) 0 ? $

Krom samotného zpracovávání jsou veškeré SQL p íkazy vizuáln zobrazovány.

K zobrazování zpracovaných p íkaz se využívá metoda dumpSql, která jako vstupní pa-rametr p ejímá et zec obsahující všechny p íkazy z p íkazového okna. Výsledkem je zobrazení p íkaz se zvýrazn ním SQL syntaxe.

public static string dumpSql(string $sql, array $params = NULL)

Zdrojový kód 15: Definice metody pro zvýrazn ní SQL syntaxe

( ! @ - )*

Všechny zpracované SQL p íkazy, i v etn p íkaz jejichž syntaxe nebyla zcela správn , jsou evidovány po dobu p ipojení k databázovému serveru v historii p íkaz .

Do historie je ukládán vždy celý obsah p íkazového okna s rozd lením po jednotli-vých p íkazech podle po adí, v jakém bylo provád no jejich zpracovávání. Jako identifikátor je používán aktuální datum a as z doby zpracování. Jednotlivé uložené p í-kazy lze zp tn upravovat a v p ípad pot eby znovu vykonat. K dispozici je tla ítko, pomocí n hož je možné obsah celé historie nenávratn smazat.

6.13 Vizuální schéma databáze

Jednou z hlavních a nejd ležit jších ástí celé aplikace je tvorba vizuálního schéma databáze. Jelikož se jedná o pom rn náro nou operaci, byla k této innosti využita javascriptová knihovna pro tvorbu diagram v HTML5 pod názvem JointJS.

( # 4 , < <

Knihovna JointJS pro tvorbu diagram je pln interaktivní nástroj s podporou pro všechny moderní webové prohlíže e. Uvád ná knihovna není pouze kreslícím nástrojem, ale díky MVC architektu e dokáže z výsledného vykreslení odd lit jednotlivé prvky. Celé jádro knihovny JointJS je licencováno pod Mozilla Public License ve verzi 2. V základní nabídce je k dispozici n kolik p eddefinovaných stavebních prvk , kterých lze p i tvorb diagram i schémat využít [21].

Základním principem knihovny je vytvo ení hlavní kreslící plochy, do které budou jednotlivé prvky vykreslovány a umís ovány. Následn jsou vytvo eny jednotlivé kom-ponenty typu joint.shapes.devs.Model, které v p ípad vyvíjené aplikace p edstavují tabulky v databázi. Pomocí funkcí z modelové vrstvy jsou získávány všechny pot ebné údaje o databázi, jako název a struktura jednotlivých tabulek. Každá komponenta zastu-puje danou tabulku z databáze. Do každé komponenty jsou umíst ny tzv. porty s popiskem, které reprezentují sloupec v databázové tabulce. U každé komponenty bylo nutné upravit pozici umíst ní port , popisk a p edevším pozici, na které se bude kom-ponenta v kreslící ploše vykreslovat, aby se komkom-ponenta co nejvíce podobala databázové tabulce. Po vytvo ení všech komponent jsou vykresleny na kreslící plochu.

Po umíst ní komponent do kreslící plochy je realizována vizualizace vazeb mezi jednotlivými tabulkami. Op t je zde použita funkce z modelové vrstvy, která získává všechny údaje o využití cizích klí z tabulky KEY_COLUMN_USAGE z informa ní da-tabáze INFORMATION_SCHEMA. Každý port uvnit vytvo ené komponenty má sv j jednozna ný identifikátor, díky n muž lze p íslušnému portu nastavit na jakou kompo-nentou a jaký konkrétní port má být vykresleno spojení, p edstavující vazbu mezi jednotlivými sloupci databázových tabulek. Díky jednozna ným identifikátor m každé komponenty je možné vytvo it komponenty typu joint.dia.Link, p edstavující reali-zaci propojení dvou komponent typu joint.shapes.devs.Model, které jsou po svém vytvo ení taktéž vykresleny na kreslící plochu. Po vykreslení všech vytvo ených kompo-nent, do již existující kreslící plochy, vznikne výsledné požadované schéma databáze.

P i vytvá ení port v jednotlivé komponent typu joint.shapes.devs.Model, bylo v p vodním ešení realizováno obarvení jednotlivých port podle p íslušné skupiny datového typu sloupce v databázové tabulce. Obarvování m la na starosti ást ve zdrojo-vém kódu, u které se po testování zjistilo, že celý proces vykreslování schéma velmi zpož uje. Proces vykreslování schéma databáze se u složit jších databází, obsahujících velké množství vazeb mezi tabulkami, dostával až za hranici desítek vte in. Proto nebylo grafické zvýrazn ní jednotlivých port dle dané skupiny datového typu v aplikaci imple-mentováno a aplikace je schopná celé schéma databáze vykreslit až t ikrát rychleji oproti p vodnímu zamýšlenému ešení.

Obrázek 8: Ukázka vizuálního schéma testovací databáze SAKILA

6.14 Uživatelská oprávn ní

Aplikace obsahuje rozhraní umož ující správu uživatelských oprávn ní. Oproti existujícím nástroj m, které touto funkcionalitou také disponují, nabízí aplikace správu oprávn ní ve srozumiteln jší a p ehledn jší form .

Veškeré vytvá ení nových oprávn ní a jejich zm na probíhá v modal okn , které je používáno stejným zp sobem jako p i editaci dat v databázi. Zpracování, které zp sobí zm nu oprávn ní, probíhá pomocí AJAX požadavk .

P esná podoba všech zpracovaných SQL p íkaz je vizuáln zobrazována a za po-mocí metody dumpSql z knihovny Nette\Database\Helpers je zvýrazn na jejich SQL syntaxe. Zpracované SQL p íkazy lze následn upravovat v p íkazovém okn a v p ípad pot eby op tovn vykonat.

( "$ , - ,14 7 ,

Prvotní funkcí rozhraní pro správu uživatelských oprávn ní je možnost vytvo ení nového uživatele, kterému bude umožn no p ipojení k databázovému serveru.

K vytvo ení nového p ístupu pro uživatele na daný server je použit uvedený SQL p íkaz. Pomocí formulá ových prvk v modal okn jsou získány uživatelovy informace:

p ihlašovací jméno, IP adresa nebo název serveru a heslo. Rozdíl nastává pouze v p ípad , kdy uživatel bude chtít p ístup k serveru chránit heslem. Pokud ano, musí být heslo uve-deno.

CREATE USER 'uzivatel'[@'server']

[IDENTIFIED BY [PASSWORD] 'heslo'] [, ...]

Zdrojový kód 16: SQL p íkaz pro vytvo ení nového uživatele

Dalším krokem je nastavení globálního oprávn ní. V p ípad , že má aktuáln p i-hlášený uživatel nastavené oprávn ní pro vytvá ení nových uživatel , je po potvrzení vytvo en nový uživatelský ú et, pomocí kterého se lze k databázovému serveru nov p i-pojit.

( ! A +5 5, 0 7 ,

Informace o globálním oprávn ní konkrétního uživatele jsou získávány z tabulky USER_PRIVILEGES z informa ní databáze INFORMATION_SCHEMA.

Pomocí funkcí z modelové vrstvy zpracovávající SQL p íkazy je možné provést následující SQL p íkaz, pomocí n hož je nastavováno globální oprávn ní uživatele.

GRANT opravneni[,...] ON uroven_opravneni

MAX_QUERIES_PER_HOUR pocet | MAX_UPDATES_PER_HOUR pocet | MAX_CONNECTIONS_PER_HOUR pocet | MAX_USER_CONNECTIONS pocet

Zdrojový kód 17: SQL p íkaz pro p i azení globálního oprávn ní uživateli

V následujícím výpisu jsou uvedeny všechny typy globálního oprávn ní, které je možné uživateli nastavit:

ALTER – umož uje m nit strukturu existujících tabulek

INDEX – umož uje vytvá et a odstra ovat klí e

DROP – umož uje odstranit databáze a tabulky

CREATE TEMPORARY TABLES – umož uje vytvá et do asné tabulky

SHOW VIEW – umož uje spušt ní dotazu CREATE SHOW VIEW

CREATE ROUTINE – umož uje vytvá et uložené procedury

ALTER ROUTINE – umož uje m nit a rušit uložené procedury

EXECUTE – umož uje spoušt t uložené procedury, k dispozici od verze pot ebné pro v tšinu operací pro správu serveru jako nastavování globálních prom nných a zabíjení vláken jiných uživatel

PROCESS – umož uje prohlížet procesy všech uživatel

RELOAD – umož uje znovu na íst nastavení a vyprázdn ní vyrovnávacích pam tí MySQL serveru

SHUTDOWN – umož uje vypnout server

SHOW DATABASES – umož uje p ístup k úplnému seznamu databází

LOCK TABLES – umož uje zamknout tabulku pro aktuální vlákno

REFERENCES – není využíváno, ur eno pro budoucí verze

REPLICATION CLIENT – umožní uživateli zjistit, kde je hlavní nebo po-mocný server

REPLICATION SLAVE – pot ebné pro replikaci pomocných server

CREATE USER – umož uje vytvá et, rušit a p ejmenovávat ú ty uživatel

( : 5, 0 +5)

Oprávn ní na úrovni databáze je nastavováno obdobn jako u globálního oprávn ní.

Informace o oprávn ní na úrovni databáze jsou získávány ze shodné informa ní databáze INFORMATION_SCHEMA, ale odlišné tabulky SCHEMA_PRIVILEGES. V SQL p í-kazu m nícím oprávn ní na úrovni databázi se liší pouze úrove oprávn ní.

GRANT opravneni[,...] ON uroven_opravneni

MAX_QUERIES_PER_HOUR pocet | MAX_UPDATES_PER_HOUR pocet | MAX_CONNECTIONS_PER_HOUR pocet | MAX_USER_CONNECTIONS pocet

Zdrojový kód 18: SQL p íkaz pro p i azení oprávn ní na úrovni databáze

Následující výpis uvádí všechny typy oprávn ní, které lze p i adit na úrovni data-báze:

( : 5, 0 + $

Veškeré informace o uživatelském oprávn ní na úrovni databázové tabulky jsou oproti p edchozím úrovním oprávn ní získávány z tabulky TABLE_PRIVILEGES obsa-žené v informa ní databázi INFORMATION_SCHEMA. U SQL p íkazu provád jícího nastavení oprávn ní na úrovni tabulky je zm na pouze v úrovni oprávn ní tak, aby odpo-vídalo databázové tabulce.

MAX_QUERIES_PER_HOUR pocet | MAX_UPDATES_PER_HOUR pocet | MAX_CONNECTIONS_PER_HOUR pocet | MAX_USER_CONNECTIONS pocet

Zdrojový kód 19: SQL p íkaz pro p i azení oprávn ní na úrovni tabulky

V následujícím výpisu jsou uvedeny všechny typy oprávn ní, které lze nastavit u ta-bulky:

( : 5, 0

Informace o oprávn ní na úrovni tabulkového sloupce jsou získávány, obdobn jako v p edchozích p ípadech z informa ní databáze INFORMATION_SCHEMA a ta-bulky COLUMN_PRIVILEGES. Cíl úrovn oprávn ní u SQL p íkazu je nastaven tak, aby odpovídal konkrétnímu sloupci v tabulce.

MAX_QUERIES_PER_HOUR pocet | MAX_UPDATES_PER_HOUR pocet | MAX_CONNECTIONS_PER_HOUR pocet | MAX_USER_CONNECTIONS pocet

Zdrojový kód 20: SQL p íkaz pro p i azení oprávn ní na úrovni sloupce

V následujícím výpisu jsou uvedeny všechny typy oprávn ní, které lze p i adit kon-krétnímu sloupci v tabulce:

V nástroji Adminer, je správa oprávn ní uživatel ešena pomocí jedné stránky, na které jsou v tabulce uvedené všechny dostupné oprávn ní, která lze nastavit ve všech úrovních, od globálního oprávn ní, až po oprávn ní na úrovni sloupce. P i v tším po tu nastavených oprávn ní se tento výpis stává zna n nep ehledným. Navíc lze nastavené oprávn ní pouze editovat a nikoliv vytvá et nová.

Nástroj phpMyAdmin obsahuje správu oprávn ní uživatel fungující na zp sobu vno ování, od globálního oprávn ní až po oprávn ní na úrovni sloupce. Jelikož celý ná-stroj phpMyAdmin p sobí robustním dojmem, rozhraní pro správu oprávn ní taktéž.

Orientace v rozhraní není úpln jednoduchá.

Nap íklad po zm n oprávn ní na úrovni sloupce je uživatel p esm rován na hlavní výpis s oprávn ním. P i op tovné požadované zm n oprávn ní na úrovni sloupce je

Nap íklad po zm n oprávn ní na úrovni sloupce je uživatel p esm rován na hlavní výpis s oprávn ním. P i op tovné požadované zm n oprávn ní na úrovni sloupce je

In document Liberec 2014 Jakub Jirouš (Page 38-75)