-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdump.php
137 lines (112 loc) · 3.06 KB
/
dump.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
require_once('./init.php');
$mode = isset($_GET['mode']) ? $_GET['mode'] : 'html';
$filter = !empty($_GET['filter']) ? stripslashes($_GET['filter']) : 1;
$stmt = $pdo->query("SELECT * FROM stat WHERE $filter");
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$it = new IteratorIterator($stmt);
switch ($mode) {
case 'html':
$dump = new dumphtml($it);
break;
case 'sql':
header('Content-Type: text/plain');
$dump = new dumpsql($it);
break;
case 'csv':
header('Content-Type: text/plain');
$dump = new dumpcsv($it);
break;
default:
die('Invalid mode');
break;
}
if (isset($_GET['export']) && $_GET['export'] != 'server') {
$filename = 'dump_'.date('YmdHis').'.'.$mode;
header('Content-Disposition: attachment; filename="'.$filename.'"');
}
$dump->run();
abstract class dump {
protected $it;
public function __construct(Iterator $it)
{
$this->it = $it;
}
abstract public function init();
abstract public function printcurrent(Iterator $i);
abstract public function finalize();
public function run()
{
$this->init();
iterator_apply($this->it, array($this, 'printcurrent'), array($this->it));
$this->finalize();
}
}
abstract class dumpnoinitorfinalize extends dump {
public function init() {}
public function finalize() {}
}
class dumphtml extends dump
{
public function init()
{
echo "<table border='1'>\n";
}
public function printcurrent(Iterator $it) {
static $first = true;
if ($first) {
echo '<tr>';
foreach ($it->current() as $name => $value) {
echo '<th>'.htmlentities($name).'</th>';
}
echo "</tr>\n";
$first = false;
}
echo '<tr>';
foreach ($it->current() as $row) {
echo '<td>'.htmlentities($row).'</td>';
}
echo "</tr>\n";
return true;
}
public function finalize()
{
echo '</table>';
}
}
class dumpsql extends dumpnoinitorfinalize
{
protected $tablename = 'stat';
public function printcurrent(Iterator $it)
{
global $pdo;
$values = '';
echo 'INSERT INTO ', $this->tablename, ' (';
$cit = new CachingIterator(new ArrayIterator($it->current()));
foreach ($cit as $name => $value) {
echo '`', $name, '`';
$values .= is_numeric($value) ? $value : $pdo->quote($value);
if ($cit->hasNext()) {
echo ', ';
$values .= ', ';
}
}
echo ') VALUES ('.$values.");\n";
return true;
}
}
class dumpcsv extends dumpnoinitorfinalize
{
public function printcurrent(Iterator $it)
{
$cit = new CachingIterator(new ArrayIterator($it->current()));
foreach ($cit as $name => $value) {
echo is_numeric($value) ? $value : '"'.addslashes($value).'"';
if ($cit->hasNext()) {
echo ',';
}
}
echo "\n";
return true;
}
}