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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
<?php
/*
* SCROTT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* For more information, please refer to UNLICENSE
*/
/* Include database configuration file if it exists */
define("DATABASE_CONFIG_FILE", "dbconfig.php");
is_file(DATABASE_CONFIG_FILE) && require_once DATABASE_CONFIG_FILE;
require_once "class/globals.php";
require_once "class/mysql.class.php";
/*
* This class provides a common interface to various database drivers.
* Scrott provides facilities for interacting with any DBMS that we can
* use in PHP. To provide support for a new DBMS, extend this class and
* implement the abstract functions. Additionally, update the getInstance()
* function in this class so that the new implementation is used under
* appropriate configuration.
*/
abstract class database
{
private static $instance = NULL;
/*
* Call this object's close function while being destructed
*/
public function __destruct()
{
$this->_close();
}
/*
* Return the database instance object, creating it if this is the
* first call to this function. This function will need maintained
* as new DBMSs are supported. This function will throw if the
* database is not configured.
*/
private static function getInstance() : database
{
global $_SCROTT;
if (self::$instance)
return self::$instance;
if (!isset($_SCROTT['conf']))
throw new Exception("Scrott database configuration is missing.");
switch ($_SCROTT['dbEngine'])
{
case "mysql":
$host = $_SCROTT['dbHost'];
$uname = $_SCROTT['dbUname'];
$passwd = $_SCROTT['dbPasswd'];
$dbname = $_SCROTT['dbName'];
self::$instance = new mysql($host, $uname, $passwd, $dbname);
break;
default:
throw new Exception("Problem with Scrott database configuration. Invalid " .
"database engine specified.");
break;
}
return self::$instance;
}
/*
* These functions are to be implemented by DBMS extensions,
* providing a uniform interface to database engines.
*/
protected abstract function _close() : void;
protected abstract function _query(string $query) : array;
protected abstract function _esc(string $str) : string;
/*
* Perform a database query and return the results as an array
* of arrays.
*/
public static function query(string $query) : array
{
return self::getInstance()->_query($query);
}
/*
* Escape a given string for use in a database query
*/
public static function esc(string $str) : string
{
return self::getInstance()->_esc($str);
}
/*
* Check whether Scrott's database config is loaded
*/
public static function checkConfig() : bool
{
try
{
$db = self::getInstance();
}
catch (Exception $e)
{
return false;
}
return true;
}
/*
* Test and set new database configuration parameters.
* If the given params fail, error's are set and this
* function returns false. On success, parameters are
* written to 'dbconfig.php' and true is returned.
*/
public static function setConfig(string $engine, string $host,
string $uname, string $passwd, string $name) : bool
{
global $_SCROTT;
/* test configuration */
$_SCROTT['conf'] = "conf";
$_SCROTT['dbEngine'] = $engine;
$_SCROTT['dbHost'] = $host;
$_SCROTT['dbUname'] = $uname;
$_SCROTT['dbPasswd'] = $passwd;
$_SCROTT['dbName'] = $name;
try
{
$db = self::getInstance();
}
catch (Exception $e)
{
logError(ERROR, $e->getMessage());
return false;
}
/* write file */
$f = fopen(DATABASE_CONFIG_FILE, "w");
if (!$f)
{
logError(ERROR, "Can not create configuration file");
return false;
}
fwrite($f, "<?php\n");
fwrite($f, "\$_SCROTT['conf'] = 'conf';\n");
fwrite($f, "\$_SCROTT['dbEngine'] = '" . $engine . "';\n");
fwrite($f, "\$_SCROTT['dbHost'] = '" . $host . "';\n");
fwrite($f, "\$_SCROTT['dbUname'] = '" . $uname . "';\n");
fwrite($f, "\$_SCROTT['dbPasswd'] = '" . $passwd . "';\n");
fwrite($f, "\$_SCROTT['dbName'] = '" . $name . "';\n");
fwrite($f, "?>\n");
fclose($f);
return true;
}
}
?>
|