From e7eb28d32c032de597b0dec63117a73a407b1b1b Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Tue, 30 Dec 2008 15:19:35 +0000 Subject: [PATCH] CSV import git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@545 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- index.php | 2 +- lang/cs.inc.php | 3 ++ lang/en.inc.php | 1 + select.inc.php | 75 ++++++++++++++++++++++++++++++------------------- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/index.php b/index.php index d15d51f1..2bd1ed1a 100644 --- a/index.php +++ b/index.php @@ -100,7 +100,7 @@ if (isset($_GET["download"])) { if (isset($_GET["default"])) { $_GET["edit"] = $_GET["default"]; } - if (isset($_GET["select"]) && $_POST && (!$_POST["delete"] && !$_POST["export"] && !$_POST["save"])) { + if (isset($_GET["select"]) && $_POST && (!$_POST["delete"] && !$_POST["export"] && !$_POST["import"] && !$_POST["save"])) { $_GET["edit"] = $_GET["select"]; } if (isset($_GET["callf"])) { diff --git a/lang/cs.inc.php b/lang/cs.inc.php index 16533e56..d97ff8a8 100644 --- a/lang/cs.inc.php +++ b/lang/cs.inc.php @@ -207,4 +207,7 @@ $translations = array( 'Partitions' => 'Oddílů', 'Partition name' => 'Název oddílu', 'Values' => 'Hodnoty', + '%d row(s) has been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'), + 'CSV Import' => 'Import CSV', + 'Import' => 'Import', ); diff --git a/lang/en.inc.php b/lang/en.inc.php index 2219bd23..414c91a9 100644 --- a/lang/en.inc.php +++ b/lang/en.inc.php @@ -6,4 +6,5 @@ $translations = array( '%d process(es) has been killed.' => array('%d process has been killed.', '%d processes have been killed.'), '%d row(s)' => array('%d row', '%d rows'), '%d item(s) have been affected.' => array('%d item have been affected.', '%d items have been affected.'), + '%d row(s) has been imported.' => array('%d row has been imported.', '%d rows has been imported.'), ); diff --git a/select.inc.php b/select.inc.php index f36e38e6..4cb70000 100644 --- a/select.inc.php +++ b/select.inc.php @@ -80,38 +80,54 @@ if ($_POST && !$error) { } exit; } - $result = true; - $affected = 0; - $command = ($_POST["delete"] ? ($_POST["all"] && !$where ? "TRUNCATE " : "DELETE FROM ") : ($_POST["clone"] ? "INSERT INTO " : "UPDATE ")) . idf_escape($_GET["select"]); - if (!$_POST["delete"]) { - $set = array(); - foreach ($fields as $name => $field) { - $val = process_input($name, $field); - if ($_POST["clone"]) { - $set[] = ($val !== false ? $val : idf_escape($name)); - } elseif ($val !== false) { - $set[] = idf_escape($name) . " = $val"; + if ($_POST["import"]) { + $file = preg_replace("~^\xEF\xBB\xBF~", '', get_file("csv_file")); //! character set + $rows = array(); //! packet size + preg_match_all('~("[^"]*"|[^"\\n]+)+~', $file, $matches); + foreach ($matches[0] as $val) { + $row = array(); + preg_match_all('~(("[^"]*")+|[^,]*),~', "$val,", $fields); + foreach ($fields[1] as $field) { + $row[] = "'" . $mysql->escape_string(str_replace('""', '"', preg_replace('~".*"~s', '', $field))) . "'"; //! NULL } + $rows[] = "(" . implode(", ", $row) . ")"; } - $command .= ($_POST["clone"] ? " SELECT " . implode(", ", $set) . " FROM " . idf_escape($_GET["select"]) : " SET " . implode(", ", $set)); - } - if (!$_POST["delete"] && !$set) { - // nothing - } elseif ($_POST["all"]) { - $result = queries($command . ($where ? " WHERE " . implode(" AND ", $where) : "")); - $affected = $mysql->affected_rows; + $result = queries("INSERT INTO " . idf_escape($_GET["select"]) . " VALUES " . implode(", ", $rows)); + query_redirect(queries(), remove_from_uri("page"), lang('%d row(s) has been imported.', $mysql->affected_rows), $result, false, !$result); } else { - foreach ((array) $_POST["check"] as $val) { - parse_str($val, $check); - $result = queries($command . " WHERE " . implode(" AND ", where($check)) . " LIMIT 1"); - if (!$result) { - break; + $result = true; + $affected = 0; + $command = ($_POST["delete"] ? ($_POST["all"] && !$where ? "TRUNCATE " : "DELETE FROM ") : ($_POST["clone"] ? "INSERT INTO " : "UPDATE ")) . idf_escape($_GET["select"]); + if (!$_POST["delete"]) { + $set = array(); + foreach ($fields as $name => $field) { + $val = process_input($name, $field); + if ($_POST["clone"]) { + $set[] = ($val !== false ? $val : idf_escape($name)); + } elseif ($val !== false) { + $set[] = idf_escape($name) . " = $val"; + } } - $affected += $mysql->affected_rows; + $command .= ($_POST["clone"] ? " SELECT " . implode(", ", $set) . " FROM " . idf_escape($_GET["select"]) : " SET " . implode(", ", $set)); } + if (!$_POST["delete"] && !$set) { + // nothing + } elseif ($_POST["all"]) { + $result = queries($command . ($where ? " WHERE " . implode(" AND ", $where) : "")); + $affected = $mysql->affected_rows; + } else { + foreach ((array) $_POST["check"] as $val) { + parse_str($val, $check); + $result = queries($command . " WHERE " . implode(" AND ", where($check)) . " LIMIT 1"); + if (!$result) { + break; + } + $affected += $mysql->affected_rows; + } + } + query_redirect(queries(), remove_from_uri("page"), lang('%d item(s) have been affected.', $affected), $result, false, !$result); + //! display edit page in case of an error } - query_redirect(queries(), remove_from_uri("page"), lang('%d item(s) have been affected.', $affected), $result, false, !$result); - //! display edit page in case of an error } page_header(lang('Select') . ": " . htmlspecialchars($_GET["select"]), $error); @@ -226,6 +242,7 @@ for (var i=0; > i; i++) { if (!$result) { echo "

" . htmlspecialchars($mysql->error) . "

\n"; } else { + echo "
\n"; if (!$result->num_rows) { echo "

" . lang('No rows.') . "

\n"; } else { @@ -236,7 +253,6 @@ for (var i=0; > i; i++) { } } - echo "\n"; echo "\n"; for ($j=0; $row = $result->fetch_assoc(); $j++) { if (!$j) { @@ -301,9 +317,10 @@ for (var i=0; > i; i++) { echo " (" . lang('%d row(s)', $found_rows) . ")

\n"; echo ($_GET["db"] != "information_schema" ? "
" . lang('Edit') . "
\n" : ""); - echo "
" . lang('Export') . "
$dump_options
\n"; - echo "\n"; + echo "
" . lang('Export') . "
$dump_options
\n"; } $result->free(); + echo "
" . lang('CSV Import') . "
\n"; + echo "\n"; } }