~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/acp/acp_database.php

  • Committer: dcoles
  • Date: 2008-02-13 04:10:55 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:443
Added Forum application along with unmodifed version of phpBB3 "Olympus" 3.0.0

Show diffs side-by-side

added added

removed removed

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