]> git.wh0rd.org - tt-rss.git/blobdiff - classes/db.php
Logger_SQL: use separate PDO connection
[tt-rss.git] / classes / db.php
old mode 100644 (file)
new mode 100755 (executable)
index 9b800dc..ac493f6
 <?php
-class Db implements IDb {
+class Db
+{
+
+       /* @var Db $instance */
        private static $instance;
+
+       /* @var IDb $adapter */
        private $adapter;
+
        private $link;
 
-       private function __construct() {
+       /* @var PDO $pdo */
+       private $pdo;
+
+       private function __clone() {
+               //
+       }
+
+       private function legacy_connect() {
+
+               user_error("Legacy connect requested to " . DB_TYPE, E_USER_NOTICE);
 
                $er = error_reporting(E_ALL);
 
-               if (defined('_ENABLE_PDO') && _ENABLE_PDO && class_exists("PDO")) {
-                       $this->adapter = new Db_PDO();
-               } else {
-                       switch (DB_TYPE) {
+               switch (DB_TYPE) {
                        case "mysql":
-                               if (function_exists("mysqli_connect")) {
-                                       $this->adapter = new Db_Mysqli();
-                               } else {
-                                       $this->adapter = new Db_Mysql();
-                               }
+                               $this->adapter = new Db_Mysqli();
                                break;
                        case "pgsql":
                                $this->adapter = new Db_Pgsql();
                                break;
                        default:
                                die("Unknown DB_TYPE: " . DB_TYPE);
-                       }
                }
 
-               if (!$this->adapter) die("Error initializing database adapter for " . DB_TYPE);
+               if (!$this->adapter) {
+                       print("Error initializing database adapter for " . DB_TYPE);
+                       exit(100);
+               }
 
                $this->link = $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, defined('DB_PORT') ? DB_PORT : "");
 
                if (!$this->link) {
-                       die("Error connecting through adapter: " . $this->adapter->last_error());
+                       print("Error connecting through adapter: " . $this->adapter->last_error());
+                       exit(101);
                }
 
                error_reporting($er);
        }
 
-       private function __clone() {
-               //
-       }
+       // this really shouldn't be used unless a separate PDO connection is needed
+       // normal usage is Db::pdo()->prepare(...) etc
+       public function pdo_connect() {
 
-       public static function get() {
-               if (self::$instance == null)
-                       self::$instance = new self();
+               $db_port = defined('DB_PORT') && DB_PORT ? ';port=' . DB_PORT : '';
+               $db_host = defined('DB_HOST') && DB_HOST ? ';host=' . DB_HOST : '';
 
-               return self::$instance;
-       }
+               try {
+                       $pdo = new PDO(DB_TYPE . ':dbname=' . DB_NAME . $db_host . $db_port,
+                               DB_USER,
+                               DB_PASS);
+               } catch (Exception $e) {
+                       print "<pre>Exception while creating PDO object:" . $e->getMessage() . "</pre>";
+                       exit(101);
+               }
 
-       static function quote($str){
-               return("'$str'");
-       }
+               $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
-       function connect($host, $user, $pass, $db, $port) {
-               //return $this->adapter->connect($host, $user, $pass, $db, $port);
-               return ;
-       }
+               if (DB_TYPE == "pgsql") {
 
-       function escape_string($s, $strip_tags = true) {
-               return $this->adapter->escape_string($s, $strip_tags);
-       }
+                       $pdo->query("set client_encoding = 'UTF-8'");
+                       $pdo->query("set datestyle = 'ISO, european'");
+                       $pdo->query("set TIME ZONE 0");
+                       $pdo->query("set cpu_tuple_cost = 0.5");
 
-       function query($query, $die_on_error = true) {
-               return $this->adapter->query($query, $die_on_error);
-       }
+               } else if (DB_TYPE == "mysql") {
+                       $pdo->query("SET time_zone = '+0:0'");
 
-       function fetch_assoc($result) {
-               return $this->adapter->fetch_assoc($result);
-       }
+                       if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) {
+                               $pdo->query("SET NAMES " . MYSQL_CHARSET);
+                       }
+               }
 
-       function num_rows($result) {
-               return $this->adapter->num_rows($result);
+               return $pdo;
        }
 
-       function fetch_result($result, $row, $param) {
-               return $this->adapter->fetch_result($result, $row, $param);
-       }
+       public static function instance() {
+               if (self::$instance == null)
+                       self::$instance = new self();
 
-       function close() {
-               return $this->adapter->close();
+               return self::$instance;
        }
 
-       function affected_rows($result) {
-               return $this->adapter->affected_rows($result);
-       }
+       public static function get() {
+               if (self::$instance == null)
+                       self::$instance = new self();
 
-       function last_error() {
-               return $this->adapter->last_error();
+               if (!self::$instance->adapter) {
+                       self::$instance->legacy_connect();
+               }
+
+               return self::$instance->adapter;
        }
 
+       public static function pdo() {
+               if (self::$instance == null)
+                       self::$instance = new self();
+
+               if (!self::$instance->pdo) {
+                       self::$instance->pdo = self::$instance->pdo_connect();
+               }
+
+               return self::$instance->pdo;
+       }
 }
-?>