tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Logovanie vsetkych SQL prikazov (aj pre transakciu)

před 8 lety

MIKI
Člen | 34

Zdravim,

Po asi polhodine som nasiel problem, a chcem sa spytat, preco je DibiProfiler takto (podla mojho nazoru) zle rieseny.

Je mozne nastavit Filter pre DibiProfiler, defaultne to je

<?php
    /** @var int */
    private $filter = self::ALL;
?>

Ako som pozeral, tak to znamena logovanie VSETKYCH typov dotazov.
ALE!

metoda DibiProfiler::after() sa sprava inak

<?php
        // ocakavane spravanie, vyfiltruje co nechceme
        if (($event & $this->filter) === 0) return;

        // nesledoval som, o co presne ide, ale ocakavam, ze nieco specialne pre QUERY, OK
        if ($event & self::QUERY) {
            ...

            // taktiez vcelku ocakavana podmienka
            if ($this->file) {
                $this->writeFile(
                ...
            }
        } // ~ tu je koniec podmienky (if QUERY)
    }// ~ tu je koniec funkcie after()
?>

Preco sa podmienka if(file) nachadza tak skoro? Ak sa pre QUERY zapisuje nieco specialne, tak OK, potom ale otazka znie, preco sa nezapisuju ostatne prikazy (BEGIN, COMMIT, ROLLBACK) ? Ak si to mozem vyfiltrovat (napr. nastavit defaultny filter na QUERY), nevidim dovod preco nelogovat aj ostatne prikazy.

Ja si to opravim pre svoju verziu dibi, co mi ale nedovoluje pouzivat najnovsie verzie, prip. mini verzie.

Podla mojho nazoru, by bolo vhodne toto opravit, alebo mi vysvetlite aktualny stav :)

před 8 lety

Milo
Nette Core | 1119

Pokud chceš nasazovat i následující verze, koukni na aktuální verzi na GitHub. Tam už se DibiProfiler nepoužívá, ale je nahrazen $dibiConnection->onEvent callbacky. Je to v jednom z nejnovějších commitů. Starého chování logování do souboru dosáhneš takto:

$config = array(
    ...
    'profiler' => array(
        'run' => true,
        'file' => 'dibi.log',
    ),
    ...
);

Případně si teď snadno vytvoříš vlastní loger:

function dibiLogger(DibiEvent $event)
{
    ....
}

$db = new DibiConnection($config);
$db->onEvent[] = 'dibiLogger';

A k tomu, proč se neloguje BEGIN, COMMIT… Nevím to jistě, ale asi to bude tím, že ne každý driver začíná/končí transakcí pomocí SQL kódu. Třeba firebird používá ibase_trans().

před 8 lety

MIKI
Člen | 34

@Milo:

diky, GitHub nepozeram, stahujem len zip z tejto stranky, a dlho som ani nestahoval, netusil som, ze sa to este dako vyvija :)

Nuz, mne osobne ani tak neslo o to, aby som tam mal presny SQL dotaz, ale postacilo by „BEGIN TRANSACTION“ v logu.

Este raz diky, skusim pozriet ten DibiEvent :)