-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathDatabase.php
130 lines (102 loc) · 3.18 KB
/
Database.php
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
<?php
class Database {
private $TablePrefix;
private $Statement = NULL;
private $PDO = NULL;
public function __construct($config) {
$this->CheckValid($config);
$this->Connect($config);
}
public function Query($query) {
$query = $this->ReplacePrefix($query);
return new \DatabaseResult($this->PDO->query($query));
}
public function Prepare($query) {
$query = $this->ReplacePrefix($query);
$this->Statement = new \DatabaseResult($this->PDO->prepare($query));
}
public function GetStatement($cleanup = true) {
if ($this->Statement === NULL)
throw new \LogicException('No one query has been prepared');
$Stmt = $this->Statement;
if ($cleanup)
$this->Statement = null;
return $Stmt;
}
public function BindData($name, $value, $type = NULL) {
if ($this->Statement === NULL)
throw new \LogicException('No one query has been prepared');
$this->Statement->BindData($name, $value, $type);
}
public function BindMultipleData($data) {
if ($this->Statement === NULL)
throw new \LogicException('No one query has been prepared');
$this->Statement->BindMultipleData($data);
}
public function Finish($Clean = true, $data = null) {
if ($this->Statement === NULL)
throw new \LogicException('No one query has been prepared');
try {
$Statement = $this->Statement;
$Statement->Execute($data);
if ($Clean)
$this->Statement = NULL;
return $Statement;
} catch (\Exception $e) {
\ExceptionHandler::handle($e);
}
}
public function BeginTxn() {
return $this->PDO->beginTransaction();
}
public function EndTxn($commit = true) {
if ($commit)
return $this->PDO->commit();
else
return $this->PDO->rollBack();
}
public function LastInsertID() {
return $this->PDO->lastInsertId();
}
public function ErrorCode() {
return $this->PDO->errorCode();
}
public function ErrorInfo() {
return $this->PDO->errorInfo();
}
public function GetAttribute($attr) {
return $this->PDO->getAttribute($attr);
}
/**
* internals
*/
private function CheckValid($configuration) {
if (!isset($configuration['dsn']))
throw new \LogicException('Invalid configuration passed.');
$ValidKeys = ['dsn', 'user', 'pass', 'options', 'prefix'];
$Required = [true, false, false, false, true];
foreach ($configuration as $Key => $Value) {
if (!in_array($Key, $ValidKeys, true))
throw new \LogicException("Unknown key $Key in configuration.");
}
foreach ($ValidKeys as $KeyID => $KeyName) {
if (!$Required[$KeyID])
continue;
if (!isset($configuration[$KeyName]))
throw new \LogicException("Required key $Key is not set.");
}
}
private function Connect($config) {
if ($this->PDO !== NULL)
return;
$dsn = $config['dsn'];
$user = $config['user'];
$pass = $config['pass'];
$options = $config['options'];
$this->PDO = new \PDO($dsn, $user, $pass, $options);
$this->TablePrefix = $config['prefix'];
}
private function ReplacePrefix($query) {
return str_replace('{{prefix}}', $this->TablePrefix, $query);
}
}