db.php 2.22 KB
Newer Older
1
<?php
2 3
class Db
{
4 5

	/* @var Db $instance */
6
	private static $instance;
7 8

	/* @var IDb $adapter */
9
	private $adapter;
10

11
	private $link;
12 13

	/* @var PDO $pdo */
Andrew Dolgov's avatar
Andrew Dolgov committed
14
	private $pdo;
15

16 17 18 19 20 21 22 23
	private function __clone() {
		//
	}

	private function legacy_connect() {

		user_error("Legacy connect requested to " . DB_TYPE, E_USER_NOTICE);

Andrew Dolgov's avatar
initial  
Andrew Dolgov committed
24 25
		$er = error_reporting(E_ALL);

Andrew Dolgov's avatar
Andrew Dolgov committed
26
		switch (DB_TYPE) {
Andrew Dolgov's avatar
initial  
Andrew Dolgov committed
27
			case "mysql":
28
				$this->adapter = new Db_Mysqli();
Andrew Dolgov's avatar
initial  
Andrew Dolgov committed
29 30 31 32 33 34
				break;
			case "pgsql":
				$this->adapter = new Db_Pgsql();
				break;
			default:
				die("Unknown DB_TYPE: " . DB_TYPE);
35 36
		}

37 38 39 40
		if (!$this->adapter) {
			print("Error initializing database adapter for " . DB_TYPE);
			exit(100);
		}
Andrew Dolgov's avatar
initial  
Andrew Dolgov committed
41

42 43 44 45 46 47 48 49 50 51 52 53
		$this->link = $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, defined('DB_PORT') ? DB_PORT : "");

		if (!$this->link) {
			print("Error connecting through adapter: " . $this->adapter->last_error());
			exit(101);
		}

		error_reporting($er);
	}

	private function pdo_connect() {

54
		$db_port = defined('DB_PORT') && DB_PORT ? ';port=' . DB_PORT : '';
55
		$db_host = defined('DB_HOST') && DB_HOST ? ';host=' . DB_HOST : '';
Andrew Dolgov's avatar
Andrew Dolgov committed
56

57 58 59 60 61 62
		try {
			$this->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>";
Andrew Dolgov's avatar
Andrew Dolgov committed
63 64 65
			exit(101);
		}

66
		$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
67

68 69 70 71 72 73 74 75 76 77 78 79 80 81
		if (DB_TYPE == "pgsql") {

			$this->pdo->query("set client_encoding = 'UTF-8'");
			$this->pdo->query("set datestyle = 'ISO, european'");
			$this->pdo->query("set TIME ZONE 0");
			$this->pdo->query("set cpu_tuple_cost = 0.5");

		} else if (DB_TYPE == "mysql") {
			$this->pdo->query("SET time_zone = '+0:0'");

			if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) {
				$this->pdo->query("SET NAMES " . MYSQL_CHARSET);
			}
		}
82 83 84 85 86 87
	}

	public static function get() {
		if (self::$instance == null)
			self::$instance = new self();

88
		if (!self::$instance->adapter) {
89 90 91
			self::$instance->legacy_connect();
		}

92
		return self::$instance->adapter;
93 94
	}

95
	public static function pdo() {
96 97
		if (self::$instance == null)
			self::$instance = new self();
Andrew Dolgov's avatar
Andrew Dolgov committed
98

99
		if (!self::$instance->pdo) {
100 101 102
			self::$instance->pdo_connect();
		}

103
		return self::$instance->pdo;
104
	}
105
}