/**
  * @return MySQLiAdapter|PDOAdapter
  * @throws Exception
  */
 private function getAdapter()
 {
     // SS version >= 3.2
     if (class_exists('MySQLiConnector') && class_exists('PDOConnector')) {
         $connector = DB::get_connector();
         if ($connector instanceof MySQLiConnector) {
             $connProperty = new ReflectionProperty('MySQLiConnector', 'dbConn');
             $connProperty->setAccessible(true);
             $conn = $connProperty->getValue($connector);
             return new MySQLiAdapter($conn);
         } else {
             if ($connector instanceof PDOConnector) {
                 $connProperty = new ReflectionProperty('PDOConnector', 'pdoConnection');
                 $connProperty->setAccessible(true);
                 $conn = $connProperty->getValue($connector);
                 return new PDOAdapter($conn);
             }
         }
     } else {
         $db = DB::getConn();
         if ($db instanceof MySQLDatabase) {
             $connProperty = new ReflectionProperty('MySQLDatabase', 'dbConn');
             $connProperty->setAccessible(true);
             $conn = $connProperty->getValue($db);
             return new MySQLiAdapter($conn);
         }
     }
     throw new Exception('connection cannot be found');
 }
 public function testAffectedRows()
 {
     if (!DB::get_connector() instanceof PDOConnector) {
         $this->markTestSkipped('This test requires the current DB connector is PDO');
     }
     $query = new SQLUpdate('MySQLDatabaseTest_Data');
     $query->setAssignments(array('Title' => 'New Title'));
     // Test update which affects no rows
     $query->setWhere(array('Title' => 'Bob'));
     $result = $query->execute();
     $this->assertInstanceOf('PDOQuery', $result);
     $this->assertEquals(0, DB::affected_rows());
     // Test update which affects some rows
     $query->setWhere(array('Title' => 'First Item'));
     $result = $query->execute();
     $this->assertInstanceOf('PDOQuery', $result);
     $this->assertEquals(1, DB::affected_rows());
 }
 /**
  * Get the Debug Bar instance
  *
  * @global array $databaseConfig
  * @return DebugBar\StandardDebugBar
  */
 public static function getDebugBar()
 {
     if (self::$debugbar !== null) {
         return self::$debugbar;
     }
     if (!Director::isDev() || self::IsDisabled() || self::VendorNotInstalled() || self::NotLocalIp() || Director::is_cli() || self::IsDevUrl() || self::IsAdminUrl() && !self::config()->enabled_in_admin) {
         self::$debugbar = false;
         // No need to check again
         return;
     }
     // Add the controller extension programmaticaly because it might not be added properly through yml
     Controller::add_extension('DebugBarControllerExtension');
     // Add a custom logger that logs everything under the Messages tab
     SS_Log::add_writer(new DebugBarLogWriter(), SS_Log::DEBUG, '<=');
     self::$debugbar = $debugbar = new DebugBar\DebugBar();
     if (isset($_REQUEST['showqueries'])) {
         self::setShowQueries(true);
         echo "The queries above have been run before we started DebugBar";
         echo '<hr>';
         unset($_REQUEST['showqueries']);
     }
     $debugbar->addCollector(new DebugBar\DataCollector\PhpInfoCollector());
     $debugbar->addCollector(new DebugBar\DataCollector\MessagesCollector());
     $debugbar->addCollector(new DebugBar\DataCollector\TimeDataCollector());
     $debugbar->addCollector(new DebugBar\DataCollector\MemoryCollector());
     // On 3.1, PDO does not exist
     if (method_exists('DB', 'get_conn')) {
         if (!DB::get_conn()) {
             global $databaseConfig;
             if ($databaseConfig) {
                 DB::connect($databaseConfig);
             }
         }
         $connector = DB::get_connector();
         if (!self::config()->force_proxy && $connector instanceof PDOConnector) {
             // Use a little bit of magic to replace the pdo instance
             $refObject = new ReflectionObject($connector);
             $refProperty = $refObject->getProperty('pdoConnection');
             $refProperty->setAccessible(true);
             $traceablePdo = new DebugBar\DataCollector\PDO\TraceablePDO($refProperty->getValue($connector));
             $refProperty->setValue($connector, $traceablePdo);
             $debugbar->addCollector(new DebugBar\DataCollector\PDO\PDOCollector($traceablePdo));
         } else {
             DB::set_conn($db = new DebugBarDatabaseNewProxy(DB::get_conn()));
             $db->setShowQueries(self::getShowQueries());
             $debugbar->addCollector(new DebugBarDatabaseCollector($db));
         }
     } else {
         if (!DB::getConn()) {
             global $databaseConfig;
             if ($databaseConfig) {
                 DB::connect($databaseConfig);
             }
         }
         DB::setConn($db = new DebugBarDatabaseProxy(DB::getConn()));
         $db->setShowQueries(self::getShowQueries());
         $debugbar->addCollector(new DebugBarDatabaseCollector($db));
     }
     // Add some SilverStripe specific infos
     $debugbar->addCollector(new DebugBarSilverStripeCollector());
     if (self::config()->enable_storage) {
         $debugbar->setStorage(new DebugBar\Storage\FileStorage(TEMP_FOLDER . '/debugbar'));
     }
     // Since we buffer everything, why not enable all dev options ?
     if (self::config()->auto_debug) {
         $_REQUEST['debug'] = true;
         $_REQUEST['debug_request'] = true;
     }
     if (isset($_REQUEST['debug']) || isset($_REQUEST['debug_request'])) {
         self::$bufferingEnabled = true;
         ob_start();
         // We buffer everything until we have called an action
     }
     return $debugbar;
 }