~hexmode/+junk/main

« back to all changes in this revision

Viewing changes to install-files/apps/phpmyadmin2.10.1/libraries/import/sql.php

  • Committer: Mark A. Hershberger
  • Date: 2008-01-05 19:38:56 UTC
  • Revision ID: hershberger@spawn-xp-20080105193856-6rnzgwa4nehue3qj
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/* $Id: sql.php 9110 2006-06-13 15:10:08Z lem9 $ */
 
3
// vim: expandtab sw=4 ts=4 sts=4:
 
4
 
 
5
/* SQL import plugin for phpMyAdmin */
 
6
 
 
7
if (isset($plugin_list)) {
 
8
    $plugin_list['sql'] = array(
 
9
        'text' => 'strSQL',
 
10
        'extension' => 'sql',
 
11
        'options_text' => 'strSQLImportOptions',
 
12
        );
 
13
    $compats = PMA_DBI_getCompatibilities();
 
14
    if (count($compats) > 0) {
 
15
        $values = array();
 
16
        foreach($compats as $val) {
 
17
            $values[$val] = $val;
 
18
        }
 
19
        $plugin_list['sql']['options'] = array(
 
20
            array('type' => 'select', 'name' => 'compatibility', 'text' => 'strSQLCompatibility', 'values' => $values, 'doc' => array('manual_MySQL_Database_Administration', 'Server_SQL_mode'))
 
21
            );
 
22
    }
 
23
} else {
 
24
/* We do not define function when plugin is just queried for information above */
 
25
    $buffer = '';
 
26
    // Defaults for parser
 
27
    $sql = '';
 
28
    $start_pos = 0;
 
29
    $i = 0;
 
30
    if (isset($_POST['sql_delimiter'])) {
 
31
        $sql_delimiter = $_POST['sql_delimiter'];
 
32
    } else {
 
33
        $sql_delimiter = ';';
 
34
    }
 
35
 
 
36
    // Handle compatibility option
 
37
    if (isset($_REQUEST['sql_compatibility'])) {
 
38
        PMA_DBI_try_query('SET SQL_MODE="' . $_REQUEST['sql_compatibility'] . '"');
 
39
    }
 
40
    while (!($finished && $i >= $len) && !$error && !$timeout_passed) {
 
41
        $data = PMA_importGetNextChunk();
 
42
        if ($data === FALSE) {
 
43
            // subtract data we didn't handle yet and stop processing
 
44
            $offset -= strlen($buffer);
 
45
            break;
 
46
        } elseif ($data === TRUE) {
 
47
            // Handle rest of buffer
 
48
        } else {
 
49
            // Append new data to buffer
 
50
            $buffer .= $data;
 
51
            // Do not parse string when we're not at the end and don't have ; inside
 
52
            if ((strpos($buffer, $sql_delimiter) === FALSE) && !$finished) {
 
53
                continue;
 
54
            }
 
55
        }
 
56
        // Current length of our buffer
 
57
        $len = strlen($buffer);
 
58
        // Grab some SQL queries out of it
 
59
        while ($i < $len) {
 
60
            $found_delimiter = false;
 
61
            // Find first interesting character, several strpos seem to be faster than simple loop in php:
 
62
            //while (($i < $len) && (strpos('\'";#-/', $buffer[$i]) === FALSE)) $i++;
 
63
            //if ($i == $len) break;
 
64
            $oi = $i;
 
65
            $p1 = strpos($buffer, '\'', $i);
 
66
            if ($p1 === FALSE) {
 
67
                $p1 = 2147483647;
 
68
            }
 
69
            $p2 = strpos($buffer, '"', $i);
 
70
            if ($p2 === FALSE) {
 
71
                $p2 = 2147483647;
 
72
            }
 
73
            $p3 = strpos($buffer, $sql_delimiter, $i);
 
74
            if ($p3 === FALSE) {
 
75
                $p3 = 2147483647;
 
76
            } else {
 
77
                $found_delimiter = true;
 
78
            }
 
79
            $p4 = strpos($buffer, '#', $i);
 
80
            if ($p4 === FALSE) {
 
81
                $p4 = 2147483647;
 
82
            }
 
83
            $p5 = strpos($buffer, '--', $i);
 
84
            if ($p5 === FALSE || $p5 >= ($len - 2) || $buffer[$p5 + 2] > ' ') {
 
85
                $p5 = 2147483647;
 
86
            }
 
87
            $p6 = strpos($buffer, '/*', $i);
 
88
            if ($p6 === FALSE) {
 
89
                $p6 = 2147483647;
 
90
            }
 
91
            $p7 = strpos($buffer, '`', $i);
 
92
            if ($p7 === FALSE) {
 
93
                $p7 = 2147483647;
 
94
            }
 
95
            $i = min ($p1, $p2, $p3, $p4, $p5, $p6, $p7);
 
96
            unset($p1, $p2, $p3, $p4, $p5, $p6, $p7);
 
97
            if ($i == 2147483647) {
 
98
                $i = $oi;
 
99
                if (!$finished) {
 
100
                    break;
 
101
                }
 
102
                // at the end there might be some whitespace...
 
103
                if (trim($buffer) == '') {
 
104
                    $buffer = '';
 
105
                    $len = 0;
 
106
                    break;
 
107
                }
 
108
                // We hit end of query, go there!
 
109
                $i = strlen($buffer) - 1;
 
110
            }
 
111
 
 
112
            // Grab current character
 
113
            $ch = $buffer[$i];
 
114
 
 
115
            // Quotes
 
116
            if (!(strpos('\'"`', $ch) === FALSE)) {
 
117
                $quote = $ch;
 
118
                $endq = FALSE;
 
119
                while (!$endq) {
 
120
                    // Find next quote
 
121
                    $pos = strpos($buffer, $quote, $i + 1);
 
122
                    // No quote? Too short string
 
123
                    if ($pos === FALSE) {
 
124
                        // We hit end of string => unclosed quote, but we handle it as end of query
 
125
                        if ($finished) {
 
126
                            $endq = TRUE;
 
127
                            $i = $len - 1;
 
128
                        }
 
129
                        break;
 
130
                    }
 
131
                    // Was not the quote escaped?
 
132
                    $j = $pos - 1;
 
133
                    while ($buffer[$j] == '\\') $j--;
 
134
                    // Even count means it was not escaped
 
135
                    $endq = (((($pos - 1) - $j) % 2) == 0);
 
136
                    // Skip the string
 
137
                    $i = $pos;
 
138
                }
 
139
                if (!$endq) {
 
140
                    break;
 
141
                }
 
142
                $i++;
 
143
                // Aren't we at the end?
 
144
                if ($finished && $i == $len) {
 
145
                    $i--;
 
146
                } else {
 
147
                    continue;
 
148
                }
 
149
            }
 
150
 
 
151
            // Not enough data to decide
 
152
            if ((($i == ($len - 1) && ($ch == '-' || $ch == '/'))
 
153
                || ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-') || ($ch == '/' && $buffer[$i + 1] == '*')))
 
154
                ) && !$finished) {
 
155
                break;
 
156
            }
 
157
 
 
158
            // Comments
 
159
            if ($ch == '#'
 
160
                    || ($i < ($len - 1) && $ch == '-' && $buffer[$i + 1] == '-' && (($i < ($len - 2) && $buffer[$i + 2] <= ' ') || ($i == ($len - 1) && $finished)))
 
161
                    || ($i < ($len - 1) && $ch == '/' && $buffer[$i + 1] == '*')
 
162
                    ) {
 
163
                // Copy current string to SQL
 
164
                if ($start_pos != $i) {
 
165
                    $sql .= substr($buffer, $start_pos, $i - $start_pos);
 
166
                }
 
167
                // Skip the rest
 
168
                $j = $i;
 
169
                $i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i);
 
170
                // didn't we hit end of string?
 
171
                if ($i === FALSE) {
 
172
                    if ($finished) {
 
173
                        $i = $len - 1;
 
174
                    } else {
 
175
                        break;
 
176
                    }
 
177
                }
 
178
                // Skip *
 
179
                if ($ch == '/') {
 
180
                    // Check for MySQL conditional comments and include them as-is
 
181
                    if ($buffer[$j + 2] == '!') {
 
182
                        $comment = substr($buffer, $j + 3, $i - $j - 3);
 
183
                        if (preg_match('/^[0-9]{5}/', $comment, $version)) {
 
184
                            if ($version[0] <= PMA_MYSQL_INT_VERSION) {
 
185
                                $sql .= substr($comment, 5);
 
186
                            }
 
187
                        } else {
 
188
                            $sql .= $comment;
 
189
                        }
 
190
                    }
 
191
                    $i++;
 
192
                }
 
193
                // Skip last char
 
194
                $i++;
 
195
                // Next query part will start here
 
196
                $start_pos = $i;
 
197
                // Aren't we at the end?
 
198
                if ($i == $len) {
 
199
                    $i--;
 
200
                } else {
 
201
                    continue;
 
202
                }
 
203
            }
 
204
 
 
205
            // End of SQL
 
206
            if ($found_delimiter || ($finished && ($i == $len - 1))) {
 
207
                $tmp_sql = $sql;
 
208
                if ($start_pos < $len) {
 
209
                    $length_to_grab = $i - $start_pos;
 
210
                    if (!$found_delimiter) {
 
211
                        $length_to_grab++;
 
212
                    }
 
213
                    $tmp_sql .= substr($buffer, $start_pos, $length_to_grab);
 
214
                    unset($length_to_grab);
 
215
                }
 
216
                // Do not try to execute empty SQL
 
217
                if (!preg_match('/^([\s]*;)*$/', trim($tmp_sql))) {
 
218
                    $sql = $tmp_sql;
 
219
                    PMA_importRunQuery($sql, substr($buffer, 0, $i + strlen($sql_delimiter)));
 
220
                    $buffer = substr($buffer, $i + strlen($sql_delimiter));
 
221
                    // Reset parser:
 
222
                    $len = strlen($buffer);
 
223
                    $sql = '';
 
224
                    $i = 0;
 
225
                    $start_pos = 0;
 
226
                    // Any chance we will get a complete query?
 
227
                    //if ((strpos($buffer, ';') === FALSE) && !$finished) {
 
228
                    if ((strpos($buffer, $sql_delimiter) === FALSE) && !$finished) {
 
229
                        break;
 
230
                    }
 
231
                } else {
 
232
                    $i++;
 
233
                    $start_pos = $i;
 
234
                }
 
235
            }
 
236
        } // End of parser loop
 
237
    } // End of import loop
 
238
    // Commit any possible data in buffers
 
239
    PMA_importRunQuery('', substr($buffer, 0, $len));
 
240
    PMA_importRunQuery();
 
241
}
 
242
?>