1: | <?php
|
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: | include_once XOOPS_ROOT_PATH . '/class/logger/xoopslogger.php';
|
27: | include_once XOOPS_ROOT_PATH . '/class/xoopsload.php';
|
28: | include_once XOOPS_ROOT_PATH . '/class/preload.php';
|
29: | include_once XOOPS_ROOT_PATH . '/class/database/databasefactory.php';
|
30: | include_once XOOPS_ROOT_PATH . '/class/database/' . XOOPS_DB_TYPE . 'database.php';
|
31: | include_once XOOPS_ROOT_PATH . '/class/database/sqlutility.php';
|
32: |
|
33: | |
34: | |
35: | |
36: | |
37: | |
38: | |
39: |
|
40: | class Db_manager
|
41: | {
|
42: | public $s_tables = array();
|
43: | public $f_tables = array();
|
44: | public $db;
|
45: |
|
46: | |
47: | |
48: |
|
49: | public function __construct()
|
50: | {
|
51: | $this->db = XoopsDatabaseFactory::getDatabase();
|
52: | $this->db->setPrefix(XOOPS_DB_PREFIX);
|
53: | $this->db->setLogger(XoopsLogger::getInstance());
|
54: | }
|
55: |
|
56: | |
57: | |
58: |
|
59: | public function isConnectable()
|
60: | {
|
61: | $isConnected = ($this->db->connect(false) !== false);
|
62: | if (!$isConnected) {
|
63: | $_SESSION['error'] = '(' . $this->db->conn->connect_errno . ') ' . $this->db->conn->connect_error;
|
64: | }
|
65: | return $isConnected;
|
66: | }
|
67: |
|
68: | |
69: | |
70: |
|
71: | public function dbExists()
|
72: | {
|
73: | return ($this->db->connect() != false);
|
74: | }
|
75: |
|
76: | |
77: | |
78: |
|
79: | public function createDB()
|
80: | {
|
81: | $this->db->connect(false);
|
82: |
|
83: | $result = $this->db->query('CREATE DATABASE ' . XOOPS_DB_NAME);
|
84: |
|
85: | return ($result != false);
|
86: | }
|
87: |
|
88: | |
89: | |
90: | |
91: | |
92: |
|
93: | public function queryFromFile($sql_file_path)
|
94: | {
|
95: | $tables = array();
|
96: |
|
97: | if (!file_exists($sql_file_path)) {
|
98: | return false;
|
99: | }
|
100: | $sql_query = trim(fread(fopen($sql_file_path, 'r'), filesize($sql_file_path)));
|
101: | SqlUtility::splitMySqlFile($pieces, $sql_query);
|
102: | $this->db->connect();
|
103: | foreach ($pieces as $piece) {
|
104: | $piece = trim($piece);
|
105: |
|
106: |
|
107: | $prefixed_query = SqlUtility::prefixQuery($piece, $this->db->prefix());
|
108: | if ($prefixed_query != false) {
|
109: | $table = $this->db->prefix($prefixed_query[4]);
|
110: | if ($prefixed_query[1] === 'CREATE TABLE') {
|
111: | if ($this->db->query($prefixed_query[0]) != false) {
|
112: | if (!isset($this->s_tables['create'][$table])) {
|
113: | $this->s_tables['create'][$table] = 1;
|
114: | }
|
115: | } else {
|
116: | if (!isset($this->f_tables['create'][$table])) {
|
117: | $this->f_tables['create'][$table] = 1;
|
118: | }
|
119: | }
|
120: | } elseif ($prefixed_query[1] === 'INSERT INTO') {
|
121: | if ($this->db->query($prefixed_query[0]) != false) {
|
122: | if (!isset($this->s_tables['insert'][$table])) {
|
123: | $this->s_tables['insert'][$table] = 1;
|
124: | } else {
|
125: | $this->s_tables['insert'][$table]++;
|
126: | }
|
127: | } else {
|
128: | if (!isset($this->f_tables['insert'][$table])) {
|
129: | $this->f_tables['insert'][$table] = 1;
|
130: | } else {
|
131: | $this->f_tables['insert'][$table]++;
|
132: | }
|
133: | }
|
134: | } elseif ($prefixed_query[1] === 'ALTER TABLE') {
|
135: | if ($this->db->query($prefixed_query[0]) != false) {
|
136: | if (!isset($this->s_tables['alter'][$table])) {
|
137: | $this->s_tables['alter'][$table] = 1;
|
138: | }
|
139: | } else {
|
140: | if (!isset($this->s_tables['alter'][$table])) {
|
141: | $this->f_tables['alter'][$table] = 1;
|
142: | }
|
143: | }
|
144: | } elseif ($prefixed_query[1] === 'DROP TABLE') {
|
145: | if ($this->db->query('DROP TABLE ' . $table) != false) {
|
146: | if (!isset($this->s_tables['drop'][$table])) {
|
147: | $this->s_tables['drop'][$table] = 1;
|
148: | }
|
149: | } else {
|
150: | if (!isset($this->s_tables['drop'][$table])) {
|
151: | $this->f_tables['drop'][$table] = 1;
|
152: | }
|
153: | }
|
154: | }
|
155: | }
|
156: | }
|
157: |
|
158: | return true;
|
159: | }
|
160: |
|
161: | public $successStrings = array(
|
162: | 'create' => TABLE_CREATED,
|
163: | 'insert' => ROWS_INSERTED,
|
164: | 'alter' => TABLE_ALTERED,
|
165: | 'drop' => TABLE_DROPPED);
|
166: | public $failureStrings = array(
|
167: | 'create' => TABLE_NOT_CREATED,
|
168: | 'insert' => ROWS_FAILED,
|
169: | 'alter' => TABLE_NOT_ALTERED,
|
170: | 'drop' => TABLE_NOT_DROPPED);
|
171: |
|
172: | |
173: | |
174: |
|
175: | public function report()
|
176: | {
|
177: | $commands = array('create', 'insert', 'alter', 'drop');
|
178: | $content = '<ul class="log">';
|
179: | foreach ($commands as $cmd) {
|
180: | if (!@empty($this->s_tables[$cmd])) {
|
181: | foreach ($this->s_tables[$cmd] as $key => $val) {
|
182: | $content .= '<li class="success">';
|
183: | $content .= ($cmd !== 'insert') ? sprintf($this->successStrings[$cmd], $key) : sprintf($this->successStrings[$cmd], $val, $key);
|
184: | $content .= "</li>\n";
|
185: | }
|
186: | }
|
187: | }
|
188: | foreach ($commands as $cmd) {
|
189: | if (!@empty($this->f_tables[$cmd])) {
|
190: | foreach ($this->f_tables[$cmd] as $key => $val) {
|
191: | $content .= '<li class="failure">';
|
192: | $content .= ($cmd !== 'insert') ? sprintf($this->failureStrings[$cmd], $key) : sprintf($this->failureStrings[$cmd], $val, $key);
|
193: | $content .= "</li>\n";
|
194: | }
|
195: | }
|
196: | }
|
197: | $content .= '</ul>';
|
198: |
|
199: | return $content;
|
200: | }
|
201: |
|
202: | |
203: | |
204: | |
205: | |
206: |
|
207: | public function query($sql)
|
208: | {
|
209: | $this->db->connect();
|
210: |
|
211: | return $this->db->query($sql);
|
212: | }
|
213: |
|
214: | |
215: | |
216: | |
217: | |
218: |
|
219: | public function prefix($table)
|
220: | {
|
221: | $this->db->connect();
|
222: |
|
223: | return $this->db->prefix($table);
|
224: | }
|
225: |
|
226: | |
227: | |
228: | |
229: | |
230: |
|
231: | public function fetchArray($ret)
|
232: | {
|
233: | $this->db->connect();
|
234: |
|
235: | return $this->db->fetchArray($ret);
|
236: | }
|
237: |
|
238: | |
239: | |
240: | |
241: | |
242: | |
243: |
|
244: | public function insert($table, $query)
|
245: | {
|
246: | $this->db->connect();
|
247: | $table = $this->db->prefix($table);
|
248: | $query = 'INSERT INTO ' . $table . ' ' . $query;
|
249: | if (!$this->db->queryF($query)) {
|
250: | if (!isset($this->f_tables['insert'][$table])) {
|
251: | $this->f_tables['insert'][$table] = 1;
|
252: | } else {
|
253: | $this->f_tables['insert'][$table]++;
|
254: | }
|
255: |
|
256: | return false;
|
257: | } else {
|
258: | if (!isset($this->s_tables['insert'][$table])) {
|
259: | $this->s_tables['insert'][$table] = 1;
|
260: | } else {
|
261: | $this->s_tables['insert'][$table]++;
|
262: | }
|
263: |
|
264: | return $this->db->getInsertId();
|
265: | }
|
266: | }
|
267: |
|
268: | |
269: | |
270: |
|
271: | public function isError()
|
272: | {
|
273: | return isset($this->f_tables) ? true : false;
|
274: | }
|
275: |
|
276: | |
277: | |
278: | |
279: | |
280: |
|
281: | public function deleteTables($tables)
|
282: | {
|
283: | $deleted = array();
|
284: | $this->db->connect();
|
285: | foreach ($tables as $key => $val) {
|
286: | if (!$this->db->query('DROP TABLE ' . $this->db->prefix($key))) {
|
287: | $deleted[] = $ct;
|
288: | }
|
289: | }
|
290: |
|
291: | return $deleted;
|
292: | }
|
293: |
|
294: | |
295: | |
296: | |
297: | |
298: |
|
299: | public function tableExists($table)
|
300: | {
|
301: | $table = trim($table);
|
302: | $ret = false;
|
303: | if ($table != '') {
|
304: | $this->db->connect();
|
305: | $sql = 'SELECT COUNT(*) FROM ' . $this->db->prefix($table);
|
306: | $ret = $this->db->query($sql);
|
307: | $ret = !empty($ret);
|
308: | }
|
309: |
|
310: | return $ret;
|
311: | }
|
312: | }
|
313: | |