0 ), TRUE ); asrt( ( R::getLogger() instanceof Logger ), TRUE ); R::stopLogging(); R::store( R::dispense( 'book' ) ); $logs = R::getLogs(); asrt( ( count( $logs ) === 0 ), TRUE ); } /** * Test for Issue #751 (Update Logger to accept parameter typed bindings): * While debugging some of our queries, we noticed * the logger would often display * 'Array' as value for the bindings, * even when the SQL query seemed to work correctly. * Debugging this, it appeared the debug logger did * not support the new parameter type bindings added in 5.3. * This merge request adds support for * the PDO::PARAM_INT and PDO::PARAM_STR * to the Debug logger, as well as a visible support * for the RPDO flagUseStringOnlyBinding flag. * * @return void */ public function testIssue751() { R::nuke(); $debugger = new Debug; $database = R::getDatabaseAdapter()->getDatabase(); $database->setLogger( $debugger ); asrt( $database->getLogger(), $debugger ); $database->setEnableLogging( TRUE ); $debugger->setMode( RDefault::C_LOGGER_ARRAY ); /* debug logger with nostringonlybinding should have unquoted ints */ R::store( R::dispense( 'book' ) ); R::getAll( 'SELECT * FROM book WHERE id < ?', array( array( 999, \PDO::PARAM_INT ) ) ); asrt( count( $debugger->grep('999') ), 1 ); asrt( count( $debugger->grep('\'999\'') ), 0 ); asrt( count( $debugger->grep('rray') ), 0 ); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->clear(); R::getAll( 'SELECT * FROM book WHERE id < ?', array( array( 999, \PDO::PARAM_STR ) ) ); /* ...but quoted strings */ asrt( count( $debugger->grep('\'999\'') ), 1 ); asrt( count( $debugger->grep('rray') ), 0 ); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->clear(); /* even if PARAM INT if stringonlybinding then override */ $debugger->setUseStringOnlyBinding( TRUE ); R::getAll( 'SELECT * FROM book WHERE id < ?', array( array( 999, \PDO::PARAM_INT ) ) ); asrt( count( $debugger->grep('\'999\'') ), 1 ); asrt( count( $debugger->grep('rray') ), 0 ); /* if no type and stringonlybinding always quote */ $debugger->clear(); R::getAll( 'SELECT * FROM book WHERE id < ?', array( 999 ) ); asrt( count( $debugger->grep('\'999\'') ), 1 ); asrt( count( $debugger->grep('rray') ), 0 ); /* a more closer inspection */ /* log implicit INT param without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( 123 ) ); asrt( count( $debugger->grep('123') ), 1 ); asrt( count( $debugger->grep('\'123\'') ), 0 ); /* log implicit STR param without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( 'abc' ) ); asrt( count( $debugger->grep('\'abc\'') ), 1 ); /* log NULL param without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( NULL ) ); asrt( count( $debugger->grep('NULL') ), 1 ); asrt( count( $debugger->grep('\'NULL\'') ), 0 ); /* log explicit INT param without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( 123, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('123') ), 1 ); asrt( count( $debugger->grep('\'123\'') ), 0 ); /* log explicit STR param without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( 'abc', \PDO::PARAM_STR ) ); asrt( count( $debugger->grep('\'abc\'') ), 1 ); /* log NULL with explicit param type without StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( NULL, \PDO::PARAM_STR ) ); asrt( count( $debugger->grep('NULL') ), 1 ); asrt( count( $debugger->grep('\'NULL\'') ), 0 ); $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( NULL, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('NULL') ), 1 ); asrt( count( $debugger->grep('\'NULL\'') ), 0 ); /* log implicit INT param with StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( TRUE ); $debugger->log(' Hello ? ', array( 123 ) ); asrt( count( $debugger->grep('\'123\'') ), 1 ); /* log implicit STR param with StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( TRUE ); $debugger->log(' Hello ? ', array( 'abc' ) ); asrt( count( $debugger->grep('\'abc\'') ), 1 ); /* log NULL param with StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( TRUE ); $debugger->log(' Hello ? ', array( NULL ) ); asrt( count( $debugger->grep('\'NULL\'') ), 1 ); /* log explicit INT param with StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( TRUE ); $debugger->log(' Hello ? ', array( 123, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('\'123\'') ), 1 ); /* log explicit STR param with StringOnly */ $debugger->clear(); $debugger->setUseStringOnlyBinding( TRUE ); $debugger->log(' Hello ? ', array( 'abc', \PDO::PARAM_STR ) ); asrt( count( $debugger->grep('\'abc\'') ), 1 ); /* log NULL with explicit param type with StringOnly - remains just NULL */ $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( NULL, \PDO::PARAM_STR ) ); asrt( count( $debugger->grep('NULL') ), 1 ); asrt( count( $debugger->grep('\'NULL\'') ), 0 ); $debugger->clear(); $debugger->setUseStringOnlyBinding( FALSE ); $debugger->log(' Hello ? ', array( NULL, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('NULL') ), 1 ); asrt( count( $debugger->grep('\'NULL\'') ), 0 ); $debugger->setUseStringOnlyBinding( FALSE ); /* Does stringonly mode switch along with Database mode ? */ $database->setUseStringOnlyBinding( TRUE ); $debugger->clear(); $debugger->log(' Hello ? ', array( 123, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('\'123\'') ), 1 ); $database->setUseStringOnlyBinding( FALSE ); $debugger->clear(); $debugger->log(' Hello ? ', array( 123, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('\'123\'') ), 0 ); asrt( count( $debugger->grep('123') ), 1 ); $database->setUseStringOnlyBinding( TRUE ); $debugger->clear(); $debugger->log(' Hello ? ', array( 123, \PDO::PARAM_INT ) ); asrt( count( $debugger->grep('\'123\'') ), 1 ); $database->setUseStringOnlyBinding( FALSE ); $debugger->setUseStringOnlyBinding( FALSE ); } /** * Can we manually set a logger and enable logging? * * @return void */ public function testCanSetLogger() { R::nuke(); R::store( R::dispense( 'bean' ) ); $logger = new RDefault; $logger->setMode( RDefault::C_LOGGER_ARRAY ); $database = R::getDatabaseAdapter()->getDatabase(); $database->setLogger( $logger ); asrt( $database->getLogger(), $logger ); $database->setEnableLogging( FALSE ); $logs = $logger->getLogs(); asrt( is_array( $logs ), TRUE ); asrt( count( $logs ), 0 ); $database->setEnableLogging( TRUE ); $logs = $logger->getLogs(); asrt( is_array( $logs ), TRUE ); asrt( count( $logs ), 0 ); R::findOne( 'bean' ); //writes 3 log entries $logs = $logger->getLogs(); asrt( is_array( $logs ), TRUE ); asrt( count( $logs ), 3 ); } /** * Test query counter. * * @return void */ public function testQueryCount() { R::nuke(); R::store( R::dispense( 'bean' ) ); R::resetQueryCount(); asrt( R::getQueryCount(), 0 ); R::findOne( 'bean' ); asrt( R::getQueryCount(), 1 ); R::resetQueryCount(); asrt( R::getQueryCount(), 0 ); R::findOne( 'bean' ); R::findOne( 'bean' ); R::findOne( 'bean' ); asrt( R::getQueryCount(), 0 ); R::store( R::dispense( 'bean2' ) ); R::resetQueryCount(); R::findOne( 'bean' ); R::findOne( 'bean2' ); asrt( R::getQueryCount(), 2 ); R::resetQueryCount(); R::findOne( 'bean', ' id < 100' ); R::findOne( 'bean', ' id < 101' ); R::findOne( 'bean', ' id < 102' ); R::findOne( 'bean', ' id < 103' ); asrt( R::getQueryCount(), 4 ); R::findOne( 'bean', ' id < 100' ); R::findOne( 'bean', ' id < 101' ); R::findOne( 'bean', ' id < 102' ); R::findOne( 'bean', ' id < 103' ); asrt( R::getQueryCount(), 4 ); R::findOne( 'bean', ' id < 104' ); asrt( R::getQueryCount(), 5 ); } }