From 66952d75b1b9d6166c9c65629872ce534743a8aa Mon Sep 17 00:00:00 2001 From: Smita Kumari Date: Sat, 22 Feb 2014 20:44:41 +0530 Subject: [PATCH 1/3] Implemented Feature request #1418: using string as Column_Sepearted_With parameter Signed-off-by: Smita Kumari Signed-off-by: Marc Delisle --- libraries/plugins/import/ImportCsv.class.php | 64 +++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/libraries/plugins/import/ImportCsv.class.php b/libraries/plugins/import/ImportCsv.class.php index f559ea4cb6..978457857e 100644 --- a/libraries/plugins/import/ImportCsv.class.php +++ b/libraries/plugins/import/ImportCsv.class.php @@ -128,7 +128,7 @@ class ImportCsv extends AbstractImportCsv $csv_new_line = strtr($csv_new_line, $replacements); $param_error = false; - if (strlen($csv_terminated) != 1) { + if (strlen($csv_terminated) < 1) { $message = PMA_Message::error( __('Invalid parameter for CSV import: %s') ); @@ -246,7 +246,7 @@ class ImportCsv extends AbstractImportCsv $col_count = 0; $max_cols = 0; - + $csv_terminated_len = strlen($csv_terminated); while (! ($finished && $i >= $len) && ! $error && ! $timeout_passed) { $data = PMA_importGetNextChunk(); if ($data === false) { @@ -291,6 +291,12 @@ class ImportCsv extends AbstractImportCsv $len = strlen($buffer); // Currently parsed char $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + + } while ($i < $len) { // Deadlock protection if ($lasti == $i && $lastlen == $len) { @@ -314,6 +320,11 @@ class ImportCsv extends AbstractImportCsv $values[] = ''; $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } continue; } @@ -326,6 +337,11 @@ class ImportCsv extends AbstractImportCsv $need_end = true; $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } } else { $need_end = false; } @@ -346,6 +362,11 @@ class ImportCsv extends AbstractImportCsv } $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } if ($csv_enclosed == $csv_escaped && ($ch == $csv_terminated || $ch == $csv_new_line @@ -364,6 +385,11 @@ class ImportCsv extends AbstractImportCsv } $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } } // unquoted NULL string @@ -374,6 +400,11 @@ class ImportCsv extends AbstractImportCsv if ($fail) { $i = $fallbacki; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } break; } // Need to strip trailing enclosing char? @@ -383,10 +414,20 @@ class ImportCsv extends AbstractImportCsv } elseif ($i == $len - 1) { $i = $fallbacki; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } break; } else { $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } } } // Are we at the end? @@ -401,10 +442,20 @@ class ImportCsv extends AbstractImportCsv if ($i == $len - 1) { $i = $fallbacki; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } break; } $i++; $ch = $buffer[$i]; + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) + { + $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + $i += $csv_terminated_len-1; + } } // If everything went okay, store value $values[] = $value; @@ -605,4 +656,13 @@ class ImportCsv extends AbstractImportCsv { $this->_analyze = $analyze; } + public function readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len) + { + for ($j=0; $j<$csv_terminated_len-1; $j++) + { + $i++; + $ch .= $buffer[$i]; + } + return $ch; + } } From cbbc88d27d91e9e9a52f1cce88abc019eceb1a60 Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Tue, 25 Feb 2014 12:31:03 -0500 Subject: [PATCH 2/3] ChangeLog entry Signed-off-by: Marc Delisle --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 529206c6cc..c4a374e00d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,7 @@ phpMyAdmin - ChangeLog - bug #4237 HTTP Referer disclosure in SQL links + rfe Show full names on navigation hover + rfe #1505 Behaviour on click on a routine in nav panel ++ rfe #1418 Support more than one separating character on CSV import 4.1.9.0 (not yet released) - bug #4279 CTRL + up or down moves two fields (part one) From e08c4449e6cd850e79ea5d85ad6b1a7678f8e34a Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Tue, 25 Feb 2014 12:38:54 -0500 Subject: [PATCH 3/3] Fix coding style Signed-off-by: Marc Delisle --- libraries/plugins/import/ImportCsv.class.php | 83 ++++++++++++-------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/libraries/plugins/import/ImportCsv.class.php b/libraries/plugins/import/ImportCsv.class.php index 978457857e..70e4a0b6df 100644 --- a/libraries/plugins/import/ImportCsv.class.php +++ b/libraries/plugins/import/ImportCsv.class.php @@ -291,9 +291,10 @@ class ImportCsv extends AbstractImportCsv $len = strlen($buffer); // Currently parsed char $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } @@ -320,9 +321,10 @@ class ImportCsv extends AbstractImportCsv $values[] = ''; $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } continue; @@ -337,9 +339,10 @@ class ImportCsv extends AbstractImportCsv $need_end = true; $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } } else { @@ -362,9 +365,12 @@ class ImportCsv extends AbstractImportCsv } $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 + && $ch == $csv_terminated[0] + ) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } if ($csv_enclosed == $csv_escaped @@ -385,9 +391,10 @@ class ImportCsv extends AbstractImportCsv } $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } } @@ -400,9 +407,10 @@ class ImportCsv extends AbstractImportCsv if ($fail) { $i = $fallbacki; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } break; @@ -414,18 +422,24 @@ class ImportCsv extends AbstractImportCsv } elseif ($i == $len - 1) { $i = $fallbacki; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 + && $ch == $csv_terminated[0] + ) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } break; } else { $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 + && $ch == $csv_terminated[0] + ) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } } @@ -442,18 +456,24 @@ class ImportCsv extends AbstractImportCsv if ($i == $len - 1) { $i = $fallbacki; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 + && $ch == $csv_terminated[0] + ) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } break; } $i++; $ch = $buffer[$i]; - if ($csv_terminated_len > 1 && $ch == $csv_terminated[0]) - { - $ch = $this->readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len); + if ($csv_terminated_len > 1 + && $ch == $csv_terminated[0] + ) { + $ch = $this->readCsvTerminatedString( + $buffer, $ch, $i, $csv_terminated_len + ); $i += $csv_terminated_len-1; } } @@ -658,8 +678,7 @@ class ImportCsv extends AbstractImportCsv } public function readCsvTerminatedString($buffer, $ch, $i, $csv_terminated_len) { - for ($j=0; $j<$csv_terminated_len-1; $j++) - { + for ($j = 0; $j < $csv_terminated_len - 1; $j++) { $i++; $ch .= $buffer[$i]; }