Open Power Driver internal error #'.$exc->getCode().': '.$exc->getMessage().'
Query used: '.opdClass::$lastQuery.'
'; } class opdClass { static public $lastQuery; public $dsn; public $debugConsole; // Debug etc. private $queryMonitor; private $consoleCode; private $i; private $counterExecuted = 0; private $counterRequested = 0; private $counterTime = 0; private $counterTimeExecuted = 0; private $transactions = 0; private $transactionsCommit = 0; private $transactionsRollback = 0; // PDO private $pdo; // Connection private $user; private $password; private $driverOpts; private $connected; // Cache private $cacheDir; private $cache; private $cacheId; private $cacheIds = array(); public function __construct($dsn, $user, $password, $driverOpts = array()) { $this -> dsn = $dsn; $this -> user = $user; $this -> password = $password; $this -> driverOpts = $driverOpts; $this -> queryCount = 0; $this -> i = 0; } // end __construct(); private function makeConnection() { if(is_null($this -> connected)) { $this -> connected = true; $this -> pdo = new PDO($this -> dsn, $this -> user, $this -> password, $this -> driverOpts); $this -> pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } } // end makeConnection(); public function __destruct() { if($this -> debugConsole) { if($this -> transactionsCommit + $this -> transactionsRollback != $this -> transactions) { // If any transaction closed automatically $this -> transactionsCommit = $this -> transactions - $this -> transactionsRollback; } $config = array( 'Open Power Driver version' => OPD_VERSION, 'DSN' => $this -> dsn, 'Database connection' => ($this -> connected ? 'Yes' : 'No'), 'Requested queries' => $this -> counterRequested, 'Executed queries' => $this -> counterExecuted, 'Total database time' => $this -> counterTime.' s', 'Executed queries time' => $this -> counterTimeExecuted.' s', 'Transactions opened' => $this -> transactions, 'Commited transactions' => $this -> transactionsCommit, 'Rolled back transactions' => $this -> transactionsRollback ); eval($this->consoleCode); if(isset($debugCode)) { echo ''; } } } // end __destruct(); static public function create($config) { if(is_string($config)) { $config = parse_ini_file($config); } if(!is_array($config)) { throw new Exception('Invalid Open Power Driver configuration: no configuration array.'); } $opd = new opdClass($config['dsn'], $config['user'], $config['password']); if(isset($config['cache'])) { $opd -> setCacheDirectory($config['cache']); } if(isset($config['debugConsole'])) { $opd -> debugConsole = $config['debugConsole']; } return $opd; } // end create(); public function beginTransaction() { $this -> transactions++; $this -> makeConnection(); return $this -> pdo -> beginTransaction(); } // end beginTransaction(); public function commit() { $this -> transactionsCommit++; $this -> makeConnection(); return $this -> pdo -> commit(); } // end commit(); public function errorCode() { $this -> makeConnection(); return $this -> pdo -> errorCode(); } // end errorCode(); public function errorInfo() { $this -> makeConnection(); return $this -> pdo -> errorInfo(); } // end errorInfo(); public function exec($statement, $id = NULL) { if(!is_null($id)) { $stmt = $this -> prepare($statement); $stmt -> bindValue(':id', $id, PDO::PARAM_INT); return $stmt -> execute(); } $this -> makeConnection(); $this -> beginDebugDefinition($statement); $this -> startTimer(false, false); $result = $this -> pdo -> exec($statement); $this -> endTimer(); opdClass::$lastQuery = $statement; $this -> endDebugDefinition($result); return $result; } // end exec(); public function getAttribute($attribute) { $this -> makeConnection(); return $this -> pdo -> getAttribute($attribute); } // end getAttribute(); public function getAvailableDrivers() { $this -> makeConnection(); return $this -> pdo -> getAvailableDrivers(); } // end getAvailableDrivers(); public function lastInsertId($sequence = NULL) { $this -> makeConnection(); if($sequence == NULL) { return $this -> pdo -> lastInsertId(); } return $this -> pdo -> lastInsertId($sequence); } // end lastInsertId(); public function prepare($statement, $options = array()) { if($this -> cache == false) { if(count($options) == 0) { $options = array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY); } $this -> makeConnection(); $result = $this -> pdo -> prepare($statement, $options); opdClass::$lastQuery = $statement; return new opdStatement($this, $result, $statement); } else { $cacheTests = array(); $needsQuery = 0; $result = NULL; $time = time(); if(count($this -> cacheIds) > 0) { foreach($this -> cacheIds as $idx => $id) { if($id == false) { // This instance must not be cached $cacheTests[] = array( 'id' => false, 'test' => false ); $needsQuery = 1; } else { // This instance should be cached if(!is_null($this -> cachePeroids[$idx])) { $test = (@filemtime($this->cacheDir.'%%'.$id.'.php') + $this -> cachePeroids[$idx] > $time); } else { $test = file_exists($this->cacheDir.'%%'.$id.'.php'); } $cacheTests[] = array( 'id' => $id, 'test' => $test ); if(!$test) { $needsQuery = 1; } } } } if($needsQuery) { if(count($options) == 0) { $options = array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY); } $this -> makeConnection(); $result = $this -> pdo -> prepare($statement, $options); opdClass::$lastQuery = $statement; } $this -> cacheIds = array(); $this -> cachePeroids = array(); $this -> cache = false; return new opdPreparedCacheStatement($this, $cacheTests, $result, $statement); } } // end prepare(); public function query($statement, $fetchMode = PDO::FETCH_ASSOC) { $this -> beginDebugDefinition($statement); if($this -> cache) { $this -> cache = false; if(!is_null($this -> cachePeroid)) { if(@filemtime($this->cacheDir.'%%'.$this->cacheId.'.php') + $this -> cachePeroid > time()) { $this -> cachePeroid = NULL; return new opdCachedStatement($this, true, $this->cacheId); } $this -> cachePeroid = NULL; } else { if(file_exists($this->cacheDir.'%%'.$this->cacheId.'.php')) { return new opdCachedStatement($this, true, $this->cacheId); } } $this -> makeConnection(); $this -> startTimer(true, false); $result = $this -> pdo -> query($statement); $this -> endTimer(); opdClass::$lastQuery = $statement; $result -> setFetchMode($fetchMode); return new opdCachedStatement($this, false, $result, $this->cacheId); } else { $this -> cache = false; $this -> makeConnection(); $this -> startTimer(false, false); $result = $this -> pdo -> query($statement); $this -> endTimer(); opdClass::$lastQuery = $statement; $result -> setFetchMode($fetchMode); return new opdStatement($this, $result); } } // end query(); public function quote($string, $parameterType = PDO::PARAM_STR) { $this -> makeConnection(); return $this -> pdo -> quote($string, $parameterType); } // end quote(); public function rollBack() { $this -> transactionsRollback++; $this -> makeConnection(); return $this -> pdo -> rollBack(); } // end rollBack(); public function setAttribute($name, $value) { $this -> makeConnection(); return $this -> pdo -> setAttribute($name, $value); } // end setAttribute(); // -------------------- // OPD-specific methods // -------------------- public function get($query) { $stmt = $this -> query($query, PDO::FETCH_NUM); if($row = $stmt -> fetch()) { $stmt -> closeCursor(); return $row[0]; } $stmt -> closeCursor(); return NULL; } // end get(); public function getId($query, $id) { $stmt = $this -> prepare($query); $stmt -> bindValue(':id', $id, PDO::PARAM_INT); $stmt -> execute(); if($row = $stmt -> fetch(PDO::FETCH_NUM)) { $stmt -> closeCursor(); return $row[0]; } $stmt -> closeCursor(); return NULL; } // end getId(); public function setCacheDirectory($dir) { $this -> cacheDir = $dir; } // end setCacheDirectory(); public function getCacheDirectory() { return $this -> cacheDir; } // end getCacheDirectory(); public function setCache($id, $prepare = false) { $this -> cache = true; $this -> cacheId = $id; $this -> cachePeroid = NULL; if($prepare == true) { $this -> cacheIds[] = $id; $this -> cachePeroids[] = NULL; } } // end setCache(); public function setCacheExpire($peroid, $id, $prepare = false) { $this -> cache = true; $this -> cacheId = $id; $this -> cachePeroid = $peroid; if($prepare == true) { $this -> cacheIds[] = $id; $this -> cachePeroids[] = $peroid; } } // end setCacheExpire(); public function clearCache($name) { if(file_exists($this -> cacheDir.'%%'.$name.'.php')) { unlink($this -> cacheDir.'%%'.$name.'.php'); return true; } return false; } // end clearCache(); public function clearCacheGroup($name) { $list = glob($this -> cacheDir.'%%'.$name.'.php', GLOB_BRACE); if(is_array($list)) { foreach($list as $file) { unlink($file); } return true; } return false; } // end clearCacheGroup(); public function getCounter() { return $this -> counterExecuted; } // end getCounter(); // -------------------- // Debug console methods // -------------------- public function beginDebugDefinition($query) { if($this -> debugConsole) { if(is_null($this -> consoleCode)) { $this -> consoleCode = file_get_contents(OPD_DIR.'opd.debug.php'); } $this -> queryMonitor[$this->i] = array( 'query' => $query, 'result' => '', 'cache' => 0, 'cached' => 0, 'execution' => 0 ); } } // end beginDebugDefinition(); public function startTimer($cacheEnabled, $cached) { $this -> counterRequested++; if(!$cached) { $this -> counterExecuted++; } $this -> queryMonitor[$this->i]['cache'] = $cacheEnabled == true ? 'Yes' : 'No'; $this -> queryMonitor[$this->i]['cached'] = $cached; if($this -> debugConsole) { $this -> time = microtime(true); } } // end startTimer(); public function endTimer() { if($this -> debugConsole) { $this -> queryMonitor[$this->i]['execution'] = round(microtime(true) - $this -> time, 6); $this -> counterTime += $this -> queryMonitor[$this->i]['execution']; if(!$this -> queryMonitor[$this->i]['cached']) { $this -> counterTimeExecuted += $this -> queryMonitor[$this->i]['execution']; } } } // end endTimer(); public function endDebugDefinition($result) { if($this -> debugConsole) { $this -> queryMonitor[$this -> i]['result'] = $result; $this -> i++; } } // end endDebugDefinition(); } ?>