Knihovnu pro snadný přístup k datům z databáze NotORM vyvíjím přesně podle hesla „release early, release often“. Nové verze ani nijak nečísluji a vždy po odladění nějaké funkčnosti knihovnu pouze vystavím označenou datem vydání. Od prvního představení přibylo několik novinek:
Asi nejzásadnější novinkou je možnost vkládat, upravovat a mazat stávající data. Tuto funkčnost jsem doplnil krátce po představení knihovny, ale dlouho si žila v samostatné branchi. Považuji ji nicméně za užitečnou a s API jsem spokojen, takže jsem ji zahrnul i do hlavní verze. API je opět jednoduché:
<?php // vložení záznamu $id = $db->application()->insert(array( "author_id" => $software->author[12], "published" => new NotORM_Literal("NOW()"), "slogan" => "The best humane Web text generator", )); // modifikace a smazání všech vrácených řádek $affected = $db->application()->update(array("web" => "")); $affected = $db->application()->delete(); // modifikace podle skutečně provedených změn $application->web = ""; $application->update(); ?>
Stejně jako při získávání dat je velký důraz kladen na výkonnost – dotazy nad celým výsledkem zbytečně nekladou SELECT
a modifikace přenáší jen ty sloupce, které byly skutečně změněny.
Ještě důležitější je bezpečnost – všechna data jsou automaticky ošetřena s výjimkou objektu třídy NotORM_Literal
. Původně se používalo pole (inspiroval jsem se způsobem předáváním metod v PHP), to by ale mohlo způsobit riziko.
Metodě insert
lze předat i řetězec nebo výsledek dotazu, což se dá použít pro vložení více záznamů najednou. Jde ale spíše o experimentální vlastnost.
Modifikace dat by rozhodně neměla být k dispozici třeba v šabloně, proto je možné ji snadno zakázat. Původně to šlo pro každý výsledek zvlášť, ale pro to jsem nenašel rozumné uplatnění, proto jde nyní o volbu společnou pro celý objekt reprezentující databázi. API je jednoduché:
<?php $db->freeze = true; ?>
Vlastnost je určena pouze pro zápis, protože pokus o čtení vrátí data ze stejnojmenné tabulky.
O možnosti specifikovat vlastní třídu pro řádky vracené z databáze už jsem psal. Připomenu, že pomocí této funkčnosti lze nad NotORM postavit další abstrakci použitelnou třeba pro přímočaré získávání dat z překladových tabulek. Marek Lichtner připravil navíc verzi, která do těchto tabulek dovoluje i snadno ukládat. API se nakonec ustálilo takto:
<?php $db->rowClass = 'ClassName'; // potomek NotORM_Row ?>
Řádky výsledku lze snadno agregovat:
<?php list($count, $max_published) = $db->application()->group("COUNT(*), MAX(published)"); ?>
Druhým parametrem lze specifikovat i podmínku pro skupiny (HAVING
).
Při vývoji mě samozřejmě eminentně zajímá, jaké dotazy se databázi vlastně pokládají. Původně jsem to řešil zakomentovaným kódem, pokud si ale výsledek chcete poslat třeba do Laděnky, tak je potřeba sofistikovanější mechanismus:
<?php $db->debug = function ($query, array $parameters) { // tady bude zalogování dotazu a parametrů }; // před PHP 5.3 lze předat i konvenční callback ?>
Pro vlastní ladění jsem si nechal možnost nastavit tuto vlastnost na true
, což pošle dotaz na chybový výstup.
NotORM jsem úspěšně vyzkoušel na Oracle. Metodu limit
jsem upravil tak, aby respektovala odlišnosti jednotlivých databází, nefunguje pouze $offset
na MS SQL. Pro složitější podmínky jsem přidal podporu poddotazů, které se v MySQL kvůli výkonnosti materializují.
Momentálně mi nic nechybí a knihovnu považuji za hotovou. Občas se mě někdo zeptá, jestli bych do verze pro Dibi nechtěl doplnit podporu pro ukládání, ale do toho se mi moc nechce. Jednak mi přijde ukládání v Dibi samo o sobě dost jednoduché a jednak jsem zvědav, jestli se něco začne dít na druhé straně hřiště.
Diskuse je zrušena z důvodu spamu.