tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

DibiDataSource a detectTypes()

před 10 lety

Petr Motejlek
Člen | 293

Ahoj,
DibiResult má metodu detectTypes(), která je poměrně důležitá, když používám klasickou kombinaci pomoci dibi::query() (tj. $res->dibi::query, $res->detectTypes(), $res->fetch()), automaticky se mi u vrácených hodnot nastaví správné PHP datové typy, a co je asi nejdůležitější — u PostgreSQL když mezi sloupci je něco typu BYTEA (dibi::BINARY), dojde k zavolání pg_unescape_bytea(), což odstraní escapování, které dibi automaticky udělá, když do takového sloupce něco vložím. Problém je, že unescape se provede jen, když zavolám před samotným fetchem detectTypes() nad instancí DibiResult.

Moje otázka zní, jak správně postupovat, když chci využít mocnosti (hezké slovo, že? ;) DibiDataSource, ať už se bavíme o applyLimit, řazení, nebo dalším dofiltrování, rád bych mu nějak vnutil, aby vždycky, když bude vracet DibiResult, nad tím DibiResultem automaticky zavolal detectTypes(). Něco takového jako dibi::dataSource(‚SELECT * FROM [myTable]‘)->autoDetectTypes();, nebo ještě hezčí a praktičtější: DibiDataSource::$autoDetectTypes = true ;).

Jestli jsem něco přehlédl a je to lepší dělat úplně jinak, než kam mířím, klidně mě střelte :D. Díky, Petr.

před 10 lety

kravčo
Člen | 723

Dědictví aneb…

class MyDibiDataSource extends DibiDataSource
{
    public function getResult()
    {
        $result = parent::getResult();
        $result->detectTypes();
        return $result;
    }
}

Editoval kravčo (23. 8. 2009 16:34)

před 10 lety

Petr Motejlek
Člen | 293

Tohle řešení je jasný; ani mě nenapadlo, že je sem někdo bude psát — má ale tu vadu, že dibi třídy, který dataSource vrací, vrací pořád DibiDataSource a ne MyDataSource, což je takové blbé, protože bych musel přepsat víc věcí, proto jsem hledal jiný způsob.

před 10 lety

kravčo
Člen | 723

Petr Motejlek napsal(a):

Tohle řešení je jasný; ani mě nenapadlo, že je sem někdo bude psát — má ale tu vadu, že dibi třídy, který dataSource vrací, vrací pořád DibiDataSource a ne MyDataSource, což je takové blbé, protože bych musel přepsat víc věcí, proto jsem hledal jiný způsob.

Ono je takové blbé napísať ďalších pár riadkov naviac sám?

class mydibi extends dibi
{
    public static function myDataSource($args)
    {
        $args = func_get_args();
        return self::getConnection()->myDataSource($args);
    }
}

function DibiConnection_prototype_myDataSource()
{
    $args = func_get_args();
    $connection = array_shift($args);
    $translator = new DibiTranslator($connection->driver);
    return new MyDataSource($translator->translate($args), $connection);
}

DibiConnection::extensionMethod(
    'DibiConnection::myDataSource',
    'DibiConnection_prototype_myDataSource'
);

class MyDibiDataSource extends DibiDataSource
{
    public function getResult()
    {
        $result = parent::getResult();
        $result->detectTypes();
        return $result;
    }
}

před 10 lety

Petr Motejlek
Člen | 293

Nechci, abys' sem psal kód, jak se to dá udělat pomocí napsání vlastních tříd. Tenhle směr zavrhuju; takhle už to mám, a proto jsem napsal tenhle topic — zajímá mě, jestli se to dá udělat nějak jinak ;).

před 10 lety

kravčo
Člen | 723

Petr Motejlek napsal(a):

Nechci, abys' sem psal kód, jak se to dá udělat pomocí napsání vlastních tříd. Tenhle směr zavrhuju; takhle už to mám, a proto jsem napsal tenhle topic — zajímá mě, jestli se to dá udělat nějak jinak ;).

Z tvojho prvého príspevku to nebolo patrné. Vyznelo to, ako by si nevedel, ako to máš urobiť, nie tak, že to chceš urobiť inak, ako to už spravené máš…

Vzhľadom na to, že cestu štandardného rozširovana zavrhuješ, zostáva ti ešte pripísať si do dibi/DibiDataSource.php podporu pre detectTypes() (cca 1–2 riadky), to je ale zásah do dibi, bude sa ti ťažko udržiavať a updatovať a neodporúčam to.

před 10 lety

Petr Motejlek
Člen | 293

Jj, souhlasím s tím, že zasahovat do Dibi je větší fuj, než rozšiřovat je pomocí vlastních tříd ;).