~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: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

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'