phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / acp / acp_database.php

History | View | Annotate | Download (58.8 kB)

1 5647 davidmj
<?php
2 8147 acydburn
/**
3 5647 davidmj
*
4 5647 davidmj
* @package acp
5 5647 davidmj
* @version $Id$
6 8147 acydburn
* @copyright (c) 2005 phpBB Group
7 8147 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5647 davidmj
*
9 5647 davidmj
*/
10 5647 davidmj
11 5647 davidmj
/**
12 8147 acydburn
* @ignore
13 8147 acydburn
*/
14 8147 acydburn
if (!defined('IN_PHPBB'))
15 8147 acydburn
{
16 8147 acydburn
        exit;
17 8147 acydburn
}
18 8147 acydburn
19 8147 acydburn
/**
20 5647 davidmj
* @package acp
21 5647 davidmj
*/
22 5647 davidmj
class acp_database
23 5647 davidmj
{
24 5647 davidmj
        var $u_action;
25 5647 davidmj
26 5647 davidmj
        function main($id, $mode)
27 5647 davidmj
        {
28 8525 acydburn
                global $cache, $db, $user, $auth, $template, $table_prefix;
29 6015 acydburn
                global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
30 9416 acydburn
31 5647 davidmj
                $user->add_lang('acp/database');
32 5647 davidmj
33 5647 davidmj
                $this->tpl_name = 'acp_database';
34 6106 davidmj
                $this->page_title = 'ACP_DATABASE';
35 5647 davidmj
36 5647 davidmj
                $action        = request_var('action', '');
37 5647 davidmj
                $submit = (isset($_POST['submit'])) ? true : false;
38 5647 davidmj
39 5647 davidmj
                $template->assign_vars(array(
40 5647 davidmj
                        'MODE'        => $mode
41 5647 davidmj
                ));
42 5647 davidmj
43 5647 davidmj
                switch ($mode)
44 5647 davidmj
                {
45 5647 davidmj
                        case 'backup':
46 5666 acydburn
47 6698 acydburn
                                $this->page_title = 'ACP_BACKUP';
48 6698 acydburn
49 5647 davidmj
                                switch ($action)
50 5647 davidmj
                                {
51 5647 davidmj
                                        case 'download':
52 5647 davidmj
                                                $type        = request_var('type', '');
53 5647 davidmj
                                                $table        = request_var('table', array(''));
54 5647 davidmj
                                                $format        = request_var('method', '');
55 6133 davidmj
                                                $where        = request_var('where', '');
56 5647 davidmj
57 6994 davidmj
                                                if (!sizeof($table))
58 6994 davidmj
                                                {
59 7893 davidmj
                                                        trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING);
60 6994 davidmj
                                                }
61 6994 davidmj
62 5874 davidmj
                                                $store = $download = $structure = $schema_data = false;
63 5789 davidmj
64 6106 davidmj
                                                if ($where == 'store_and_download' || $where == 'store')
65 5789 davidmj
                                                {
66 5789 davidmj
                                                        $store = true;
67 5789 davidmj
                                                }
68 5789 davidmj
69 6106 davidmj
                                                if ($where == 'store_and_download' || $where == 'download')
70 5789 davidmj
                                                {
71 5789 davidmj
                                                        $download = true;
72 5789 davidmj
                                                }
73 5789 davidmj
74 5874 davidmj
                                                if ($type == 'full' || $type == 'structure')
75 5874 davidmj
                                                {
76 5874 davidmj
                                                        $structure = true;
77 5874 davidmj
                                                }
78 5874 davidmj
79 5874 davidmj
                                                if ($type == 'full' || $type == 'data')
80 5874 davidmj
                                                {
81 5874 davidmj
                                                        $schema_data = true;
82 5874 davidmj
                                                }
83 5874 davidmj
84 5665 davidmj
                                                @set_time_limit(1200);
85 9417 acydburn
                                                @set_time_limit(0);
86 5665 davidmj
87 6295 davidmj
                                                $time = time();
88 5647 davidmj
89 6768 davidmj
                                                $filename = 'backup_' . $time . '_' . unique_id();
90 6988 davidmj
                                                switch ($db->sql_layer)
91 5708 davidmj
                                                {
92 6988 davidmj
                                                        case 'mysqli':
93 6988 davidmj
                                                        case 'mysql4':
94 6988 davidmj
                                                        case 'mysql':
95 6988 davidmj
                                                                $extractor = new mysql_extractor($download, $store, $format, $filename, $time);
96 5708 davidmj
                                                        break;
97 5708 davidmj
98 5647 davidmj
                                                        case 'sqlite':
99 6988 davidmj
                                                                $extractor = new sqlite_extractor($download, $store, $format, $filename, $time);
100 5647 davidmj
                                                        break;
101 5793 davidmj
102 5793 davidmj
                                                        case 'postgres':
103 6988 davidmj
                                                                $extractor = new postgres_extractor($download, $store, $format, $filename, $time);
104 5798 davidmj
                                                        break;
105 5793 davidmj
106 6988 davidmj
                                                        case 'oracle':
107 6988 davidmj
                                                                $extractor = new oracle_extractor($download, $store, $format, $filename, $time);
108 6988 davidmj
                                                        break;
109 6988 davidmj
110 5793 davidmj
                                                        case 'mssql':
111 5793 davidmj
                                                        case 'mssql_odbc':
112 10489 naderman
                                                        case 'mssqlnative':
113 6988 davidmj
                                                                $extractor = new mssql_extractor($download, $store, $format, $filename, $time);
114 5793 davidmj
                                                        break;
115 6988 davidmj
116 6988 davidmj
                                                        case 'firebird':
117 6988 davidmj
                                                                $extractor = new firebird_extractor($download, $store, $format, $filename, $time);
118 6988 davidmj
                                                        break;
119 5647 davidmj
                                                }
120 5647 davidmj
121 6988 davidmj
                                                $extractor->write_start($table_prefix);
122 6988 davidmj
123 5666 acydburn
                                                foreach ($table as $table_name)
124 5647 davidmj
                                                {
125 5666 acydburn
                                                        // Get the table structure
126 5874 davidmj
                                                        if ($structure)
127 5647 davidmj
                                                        {
128 6988 davidmj
                                                                $extractor->write_table($table_name);
129 6988 davidmj
                                                        }
130 6988 davidmj
                                                        else
131 6988 davidmj
                                                        {
132 6988 davidmj
                                                                // We might wanna empty out all that junk :D
133 6497 acydburn
                                                                switch ($db->sql_layer)
134 5666 acydburn
                                                                {
135 6099 davidmj
                                                                        case 'sqlite':
136 5803 davidmj
                                                                        case 'firebird':
137 6988 davidmj
                                                                                $extractor->flush('DELETE FROM ' . $table_name . ";\n");
138 5803 davidmj
                                                                        break;
139 5803 davidmj
140 5793 davidmj
                                                                        case 'mssql':
141 5798 davidmj
                                                                        case 'mssql_odbc':
142 10489 naderman
                                                                        case 'mssqlnative':
143 6988 davidmj
                                                                                $extractor->flush('TRUNCATE TABLE ' . $table_name . "GO\n");
144 5793 davidmj
                                                                        break;
145 6988 davidmj
146 6988 davidmj
                                                                        case 'oracle':
147 10174 acydburn
                                                                                $extractor->flush('TRUNCATE TABLE ' . $table_name . "/\n");
148 6954 davidmj
                                                                        break;
149 6954 davidmj
150 6954 davidmj
                                                                        default:
151 6988 davidmj
                                                                                $extractor->flush('TRUNCATE TABLE ' . $table_name . ";\n");
152 6954 davidmj
                                                                        break;
153 6954 davidmj
                                                                }
154 6145 davidmj
                                                        }
155 6497 acydburn
156 5666 acydburn
                                                        // Data
157 5874 davidmj
                                                        if ($schema_data)
158 5666 acydburn
                                                        {
159 6988 davidmj
                                                                $extractor->write_data($table_name);
160 5647 davidmj
                                                        }
161 5647 davidmj
                                                }
162 5647 davidmj
163 6994 davidmj
                                                $extractor->write_end();
164 5793 davidmj
165 8525 acydburn
                                                add_log('admin', 'LOG_DB_BACKUP');
166 8525 acydburn
167 5789 davidmj
                                                if ($download == true)
168 5708 davidmj
                                                {
169 5708 davidmj
                                                        exit;
170 5708 davidmj
                                                }
171 5666 acydburn
172 6428 acydburn
                                                trigger_error($user->lang['BACKUP_SUCCESS'] . adm_back_link($this->u_action));
173 5647 davidmj
                                        break;
174 5647 davidmj
175 5647 davidmj
                                        default:
176 7016 davidmj
                                                include($phpbb_root_path . 'includes/functions_install.' . $phpEx);
177 7016 davidmj
                                                $tables = get_tables($db);
178 8511 davidmj
                                                asort($tables);
179 7016 davidmj
                                                foreach ($tables as $table_name)
180 5647 davidmj
                                                {
181 7893 davidmj
                                                        if (strlen($table_prefix) === 0 || stripos($table_name, $table_prefix) === 0)
182 7016 davidmj
                                                        {
183 7016 davidmj
                                                                $template->assign_block_vars('tables', array(
184 7016 davidmj
                                                                        'TABLE'        => $table_name
185 7016 davidmj
                                                                ));
186 7016 davidmj
                                                        }
187 5647 davidmj
                                                }
188 7016 davidmj
                                                unset($tables);
189 5647 davidmj
190 5647 davidmj
                                                $template->assign_vars(array(
191 5647 davidmj
                                                        'U_ACTION'        => $this->u_action . '&amp;action=download'
192 5647 davidmj
                                                ));
193 9416 acydburn
194 5708 davidmj
                                                $available_methods = array('gzip' => 'zlib', 'bzip2' => 'bz2');
195 5708 davidmj
196 5708 davidmj
                                                foreach ($available_methods as $type => $module)
197 5708 davidmj
                                                {
198 5708 davidmj
                                                        if (!@extension_loaded($module))
199 5708 davidmj
                                                        {
200 5708 davidmj
                                                                continue;
201 5708 davidmj
                                                        }
202 5708 davidmj
203 5647 davidmj
                                                        $template->assign_block_vars('methods', array(
204 5647 davidmj
                                                                'TYPE'        => $type
205 5647 davidmj
                                                        ));
206 5647 davidmj
                                                }
207 6027 davidmj
208 6027 davidmj
                                                $template->assign_block_vars('methods', array(
209 6027 davidmj
                                                        'TYPE'        => 'text'
210 6027 davidmj
                                                ));
211 5647 davidmj
                                        break;
212 5647 davidmj
                                }
213 5647 davidmj
                        break;
214 5647 davidmj
215 5647 davidmj
                        case 'restore':
216 6698 acydburn
217 6698 acydburn
                                $this->page_title = 'ACP_RESTORE';
218 6698 acydburn
219 5647 davidmj
                                switch ($action)
220 5647 davidmj
                                {
221 5647 davidmj
                                        case 'submit':
222 5789 davidmj
                                                $delete = request_var('delete', '');
223 5891 davidmj
                                                $file = request_var('file', '');
224 11561 git-gate
                                                $download = request_var('download', '');
225 5789 davidmj
226 7279 davidmj
                                                if (!preg_match('#^backup_\d{10,}_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
227 7279 davidmj
                                                {
228 7279 davidmj
                                                        trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
229 7279 davidmj
                                                }
230 7279 davidmj
231 6027 davidmj
                                                $file_name = $phpbb_root_path . 'store/' . $matches[0];
232 6027 davidmj
233 7293 davidmj
                                                if (!file_exists($file_name) || !is_readable($file_name))
234 5891 davidmj
                                                {
235 6428 acydburn
                                                        trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
236 5891 davidmj
                                                }
237 5891 davidmj
238 5789 davidmj
                                                if ($delete)
239 5789 davidmj
                                                {
240 7472 davidmj
                                                        if (confirm_box(true))
241 7472 davidmj
                                                        {
242 7472 davidmj
                                                                unlink($file_name);
243 7531 davidmj
                                                                add_log('admin', 'LOG_DB_DELETE');
244 7472 davidmj
                                                                trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action));
245 7472 davidmj
                                                        }
246 7472 davidmj
                                                        else
247 7472 davidmj
                                                        {
248 7479 davidmj
                                                                confirm_box(false, $user->lang['DELETE_SELECTED_BACKUP'], build_hidden_fields(array('delete' => $delete, 'file' => $file)));
249 7472 davidmj
                                                        }
250 5789 davidmj
                                                }
251 11561 git-gate
                                                else if ($download || confirm_box(true))
252 7479 davidmj
                                                {
253 7479 davidmj
                                                        if ($download)
254 7479 davidmj
                                                        {
255 7479 davidmj
                                                                $name = $matches[0];
256 5789 davidmj
257 7479 davidmj
                                                                switch ($matches[1])
258 7479 davidmj
                                                                {
259 7479 davidmj
                                                                        case 'sql':
260 7479 davidmj
                                                                                $mimetype = 'text/x-sql';
261 7479 davidmj
                                                                        break;
262 7479 davidmj
                                                                        case 'sql.bz2':
263 7479 davidmj
                                                                                $mimetype = 'application/x-bzip2';
264 7479 davidmj
                                                                        break;
265 7479 davidmj
                                                                        case 'sql.gz':
266 7479 davidmj
                                                                                $mimetype = 'application/x-gzip';
267 7479 davidmj
                                                                        break;
268 7479 davidmj
                                                                }
269 5789 davidmj
270 7479 davidmj
                                                                header('Pragma: no-cache');
271 7479 davidmj
                                                                header("Content-Type: $mimetype; name=\"$name\"");
272 7479 davidmj
                                                                header("Content-disposition: attachment; filename=$name");
273 7479 davidmj
274 7479 davidmj
                                                                @set_time_limit(0);
275 7479 davidmj
276 7479 davidmj
                                                                $fp = @fopen($file_name, 'rb');
277 7479 davidmj
278 7479 davidmj
                                                                if ($fp !== false)
279 7479 davidmj
                                                                {
280 7479 davidmj
                                                                        while (!feof($fp))
281 7479 davidmj
                                                                        {
282 7479 davidmj
                                                                                echo fread($fp, 8192);
283 7479 davidmj
                                                                        }
284 7479 davidmj
                                                                        fclose($fp);
285 7479 davidmj
                                                                }
286 7479 davidmj
287 7479 davidmj
                                                                flush();
288 7479 davidmj
                                                                exit;
289 7479 davidmj
                                                        }
290 7479 davidmj
291 6791 davidmj
                                                        switch ($matches[1])
292 5789 davidmj
                                                        {
293 5789 davidmj
                                                                case 'sql':
294 7479 davidmj
                                                                        $fp = fopen($file_name, 'rb');
295 7479 davidmj
                                                                        $read = 'fread';
296 7479 davidmj
                                                                        $seek = 'fseek';
297 7479 davidmj
                                                                        $eof = 'feof';
298 7479 davidmj
                                                                        $close = 'fclose';
299 7479 davidmj
                                                                        $fgetd = 'fgetd';
300 5789 davidmj
                                                                break;
301 7479 davidmj
302 5789 davidmj
                                                                case 'sql.bz2':
303 7479 davidmj
                                                                        $fp = bzopen($file_name, 'r');
304 7479 davidmj
                                                                        $read = 'bzread';
305 7479 davidmj
                                                                        $seek = '';
306 7479 davidmj
                                                                        $eof = 'feof';
307 7479 davidmj
                                                                        $close = 'bzclose';
308 7479 davidmj
                                                                        $fgetd = 'fgetd_seekless';
309 5789 davidmj
                                                                break;
310 7479 davidmj
311 5789 davidmj
                                                                case 'sql.gz':
312 7479 davidmj
                                                                        $fp = gzopen($file_name, 'rb');
313 7479 davidmj
                                                                        $read = 'gzread';
314 7479 davidmj
                                                                        $seek = 'gzseek';
315 7479 davidmj
                                                                        $eof = 'gzeof';
316 7479 davidmj
                                                                        $close = 'gzclose';
317 7479 davidmj
                                                                        $fgetd = 'fgetd';
318 5789 davidmj
                                                                break;
319 5789 davidmj
                                                        }
320 5789 davidmj
321 7479 davidmj
                                                        switch ($db->sql_layer)
322 6053 davidmj
                                                        {
323 7479 davidmj
                                                                case 'mysql':
324 7479 davidmj
                                                                case 'mysql4':
325 7479 davidmj
                                                                case 'mysqli':
326 7479 davidmj
                                                                case 'sqlite':
327 7479 davidmj
                                                                        while (($sql = $fgetd($fp, ";\n", $read, $seek, $eof)) !== false)
328 7479 davidmj
                                                                        {
329 7479 davidmj
                                                                                $db->sql_query($sql);
330 7479 davidmj
                                                                        }
331 7479 davidmj
                                                                break;
332 5647 davidmj
333 7479 davidmj
                                                                case 'firebird':
334 7479 davidmj
                                                                        $delim = ";\n";
335 7479 davidmj
                                                                        while (($sql = $fgetd($fp, $delim, $read, $seek, $eof)) !== false)
336 6988 davidmj
                                                                        {
337 7479 davidmj
                                                                                $query = trim($sql);
338 7479 davidmj
                                                                                if (substr($query, 0, 8) === 'SET TERM')
339 7479 davidmj
                                                                                {
340 7479 davidmj
                                                                                        $delim = $query[9] . "\n";
341 7479 davidmj
                                                                                        continue;
342 7479 davidmj
                                                                                }
343 7479 davidmj
                                                                                $db->sql_query($query);
344 6988 davidmj
                                                                        }
345 7479 davidmj
                                                                break;
346 5647 davidmj
347 7479 davidmj
                                                                case 'postgres':
348 8472 Kellanved
                                                                        $delim = ";\n";
349 7479 davidmj
                                                                        while (($sql = $fgetd($fp, $delim, $read, $seek, $eof)) !== false)
350 6144 davidmj
                                                                        {
351 7479 davidmj
                                                                                $query = trim($sql);
352 8511 davidmj
353 8511 davidmj
                                                                                if (substr($query, 0, 13) == 'CREATE DOMAIN')
354 8511 davidmj
                                                                                {
355 8511 davidmj
                                                                                        list(, , $domain) = explode(' ', $query);
356 8511 davidmj
                                                                                        $sql = "SELECT domain_name
357 8511 davidmj
                                                                                                FROM information_schema.domains
358 8511 davidmj
                                                                                                WHERE domain_name = '$domain';";
359 8511 davidmj
                                                                                        $result = $db->sql_query($sql);
360 8511 davidmj
                                                                                        if (!$db->sql_fetchrow($result))
361 8511 davidmj
                                                                                        {
362 8511 davidmj
                                                                                                $db->sql_query($query);
363 8511 davidmj
                                                                                        }
364 8511 davidmj
                                                                                        $db->sql_freeresult($result);
365 8511 davidmj
                                                                                }
366 8511 davidmj
                                                                                else
367 8511 davidmj
                                                                                {
368 8511 davidmj
                                                                                        $db->sql_query($query);
369 8511 davidmj
                                                                                }
370 8511 davidmj
371 7479 davidmj
                                                                                if (substr($query, 0, 4) == 'COPY')
372 6988 davidmj
                                                                                {
373 7479 davidmj
                                                                                        while (($sub = $fgetd($fp, "\n", $read, $seek, $eof)) !== '\.')
374 7016 davidmj
                                                                                        {
375 7479 davidmj
                                                                                                if ($sub === false)
376 7479 davidmj
                                                                                                {
377 7893 davidmj
                                                                                                        trigger_error($user->lang['RESTORE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
378 7479 davidmj
                                                                                                }
379 7479 davidmj
                                                                                                pg_put_line($db->db_connect_id, $sub . "\n");
380 7016 davidmj
                                                                                        }
381 7479 davidmj
                                                                                        pg_put_line($db->db_connect_id, "\\.\n");
382 7479 davidmj
                                                                                        pg_end_copy($db->db_connect_id);
383 6988 davidmj
                                                                                }
384 6144 davidmj
                                                                        }
385 7479 davidmj
                                                                break;
386 6988 davidmj
387 7479 davidmj
                                                                case 'oracle':
388 7479 davidmj
                                                                        while (($sql = $fgetd($fp, "/\n", $read, $seek, $eof)) !== false)
389 7479 davidmj
                                                                        {
390 7479 davidmj
                                                                                $db->sql_query($sql);
391 7479 davidmj
                                                                        }
392 7479 davidmj
                                                                break;
393 6988 davidmj
394 7479 davidmj
                                                                case 'mssql':
395 7479 davidmj
                                                                case 'mssql_odbc':
396 10603 git-gate
                                                                case 'mssqlnative':
397 7479 davidmj
                                                                        while (($sql = $fgetd($fp, "GO\n", $read, $seek, $eof)) !== false)
398 7479 davidmj
                                                                        {
399 7479 davidmj
                                                                                $db->sql_query($sql);
400 7479 davidmj
                                                                        }
401 7479 davidmj
                                                                break;
402 7479 davidmj
                                                        }
403 7479 davidmj
404 7479 davidmj
                                                        $close($fp);
405 7479 davidmj
406 8525 acydburn
                                                        // Purge the cache due to updated data
407 8525 acydburn
                                                        $cache->purge();
408 8525 acydburn
409 7479 davidmj
                                                        add_log('admin', 'LOG_DB_RESTORE');
410 7479 davidmj
                                                        trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action));
411 6988 davidmj
                                                        break;
412 5647 davidmj
                                                }
413 11561 git-gate
                                                else if (!$download)
414 11561 git-gate
                                                {
415 11561 git-gate
                                                        confirm_box(false, $user->lang['RESTORE_SELECTED_BACKUP'], build_hidden_fields(array('file' => $file)));
416 11561 git-gate
                                                }
417 6988 davidmj
418 5647 davidmj
                                        default:
419 5708 davidmj
                                                $methods = array('sql');
420 5708 davidmj
                                                $available_methods = array('sql.gz' => 'zlib', 'sql.bz2' => 'bz2');
421 5647 davidmj
422 5708 davidmj
                                                foreach ($available_methods as $type => $module)
423 5708 davidmj
                                                {
424 5708 davidmj
                                                        if (!@extension_loaded($module))
425 5708 davidmj
                                                        {
426 5708 davidmj
                                                                continue;
427 5708 davidmj
                                                        }
428 5708 davidmj
                                                        $methods[] = $type;
429 5708 davidmj
                                                }
430 5708 davidmj
431 5647 davidmj
                                                $dir = $phpbb_root_path . 'store/';
432 6912 acydburn
                                                $dh = @opendir($dir);
433 6912 acydburn
434 9416 acydburn
                                                $backup_files = array();
435 9416 acydburn
436 6912 acydburn
                                                if ($dh)
437 5647 davidmj
                                                {
438 6912 acydburn
                                                        while (($file = readdir($dh)) !== false)
439 5647 davidmj
                                                        {
440 6912 acydburn
                                                                if (preg_match('#^backup_(\d{10,})_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
441 6912 acydburn
                                                                {
442 9416 acydburn
                                                                        if (in_array($matches[2], $methods))
443 6912 acydburn
                                                                        {
444 10478 bantu
                                                                                $backup_files[(int) $matches[1]] = $file;
445 6912 acydburn
                                                                        }
446 5647 davidmj
                                                                }
447 5647 davidmj
                                                        }
448 6912 acydburn
                                                        closedir($dh);
449 5647 davidmj
                                                }
450 5647 davidmj
451 9416 acydburn
                                                if (!empty($backup_files))
452 9416 acydburn
                                                {
453 9416 acydburn
                                                        krsort($backup_files);
454 9416 acydburn
455 9416 acydburn
                                                        foreach ($backup_files as $name => $file)
456 9416 acydburn
                                                        {
457 9416 acydburn
                                                                $template->assign_block_vars('files', array(
458 9416 acydburn
                                                                        'FILE'                => $file,
459 10478 bantu
                                                                        'NAME'                => $user->format_date($name, 'd-m-Y H:i:s', true),
460 9416 acydburn
                                                                        'SUPPORTED'        => true,
461 9416 acydburn
                                                                ));
462 9416 acydburn
                                                        }
463 9416 acydburn
                                                }
464 9416 acydburn
465 5647 davidmj
                                                $template->assign_vars(array(
466 5647 davidmj
                                                        'U_ACTION'        => $this->u_action . '&amp;action=submit'
467 5647 davidmj
                                                ));
468 5647 davidmj
                                        break;
469 5647 davidmj
                                }
470 5647 davidmj
                        break;
471 5647 davidmj
                }
472 5647 davidmj
        }
473 6988 davidmj
}
474 5666 acydburn
475 7050 acydburn
/**
476 7050 acydburn
* @package acp
477 7050 acydburn
*/
478 6988 davidmj
class base_extractor
479 6988 davidmj
{
480 6988 davidmj
        var $fh;
481 6988 davidmj
        var $fp;
482 6988 davidmj
        var $write;
483 6988 davidmj
        var $close;
484 6988 davidmj
        var $store;
485 6988 davidmj
        var $download;
486 6988 davidmj
        var $time;
487 6991 davidmj
        var $format;
488 6997 davidmj
        var $run_comp = false;
489 6988 davidmj
490 6988 davidmj
        function base_extractor($download = false, $store = false, $format, $filename, $time)
491 5666 acydburn
        {
492 6988 davidmj
                $this->download = $download;
493 6988 davidmj
                $this->store = $store;
494 6988 davidmj
                $this->time = $time;
495 6991 davidmj
                $this->format = $format;
496 6991 davidmj
497 6988 davidmj
                switch ($format)
498 6988 davidmj
                {
499 6988 davidmj
                        case 'text':
500 6988 davidmj
                                $ext = '.sql';
501 6988 davidmj
                                $open = 'fopen';
502 6988 davidmj
                                $this->write = 'fwrite';
503 6988 davidmj
                                $this->close = 'fclose';
504 6988 davidmj
                                $mimetype = 'text/x-sql';
505 6988 davidmj
                        break;
506 6988 davidmj
                        case 'bzip2':
507 6988 davidmj
                                $ext = '.sql.bz2';
508 6988 davidmj
                                $open = 'bzopen';
509 6988 davidmj
                                $this->write = 'bzwrite';
510 6988 davidmj
                                $this->close = 'bzclose';
511 6988 davidmj
                                $mimetype = 'application/x-bzip2';
512 6988 davidmj
                        break;
513 6988 davidmj
                        case 'gzip':
514 6988 davidmj
                                $ext = '.sql.gz';
515 6988 davidmj
                                $open = 'gzopen';
516 6988 davidmj
                                $this->write = 'gzwrite';
517 6988 davidmj
                                $this->close = 'gzclose';
518 6988 davidmj
                                $mimetype = 'application/x-gzip';
519 6988 davidmj
                        break;
520 6988 davidmj
                }
521 5666 acydburn
522 6988 davidmj
                if ($download == true)
523 6988 davidmj
                {
524 6988 davidmj
                        $name = $filename . $ext;
525 6988 davidmj
                        header('Pragma: no-cache');
526 6988 davidmj
                        header("Content-Type: $mimetype; name=\"$name\"");
527 6988 davidmj
                        header("Content-disposition: attachment; filename=$name");
528 9416 acydburn
529 6988 davidmj
                        switch ($format)
530 6988 davidmj
                        {
531 6988 davidmj
                                case 'bzip2':
532 6991 davidmj
                                        ob_start();
533 6988 davidmj
                                break;
534 6991 davidmj
535 6988 davidmj
                                case 'gzip':
536 7006 davidmj
                                        if ((isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'msie') === false)
537 6997 davidmj
                                        {
538 6997 davidmj
                                                ob_start('ob_gzhandler');
539 6997 davidmj
                                        }
540 6997 davidmj
                                        else
541 6997 davidmj
                                        {
542 6997 davidmj
                                                $this->run_comp = true;
543 6997 davidmj
                                        }
544 6988 davidmj
                                break;
545 6988 davidmj
                        }
546 6988 davidmj
                }
547 9416 acydburn
548 6988 davidmj
                if ($store == true)
549 6988 davidmj
                {
550 6988 davidmj
                        global $phpbb_root_path;
551 6988 davidmj
                        $file = $phpbb_root_path . 'store/' . $filename . $ext;
552 9416 acydburn
553 6988 davidmj
                        $this->fp = $open($file, 'w');
554 9416 acydburn
555 6988 davidmj
                        if (!$this->fp)
556 6988 davidmj
                        {
557 9773 bantu
                                trigger_error('FILE_WRITE_FAIL', E_USER_ERROR);
558 6988 davidmj
                        }
559 6988 davidmj
                }
560 6988 davidmj
        }
561 5666 acydburn
562 6988 davidmj
        function write_end()
563 6988 davidmj
        {
564 6988 davidmj
                static $close;
565 9417 acydburn
566 6988 davidmj
                if ($this->store)
567 5666 acydburn
                {
568 6988 davidmj
                        if ($close === null)
569 6988 davidmj
                        {
570 6988 davidmj
                                $close = $this->close;
571 6988 davidmj
                        }
572 6988 davidmj
                        $close($this->fp);
573 6988 davidmj
                }
574 5666 acydburn
575 6991 davidmj
                // bzip2 must be written all the way at the end
576 6993 davidmj
                if ($this->download && $this->format === 'bzip2')
577 6988 davidmj
                {
578 6991 davidmj
                        $c = ob_get_clean();
579 6991 davidmj
                        echo bzcompress($c);
580 6988 davidmj
                }
581 6988 davidmj
        }
582 6988 davidmj
583 6988 davidmj
        function flush($data)
584 6988 davidmj
        {
585 6988 davidmj
                static $write;
586 6988 davidmj
                if ($this->store === true)
587 6988 davidmj
                {
588 6988 davidmj
                        if ($write === null)
589 6988 davidmj
                        {
590 6988 davidmj
                                $write = $this->write;
591 6988 davidmj
                        }
592 6988 davidmj
                        $write($this->fp, $data);
593 6988 davidmj
                }
594 6988 davidmj
595 6988 davidmj
                if ($this->download === true)
596 6988 davidmj
                {
597 7016 davidmj
                        if ($this->format === 'bzip2' || $this->format === 'text' || ($this->format === 'gzip' && !$this->run_comp))
598 6997 davidmj
                        {
599 6997 davidmj
                                echo $data;
600 6997 davidmj
                        }
601 6991 davidmj
602 6991 davidmj
                        // we can write the gzip data as soon as we get it
603 6991 davidmj
                        if ($this->format === 'gzip')
604 6991 davidmj
                        {
605 6997 davidmj
                                if ($this->run_comp)
606 6997 davidmj
                                {
607 6997 davidmj
                                        echo gzencode($data);
608 6997 davidmj
                                }
609 6997 davidmj
                                else
610 6997 davidmj
                                {
611 6997 davidmj
                                        ob_flush();
612 6997 davidmj
                                        flush();
613 6997 davidmj
                                }
614 6991 davidmj
                        }
615 6988 davidmj
                }
616 6988 davidmj
        }
617 6988 davidmj
}
618 6988 davidmj
619 7050 acydburn
/**
620 7050 acydburn
* @package acp
621 7050 acydburn
*/
622 6988 davidmj
class mysql_extractor extends base_extractor
623 6988 davidmj
{
624 6988 davidmj
        function write_start($table_prefix)
625 6988 davidmj
        {
626 6988 davidmj
                $sql_data = "#\n";
627 6988 davidmj
                $sql_data .= "# phpBB Backup Script\n";
628 6988 davidmj
                $sql_data .= "# Dump of tables for $table_prefix\n";
629 6988 davidmj
                $sql_data .= "# DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
630 6988 davidmj
                $sql_data .= "#\n";
631 6988 davidmj
                $this->flush($sql_data);
632 6988 davidmj
        }
633 6988 davidmj
634 6988 davidmj
        function write_table($table_name)
635 6988 davidmj
        {
636 6988 davidmj
                global $db;
637 6988 davidmj
                static $new_extract;
638 6988 davidmj
639 6988 davidmj
                if ($new_extract === null)
640 6988 davidmj
                {
641 8814 acydburn
                        if ($db->sql_layer === 'mysqli' || version_compare($db->sql_server_info(true), '3.23.20', '>='))
642 6989 davidmj
                        {
643 6989 davidmj
                                $new_extract = true;
644 6989 davidmj
                        }
645 6989 davidmj
                        else
646 6989 davidmj
                        {
647 6989 davidmj
                                $new_extract = false;
648 6989 davidmj
                        }
649 6988 davidmj
                }
650 6988 davidmj
651 6988 davidmj
                if ($new_extract)
652 6988 davidmj
                {
653 6988 davidmj
                        $this->new_write_table($table_name);
654 6988 davidmj
                }
655 6988 davidmj
                else
656 6988 davidmj
                {
657 6988 davidmj
                        $this->old_write_table($table_name);
658 6988 davidmj
                }
659 6988 davidmj
        }
660 6988 davidmj
661 6988 davidmj
        function write_data($table_name)
662 6988 davidmj
        {
663 6988 davidmj
                global $db;
664 6988 davidmj
                if ($db->sql_layer === 'mysqli')
665 6988 davidmj
                {
666 6988 davidmj
                        $this->write_data_mysqli($table_name);
667 6988 davidmj
                }
668 6988 davidmj
                else
669 6988 davidmj
                {
670 6988 davidmj
                        $this->write_data_mysql($table_name);
671 6988 davidmj
                }
672 6988 davidmj
        }
673 6988 davidmj
674 6988 davidmj
        function write_data_mysqli($table_name)
675 6988 davidmj
        {
676 6988 davidmj
                global $db;
677 6988 davidmj
                $sql = "SELECT *
678 6988 davidmj
                        FROM $table_name";
679 6988 davidmj
                $result = mysqli_query($db->db_connect_id, $sql, MYSQLI_USE_RESULT);
680 6988 davidmj
                if ($result != false)
681 6988 davidmj
                {
682 6988 davidmj
                        $fields_cnt = mysqli_num_fields($result);
683 9416 acydburn
684 6988 davidmj
                        // Get field information
685 6988 davidmj
                        $field = mysqli_fetch_fields($result);
686 6988 davidmj
                        $field_set = array();
687 9416 acydburn
688 6988 davidmj
                        for ($j = 0; $j < $fields_cnt; $j++)
689 6988 davidmj
                        {
690 6988 davidmj
                                $field_set[] = $field[$j]->name;
691 6988 davidmj
                        }
692 7141 davidmj
693 6988 davidmj
                        $search                        = array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
694 6988 davidmj
                        $replace                = array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
695 6988 davidmj
                        $fields                        = implode(', ', $field_set);
696 6988 davidmj
                        $sql_data                = 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
697 6988 davidmj
                        $first_set                = true;
698 7141 davidmj
                        $query_len                = 0;
699 7141 davidmj
                        $max_len                = get_usable_memory();
700 9416 acydburn
701 6988 davidmj
                        while ($row = mysqli_fetch_row($result))
702 6988 davidmj
                        {
703 6988 davidmj
                                $values        = array();
704 6988 davidmj
                                if ($first_set)
705 6732 davidmj
                                {
706 7141 davidmj
                                        $query = $sql_data . '(';
707 6988 davidmj
                                }
708 6988 davidmj
                                else
709 6988 davidmj
                                {
710 7141 davidmj
                                        $query  .= ',(';
711 6988 davidmj
                                }
712 6988 davidmj
713 6988 davidmj
                                for ($j = 0; $j < $fields_cnt; $j++)
714 6988 davidmj
                                {
715 6988 davidmj
                                        if (!isset($row[$j]) || is_null($row[$j]))
716 6732 davidmj
                                        {
717 6988 davidmj
                                                $values[$j] = 'NULL';
718 6732 davidmj
                                        }
719 6988 davidmj
                                        else if (($field[$j]->flags & 32768) && !($field[$j]->flags & 1024))
720 6988 davidmj
                                        {
721 6988 davidmj
                                                $values[$j] = $row[$j];
722 6988 davidmj
                                        }
723 6732 davidmj
                                        else
724 6732 davidmj
                                        {
725 6988 davidmj
                                                $values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
726 6732 davidmj
                                        }
727 6732 davidmj
                                }
728 7141 davidmj
                                $query .= implode(', ', $values) . ')';
729 6732 davidmj
730 7141 davidmj
                                $query_len += strlen($query);
731 7141 davidmj
                                if ($query_len > $max_len)
732 7141 davidmj
                                {
733 7141 davidmj
                                        $this->flush($query . ";\n\n");
734 7141 davidmj
                                        $query = '';
735 7141 davidmj
                                        $query_len = 0;
736 7141 davidmj
                                        $first_set = true;
737 7141 davidmj
                                }
738 7141 davidmj
                                else
739 7141 davidmj
                                {
740 7141 davidmj
                                        $first_set = false;
741 7141 davidmj
                                }
742 6988 davidmj
                        }
743 6988 davidmj
                        mysqli_free_result($result);
744 5666 acydburn
745 7141 davidmj
                        // check to make sure we have nothing left to flush
746 7141 davidmj
                        if (!$first_set && $query)
747 6988 davidmj
                        {
748 7141 davidmj
                                $this->flush($query . ";\n\n");
749 6988 davidmj
                        }
750 6988 davidmj
                }
751 6988 davidmj
        }
752 5666 acydburn
753 6988 davidmj
        function write_data_mysql($table_name)
754 6988 davidmj
        {
755 6988 davidmj
                global $db;
756 6988 davidmj
                $sql = "SELECT *
757 6988 davidmj
                        FROM $table_name";
758 6988 davidmj
                $result = mysql_unbuffered_query($sql, $db->db_connect_id);
759 5666 acydburn
760 6988 davidmj
                if ($result != false)
761 6988 davidmj
                {
762 6988 davidmj
                        $fields_cnt = mysql_num_fields($result);
763 5666 acydburn
764 6988 davidmj
                        // Get field information
765 6988 davidmj
                        $field = array();
766 8147 acydburn
                        for ($i = 0; $i < $fields_cnt; $i++)
767 6988 davidmj
                        {
768 6988 davidmj
                                $field[] = mysql_fetch_field($result, $i);
769 6988 davidmj
                        }
770 6988 davidmj
                        $field_set = array();
771 9416 acydburn
772 6988 davidmj
                        for ($j = 0; $j < $fields_cnt; $j++)
773 6988 davidmj
                        {
774 6988 davidmj
                                $field_set[] = $field[$j]->name;
775 6988 davidmj
                        }
776 5666 acydburn
777 6988 davidmj
                        $search                        = array("\\", "'", "\x00", "\x0a", "\x0d", "\x1a", '"');
778 6988 davidmj
                        $replace                = array("\\\\", "\\'", '\0', '\n', '\r', '\Z', '\\"');
779 6988 davidmj
                        $fields                        = implode(', ', $field_set);
780 7141 davidmj
                        $sql_data                = 'INSERT INTO ' . $table_name . ' (' . $fields . ') VALUES ';
781 7141 davidmj
                        $first_set                = true;
782 7141 davidmj
                        $query_len                = 0;
783 7141 davidmj
                        $max_len                = get_usable_memory();
784 5666 acydburn
785 6988 davidmj
                        while ($row = mysql_fetch_row($result))
786 6988 davidmj
                        {
787 6988 davidmj
                                $values = array();
788 6988 davidmj
                                if ($first_set)
789 5666 acydburn
                                {
790 7141 davidmj
                                        $query = $sql_data . '(';
791 5666 acydburn
                                }
792 6988 davidmj
                                else
793 6988 davidmj
                                {
794 7141 davidmj
                                        $query  .= ',(';
795 6988 davidmj
                                }
796 5666 acydburn
797 6988 davidmj
                                for ($j = 0; $j < $fields_cnt; $j++)
798 5666 acydburn
                                {
799 6988 davidmj
                                        if (!isset($row[$j]) || is_null($row[$j]))
800 5666 acydburn
                                        {
801 6988 davidmj
                                                $values[$j] = 'NULL';
802 5666 acydburn
                                        }
803 6988 davidmj
                                        else if ($field[$j]->numeric && ($field[$j]->type !== 'timestamp'))
804 5666 acydburn
                                        {
805 6988 davidmj
                                                $values[$j] = $row[$j];
806 5666 acydburn
                                        }
807 5666 acydburn
                                        else
808 5666 acydburn
                                        {
809 6988 davidmj
                                                $values[$j] = "'" . str_replace($search, $replace, $row[$j]) . "'";
810 5666 acydburn
                                        }
811 5666 acydburn
                                }
812 7141 davidmj
                                $query .= implode(', ', $values) . ')';
813 5666 acydburn
814 7141 davidmj
                                $query_len += strlen($query);
815 7141 davidmj
                                if ($query_len > $max_len)
816 7141 davidmj
                                {
817 7141 davidmj
                                        $this->flush($query . ";\n\n");
818 7141 davidmj
                                        $query = '';
819 7141 davidmj
                                        $query_len = 0;
820 7141 davidmj
                                        $first_set = true;
821 7141 davidmj
                                }
822 7141 davidmj
                                else
823 7141 davidmj
                                {
824 7141 davidmj
                                        $first_set = false;
825 7141 davidmj
                                }
826 6988 davidmj
                        }
827 6988 davidmj
                        mysql_free_result($result);
828 6988 davidmj
829 7141 davidmj
                        // check to make sure we have nothing left to flush
830 7141 davidmj
                        if (!$first_set && $query)
831 6988 davidmj
                        {
832 7141 davidmj
                                $this->flush($query . ";\n\n");
833 6988 davidmj
                        }
834 6988 davidmj
                }
835 6988 davidmj
        }
836 6988 davidmj
837 6988 davidmj
        function new_write_table($table_name)
838 6988 davidmj
        {
839 6988 davidmj
                global $db;
840 6988 davidmj
841 6988 davidmj
                $sql = 'SHOW CREATE TABLE ' . $table_name;
842 6988 davidmj
                $result = $db->sql_query($sql);
843 6988 davidmj
                $row = $db->sql_fetchrow($result);
844 6988 davidmj
845 6988 davidmj
                $sql_data = '# Table: ' . $table_name . "\n";
846 6988 davidmj
                $sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
847 6988 davidmj
                $this->flush($sql_data . $row['Create Table'] . ";\n\n");
848 6988 davidmj
849 6988 davidmj
                $db->sql_freeresult($result);
850 6988 davidmj
        }
851 6988 davidmj
852 6988 davidmj
        function old_write_table($table_name)
853 6988 davidmj
        {
854 6988 davidmj
                global $db;
855 6988 davidmj
856 6988 davidmj
                $sql_data = '# Table: ' . $table_name . "\n";
857 6988 davidmj
                $sql_data .= "DROP TABLE IF EXISTS $table_name;\n";
858 6988 davidmj
                $sql_data .= "CREATE TABLE $table_name(\n";
859 6988 davidmj
                $rows = array();
860 6988 davidmj
861 6988 davidmj
                $sql = "SHOW FIELDS
862 6988 davidmj
                        FROM $table_name";
863 6988 davidmj
                $result = $db->sql_query($sql);
864 6988 davidmj
865 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
866 6988 davidmj
                {
867 6988 davidmj
                        $line = '   ' . $row['Field'] . ' ' . $row['Type'];
868 6988 davidmj
869 6988 davidmj
                        if (!is_null($row['Default']))
870 6988 davidmj
                        {
871 6988 davidmj
                                $line .= " DEFAULT '{$row['Default']}'";
872 6988 davidmj
                        }
873 6988 davidmj
874 6988 davidmj
                        if ($row['Null'] != 'YES')
875 6988 davidmj
                        {
876 6988 davidmj
                                $line .= ' NOT NULL';
877 6988 davidmj
                        }
878 6988 davidmj
879 6988 davidmj
                        if ($row['Extra'] != '')
880 6988 davidmj
                        {
881 6988 davidmj
                                $line .= ' ' . $row['Extra'];
882 6988 davidmj
                        }
883 6988 davidmj
884 6988 davidmj
                        $rows[] = $line;
885 6988 davidmj
                }
886 6988 davidmj
                $db->sql_freeresult($result);
887 6988 davidmj
888 6988 davidmj
                $sql = "SHOW KEYS
889 6988 davidmj
                        FROM $table_name";
890 6988 davidmj
891 6988 davidmj
                $result = $db->sql_query($sql);
892 6988 davidmj
893 6988 davidmj
                $index = array();
894 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
895 6988 davidmj
                {
896 6988 davidmj
                        $kname = $row['Key_name'];
897 6988 davidmj
898 6988 davidmj
                        if ($kname != 'PRIMARY')
899 6988 davidmj
                        {
900 6988 davidmj
                                if ($row['Non_unique'] == 0)
901 6607 davidmj
                                {
902 6988 davidmj
                                        $kname = "UNIQUE|$kname";
903 6607 davidmj
                                }
904 6988 davidmj
                        }
905 5666 acydburn
906 6988 davidmj
                        if ($row['Sub_part'])
907 6988 davidmj
                        {
908 6988 davidmj
                                $row['Column_name'] .= '(' . $row['Sub_part'] . ')';
909 6988 davidmj
                        }
910 6988 davidmj
                        $index[$kname][] = $row['Column_name'];
911 6988 davidmj
                }
912 6988 davidmj
                $db->sql_freeresult($result);
913 5666 acydburn
914 6988 davidmj
                foreach ($index as $key => $columns)
915 6988 davidmj
                {
916 6988 davidmj
                        $line = '   ';
917 5666 acydburn
918 6988 davidmj
                        if ($key == 'PRIMARY')
919 6988 davidmj
                        {
920 6988 davidmj
                                $line .= 'PRIMARY KEY (' . implode(', ', $columns) . ')';
921 6988 davidmj
                        }
922 6988 davidmj
                        else if (strpos($key, 'UNIQUE') === 0)
923 6988 davidmj
                        {
924 6988 davidmj
                                $line .= 'UNIQUE ' . substr($key, 7) . ' (' . implode(', ', $columns) . ')';
925 6988 davidmj
                        }
926 6988 davidmj
                        else if (strpos($key, 'FULLTEXT') === 0)
927 6988 davidmj
                        {
928 6988 davidmj
                                $line .= 'FULLTEXT ' . substr($key, 9) . ' (' . implode(', ', $columns) . ')';
929 6988 davidmj
                        }
930 6988 davidmj
                        else
931 6988 davidmj
                        {
932 6988 davidmj
                                $line .= "KEY $key (" . implode(', ', $columns) . ')';
933 6988 davidmj
                        }
934 5666 acydburn
935 6988 davidmj
                        $rows[] = $line;
936 6988 davidmj
                }
937 5666 acydburn
938 6988 davidmj
                $sql_data .= implode(",\n", $rows);
939 6988 davidmj
                $sql_data .= "\n);\n\n";
940 5666 acydburn
941 6988 davidmj
                $this->flush($sql_data);
942 6988 davidmj
        }
943 6988 davidmj
}
944 6988 davidmj
945 7050 acydburn
/**
946 7050 acydburn
* @package acp
947 7050 acydburn
*/
948 6988 davidmj
class sqlite_extractor extends base_extractor
949 6988 davidmj
{
950 6988 davidmj
        function write_start($prefix)
951 6988 davidmj
        {
952 6988 davidmj
                $sql_data = "--\n";
953 6988 davidmj
                $sql_data .= "-- phpBB Backup Script\n";
954 6988 davidmj
                $sql_data .= "-- Dump of tables for $prefix\n";
955 6988 davidmj
                $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
956 6988 davidmj
                $sql_data .= "--\n";
957 6988 davidmj
                $sql_data .= "BEGIN TRANSACTION;\n";
958 6988 davidmj
                $this->flush($sql_data);
959 6988 davidmj
        }
960 6988 davidmj
961 6988 davidmj
        function write_table($table_name)
962 6988 davidmj
        {
963 6988 davidmj
                global $db;
964 6988 davidmj
                $sql_data = '-- Table: ' . $table_name . "\n";
965 6988 davidmj
                $sql_data .= "DROP TABLE $table_name;\n";
966 6988 davidmj
967 6988 davidmj
                $sql = "SELECT sql
968 8147 acydburn
                        FROM sqlite_master
969 8147 acydburn
                        WHERE type = 'table'
970 6988 davidmj
                                AND name = '" . $db->sql_escape($table_name) . "'
971 6988 davidmj
                        ORDER BY type DESC, name;";
972 6988 davidmj
                $result = $db->sql_query($sql);
973 6988 davidmj
                $row = $db->sql_fetchrow($result);
974 6988 davidmj
                $db->sql_freeresult($result);
975 6988 davidmj
976 6988 davidmj
                // Create Table
977 6988 davidmj
                $sql_data .= $row['sql'] . ";\n";
978 6988 davidmj
979 6988 davidmj
                $result = $db->sql_query("PRAGMA index_list('" . $db->sql_escape($table_name) . "');");
980 6988 davidmj
981 6988 davidmj
                $ar = array();
982 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
983 6988 davidmj
                {
984 6988 davidmj
                        $ar[] = $row;
985 6988 davidmj
                }
986 6988 davidmj
                $db->sql_freeresult($result);
987 9416 acydburn
988 6988 davidmj
                foreach ($ar as $value)
989 6988 davidmj
                {
990 6988 davidmj
                        if (strpos($value['name'], 'autoindex') !== false)
991 6988 davidmj
                        {
992 6988 davidmj
                                continue;
993 6988 davidmj
                        }
994 6988 davidmj
995 6988 davidmj
                        $result = $db->sql_query("PRAGMA index_info('" . $db->sql_escape($value['name']) . "');");
996 6988 davidmj
997 6988 davidmj
                        $fields = array();
998 6988 davidmj
                        while ($row = $db->sql_fetchrow($result))
999 6988 davidmj
                        {
1000 6988 davidmj
                                $fields[] = $row['name'];
1001 6988 davidmj
                        }
1002 6988 davidmj
                        $db->sql_freeresult($result);
1003 6988 davidmj
1004 6988 davidmj
                        $sql_data .= 'CREATE ' . ($value['unique'] ? 'UNIQUE ' : '') . 'INDEX ' . $value['name'] . ' on ' . $table_name . ' (' . implode(', ', $fields) . ");\n";
1005 6988 davidmj
                }
1006 6988 davidmj
1007 6988 davidmj
                $this->flush($sql_data . "\n");
1008 6988 davidmj
        }
1009 6988 davidmj
1010 6988 davidmj
        function write_data($table_name)
1011 6988 davidmj
        {
1012 6988 davidmj
                global $db;
1013 6988 davidmj
                static $proper;
1014 6988 davidmj
1015 6988 davidmj
                if (is_null($proper))
1016 6988 davidmj
                {
1017 7255 davidmj
                        $proper = version_compare(PHP_VERSION, '5.1.3', '>=');
1018 6988 davidmj
                }
1019 6988 davidmj
1020 6988 davidmj
                if ($proper)
1021 6988 davidmj
                {
1022 6988 davidmj
                        $col_types = sqlite_fetch_column_types($db->db_connect_id, $table_name);
1023 6988 davidmj
                }
1024 6988 davidmj
                else
1025 6988 davidmj
                {
1026 6988 davidmj
                        $sql = "SELECT sql
1027 8147 acydburn
                                FROM sqlite_master
1028 8147 acydburn
                                WHERE type = 'table'
1029 6988 davidmj
                                        AND name = '" . $table_name . "'";
1030 6988 davidmj
                        $table_data = sqlite_single_query($db->db_connect_id, $sql);
1031 6988 davidmj
                        $table_data = preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', '', $table_data);
1032 6988 davidmj
                        $table_data = trim($table_data);
1033 6988 davidmj
1034 6988 davidmj
                        preg_match('#\((.*)\)#s', $table_data, $matches);
1035 6988 davidmj
1036 6988 davidmj
                        $table_cols = explode(',', trim($matches[1]));
1037 6988 davidmj
                        foreach ($table_cols as $declaration)
1038 6988 davidmj
                        {
1039 6988 davidmj
                                $entities = preg_split('#\s+#', trim($declaration));
1040 6988 davidmj
                                $column_name = preg_replace('/"?([^"]+)"?/', '\1', $entities[0]);
1041 6988 davidmj
1042 6988 davidmj
                                // Hit a primary key, those are not what we need :D
1043 6988 davidmj
                                if (empty($entities[1]) || (strtolower($entities[0]) === 'primary' && strtolower($entities[1]) === 'key'))
1044 5666 acydburn
                                {
1045 6988 davidmj
                                        continue;
1046 5666 acydburn
                                }
1047 6988 davidmj
                                $col_types[$column_name] = $entities[1];
1048 6988 davidmj
                        }
1049 6988 davidmj
                }
1050 6988 davidmj
1051 6988 davidmj
                $sql = "SELECT *
1052 6988 davidmj
                        FROM $table_name";
1053 6988 davidmj
                $result = sqlite_unbuffered_query($db->db_connect_id, $sql);
1054 6988 davidmj
                $rows = sqlite_fetch_all($result, SQLITE_ASSOC);
1055 6988 davidmj
                $sql_insert = 'INSERT INTO ' . $table_name . ' (' . implode(', ', array_keys($col_types)) . ') VALUES (';
1056 6988 davidmj
                foreach ($rows as $row)
1057 6988 davidmj
                {
1058 6988 davidmj
                        foreach ($row as $column_name => $column_data)
1059 6988 davidmj
                        {
1060 6988 davidmj
                                if (is_null($column_data))
1061 5666 acydburn
                                {
1062 6988 davidmj
                                        $row[$column_name] = 'NULL';
1063 6988 davidmj
                                }
1064 6988 davidmj
                                else if ($column_data == '')
1065 6988 davidmj
                                {
1066 6988 davidmj
                                        $row[$column_name] = "''";
1067 6988 davidmj
                                }
1068 6988 davidmj
                                else if (strpos($col_types[$column_name], 'text') !== false || strpos($col_types[$column_name], 'char') !== false || strpos($col_types[$column_name], 'blob') !== false)
1069 6988 davidmj
                                {
1070 7530 davidmj
                                        $row[$column_name] = sanitize_data_generic(str_replace("'", "''", $column_data));
1071 6988 davidmj
                                }
1072 6988 davidmj
                        }
1073 6988 davidmj
                        $this->flush($sql_insert . implode(', ', $row) . ");\n");
1074 6988 davidmj
                }
1075 6988 davidmj
        }
1076 5666 acydburn
1077 6988 davidmj
        function write_end()
1078 6988 davidmj
        {
1079 6988 davidmj
                $this->flush("COMMIT;\n");
1080 6988 davidmj
                parent::write_end();
1081 6988 davidmj
        }
1082 6988 davidmj
}
1083 5666 acydburn
1084 7050 acydburn
/**
1085 7050 acydburn
* @package acp
1086 7050 acydburn
*/
1087 6988 davidmj
class postgres_extractor extends base_extractor
1088 6988 davidmj
{
1089 6988 davidmj
        function write_start($prefix)
1090 6988 davidmj
        {
1091 6988 davidmj
                $sql_data = "--\n";
1092 6988 davidmj
                $sql_data .= "-- phpBB Backup Script\n";
1093 6988 davidmj
                $sql_data .= "-- Dump of tables for $prefix\n";
1094 6988 davidmj
                $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
1095 6988 davidmj
                $sql_data .= "--\n";
1096 6988 davidmj
                $sql_data .= "BEGIN TRANSACTION;\n";
1097 6988 davidmj
                $this->flush($sql_data);
1098 6988 davidmj
        }
1099 5666 acydburn
1100 6988 davidmj
        function write_table($table_name)
1101 6988 davidmj
        {
1102 6988 davidmj
                global $db;
1103 6988 davidmj
                static $domains_created = array();
1104 6988 davidmj
1105 6988 davidmj
                $sql = "SELECT a.domain_name, a.data_type, a.character_maximum_length, a.domain_default
1106 6988 davidmj
                        FROM INFORMATION_SCHEMA.domains a, INFORMATION_SCHEMA.column_domain_usage b
1107 6988 davidmj
                        WHERE a.domain_name = b.domain_name
1108 6988 davidmj
                                AND b.table_name = '{$table_name}'";
1109 6988 davidmj
                $result = $db->sql_query($sql);
1110 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1111 6988 davidmj
                {
1112 6988 davidmj
                        if (empty($domains_created[$row['domain_name']]))
1113 6988 davidmj
                        {
1114 6988 davidmj
                                $domains_created[$row['domain_name']] = true;
1115 6988 davidmj
                                //$sql_data = "DROP DOMAIN {$row['domain_name']};\n";
1116 6988 davidmj
                                $sql_data = "CREATE DOMAIN {$row['domain_name']} as {$row['data_type']}";
1117 6988 davidmj
                                if (!empty($row['character_maximum_length']))
1118 6988 davidmj
                                {
1119 6988 davidmj
                                        $sql_data .= '(' . $row['character_maximum_length'] . ')';
1120 5666 acydburn
                                }
1121 6988 davidmj
                                $sql_data .= ' NOT NULL';
1122 6988 davidmj
                                if (!empty($row['domain_default']))
1123 6988 davidmj
                                {
1124 6988 davidmj
                                        $sql_data .= ' DEFAULT ' . $row['domain_default'];
1125 6988 davidmj
                                }
1126 6988 davidmj
                                $this->flush($sql_data . ";\n");
1127 6988 davidmj
                        }
1128 6988 davidmj
                }
1129 5666 acydburn
1130 6988 davidmj
                $sql_data = '-- Table: ' . $table_name . "\n";
1131 8511 davidmj
                $sql_data .= "DROP TABLE $table_name;\n";
1132 6988 davidmj
                // PGSQL does not "tightly" bind sequences and tables, we must guess...
1133 6988 davidmj
                $sql = "SELECT relname
1134 6988 davidmj
                        FROM pg_class
1135 6988 davidmj
                        WHERE relkind = 'S'
1136 6988 davidmj
                                AND relname = '{$table_name}_seq'";
1137 6988 davidmj
                $result = $db->sql_query($sql);
1138 6988 davidmj
                // We don't even care about storing the results. We already know the answer if we get rows back.
1139 6988 davidmj
                if ($db->sql_fetchrow($result))
1140 6988 davidmj
                {
1141 6988 davidmj
                        $sql_data .= "DROP SEQUENCE {$table_name}_seq;\n";
1142 6988 davidmj
                        $sql_data .= "CREATE SEQUENCE {$table_name}_seq;\n";
1143 6988 davidmj
                }
1144 6988 davidmj
                $db->sql_freeresult($result);
1145 9416 acydburn
1146 6988 davidmj
                $field_query = "SELECT a.attnum, a.attname as field, t.typname as type, a.attlen as length, a.atttypmod as lengthvar, a.attnotnull as notnull
1147 6988 davidmj
                        FROM pg_class c, pg_attribute a, pg_type t
1148 6988 davidmj
                        WHERE c.relname = '" . $db->sql_escape($table_name) . "'
1149 6988 davidmj
                                AND a.attnum > 0
1150 6988 davidmj
                                AND a.attrelid = c.oid
1151 6988 davidmj
                                AND a.atttypid = t.oid
1152 6988 davidmj
                        ORDER BY a.attnum";
1153 6988 davidmj
                $result = $db->sql_query($field_query);
1154 5666 acydburn
1155 6988 davidmj
                $sql_data .= "CREATE TABLE $table_name(\n";
1156 6988 davidmj
                $lines = array();
1157 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1158 6988 davidmj
                {
1159 6988 davidmj
                        // Get the data from the table
1160 6988 davidmj
                        $sql_get_default = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
1161 6988 davidmj
                                FROM pg_attrdef d, pg_class c
1162 6988 davidmj
                                WHERE (c.relname = '" . $db->sql_escape($table_name) . "')
1163 6988 davidmj
                                        AND (c.oid = d.adrelid)
1164 6988 davidmj
                                        AND d.adnum = " . $row['attnum'];
1165 6988 davidmj
                        $def_res = $db->sql_query($sql_get_default);
1166 9928 bantu
                        $def_row = $db->sql_fetchrow($def_res);
1167 9928 bantu
                        $db->sql_freeresult($def_res);
1168 6988 davidmj
1169 9928 bantu
                        if (empty($def_row))
1170 6988 davidmj
                        {
1171 6988 davidmj
                                unset($row['rowdefault']);
1172 6988 davidmj
                        }
1173 6988 davidmj
                        else
1174 6988 davidmj
                        {
1175 9928 bantu
                                $row['rowdefault'] = $def_row['rowdefault'];
1176 6988 davidmj
                        }
1177 6988 davidmj
1178 6988 davidmj
                        if ($row['type'] == 'bpchar')
1179 6988 davidmj
                        {
1180 6988 davidmj
                                // Internally stored as bpchar, but isn't accepted in a CREATE TABLE statement.
1181 6988 davidmj
                                $row['type'] = 'char';
1182 6988 davidmj
                        }
1183 6988 davidmj
1184 6988 davidmj
                        $line = '  ' . $row['field'] . ' ' . $row['type'];
1185 6988 davidmj
1186 6988 davidmj
                        if (strpos($row['type'], 'char') !== false)
1187 6988 davidmj
                        {
1188 6988 davidmj
                                if ($row['lengthvar'] > 0)
1189 6027 davidmj
                                {
1190 6988 davidmj
                                        $line .= '(' . ($row['lengthvar'] - 4) . ')';
1191 6027 davidmj
                                }
1192 6988 davidmj
                        }
1193 5846 davidmj
1194 6988 davidmj
                        if (strpos($row['type'], 'numeric') !== false)
1195 6988 davidmj
                        {
1196 6988 davidmj
                                $line .= '(';
1197 6988 davidmj
                                $line .= sprintf("%s,%s", (($row['lengthvar'] >> 16) & 0xffff), (($row['lengthvar'] - 4) & 0xffff));
1198 6988 davidmj
                                $line .= ')';
1199 6988 davidmj
                        }
1200 6988 davidmj
1201 8511 davidmj
                        if (isset($row['rowdefault']))
1202 6988 davidmj
                        {
1203 6988 davidmj
                                $line .= ' DEFAULT ' . $row['rowdefault'];
1204 6988 davidmj
                        }
1205 6988 davidmj
1206 6988 davidmj
                        if ($row['notnull'] == 't')
1207 6988 davidmj
                        {
1208 6988 davidmj
                                $line .= ' NOT NULL';
1209 6988 davidmj
                        }
1210 9416 acydburn
1211 6988 davidmj
                        $lines[] = $line;
1212 6988 davidmj
                }
1213 6988 davidmj
                $db->sql_freeresult($result);
1214 6988 davidmj
1215 6988 davidmj
1216 6988 davidmj
                // Get the listing of primary keys.
1217 6988 davidmj
                $sql_pri_keys = "SELECT ic.relname as index_name, bc.relname as tab_name, ta.attname as column_name, i.indisunique as unique_key, i.indisprimary as primary_key
1218 6988 davidmj
                        FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
1219 6988 davidmj
                        WHERE (bc.oid = i.indrelid)
1220 6988 davidmj
                                AND (ic.oid = i.indexrelid)
1221 6988 davidmj
                                AND (ia.attrelid = i.indexrelid)
1222 6988 davidmj
                                AND        (ta.attrelid = bc.oid)
1223 6988 davidmj
                                AND (bc.relname = '" . $db->sql_escape($table_name) . "')
1224 6988 davidmj
                                AND (ta.attrelid = i.indrelid)
1225 6988 davidmj
                                AND (ta.attnum = i.indkey[ia.attnum-1])
1226 6988 davidmj
                        ORDER BY index_name, tab_name, column_name";
1227 6988 davidmj
1228 6988 davidmj
                $result = $db->sql_query($sql_pri_keys);
1229 6988 davidmj
1230 6988 davidmj
                $index_create = $index_rows = $primary_key = array();
1231 6988 davidmj
1232 6988 davidmj
                // We do this in two steps. It makes placing the comma easier
1233 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1234 6988 davidmj
                {
1235 6988 davidmj
                        if ($row['primary_key'] == 't')
1236 6988 davidmj
                        {
1237 6988 davidmj
                                $primary_key[] = $row['column_name'];
1238 6988 davidmj
                                $primary_key_name = $row['index_name'];
1239 6988 davidmj
                        }
1240 6988 davidmj
                        else
1241 6988 davidmj
                        {
1242 6988 davidmj
                                // We have to store this all this info because it is possible to have a multi-column key...
1243 6988 davidmj
                                // we can loop through it again and build the statement
1244 6988 davidmj
                                $index_rows[$row['index_name']]['table'] = $table_name;
1245 6988 davidmj
                                $index_rows[$row['index_name']]['unique'] = ($row['unique_key'] == 't') ? true : false;
1246 6988 davidmj
                                $index_rows[$row['index_name']]['column_names'][] = $row['column_name'];
1247 6988 davidmj
                        }
1248 6988 davidmj
                }
1249 6988 davidmj
                $db->sql_freeresult($result);
1250 6988 davidmj
1251 6988 davidmj
                if (!empty($index_rows))
1252 6988 davidmj
                {
1253 6988 davidmj
                        foreach ($index_rows as $idx_name => $props)
1254 6988 davidmj
                        {
1255 6988 davidmj
                                $index_create[] = 'CREATE ' . ($props['unique'] ? 'UNIQUE ' : '') . "INDEX $idx_name ON $table_name (" . implode(', ', $props['column_names']) . ");";
1256 6988 davidmj
                        }
1257 6988 davidmj
                }
1258 6988 davidmj
1259 6988 davidmj
                if (!empty($primary_key))
1260 6988 davidmj
                {
1261 6988 davidmj
                        $lines[] = "  CONSTRAINT $primary_key_name PRIMARY KEY (" . implode(', ', $primary_key) . ")";
1262 6988 davidmj
                }
1263 6988 davidmj
1264 6988 davidmj
                // Generate constraint clauses for CHECK constraints
1265 6988 davidmj
                $sql_checks = "SELECT conname as index_name, consrc
1266 6988 davidmj
                        FROM pg_constraint, pg_class bc
1267 6988 davidmj
                        WHERE conrelid = bc.oid
1268 6988 davidmj
                                AND bc.relname = '" . $db->sql_escape($table_name) . "'
1269 6988 davidmj
                                AND NOT EXISTS (
1270 6988 davidmj
                                        SELECT *
1271 6988 davidmj
                                                FROM pg_constraint as c, pg_inherits as i
1272 6988 davidmj
                                                WHERE i.inhrelid = pg_constraint.conrelid
1273 6988 davidmj
                                                        AND c.conname = pg_constraint.conname
1274 6988 davidmj
                                                        AND c.consrc = pg_constraint.consrc
1275 6988 davidmj
                                                        AND c.conrelid = i.inhparent
1276 6988 davidmj
                                )";
1277 6988 davidmj
                $result = $db->sql_query($sql_checks);
1278 6988 davidmj
1279 6988 davidmj
                // Add the constraints to the sql file.
1280 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1281 6988 davidmj
                {
1282 6988 davidmj
                        if (!is_null($row['consrc']))
1283 6988 davidmj
                        {
1284 6988 davidmj
                                $lines[] = '  CONSTRAINT ' . $row['index_name'] . ' CHECK ' . $row['consrc'];
1285 6988 davidmj
                        }
1286 6988 davidmj
                }
1287 6988 davidmj
                $db->sql_freeresult($result);
1288 6988 davidmj
1289 6988 davidmj
                $sql_data .= implode(", \n", $lines);
1290 6988 davidmj
                $sql_data .= "\n);\n";
1291 6988 davidmj
1292 6988 davidmj
                if (!empty($index_create))
1293 6988 davidmj
                {
1294 6988 davidmj
                        $sql_data .= implode("\n", $index_create) . "\n\n";
1295 6988 davidmj
                }
1296 6988 davidmj
                $this->flush($sql_data);
1297 6988 davidmj
        }
1298 6988 davidmj
1299 6988 davidmj
        function write_data($table_name)
1300 6988 davidmj
        {
1301 6988 davidmj
                global $db;
1302 6988 davidmj
                // Grab all of the data from current table.
1303 6988 davidmj
                $sql = "SELECT *
1304 6988 davidmj
                        FROM $table_name";
1305 6988 davidmj
                $result = $db->sql_query($sql);
1306 6988 davidmj
1307 6988 davidmj
                $i_num_fields = pg_num_fields($result);
1308 6988 davidmj
                $seq = '';
1309 6988 davidmj
1310 6988 davidmj
                for ($i = 0; $i < $i_num_fields; $i++)
1311 6988 davidmj
                {
1312 6988 davidmj
                        $ary_type[] = pg_field_type($result, $i);
1313 6988 davidmj
                        $ary_name[] = pg_field_name($result, $i);
1314 6988 davidmj
1315 6988 davidmj
1316 6988 davidmj
                        $sql = "SELECT pg_get_expr(d.adbin, d.adrelid) as rowdefault
1317 6988 davidmj
                                FROM pg_attrdef d, pg_class c
1318 6988 davidmj
                                WHERE (c.relname = '{$table_name}')
1319 6988 davidmj
                                        AND (c.oid = d.adrelid)
1320 6988 davidmj
                                        AND d.adnum = " . strval($i + 1);
1321 6988 davidmj
                        $result2 = $db->sql_query($sql);
1322 6988 davidmj
                        if ($row = $db->sql_fetchrow($result2))
1323 6988 davidmj
                        {
1324 6988 davidmj
                                // Determine if we must reset the sequences
1325 6988 davidmj
                                if (strpos($row['rowdefault'], "nextval('") === 0)
1326 6027 davidmj
                                {
1327 6988 davidmj
                                        $seq .= "SELECT SETVAL('{$table_name}_seq',(select case when max({$ary_name[$i]})>0 then max({$ary_name[$i]})+1 else 1 end FROM {$table_name}));\n";
1328 6027 davidmj
                                }
1329 6988 davidmj
                        }
1330 6988 davidmj
                }
1331 6027 davidmj
1332 6988 davidmj
                $this->flush("COPY $table_name (" . implode(', ', $ary_name) . ') FROM stdin;' . "\n");
1333 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1334 6988 davidmj
                {
1335 6988 davidmj
                        $schema_vals = array();
1336 6988 davidmj
1337 6988 davidmj
                        // Build the SQL statement to recreate the data.
1338 6988 davidmj
                        for ($i = 0; $i < $i_num_fields; $i++)
1339 6988 davidmj
                        {
1340 6988 davidmj
                                $str_val = $row[$ary_name[$i]];
1341 6988 davidmj
1342 6988 davidmj
                                if (preg_match('#char|text|bool|bytea#i', $ary_type[$i]))
1343 5846 davidmj
                                {
1344 6988 davidmj
                                        $str_val = str_replace(array("\n", "\t", "\r", "\b", "\f", "\v"), array('\n', '\t', '\r', '\b', '\f', '\v'), addslashes($str_val));
1345 6988 davidmj
                                        $str_empty = '';
1346 5846 davidmj
                                }
1347 6988 davidmj
                                else
1348 6988 davidmj
                                {
1349 6988 davidmj
                                        $str_empty = '\N';
1350 6988 davidmj
                                }
1351 5666 acydburn
1352 6988 davidmj
                                if (empty($str_val) && $str_val !== '0')
1353 5666 acydburn
                                {
1354 6988 davidmj
                                        $str_val = $str_empty;
1355 6988 davidmj
                                }
1356 5666 acydburn
1357 6988 davidmj
                                $schema_vals[] = $str_val;
1358 6988 davidmj
                        }
1359 5666 acydburn
1360 6988 davidmj
                        // Take the ordered fields and their associated data and build it
1361 6988 davidmj
                        // into a valid sql statement to recreate that field in the data.
1362 6988 davidmj
                        $this->flush(implode("\t", $schema_vals) . "\n");
1363 6988 davidmj
                }
1364 6988 davidmj
                $db->sql_freeresult($result);
1365 6988 davidmj
                $this->flush("\\.\n");
1366 5666 acydburn
1367 6988 davidmj
                // Write out the sequence statements
1368 6988 davidmj
                $this->flush($seq);
1369 6988 davidmj
        }
1370 5666 acydburn
1371 6988 davidmj
        function write_end()
1372 6988 davidmj
        {
1373 6988 davidmj
                $this->flush("COMMIT;\n");
1374 6988 davidmj
                parent::write_end();
1375 6988 davidmj
        }
1376 6988 davidmj
}
1377 5666 acydburn
1378 7050 acydburn
/**
1379 7050 acydburn
* @package acp
1380 7050 acydburn
*/
1381 6988 davidmj
class mssql_extractor extends base_extractor
1382 6988 davidmj
{
1383 6988 davidmj
        function write_end()
1384 6988 davidmj
        {
1385 6988 davidmj
                $this->flush("COMMIT\nGO\n");
1386 7016 davidmj
                parent::write_end();
1387 6988 davidmj
        }
1388 5666 acydburn
1389 6988 davidmj
        function write_start($prefix)
1390 6988 davidmj
        {
1391 6988 davidmj
                $sql_data = "--\n";
1392 6988 davidmj
                $sql_data .= "-- phpBB Backup Script\n";
1393 6988 davidmj
                $sql_data .= "-- Dump of tables for $prefix\n";
1394 6988 davidmj
                $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
1395 6988 davidmj
                $sql_data .= "--\n";
1396 6988 davidmj
                $sql_data .= "BEGIN TRANSACTION\n";
1397 6988 davidmj
                $sql_data .= "GO\n";
1398 6988 davidmj
                $this->flush($sql_data);
1399 6988 davidmj
        }
1400 5666 acydburn
1401 6988 davidmj
        function write_table($table_name)
1402 6988 davidmj
        {
1403 6988 davidmj
                global $db;
1404 6988 davidmj
                $sql_data = '-- Table: ' . $table_name . "\n";
1405 6988 davidmj
                $sql_data .= "IF OBJECT_ID(N'$table_name', N'U') IS NOT NULL\n";
1406 6988 davidmj
                $sql_data .= "DROP TABLE $table_name;\n";
1407 6988 davidmj
                $sql_data .= "GO\n";
1408 6988 davidmj
                $sql_data .= "\nCREATE TABLE [$table_name] (\n";
1409 6988 davidmj
                $rows = array();
1410 9416 acydburn
1411 6988 davidmj
                $text_flag = false;
1412 9416 acydburn
1413 6988 davidmj
                $sql = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') as IS_IDENTITY
1414 6988 davidmj
                        FROM INFORMATION_SCHEMA.COLUMNS
1415 6988 davidmj
                        WHERE TABLE_NAME = '$table_name'";
1416 6988 davidmj
                $result = $db->sql_query($sql);
1417 9416 acydburn
1418 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1419 6988 davidmj
                {
1420 6988 davidmj
                        $line = "\t[{$row['COLUMN_NAME']}] [{$row['DATA_TYPE']}]";
1421 9416 acydburn
1422 6988 davidmj
                        if ($row['DATA_TYPE'] == 'text')
1423 6988 davidmj
                        {
1424 6988 davidmj
                                $text_flag = true;
1425 6988 davidmj
                        }
1426 9416 acydburn
1427 6988 davidmj
                        if ($row['IS_IDENTITY'])
1428 6988 davidmj
                        {
1429 6988 davidmj
                                $line .= ' IDENTITY (1 , 1)';
1430 6988 davidmj
                        }
1431 9416 acydburn
1432 6988 davidmj
                        if ($row['CHARACTER_MAXIMUM_LENGTH'] && $row['DATA_TYPE'] !== 'text')
1433 6988 davidmj
                        {
1434 6988 davidmj
                                $line .= ' (' . $row['CHARACTER_MAXIMUM_LENGTH'] . ')';
1435 6988 davidmj
                        }
1436 9416 acydburn
1437 6988 davidmj
                        if ($row['IS_NULLABLE'] == 'YES')
1438 6988 davidmj
                        {
1439 6988 davidmj
                                $line .= ' NULL';
1440 6988 davidmj
                        }
1441 6988 davidmj
                        else
1442 6988 davidmj
                        {
1443 6988 davidmj
                                $line .= ' NOT NULL';
1444 6988 davidmj
                        }
1445 9416 acydburn
1446 6988 davidmj
                        if ($row['COLUMN_DEFAULT'])
1447 6988 davidmj
                        {
1448 6988 davidmj
                                $line .= ' DEFAULT ' . $row['COLUMN_DEFAULT'];
1449 6988 davidmj
                        }
1450 9416 acydburn
1451 6988 davidmj
                        $rows[] = $line;
1452 6988 davidmj
                }
1453 6988 davidmj
                $db->sql_freeresult($result);
1454 9416 acydburn
1455 6988 davidmj
                $sql_data .= implode(",\n", $rows);
1456 6988 davidmj
                $sql_data .= "\n) ON [PRIMARY]";
1457 9416 acydburn
1458 6988 davidmj
                if ($text_flag)
1459 6988 davidmj
                {
1460 6988 davidmj
                        $sql_data .= " TEXTIMAGE_ON [PRIMARY]";
1461 6988 davidmj
                }
1462 9416 acydburn
1463 6988 davidmj
                $sql_data .= "\nGO\n\n";
1464 6988 davidmj
                $rows = array();
1465 9416 acydburn
1466 6988 davidmj
                $sql = "SELECT CONSTRAINT_NAME, COLUMN_NAME
1467 6988 davidmj
                        FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
1468 6988 davidmj
                        WHERE TABLE_NAME = '$table_name'";
1469 6988 davidmj
                $result = $db->sql_query($sql);
1470 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1471 6988 davidmj
                {
1472 6988 davidmj
                        if (!sizeof($rows))
1473 6988 davidmj
                        {
1474 6988 davidmj
                                $sql_data .= "ALTER TABLE [$table_name] WITH NOCHECK ADD\n";
1475 6988 davidmj
                                $sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY  CLUSTERED \n\t(\n";
1476 6988 davidmj
                        }
1477 6988 davidmj
                        $rows[] = "\t\t[{$row['COLUMN_NAME']}]";
1478 6988 davidmj
                }
1479 6988 davidmj
                if (sizeof($rows))
1480 6988 davidmj
                {
1481 6988 davidmj
                        $sql_data .= implode(",\n", $rows);
1482 6988 davidmj
                        $sql_data .= "\n\t)  ON [PRIMARY] \nGO\n";
1483 6988 davidmj
                }
1484 6988 davidmj
                $db->sql_freeresult($result);
1485 9416 acydburn
1486 6988 davidmj
                $index = array();
1487 6988 davidmj
                $sql = "EXEC sp_statistics '$table_name'";
1488 6988 davidmj
                $result = $db->sql_query($sql);
1489 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1490 6988 davidmj
                {
1491 6988 davidmj
                        if ($row['TYPE'] == 3)
1492 6988 davidmj
                        {
1493 6988 davidmj
                                $index[$row['INDEX_NAME']][] = '[' . $row['COLUMN_NAME'] . ']';
1494 6988 davidmj
                        }
1495 6988 davidmj
                }
1496 6988 davidmj
                $db->sql_freeresult($result);
1497 9416 acydburn
1498 6988 davidmj
                foreach ($index as $index_name => $column_name)
1499 6988 davidmj
                {
1500 6988 davidmj
                        $index[$index_name] = implode(', ', $column_name);
1501 6988 davidmj
                }
1502 9416 acydburn
1503 6988 davidmj
                foreach ($index as $index_name => $columns)
1504 6988 davidmj
                {
1505 6988 davidmj
                        $sql_data .= "\nCREATE  INDEX [$index_name] ON [$table_name]($columns) ON [PRIMARY]\nGO\n";
1506 6988 davidmj
                }
1507 6988 davidmj
                $this->flush($sql_data);
1508 6988 davidmj
        }
1509 5666 acydburn
1510 6988 davidmj
        function write_data($table_name)
1511 6988 davidmj
        {
1512 6988 davidmj
                global $db;
1513 5666 acydburn
1514 6988 davidmj
                if ($db->sql_layer === 'mssql')
1515 6988 davidmj
                {
1516 6988 davidmj
                        $this->write_data_mssql($table_name);
1517 6988 davidmj
                }
1518 10489 naderman
                else if($db->sql_layer === 'mssqlnative')
1519 10489 naderman
                {
1520 10489 naderman
                        $this->write_data_mssqlnative($table_name);
1521 10489 naderman
                }
1522 6988 davidmj
                else
1523 6988 davidmj
                {
1524 6988 davidmj
                        $this->write_data_odbc($table_name);
1525 6988 davidmj
                }
1526 6988 davidmj
        }
1527 6144 davidmj
1528 6988 davidmj
        function write_data_mssql($table_name)
1529 6988 davidmj
        {
1530 6988 davidmj
                global $db;
1531 6988 davidmj
                $ary_type = $ary_name = array();
1532 6988 davidmj
                $ident_set = false;
1533 6988 davidmj
                $sql_data = '';
1534 9416 acydburn
1535 6988 davidmj
                // Grab all of the data from current table.
1536 6988 davidmj
                $sql = "SELECT *
1537 6988 davidmj
                        FROM $table_name";
1538 6988 davidmj
                $result = $db->sql_query($sql);
1539 5666 acydburn
1540 6988 davidmj
                $retrieved_data = mssql_num_rows($result);
1541 5666 acydburn
1542 6988 davidmj
                $i_num_fields = mssql_num_fields($result);
1543 6988 davidmj
1544 6988 davidmj
                for ($i = 0; $i < $i_num_fields; $i++)
1545 6988 davidmj
                {
1546 6988 davidmj
                        $ary_type[$i] = mssql_field_type($result, $i);
1547 6988 davidmj
                        $ary_name[$i] = mssql_field_name($result, $i);
1548 6988 davidmj
                }
1549 6988 davidmj
1550 6988 davidmj
                if ($retrieved_data)
1551 6988 davidmj
                {
1552 6988 davidmj
                        $sql = "SELECT 1 as has_identity
1553 6988 davidmj
                                FROM INFORMATION_SCHEMA.COLUMNS
1554 6988 davidmj
                                WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
1555 6988 davidmj
                        $result2 = $db->sql_query($sql);
1556 6988 davidmj
                        $row2 = $db->sql_fetchrow($result2);
1557 6988 davidmj
                        if (!empty($row2['has_identity']))
1558 6988 davidmj
                        {
1559 6988 davidmj
                                $sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
1560 6988 davidmj
                                $ident_set = true;
1561 6988 davidmj
                        }
1562 6988 davidmj
                        $db->sql_freeresult($result2);
1563 6988 davidmj
                }
1564 6988 davidmj
1565 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1566 6988 davidmj
                {
1567 6988 davidmj
                        $schema_vals = $schema_fields = array();
1568 6988 davidmj
1569 6988 davidmj
                        // Build the SQL statement to recreate the data.
1570 6988 davidmj
                        for ($i = 0; $i < $i_num_fields; $i++)
1571 6988 davidmj
                        {
1572 6988 davidmj
                                $str_val = $row[$ary_name[$i]];
1573 6988 davidmj
1574 6988 davidmj
                                if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
1575 5666 acydburn
                                {
1576 7530 davidmj
                                        $str_quote = '';
1577 7530 davidmj
                                        $str_empty = "''";
1578 6988 davidmj
                                        $str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
1579 6988 davidmj
                                }
1580 6988 davidmj
                                else if (preg_match('#date|timestamp#i', $ary_type[$i]))
1581 6988 davidmj
                                {
1582 6988 davidmj
                                        if (empty($str_val))
1583 5666 acydburn
                                        {
1584 6988 davidmj
                                                $str_quote = '';
1585 5666 acydburn
                                        }
1586 5666 acydburn
                                        else
1587 5666 acydburn
                                        {
1588 6988 davidmj
                                                $str_quote = "'";
1589 5666 acydburn
                                        }
1590 5666 acydburn
                                }
1591 6988 davidmj
                                else
1592 5666 acydburn
                                {
1593 6988 davidmj
                                        $str_quote = '';
1594 6988 davidmj
                                        $str_empty = 'NULL';
1595 5666 acydburn
                                }
1596 5666 acydburn
1597 6988 davidmj
                                if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
1598 5666 acydburn
                                {
1599 6988 davidmj
                                        $str_val = $str_empty;
1600 5666 acydburn
                                }
1601 5666 acydburn
1602 6988 davidmj
                                $schema_vals[$i] = $str_quote . $str_val . $str_quote;
1603 6988 davidmj
                                $schema_fields[$i] = $ary_name[$i];
1604 6988 davidmj
                        }
1605 5666 acydburn
1606 6988 davidmj
                        // Take the ordered fields and their associated data and build it
1607 6988 davidmj
                        // into a valid sql statement to recreate that field in the data.
1608 6988 davidmj
                        $sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
1609 5666 acydburn
1610 6988 davidmj
                        $this->flush($sql_data);
1611 6988 davidmj
                        $sql_data = '';
1612 6988 davidmj
                }
1613 6988 davidmj
                $db->sql_freeresult($result);
1614 5666 acydburn
1615 6988 davidmj
                if ($retrieved_data && $ident_set)
1616 6988 davidmj
                {
1617 6988 davidmj
                        $sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
1618 6988 davidmj
                }
1619 6988 davidmj
                $this->flush($sql_data);
1620 6988 davidmj
        }
1621 10489 naderman
1622 10489 naderman
        function write_data_mssqlnative($table_name)
1623 10489 naderman
        {
1624 10489 naderman
                global $db;
1625 10827 git-gate
                $ary_type = $ary_name = array();
1626 10489 naderman
                $ident_set = false;
1627 10489 naderman
                $sql_data = '';
1628 5666 acydburn
1629 10489 naderman
                // Grab all of the data from current table.
1630 10489 naderman
                $sql = "SELECT * FROM $table_name";
1631 10827 git-gate
                $db->mssqlnative_set_query_options(array('Scrollable' => SQLSRV_CURSOR_STATIC));
1632 10489 naderman
                $result = $db->sql_query($sql);
1633 10489 naderman
1634 10827 git-gate
                $retrieved_data = $db->mssqlnative_num_rows($result);
1635 10489 naderman
1636 10827 git-gate
                if (!$retrieved_data)
1637 10827 git-gate
                {
1638 10827 git-gate
                        $db->sql_freeresult($result);
1639 10827 git-gate
                        return;
1640 10827 git-gate
                }
1641 10827 git-gate
1642 10827 git-gate
                $sql = "SELECT * FROM $table_name";
1643 10827 git-gate
                $result_fields = $db->sql_query_limit($sql, 1);
1644 10827 git-gate
1645 10827 git-gate
                $row = new result_mssqlnative($result_fields);
1646 10827 git-gate
                $i_num_fields = $row->num_fields();
1647 10827 git-gate
1648 10489 naderman
                for ($i = 0; $i < $i_num_fields; $i++)
1649 10489 naderman
                {
1650 10827 git-gate
                        $ary_type[$i] = $row->field_type($i);
1651 10827 git-gate
                        $ary_name[$i] = $row->field_name($i);
1652 10489 naderman
                }
1653 10827 git-gate
                $db->sql_freeresult($result_fields);
1654 10827 git-gate
1655 10827 git-gate
                $sql = "SELECT 1 as has_identity
1656 10827 git-gate
                        FROM INFORMATION_SCHEMA.COLUMNS
1657 10827 git-gate
                        WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
1658 10827 git-gate
                $result2 = $db->sql_query($sql);
1659 10827 git-gate
                $row2 = $db->sql_fetchrow($result2);
1660 10489 naderman
1661 10827 git-gate
                if (!empty($row2['has_identity']))
1662 10489 naderman
                {
1663 10827 git-gate
                        $sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
1664 10827 git-gate
                        $ident_set = true;
1665 10489 naderman
                }
1666 10827 git-gate
                $db->sql_freeresult($result2);
1667 10489 naderman
1668 10489 naderman
                while ($row = $db->sql_fetchrow($result))
1669 10489 naderman
                {
1670 10489 naderman
                        $schema_vals = $schema_fields = array();
1671 10489 naderman
1672 10489 naderman
                        // Build the SQL statement to recreate the data.
1673 10489 naderman
                        for ($i = 0; $i < $i_num_fields; $i++)
1674 10489 naderman
                        {
1675 10489 naderman
                                $str_val = $row[$ary_name[$i]];
1676 10489 naderman
1677 10827 git-gate
                                // defaults to type number - better quote just to be safe, so check for is_int too
1678 10827 git-gate
                                if (is_int($ary_type[$i]) || preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
1679 10489 naderman
                                {
1680 10489 naderman
                                        $str_quote = '';
1681 10489 naderman
                                        $str_empty = "''";
1682 10489 naderman
                                        $str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
1683 10489 naderman
                                }
1684 10489 naderman
                                else if (preg_match('#date|timestamp#i', $ary_type[$i]))
1685 10489 naderman
                                {
1686 10489 naderman
                                        if (empty($str_val))
1687 10489 naderman
                                        {
1688 10489 naderman
                                                $str_quote = '';
1689 10489 naderman
                                        }
1690 10489 naderman
                                        else
1691 10489 naderman
                                        {
1692 10489 naderman
                                                $str_quote = "'";
1693 10489 naderman
                                        }
1694 10489 naderman
                                }
1695 10489 naderman
                                else
1696 10489 naderman
                                {
1697 10489 naderman
                                        $str_quote = '';
1698 10489 naderman
                                        $str_empty = 'NULL';
1699 10489 naderman
                                }
1700 10489 naderman
1701 10489 naderman
                                if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
1702 10489 naderman
                                {
1703 10489 naderman
                                        $str_val = $str_empty;
1704 10489 naderman
                                }
1705 10489 naderman
1706 10489 naderman
                                $schema_vals[$i] = $str_quote . $str_val . $str_quote;
1707 10489 naderman
                                $schema_fields[$i] = $ary_name[$i];
1708 10489 naderman
                        }
1709 10489 naderman
1710 10489 naderman
                        // Take the ordered fields and their associated data and build it
1711 10489 naderman
                        // into a valid sql statement to recreate that field in the data.
1712 10489 naderman
                        $sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
1713 10489 naderman
1714 10489 naderman
                        $this->flush($sql_data);
1715 10489 naderman
                        $sql_data = '';
1716 10489 naderman
                }
1717 10489 naderman
                $db->sql_freeresult($result);
1718 10489 naderman
1719 10827 git-gate
                if ($ident_set)
1720 10489 naderman
                {
1721 10489 naderman
                        $sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
1722 10489 naderman
                }
1723 10489 naderman
                $this->flush($sql_data);
1724 10489 naderman
        }
1725 10489 naderman
1726 6988 davidmj
        function write_data_odbc($table_name)
1727 6988 davidmj
        {
1728 6988 davidmj
                global $db;
1729 6988 davidmj
                $ary_type = $ary_name = array();
1730 6988 davidmj
                $ident_set = false;
1731 6988 davidmj
                $sql_data = '';
1732 9416 acydburn
1733 6988 davidmj
                // Grab all of the data from current table.
1734 6988 davidmj
                $sql = "SELECT *
1735 6988 davidmj
                        FROM $table_name";
1736 6988 davidmj
                $result = $db->sql_query($sql);
1737 5793 davidmj
1738 6988 davidmj
                $retrieved_data = odbc_num_rows($result);
1739 5793 davidmj
1740 6988 davidmj
                if ($retrieved_data)
1741 6988 davidmj
                {
1742 6988 davidmj
                        $sql = "SELECT 1 as has_identity
1743 6988 davidmj
                                FROM INFORMATION_SCHEMA.COLUMNS
1744 6988 davidmj
                                WHERE COLUMNPROPERTY(object_id('$table_name'), COLUMN_NAME, 'IsIdentity') = 1";
1745 6988 davidmj
                        $result2 = $db->sql_query($sql);
1746 6988 davidmj
                        $row2 = $db->sql_fetchrow($result2);
1747 6988 davidmj
                        if (!empty($row2['has_identity']))
1748 6988 davidmj
                        {
1749 6988 davidmj
                                $sql_data .= "\nSET IDENTITY_INSERT $table_name ON\nGO\n";
1750 6988 davidmj
                                $ident_set = true;
1751 6988 davidmj
                        }
1752 6988 davidmj
                        $db->sql_freeresult($result2);
1753 6988 davidmj
                }
1754 5793 davidmj
1755 6988 davidmj
                $i_num_fields = odbc_num_fields($result);
1756 5793 davidmj
1757 6988 davidmj
                for ($i = 0; $i < $i_num_fields; $i++)
1758 6988 davidmj
                {
1759 6988 davidmj
                        $ary_type[$i] = odbc_field_type($result, $i + 1);
1760 6988 davidmj
                        $ary_name[$i] = odbc_field_name($result, $i + 1);
1761 6988 davidmj
                }
1762 5793 davidmj
1763 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1764 6988 davidmj
                {
1765 6988 davidmj
                        $schema_vals = $schema_fields = array();
1766 5793 davidmj
1767 6988 davidmj
                        // Build the SQL statement to recreate the data.
1768 6988 davidmj
                        for ($i = 0; $i < $i_num_fields; $i++)
1769 6988 davidmj
                        {
1770 6988 davidmj
                                $str_val = $row[$ary_name[$i]];
1771 5793 davidmj
1772 6988 davidmj
                                if (preg_match('#char|text|bool|varbinary#i', $ary_type[$i]))
1773 6988 davidmj
                                {
1774 7530 davidmj
                                        $str_quote = '';
1775 7530 davidmj
                                        $str_empty = "''";
1776 6988 davidmj
                                        $str_val = sanitize_data_mssql(str_replace("'", "''", $str_val));
1777 6988 davidmj
                                }
1778 6988 davidmj
                                else if (preg_match('#date|timestamp#i', $ary_type[$i]))
1779 6988 davidmj
                                {
1780 6988 davidmj
                                        if (empty($str_val))
1781 5793 davidmj
                                        {
1782 6988 davidmj
                                                $str_quote = '';
1783 5793 davidmj
                                        }
1784 5793 davidmj
                                        else
1785 5793 davidmj
                                        {
1786 6988 davidmj
                                                $str_quote = "'";
1787 5793 davidmj
                                        }
1788 5793 davidmj
                                }
1789 6988 davidmj
                                else
1790 6988 davidmj
                                {
1791 6988 davidmj
                                        $str_quote = '';
1792 6988 davidmj
                                        $str_empty = 'NULL';
1793 6988 davidmj
                                }
1794 5793 davidmj
1795 6988 davidmj
                                if (empty($str_val) && $str_val !== '0' && !(is_int($str_val) || is_float($str_val)))
1796 5793 davidmj
                                {
1797 6988 davidmj
                                        $str_val = $str_empty;
1798 5793 davidmj
                                }
1799 5803 davidmj
1800 6988 davidmj
                                $schema_vals[$i] = $str_quote . $str_val . $str_quote;
1801 6988 davidmj
                                $schema_fields[$i] = $ary_name[$i];
1802 6988 davidmj
                        }
1803 5793 davidmj
1804 6988 davidmj
                        // Take the ordered fields and their associated data and build it
1805 6988 davidmj
                        // into a valid sql statement to recreate that field in the data.
1806 6988 davidmj
                        $sql_data .= "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\nGO\n";
1807 6988 davidmj
1808 6988 davidmj
                        $this->flush($sql_data);
1809 6988 davidmj
1810 6988 davidmj
                        $sql_data = '';
1811 6988 davidmj
1812 6988 davidmj
                }
1813 6988 davidmj
                $db->sql_freeresult($result);
1814 6988 davidmj
1815 6988 davidmj
                if ($retrieved_data && $ident_set)
1816 6988 davidmj
                {
1817 6988 davidmj
                        $sql_data .= "\nSET IDENTITY_INSERT $table_name OFF\nGO\n";
1818 6988 davidmj
                }
1819 6988 davidmj
                $this->flush($sql_data);
1820 6988 davidmj
        }
1821 6988 davidmj
1822 6988 davidmj
}
1823 6988 davidmj
1824 7050 acydburn
/**
1825 7050 acydburn
* @package acp
1826 7050 acydburn
*/
1827 6988 davidmj
class oracle_extractor extends base_extractor
1828 6988 davidmj
{
1829 6988 davidmj
        function write_table($table_name)
1830 6988 davidmj
        {
1831 6988 davidmj
                global $db;
1832 6988 davidmj
                $sql_data = '-- Table: ' . $table_name . "\n";
1833 10174 acydburn
                $sql_data .= "DROP TABLE $table_name\n/\n";
1834 6988 davidmj
                $sql_data .= "\nCREATE TABLE $table_name (\n";
1835 6988 davidmj
1836 6988 davidmj
                $sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_PRECISION, DATA_LENGTH, NULLABLE, DATA_DEFAULT
1837 6988 davidmj
                        FROM ALL_TAB_COLS
1838 6988 davidmj
                        WHERE table_name = '{$table_name}'";
1839 6988 davidmj
                $result = $db->sql_query($sql);
1840 6988 davidmj
1841 6988 davidmj
                $rows = array();
1842 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1843 6988 davidmj
                {
1844 6988 davidmj
                        $line = '  "' . $row['column_name'] . '" ' . $row['data_type'];
1845 6988 davidmj
1846 6988 davidmj
                        if ($row['data_type'] !== 'CLOB')
1847 6988 davidmj
                        {
1848 10174 acydburn
                                if ($row['data_type'] !== 'VARCHAR2' && $row['data_type'] !== 'CHAR')
1849 5793 davidmj
                                {
1850 6988 davidmj
                                        $line .= '(' . $row['data_precision'] . ')';
1851 5793 davidmj
                                }
1852 6988 davidmj
                                else
1853 6053 davidmj
                                {
1854 6988 davidmj
                                        $line .= '(' . $row['data_length'] . ')';
1855 6053 davidmj
                                }
1856 6988 davidmj
                        }
1857 5793 davidmj
1858 6988 davidmj
                        if (!empty($row['data_default']))
1859 6988 davidmj
                        {
1860 6988 davidmj
                                $line .= ' DEFAULT ' . $row['data_default'];
1861 6988 davidmj
                        }
1862 6988 davidmj
1863 6988 davidmj
                        if ($row['nullable'] == 'N')
1864 6988 davidmj
                        {
1865 6988 davidmj
                                $line .= ' NOT NULL';
1866 6988 davidmj
                        }
1867 6988 davidmj
                        $rows[] = $line;
1868 6988 davidmj
                }
1869 6988 davidmj
                $db->sql_freeresult($result);
1870 6988 davidmj
1871 6988 davidmj
                $sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
1872 6988 davidmj
                        FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
1873 6988 davidmj
                        WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
1874 6988 davidmj
                                AND B.CONSTRAINT_TYPE = 'P'
1875 6988 davidmj
                                AND A.TABLE_NAME = '{$table_name}'";
1876 6988 davidmj
                $result = $db->sql_query($sql);
1877 6988 davidmj
1878 10174 acydburn
                $primary_key = array();
1879 10174 acydburn
                $contraint_name = '';
1880 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1881 6988 davidmj
                {
1882 10174 acydburn
                        $constraint_name = '"' . $row['constraint_name'] . '"';
1883 10174 acydburn
                        $primary_key[] = '"' . $row['column_name'] . '"';
1884 6988 davidmj
                }
1885 6988 davidmj
                $db->sql_freeresult($result);
1886 6988 davidmj
1887 10174 acydburn
                if (sizeof($primary_key))
1888 10174 acydburn
                {
1889 10174 acydburn
                        $rows[] = "  CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
1890 10174 acydburn
                }
1891 10174 acydburn
1892 6988 davidmj
                $sql = "SELECT A.CONSTRAINT_NAME, A.COLUMN_NAME
1893 6988 davidmj
                        FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
1894 6988 davidmj
                        WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
1895 6988 davidmj
                                AND B.CONSTRAINT_TYPE = 'U'
1896 6988 davidmj
                                AND A.TABLE_NAME = '{$table_name}'";
1897 6988 davidmj
                $result = $db->sql_query($sql);
1898 6988 davidmj
1899 10174 acydburn
                $unique = array();
1900 10174 acydburn
                $contraint_name = '';
1901 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1902 6988 davidmj
                {
1903 10174 acydburn
                        $constraint_name = '"' . $row['constraint_name'] . '"';
1904 10174 acydburn
                        $unique[] = '"' . $row['column_name'] . '"';
1905 6988 davidmj
                }
1906 6988 davidmj
                $db->sql_freeresult($result);
1907 6988 davidmj
1908 10174 acydburn
                if (sizeof($unique))
1909 10174 acydburn
                {
1910 10174 acydburn
                        $rows[] = "  CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
1911 10174 acydburn
                }
1912 10174 acydburn
1913 6988 davidmj
                $sql_data .= implode(",\n", $rows);
1914 10174 acydburn
                $sql_data .= "\n)\n/\n";
1915 6988 davidmj
1916 10174 acydburn
                $sql = "SELECT A.REFERENCED_NAME, C.*
1917 10174 acydburn
                        FROM USER_DEPENDENCIES A, USER_TRIGGERS B, USER_SEQUENCES C
1918 6988 davidmj
                        WHERE A.REFERENCED_TYPE = 'SEQUENCE'
1919 6988 davidmj
                                AND A.NAME = B.TRIGGER_NAME
1920 10174 acydburn
                                AND B.TABLE_NAME = '{$table_name}'
1921 10174 acydburn
                                AND C.SEQUENCE_NAME = A.REFERENCED_NAME";
1922 6988 davidmj
                $result = $db->sql_query($sql);
1923 10174 acydburn
1924 10174 acydburn
                $type = request_var('type', '');
1925 10174 acydburn
1926 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1927 6988 davidmj
                {
1928 10174 acydburn
                        $sql_data .= "\nDROP SEQUENCE \"{$row['referenced_name']}\"\n/\n";
1929 10174 acydburn
                        $sql_data .= "\nCREATE SEQUENCE \"{$row['referenced_name']}\"";
1930 10174 acydburn
1931 10174 acydburn
                        if ($type == 'full')
1932 10174 acydburn
                        {
1933 10174 acydburn
                                $sql_data .= ' START WITH ' . $row['last_number'];
1934 10174 acydburn
                        }
1935 10174 acydburn
1936 10174 acydburn
                        $sql_data .= "\n/\n";
1937 6988 davidmj
                }
1938 6988 davidmj
                $db->sql_freeresult($result);
1939 6988 davidmj
1940 6988 davidmj
                $sql = "SELECT DESCRIPTION, WHEN_CLAUSE, TRIGGER_BODY
1941 6988 davidmj
                        FROM USER_TRIGGERS
1942 6988 davidmj
                        WHERE TABLE_NAME = '{$table_name}'";
1943 6988 davidmj
                $result = $db->sql_query($sql);
1944 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1945 6988 davidmj
                {
1946 10174 acydburn
                        $sql_data .= "\nCREATE OR REPLACE TRIGGER {$row['description']}WHEN ({$row['when_clause']})\n{$row['trigger_body']}\n/\n";
1947 6988 davidmj
                }
1948 6988 davidmj
                $db->sql_freeresult($result);
1949 6988 davidmj
1950 6988 davidmj
                $sql = "SELECT A.INDEX_NAME, B.COLUMN_NAME
1951 6988 davidmj
                        FROM USER_INDEXES A, USER_IND_COLUMNS B
1952 6988 davidmj
                        WHERE A.UNIQUENESS = 'NONUNIQUE'
1953 6988 davidmj
                                AND A.INDEX_NAME = B.INDEX_NAME
1954 6988 davidmj
                                AND B.TABLE_NAME = '{$table_name}'";
1955 6988 davidmj
                $result = $db->sql_query($sql);
1956 6988 davidmj
1957 6988 davidmj
                $index = array();
1958 6988 davidmj
1959 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1960 6988 davidmj
                {
1961 6988 davidmj
                        $index[$row['index_name']][] = $row['column_name'];
1962 6988 davidmj
                }
1963 6988 davidmj
1964 6988 davidmj
                foreach ($index as $index_name => $column_names)
1965 6988 davidmj
                {
1966 10174 acydburn
                        $sql_data .= "\nCREATE INDEX $index_name ON $table_name(" . implode(', ', $column_names) . ")\n/\n";
1967 6988 davidmj
                }
1968 6988 davidmj
                $db->sql_freeresult($result);
1969 6988 davidmj
                $this->flush($sql_data);
1970 6988 davidmj
        }
1971 6988 davidmj
1972 6988 davidmj
        function write_data($table_name)
1973 6988 davidmj
        {
1974 6988 davidmj
                global $db;
1975 6988 davidmj
                $ary_type = $ary_name = array();
1976 9416 acydburn
1977 6988 davidmj
                // Grab all of the data from current table.
1978 6988 davidmj
                $sql = "SELECT *
1979 6988 davidmj
                        FROM $table_name";
1980 6988 davidmj
                $result = $db->sql_query($sql);
1981 6988 davidmj
1982 6988 davidmj
                $i_num_fields = ocinumcols($result);
1983 6988 davidmj
1984 6988 davidmj
                for ($i = 0; $i < $i_num_fields; $i++)
1985 6988 davidmj
                {
1986 6988 davidmj
                        $ary_type[$i] = ocicolumntype($result, $i + 1);
1987 6988 davidmj
                        $ary_name[$i] = ocicolumnname($result, $i + 1);
1988 6988 davidmj
                }
1989 6988 davidmj
1990 6988 davidmj
                $sql_data = '';
1991 6988 davidmj
1992 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
1993 6988 davidmj
                {
1994 6988 davidmj
                        $schema_vals = $schema_fields = array();
1995 6988 davidmj
1996 6988 davidmj
                        // Build the SQL statement to recreate the data.
1997 6988 davidmj
                        for ($i = 0; $i < $i_num_fields; $i++)
1998 6988 davidmj
                        {
1999 9598 acydburn
                                // Oracle uses uppercase - we use lowercase
2000 9598 acydburn
                                $str_val = $row[strtolower($ary_name[$i])];
2001 6988 davidmj
2002 10174 acydburn
                                if (preg_match('#char|text|bool|raw|clob#i', $ary_type[$i]))
2003 5793 davidmj
                                {
2004 7530 davidmj
                                        $str_quote = '';
2005 7530 davidmj
                                        $str_empty = "''";
2006 6988 davidmj
                                        $str_val = sanitize_data_oracle($str_val);
2007 6988 davidmj
                                }
2008 6988 davidmj
                                else if (preg_match('#date|timestamp#i', $ary_type[$i]))
2009 6988 davidmj
                                {
2010 6988 davidmj
                                        if (empty($str_val))
2011 5793 davidmj
                                        {
2012 6988 davidmj
                                                $str_quote = '';
2013 5793 davidmj
                                        }
2014 6988 davidmj
                                        else
2015 6988 davidmj
                                        {
2016 6988 davidmj
                                                $str_quote = "'";
2017 6988 davidmj
                                        }
2018 5793 davidmj
                                }
2019 6988 davidmj
                                else
2020 5796 davidmj
                                {
2021 6988 davidmj
                                        $str_quote = '';
2022 6988 davidmj
                                        $str_empty = 'NULL';
2023 5796 davidmj
                                }
2024 5796 davidmj
2025 6988 davidmj
                                if (empty($str_val) && $str_val !== '0')
2026 5796 davidmj
                                {
2027 6988 davidmj
                                        $str_val = $str_empty;
2028 5796 davidmj
                                }
2029 5793 davidmj
2030 6988 davidmj
                                $schema_vals[$i] = $str_quote . $str_val . $str_quote;
2031 9598 acydburn
                                $schema_fields[$i] = '"' . $ary_name[$i] . '"';
2032 6988 davidmj
                        }
2033 5803 davidmj
2034 6988 davidmj
                        // Take the ordered fields and their associated data and build it
2035 6988 davidmj
                        // into a valid sql statement to recreate that field in the data.
2036 10174 acydburn
                        $sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ")\n/\n";
2037 5803 davidmj
2038 6988 davidmj
                        $this->flush($sql_data);
2039 6988 davidmj
                }
2040 6988 davidmj
                $db->sql_freeresult($result);
2041 6988 davidmj
        }
2042 5803 davidmj
2043 6988 davidmj
        function write_start($prefix)
2044 6988 davidmj
        {
2045 6988 davidmj
                $sql_data = "--\n";
2046 6988 davidmj
                $sql_data .= "-- phpBB Backup Script\n";
2047 6988 davidmj
                $sql_data .= "-- Dump of tables for $prefix\n";
2048 6988 davidmj
                $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
2049 6988 davidmj
                $sql_data .= "--\n";
2050 6988 davidmj
                $this->flush($sql_data);
2051 6988 davidmj
        }
2052 6988 davidmj
}
2053 5803 davidmj
2054 7050 acydburn
/**
2055 7050 acydburn
* @package acp
2056 7050 acydburn
*/
2057 6988 davidmj
class firebird_extractor extends base_extractor
2058 6988 davidmj
{
2059 6988 davidmj
        function write_start($prefix)
2060 6988 davidmj
        {
2061 6988 davidmj
                $sql_data = "--\n";
2062 6988 davidmj
                $sql_data .= "-- phpBB Backup Script\n";
2063 6988 davidmj
                $sql_data .= "-- Dump of tables for $prefix\n";
2064 6988 davidmj
                $sql_data .= "-- DATE : " . gmdate("d-m-Y H:i:s", $this->time) . " GMT\n";
2065 6988 davidmj
                $sql_data .= "--\n";
2066 6988 davidmj
                $this->flush($sql_data);
2067 6988 davidmj
        }
2068 5803 davidmj
2069 6988 davidmj
        function write_data($table_name)
2070 6988 davidmj
        {
2071 6988 davidmj
                global $db;
2072 6988 davidmj
                $ary_type = $ary_name = array();
2073 9416 acydburn
2074 6988 davidmj
                // Grab all of the data from current table.
2075 6988 davidmj
                $sql = "SELECT *
2076 6988 davidmj
                        FROM $table_name";
2077 6988 davidmj
                $result = $db->sql_query($sql);
2078 5803 davidmj
2079 6988 davidmj
                $i_num_fields = ibase_num_fields($result);
2080 5803 davidmj
2081 6988 davidmj
                for ($i = 0; $i < $i_num_fields; $i++)
2082 6988 davidmj
                {
2083 6988 davidmj
                        $info = ibase_field_info($result, $i);
2084 6988 davidmj
                        $ary_type[$i] = $info['type'];
2085 6988 davidmj
                        $ary_name[$i] = $info['name'];
2086 6988 davidmj
                }
2087 6988 davidmj
2088 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
2089 6988 davidmj
                {
2090 6988 davidmj
                        $schema_vals = $schema_fields = array();
2091 6988 davidmj
2092 6988 davidmj
                        // Build the SQL statement to recreate the data.
2093 6988 davidmj
                        for ($i = 0; $i < $i_num_fields; $i++)
2094 6988 davidmj
                        {
2095 6988 davidmj
                                $str_val = $row[strtolower($ary_name[$i])];
2096 6988 davidmj
2097 6988 davidmj
                                if (preg_match('#char|text|bool|varbinary|blob#i', $ary_type[$i]))
2098 6988 davidmj
                                {
2099 7530 davidmj
                                        $str_quote = '';
2100 7530 davidmj
                                        $str_empty = "''";
2101 6988 davidmj
                                        $str_val = sanitize_data_generic(str_replace("'", "''", $str_val));
2102 6988 davidmj
                                }
2103 6988 davidmj
                                else if (preg_match('#date|timestamp#i', $ary_type[$i]))
2104 6988 davidmj
                                {
2105 6988 davidmj
                                        if (empty($str_val))
2106 5803 davidmj
                                        {
2107 6988 davidmj
                                                $str_quote = '';
2108 5803 davidmj
                                        }
2109 6988 davidmj
                                        else
2110 5803 davidmj
                                        {
2111 6988 davidmj
                                                $str_quote = "'";
2112 5803 davidmj
                                        }
2113 5803 davidmj
                                }
2114 6988 davidmj
                                else
2115 5803 davidmj
                                {
2116 6988 davidmj
                                        $str_quote = '';
2117 6988 davidmj
                                        $str_empty = 'NULL';
2118 5803 davidmj
                                }
2119 5803 davidmj
2120 6988 davidmj
                                if (empty($str_val) && $str_val !== '0')
2121 5803 davidmj
                                {
2122 6988 davidmj
                                        $str_val = $str_empty;
2123 5803 davidmj
                                }
2124 5803 davidmj
2125 6988 davidmj
                                $schema_vals[$i] = $str_quote . $str_val . $str_quote;
2126 6988 davidmj
                                $schema_fields[$i] = '"' . $ary_name[$i] . '"';
2127 6988 davidmj
                        }
2128 5803 davidmj
2129 6988 davidmj
                        // Take the ordered fields and their associated data and build it
2130 6988 davidmj
                        // into a valid sql statement to recreate that field in the data.
2131 6988 davidmj
                        $sql_data = "INSERT INTO $table_name (" . implode(', ', $schema_fields) . ') VALUES (' . implode(', ', $schema_vals) . ");\n";
2132 5803 davidmj
2133 6988 davidmj
                        $this->flush($sql_data);
2134 6988 davidmj
                }
2135 6988 davidmj
                $db->sql_freeresult($result);
2136 6988 davidmj
        }
2137 5803 davidmj
2138 6988 davidmj
        function write_table($table_name)
2139 6988 davidmj
        {
2140 6988 davidmj
                global $db;
2141 5803 davidmj
2142 6988 davidmj
                $sql_data = '-- Table: ' . $table_name . "\n";
2143 6988 davidmj
                $sql_data .= "DROP TABLE $table_name;\n";
2144 5803 davidmj
2145 6988 davidmj
                $data_types = array(7 => 'SMALLINT', 8 => 'INTEGER', 10 => 'FLOAT', 12 => 'DATE', 13 => 'TIME', 14 => 'CHARACTER', 27 => 'DOUBLE PRECISION', 35 => 'TIMESTAMP', 37 => 'VARCHAR', 40 => 'CSTRING', 261 => 'BLOB', 701 => 'DECIMAL', 702 => 'NUMERIC');
2146 5816 davidmj
2147 6988 davidmj
                $sql_data .= "\nCREATE TABLE $table_name (\n";
2148 5803 davidmj
2149 6988 davidmj
                $sql = 'SELECT DISTINCT R.RDB$FIELD_NAME as FNAME, R.RDB$NULL_FLAG as NFLAG, R.RDB$DEFAULT_SOURCE as DSOURCE, F.RDB$FIELD_TYPE as FTYPE, F.RDB$FIELD_SUB_TYPE as STYPE, F.RDB$FIELD_LENGTH as FLEN
2150 6988 davidmj
                        FROM RDB$RELATION_FIELDS R
2151 6988 davidmj
                        JOIN RDB$FIELDS F ON R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME
2152 6988 davidmj
                        LEFT JOIN RDB$FIELD_DIMENSIONS D ON R.RDB$FIELD_SOURCE = D.RDB$FIELD_NAME
2153 6988 davidmj
                        WHERE F.RDB$SYSTEM_FLAG = 0
2154 6988 davidmj
                                AND R.RDB$RELATION_NAME = \''. $table_name . '\'
2155 6988 davidmj
                        ORDER BY R.RDB$FIELD_POSITION';
2156 6988 davidmj
                $result = $db->sql_query($sql);
2157 5803 davidmj
2158 6988 davidmj
                $rows = array();
2159 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
2160 6988 davidmj
                {
2161 6988 davidmj
                        $line = "\t" . '"' . $row['fname'] . '" ' . $data_types[$row['ftype']];
2162 5811 davidmj
2163 6988 davidmj
                        if ($row['ftype'] == 261 && $row['stype'] == 1)
2164 6988 davidmj
                        {
2165 6988 davidmj
                                $line .= ' SUB_TYPE TEXT';
2166 6988 davidmj
                        }
2167 5811 davidmj
2168 6988 davidmj
                        if ($row['ftype'] == 37 || $row['ftype'] == 14)
2169 6988 davidmj
                        {
2170 6988 davidmj
                                $line .= ' (' . $row['flen'] . ')';
2171 6988 davidmj
                        }
2172 5811 davidmj
2173 6988 davidmj
                        if (!empty($row['dsource']))
2174 6988 davidmj
                        {
2175 6988 davidmj
                                $line .= ' ' . $row['dsource'];
2176 6988 davidmj
                        }
2177 5811 davidmj
2178 6988 davidmj
                        if (!empty($row['nflag']))
2179 6988 davidmj
                        {
2180 6988 davidmj
                                $line .= ' NOT NULL';
2181 6988 davidmj
                        }
2182 6988 davidmj
                        $rows[] = $line;
2183 6988 davidmj
                }
2184 6988 davidmj
                $db->sql_freeresult($result);
2185 5811 davidmj
2186 6988 davidmj
                $sql_data .= implode(",\n", $rows);
2187 6988 davidmj
                $sql_data .= "\n);\n";
2188 6988 davidmj
                $keys = array();
2189 5811 davidmj
2190 6988 davidmj
                $sql = 'SELECT I.RDB$FIELD_NAME as NAME
2191 6988 davidmj
                        FROM RDB$RELATION_CONSTRAINTS RC, RDB$INDEX_SEGMENTS I, RDB$INDICES IDX
2192 6988 davidmj
                        WHERE (I.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
2193 6988 davidmj
                                AND (IDX.RDB$INDEX_NAME = RC.RDB$INDEX_NAME)
2194 6988 davidmj
                                AND (RC.RDB$RELATION_NAME = \''. $table_name . '\')
2195 6988 davidmj
                        ORDER BY I.RDB$FIELD_POSITION';
2196 6988 davidmj
                $result = $db->sql_query($sql);
2197 5811 davidmj
2198 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
2199 6988 davidmj
                {
2200 6988 davidmj
                        $keys[] = $row['name'];
2201 6988 davidmj
                }
2202 5811 davidmj
2203 6988 davidmj
                if (sizeof($keys))
2204 6988 davidmj
                {
2205 6988 davidmj
                        $sql_data .= "\nALTER TABLE $table_name ADD PRIMARY KEY (" . implode(', ', $keys) . ');';
2206 6988 davidmj
                }
2207 5811 davidmj
2208 6988 davidmj
                $db->sql_freeresult($result);
2209 5811 davidmj
2210 6988 davidmj
                $sql = 'SELECT I.RDB$INDEX_NAME as INAME, I.RDB$UNIQUE_FLAG as UFLAG, S.RDB$FIELD_NAME as FNAME
2211 6988 davidmj
                        FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON S.RDB$INDEX_NAME=I.RDB$INDEX_NAME
2212 6988 davidmj
                        WHERE (I.RDB$SYSTEM_FLAG IS NULL  OR  I.RDB$SYSTEM_FLAG=0)
2213 6988 davidmj
                                AND I.RDB$FOREIGN_KEY IS NULL
2214 6988 davidmj
                                AND I.RDB$RELATION_NAME = \''. $table_name . '\'
2215 6988 davidmj
                                AND I.RDB$INDEX_NAME NOT STARTING WITH \'RDB$\'
2216 6988 davidmj
                        ORDER BY S.RDB$FIELD_POSITION';
2217 6988 davidmj
                $result = $db->sql_query($sql);
2218 5811 davidmj
2219 6988 davidmj
                $index = array();
2220 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
2221 6988 davidmj
                {
2222 6988 davidmj
                        $index[$row['iname']]['unique'] = !empty($row['uflag']);
2223 6988 davidmj
                        $index[$row['iname']]['values'][] = $row['fname'];
2224 6988 davidmj
                }
2225 5811 davidmj
2226 6988 davidmj
                foreach ($index as $index_name => $data)
2227 6988 davidmj
                {
2228 6988 davidmj
                        $sql_data .= "\nCREATE ";
2229 6988 davidmj
                        if ($data['unique'])
2230 6988 davidmj
                        {
2231 6988 davidmj
                                $sql_data .= 'UNIQUE ';
2232 6988 davidmj
                        }
2233 6988 davidmj
                        $sql_data .= "INDEX $index_name ON $table_name(" . implode(', ', $data['values']) . ");";
2234 6988 davidmj
                }
2235 6988 davidmj
                $sql_data .= "\n";
2236 5811 davidmj
2237 6988 davidmj
                $db->sql_freeresult($result);
2238 5811 davidmj
2239 6988 davidmj
                $sql = 'SELECT D1.RDB$DEPENDENT_NAME as DNAME, D1.RDB$FIELD_NAME as FNAME, D1.RDB$DEPENDENT_TYPE, R1.RDB$RELATION_NAME
2240 6988 davidmj
                        FROM RDB$DEPENDENCIES D1
2241 6988 davidmj
                        LEFT JOIN RDB$RELATIONS R1 ON ((D1.RDB$DEPENDENT_NAME = R1.RDB$RELATION_NAME) AND (NOT (R1.RDB$VIEW_BLR IS NULL)))
2242 6988 davidmj
                        WHERE (D1.RDB$DEPENDED_ON_TYPE = 0)
2243 6988 davidmj
                                AND (D1.RDB$DEPENDENT_TYPE <> 3)
2244 6988 davidmj
                                AND (D1.RDB$DEPENDED_ON_NAME = \'' . $table_name . '\')
2245 6988 davidmj
                        UNION SELECT DISTINCT F2.RDB$RELATION_NAME, D2.RDB$FIELD_NAME, D2.RDB$DEPENDENT_TYPE, R2.RDB$RELATION_NAME FROM RDB$DEPENDENCIES D2, RDB$RELATION_FIELDS F2
2246 6988 davidmj
                        LEFT JOIN RDB$RELATIONS R2 ON ((F2.RDB$RELATION_NAME = R2.RDB$RELATION_NAME) AND (NOT (R2.RDB$VIEW_BLR IS NULL)))
2247 6988 davidmj
                        WHERE (D2.RDB$DEPENDENT_TYPE = 3)
2248 6988 davidmj
                                AND (D2.RDB$DEPENDENT_NAME = F2.RDB$FIELD_SOURCE)
2249 6988 davidmj
                                AND (D2.RDB$DEPENDED_ON_NAME = \'' . $table_name . '\')
2250 6988 davidmj
                        ORDER BY 1, 2';
2251 6988 davidmj
                $result = $db->sql_query($sql);
2252 6988 davidmj
                while ($row = $db->sql_fetchrow($result))
2253 6988 davidmj
                {
2254 6988 davidmj
                        $sql = 'SELECT T1.RDB$DEPENDED_ON_NAME as GEN, T1.RDB$FIELD_NAME, T1.RDB$DEPENDED_ON_TYPE
2255 6988 davidmj
                                FROM RDB$DEPENDENCIES T1
2256 6988 davidmj
                                WHERE (T1.RDB$DEPENDENT_NAME = \'' . $row['dname'] . '\')
2257 6988 davidmj
                                        AND (T1.RDB$DEPENDENT_TYPE = 2 AND T1.RDB$DEPENDED_ON_TYPE = 14)
2258 6988 davidmj
                                UNION ALL SELECT DISTINCT D.RDB$DEPENDED_ON_NAME, D.RDB$FIELD_NAME, D.RDB$DEPENDED_ON_TYPE
2259 6988 davidmj
                                FROM RDB$DEPENDENCIES D, RDB$RELATION_FIELDS F
2260 6988 davidmj
                                WHERE (D.RDB$DEPENDENT_TYPE = 3)
2261 6988 davidmj
                                        AND (D.RDB$DEPENDENT_NAME = F.RDB$FIELD_SOURCE)
2262 6988 davidmj
                                        AND (F.RDB$RELATION_NAME = \'' . $row['dname'] . '\')
2263 6988 davidmj
                                ORDER BY 1,2';
2264 6988 davidmj
                        $result2 = $db->sql_query($sql);
2265 6988 davidmj
                        $row2 = $db->sql_fetchrow($result2);
2266 6988 davidmj
                        $db->sql_freeresult($result2);
2267 6988 davidmj
                        $gen_name = $row2['gen'];
2268 5811 davidmj
2269 6988 davidmj
                        $sql_data .= "\nDROP GENERATOR " . $gen_name . ";";
2270 6988 davidmj
                        $sql_data .= "\nSET TERM ^ ;";
2271 6988 davidmj
                        $sql_data .= "\nCREATE GENERATOR " . $gen_name . "^";
2272 6988 davidmj
                        $sql_data .= "\nSET GENERATOR  " . $gen_name . " TO 0^\n";
2273 6988 davidmj
                        $sql_data .= "\nCREATE TRIGGER {$row['dname']} FOR $table_name";
2274 6988 davidmj
                        $sql_data .= "\nBEFORE INSERT\nAS\nBEGIN";
2275 6988 davidmj
                        $sql_data .= "\n  NEW.{$row['fname']} = GEN_ID(" . $gen_name . ", 1);";
2276 6988 davidmj
                        $sql_data .= "\nEND^\n";
2277 6988 davidmj
                        $sql_data .= "\nSET TERM ; ^\n";
2278 6988 davidmj
                }
2279 5811 davidmj
2280 6988 davidmj
                $this->flush($sql_data);
2281 5811 davidmj
2282 6988 davidmj
                $db->sql_freeresult($result);
2283 6988 davidmj
        }
2284 6988 davidmj
}
2285 6988 davidmj
2286 7141 davidmj
// get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)
2287 7141 davidmj
function get_usable_memory()
2288 7141 davidmj
{
2289 7141 davidmj
        $val = trim(@ini_get('memory_limit'));
2290 7141 davidmj
2291 7141 davidmj
        if (preg_match('/(\\d+)([mkg]?)/i', $val, $regs))
2292 7141 davidmj
        {
2293 7141 davidmj
                $memory_limit = (int) $regs[1];
2294 7141 davidmj
                switch ($regs[2])
2295 7141 davidmj
                {
2296 7141 davidmj
2297 7141 davidmj
                        case 'k':
2298 7141 davidmj
                        case 'K':
2299 7141 davidmj
                                $memory_limit *= 1024;
2300 7141 davidmj
                        break;
2301 7141 davidmj
2302 7141 davidmj
                        case 'm':
2303 7141 davidmj
                        case 'M':
2304 7141 davidmj
                                $memory_limit *= 1048576;
2305 7141 davidmj
                        break;
2306 7141 davidmj
2307 7141 davidmj
                        case 'g':
2308 7141 davidmj
                        case 'G':
2309 7141 davidmj
                                $memory_limit *= 1073741824;
2310 7141 davidmj
                        break;
2311 7141 davidmj
                }
2312 7141 davidmj
2313 7141 davidmj
                // how much memory PHP requires at the start of export (it is really a little less)
2314 7141 davidmj
                if ($memory_limit > 6100000)
2315 7141 davidmj
                {
2316 7141 davidmj
                        $memory_limit -= 6100000;
2317 7141 davidmj
                }
2318 7141 davidmj
2319 7141 davidmj
                // allow us to consume half of the total memory available
2320 7141 davidmj
                $memory_limit /= 2;
2321 7141 davidmj
        }
2322 7141 davidmj
        else
2323 7141 davidmj
        {
2324 7141 davidmj
                // set the buffer to 1M if we have no clue how much memory PHP will give us :P
2325 7141 davidmj
                $memory_limit = 1048576;
2326 7141 davidmj
        }
2327 7141 davidmj
2328 7141 davidmj
        return $memory_limit;
2329 7141 davidmj
}
2330 7141 davidmj
2331 6988 davidmj
function sanitize_data_mssql($text)
2332 6988 davidmj
{
2333 6988 davidmj
        $data = preg_split('/[\n\t\r\b\f]/', $text);
2334 6988 davidmj
        preg_match_all('/[\n\t\r\b\f]/', $text, $matches);
2335 7530 davidmj
2336 6988 davidmj
        $val = array();
2337 7530 davidmj
2338 6988 davidmj
        foreach ($data as $value)
2339 6988 davidmj
        {
2340 6988 davidmj
                if (strlen($value))
2341 6988 davidmj
                {
2342 7530 davidmj
                        $val[] = "'" . $value . "'";
2343 5666 acydburn
                }
2344 6988 davidmj
                if (sizeof($matches[0]))
2345 6988 davidmj
                {
2346 6988 davidmj
                        $val[] = 'char(' . ord(array_shift($matches[0])) . ')';
2347 6988 davidmj
                }
2348 6988 davidmj
        }
2349 7530 davidmj
2350 6988 davidmj
        return implode('+', $val);
2351 6988 davidmj
}
2352 5666 acydburn
2353 6988 davidmj
function sanitize_data_oracle($text)
2354 6988 davidmj
{
2355 10174 acydburn
//        $data = preg_split('/[\0\n\t\r\b\f\'"\/\\\]/', $text);
2356 10174 acydburn
//        preg_match_all('/[\0\n\t\r\b\f\'"\/\\\]/', $text, $matches);
2357 10174 acydburn
        $data = preg_split('/[\0\b\f\'\/]/', $text);
2358 10174 acydburn
        preg_match_all('/[\0\r\b\f\'\/]/', $text, $matches);
2359 7530 davidmj
2360 6988 davidmj
        $val = array();
2361 7530 davidmj
2362 6988 davidmj
        foreach ($data as $value)
2363 6988 davidmj
        {
2364 6988 davidmj
                if (strlen($value))
2365 6988 davidmj
                {
2366 7530 davidmj
                        $val[] = "'" . $value . "'";
2367 6988 davidmj
                }
2368 6988 davidmj
                if (sizeof($matches[0]))
2369 6988 davidmj
                {
2370 6988 davidmj
                        $val[] = 'chr(' . ord(array_shift($matches[0])) . ')';
2371 6988 davidmj
                }
2372 5666 acydburn
        }
2373 7530 davidmj
2374 6988 davidmj
        return implode('||', $val);
2375 5647 davidmj
}
2376 5647 davidmj
2377 6988 davidmj
function sanitize_data_generic($text)
2378 6988 davidmj
{
2379 6988 davidmj
        $data = preg_split('/[\n\t\r\b\f]/', $text);
2380 6988 davidmj
        preg_match_all('/[\n\t\r\b\f]/', $text, $matches);
2381 7530 davidmj
2382 6988 davidmj
        $val = array();
2383 7530 davidmj
2384 6988 davidmj
        foreach ($data as $value)
2385 6988 davidmj
        {
2386 6988 davidmj
                if (strlen($value))
2387 6988 davidmj
                {
2388 7530 davidmj
                        $val[] = "'" . $value . "'";
2389 6988 davidmj
                }
2390 6988 davidmj
                if (sizeof($matches[0]))
2391 6988 davidmj
                {
2392 6988 davidmj
                        $val[] = "'" . array_shift($matches[0]) . "'";
2393 6988 davidmj
                }
2394 6988 davidmj
        }
2395 7530 davidmj
2396 6988 davidmj
        return implode('||', $val);
2397 6988 davidmj
}
2398 6988 davidmj
2399 6988 davidmj
// modified from PHP.net
2400 6988 davidmj
function fgetd(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
2401 6988 davidmj
{
2402 6988 davidmj
        $record = '';
2403 6988 davidmj
        $delim_len = strlen($delim);
2404 9416 acydburn
2405 6988 davidmj
        while (!$eof($fp))
2406 6988 davidmj
        {
2407 6988 davidmj
                $pos = strpos($record, $delim);
2408 6988 davidmj
                if ($pos === false)
2409 6988 davidmj
                {
2410 6988 davidmj
                        $record .= $read($fp, $buffer);
2411 6988 davidmj
                        if ($eof($fp) && ($pos = strpos($record, $delim)) !== false)
2412 6988 davidmj
                        {
2413 6988 davidmj
                                $seek($fp, $pos + $delim_len - strlen($record), SEEK_CUR);
2414 6988 davidmj
                                return substr($record, 0, $pos);
2415 6988 davidmj
                        }
2416 6988 davidmj
                }
2417 6988 davidmj
                else
2418 6988 davidmj
                {
2419 6988 davidmj
                        $seek($fp, $pos + $delim_len - strlen($record), SEEK_CUR);
2420 6988 davidmj
                        return substr($record, 0, $pos);
2421 6988 davidmj
                }
2422 6988 davidmj
        }
2423 6988 davidmj
2424 6988 davidmj
        return false;
2425 6988 davidmj
}
2426 6988 davidmj
2427 6990 davidmj
function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
2428 6990 davidmj
{
2429 6990 davidmj
        static $array = array();
2430 6990 davidmj
        static $record = '';
2431 6990 davidmj
2432 6990 davidmj
        if (!sizeof($array))
2433 6990 davidmj
        {
2434 6990 davidmj
                while (!$eof($fp))
2435 6990 davidmj
                {
2436 6990 davidmj
                        if (strpos($record, $delim) !== false)
2437 6990 davidmj
                        {
2438 6990 davidmj
                                $array = explode($delim, $record);
2439 6990 davidmj
                                $record = array_pop($array);
2440 6990 davidmj
                                break;
2441 6990 davidmj
                        }
2442 6990 davidmj
                        else
2443 6990 davidmj
                        {
2444 6990 davidmj
                                $record .= $read($fp, $buffer);
2445 6990 davidmj
                        }
2446 6990 davidmj
                }
2447 6990 davidmj
                if ($eof($fp) && strpos($record, $delim) !== false)
2448 6990 davidmj
                {
2449 6990 davidmj
                        $array = explode($delim, $record);
2450 6990 davidmj
                        $record = array_pop($array);
2451 6990 davidmj
                }
2452 6990 davidmj
        }
2453 6990 davidmj
2454 6990 davidmj
        if (sizeof($array))
2455 6990 davidmj
        {
2456 6990 davidmj
                return array_shift($array);
2457 6990 davidmj
        }
2458 6990 davidmj
2459 6990 davidmj
        return false;
2460 6990 davidmj
}
2461 6990 davidmj
2462 8647 acydburn
?>