DibiDataSource pro mysql

před rokem

(aktualizováno 15. 6. 2010 a 27. 4. 2010 a 10. 12. 2010 a 3. 8. 2011)

Mysql ve všech verzích (únor 2010) trpí nepříjemnou vlastnosti. V subselectu neumí použít index. DibiDataSource v knihovně Dibi je celý postavený na subselected, takže je v mysql naprosto nepoužitelný. To by mi ani tak nevadilo, prostě by jsem DataSource nepoužíval, ale…

DataGrid pro Nette Framework je parádní knihovna pro vykreslování tabulek od Romana Sklenáře a jako zdroj dat používá právě pouze DibiDataSource.

Takže máme několik možností: nepoužívat DataGrid, přesvědčit Romana aby ho předělal, nebo změnit DataSource, aby tímhle problémem netrpěl.

Existuje několik možností jak udělat datasource jinak. Já jsem zvolil tu nejméně efektivní: parsovat SQL. Možná se ukáže, že se jedná o slepou uličku vývoje, ale alespoň si budeme moci říct: „Přátelé, tudy ne, tudy cesta opravdu nevede.“ ;]

Moje úprava se prozatímně jmenuje DibiDataSourceX a je to experiment, který není ideální do produkčního řešení. Je potřeba myslet na to, že není 100% kompatibilní.

Zásadní rozdíly oproti DibiDataSource:

Aliasy se musí escapovat.

Aliasy sloupců jdou dále používat jen když jsou escapovány (uzavřené v hranatých závorkách).

$c->dataSourceX('SELECT foo as bar FROM [table]')->where('[bar] = 5');
// OK
$c->dataSourceX('SELECT foo as bar FROM [table]')->where('bar = 5');
// Error: Unknown column 'bar' in 'where clause'

Řazení s limitem funguje jinak.

Když je je limit ve zdroji a orderby venku:

$c->dataSourceX('SELECT * FROM [table] LIMIT 10')->orderBy('bar');
// DataSource: SELECT * FROM (SELECT * FROM test LIMIT 10) t ORDER BY `bar`;
// DataSourceX: SELECT * FROM test ORDER BY `bar` LIMIT 10;

Tedy v klasickém DS se nejdřív ze všech vezme 10 záznamů a ty se seřadí dle bar. V DSX se vše seřadí dle bar a vybere se 10 záznamů. Vrátí to prostě jiné data. Naštěstí se většinou takhle DS nepoužívá.

Získávání počtu záznamů může být pomalé při limitech.

Protože se při limitu musí použít subselect. Nebo ví někdo jak z dotazu SELECT * FROM [table] LIMIT 50,20 dostat pravdivej count?

Jen pro mysql.

Jiné databáze nemají problém. Pak se použije subselect jako u normálního datasourcu.

Nepodporuje UNION.

Zatím není možné spojovat selecty přes union.

Nepodporuje některé věci v SELECTU

PROCEDURE apod.

Kdy se subselectu nevyhnu.

V některých případech se stejně musí použít subselect.

Je lepší se podobným konstrukcím vyhnout. Tedy nepoužít vůbec datasource.

Stažení

Verze 0.2.4
Download DataSourceX-0.2.4.zip
Autor Petr Procházka (petr@petrp.cz @Petr_P)
Licence „New“ BSD License
Homepage http://petrp.cz/…ce-pro-mysql

Instalace

Stáhněte si archiv DataSourceX.zip a obsah složky /DataSourceX vložte do adresáře %libsDir% ve vašem projektu.

Vyžaduje Dibi po 2009–11–02

Souborem extension.php zaregistrujete metody jako: DibiConnection::dataSourceX, DibiDataSource::toDataSourceX().

require_once LIBS_DIR . '/DataSourceX/extension.php';

DibiFluent::toDataSourceX() momentálně nefunguje, protože nepodporuje extension method.

Příklad použití

$connection = dibi::getConnection();

$dataSource = $connection->dataSourceX('SELECT * FROM [table] WHERE [rohlik] > [chleba]');

$dataSource
    ->orderBy('marmelada')
    ->applyLimit(10)
    ->select(array('rohlik', 'chleba', 'maslo'))
    ->select('marmelada', 'jam');

$dataSource->getResult()->dump();

Changelog

DibiDataSourceX 0.2.4 on 2011–08–03

DibiDataSourceX 0.2.3 on 2010–12–10

DibiDataSourceX 0.2.2 on 2010–06–15

DibiDataSourceX 0.2.1 on 2010–04–27

DibiDataSourceX 0.2 on 2010–02–25

Petr Procházka

Programátor, kodér a webový vývojář na volné noze.

kontakt

Twitter

Petr Procházka před rokem
Z tiskárny si vždy na flashce přinesu virus. To neslyšeli o antivirech a zakázání autorunu?

Petr Procházka před rokem
Blbne mi aplikace budík. NEJDE vypnout buzení. To je nejhorší porucha která může nastat. #android

Petr Procházka před rokem
Pracovní počítač mi zkolabuje skoro vždy když přeskládávám větší množství commitů. Dnes mi to naprosto zlikvidovalo repository. #git

Petr Procházka před rokem
Na mém HTC Hero se mi v aplikaci zobrazuje google reklama „Mobil od Googlu HTC Hero“. Kontextová reklama dotažená do dokonalosti.

PetrP na twitteru