function get_sqlbefehl() { global $restore, $config, $databases, $lang; //Init $restore['fileEOF'] = false; $restore['EOB'] = false; $complete_sql = ''; $sqlparser_status = 0; if (!isset($restore['eintraege_ready'])) { $restore['eintraege_ready'] = 0; } //Parsen while ($sqlparser_status != 100 && !$restore['fileEOF'] && !$restore['EOB']) { //nächste Zeile lesen $zeile = $restore['compressed'] ? gzgets($restore['filehandle']) : fgets($restore['filehandle']); if (DEBUG) { echo "<br><br>Zeile: " . htmlspecialchars($zeile); } /******************* Setzen des Parserstatus *******************/ // herausfinden um was für einen Befehl es sich handelt if ($sqlparser_status == 0) { //Vergleichszeile, um nicht bei jedem Vergleich strtoupper ausführen zu müssen $zeile2 = strtoupper(trim($zeile)); // pre-built compare strings - so we need the CPU power only once :) $sub9 = substr($zeile2, 0, 9); $sub7 = substr($sub9, 0, 7); $sub6 = substr($sub7, 0, 6); $sub4 = substr($sub6, 0, 4); $sub3 = substr($sub4, 0, 3); $sub2 = substr($sub3, 0, 2); $sub1 = substr($sub2, 0, 1); if ($sub7 == 'INSERT ') { $sqlparser_status = 3; //Datensatzaktion $restore['actual_table'] = get_tablename($zeile); } elseif ($sub7 == 'LOCK TA') { $sqlparser_status = 4; } elseif ($sub6 == 'COMMIT') { $sqlparser_status = 7; } elseif (substr($sub6, 0, 5) == 'BEGIN') { $sqlparser_status = 7; } elseif ($sub9 == 'UNLOCK TA') { $sqlparser_status = 4; } elseif ($sub3 == 'SET') { $sqlparser_status = 4; } elseif ($sub6 == 'START ') { $sqlparser_status = 4; } elseif ($sub3 == '/*!') { $sqlparser_status = 5; } elseif ($sub9 == 'ALTER TAB') { $sqlparser_status = 4; } elseif ($sub9 == 'CREATE TA') { $sqlparser_status = 2; } elseif ($sub9 == 'CREATE AL') { $sqlparser_status = 2; } elseif ($sub9 == 'CREATE IN') { $sqlparser_status = 4; } elseif ($sqlparser_status != 5 && substr($zeile2, 0, 2) == '/*') { $sqlparser_status = 6; } elseif ($sub9 == 'DROP TABL') { $sqlparser_status = 1; } elseif ($sub9 == 'DROP VIEW') { $sqlparser_status = 1; } elseif ($sub9 == 'CREATE DA') { $sqlparser_status = 7; } elseif ($sub9 == 'DROP DATA ') { $sqlparser_status = 7; } elseif ($sub3 == 'USE') { $sqlparser_status = 7; } elseif ($sub6 == '-- EOB' || $sub4 == '# EO') { $restore['EOB'] = true; $restore['fileEOF'] = true; $zeile = ''; $zeile2 = ''; $sqlparser_status = 100; } elseif ($sub2 == '--' || $sub1 == '#') { $zeile = ''; $zeile2 = ''; $sqlparser_status = 0; } // Fortsetzung von erweiterten Inserts if ($restore['flag'] == 1) { $sqlparser_status = 3; } if ($sqlparser_status == 0 && trim($complete_sql) > '' && $restore['flag'] == -1) { // Unbekannten Befehl entdeckt v($restore); echo "<br>Sql: " . htmlspecialchars($complete_sql); echo "<br>Erweiterte Inserts: " . $restore['erweiterte_inserts']; die('<br>' . $lang['L_UNKNOWN_SQLCOMMAND'] . ': ' . $zeile . '<br><br>' . $complete_sql); } /******************* Ende von Setzen des Parserstatus *******************/ } $last_char = substr(rtrim($zeile), -1); // Zeilenumbrüche erhalten - sonst werden Schlüsselwörter zusammengefügt // z.B. 'null' und in der nächsten Zeile 'check' wird zu 'nullcheck' $complete_sql .= $zeile . "\n"; if ($sqlparser_status == 3) { //INSERT if (SQL_Is_Complete($complete_sql)) { $sqlparser_status = 100; $complete_sql = trim($complete_sql); if (substr($complete_sql, -2) == '*/') { $complete_sql = remove_comment_at_eol($complete_sql); } // letzter Ausdruck des erweiterten Inserts erreicht? if (substr($complete_sql, -2) == ');') { $restore['flag'] = -1; } else { if (substr($complete_sql, -2) == '),') { // letztes Komme gegen Semikolon tauschen $complete_sql = substr($complete_sql, 0, -1) . ';'; $restore['erweiterte_inserts'] = 1; $restore['flag'] = 1; } } if (substr(strtoupper($complete_sql), 0, 7) != 'INSERT ') { // wenn der Syntax aufgrund eines Reloads verloren ging - neu ermitteln if (!isset($restore['insert_syntax'])) { $restore['insert_syntax'] = get_insert_syntax($restore['actual_table']); } $complete_sql = $restore['insert_syntax'] . ' VALUES ' . $complete_sql . ';'; } else { // INSERT Syntax ermitteln und merken $ipos = strpos(strtoupper($complete_sql), ' VALUES'); if (!$ipos === false) { $restore['insert_syntax'] = substr($complete_sql, 0, $ipos); } else { $restore['insert_syntax'] = 'INSERT INTO `' . $restore['actual_table'] . '`'; } } } } else { if ($sqlparser_status == 1) { //Löschaktion if ($last_char == ';') { $sqlparser_status = 100; } //Befehl komplett $restore['actual_table'] = get_tablename($complete_sql); } else { if ($sqlparser_status == 2) { // Createanweisung ist beim Finden eines ; beendet if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } // Soll die Tabelle hergestellt werden? $do_it = true; if (is_array($restore['tables_to_restore'])) { $do_it = false; if (in_array($restore['actual_table'], $restore['tables_to_restore'])) { $do_it = true; } } if ($do_it) { $tablename = submit_create_action($complete_sql); $restore['actual_table'] = $tablename; $restore['table_ready']++; } // Zeile verwerfen, da CREATE jetzt bereits ausgefuehrt wurde und naechsten Befehl suchen $complete_sql = ''; $sqlparser_status = 0; } } else { if ($sqlparser_status == 4) { //Createindex if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } $complete_sql = del_inline_comments($complete_sql); $sqlparser_status = 100; } } else { if ($sqlparser_status == 5) { //Anweisung $t = strrpos($zeile, '*/;'); if (!$t === false) { $restore['anzahl_zeilen'] = $config['minspeed']; $sqlparser_status = 100; if ($config['ignore_enable_keys'] && strrpos($zeile, 'ENABLE KEYS ') !== false) { $sqlparser_status = 100; $complete_sql = ''; } } } else { if ($sqlparser_status == 6) { $t = strrpos($zeile, '*/'); if (!$t === false) { $complete_sql = ''; $sqlparser_status = 0; } } else { if ($sqlparser_status == 7) { //Anweisung if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } $complete_sql = ''; $sqlparser_status = 0; } } } } } } } } if ($restore['compressed'] && gzeof($restore['filehandle'])) { $restore['fileEOF'] = true; } if (!$restore['compressed'] && feof($restore['filehandle'])) { $restore['fileEOF'] = true; } } // wenn bestimmte Tabellen wiederhergestellt werden sollen -> pruefen if (is_array($restore['tables_to_restore']) && !in_array($restore['actual_table'], $restore['tables_to_restore'])) { $complete_sql = ''; } return trim($complete_sql); }
function get_sqlbefehl() { global $restore, $config, $databases, $lang; //Init $restore['fileEOF'] = false; $restore['EOB'] = false; $complete_sql = ''; $sqlparser_status = 0; if (!isset($restore['eintraege_ready'])) { $restore['eintraege_ready'] = 0; } //Parsen while ($sqlparser_status != 100 && !$restore['fileEOF'] && !$restore['EOB']) { //nächste Zeile lesen $zeile = $restore['compressed'] ? gzgets($restore['filehandle']) : fgets($restore['filehandle']); /******************* Setzen des Parserstatus *******************/ // herausfinden um was für einen Befehl es sich handelt if ($sqlparser_status == 0) { //Vergleichszeile, um nicht bei jedem Vergleich strtoupper ausführen zu müssen $zeile2 = strtoupper(trim($zeile)); // Am Ende eines MySQLDumper-Backups angelangt? if (substr($zeile2, 0, 6) == '-- EOB' || substr($zeile2, 0, 5) == '# EOB') { $restore['EOB'] = true; $zeile = '--'; $zeile2 = '--'; $sqlparser_status = 100; } // Kommenatr? if (substr($zeile2, 0, 2) == '--' || substr($zeile2, 0, 1) == '#') { $zeile = ''; $zeile2 = ''; $sqlparser_status = 0; } //Einfache Anweisung finden die mit Semikolon beendet werden if (substr($zeile2, 0, 11) == 'LOCK TABLES') { $sqlparser_status = 5; } if (substr($zeile2, 0, 6) == 'COMMIT') { $sqlparser_status = 5; } if (substr($zeile2, 0, 5) == 'BEGIN') { $sqlparser_status = 5; } if (substr($zeile2, 0, 13) == 'UNLOCK TABLES') { $sqlparser_status = 5; } if (substr($zeile2, 0, 4) == 'SET ') { $sqlparser_status = 5; } if (substr($zeile2, 0, 6) == 'START ') { $sqlparser_status = 5; } if (substr($zeile2, 0, 3) == '/*!') { $sqlparser_status = 5; } //MySQL-Condition oder Kommentar if (substr($zeile2, 0, 12) == 'CREATE TABLE') { $sqlparser_status = 2; } //Createaktion if (substr($zeile2, 0, 12) == 'CREATE INDEX') { $sqlparser_status = 4; } //Indexaktion //Kommentar if ($sqlparser_status != 5 && substr($zeile2, 0, 2) == '/*') { $sqlparser_status = 6; } // Befehle, die nicht ausgeführt werden sollen if (substr($zeile2, 0, 4) == 'USE ') { $sqlparser_status = 7; } if (substr($zeile2, 0, 14) == 'DROP DATABASE ') { $sqlparser_status = 7; } if (substr($zeile2, 0, 10) == 'DROP TABLE') { $sqlparser_status = 1; } //Löschaktion if (substr($zeile2, 0, 7) == 'INSERT ') { $sqlparser_status = 3; //Datensatzaktion //$restore['actual_table']=strtolower(get_tablename_aus_insert($zeile)); $restore['actual_table'] = get_tablename_aus_insert($zeile); // Pruefen ob die Spaltenanzahl bekannt ist und wenn nicht setzen if (!isset($restore['num_table_fields'][$restore['actual_table']])) { $restore['num_table_fields'][$restore['actual_table']] = get_num_rows($restore['actual_table']); } } // Fortsetzung von erweiterten Inserts if ($restore['flag'] == 1) { $sqlparser_status = 3; } if ($sqlparser_status == 0 && trim($complete_sql) > '' && $restore['flag'] == -1) { // Unbekannten Befehl entdeckt v($restore); echo "<br>Sql: " . $complete_sql; echo "<br>Erweiterte Inserts: " . $restore['erweiterte_inserts']; die('<br>' . $lang['unknown_sqlcommand'] . ': ' . $zeile); } /******************* Ende von Setzen des Parserstatus *******************/ } $last_char = substr(rtrim($zeile), -1); // Zeilenumbrüche erhalten - sonst werden Schlüsselwörter zusammengefügt // z.B. 'null' und in der nächsten Zeile 'check' wird zu 'nullcheck' $complete_sql .= $zeile . "\n"; if ($sqlparser_status == 1) { //Löschaktion if ($last_char == ';') { $sqlparser_status = 100; } //Befehl komplett } if ($sqlparser_status == 2) { // Createanweisung ist beim Finden eines ; beendet if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } //Spaltenanzahl fuer diese Tabelle merken $restore['actual_table'] = get_tablename($complete_sql); $complete_sql = del_inline_comments($complete_sql); //Inline-Kommentare entfernen //Create ausfuehren und Anzahl der Spalten speichern $restore['actual_fieldcount'] = submit_create_action($complete_sql); $restore['num_table_fields'][$restore['actual_table']] = $restore['actual_fieldcount']; // Zeile verwerfen und naechsten Befehl suchen $complete_sql = ''; $sqlparser_status = 0; } } if ($sqlparser_status == 3) { //INSERT // Anzahl der Felder ermitteln wenn unbekannt if (!isset($restore['num_table_fields'][$restore['actual_table']])) { $restore['num_table_fields'][$restore['actual_table']] = get_num_rows($restore['actual_table']); } $AnzahlFelder = SQL_Is_Complete($complete_sql, $restore['num_table_fields'][$restore['actual_table']], DEBUG); // einen vollständigen Insert ermittelt if ($AnzahlFelder == $restore['num_table_fields'][$restore['actual_table']]) { $sqlparser_status = 100; $complete_sql = trim($complete_sql); // letzter Ausdruck des erweiterten Inserts erreicht? if (substr($complete_sql, -2) == ');') { $restore['flag'] = -1; } // Wenn am Ende der Zeile ein Klammer Komma -> erweiterter Insert-Modus -> Steuerflag setzen if (substr($complete_sql, -2) == '),') { // letztes Komme gegen Semikolon tauschen $complete_sql = substr($complete_sql, 0, -1) . ';'; $restore['erweiterte_inserts'] = 1; $restore['flag'] = 1; } if (substr($complete_sql, 0, 7) != 'INSERT ') { $complete_sql = $restore['insert_syntax'] . ' VALUES ' . $complete_sql . ';'; } else { // INSERT Syntax ermitteln und merken $ipos = strpos(strtoupper($complete_sql), 'VALUES'); if (!$ipos === false) { $restore['insert_syntax'] = substr($complete_sql, 0, $ipos); } else { $restore['insert_syntax'] = 'INSERT INTO `' . $restore['actual_table'] . '`'; } } if ($AnzahlFelder > $restore['num_table_fields'][$restore['actual_table']] && $restore['erweiterte_inserts'] == 0) { if (!isset($restore['table_create'][$restore['actual_table']])) { global $lang; include './inc/functions_sql.php'; $restore['table_create'][$restore['actual_table']] = GetCreateTable($databases['db_actual'], $restore['actual_table']); } echo '<form action="main.php?action=extinfo" method="post">'; echo '<p class="warnung">Parser-Fehler : zuviele gezählt in Tabelle ' . $restore["actual_table"] . ' (' . $AnzahlFelder . ' statt ' . $restore["num_table_fields"][$restore["actual_table"]] . ')'; echo '<br>Aktuelle Tabelle: ' . $restore['actual_table']; echo '<h4>CREATE-Anweisung</h4><textarea name="create_sql" style="width:90%;height:200px;">' . $restore["table_create"][$restore["actual_table"]] . '</textarea>'; echo '<h4>INSERT-Anweisung</h4><textarea name="insert_sql" style="width:90%;height:200px;">' . $complete_sql . '</textarea></p><br>'; echo '<br><br><input type="submit" name="tell_error" value="Fehlerbericht"></form>' . $zeile; die; } } } // Index if ($sqlparser_status == 4) { //Createindex if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } $complete_sql = del_inline_comments($complete_sql); $sqlparser_status = 100; //Befehl komplett } } // Kommentar oder Condition if ($sqlparser_status == 5) { //Anweisung if ($last_char == ';') { if ($config['minspeed'] > 0) { $restore['anzahl_zeilen'] = $config['minspeed']; } $complete_sql = del_inline_comments($complete_sql); $sqlparser_status = 100; //Befehl komplett } } // Mehrzeiliger oder Inline-Kommentar if ($sqlparser_status == 6) { if (!strrpos($zeile, '*/') === false) { $complete_sql = trim(del_inline_comments($complete_sql)); $sqlparser_status = 0; } } // Befehle, die verworfen werden sollen if ($sqlparser_status == 7) { //Anweisung if ($last_char == ';') { if ($config["minspeed"] > 0) { $restore["anzahl_zeilen"] = $config["minspeed"]; } $complete_sql = ''; $sqlparser_status = 0; } } if ($restore['compressed'] && gzeof($restore['filehandle'])) { $restore['fileEOF'] = true; } if (!$restore['compressed'] && feof($restore['filehandle'])) { $restore['fileEOF'] = true; } } return trim($complete_sql); }