Skip to content

Datenbankprobleme beim OXID-Unit-Testing

Published: at 14:28

Mensch, eine Stunde verbraucht mit der Fehlersuche.

Ich stolpere grad über Datenbank-Probleme beim Unit-Testing einer aktuellen OXID-Version und bin auch mit einer ausgiebigen Google-Recherche und dem Wühlen in der OXID-Mailingliste nicht fündig geworden. Da die Testumgebung von OXID zur Modulzertifizierung leicht veraltet ist, teste ich meine Module gegen ein halbwegs aktuelles Debian 6 mit PHP 5.3 auf dem neuesten VMWare Player und irgendwann, wirklich irgendwann im Testlauf, ist plötzlich in der Connection-ID des Datenbankobjekts keine Resource mehr zu finden, sondern nur noch ein Integer-Wert. Ab dem Moment als das Problem auftrat, trat es ab da immer an der gleichen Stelle auf. Cacheleeren, Views neu generieren, neues Deployment … nichts hat geholfen. Ich hab in meinen Modulen gewühlt, aber einfach kein Grund für das Problem gefunden.

mysql\_query() expects parameter 2 to be resource, integer given

/var/www/oxid458/trunk/core/adodblite/adodbSQL\_drivers/mysql/mysql\_driver.inc:353
/var/www/oxid458/trunk/core/adodblite/adodb.inc.php:316

oder

mysql\_real\_escape\_string() expects parameter 2 to be resource, integer given

/var/www/oxid458/trunk/core/adodblite/adodbSQL\_drivers/mysql/mysql\_driver.inc:197
/var/www/oxid458/trunk/core/adodblite/generic\_modules/pear\_module.inc:125
/var/www/oxid458/trunk/core/oxbase.php:648
/var/www/oxid458/trunk/core/oxbase.php:615

Im Core gibt es auch nicht wirklich eine Stelle, die die Connection-ID überschreibt also wird es vermutlich irgendein Seiteneffekt mit dem Setup sein, welches PHPUnit forciert.

Also flott mal einen Core-Unit-Test von OXID ausgeführt und siehe da, auch hier tritt der Fehler auf. Damit kann ich meine Logik ausschließen und schiebe es auf andere Ursachen.

Wer rein zufällig auch auf dieses Problem stolpert und kein Interesse hat den vermutlichen Seiteneffekt im Core zu fixen, hier ein schneller Workaround:

<?php
    // ./core/oxdb.php

    public static function getDb( $blAssoc = false )
    {
        global $ADODB\_FETCH\_MODE;

        if ( $blAssoc ) {
            $ADODB\_FETCH\_MODE = ADODB\_FETCH\_ASSOC;
        } else {
            $ADODB\_FETCH\_MODE = ADODB\_FETCH\_NUM;
        }

        if ( defined( 'OXID\_PHP\_UNIT' ) ) {
            if ( isset( modDB::$unitMOD ) && is\_object( modDB::$unitMOD ) ) {
                return modDB::$unitMOD;
            }
        }
        // && is\_resource(self::getInstance()->\_getConnectionId()) ergaenzt
        if ( self::$\_oDB !== null && is\_resource(self::getInstance()->\_getConnectionId())) {
        // ....
?>

Dieser Fix führt dazu, dass jedes Mal eine neue Verbindung aufgebaut wird, wenn die Verbindung über die ConnectionID nicht mehr identifiziert werden kann. Der Fix ist natürlich nur für Entwicklungssysteme gedacht!

Happing Coding!

Björn


Previous Post
Unser OXID Autoloader
Next Post
Vorstellung