summaryrefslogtreecommitdiff
path: root/classes/db.php
blob: 05fb82d828c4ed7d3ca21a1582f94e2f491bb53a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?php
class Db implements IDb {

	/* @var Db $instance */
	private static $instance;

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

	private $link;

	/* @var PDO $pdo */
	private $pdo;

	private function __construct() {

	}

	private function __clone() {
		//
	}

	private function legacy_connect() {

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

		$er = error_reporting(E_ALL);

		switch (DB_TYPE) {
			case "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) {
			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) {
			print("Error connecting through adapter: " . $this->adapter->last_error());
			exit(101);
		}

		error_reporting($er);
	}

	private function pdo_connect() {

		$db_port = defined('DB_PORT') && DB_PORT ? ';port='.DB_PORT : '';

		$this->pdo = new PDO(DB_TYPE . ':dbname='.DB_NAME.';host='.DB_HOST.$db_port,
			DB_USER,
			DB_PASS);

		if (!$this->pdo) {
			print("Error connecting via PDO.");
			exit(101);
		}

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

		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);
			}
		}
	}

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

		if (!self::$instance->link) {
			self::$instance->legacy_connect();
		}

		return self::$instance;
	}

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

        if (!self::$instance->pdo) {
			self::$instance->pdo_connect();
		}

        return self::$instance->pdo;
    }

	static function quote($str){
		return("'$str'");
	}

	function reconnect() {
		$this->link = $this->adapter->connect(DB_HOST, DB_USER, DB_PASS, DB_NAME, defined('DB_PORT') ? DB_PORT : "");
	}

	function connect($host, $user, $pass, $db, $port) {
		//return $this->adapter->connect($host, $user, $pass, $db, $port);
		return ;
	}

	function escape_string($s, $strip_tags = true) {
		return $this->adapter->escape_string($s, $strip_tags);
	}

	function query($query, $die_on_error = true) {
		return $this->adapter->query($query, $die_on_error);
	}

	function fetch_assoc($result) {
		return $this->adapter->fetch_assoc($result);
	}

	function num_rows($result) {
		return $this->adapter->num_rows($result);
	}

	function fetch_result($result, $row, $param) {
		return $this->adapter->fetch_result($result, $row, $param);
	}

	function close() {
		return $this->adapter->close();
	}

	function affected_rows($result) {
		return $this->adapter->affected_rows($result);
	}

	function last_error() {
		return $this->adapter->last_error();
	}

	function last_query_error() {
		return $this->adapter->last_query_error();
	}
}