From a21a4ccc1a2b4a1306d4d5cd45c7c845ed2562e4 Mon Sep 17 00:00:00 2001 From: "J.M" Date: Sat, 3 Aug 2013 15:59:17 +0200 Subject: [PATCH 001/141] Demo server footer: Open Git links in new window --- libraries/Footer.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Footer.class.php b/libraries/Footer.class.php index c845c826f8..83a0e88c24 100644 --- a/libraries/Footer.class.php +++ b/libraries/Footer.class.php @@ -74,9 +74,9 @@ class PMA_Footer include './revision-info.php'; $message .= sprintf( __('Currently running Git revision %1$s from the %2$s branch.'), - '' + '' . $revision .'', - '' + '' . $branch . '' ); } else { From f8e41310d60363b81bc20891fc7968206eb2174f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=84=EC=9B=90=20=EA=B6=8C?= Date: Sat, 3 Aug 2013 06:44:37 +0200 Subject: [PATCH 002/141] Translated using Weblate (Korean) Currently translated at 72.8% (1899 of 2609) --- po/ko.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/po/ko.po b/po/ko.po index 4f32bccf35..73b7d917f8 100644 --- a/po/ko.po +++ b/po/ko.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.0.6-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-07-29 15:07+0200\n" -"PO-Revision-Date: 2013-08-02 03:35+0200\n" -"Last-Translator: Myung Han Yu \n" +"PO-Revision-Date: 2013-08-03 06:44+0200\n" +"Last-Translator: 도원 권 \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -3989,7 +3989,7 @@ msgstr "이 값을 사용자화하기 위한 사용자 허용" #: libraries/schema/User_Schema.class.php:558 prefs_manage.php:320 #: prefs_manage.php:325 msgid "Reset" -msgstr "리세트" +msgstr "초기화" #: libraries/config/messages.inc.php:17 msgid "" @@ -5004,7 +5004,7 @@ msgstr "" #: libraries/config/messages.inc.php:294 msgid "Maximum tables" -msgstr "" +msgstr "최대 테이블 수" #: libraries/config/messages.inc.php:295 msgid "" @@ -5746,11 +5746,11 @@ msgstr "" #: libraries/config/messages.inc.php:460 msgid "Show password change form" -msgstr "비밀번호 변경 폼 보이기" +msgstr "비밀번호 변경 폼 보기" #: libraries/config/messages.inc.php:461 msgid "Show create database form" -msgstr "데이터베이스 생성 폼 보이기" +msgstr "데이터베이스 생성 폼 보기" #: libraries/config/messages.inc.php:462 msgid "Show or hide a column displaying the Creation timestamp for all tables" @@ -5758,7 +5758,7 @@ msgstr "전체 테이블의 생성 시간을 표시하는 컬럼을 보이기/ #: libraries/config/messages.inc.php:463 msgid "Show Creation timestamp" -msgstr "생성 시간 보이기" +msgstr "생성 시간 보기" #: libraries/config/messages.inc.php:464 msgid "" @@ -5867,7 +5867,7 @@ msgstr "" #: libraries/config/messages.inc.php:487 msgid "Skip locked tables" -msgstr "" +msgstr "잠긴 테이블 건너띄기" #: libraries/config/messages.inc.php:492 msgid "Requires SQL Validator to be enabled" @@ -6145,7 +6145,7 @@ msgstr "디렉토리를 포함하는 데이터베이스의 권한을 확인하 #: libraries/database_interface.lib.php:2094 msgid "Details…" -msgstr "" +msgstr "자세히…" #: libraries/dbi/drizzle-wrappers.lib.php:387 msgid "Can't seek in an unbuffered result set" @@ -10253,7 +10253,7 @@ msgstr "전체 중지" #: server_replication.php:304 msgid "Reset slave" -msgstr "슬레이브 리셋" +msgstr "슬레이브 초기화" #: server_replication.php:306 msgid "Start SQL Thread only" @@ -10455,7 +10455,7 @@ msgstr "" #: server_status_monitor.php:537 msgid "Reset to default" -msgstr "" +msgstr "기본값으로 초기화" #: server_status_monitor.php:543 msgid "Monitor Instructions" From 04792972696edacf87c31b0be8ea37f49c73d411 Mon Sep 17 00:00:00 2001 From: Victor Volkov Date: Sat, 3 Aug 2013 16:23:44 +0200 Subject: [PATCH 003/141] Translated using Weblate (Russian) Currently translated at 99.7% (2600 of 2609) --- po/ru.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/po/ru.po b/po/ru.po index cff421be19..1da2e351b6 100644 --- a/po/ru.po +++ b/po/ru.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.0.6-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-07-29 15:07+0200\n" -"PO-Revision-Date: 2013-05-11 21:28+0200\n" +"PO-Revision-Date: 2013-08-03 16:23+0200\n" "Last-Translator: Victor Volkov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 1.6-dev\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 1.7-dev\n" #: browse_foreigners.php:51 browse_foreigners.php:75 js/messages.php:344 #: libraries/DisplayResults.class.php:813 @@ -2630,16 +2630,16 @@ msgstr "" "Пожалуйста, обратитесь к %sдокументации%s." #: libraries/DisplayResults.class.php:4927 -#, fuzzy, php-format +#, php-format #| msgid "Showing rows" msgid "Showing rows %1s - %2s" -msgstr "Отображает строки" +msgstr "Отображение строк %1s - %2s" #: libraries/DisplayResults.class.php:4939 -#, fuzzy, php-format +#, php-format #| msgid "total" msgid "%d total" -msgstr "всего" +msgstr "%d всего" #: libraries/DisplayResults.class.php:4951 sql.php:945 #, php-format @@ -3885,12 +3885,12 @@ msgstr "определена числовая клавиша" #: libraries/config.values.php:49 libraries/config.values.php:64 #: libraries/config.values.php:69 msgid "Icons" -msgstr "" +msgstr "Значки" #: libraries/config.values.php:50 libraries/config.values.php:65 #: libraries/config.values.php:70 msgid "Text" -msgstr "" +msgstr "Текст" #: libraries/config.values.php:51 libraries/config.values.php:58 #: libraries/config.values.php:66 libraries/config.values.php:71 From 7eebe49fd7edc6adab831ede53b9505c033dd350 Mon Sep 17 00:00:00 2001 From: ayushchd Date: Sun, 4 Aug 2013 20:41:02 +0530 Subject: [PATCH 004/141] Fix test case for date issue --- test/classes/plugin/export/PMA_ExportOds_test.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/classes/plugin/export/PMA_ExportOds_test.php b/test/classes/plugin/export/PMA_ExportOds_test.php index 4c9d21fab5..545b2f2857 100644 --- a/test/classes/plugin/export/PMA_ExportOds_test.php +++ b/test/classes/plugin/export/PMA_ExportOds_test.php @@ -332,7 +332,7 @@ class PMA_ExportOds_Test extends PHPUnit_Framework_TestCase ->will( $this->returnValue( array( - null, '01-01-2000', '10:00:00', '01-01-2000 10:00:00', + null, '01-01-2000', '01-01-2000', '01-01-2000 10:00:00', "01-01-2014 10:02:00", "t>s", "a&b", "<" ) ) @@ -360,8 +360,8 @@ class PMA_ExportOds_Test extends PHPUnit_Framework_TestCase 'office:value-type="string">&' . '' . '10:00:00' . - '01-01' . + '-2000' . '01-01-2000 10:00:00 Date: Sun, 4 Aug 2013 18:20:48 +0200 Subject: [PATCH 005/141] Version-Parameter fixed Single Tracking-Entries couldn't be deleted because of missing Version in the Delete-Link. --- tbl_tracking.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tbl_tracking.php b/tbl_tracking.php index a6a5ac9ca9..647a341b2f 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -583,7 +583,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . $statement . ''; echo '' . $drop_image_or_text . ''; echo ''; @@ -644,7 +644,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . htmlspecialchars($entry['username']) . ''; echo '' . $statement . ''; echo '' . $drop_image_or_text . ''; From bebe981371131d8a8694fda254098197ab42de73 Mon Sep 17 00:00:00 2001 From: FliegenKLATSCH Date: Sun, 4 Aug 2013 18:20:48 +0200 Subject: [PATCH 006/141] Version-Parameter fixed Single Tracking-Entries couldn't be deleted because of missing Version in the Delete-Link. --- tbl_tracking.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tbl_tracking.php b/tbl_tracking.php index c1ae531dac..f17c67bffb 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -585,7 +585,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . $statement . ''; echo '' . $drop_image_or_text . ''; echo ''; @@ -646,7 +646,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . htmlspecialchars($entry['username']) . ''; echo '' . $statement . ''; echo '' . $drop_image_or_text . ''; From 3a6d29f1831cb0afd71f0567d4ac2d8451bdf800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Mon, 5 Aug 2013 10:00:39 +0200 Subject: [PATCH 007/141] Use PMA_generate_common_url for URL parameters --- tbl_tracking.php | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tbl_tracking.php b/tbl_tracking.php index f17c67bffb..69620ec2f0 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -584,9 +584,14 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . htmlspecialchars($entry['username']) . ''; echo '' . $statement . ''; echo '' . $drop_image_or_text + . PMA_generate_common_url( + $url_params + array( + 'report' => 'true', + 'version' => $_REQUEST['version'], + 'delete_ddlog' => ($i - 1), + ) + ) + . '">' . $drop_image_or_text . ''; echo ''; @@ -645,9 +650,15 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { echo '' . htmlspecialchars($entry['date']) . ''; echo '' . htmlspecialchars($entry['username']) . ''; echo '' . $statement . ''; - echo '' + echo '' . $drop_image_or_text . ''; echo ''; From d2828f3860b75d48ae7962edefb641ed6238d9fa Mon Sep 17 00:00:00 2001 From: Dadan Setia Date: Sun, 4 Aug 2013 15:08:02 +0200 Subject: [PATCH 008/141] Translated using Weblate (Indonesian) Currently translated at 79.2% (2067 of 2609) --- po/id.po | 117 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 47 deletions(-) diff --git a/po/id.po b/po/id.po index 49fe71c2a6..84a73d750d 100644 --- a/po/id.po +++ b/po/id.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.0.6-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-07-29 15:07+0200\n" -"PO-Revision-Date: 2013-06-20 14:00+0200\n" +"PO-Revision-Date: 2013-08-04 15:08+0200\n" "Last-Translator: Dadan Setia \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian " +"\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 1.6-dev\n" +"X-Generator: Weblate 1.7-dev\n" "X-Poedit-Basepath: ../../..\n" #: browse_foreigners.php:51 browse_foreigners.php:75 js/messages.php:344 @@ -2614,16 +2614,16 @@ msgstr "" "%sdokumentasi%s." #: libraries/DisplayResults.class.php:4927 -#, fuzzy, php-format +#, php-format #| msgid "Showing rows" msgid "Showing rows %1s - %2s" -msgstr "Tampilan baris" +msgstr "Menampilkan baris %1s - %2s" #: libraries/DisplayResults.class.php:4939 -#, fuzzy, php-format +#, php-format #| msgid "total" msgid "%d total" -msgstr "total" +msgstr "total %d" #: libraries/DisplayResults.class.php:4951 sql.php:945 #, php-format @@ -3216,7 +3216,6 @@ msgid "Use this column to label each point" msgstr "Gunakan kolom ini untuk label setiap titik" #: libraries/TableSearch.class.php:860 -#, fuzzy msgid "Maximum rows to plot" msgstr "Baris maksimum untuk plot" @@ -3240,19 +3239,17 @@ msgid "Do a \"query by example\" (wildcard: \"%\")" msgstr "Lakukan \"kueri dengan contoh\" (wildcard: \"%\")" #: libraries/TableSearch.class.php:1169 -#, fuzzy msgid "Browse/Edit the points" -msgstr "Melihat-lihat/Edit titik" +msgstr "Lihat/Edit titik" #: libraries/TableSearch.class.php:1176 msgid "How to use" msgstr "Cara pakai" #: libraries/TableSearch.class.php:1181 -#, fuzzy #| msgid "Reset" msgid "Reset zoom" -msgstr "Reset Zoom" +msgstr "Set ulang pembesaran" #: libraries/Theme.class.php:170 #, php-format @@ -3415,6 +3412,8 @@ msgid "" "A fixed-length (0-255, default 1) string that is always right-padded with " "spaces to the specified length when stored" msgstr "" +"Sebuah panjang tetap (0-255, standar 1) string yang selalu benar-diisi " +"dengan spasi dengan panjang tertentu bila disimpan" #: libraries/Types.class.php:332 libraries/Types.class.php:730 #, php-format @@ -3422,6 +3421,8 @@ msgid "" "A variable-length (%s) string, the effective maximum length is subject to " "the maximum row size" msgstr "" +"Sebuah pangjang-variabel(%s) string, panjang maksimum efektif tunduk pada " +"ukuran baris" #: libraries/Types.class.php:334 msgid "" @@ -3453,42 +3454,57 @@ msgid "" "characters, stored with a four-byte prefix indicating the length of the " "value in bytes" msgstr "" +"Sebuah kolom TEXT dengan panjang maksimum 4,294,967,295 atau 4GiB (2^32 - " +"1) karakter, disimpan dengan awalan empat byte menunjukkan panjang nilai " +"dalam byte" #: libraries/Types.class.php:342 msgid "" "Similar to the CHAR type, but stores binary byte strings rather than non-" "binary character strings" msgstr "" +"Serupa dengan tipe CHAR, tetapi string menyimpan karakter string biner byte " +"daripada non-biner" #: libraries/Types.class.php:344 msgid "" "Similar to the VARCHAR type, but stores binary byte strings rather than non-" "binary character strings" msgstr "" +"Serupa dengan tipe VARCHAR, tetapi string menyimpan karakter string biner " +"byte daripada non-biner" #: libraries/Types.class.php:346 msgid "" "A BLOB column with a maximum length of 255 (2^8 - 1) bytes, stored with a " "one-byte prefix indicating the length of the value" msgstr "" +"Sebuah kolom BLOB dengan panjang maksimum 255 (2^8 - 1) byte, disimpan " +"dengan awalan satu-byte menunjukkan panjang nilai" #: libraries/Types.class.php:348 msgid "" "A BLOB column with a maximum length of 16,777,215 (2^24 - 1) bytes, stored " "with a three-byte prefix indicating the length of the value" msgstr "" +"Sebuah kolom BLOB dengan panjang maksimum 16,777,215 (2^24 - 1) byte, " +"disimpan dengan awalan tiga byte yang menunjukkan panjang nilai" #: libraries/Types.class.php:350 libraries/Types.class.php:736 msgid "" "A BLOB column with a maximum length of 65,535 (2^16 - 1) bytes, stored with " "a two-byte prefix indicating the length of the value" msgstr "" +"Sebuah kolom BLOB dengan panjang maksimum 65,535 (2^16 - 1) byte, disimpan " +"dengan awalan dua-byte menunjukkan panjang nilai" #: libraries/Types.class.php:352 msgid "" "A BLOB column with a maximum length of 4,294,967,295 or 4GiB (2^32 - 1) " "bytes, stored with a four-byte prefix indicating the length of the value" msgstr "" +"Sebuah kolom BLOB dengan panjang maksimum 4,294,967,295 atau 4GiB (2^32 - 1) " +"byte, disimpan dengan awalan empat byte menunjukkan panjang nilai" #: libraries/Types.class.php:354 msgid "" @@ -3498,63 +3514,60 @@ msgstr "" #: libraries/Types.class.php:356 msgid "A single value chosen from a set of up to 64 members" -msgstr "" +msgstr "Sebuah nilai tunggal dipilih dari satu set hingga 64 anggota" #: libraries/Types.class.php:358 msgid "A type that can store a geometry of any type" -msgstr "" +msgstr "Suatu jenis yang dapat menyimpan geometri dari jenis apa pun" #: libraries/Types.class.php:360 msgid "A point in 2-dimensional space" -msgstr "" +msgstr "Sebuah titik dalam ruang 2-dimensi" #: libraries/Types.class.php:362 msgid "A curve with linear interpolation between points" -msgstr "" +msgstr "Kurva dengan interpolasi linier antara titik" #: libraries/Types.class.php:364 -#, fuzzy #| msgid "Add a polygon" msgid "A polygon" -msgstr "Tambahkan poligon" +msgstr "Sebuah poligon" #: libraries/Types.class.php:366 msgid "A collection of points" -msgstr "" +msgstr "Sebuah koleksi poin" #: libraries/Types.class.php:368 msgid "A collection of curves with linear interpolation between points" -msgstr "" +msgstr "Sebuah koleksi kurva dengan interpolasi linier antara titik" #: libraries/Types.class.php:370 msgid "A collection of polygons" -msgstr "" +msgstr "Sebuah koleksi poligon" #: libraries/Types.class.php:372 msgid "A collection of geometry objects of any type" -msgstr "" +msgstr "Sebuah koleksi objek geometri dari jenis apa pun" #: libraries/Types.class.php:624 libraries/Types.class.php:974 msgctxt "numeric types" msgid "Numeric" -msgstr "" +msgstr "Numerik" #: libraries/Types.class.php:643 libraries/Types.class.php:977 -#, fuzzy #| msgid "Create an index" msgctxt "date and time types" msgid "Date and time" -msgstr "Buat indeks" +msgstr "Tanggal dan waktu" #: libraries/Types.class.php:652 libraries/Types.class.php:980 #, fuzzy #| msgid "Linestring" msgctxt "string types" msgid "String" -msgstr "Segmen garis" +msgstr "String" #: libraries/Types.class.php:673 -#, fuzzy #| msgid "Spatial" msgctxt "spatial types" msgid "Spatial" @@ -3562,13 +3575,15 @@ msgstr "Spasial" #: libraries/Types.class.php:708 msgid "A 4-byte integer, range is -2,147,483,648 to 2,147,483,647" -msgstr "" +msgstr "4-byte integer, berada pada kisaran -2,147,483,648 sampai 2,147,483,647" #: libraries/Types.class.php:710 msgid "" "An 8-byte integer, range is -9,223,372,036,854,775,808 to " "9,223,372,036,854,775,807" msgstr "" +"8-byte integer, berada pada kisaran -9,223,372,036,854,775,808 sampai " +"9,223,372,036,854,775,807" #: libraries/Types.class.php:714 msgid "A system's default double-precision floating-point number" @@ -3576,31 +3591,36 @@ msgstr "" #: libraries/Types.class.php:716 msgid "True or false" -msgstr "" +msgstr "Benar atau salah" #: libraries/Types.class.php:718 msgid "An alias for BIGINT NOT NULL AUTO_INCREMENT UNIQUE" -msgstr "" +msgstr "Alias untuk BIGINT NOT NULL AUTO_INCREMENT UNIQUE" #: libraries/Types.class.php:720 +#, fuzzy msgid "Stores a Universally Unique Identifier (UUID)" -msgstr "" +msgstr "Stores a Universally Unique Identifier (UUID)" #: libraries/Types.class.php:726 msgid "" "A timestamp, range is '0001-01-01 00:00:00' UTC to '9999-12-31 23:59:59' " "UTC; TIMESTAMP(6) can store microseconds" msgstr "" +"Timestamp, berada pada kisaran '0001-01-01 00:00:00' UTC sampai '9999-12-31 " +"23:59:59' UTC; TIMESTAMP(6) dapat disimpan dalam mikro detik" #: libraries/Types.class.php:734 msgid "" "A variable-length (0-65,535) string, uses binary collation for all " "comparisons" msgstr "" +"Sebuah panjang-variabel string(0-65,535), menggunakan pemeriksaan biner " +"untuk semua perbandingan" #: libraries/Types.class.php:738 msgid "An enumeration, chosen from the list of defined values" -msgstr "" +msgstr "Sebuah pencacahan, dipilih dari daftar nilai yang ditetapkan" #: libraries/Util.class.php:237 #, php-format @@ -3796,7 +3816,6 @@ msgid "Could not load default configuration from: %1$s" msgstr "Tidak dapat memuat konfigurasi default dari: %1$s" #: libraries/common.inc.php:615 -#, fuzzy #| msgid "" #| "The $cfg['PmaAbsoluteUri'] directive MUST be set in your " #| "configuration file!" @@ -3804,8 +3823,8 @@ msgid "" "The [code]$cfg['PmaAbsoluteUri'][/code] directive MUST be set in your " "configuration file!" msgstr "" -"Directif $cfg['PmaAbsoluteUri'] WAJIB diset dalam berkas " -"konfigurasi!" +"[code]$cfg['PmaAbsoluteUri'][/code] direktif HARUS di atur pada file " +"konfigurasi anda!" #: libraries/common.inc.php:648 #, php-format @@ -3829,7 +3848,7 @@ msgstr "Anda harus memperbarui ke %s %s atau lebih baru." #: libraries/common.inc.php:1079 msgid "Error: Token mismatch" -msgstr "" +msgstr "Error: Token tidak cocok" #: libraries/common.inc.php:1123 msgid "GLOBALS overwrite attempt" @@ -3846,12 +3865,12 @@ msgstr "tombol angka terdeteksi" #: libraries/config.values.php:49 libraries/config.values.php:64 #: libraries/config.values.php:69 msgid "Icons" -msgstr "" +msgstr "Ikon" #: libraries/config.values.php:50 libraries/config.values.php:65 #: libraries/config.values.php:70 msgid "Text" -msgstr "" +msgstr "Teks" #: libraries/config.values.php:51 libraries/config.values.php:58 #: libraries/config.values.php:66 libraries/config.values.php:71 @@ -3872,11 +3891,11 @@ msgstr "Kanan" #: libraries/config.values.php:74 msgid "Click" -msgstr "" +msgstr "Klik" #: libraries/config.values.php:75 msgid "Double click" -msgstr "" +msgstr "Klik ganda" #: libraries/config.values.php:76 libraries/config.values.php:107 #: libraries/config/FormDisplay.tpl.php:223 libraries/relation.lib.php:96 @@ -4130,10 +4149,13 @@ msgid "" "Use user-friendly editor for editing SQL queries ([a@http://codemirror." "net/]CodeMirror[/a]) with syntax highlighting and line numbers" msgstr "" +"Gunakan editor user-friendly untuk mengedit query SQL " +"([a@http://codemirror.net/]CodeMirror[/a]) dengan penyorotan sintaks dan " +"nomor baris" #: libraries/config/messages.inc.php:33 msgid "Enable CodeMirror" -msgstr "" +msgstr "Aktifkan CodeMirror" #: libraries/config/messages.inc.php:34 msgid "" @@ -4238,13 +4260,12 @@ msgstr "Tab tabel bawaan" #: libraries/config/messages.inc.php:56 msgid "Whether the table structure actions should be hidden" -msgstr "" +msgstr "Sebaiknya stuktur aksi tabel disembunyikan" #: libraries/config/messages.inc.php:57 -#, fuzzy #| msgid "Propose table structure" msgid "Hide table structure actions" -msgstr "Usulkan struktur tabel" +msgstr "Sembunyikan stuktur aksi tabel" #: libraries/config/messages.inc.php:58 msgid "Show binary contents as HEX by default" @@ -4291,6 +4312,8 @@ msgid "" "Set the number of seconds a script is allowed to run ([kbd]0[/kbd] for no " "limit)" msgstr "" +"Atur jumlah detik yang diperbolehkan untuk menjalankan script ([kbd]0[/kbd] " +"untuk tanpa batas)" #: libraries/config/messages.inc.php:69 msgid "Maximum execution time" @@ -6219,7 +6242,7 @@ msgstr "Open Document Text" #: libraries/config/validate.lib.php:214 msgid "Could not initialize Drizzle connection library" -msgstr "" +msgstr "Tidak bisa menginisialisasi koneksi pustaka Drizzle" #: libraries/config/validate.lib.php:223 libraries/config/validate.lib.php:231 msgid "Could not connect to Drizzle server" @@ -6227,7 +6250,7 @@ msgstr "Tidak dapat terhubung ke server Drizzle" #: libraries/config/validate.lib.php:242 libraries/config/validate.lib.php:249 msgid "Could not connect to MySQL server" -msgstr "" +msgstr "Tidak dapat menghubungi server MySQL" #: libraries/config/validate.lib.php:282 msgid "Empty username while using config authentication method" From 246cfdb90ec64899375d16974ed56277ad7932f9 Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Mon, 5 Aug 2013 06:00:53 -0400 Subject: [PATCH 009/141] Directly use the request parameter --- browse_foreigners.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/browse_foreigners.php b/browse_foreigners.php index e94cea8082..c1f53c94d5 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -15,7 +15,6 @@ require_once 'libraries/transformations.lib.php'; $request_params = array( 'field', 'fieldkey', - 'foreign_filter', 'pos', 'rownumber' ); @@ -54,7 +53,9 @@ if (isset($foreign_navig) && $foreign_navig == __('Show all')) { $foreignData = PMA_getForeignData( $foreigners, $field, $override_total, - isset($foreign_filter) ? $foreign_filter : '', $foreign_limit + isset($_REQUEST['foreign_filter']) + ? $_REQUEST['foreign_filter'] + : '', $foreign_limit ); if (isset($rownumber)) { @@ -181,7 +182,10 @@ if (isset($rownumber)) { $output .= '' . '' . '' + . (isset($_REQUEST['foreign_filter']) + ? htmlspecialchars($_REQUEST['foreign_filter']) + : '') + . '" />' . '' . '' From e320e565aba2511bd4eafbd534917e5ec4fa1bea Mon Sep 17 00:00:00 2001 From: Dieter Adriaenssens Date: Mon, 5 Aug 2013 10:50:25 +0200 Subject: [PATCH 010/141] Translated using Weblate (Dutch) Currently translated at 100.0% (2713 of 2714) --- po/nl.po | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/po/nl.po b/po/nl.po index 67f93eb0c1..206648d167 100644 --- a/po/nl.po +++ b/po/nl.po @@ -4,7 +4,7 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.1-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-08-01 14:09+0200\n" -"PO-Revision-Date: 2013-08-04 19:12+0200\n" +"PO-Revision-Date: 2013-08-05 10:50+0200\n" "Last-Translator: Dieter Adriaenssens \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -6149,7 +6149,6 @@ msgid "Users table" msgstr "Gebruikerstabel" #: libraries/config/messages.inc.php:458 -#, fuzzy #| msgid "" #| "Leave blank for no user preferences storage in database, suggested: " #| "[kbd]pma__userconfig[/kbd]" @@ -6157,8 +6156,8 @@ msgid "" "Leave blank to disable configurable menus feature, suggested: " "[kbd]pma__usergroups[/kbd]" msgstr "" -"Laat dit veld leeg om geen gebruikersvoorkeuren op te slaan in de databank, " -"suggestie: [kbd]pma__userconfig[/kbd]" +"Laat dit veld leeg om configureerbare menu's uit te schakelen , suggestie: " +"[kbd]pma__usergroups[/kbd]" #: libraries/config/messages.inc.php:459 msgid "User groups table" From 3d81d2110b04e572b233a208a0a7c486bd9c9777 Mon Sep 17 00:00:00 2001 From: Dong-bum Kim Date: Mon, 5 Aug 2013 11:41:00 +0200 Subject: [PATCH 011/141] Translated using Weblate (Korean) Currently translated at 69.6% (1888 of 2714) --- po/ko.po | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/po/ko.po b/po/ko.po index 960de4899b..50057b8251 100644 --- a/po/ko.po +++ b/po/ko.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.1-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-08-01 14:09+0200\n" -"PO-Revision-Date: 2013-08-03 06:44+0200\n" -"Last-Translator: 도원 권 \n" +"PO-Revision-Date: 2013-08-05 11:41+0200\n" +"Last-Translator: Dong-bum Kim \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -3304,7 +3304,7 @@ msgstr "표시할 최대 열(row) 수" #: libraries/TableSearch.class.php:899 libraries/TableSearch.class.php:1203 #: libraries/sql.lib.php:371 tbl_change.php:146 msgid "Browse foreign values" -msgstr "" +msgstr "외래값 탐색" #: libraries/TableSearch.class.php:990 msgid "Additional search criteria" @@ -5300,7 +5300,7 @@ msgstr "서버 선택 출력" #: libraries/config/messages.inc.php:308 msgid "Target for quick access icon" -msgstr "" +msgstr "빠른 접근 아이콘 대상" #: libraries/config/messages.inc.php:309 msgid "" @@ -5436,7 +5436,7 @@ msgstr "" #: libraries/config/messages.inc.php:338 msgid "Server/library difference warning" -msgstr "" +msgstr "서버/라이브러리 차이점 경고" #: libraries/config/messages.inc.php:339 msgid "" @@ -5574,11 +5574,11 @@ msgstr "루트 사용자 로그인 허용" #: libraries/config/messages.inc.php:375 msgid "HTTP Basic Auth Realm name to display when doing HTTP Auth" -msgstr "" +msgstr "HTTP 인증시 HTTP 기본 렐름 이름" #: libraries/config/messages.inc.php:376 msgid "HTTP Realm" -msgstr "" +msgstr "HTTP 렐름" #: libraries/config/messages.inc.php:377 msgid "" @@ -5616,10 +5616,9 @@ msgid "" msgstr "" #: libraries/config/messages.inc.php:384 -#, fuzzy #| msgid "Version information:" msgid "Column information table" -msgstr "버전 정보:" +msgstr "컬럼 정보 테이블" #: libraries/config/messages.inc.php:385 msgid "Compress connection to MySQL server" @@ -5681,10 +5680,9 @@ msgid "" msgstr "" #: libraries/config/messages.inc.php:397 -#, fuzzy #| msgid "Designer" msgid "Designer table" -msgstr "디자이너" +msgstr "디자이너 테이블" #: libraries/config/messages.inc.php:398 msgid "" @@ -5722,7 +5720,7 @@ msgstr "" #: libraries/config/messages.inc.php:405 msgid "SQL query history table" -msgstr "" +msgstr "SQL 쿼리 히스토리 테이블" #: libraries/config/messages.inc.php:406 msgid "Hostname where MySQL server is running" From 66184fe8cc6d54d47c53e064e6cba43d18b8d8cd Mon Sep 17 00:00:00 2001 From: adamgsoc2013 Date: Mon, 5 Aug 2013 23:50:20 +0800 Subject: [PATCH 012/141] fix code comments on test code --- test/classes/dbi/DBIDrizzle_test.php | 12 +++ test/libraries/PMA_SQL_parse_analyze_test.php | 12 +++ test/libraries/PMA_SQL_parser_data_test.php | 57 ++++++++++++++ test/libraries/PMA_SQL_parser_test.php | 14 +++- test/libraries/PMA_ip_allow_deny_test.php | 14 +++- test/libraries/PMA_relation_cleanup_test.php | 75 ++++++++++++++++++- 6 files changed, 180 insertions(+), 4 deletions(-) diff --git a/test/classes/dbi/DBIDrizzle_test.php b/test/classes/dbi/DBIDrizzle_test.php index 40ba9d438f..99cae9f7e3 100644 --- a/test/classes/dbi/DBIDrizzle_test.php +++ b/test/classes/dbi/DBIDrizzle_test.php @@ -8,11 +8,23 @@ /* * Include to test and mock Drizzle class. */ +/** + * Drizzle for Mock drizzle class + * + * this class is for Mock Drizzle + * + * @package PhpMyAdmin-test + */ class Drizzle { } +/** + * function to return drizzle_version + * + * @return string + */ function drizzle_version() { return "1.0.0"; diff --git a/test/libraries/PMA_SQL_parse_analyze_test.php b/test/libraries/PMA_SQL_parse_analyze_test.php index 61a6723c38..cc56cd71c4 100644 --- a/test/libraries/PMA_SQL_parse_analyze_test.php +++ b/test/libraries/PMA_SQL_parse_analyze_test.php @@ -12,8 +12,20 @@ require_once 'libraries/Util.class.php'; require_once 'libraries/sqlparser.lib.php'; +/** + * PMA_SQLParserAnalyze_Test class + * + * this class is for testing sqlparser.lib.php + * + * @package PhpMyAdmin-test + */ class PMA_SQLParserAnalyze_Test extends PHPUnit_Framework_TestCase { + /** + * Test for PMA_SQP_getParserAnalyze + * + * @return void + */ public function testPMA_SQP_getParserAnalyzeMa() { //select statement diff --git a/test/libraries/PMA_SQL_parser_data_test.php b/test/libraries/PMA_SQL_parser_data_test.php index 22f694c4a4..a77b17dfd1 100644 --- a/test/libraries/PMA_SQL_parser_data_test.php +++ b/test/libraries/PMA_SQL_parser_data_test.php @@ -12,8 +12,22 @@ require_once 'libraries/sqlparser.data.php'; require_once 'libraries/sqlparser.lib.php'; +/** + * PMA_SQLParser_Data_Test class + * + * this class is for testing sqlparser.data.php + * + * @package PhpMyAdmin-test + */ class PMA_SQLParser_Data_Test extends PHPUnit_Framework_TestCase { + /** + * assert Sorted values + * + * @param array $array Sorted values array + * + * @return null + */ private function _assertSorted($array) { $copy = $array; @@ -22,11 +36,24 @@ class PMA_SQLParser_Data_Test extends PHPUnit_Framework_TestCase $this->assertEquals($difference, array()); } + /** + * assert Parser values + * + * @param string $name Parser Data key + * + * @return null + */ private function _assertParserData($name) { $this->_assertSorted($GLOBALS[$name]); } + + /** + * Test for PMA_SQPdata + * + * @return void + */ public function testPMA_SQPdata() { $data = PMA_SQP_getParserDataMap(); @@ -37,26 +64,56 @@ class PMA_SQLParser_Data_Test extends PHPUnit_Framework_TestCase $this->_assertSorted($data['PMA_SQPdata_column_type']); } + + /** + * Test for PMA_SQPdata_function_name + * + * @return void + */ public function testPMA_SQPdata_function_name() { $this->_assertParserData('PMA_SQPdata_function_name'); } + + /** + * Test for PMA_SQPdata_column_attrib + * + * @return void + */ public function testPMA_SQPdata_column_attrib() { $this->_assertParserData('PMA_SQPdata_column_attrib'); } + + /** + * Test for PMA_SQPdata_reserved_word + * + * @return void + */ public function testPMA_SQPdata_reserved_word() { $this->_assertParserData('PMA_SQPdata_reserved_word'); } + + /** + * Test for PMA_SQPdata_forbidden_word + * + * @return void + */ public function testPMA_SQPdata_forbidden_word() { $this->_assertParserData('PMA_SQPdata_forbidden_word'); } + + /** + * Test for PMA_SQPdata_column_type + * + * @return void + */ public function testPMA_SQPdata_column_type() { $this->_assertParserData('PMA_SQPdata_column_type'); diff --git a/test/libraries/PMA_SQL_parser_test.php b/test/libraries/PMA_SQL_parser_test.php index 097bad4492..4fc8747b9a 100644 --- a/test/libraries/PMA_SQL_parser_test.php +++ b/test/libraries/PMA_SQL_parser_test.php @@ -17,6 +17,13 @@ require_once 'libraries/Util.class.php'; require_once 'libraries/Theme.class.php'; require_once 'libraries/sanitizing.lib.php'; +/** + * PMA_SQLParser_Test class + * + * this class is for testing sqlparser.lib.php + * + * @package PhpMyAdmin-test + */ class PMA_SQLParser_Test extends PHPUnit_Framework_TestCase { /** @@ -53,7 +60,12 @@ class PMA_SQLParser_Test extends PHPUnit_Framework_TestCase $this->assertEquals('', PMA_SQP_getErrorString()); $this->assertEquals($expected, $parsed_sql); } - + + /** + * Test for PMA_SQP_isKeyWord + * + * @return void + */ public function testPMA_SQP_isKeyWord() { PMA_SQP_resetError(); diff --git a/test/libraries/PMA_ip_allow_deny_test.php b/test/libraries/PMA_ip_allow_deny_test.php index b09f763cf9..433728c6a1 100644 --- a/test/libraries/PMA_ip_allow_deny_test.php +++ b/test/libraries/PMA_ip_allow_deny_test.php @@ -15,8 +15,20 @@ require_once 'libraries/database_interface.inc.php'; require_once 'libraries/Tracker.class.php'; require_once 'libraries/ip_allow_deny.lib.php'; -class PMA_Ip_allow_deny_Test extends PHPUnit_Framework_TestCase +/** + * PMA_Ip_Allow_Deny_Test class + * + * this class is for testing ip_allow_deny.lib.php + * + * @package PhpMyAdmin-test + */ +class PMA_Ip_Allow_Deny_Test extends PHPUnit_Framework_TestCase { + /** + * Prepares environment for the test. + * + * @return void + */ public function setUp() { $GLOBALS['cfg']['Server']['user'] = "pma_username"; diff --git a/test/libraries/PMA_relation_cleanup_test.php b/test/libraries/PMA_relation_cleanup_test.php index c84d40c59f..88bb99edc0 100644 --- a/test/libraries/PMA_relation_cleanup_test.php +++ b/test/libraries/PMA_relation_cleanup_test.php @@ -17,9 +17,20 @@ require_once 'libraries/Tracker.class.php'; require_once 'libraries/relation.lib.php'; require_once 'libraries/relation_cleanup.lib.php'; - +/** + * PMA_Relation_Cleanup_Test class + * + * this class is for testing relation_cleanup.lib.php functions + * + * @package PhpMyAdmin-test + */ class PMA_Relation_Cleanup_Test extends PHPUnit_Framework_TestCase { + /** + * Prepares environment for the test. + * + * @return void + */ public function setUp() { $_SESSION['relation'] = array(); @@ -45,6 +56,12 @@ class PMA_Relation_Cleanup_Test extends PHPUnit_Framework_TestCase $this->redefineRelation(); } + + /** + * functions for redefine DBI_PMA_Relation_Cleanup + * + * @return void + */ public function redefineRelation() { $GLOBALS['dbi'] = new DBI_PMA_Relation_Cleanup(); @@ -281,13 +298,24 @@ class PMA_Relation_Cleanup_Test extends PHPUnit_Framework_TestCase } } -//Mock DBI +/** + * DBI_PMA_Relation_Cleanup for Mock DBI class + * + * this class is for Mock DBI + * + * @package PhpMyAdmin-test + */ class DBI_PMA_Relation_Cleanup extends PMA_DatabaseInterface { var $index; var $values = array(); var $indexs = array(); + + /** + * Constructor + * + */ public function __construct() { $this->index = 0; @@ -327,6 +355,13 @@ class DBI_PMA_Relation_Cleanup extends PMA_DatabaseInterface ); } + /** + * returns array of rows with numeric keys from $result + * + * @param object $result result set identifier + * + * @return array + */ function fetchRow($result) { if ($this->index < count($this->values)) { @@ -339,6 +374,17 @@ class DBI_PMA_Relation_Cleanup extends PMA_DatabaseInterface return false; } + + /** + * runs a query + * + * @param string $sql SQL query to execte + * @param mixed $link optional database link to use + * @param int $options optional query options + * @param bool $cache_affected_rows whether to cache affected rows + * + * @return mixed + */ function query($sql, $link = null, $options = 0, $cache_affected_rows = true) { if (stripos($sql, "column_info") !== false) { @@ -370,17 +416,42 @@ class DBI_PMA_Relation_Cleanup extends PMA_DatabaseInterface } } + /** + * runs a query and returns the result + * + * @param string $query query to run + * @param resource $link mysql link resource + * @param integer $options query options + * @param bool $cache_affected_rows whether to cache affected row + * + * @return mixed + */ public function tryQuery( $query, $link = null, $options = 0, $cache_affected_rows = true ) { return true; } + /** + * selects given database + * + * @param string $dbname database name to select + * @param object $link connection object + * + * @return boolean + */ public function selectDb($dbname, $link = null) { return true; } + /** + * Frees memory associated with the result + * + * @param object $result database result + * + * @return void + */ public function freeResult($result) { return true; From 20cbf3ea6c5e199c65b9e5c249f1a2736683f506 Mon Sep 17 00:00:00 2001 From: Dong-bum Kim Date: Mon, 5 Aug 2013 11:41:00 +0200 Subject: [PATCH 013/141] Translated using Weblate (Korean) Currently translated at 73.1% (1907 of 2609) --- po/ko.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/po/ko.po b/po/ko.po index 73b7d917f8..8a0d974bf7 100644 --- a/po/ko.po +++ b/po/ko.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.0.6-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-07-29 15:07+0200\n" -"PO-Revision-Date: 2013-08-03 06:44+0200\n" -"Last-Translator: 도원 권 \n" +"PO-Revision-Date: 2013-08-05 11:40+0200\n" +"Last-Translator: Dong-bum Kim \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -3188,7 +3188,7 @@ msgstr "표시할 최대 열(row) 수" #: libraries/TableSearch.class.php:888 libraries/TableSearch.class.php:1160 #: sql.php:159 tbl_change.php:230 msgid "Browse foreign values" -msgstr "" +msgstr "외래값 탐색" #: libraries/TableSearch.class.php:977 msgid "Additional search criteria" @@ -5064,7 +5064,7 @@ msgstr "서버 선택 출력" #: libraries/config/messages.inc.php:307 msgid "Target for quick access icon" -msgstr "" +msgstr "빠른 접근 아이콘 대상" #: libraries/config/messages.inc.php:308 msgid "" @@ -5200,7 +5200,7 @@ msgstr "" #: libraries/config/messages.inc.php:337 msgid "Server/library difference warning" -msgstr "" +msgstr "서버/라이브러리 차이점 경고" #: libraries/config/messages.inc.php:338 msgid "" @@ -5338,11 +5338,11 @@ msgstr "루트 사용자 로그인 허용" #: libraries/config/messages.inc.php:374 msgid "HTTP Basic Auth Realm name to display when doing HTTP Auth" -msgstr "" +msgstr "HTTP 인증시 HTTP 기본 렐름 이름" #: libraries/config/messages.inc.php:375 msgid "HTTP Realm" -msgstr "" +msgstr "HTTP 렐름" #: libraries/config/messages.inc.php:376 msgid "" @@ -5381,7 +5381,7 @@ msgstr "" #: libraries/config/messages.inc.php:383 msgid "Column information table" -msgstr "" +msgstr "컬럼 정보 테이블" #: libraries/config/messages.inc.php:384 msgid "Compress connection to MySQL server" @@ -5431,7 +5431,7 @@ msgstr "" #: libraries/config/messages.inc.php:394 msgid "Designer table" -msgstr "" +msgstr "디자이너 테이블" #: libraries/config/messages.inc.php:395 msgid "" @@ -5467,7 +5467,7 @@ msgstr "" #: libraries/config/messages.inc.php:402 msgid "SQL query history table" -msgstr "" +msgstr "SQL 쿼리 히스토리 테이블" #: libraries/config/messages.inc.php:403 msgid "Hostname where MySQL server is running" From eb73ee6617406493a778aafcd7c1945345888a62 Mon Sep 17 00:00:00 2001 From: Myung Han Yu Date: Tue, 6 Aug 2013 03:07:53 +0200 Subject: [PATCH 014/141] Translated using Weblate (Korean) Currently translated at 69.6% (1889 of 2714) --- po/ko.po | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/po/ko.po b/po/ko.po index 50057b8251..ff730caacc 100644 --- a/po/ko.po +++ b/po/ko.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.1-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-08-01 14:09+0200\n" -"PO-Revision-Date: 2013-08-05 11:41+0200\n" -"Last-Translator: Dong-bum Kim \n" +"PO-Revision-Date: 2013-08-06 03:07+0200\n" +"Last-Translator: Myung Han Yu \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -3297,7 +3297,6 @@ msgid "Use this column to label each point" msgstr "다음 컬럼을 통해 각 포인트 레이블" #: libraries/TableSearch.class.php:870 -#, fuzzy msgid "Maximum rows to plot" msgstr "표시할 최대 열(row) 수" From 03f5339d6f62ca7cb64cdc64d71f55656e7c93d1 Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Tue, 6 Aug 2013 05:20:03 -0400 Subject: [PATCH 015/141] Dead code --- browse_foreigners.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/browse_foreigners.php b/browse_foreigners.php index c1f53c94d5..857f062580 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -58,12 +58,6 @@ $foreignData = PMA_getForeignData( : '', $foreign_limit ); -if (isset($rownumber)) { - $rownumber_param = '&rownumber=' . urlencode($rownumber); -} else { - $rownumber_param = ''; -} - $gotopage = ''; $showall = ''; From ecb2aa89d32edf46d959bfdebbf4c2d90fe4c030 Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Tue, 6 Aug 2013 05:23:48 -0400 Subject: [PATCH 016/141] Directly use the request parameter --- browse_foreigners.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/browse_foreigners.php b/browse_foreigners.php index 857f062580..613f30d4d6 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -15,8 +15,7 @@ require_once 'libraries/transformations.lib.php'; $request_params = array( 'field', 'fieldkey', - 'pos', - 'rownumber' + 'pos' ); foreach ($request_params as $one_request_param) { @@ -92,11 +91,11 @@ if (is_array($foreignData['disp_row'])) { -if (isset($rownumber)) { +if (isset($_REQUEST['rownumber'])) { $element_name = " var element_name = field + '[multi_edit][" - . htmlspecialchars($rownumber) . "][' + fieldmd5 + ']';\n" + . htmlspecialchars($_REQUEST['rownumber']) . "][' + fieldmd5 + ']';\n" . " var null_name = field_null + '[multi_edit][" - . htmlspecialchars($rownumber) . "][' + fieldmd5 + ']';\n"; + . htmlspecialchars($_REQUEST['rownumber']) . "][' + fieldmd5 + ']';\n"; } else { $element_name = "var element_name = field + '[]'"; } @@ -169,9 +168,9 @@ $output = '
' . ''; -if (isset($rownumber)) { +if (isset($_REQUEST['rownumber'])) { $output .= ''; + . htmlspecialchars($_REQUEST['rownumber']) . '" />'; } $output .= '' . '' From 76133dd007fd8e39e5b2ac47e7cdae378cbe2a7c Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Tue, 6 Aug 2013 05:42:34 -0400 Subject: [PATCH 017/141] Directly use the request parameter --- browse_foreigners.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/browse_foreigners.php b/browse_foreigners.php index 613f30d4d6..6ef81be26a 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -14,8 +14,7 @@ require_once 'libraries/transformations.lib.php'; */ $request_params = array( 'field', - 'fieldkey', - 'pos' + 'fieldkey' ); foreach ($request_params as $one_request_param) { @@ -41,8 +40,10 @@ $foreigners = ($cfgRelation['relwork'] ? PMA_getForeigners($db, $table) : false $override_total = true; -if (! isset($pos)) { +if (! isset($_REQUEST['pos'])) { $pos = 0; +} else { + $pos = $_REQUEST['pos']; } $foreign_limit = 'LIMIT ' . $pos . ', ' . $GLOBALS['cfg']['MaxRows'] . ' '; From 6bb21aec664ffbc60a10f8d74183c32670ff8190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 11:52:48 +0200 Subject: [PATCH 018/141] Do not try to add documentation links with disabled docs --- libraries/sqlparser.lib.php | 10 ++++++++-- test/libraries/common/PMA_formatSql_test.php | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libraries/sqlparser.lib.php b/libraries/sqlparser.lib.php index be85391e36..b0595397ed 100644 --- a/libraries/sqlparser.lib.php +++ b/libraries/sqlparser.lib.php @@ -1722,7 +1722,7 @@ function PMA_SQP_analyze($arr) if ($upper_data == 'OFFSET') { $subresult['queryflags']['offset'] = 1; } - + // for the presence of CALL if ($upper_data == 'CALL') { $subresult['queryflags']['is_procedure'] = 1; @@ -2293,7 +2293,13 @@ function PMA_SQP_format( case 'text': $str = ''; $html_line_break = '
'; - $docu = true; + if (($GLOBALS['cfg']['MySQLManualType'] == 'none') + || empty($GLOBALS['cfg']['MySQLManualBase']) + ) { + $docu = false; + } else { + $docu = true; + } break; } // end switch // inner_sql is a span that exists for all cases, except query_only diff --git a/test/libraries/common/PMA_formatSql_test.php b/test/libraries/common/PMA_formatSql_test.php index 93712bcfed..c385ddcc0a 100644 --- a/test/libraries/common/PMA_formatSql_test.php +++ b/test/libraries/common/PMA_formatSql_test.php @@ -74,7 +74,7 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase 'len' => 3, ); $unparsed = "SELECT 1;"; - $expected = 'SELECT 1 ;

'; + $expected = 'SELECT 1 ;

'; $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) @@ -124,7 +124,7 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase ), 'len' => 5, ); - $expected = 'SELECT *
FROM `tTable` ;

'; + $expected = 'SELECT *
FROM `tTable` ;

'; $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) @@ -261,7 +261,7 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase ), 'len' => 18, ); - $expected = 'SELECT *
FROM `tTable_A` A
INNER JOIN `tTable_B` B ON B.ID = A.ID;

'; + $expected = 'SELECT *
FROM `tTable_A` A
INNER JOIN `tTable_B` B ON B.ID = A.ID;

'; $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) From 9473fb8fedaa912eaa5f761cb2d86231f853820c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:00:06 +0200 Subject: [PATCH 019/141] Remove code for adding MySQL documentation links to query This does not work anyway with CodeMirror based highlighter. --- libraries/sqlparser.lib.php | 251 ------------------------------------ 1 file changed, 251 deletions(-) diff --git a/libraries/sqlparser.lib.php b/libraries/sqlparser.lib.php index b0595397ed..40cde13db8 100644 --- a/libraries/sqlparser.lib.php +++ b/libraries/sqlparser.lib.php @@ -2288,18 +2288,10 @@ function PMA_SQP_format( case 'query_only': $str = ''; $html_line_break = "\n"; - $docu = false; break; case 'text': $str = ''; $html_line_break = '
'; - if (($GLOBALS['cfg']['MySQLManualType'] == 'none') - || empty($GLOBALS['cfg']['MySQLManualBase']) - ) { - $docu = false; - } else { - $docu = true; - } break; } // end switch // inner_sql is a span that exists for all cases, except query_only @@ -2308,7 +2300,6 @@ function PMA_SQP_format( if ($mode!='query_only') { $str .= ''; } - $close_docu_link = false; $indent = 0; $bracketlevel = 0; $functionlevel = 0; @@ -2479,18 +2470,6 @@ function PMA_SQP_format( break; case 'punct': $before .= ' '; - if ($docu && isset($PMA_SQPdata_operators_docs[$arr[$i]['data']]) - && ($arr[$i]['data'] != '*' || in_array($arr[$i]['type'], array('digit_integer','digit_float','digit_hex'))) - ) { - $before .= PMA_Util::showMySQLDocu( - 'functions', - $PMA_SQPdata_operators_docs[$arr[$i]['data']]['link'], - false, - $PMA_SQPdata_operators_docs[$arr[$i]['data']]['anchor'], - true - ); - $after .= ''; - } // workaround for // select * from mytable limit 0,-1 @@ -2519,68 +2498,6 @@ function PMA_SQP_format( } break; case 'alpha_columnType': - if ($docu) { - switch ($arr[$i]['data']) { - case 'tinyint': - case 'smallint': - case 'mediumint': - case 'int': - case 'bigint': - case 'decimal': - case 'float': - case 'double': - case 'real': - case 'bit': - case 'boolean': - case 'serial': - $before .= PMA_Util::showMySQLDocu( - 'data-types', - 'numeric-types', - false, - '', - true - ); - $after = '' . $after; - break; - case 'date': - case 'datetime': - case 'timestamp': - case 'time': - case 'year': - $before .= PMA_Util::showMySQLDocu( - 'data-types', - 'date-and-time-types', - false, - '', - true - ); - $after = '' . $after; - break; - case 'char': - case 'varchar': - case 'tinytext': - case 'text': - case 'mediumtext': - case 'longtext': - case 'binary': - case 'varbinary': - case 'tinyblob': - case 'mediumblob': - case 'blob': - case 'longblob': - case 'enum': - case 'set': - $before .= PMA_Util::showMySQLDocu( - 'data-types', - 'string-types', - false, - '', - true - ); - $after = '' . $after; - break; - } - } if ($typearr[3] == 'alpha_columnAttrib') { $after .= ' '; } @@ -2623,16 +2540,6 @@ function PMA_SQP_format( break; case 'alpha_functionName': $funcname = strtoupper($arr[$i]['data']); - if ($docu && isset($PMA_SQPdata_functions_docs[$funcname])) { - $before .= PMA_Util::showMySQLDocu( - 'functions', - $PMA_SQPdata_functions_docs[$funcname]['link'], - false, - $PMA_SQPdata_functions_docs[$funcname]['anchor'], - true - ); - $after .= ''; - } break; case 'alpha_reservedWord': // do not uppercase the reserved word if we are calling @@ -2697,41 +2604,6 @@ function PMA_SQP_format( case 'ANALYZE': case 'ANALYSE': case 'OPTIMIZE': - if ($docu) { - switch ($arr[$i + 1]['data']) { - case 'EVENT': - case 'TABLE': - case 'TABLESPACE': - case 'FUNCTION': - case 'INDEX': - case 'PROCEDURE': - case 'TRIGGER': - case 'SERVER': - case 'DATABASE': - case 'VIEW': - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'] . '_' . $arr[$i + 1]['data'], - false, - '', - true - ); - $close_docu_link = true; - break; - } - if ($arr[$i + 1]['data'] == 'LOGFILE' - && $arr[$i + 2]['data'] == 'GROUP' - ) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'] . '_LOGFILE_GROUP', - false, - '', - true - ); - $close_docu_link = true; - } - } if (!$in_priv_list) { $space_punct_listsep = $html_line_break; $space_alpha_reserved_word = ' '; @@ -2748,24 +2620,8 @@ function PMA_SQP_format( case 'DATABASE': case 'VIEW': case 'GROUP': - if ($close_docu_link) { - $after = '' . $after; - $close_docu_link = false; - } break; case 'SET': - if ($docu - && ($i == 0 || $arr[$i - 1]['data'] != 'CHARACTER') - ) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'], - false, - '', - true - ); - $after = '' . $after; - } if (!$in_priv_list) { $space_punct_listsep = $html_line_break; $space_alpha_reserved_word = ' '; @@ -2776,16 +2632,6 @@ function PMA_SQP_format( case 'DELETE': case 'SHOW': case 'UPDATE': - if ($docu) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'], - false, - '', - true - ); - $after = '' . $after; - } if (!$in_priv_list) { $space_punct_listsep = $html_line_break; $space_alpha_reserved_word = ' '; @@ -2793,16 +2639,6 @@ function PMA_SQP_format( break; case 'INSERT': case 'REPLACE': - if ($docu) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'], - false, - '', - true - ); - $after = '' . $after; - } if (!$in_priv_list) { $space_punct_listsep = $html_line_break; $space_alpha_reserved_word = $html_line_break; @@ -2813,96 +2649,14 @@ function PMA_SQP_format( $space_alpha_reserved_word = $html_line_break; break; case 'SELECT': - if ($docu) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - 'SELECT', - false, - '', - true - ); - $after = '' . $after; - } $space_punct_listsep = ' '; $space_alpha_reserved_word = $html_line_break; break; case 'CALL': case 'DO': case 'HANDLER': - if ($docu) { - $before .= PMA_Util::showMySQLDocu( - 'SQL-Syntax', - $arr[$i]['data'], - false, - '', - true - ); - $after = '' . $after; - } break; default: - if ($close_docu_link - && in_array( - $arr[$i]['data'], - array('LIKE', 'NOT', 'IN', 'REGEXP', 'NULL') - ) - ) { - $after .= ''; - $close_docu_link = false; - } else if ($docu - && isset($PMA_SQPdata_functions_docs[$arr[$i]['data']]) - ) { - /* Handle multi word statements first */ - if (isset($typearr[4]) - && $typearr[4] == 'alpha_reservedWord' - && $typearr[3] == 'alpha_reservedWord' - && isset($PMA_SQPdata_functions_docs[strtoupper( - $arr[$i]['data'] . '_' - . $arr[$i + 1]['data'] . '_' - . $arr[$i + 2]['data'] - )]) - ) { - $tempname = strtoupper( - $arr[$i]['data'] . '_' - . $arr[$i + 1]['data'] . '_' - . $arr[$i + 2]['data'] - ); - $before .= PMA_Util::showMySQLDocu( - 'functions', - $PMA_SQPdata_functions_docs[$tempname]['link'], - false, - $PMA_SQPdata_functions_docs[$tempname]['anchor'], - true - ); - $close_docu_link = true; - } else if (isset($typearr[3]) - && $typearr[3] == 'alpha_reservedWord' - && isset($PMA_SQPdata_functions_docs[strtoupper( - $arr[$i]['data'] . '_' . $arr[$i + 1]['data'] - )]) - ) { - $tempname = strtoupper( - $arr[$i]['data'] . '_' . $arr[$i + 1]['data'] - ); - $before .= PMA_Util::showMySQLDocu( - 'functions', - $PMA_SQPdata_functions_docs[$tempname]['link'], - false, - $PMA_SQPdata_functions_docs[$tempname]['anchor'], - true - ); - $close_docu_link = true; - } else { - $before .= PMA_Util::showMySQLDocu( - 'functions', - $PMA_SQPdata_functions_docs[$arr[$i]['data']]['link'], - false, - $PMA_SQPdata_functions_docs[$arr[$i]['data']]['anchor'], - true - ); - $after .= ''; - } - } break; } // end switch ($arr[$i]['data']) @@ -2983,11 +2737,6 @@ function PMA_SQP_format( $indent--; $str .= ($mode != 'query_only' ? '' : ' '); } - /* End possibly unclosed documentation link */ - if ($close_docu_link) { - $str .= ''; - $close_docu_link = false; - } if ($mode!='query_only') { // close inner_sql span $str .= ''; From 959644445d84189d3b58f343c3635634c473ca58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:04:00 +0200 Subject: [PATCH 020/141] PMA_Util::formatSql now requires unparsed query as well In most cases we just need to output it as is, formatting is done in javascript. --- libraries/Util.class.php | 2 +- tbl_tracking.php | 4 ++-- test/libraries/common/PMA_formatSql_test.php | 17 +---------------- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index b7e8297b0d..b0b04693c6 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -396,7 +396,7 @@ class PMA_Util * @access public * @todo move into PMA_Sql */ - public static function formatSql($parsed_sql, $unparsed_sql = '') + public static function formatSql($parsed_sql, $unparsed_sql) { global $cfg; diff --git a/tbl_tracking.php b/tbl_tracking.php index 27304f6ec4..81b82b4997 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -568,7 +568,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] ) . '[...]'; } else { - $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement'])); + $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement']), $entry['statement']); } $timestamp = strtotime($entry['date']); @@ -635,7 +635,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] ) . '[...]'; } else { - $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement'])); + $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement']), $entry['statement']); } $timestamp = strtotime($entry['date']); diff --git a/test/libraries/common/PMA_formatSql_test.php b/test/libraries/common/PMA_formatSql_test.php index c385ddcc0a..43fb2b8d77 100644 --- a/test/libraries/common/PMA_formatSql_test.php +++ b/test/libraries/common/PMA_formatSql_test.php @@ -303,11 +303,6 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) ); - - $expected = "SELECT 1;"; - $this->assertEquals( - $expected, PMA_Util::formatSql($sql) - ); } function testFormatSQLfmTypeNone_2() @@ -358,11 +353,6 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) ); - - $expected = "SELECT * from `tTable`;"; - $this->assertEquals( - $expected, PMA_Util::formatSql($sql) - ); } function testFormatSQLfmTypeNone_3() @@ -500,11 +490,6 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $this->assertEquals( $expected, PMA_Util::formatSql($sql, $unparsed) ); - - $expected = 'SELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;'; - $this->assertEquals( - $expected, PMA_Util::formatSql($sql) - ); } function testFormatSQLError() @@ -514,7 +499,7 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $sql = array("raw" => "& \" < >"); $this->assertEquals( "& " < >", - PMA_Util::formatSql($sql) + PMA_Util::formatSql($sql, "& \" < >") ); $SQP_errorString = false; } From 10fff3082ff61f1548a6a98486081dc75d0be0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:06:45 +0200 Subject: [PATCH 021/141] Simplify PMA_Util::formatSql function We no longer need to use parsed query, it's anyway done in javascript. --- libraries/Util.class.php | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index b0b04693c6..3a3037cfa5 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -385,8 +385,8 @@ class PMA_Util /** * format sql strings * - * @param mixed $parsed_sql pre-parsed SQL structure - * @param string $unparsed_sql raw SQL string + * @param mixed $parsed_sql pre-parsed SQL structure + * @param string $sql_query raw SQL string * * @return string the formatted sql * @@ -396,7 +396,7 @@ class PMA_Util * @access public * @todo move into PMA_Sql */ - public static function formatSql($parsed_sql, $unparsed_sql) + public static function formatSql($parsed_sql, $sql_query) { global $cfg; @@ -404,36 +404,19 @@ class PMA_Util // well, not quite // first check for the SQL parser having hit an error if (PMA_SQP_isError()) { - return htmlspecialchars($parsed_sql['raw']); - } - // then check for an array - if (! is_array($parsed_sql)) { - // We don't so just return the input directly - // This is intended to be used for when the SQL Parser is turned off - $formatted_sql = "
\n";
-            if (($cfg['SQP']['fmtType'] == 'none') && ($unparsed_sql != '')) {
-                $formatted_sql .= $unparsed_sql;
-            } else {
-                $formatted_sql .= $parsed_sql;
-            }
-            $formatted_sql .= "\n
"; - return $formatted_sql; + return htmlspecialchars($sql_query); } $formatted_sql = ''; switch ($cfg['SQP']['fmtType']) { case 'none': - if ($unparsed_sql != '') { - $formatted_sql = '
' . "\n"
-                    . PMA_SQP_formatNone(array('raw' => $unparsed_sql)) . "\n"
-                    . '
'; - } else { - $formatted_sql = PMA_SQP_formatNone($parsed_sql); - } + $formatted_sql = '
' . "\n"
+                . htmlspecialchars($sql_query) . "\n"
+                . '
'; break; case 'text': - $formatted_sql = PMA_SQP_format($parsed_sql, 'text'); + $formatted_sql = htmlspecialchars($sql_query) . "\n"; break; default: break; From a6a1e2d57195c6b9220b6fd19e43d463963c5210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:18:16 +0200 Subject: [PATCH 022/141] Drop formatting choices here They do not have any effect with CodeMirror highlighting anyway, this configuration has to be passed to javascript and handled there. --- libraries/Util.class.php | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 3a3037cfa5..fbfbad5b5a 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -407,22 +407,9 @@ class PMA_Util return htmlspecialchars($sql_query); } - $formatted_sql = ''; - - switch ($cfg['SQP']['fmtType']) { - case 'none': - $formatted_sql = '
' . "\n"
-                . htmlspecialchars($sql_query) . "\n"
-                . '
'; - break; - case 'text': - $formatted_sql = htmlspecialchars($sql_query) . "\n"; - break; - default: - break; - } // end switch - - return $formatted_sql; + return '
' . "\n"
+            . htmlspecialchars($sql_query) . "\n"
+            . '
'; } // end of the "formatSql()" function /** From 99af0cbc7e3f4460072bf5f6a84c7d8d2d7fc2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:19:06 +0200 Subject: [PATCH 023/141] Remove unused parameter from PMA_Util::formatSql We no longer need parsed SQL here. --- libraries/DisplayResults.class.php | 5 +- libraries/Util.class.php | 11 +- tbl_tracking.php | 4 +- test/libraries/common/PMA_formatSql_test.php | 381 +------------------ 4 files changed, 14 insertions(+), 387 deletions(-) diff --git a/libraries/DisplayResults.class.php b/libraries/DisplayResults.class.php index b5685337ee..657ccf2255 100644 --- a/libraries/DisplayResults.class.php +++ b/libraries/DisplayResults.class.php @@ -2789,10 +2789,7 @@ class PMA_DisplayResults && (trim($row[$i]) != '') ) { - $parsed_sql = PMA_SQP_parse($row[$i]); - $row[$i] = PMA_Util::formatSql( - $parsed_sql, $row[$i] - ); + $row[$i] = PMA_Util::formatSql($row[$i]); include_once $this->syntax_highlighting_column_info[strtolower($this->__get('db'))][strtolower($this->__get('table'))][strtolower($meta->name)][0]; $transformation_plugin = new $this->syntax_highlighting_column_info [strtolower($this->__get('db'))] diff --git a/libraries/Util.class.php b/libraries/Util.class.php index fbfbad5b5a..55b8369460 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -385,7 +385,6 @@ class PMA_Util /** * format sql strings * - * @param mixed $parsed_sql pre-parsed SQL structure * @param string $sql_query raw SQL string * * @return string the formatted sql @@ -396,7 +395,7 @@ class PMA_Util * @access public * @todo move into PMA_Sql */ - public static function formatSql($parsed_sql, $sql_query) + public static function formatSql($sql_query) { global $cfg; @@ -649,9 +648,7 @@ class PMA_Util ) . '[...]'; } else { - $formatted_sql = self::formatSql( - PMA_SQP_parse($the_query), $the_query - ); + $formatted_sql = self::formatSql($the_query); } } // --- @@ -1169,8 +1166,8 @@ class PMA_Util __('Failed to connect to SQL validator!') )->getDisplay(); } - } elseif (isset($parsed_sql)) { - $query_base = self::formatSql($parsed_sql, $query_base); + } elseif (isset($query_base)) { + $query_base = self::formatSql($query_base); } // Prepares links that may be displayed to edit/explain the query diff --git a/tbl_tracking.php b/tbl_tracking.php index 81b82b4997..dcec6bbb43 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -568,7 +568,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] ) . '[...]'; } else { - $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement']), $entry['statement']); + $statement = PMA_Util::formatSql($entry['statement']); } $timestamp = strtotime($entry['date']); @@ -635,7 +635,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] ) . '[...]'; } else { - $statement = PMA_Util::formatSql(PMA_SQP_parse($entry['statement']), $entry['statement']); + $statement = PMA_Util::formatSql($entry['statement']); } $timestamp = strtotime($entry['date']); diff --git a/test/libraries/common/PMA_formatSql_test.php b/test/libraries/common/PMA_formatSql_test.php index 43fb2b8d77..12c62dfc1f 100644 --- a/test/libraries/common/PMA_formatSql_test.php +++ b/test/libraries/common/PMA_formatSql_test.php @@ -49,35 +49,11 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase global $cfg; $cfg['SQP']['fmtType'] = 'text'; $cfg['MySQLManualType'] = 'none'; - - $sql = array ( - 'raw' => 'SELECT 1;', - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'digit_integer', - 'data' => '1', - 'pos' => 8, - ), - 2 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 3, - ); $unparsed = "SELECT 1;"; $expected = 'SELECT 1 ;

'; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -88,46 +64,10 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $cfg['MySQLManualType'] = 'none'; $unparsed = "SELECT * from `tTable`;"; - $sql = array ( - 'raw' => $unparsed, - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'punct', - 'data' => '*', - 'pos' => 0, - ), - 2 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'from', - 'pos' => 13, - 'forbidden' => true, - ), - 3 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable`', - 'pos' => 0, - ), - 4 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 5, - ); $expected = 'SELECT *
FROM `tTable` ;

'; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -138,133 +78,10 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $cfg['MySQLManualType'] = 'none'; $unparsed = 'SELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;'; - $sql = array ( - 'raw' => $unparsed, - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'punct', - 'data' => '*', - 'pos' => 0, - ), - 2 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'FROM', - 'pos' => 13, - 'forbidden' => true, - ), - 3 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable_A`', - 'pos' => 0, - ), - 4 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'A', - 'pos' => 26, - 'forbidden' => false, - ), - 5 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'INNER', - 'pos' => 32, - 'forbidden' => true, - ), - 6 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'JOIN', - 'pos' => 37, - 'forbidden' => true, - ), - 7 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable_B`', - 'pos' => 0, - ), - 8 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'B', - 'pos' => 50, - 'forbidden' => false, - ), - 9 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'ON', - 'pos' => 53, - 'forbidden' => true, - ), - 10 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'B', - 'pos' => 55, - 'forbidden' => false, - ), - 11 => - array ( - 'type' => 'punct_qualifier', - 'data' => '.', - 'pos' => 0, - ), - 12 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'ID', - 'pos' => 58, - 'forbidden' => false, - ), - 13 => - array ( - 'type' => 'punct', - 'data' => '=', - 'pos' => 0, - ), - 14 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'A', - 'pos' => 62, - 'forbidden' => false, - ), - 15 => - array ( - 'type' => 'punct_qualifier', - 'data' => '.', - 'pos' => 0, - ), - 16 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'ID', - 'pos' => 65, - 'forbidden' => false, - ), - 17 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 18, - ); $expected = 'SELECT *
FROM `tTable_A` A
INNER JOIN `tTable_B` B ON B.ID = A.ID;

'; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -274,34 +91,11 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $cfg['SQP']['fmtType'] = 'none'; $cfg['MySQLManualType'] = 'none'; - $sql = array ( - 'raw' => 'SELECT 1;', - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'digit_integer', - 'data' => '1', - 'pos' => 8, - ), - 2 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 3, - ); $unparsed = "SELECT 1;"; $expected = "
\nSELECT 1;\n
"; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -312,46 +106,9 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $cfg['MySQLManualType'] = 'none'; $unparsed = "SELECT * from `tTable`;"; - $sql = array ( - 'raw' => $unparsed, - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'punct', - 'data' => '*', - 'pos' => 0, - ), - 2 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'from', - 'pos' => 13, - 'forbidden' => true, - ), - 3 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable`', - 'pos' => 0, - ), - 4 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 5, - ); - $expected = "
\nSELECT * from `tTable`;\n
"; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -362,133 +119,10 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase $cfg['MySQLManualType'] = 'none'; $unparsed = 'SELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;'; - $sql = array ( - 'raw' => $unparsed, - 0 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'SELECT', - 'pos' => 6, - 'forbidden' => true, - ), - 1 => - array ( - 'type' => 'punct', - 'data' => '*', - 'pos' => 0, - ), - 2 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'FROM', - 'pos' => 13, - 'forbidden' => true, - ), - 3 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable_A`', - 'pos' => 0, - ), - 4 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'A', - 'pos' => 26, - 'forbidden' => false, - ), - 5 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'INNER', - 'pos' => 32, - 'forbidden' => true, - ), - 6 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'JOIN', - 'pos' => 37, - 'forbidden' => true, - ), - 7 => - array ( - 'type' => 'quote_backtick', - 'data' => '`tTable_B`', - 'pos' => 0, - ), - 8 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'B', - 'pos' => 50, - 'forbidden' => false, - ), - 9 => - array ( - 'type' => 'alpha_reservedWord', - 'data' => 'ON', - 'pos' => 53, - 'forbidden' => true, - ), - 10 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'B', - 'pos' => 55, - 'forbidden' => false, - ), - 11 => - array ( - 'type' => 'punct_qualifier', - 'data' => '.', - 'pos' => 0, - ), - 12 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'ID', - 'pos' => 58, - 'forbidden' => false, - ), - 13 => - array ( - 'type' => 'punct', - 'data' => '=', - 'pos' => 0, - ), - 14 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'A', - 'pos' => 62, - 'forbidden' => false, - ), - 15 => - array ( - 'type' => 'punct_qualifier', - 'data' => '.', - 'pos' => 0, - ), - 16 => - array ( - 'type' => 'alpha_identifier', - 'data' => 'ID', - 'pos' => 65, - 'forbidden' => false, - ), - 17 => - array ( - 'type' => 'punct_queryend', - 'data' => ';', - 'pos' => 0, - ), - 'len' => 18, - ); $expected = "
\nSELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;\n
"; $this->assertEquals( - $expected, PMA_Util::formatSql($sql, $unparsed) + $expected, PMA_Util::formatSql($unparsed) ); } @@ -496,10 +130,9 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase { global $SQP_errorString; $SQP_errorString = true; - $sql = array("raw" => "& \" < >"); $this->assertEquals( "& " < >", - PMA_Util::formatSql($sql, "& \" < >") + PMA_Util::formatSql("& \" < >") ); $SQP_errorString = false; } From a9bce21ba9a8662fc04f31a50f6c9470d32a0850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:19:52 +0200 Subject: [PATCH 024/141] No need to check for parser error as we do not highlight the query anyway --- libraries/Util.class.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 55b8369460..6e2235c44e 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -397,15 +397,6 @@ class PMA_Util */ public static function formatSql($sql_query) { - global $cfg; - - // Check that we actually have a valid set of parsed data - // well, not quite - // first check for the SQL parser having hit an error - if (PMA_SQP_isError()) { - return htmlspecialchars($sql_query); - } - return '
' . "\n"
             . htmlspecialchars($sql_query) . "\n"
             . '
'; From cb413506a667f3d1cec8c06dc03c789425b62a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:21:50 +0200 Subject: [PATCH 025/141] As PMA_Util::formatSql is now trivial, the test can be as well --- test/libraries/common/PMA_formatSql_test.php | 121 +------------------ 1 file changed, 5 insertions(+), 116 deletions(-) diff --git a/test/libraries/common/PMA_formatSql_test.php b/test/libraries/common/PMA_formatSql_test.php index 12c62dfc1f..504f5b9c74 100644 --- a/test/libraries/common/PMA_formatSql_test.php +++ b/test/libraries/common/PMA_formatSql_test.php @@ -15,125 +15,14 @@ require_once 'libraries/sqlparser.lib.php'; class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase { - - /** - * temporary variable for globals array - */ - protected $tmpCfg; - - /** - * temporary variable for session array - */ - protected $tmpSession; - - /** - * storing globals and session - */ - public function setUp() + function testFormatSQLfmTypeText() { - global $cfg; - $this->tmpCfg = $cfg; - } - - /** - * recovering globals and session - */ - public function tearDown() - { - global $cfg; - $cfg = $this->tmpCfg; - } - - function testFormatSQLfmTypeText_1() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'text'; - $cfg['MySQLManualType'] = 'none'; - $unparsed = "SELECT 1;"; - $expected = 'SELECT 1 ;

'; $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) + '
' . "\n"
+            . 'SELECT 1 < 2' . "\n"
+            . '
', + PMA_Util::formatSql('SELECT 1 < 2') ); } - - function testFormatSQLfmTypeText_2() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'text'; - $cfg['MySQLManualType'] = 'none'; - - $unparsed = "SELECT * from `tTable`;"; - $expected = 'SELECT *
FROM `tTable` ;

'; - - $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) - ); - } - - function testFormatSQLfmTypeText_3() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'text'; - $cfg['MySQLManualType'] = 'none'; - - $unparsed = 'SELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;'; - $expected = 'SELECT *
FROM `tTable_A` A
INNER JOIN `tTable_B` B ON B.ID = A.ID;

'; - - $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) - ); - } - - function testFormatSQLfmTypeNone_1() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'none'; - $cfg['MySQLManualType'] = 'none'; - - $unparsed = "SELECT 1;"; - - $expected = "
\nSELECT 1;\n
"; - $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) - ); - } - - function testFormatSQLfmTypeNone_2() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'none'; - $cfg['MySQLManualType'] = 'none'; - - $unparsed = "SELECT * from `tTable`;"; - $expected = "
\nSELECT * from `tTable`;\n
"; - $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) - ); - } - - function testFormatSQLfmTypeNone_3() - { - global $cfg; - $cfg['SQP']['fmtType'] = 'none'; - $cfg['MySQLManualType'] = 'none'; - - $unparsed = 'SELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;'; - - $expected = "
\nSELECT * FROM `tTable_A` A INNER JOIN `tTable_B` B ON B.ID = A.ID;\n
"; - $this->assertEquals( - $expected, PMA_Util::formatSql($unparsed) - ); - } - - function testFormatSQLError() - { - global $SQP_errorString; - $SQP_errorString = true; - $this->assertEquals( - "& " < >", - PMA_Util::formatSql("& \" < >") - ); - $SQP_errorString = false; - } } From 32b33a9e26f99ff7a857c848c947f0a8eb984c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:29:27 +0200 Subject: [PATCH 026/141] Incorporate truncating into PMA_Util::formatSql It is used quite often as well. --- libraries/Util.class.php | 16 +++++++++++++--- test/libraries/common/PMA_formatSql_test.php | 14 +++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 6e2235c44e..69fd6e45cb 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -385,18 +385,28 @@ class PMA_Util /** * format sql strings * - * @param string $sql_query raw SQL string + * @param string $sql_query raw SQL string + * @param boolean $truncate truncate the query if it is too long * * @return string the formatted sql * * @global array the configuration array - * @global boolean whether the current statement is a multiple one or not * * @access public * @todo move into PMA_Sql */ - public static function formatSql($sql_query) + public static function formatSql($sql_query, $truncate=False) { + global $cfg; + if ($truncate + && strlen($sql_query) > $cfg['MaxCharactersInDisplayedSQL'] + ) { + $sql_query = $GLOBALS['PMA_String']->substr( + $sql_query, + 0, + $cfg['MaxCharactersInDisplayedSQL'] + ) . '[...]'; + } return '
' . "\n"
             . htmlspecialchars($sql_query) . "\n"
             . '
'; diff --git a/test/libraries/common/PMA_formatSql_test.php b/test/libraries/common/PMA_formatSql_test.php index 504f5b9c74..b9befacd5c 100644 --- a/test/libraries/common/PMA_formatSql_test.php +++ b/test/libraries/common/PMA_formatSql_test.php @@ -15,7 +15,7 @@ require_once 'libraries/sqlparser.lib.php'; class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase { - function testFormatSQLfmTypeText() + function testFormatSQL() { $this->assertEquals( @@ -25,4 +25,16 @@ class PMA_FormatSql_Test extends PHPUnit_Framework_TestCase PMA_Util::formatSql('SELECT 1 < 2') ); } + + function testFormatSQLTruncate() + { + $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 6; + + $this->assertEquals( + '
' . "\n"
+            . 'SELECT[...]' . "\n"
+            . '
', + PMA_Util::formatSql('SELECT 1 < 2', true) + ); + } } From 2711010c058cf1d1c3afebac6f6c66f980678d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 12:30:19 +0200 Subject: [PATCH 027/141] Use new truncating code --- libraries/Util.class.php | 12 +----------- tbl_tracking.php | 20 ++------------------ 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 69fd6e45cb..290ea49299 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -640,17 +640,7 @@ class PMA_Util } elseif (empty($the_query) || (trim($the_query) == '')) { $formatted_sql = ''; } else { - if (strlen($the_query) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) { - $formatted_sql = htmlspecialchars( - substr( - $the_query, 0, - $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] - ) - ) - . '[...]'; - } else { - $formatted_sql = self::formatSql($the_query); - } + $formatted_sql = self::formatSql($the_query, true); } // --- $error_msg .= "\n" . '' . "\n"; diff --git a/tbl_tracking.php b/tbl_tracking.php index dcec6bbb43..6efd3a5b96 100644 --- a/tbl_tracking.php +++ b/tbl_tracking.php @@ -561,15 +561,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $style = 'odd'; foreach ($data['ddlog'] as $entry) { - if (strlen($entry['statement']) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) { - $statement = substr( - $entry['statement'], - 0, - $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] - ) . '[...]'; - } else { - $statement = PMA_Util::formatSql($entry['statement']); - } + $statement = PMA_Util::formatSql($entry['statement'], true); $timestamp = strtotime($entry['date']); if ($timestamp >= $filter_ts_from @@ -628,15 +620,7 @@ if (isset($_REQUEST['report']) || isset($_REQUEST['report_export'])) { $style = 'odd'; foreach ($data['dmlog'] as $entry) { - if (strlen($entry['statement']) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) { - $statement = substr( - $entry['statement'], - 0, - $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] - ) . '[...]'; - } else { - $statement = PMA_Util::formatSql($entry['statement']); - } + $statement = PMA_Util::formatSql($entry['statement'], true); $timestamp = strtotime($entry['date']); if ($timestamp >= $filter_ts_from From 3af16f504adce8d80f7a21c146ba30abe5e0ecdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:20:16 +0200 Subject: [PATCH 028/141] Remove no longer used SQP CSS rules --- libraries/Theme.class.php | 57 --------------------------------------- 1 file changed, 57 deletions(-) diff --git a/libraries/Theme.class.php b/libraries/Theme.class.php index 9f2f640e6e..8b34182877 100644 --- a/libraries/Theme.class.php +++ b/libraries/Theme.class.php @@ -333,61 +333,6 @@ class PMA_Theme } } - /** - * Builds a CSS rule used for html formatted SQL queries - * - * @param string $classname The class name - * @param string $property The property name - * @param string $value The property value - * - * @return string The CSS rule - * - * @access public - * - * @see PMA_SQP_buildCssData() - */ - public function buildSQPCssRule($classname, $property, $value) - { - $str = '.' . $classname . ' {'; - if ($value != '') { - $str .= $property . ': ' . $value . ';'; - } - $str .= '}' . "\n"; - - return $str; - } // end of the "PMA_SQP_buildCssRule()" function - - - /** - * Builds CSS rules used for html formatted SQL queries - * - * @return string The CSS rules set - * - * @access public - * - * @global array The current PMA configuration - * - * @see PMA_SQP_buildCssRule() - */ - public function buildSQPCssData() - { - global $cfg; - - $css_string = ''; - foreach ($cfg['SQP']['fmtColor'] as $key => $col) { - $css_string .= $this->buildSQPCssRule('syntax_' . $key, 'color', $col); - } - - for ($i = 0; $i < 8; $i++) { - $css_string .= $this->buildSQPCssRule( - 'syntax_indent' . $i, 'margin-left', - ($i * $cfg['SQP']['fmtInd']) . $cfg['SQP']['fmtIndUnit'] - ); - } - - return $css_string; - } // end of the "PMA_SQP_buildCssData()" function - /** * load css (send to stdout, normally the browser) * @@ -398,8 +343,6 @@ class PMA_Theme { $success = true; - echo $this->buildSQPCssData(); - if ($GLOBALS['text_dir'] === 'ltr') { $right = 'right'; $left = 'left'; From cc3645592fad0f185a797e559be5c8f431435417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:21:14 +0200 Subject: [PATCH 029/141] Drop no longer used config for SQP CSS --- doc/config.rst | 28 +--------------------------- libraries/config.default.php | 14 -------------- 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index e51decd71c..89d2ad9c1f 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -2693,6 +2693,7 @@ Default queries Default queries that will be displayed in query boxes when user didn't specify any. You can use standard :ref:`faq6_27`. +.. _cfg_SQP: SQL parser settings ------------------- @@ -2711,33 +2712,6 @@ SQL parser settings * ``'text'`` * ``'none'`` -.. _cfg_SQP: -.. config:option:: $cfg['SQP']['fmtInd'] - - :type: float - :default: ``'1'`` - -.. config:option:: $cfg['SQP']['fmtIndUnit'] - - :type: string - :default: ``'em'`` - - For the pretty-printing of :term:`SQL` queries, - under some cases the part of a query inside a bracket is indented. By - changing :config:option:`$cfg['SQP']['fmtInd']` you can change the amount - of this indent. - - Related in purpose is :config:option:`$cfg['SQP']['fmtIndUnit']` which - specifies the units of the indent amount that you specified. This is used - via stylesheets. - - You can use any HTML unit, for example: - - * ``'em'`` - * ``'ex'`` - * ``'pt'`` - * ``'px'`` - .. config:option:: $cfg['SQP']['fmtColor'] :type: array of string tuples diff --git a/libraries/config.default.php b/libraries/config.default.php index 335c932322..3ad4025240 100644 --- a/libraries/config.default.php +++ b/libraries/config.default.php @@ -2844,20 +2844,6 @@ $cfg['SQP'] = array(); */ $cfg['SQP']['fmtType'] = 'none'; -/** - * Amount to indent each level (floats are valid) - * - * @global integer $cfg['SQP']['fmtInd'] - */ -$cfg['SQP']['fmtInd'] = '1'; - -/** - * Units for indenting each level (CSS Types - {em, px, pt}) - * - * @global string $cfg['SQP']['fmtIndUnit'] - */ -$cfg['SQP']['fmtIndUnit'] = 'em'; - /******************************************************************************* * If you wish to use the SQL Validator service, you should be aware of the From 94855c2137bab6fe6e07f6fa5ed11ae1912229e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:25:39 +0200 Subject: [PATCH 030/141] Update CodeMirror to 3.15 --- js/codemirror/lib/codemirror.js | 788 +++++++++++++++---------- js/codemirror/mode/sql/sql.js | 112 +++- themes/pmahomme/css/codemirror.css.php | 10 + 3 files changed, 582 insertions(+), 328 deletions(-) diff --git a/js/codemirror/lib/codemirror.js b/js/codemirror/lib/codemirror.js index ffe015ce66..1d0d996310 100644 --- a/js/codemirror/lib/codemirror.js +++ b/js/codemirror/lib/codemirror.js @@ -1,4 +1,4 @@ -// CodeMirror version 3.13 +// CodeMirror version 3.15 // // CodeMirror is the only global var we claim window.CodeMirror = (function() { @@ -30,6 +30,7 @@ window.CodeMirror = (function() { var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/); if (opera_version) opera_version = Number(opera_version[1]); + if (opera_version && opera_version >= 15) { opera = false; webkit = true; } // Some browsers use the wrong event properties to signal cmd/ctrl on OS X var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11)); var captureMiddleClick = gecko || (ie && !ie_lt9); @@ -238,9 +239,10 @@ window.CodeMirror = (function() { } function keyMapChanged(cm) { - var style = keyMap[cm.options.keyMap].style; + var map = keyMap[cm.options.keyMap], style = map.style; cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + (style ? " cm-keymap-" + style : ""); + cm.state.disableInput = map.disableInput; } function themeChanged(cm) { @@ -325,8 +327,8 @@ window.CodeMirror = (function() { d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px"; var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); - var needsH = d.scroller.scrollWidth > d.scroller.clientWidth; - var needsV = scrollHeight > d.scroller.clientHeight; + var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1); + var needsV = scrollHeight > (d.scroller.clientHeight + 1); if (needsV) { d.scrollbarV.style.display = "block"; d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; @@ -402,11 +404,12 @@ window.CodeMirror = (function() { // DISPLAY DRAWING - function updateDisplay(cm, changes, viewPort) { + function updateDisplay(cm, changes, viewPort, forced) { var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated; var visible = visibleLines(cm.display, cm.doc, viewPort); for (;;) { - if (!updateDisplayInner(cm, changes, visible)) break; + if (!updateDisplayInner(cm, changes, visible, forced)) break; + forced = false; updated = true; updateSelection(cm); updateScrollbars(cm); @@ -432,7 +435,7 @@ window.CodeMirror = (function() { // Uses a set of changes plus the current scroll position to // determine which DOM updates have to be made, and makes the // updates. - function updateDisplayInner(cm, changes, visible) { + function updateDisplayInner(cm, changes, visible, forced) { var display = cm.display, doc = cm.doc; if (!display.wrapper.clientWidth) { display.showingFrom = display.showingTo = doc.first; @@ -441,7 +444,7 @@ window.CodeMirror = (function() { } // Bail out if the visible area is already rendered and nothing changed. - if (changes.length == 0 && + if (!forced && changes.length == 0 && visible.from > display.showingFrom && visible.to < display.showingTo) return; @@ -494,7 +497,7 @@ window.CodeMirror = (function() { if (range.from >= range.to) intact.splice(i--, 1); else intactLines += range.to - range.from; } - if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) { + if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) { updateViewOffset(cm); return; } @@ -513,10 +516,20 @@ window.CodeMirror = (function() { display.lastSizeC != display.wrapper.clientHeight; // This is just a bogus formula that detects when the editor is // resized or the font size changes. - if (different) display.lastSizeC = display.wrapper.clientHeight; + if (different) { + display.lastSizeC = display.wrapper.clientHeight; + startWorker(cm, 400); + } display.showingFrom = from; display.showingTo = to; - startWorker(cm, 100); + updateHeightsInViewport(cm); + updateViewOffset(cm); + + return true; + } + + function updateHeightsInViewport(cm) { + var display = cm.display; var prevBottom = display.lineDiv.offsetTop; for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { if (ie_lt8) { @@ -536,9 +549,6 @@ window.CodeMirror = (function() { widgets[i].height = widgets[i].node.offsetHeight; } } - updateViewOffset(cm); - - return true; } function updateViewOffset(cm) { @@ -604,8 +614,9 @@ window.CodeMirror = (function() { if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift(); if (lineIsHidden(cm.doc, line)) { if (line.height != 0) updateLineHeight(line, 0); - if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) - if (line.widgets[i].showIfHidden) { + if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i]; + if (w.showIfHidden) { var prev = cur.previousSibling; if (/pre/i.test(prev.nodeName)) { var wrap = elt("div", null, null, "position: relative"); @@ -613,9 +624,11 @@ window.CodeMirror = (function() { wrap.appendChild(prev); prev = wrap; } - var wnode = prev.appendChild(elt("div", [line.widgets[i].node], "CodeMirror-linewidget")); - positionLineWidget(line.widgets[i], wnode, prev, dims); + var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget")); + if (!w.handleMouseEvents) wnode.ignoreEvents = true; + positionLineWidget(w, wnode, prev, dims); } + } } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) { // This line is intact. Skip to the actual node. Update its // line number if needed. @@ -658,25 +671,25 @@ window.CodeMirror = (function() { if (reuse) { reuse.alignable = null; - var isOk = true, widgetsSeen = 0; + var isOk = true, widgetsSeen = 0, insertBefore = null; for (var n = reuse.firstChild, next; n; n = next) { next = n.nextSibling; if (!/\bCodeMirror-linewidget\b/.test(n.className)) { reuse.removeChild(n); } else { - for (var i = 0, first = true; i < line.widgets.length; ++i) { - var widget = line.widgets[i], isFirst = false; - if (!widget.above) { isFirst = first; first = false; } + for (var i = 0; i < line.widgets.length; ++i) { + var widget = line.widgets[i]; if (widget.node == n.firstChild) { + if (!widget.above && !insertBefore) insertBefore = n; positionLineWidget(widget, n, reuse, dims); ++widgetsSeen; - if (isFirst) reuse.insertBefore(lineElement, n); break; } } if (i == line.widgets.length) { isOk = false; break; } } } + reuse.insertBefore(lineElement, insertBefore); if (isOk && widgetsSeen == line.widgets.length) { wrap = reuse; reuse.className = line.wrapClass || ""; @@ -711,6 +724,7 @@ window.CodeMirror = (function() { if (ie_lt8) wrap.style.zIndex = 2; if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) { var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + if (!widget.handleMouseEvents) node.ignoreEvents = true; positionLineWidget(widget, node, wrap, dims); if (widget.above) wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); @@ -793,74 +807,59 @@ window.CodeMirror = (function() { "px; height: " + (bottom - top) + "px")); } - function drawForLine(line, fromArg, toArg, retTop) { + function drawForLine(line, fromArg, toArg) { var lineObj = getLine(doc, line); - var lineLen = lineObj.text.length, rVal = retTop ? Infinity : -Infinity; - function coords(ch) { - return charCoords(cm, Pos(line, ch), "div", lineObj); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias); } iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { - var leftPos = coords(from), rightPos, left, right; + var leftPos = coords(from, "left"), rightPos, left, right; if (from == to) { rightPos = leftPos; left = right = leftPos.left; } else { - rightPos = coords(to - 1); + rightPos = coords(to - 1, "right"); if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; } left = leftPos.left; right = rightPos.right; } + if (fromArg == null && from == 0) left = pl; if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part add(left, leftPos.top, null, leftPos.bottom); left = pl; if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); } if (toArg == null && to == lineLen) right = clientWidth; - if (fromArg == null && from == 0) left = pl; - rVal = retTop ? Math.min(rightPos.top, rVal) : Math.max(rightPos.bottom, rVal); + if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) + start = leftPos; + if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) + end = rightPos; if (left < pl + 1) left = pl; add(left, rightPos.top, right - left, rightPos.bottom); }); - return rVal; + return {start: start, end: end}; } if (sel.from.line == sel.to.line) { drawForLine(sel.from.line, sel.from.ch, sel.to.ch); } else { - var fromObj = getLine(doc, sel.from.line); - var cur = fromObj, merged, path = [sel.from.line, sel.from.ch], singleLine; - while (merged = collapsedSpanAtEnd(cur)) { - var found = merged.find(); - path.push(found.from.ch, found.to.line, found.to.ch); - if (found.to.line == sel.to.line) { - path.push(sel.to.ch); - singleLine = true; - break; + var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line); + var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine); + var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end; + var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(pl, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); } - cur = getLine(doc, found.to.line); - } - - // This is a single, merged line - if (singleLine) { - for (var i = 0; i < path.length; i += 3) - drawForLine(path[i], path[i+1], path[i+2]); - } else { - var middleTop, middleBot, toObj = getLine(doc, sel.to.line); - if (sel.from.ch) - // Draw the first line of selection. - middleTop = drawForLine(sel.from.line, sel.from.ch, null, false); - else - // Simply include it in the middle block. - middleTop = heightAtLine(cm, fromObj) - display.viewOffset; - - if (!sel.to.ch) - middleBot = heightAtLine(cm, toObj) - display.viewOffset; - else - middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true); - - if (middleTop < middleBot) add(pl, middleTop, null, middleBot); } + if (leftEnd.bottom < rightStart.top) + add(pl, leftEnd.bottom, null, rightStart.top); } removeChildrenAndAdd(display.selectionDiv, fragment); @@ -926,12 +925,12 @@ window.CodeMirror = (function() { // valid state. If that fails, it returns the line with the // smallest indentation, which tends to need the least context to // parse correctly. - function findStartLine(cm, n) { + function findStartLine(cm, n, precise) { var minindent, minline, doc = cm.doc; for (var search = n, lim = n - 100; search > lim; --search) { if (search <= doc.first) return doc.first; var line = getLine(doc, search - 1); - if (line.stateAfter) return search; + if (line.stateAfter && (!precise || search <= doc.frontier)) return search; var indented = countColumn(line.text, null, cm.options.tabSize); if (minline == null || minindent > indented) { minline = search - 1; @@ -941,10 +940,10 @@ window.CodeMirror = (function() { return minline; } - function getStateBefore(cm, n) { + function getStateBefore(cm, n, precise) { var doc = cm.doc, display = cm.display; if (!doc.mode.startState) return true; - var pos = findStartLine(cm, n), state = pos > doc.first && getLine(doc, pos-1).stateAfter; + var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter; if (!state) state = startState(doc.mode); else state = copyState(doc.mode, state); doc.iter(pos, n, function(line) { @@ -965,7 +964,7 @@ window.CodeMirror = (function() { return e.offsetLeft; } - function measureChar(cm, line, ch, data) { + function measureChar(cm, line, ch, data, bias) { var dir = -1; data = data || measureLine(cm, line); @@ -974,9 +973,13 @@ window.CodeMirror = (function() { if (r) break; if (dir < 0 && pos == 0) dir = 1; } + bias = pos > ch ? "left" : pos < ch ? "right" : bias; + if (bias == "left" && r.leftSide) r = r.leftSide; + else if (bias == "right" && r.rightSide) r = r.rightSide; return {left: pos < ch ? r.right : r.left, right: pos > ch ? r.left : r.right, - top: r.top, bottom: r.bottom}; + top: r.top, + bottom: r.bottom}; } function findCachedMeasurement(cm, line) { @@ -1013,7 +1016,7 @@ window.CodeMirror = (function() { function measureLineInner(cm, line) { var display = cm.display, measure = emptyArray(line.text.length); - var pre = lineContent(cm, line, measure); + var pre = lineContent(cm, line, measure, true); // IE does not cache element positions of inline elements between // calls to getBoundingClientRect. This makes the loop below, @@ -1049,30 +1052,51 @@ window.CodeMirror = (function() { if (ie_lt9 && display.measure.first != pre) removeChildrenAndAdd(display.measure, pre); - for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { - var size = getRect(cur); - var top = Math.max(0, size.top - outer.top), bot = Math.min(size.bottom - outer.top, maxBot); - for (var j = 0; j < vranges.length; j += 2) { - var rtop = vranges[j], rbot = vranges[j+1]; + function measureRect(rect) { + var top = rect.top - outer.top, bot = rect.bottom - outer.top; + if (bot > maxBot) bot = maxBot; + if (top < 0) top = 0; + for (var i = vranges.length - 2; i >= 0; i -= 2) { + var rtop = vranges[i], rbot = vranges[i+1]; if (rtop > bot || rbot < top) continue; if (rtop <= top && rbot >= bot || top <= rtop && bot >= rbot || Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { - vranges[j] = Math.min(top, rtop); - vranges[j+1] = Math.max(bot, rbot); + vranges[i] = Math.min(top, rtop); + vranges[i+1] = Math.max(bot, rbot); break; } } - if (j == vranges.length) vranges.push(top, bot); - var right = size.right; - if (cur.measureRight) right = getRect(cur.measureRight).left; - data[i] = {left: size.left - outer.left, right: right - outer.left, top: j}; + if (i < 0) { i = vranges.length; vranges.push(top, bot); } + return {left: rect.left - outer.left, + right: rect.right - outer.left, + top: i, bottom: null}; } - for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { - var vr = cur.top; - cur.top = vranges[vr]; cur.bottom = vranges[vr+1]; + function finishRect(rect) { + rect.bottom = vranges[rect.top+1]; + rect.top = vranges[rect.top]; } + for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { + var node = cur, rect = null; + // A widget might wrap, needs special care + if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) { + if (cur.firstChild.nodeType == 1) node = cur.firstChild; + var rects = node.getClientRects(); + if (rects.length > 1) { + rect = data[i] = measureRect(rects[0]); + rect.rightSide = measureRect(rects[rects.length - 1]); + } + } + if (!rect) rect = data[i] = measureRect(getRect(node)); + if (cur.measureRight) rect.right = getRect(cur.measureRight).left; + if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide)); + } + for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { + finishRect(cur); + if (cur.leftSide) finishRect(cur.leftSide); + if (cur.rightSide) finishRect(cur.rightSide); + } return data; } @@ -1083,9 +1107,9 @@ window.CodeMirror = (function() { if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true; } var cached = !hasBadSpan && findCachedMeasurement(cm, line); - if (cached) return measureChar(cm, line, line.text.length, cached.measure).right; + if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right; - var pre = lineContent(cm, line); + var pre = lineContent(cm, line, null, true); var end = pre.appendChild(zeroWidthElement(cm.display.measure)); removeChildrenAndAdd(cm.display.measure, pre); return getRect(end).right - getRect(cm.display.lineDiv).left; @@ -1098,6 +1122,9 @@ window.CodeMirror = (function() { cm.display.lineNumChars = null; } + function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; } + function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; } + // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" function intoCoordSystem(cm, lineObj, rect, context) { if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { @@ -1107,11 +1134,12 @@ window.CodeMirror = (function() { if (context == "line") return rect; if (!context) context = "local"; var yOff = heightAtLine(cm, lineObj); - if (context != "local") yOff -= cm.display.viewOffset; - if (context == "page") { + if (context == "local") yOff += paddingTop(cm.display); + else yOff -= cm.display.viewOffset; + if (context == "page" || context == "window") { var lOff = getRect(cm.display.lineSpace); - yOff += lOff.top + (window.pageYOffset || (document.documentElement || document.body).scrollTop); - var xOff = lOff.left + (window.pageXOffset || (document.documentElement || document.body).scrollLeft); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); rect.left += xOff; rect.right += xOff; } rect.top += yOff; rect.bottom += yOff; @@ -1123,31 +1151,30 @@ window.CodeMirror = (function() { function fromCoordSystem(cm, coords, context) { if (context == "div") return coords; var left = coords.left, top = coords.top; + // First move into "page" coordinate system if (context == "page") { - left -= window.pageXOffset || (document.documentElement || document.body).scrollLeft; - top -= window.pageYOffset || (document.documentElement || document.body).scrollTop; + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = getRect(cm.display.sizer); + left += localBox.left; + top += localBox.top; } + var lineSpaceBox = getRect(cm.display.lineSpace); - left -= lineSpaceBox.left; - top -= lineSpaceBox.top; - if (context == "local" || !context) { - var editorBox = getRect(cm.display.wrapper); - left += editorBox.left; - top += editorBox.top; - } - return {left: left, top: top}; + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}; } - function charCoords(cm, pos, context, lineObj) { + function charCoords(cm, pos, context, lineObj, bias) { if (!lineObj) lineObj = getLine(cm.doc, pos.line); - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context); + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context); } function cursorCoords(cm, pos, context, lineObj, measurement) { lineObj = lineObj || getLine(cm.doc, pos.line); if (!measurement) measurement = measureLine(cm, lineObj); function get(ch, right) { - var m = measureChar(cm, lineObj, ch, measurement); + var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left"); if (right) m.left = m.right; else m.right = m.left; return intoCoordSystem(cm, lineObj, m, context); } @@ -1173,8 +1200,9 @@ window.CodeMirror = (function() { return val; } - function PosMaybeOutside(line, ch, outside) { + function PosWithInfo(line, ch, outside, xRel) { var pos = new Pos(line, ch); + pos.xRel = xRel; if (outside) pos.outside = true; return pos; } @@ -1183,10 +1211,10 @@ window.CodeMirror = (function() { function coordsChar(cm, x, y) { var doc = cm.doc; y += cm.display.viewOffset; - if (y < 0) return PosMaybeOutside(doc.first, 0, true); + if (y < 0) return PosWithInfo(doc.first, 0, true, -1); var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1; if (lineNo > last) - return PosMaybeOutside(doc.first + doc.size - 1, getLine(doc, last).text.length, true); + return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1); if (x < 0) x = 0; for (;;) { @@ -1194,7 +1222,7 @@ window.CodeMirror = (function() { var found = coordsCharInner(cm, lineObj, lineNo, x, y); var merged = collapsedSpanAtEnd(lineObj); var mergedPos = merged && merged.find(); - if (merged && found.ch >= mergedPos.from.ch) + if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) lineNo = mergedPos.to.line; else return found; @@ -1220,14 +1248,15 @@ window.CodeMirror = (function() { var from = lineLeft(lineObj), to = lineRight(lineObj); var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; - if (x > toX) return PosMaybeOutside(lineNo, to, toOutside); + if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1); // Do a binary search between these bounds. for (;;) { if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { - var after = x - fromX < toX - x, ch = after ? from : to; + var ch = x < fromX || x - fromX <= toX - x ? from : to; + var xDiff = x - (ch == from ? fromX : toX); while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch; - var pos = PosMaybeOutside(lineNo, ch, after ? fromOutside : toOutside); - pos.after = after; + var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside, + xDiff < 0 ? -1 : xDiff ? 1 : 0); return pos; } var step = Math.ceil(dist / 2), middle = from + step; @@ -1284,6 +1313,7 @@ window.CodeMirror = (function() { // An array of ranges of lines that have to be updated. See // updateDisplay. changes: [], + forceUpdate: false, updateInput: null, userSelChange: null, textChanged: null, @@ -1316,8 +1346,8 @@ window.CodeMirror = (function() { var coords = cursorCoords(cm, doc.sel.head); newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); } - if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) { - updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop); + if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) { + updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate); if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop; } if (!updated && op.selectionChanged) updateSelection(cm); @@ -1413,7 +1443,7 @@ window.CodeMirror = (function() { // supported or compatible enough yet to rely on.) function readInput(cm) { var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel; - if (!cm.state.focused || hasSelection(input) || isReadOnly(cm)) return false; + if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false; var text = input.value; if (text == prevInput && posEq(sel.from, sel.to)) return false; if (ie && !ie_lt9 && cm.display.inputHasSelection === text) { @@ -1431,11 +1461,14 @@ window.CodeMirror = (function() { from = Pos(from.line, from.ch - (prevInput.length - same)); else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming) to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same))); - var updateInput = cm.curOp.updateInput; - makeChange(cm.doc, {from: from, to: to, text: splitLines(text.slice(same)), - origin: cm.state.pasteIncoming ? "paste" : "+input"}, "end"); + var updateInput = cm.curOp.updateInput; + var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)), + origin: cm.state.pasteIncoming ? "paste" : "+input"}; + makeChange(cm.doc, changeEvent, "end"); cm.curOp.updateInput = updateInput; + signalLater(cm, "inputRead", cm, changeEvent); + if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = ""; else cm.display.prevInput = text; if (withOp) endOperation(cm); @@ -1476,6 +1509,7 @@ window.CodeMirror = (function() { on(d.scroller, "mousedown", operation(cm, onMouseDown)); if (ie) on(d.scroller, "dblclick", operation(cm, function(e) { + if (signalDOMEvent(cm, e)) return; var pos = posFromMouse(cm, e); if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return; e_preventDefault(e); @@ -1483,7 +1517,7 @@ window.CodeMirror = (function() { extendSelection(cm.doc, word.from, word.to); })); else - on(d.scroller, "dblclick", e_preventDefault); + on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); }); on(d.lineSpace, "selectstart", function(e) { if (!eventInWidget(d, e)) e_preventDefault(e); }); @@ -1515,11 +1549,15 @@ window.CodeMirror = (function() { // Prevent wrapper from ever scrolling on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + var resizeTimer; function onResize() { - // Might be a text scaling operation, clear size caches. - d.cachedCharWidth = d.cachedTextHeight = null; - clearCaches(cm); - runInOp(cm, bind(regChange, cm)); + if (resizeTimer == null) resizeTimer = setTimeout(function() { + resizeTimer = null; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null; + clearCaches(cm); + runInOp(cm, bind(regChange, cm)); + }, 100); } on(window, "resize", onResize); // Above handler holds on to the editor and its data structures. @@ -1533,7 +1571,7 @@ window.CodeMirror = (function() { setTimeout(unregister, 5000); on(d.input, "keyup", operation(cm, function(e) { - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; if (e.keyCode == 16) cm.doc.sel.shift = false; })); on(d.input, "input", bind(fastPoll, cm)); @@ -1543,7 +1581,7 @@ window.CodeMirror = (function() { on(d.input, "blur", bind(onBlur, cm)); function drag_(e) { - if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; + if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; e_stop(e); } if (cm.options.dragDrop) { @@ -1582,9 +1620,7 @@ window.CodeMirror = (function() { function eventInWidget(display, e) { for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n) return true; - if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) || - n.parentNode == display.sizer && n != display.mover) return true; + if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true; } } @@ -1604,6 +1640,7 @@ window.CodeMirror = (function() { var lastClick, lastDoubleClick; function onMouseDown(e) { + if (signalDOMEvent(this, e)) return; var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel; sel.shift = e.shiftKey; @@ -1727,8 +1764,6 @@ window.CodeMirror = (function() { function done(e) { counter = Infinity; - var cur = posFromMouse(cm, e); - if (cur) doSelect(cur); e_preventDefault(e); focusInput(cm); off(document, "mousemove", move); @@ -1744,11 +1779,41 @@ window.CodeMirror = (function() { on(document, "mouseup", up); } + function clickInGutter(cm, e) { + var display = cm.display; + try { var mX = e.clientX, mY = e.clientY; } + catch(e) { return false; } + + if (mX >= Math.floor(getRect(display.gutters).right)) return false; + e_preventDefault(e); + if (!hasHandler(cm, "gutterClick")) return true; + + var lineBox = getRect(display.lineDiv); + if (mY > lineBox.bottom) return true; + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && getRect(g).right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.options.gutters[i]; + signalLater(cm, "gutterClick", cm, line, gutter, e); + break; + } + } + return true; + } + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + function onDrop(e) { var cm = this; - if (eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) return; e_preventDefault(e); + if (ie) lastDrop = +new Date; var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; if (!pos || isReadOnly(cm)) return; if (files && files.length && window.FileReader && window.File) { @@ -1788,41 +1853,16 @@ window.CodeMirror = (function() { } } - function clickInGutter(cm, e) { - var display = cm.display; - try { var mX = e.clientX, mY = e.clientY; } - catch(e) { return false; } - - if (mX >= Math.floor(getRect(display.gutters).right)) return false; - e_preventDefault(e); - if (!hasHandler(cm, "gutterClick")) return true; - - var lineBox = getRect(display.lineDiv); - if (mY > lineBox.bottom) return true; - mY -= lineBox.top - display.viewOffset; - - for (var i = 0; i < cm.options.gutters.length; ++i) { - var g = display.gutters.childNodes[i]; - if (g && getRect(g).right >= mX) { - var line = lineAtHeight(cm.doc, mY); - var gutter = cm.options.gutters[i]; - signalLater(cm, "gutterClick", cm, line, gutter, e); - break; - } - } - return true; - } - function onDragStart(cm, e) { - if (ie && !cm.state.draggingText) { e_stop(e); return; } - if (eventInWidget(cm.display, e)) return; + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return; var txt = cm.getSelection(); e.dataTransfer.setData("Text", txt); // Use dummy image instead of default browsers image. // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. - if (e.dataTransfer.setDragImage) { + if (e.dataTransfer.setDragImage && !safari) { var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); if (opera) { img.width = img.height = 1; @@ -1830,15 +1870,6 @@ window.CodeMirror = (function() { // Force a relayout, or Opera won't use our image for some obscure reason img._top = img.offsetTop; } - if (safari) { - if (cm.display.dragImg) { - img = cm.display.dragImg; - } else { - cm.display.dragImg = img; - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - cm.display.wrapper.appendChild(img); - } - } e.dataTransfer.setDragImage(img, 0, 0); if (opera) img.parentNode.removeChild(img); } @@ -1851,6 +1882,7 @@ window.CodeMirror = (function() { if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; if (gecko) updateDisplay(cm, []); + startWorker(cm, 100); } function setScrollLeft(cm, val, isScroller) { if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; @@ -1983,8 +2015,10 @@ window.CodeMirror = (function() { var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; clearTimeout(maybeTransition); if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { - if (getKeyMap(cm.options.keyMap) == startMap) + if (getKeyMap(cm.options.keyMap) == startMap) { cm.options.keyMap = (next.call ? next.call(null, cm) : next); + keyMapChanged(cm); + } }, 50); var name = keyName(e, true), handled = false; @@ -1997,17 +2031,18 @@ window.CodeMirror = (function() { // 'go') bound to the keyname without 'Shift-'. handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);}) || lookupKey(name, keymaps, function(b) { - if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(cm, b); + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + return doHandleBinding(cm, b); }); } else { handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); }); } - if (handled == "stop") handled = false; if (handled) { e_preventDefault(e); restartBlink(cm); if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } + signalLater(cm, "keyHandled", cm, name, e); } return handled; } @@ -2018,6 +2053,7 @@ window.CodeMirror = (function() { if (handled) { e_preventDefault(e); restartBlink(cm); + signalLater(cm, "keyHandled", cm, "'" + ch + "'", e); } return handled; } @@ -2027,7 +2063,7 @@ window.CodeMirror = (function() { var cm = this; if (!cm.state.focused) onFocus(cm); if (ie && e.keyCode == 27) { e.returnValue = false; } - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; var code = e.keyCode; // IE does strange things with escape. cm.doc.sel.shift = code == 16 || e.shiftKey; @@ -2043,7 +2079,7 @@ window.CodeMirror = (function() { function onKeyPress(e) { var cm = this; - if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; var keyCode = e.keyCode, charCode = e.charCode; if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; @@ -2081,6 +2117,7 @@ window.CodeMirror = (function() { var detectingSelectAll; function onContextMenu(cm, e) { + if (signalDOMEvent(cm, e, "contextmenu")) return; var display = cm.display, sel = cm.doc.sel; if (eventInWidget(display, e)) return; @@ -2141,11 +2178,11 @@ window.CodeMirror = (function() { // UPDATING - function changeEnd(change) { + var changeEnd = CodeMirror.changeEnd = function(change) { if (!change.text) return change.to; return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); - } + }; // Make sure a position will be valid after the given change. function clipPostChange(doc, change, pos) { @@ -2187,21 +2224,21 @@ window.CodeMirror = (function() { return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)}; } - function filterChange(doc, change) { + function filterChange(doc, change, update) { var obj = { canceled: false, from: change.from, to: change.to, text: change.text, origin: change.origin, - update: function(from, to, text, origin) { - if (from) this.from = clipPos(doc, from); - if (to) this.to = clipPos(doc, to); - if (text) this.text = text; - if (origin !== undefined) this.origin = origin; - }, cancel: function() { this.canceled = true; } }; + if (update) obj.update = function(from, to, text, origin) { + if (from) this.from = clipPos(doc, from); + if (to) this.to = clipPos(doc, to); + if (text) this.text = text; + if (origin !== undefined) this.origin = origin; + }; signal(doc, "beforeChange", doc, obj); if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); @@ -2218,7 +2255,7 @@ window.CodeMirror = (function() { } if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change); + change = filterChange(doc, change, true); if (!change) return; } @@ -2257,15 +2294,23 @@ window.CodeMirror = (function() { var hist = doc.history; var event = (type == "undo" ? hist.done : hist.undone).pop(); if (!event) return; - hist.dirtyCounter += type == "undo" ? -1 : 1; var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter, - anchorAfter: event.anchorBefore, headAfter: event.headBefore}; + anchorAfter: event.anchorBefore, headAfter: event.headBefore, + generation: hist.generation}; (type == "undo" ? hist.undone : hist.done).push(anti); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); for (var i = event.changes.length - 1; i >= 0; --i) { var change = event.changes[i]; change.origin = type; + if (filter && !filterChange(doc, change, false)) { + (type == "undo" ? hist.done : hist.undone).length = 0; + return; + } + anti.changes.push(historyChangeFromChange(doc, change)); var after = i ? computeSelAfterChange(doc, change, null) @@ -2529,9 +2574,9 @@ window.CodeMirror = (function() { function scrollCursorIntoView(cm) { var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin); if (!cm.state.focused) return; - var display = cm.display, box = getRect(display.sizer), doScroll = null, pTop = paddingTop(cm.display); - if (coords.top + pTop + box.top < 0) doScroll = true; - else if (coords.bottom + pTop + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; + var display = cm.display, box = getRect(display.sizer), doScroll = null; + if (coords.top + box.top < 0) doScroll = true; + else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; if (doScroll != null && !phantom) { var hidden = display.cursor.style.display == "none"; if (hidden) { @@ -2569,12 +2614,11 @@ window.CodeMirror = (function() { } function calculateScrollPos(cm, x1, y1, x2, y2) { - var display = cm.display, pt = paddingTop(display); - y1 += pt; y2 += pt; + var display = cm.display, snapMargin = textHeight(cm.display); if (y1 < 0) y1 = 0; var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; var docBottom = cm.doc.height + paddingVert(display); - var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; + var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin; if (y1 < screentop) { result.scrollTop = atTop ? 0 : y1; } else if (y2 > screentop + screen) { @@ -2611,7 +2655,7 @@ window.CodeMirror = (function() { function indentLine(cm, n, how, aggressive) { var doc = cm.doc; - if (!how) how = "add"; + if (how == null) how = "add"; if (how == "smart") { if (!cm.doc.mode.indent) how = "prev"; else var state = getStateBefore(cm, n); @@ -2634,6 +2678,8 @@ window.CodeMirror = (function() { indentation = curSpace + cm.options.indentUnit; } else if (how == "subtract") { indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; } indentation = Math.max(0, indentation); @@ -2722,7 +2768,7 @@ window.CodeMirror = (function() { function findWordAt(line, pos) { var start = pos.ch, end = pos.ch; if (line) { - if (pos.after === false || end == line.length) --start; else ++end; + if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end; var startChar = line.charAt(start); var check = isWordChar(startChar) ? isWordChar : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} @@ -2763,7 +2809,7 @@ window.CodeMirror = (function() { removeKeyMap: function(map) { var maps = this.state.keyMaps; for (var i = 0; i < maps.length; ++i) - if ((typeof map == "string" ? maps[i].name : maps[i]) == map) { + if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) { maps.splice(i, 1); return true; } @@ -2779,7 +2825,8 @@ window.CodeMirror = (function() { removeOverlay: operation(null, function(spec) { var overlays = this.state.overlays; for (var i = 0; i < overlays.length; ++i) { - if (overlays[i].modeSpec == spec) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { overlays.splice(i, 1); this.state.modeGen++; regChange(this); @@ -2789,7 +2836,7 @@ window.CodeMirror = (function() { }), indentLine: operation(null, function(n, dir, aggressive) { - if (typeof dir != "string") { + if (typeof dir != "string" && typeof dir != "number") { if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; else dir = dir ? "add" : "subtract"; } @@ -2804,10 +2851,10 @@ window.CodeMirror = (function() { // Fetch the parser token for a given character. Useful for hacks // that want to inspect the mode state (say, for completion). - getTokenAt: function(pos) { + getTokenAt: function(pos, precise) { var doc = this.doc; pos = clipPos(doc, pos); - var state = getStateBefore(this, pos.line), mode = this.doc.mode; + var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode; var line = getLine(doc, pos.line); var stream = new StringStream(line.text, this.options.tabSize); while (stream.pos < pos.ch && !stream.eol()) { @@ -2822,10 +2869,37 @@ window.CodeMirror = (function() { state: state}; }, - getStateAfter: function(line) { + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + if (ch == 0) return styles[2]; + for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid; + else if (styles[mid * 2 + 1] < ch) before = mid + 1; + else return styles[mid * 2 + 2]; + } + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) return mode; + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode; + }, + + getHelper: function(pos, type) { + if (!helpers.hasOwnProperty(type)) return; + var help = helpers[type], mode = this.getModeAt(pos); + return mode[type] && help[mode[type]] || + mode.helperType && help[mode.helperType] || + help[mode.name]; + }, + + getStateAfter: function(line, precise) { var doc = this.doc; line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); - return getStateBefore(this, line + 1); + return getStateBefore(this, line + 1, precise); }, cursorCoords: function(start, mode) { @@ -2845,6 +2919,19 @@ window.CodeMirror = (function() { return coordsChar(this, coords.left, coords.top); }, + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset); + }, + heightAtLine: function(line, mode) { + var end = false, last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) line = this.doc.first; + else if (line > last) { line = last; end = true; } + var lineObj = getLine(this.doc, line); + return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top + + (end ? lineObj.height : 0); + }, + defaultTextHeight: function() { return textHeight(this.display); }, defaultCharWidth: function() { return charWidth(this.display); }, @@ -2873,7 +2960,7 @@ window.CodeMirror = (function() { return changeLine(this, handle, function(line) { var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; if (!line[prop]) line[prop] = cls; - else if (new RegExp("\\b" + cls + "\\b").test(line[prop])) return false; + else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false; else line[prop] += " " + cls; return true; }); @@ -2886,9 +2973,10 @@ window.CodeMirror = (function() { if (!cur) return false; else if (cls == null) line[prop] = null; else { - var upd = cur.replace(new RegExp("^" + cls + "\\b\\s*|\\s*\\b" + cls + "\\b"), ""); - if (upd == cur) return false; - line[prop] = upd || null; + var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)")); + if (!found) return false; + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; } return true; }); @@ -2936,7 +3024,7 @@ window.CodeMirror = (function() { if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth; } - node.style.top = (top + paddingTop(display)) + "px"; + node.style.top = top + "px"; node.style.left = node.style.right = ""; if (horiz == "right") { left = display.sizer.clientWidth - node.offsetWidth; @@ -3037,17 +3125,16 @@ window.CodeMirror = (function() { updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop); }), - setSize: function(width, height) { + setSize: operation(null, function(width, height) { function interpret(val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; } if (width != null) this.display.wrapper.style.width = interpret(width); if (height != null) this.display.wrapper.style.height = interpret(height); - this.refresh(); - }, - - on: function(type, f) {on(this, type, f);}, - off: function(type, f) {off(this, type, f);}, + if (this.options.lineWrapping) + this.display.measureLineCache.length = this.display.measureLineCachePos = 0; + this.curOp.forceUpdate = true; + }), operation: function(f){return runInOp(this, f);}, @@ -3072,6 +3159,7 @@ window.CodeMirror = (function() { getScrollerElement: function(){return this.display.scroller;}, getGutterElement: function(){return this.display.gutters;} }; + eventMixin(CodeMirror); // OPTION DEFAULTS @@ -3196,7 +3284,7 @@ window.CodeMirror = (function() { }; CodeMirror.getMode = function(options, spec) { - spec = CodeMirror.resolveMode(spec); + var spec = CodeMirror.resolveMode(spec); var mfactory = modes[spec.name]; if (!mfactory) return CodeMirror.getMode(options, "text/plain"); var modeObj = mfactory(options, spec); @@ -3209,6 +3297,7 @@ window.CodeMirror = (function() { } } modeObj.name = spec.name; + return modeObj; }; @@ -3236,6 +3325,16 @@ window.CodeMirror = (function() { var initHooks = []; CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; + var helpers = CodeMirror.helpers = {}; + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {}; + helpers[type][name] = value; + }; + + // UTILITIES + + CodeMirror.isWordChar = isWordChar; + // MODE STATE HANDLING // Utility functions for working with state. Exported because modes @@ -3261,6 +3360,7 @@ window.CodeMirror = (function() { CodeMirror.innerMode = function(mode, state) { while (mode.innerMode) { var info = mode.innerMode(state); + if (!info || info.mode == mode) break; state = info.state; mode = info.mode; } @@ -3281,6 +3381,10 @@ window.CodeMirror = (function() { var l = cm.getCursor().line; cm.replaceRange("", Pos(l, 0), Pos(l), "+delete"); }, + delLineLeft: function(cm) { + var cur = cm.getCursor(); + cm.replaceRange("", Pos(cur.line, 0), cur, "+delete"); + }, undo: function(cm) {cm.undo();}, redo: function(cm) {cm.redo();}, goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, @@ -3376,7 +3480,7 @@ window.CodeMirror = (function() { "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore", "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", "Cmd-]": "indentMore", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft", fallthrough: ["basic", "emacsy"] }; keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; @@ -3415,7 +3519,7 @@ window.CodeMirror = (function() { for (var i = 0; i < maps.length; ++i) { var done = lookup(maps[i]); - if (done) return done; + if (done) return done != "stop"; } } function isModifierKey(event) { @@ -3569,11 +3673,16 @@ window.CodeMirror = (function() { this.doc = doc; } CodeMirror.TextMarker = TextMarker; + eventMixin(TextMarker); TextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; var cm = this.doc.cm, withOp = cm && !cm.curOp; if (withOp) startOperation(cm); + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) signalLater(this, "clear", found.from, found.to); + } var min = null, max = null; for (var i = 0; i < this.lines.length; ++i) { var line = this.lines[i]; @@ -3597,12 +3706,11 @@ window.CodeMirror = (function() { if (min != null && cm) regChange(cm, min, max + 1); this.lines.length = 0; this.explicitlyCleared = true; - if (this.collapsed && this.doc.cantEdit) { + if (this.atomic && this.doc.cantEdit) { this.doc.cantEdit = false; if (cm) reCheckSelection(cm); } if (withOp) endOperation(cm); - signalLater(this, "clear"); }; TextMarker.prototype.find = function() { @@ -3630,7 +3738,9 @@ window.CodeMirror = (function() { if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight); break; } - runInOp(cm, function() { cm.curOp.selectionChanged = true; }); + runInOp(cm, function() { + cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true; + }); } }; @@ -3660,6 +3770,7 @@ window.CodeMirror = (function() { if (marker.replacedWith) { marker.collapsed = true; marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true; } if (marker.collapsed) sawCollapsedSpans = true; @@ -3702,7 +3813,7 @@ window.CodeMirror = (function() { } if (cm) { if (updateMaxLine) cm.curOp.updateMaxLine = true; - if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed) + if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed) regChange(cm, from.line, to.line + 1); if (marker.atomic) reCheckSelection(cm); } @@ -3720,6 +3831,7 @@ window.CodeMirror = (function() { } } CodeMirror.SharedTextMarker = SharedTextMarker; + eventMixin(SharedTextMarker); SharedTextMarker.prototype.clear = function() { if (this.explicitlyCleared) return; @@ -3833,6 +3945,13 @@ window.CodeMirror = (function() { } } } + if (sameLine && first) { + // Make sure we didn't create any zero-length spans + for (var i = 0; i < first.length; ++i) + if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark") + first.splice(i--, 1); + if (!first.length) first = null; + } var newMarkers = [first]; if (!sameLine) { @@ -3927,6 +4046,7 @@ window.CodeMirror = (function() { sp = sps[i]; if (!sp.marker.collapsed) continue; if (sp.from == null) return true; + if (sp.marker.replacedWith) continue; if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) return true; } @@ -3940,7 +4060,7 @@ window.CodeMirror = (function() { return true; for (var sp, i = 0; i < line.markedSpans.length; ++i) { sp = line.markedSpans[i]; - if (sp.marker.collapsed && sp.from == span.to && + if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) return true; } @@ -3964,11 +4084,12 @@ window.CodeMirror = (function() { // LINE WIDGETS var LineWidget = CodeMirror.LineWidget = function(cm, node, options) { - for (var opt in options) if (options.hasOwnProperty(opt)) + if (options) for (var opt in options) if (options.hasOwnProperty(opt)) this[opt] = options[opt]; this.cm = cm; this.node = node; }; + eventMixin(LineWidget); function widgetOperation(f) { return function() { var withOp = !this.cm.curOp; @@ -3983,7 +4104,9 @@ window.CodeMirror = (function() { if (no == null || !ws) return; for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); if (!ws.length) this.line.widgets = null; + var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop; updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this))); + if (aboveVisible) addToScrollPos(this.cm, 0, -this.height); regChange(this.cm, no, no + 1); }); LineWidget.prototype.changed = widgetOperation(function() { @@ -4007,10 +4130,12 @@ window.CodeMirror = (function() { var widget = new LineWidget(cm, node, options); if (widget.noHScroll) cm.display.alignWidgets = true; changeLine(cm, handle, function(line) { - (line.widgets || (line.widgets = [])).push(widget); + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) widgets.push(widget); + else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); widget.line = line; if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) { - var aboveVisible = heightAtLine(cm, line) < cm.display.scroller.scrollTop; + var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop; updateLineHeight(line, line.height + widgetHeight(widget)); if (aboveVisible) addToScrollPos(cm, 0, widget.height); } @@ -4023,12 +4148,12 @@ window.CodeMirror = (function() { // Line objects. These hold state related to a line, including // highlighting info (the styles array). - function makeLine(text, markedSpans, estimateHeight) { - var line = {text: text}; - attachMarkedSpans(line, markedSpans); - line.height = estimateHeight ? estimateHeight(line) : 1; - return line; - } + var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + eventMixin(Line); function updateLine(line, text, markedSpans, estimateHeight) { line.text = text; @@ -4052,7 +4177,7 @@ window.CodeMirror = (function() { function runMode(cm, text, mode, state, f) { var flattenSpans = mode.flattenSpans; if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; - var curText = "", curStyle = null; + var curStart = 0, curStyle = null; var stream = new StringStream(text, cm.options.tabSize), style; if (text == "" && mode.blankLine) mode.blankLine(state); while (!stream.eol()) { @@ -4064,14 +4189,13 @@ window.CodeMirror = (function() { } else { style = mode.token(stream, state); } - var substr = stream.current(); - stream.start = stream.pos; if (!flattenSpans || curStyle != style) { - if (curText) f(curText, curStyle); - curText = substr; curStyle = style; - } else curText = curText + substr; + if (curStart < stream.start) f(stream.start, curStyle); + curStart = stream.start; curStyle = style; + } + stream.start = stream.pos; } - if (curText) f(curText, curStyle); + if (curStart < stream.pos) f(stream.pos, curStyle); } function highlightLine(cm, line, state) { @@ -4079,27 +4203,24 @@ window.CodeMirror = (function() { // mode/overlays that it is based on (for easy invalidation). var st = [cm.state.modeGen]; // Compute the base array of styles - runMode(cm, line.text, cm.doc.mode, state, function(txt, style) {st.push(txt, style);}); + runMode(cm, line.text, cm.doc.mode, state, function(end, style) {st.push(end, style);}); // Run overlays, adjust style array. for (var o = 0; o < cm.state.overlays.length; ++o) { - var overlay = cm.state.overlays[o], i = 1; - runMode(cm, line.text, overlay.mode, true, function(txt, style) { - var start = i, len = txt.length; + var overlay = cm.state.overlays[o], i = 1, at = 0; + runMode(cm, line.text, overlay.mode, true, function(end, style) { + var start = i; // Ensure there's a token end at the current position, and that i points at it - while (len) { - var cur = st[i], len_ = cur.length; - if (len_ <= len) { - len -= len_; - } else { - st.splice(i, 1, cur.slice(0, len), st[i+1], cur.slice(len)); - len = 0; - } + while (at < end) { + var i_end = st[i]; + if (i_end > end) + st.splice(i, 1, end, st[i+1], i_end); i += 2; + at = Math.min(end, i_end); } if (!style) return; if (overlay.opaque) { - st.splice(start, i - start, txt, style); + st.splice(start, i - start, end, style); i = start + 2; } else { for (; start < i; start += 2) { @@ -4138,38 +4259,33 @@ window.CodeMirror = (function() { (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-")); } - function lineContent(cm, realLine, measure) { - var merged, line = realLine, lineBefore, sawBefore, simple = true; - while (merged = collapsedSpanAtStart(line)) { - simple = false; + function lineContent(cm, realLine, measure, copyWidgets) { + var merged, line = realLine, empty = true; + while (merged = collapsedSpanAtStart(line)) line = getLine(cm.doc, merged.find().from.line); - if (!lineBefore) lineBefore = line; - } - var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, - measure: null, addedOne: false, cm: cm}; + var builder = {pre: elt("pre"), col: 0, pos: 0, + measure: null, measuredSomething: false, cm: cm, + copyWidgets: copyWidgets}; if (line.textClass) builder.pre.className = line.textClass; do { + if (line.text) empty = false; builder.measure = line == realLine && measure; builder.pos = 0; builder.addToken = builder.measure ? buildTokenMeasure : buildToken; if ((ie || webkit) && cm.getOption("lineWrapping")) builder.addToken = buildTokenSplitSpaces(builder.addToken); - if (measure && sawBefore && line != realLine && !builder.addedOne) { - measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); - builder.addedOne = true; - } var next = insertLineContent(line, builder, getLineStyles(cm, line)); - sawBefore = line == lineBefore; - if (next) { - line = getLine(cm.doc, next.to.line); - simple = false; + if (measure && line == realLine && !builder.measuredSomething) { + measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); + builder.measuredSomething = true; } + if (next) line = getLine(cm.doc, next.to.line); } while (next); - if (measure && !builder.addedOne) - measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); + if (measure && !builder.measuredSomething && !measure[0]) + measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine)) builder.pre.appendChild(document.createTextNode("\u00a0")); @@ -4193,7 +4309,7 @@ window.CodeMirror = (function() { } var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g; - function buildToken(builder, text, style, startStyle, endStyle) { + function buildToken(builder, text, style, startStyle, endStyle, title) { if (!text) return; if (!tokenSpecialChars.test(text)) { builder.col += text.length; @@ -4226,7 +4342,9 @@ window.CodeMirror = (function() { var fullStyle = style || ""; if (startStyle) fullStyle += startStyle; if (endStyle) fullStyle += endStyle; - return builder.pre.appendChild(elt("span", [content], fullStyle)); + var token = elt("span", [content], fullStyle); + if (title) token.title = title; + return builder.pre.appendChild(token); } builder.pre.appendChild(content); } @@ -4241,9 +4359,11 @@ window.CodeMirror = (function() { } else if (i && wrapping && spanAffectsWrapping(text, i)) { builder.pre.appendChild(elt("wbr")); } + var old = builder.measure[builder.pos]; var span = builder.measure[builder.pos] = buildToken(builder, ch, style, start && startStyle, i == text.length - 1 && endStyle); + if (old) span.leftSide = old.leftSide || old; // In IE single-space nodes wrap differently than spaces // embedded in larger text nodes, except when set to // white-space: normal (issue #1268). @@ -4252,7 +4372,7 @@ window.CodeMirror = (function() { span.style.whiteSpace = "normal"; builder.pos += ch.length; } - if (text.length) builder.addedOne = true; + if (text.length) builder.measuredSomething = true; } function buildTokenSplitSpaces(inner) { @@ -4262,18 +4382,27 @@ window.CodeMirror = (function() { out += " "; return out; } - return function(builder, text, style, startStyle, endStyle) { - return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle); + return function(builder, text, style, startStyle, endStyle, title) { + return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle, title); }; } - function buildCollapsedSpan(builder, size, widget) { + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.replacedWith; if (widget) { - if (!builder.display) widget = widget.cloneNode(true); + if (builder.copyWidgets) widget = widget.cloneNode(true); builder.pre.appendChild(widget); - if (builder.measure && size) { - builder.measure[builder.pos] = widget; - builder.addedOne = true; + if (builder.measure) { + if (size) { + builder.measure[builder.pos] = widget; + } else { + var elt = builder.measure[builder.pos] = zeroWidthElement(builder.cm.display.measure); + if (marker.type != "bookmark" || marker.insertLeft) + builder.pre.insertBefore(elt, widget); + else + builder.pre.appendChild(elt); + } + builder.measuredSomething = true; } } builder.pos += size; @@ -4282,19 +4411,18 @@ window.CodeMirror = (function() { // Outputs a number of spans to make up a line, taking highlighting // and marked text into account. function insertLineContent(line, builder, styles) { - var spans = line.markedSpans; + var spans = line.markedSpans, allText = line.text, at = 0; if (!spans) { for (var i = 1; i < styles.length; i+=2) - builder.addToken(builder, styles[i], styleToClass(styles[i+1])); + builder.addToken(builder, allText.slice(at, at = styles[i]), styleToClass(styles[i+1])); return; } - var allText = line.text, len = allText.length; - var pos = 0, i = 1, text = "", style; - var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed; + var len = allText.length, pos = 0, i = 1, text = "", style; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed; for (;;) { if (nextChange == pos) { // Update current marker set - spanStyle = spanEndStyle = spanStartStyle = ""; + spanStyle = spanEndStyle = spanStartStyle = title = ""; collapsed = null; nextChange = Infinity; var foundBookmark = null; for (var j = 0; j < spans.length; ++j) { @@ -4304,17 +4432,17 @@ window.CodeMirror = (function() { if (m.className) spanStyle += " " + m.className; if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; - if (m.collapsed && (!collapsed || collapsed.marker.width < m.width)) + if (m.title && !title) title = m.title; + if (m.collapsed && (!collapsed || collapsed.marker.size < m.size)) collapsed = sp; } else if (sp.from > pos && nextChange > sp.from) { nextChange = sp.from; } - if (m.type == "bookmark" && sp.from == pos && m.replacedWith) - foundBookmark = m.replacedWith; + if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmark = m; } if (collapsed && (collapsed.from || 0) == pos) { buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, - collapsed.from != null && collapsed.marker.replacedWith); + collapsed.marker, collapsed.from == null); if (collapsed.to == null) return collapsed.marker.find(); } if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark); @@ -4328,13 +4456,14 @@ window.CodeMirror = (function() { if (!collapsed) { var tokenText = end > upto ? text.slice(0, upto - pos) : text; builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, - spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : ""); + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title); } if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} pos = end; spanStartStyle = ""; } - text = styles[i++]; style = styleToClass(styles[i++]); + text = allText.slice(at, at = styles[i++]); + style = styleToClass(styles[i++]); } } } @@ -4357,7 +4486,7 @@ window.CodeMirror = (function() { // This is a whole-line replace. Treated specially to make // sure line objects move the way they are supposed to. for (var i = 0, e = text.length - 1, added = []; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); + added.push(new Line(text[i], spansFor(i), estimateHeight)); update(lastLine, lastLine.text, lastSpans); if (nlines) doc.remove(from.line, nlines); if (added.length) doc.insert(from.line, added); @@ -4366,8 +4495,8 @@ window.CodeMirror = (function() { update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); } else { for (var added = [], i = 1, e = text.length - 1; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); - added.push(makeLine(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + added.push(new Line(text[i], spansFor(i), estimateHeight)); + added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); doc.insert(from.line + 1, added); } @@ -4378,7 +4507,7 @@ window.CodeMirror = (function() { update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); for (var i = 1, e = text.length - 1, added = []; i < e; ++i) - added.push(makeLine(text[i], spansFor(i), estimateHeight)); + added.push(new Line(text[i], spansFor(i), estimateHeight)); if (nlines > 1) doc.remove(from.line + 1, nlines - 1); doc.insert(from.line + 1, added); } @@ -4521,11 +4650,12 @@ window.CodeMirror = (function() { if (!(this instanceof Doc)) return new Doc(text, mode, firstLine); if (firstLine == null) firstLine = 0; - BranchChunk.call(this, [new LeafChunk([makeLine("", null)])]); + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); this.first = firstLine; this.scrollTop = this.scrollLeft = 0; this.cantEdit = false; this.history = makeHistory(); + this.cleanGeneration = 1; this.frontier = firstLine; var start = Pos(firstLine, 0); this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null}; @@ -4585,6 +4715,11 @@ window.CodeMirror = (function() { getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, getLineNumber: function(line) {return lineNo(line);}, + getLineHandleVisualStart: function(line) { + if (typeof line == "number") line = getLine(this, line); + return visualLine(this, line); + }, + lineCount: function() {return this.size;}, firstLine: function() {return this.first;}, lastLine: function() {return this.first + this.size - 1;}, @@ -4626,20 +4761,25 @@ window.CodeMirror = (function() { var hist = this.history; return {undo: hist.done.length, redo: hist.undone.length}; }, - clearHistory: function() {this.history = makeHistory();}, + clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);}, markClean: function() { - this.history.dirtyCounter = 0; - this.history.lastOp = this.history.lastOrigin = null; + this.cleanGeneration = this.changeGeneration(); + }, + changeGeneration: function() { + this.history.lastOp = this.history.lastOrigin = null; + return this.history.generation; + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration); }, - isClean: function () {return this.history.dirtyCounter == 0;}, getHistory: function() { return {done: copyHistoryArray(this.history.done), undone: copyHistoryArray(this.history.undone)}; }, setHistory: function(histData) { - var hist = this.history = makeHistory(); + var hist = this.history = makeHistory(this.history.maxGeneration); hist.done = histData.done.slice(0); hist.undone = histData.undone.slice(0); }, @@ -4750,6 +4890,8 @@ window.CodeMirror = (function() { return function() {return method.apply(this.doc, arguments);}; })(Doc.prototype[prop]); + eventMixin(Doc); + function linkedDocs(doc, f, sharedHistOnly) { function propagate(doc, skip, sharedHist) { if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { @@ -4869,7 +5011,7 @@ window.CodeMirror = (function() { // HISTORY - function makeHistory() { + function makeHistory(startGen) { return { // Arrays of history events. Doing something adds an event to // done and clears undo. Undoing moves events from done to @@ -4879,7 +5021,7 @@ window.CodeMirror = (function() { // event lastTime: 0, lastOp: null, lastOrigin: null, // Used by the isClean() method - dirtyCounter: 0 + generation: startGen || 1, maxGeneration: startGen || 1 }; } @@ -4893,7 +5035,8 @@ window.CodeMirror = (function() { } function historyChangeFromChange(doc, change) { - var histChange = {from: change.from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + var from = { line: change.from.line, ch: change.from.ch }; + var histChange = {from: from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); return histChange; @@ -4923,17 +5066,13 @@ window.CodeMirror = (function() { } else { // Can not be merged, start a new event. cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation, anchorBefore: doc.sel.anchor, headBefore: doc.sel.head, anchorAfter: selAfter.anchor, headAfter: selAfter.head}; hist.done.push(cur); + hist.generation = ++hist.maxGeneration; while (hist.done.length > hist.undoDepth) hist.done.shift(); - if (hist.dirtyCounter < 0) - // The user has made a change after undoing past the last clean state. - // We can never get back to a clean state now until markClean() is called. - hist.dirtyCounter = NaN; - else - hist.dirtyCounter++; } hist.lastTime = time; hist.lastOp = opId; @@ -5048,6 +5187,9 @@ window.CodeMirror = (function() { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; + } function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} CodeMirror.e_stop = e_stop; CodeMirror.e_preventDefault = e_preventDefault; @@ -5114,6 +5256,11 @@ window.CodeMirror = (function() { delayedCallbacks.push(bnd(arr[i])); } + function signalDOMEvent(cm, e, override) { + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore; + } + function fireDelayed() { --delayedCallbackDepth; var delayed = delayedCallbacks; @@ -5128,6 +5275,11 @@ window.CodeMirror = (function() { CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + // MISC UTILITIES // Number of pixels added to scroller and sizer to hide scrollbar @@ -5168,7 +5320,11 @@ window.CodeMirror = (function() { if (ios) { // Mobile Safari apparently has a bug where select() is broken. node.selectionStart = 0; node.selectionEnd = node.value.length; - } else node.select(); + } else { + // Suppress mysterious IE10 errors + try { node.select(); } + catch(_e) {} + } } function indexOf(collection, elt) { @@ -5275,11 +5431,13 @@ window.CodeMirror = (function() { spanAffectsWrapping = function(str, i) { return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1)); }; - else if (webkit) + else if (webkit && !/Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent)) spanAffectsWrapping = function(str, i) { - if (i > 1 && str.charCodeAt(i - 1) == 45 && /\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) - return true; - return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|\?[\w~`@#$%\^&*(_=+{[|><]/.test(str.slice(i - 1, i + 1)); + if (i > 1 && str.charCodeAt(i - 1) == 45) { + if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true; + if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false; + } + return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1)); }; var knownScrollbarWidth; @@ -5365,11 +5523,15 @@ window.CodeMirror = (function() { function iterateBidiSections(order, from, to, f) { if (!order) return f(from, to, "ltr"); + var found = false; for (var i = 0; i < order.length; ++i) { var part = order[i]; - if (part.from < to && part.to > from || from == to && part.to == from) + if (part.from < to && part.to > from || from == to && part.to == from) { f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + found = true; + } } + if (!found) f(from, to, "ltr"); } function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } @@ -5631,7 +5793,7 @@ window.CodeMirror = (function() { // THE END - CodeMirror.version = "3.13"; + CodeMirror.version = "3.15.0"; return CodeMirror; })(); diff --git a/js/codemirror/mode/sql/sql.js b/js/codemirror/mode/sql/sql.js index 066db97a82..9016cc7aae 100644 --- a/js/codemirror/mode/sql/sql.js +++ b/js/codemirror/mode/sql/sql.js @@ -19,43 +19,64 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { if (result !== false) return result; } - if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) - || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/)) { + if (support.hexNumber == true && + ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) + || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { // hex + // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html return "number"; - } else if (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) - || (ch == "0" && stream.match(/^b[01]+/))) { + } else if (support.binaryNumber == true && + (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) + || (ch == "0" && stream.match(/^b[01]+/)))) { // bitstring + // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html return "number"; } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { // numbers - stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); + // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html + stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); + support.decimallessFloat == true && stream.eat('.'); return "number"; } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { // placeholders return "variable-3"; - } else if (ch == '"' || ch == "'") { + } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { // strings + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html state.tokenize = tokenLiteral(ch); return state.tokenize(stream, state); + } else if ((((support.nCharCast == true && (ch == "n" || ch == "N")) + || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) + && (stream.peek() == "'" || stream.peek() == '"'))) { + // charset casting: _utf8'str', N'str', n'str' + // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html + return "keyword"; } else if (/^[\(\),\;\[\]]/.test(ch)) { // no highlightning return null; - } else if (ch == "#" || (ch == "-" && stream.eat("-") && stream.eat(" "))) { + } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { + // 1-line comment + stream.skipToEnd(); + return "comment"; + } else if ((support.commentHash && ch == "#") + || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { // 1-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ stream.skipToEnd(); return "comment"; } else if (ch == "/" && stream.eat("*")) { // multi-line comments + // ref: https://kb.askmonty.org/en/comment-syntax/ state.tokenize = tokenComment; return state.tokenize(stream, state); } else if (ch == ".") { // .1 for 0.1 - if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e\d*)?|\d*e\d+)/i)) { + if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) { return "number"; } // .table_name (ODBC) - if (stream.match(/^[a-zA-Z_]+/) && support.ODBCdotTable == true) { + // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html + if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) { return "variable-2"; } } else if (operatorChars.test(ch)) { @@ -65,11 +86,13 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { } else if (ch == '{' && (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { // dates (weird ODBC syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html return "number"; } else { stream.eatWhile(/^[_\w\d]/); var word = stream.current().toLowerCase(); // dates (standard SQL syntax) + // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) return "number"; if (atoms.hasOwnProperty(word)) return "atom"; @@ -166,6 +189,8 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { // `identifier` function hookIdentifier(stream) { + // MySQL/MariaDB identifiers + // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html var ch; while ((ch = stream.next()) != null) { if (ch == "`" && !stream.eat("`")) return "variable-2"; @@ -176,7 +201,9 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { // variable token function hookVar(stream) { // variables - // @@ and prefix + // @@prefix.varName @varName + // varName can be quoted with ` or ' or " + // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html if (stream.eat("@")) { stream.match(/^session\./); stream.match(/^local\./); @@ -200,18 +227,27 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { // short client keyword token function hookClient(stream) { + // \N means NULL + // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html + if (stream.eat("N")) { + return "atom"; + } // \g, etc - return stream.match(/^[a-zA-Z]\b/) ? "variable-2" : null; + // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html + return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; } + // these keywords are used by all SQL dialects (however, a mode can still overwrite it) var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from having in insert into is join like not on or order select set table union update values where "; + // turn a space-separated list into an array function set(str) { var obj = {}, words = str.split(" "); for (var i = 0; i < words.length; ++i) obj[words[i]] = true; return obj; } + // A generic SQL Mode. It's not a standard, it just try to support what is generally supported CodeMirror.defineMIME("text/x-sql", { name: "sql", keywords: set(sqlKeywords + "begin"), @@ -219,7 +255,7 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=]/, dateSQL: set("date time timestamp"), - support: set("ODBCdotTable") + support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") }); CodeMirror.defineMIME("text/x-mysql", { @@ -230,7 +266,7 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), - support: set("ODBCdotTable zerolessFloat"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, @@ -246,7 +282,7 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { atoms: set("false true null unknown"), operatorChars: /^[*+\-%<>!=&|^]/, dateSQL: set("date time timestamp"), - support: set("ODBCdotTable zerolessFloat"), + support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), hooks: { "@": hookVar, "`": hookIdentifier, @@ -254,6 +290,20 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { } }); + // the query language used by Apache Cassandra is called CQL, but this mime type + // is called Cassandra to avoid confusion with Contextual Query Language + CodeMirror.defineMIME("text/x-cassandra", { + name: "sql", + client: { }, + keywords: set("use select from using consistency where limit first reversed first and in insert into values using consistency ttl update set delete truncate begin batch apply create keyspace with columnfamily primary key index on drop alter type add any one quorum all local_quorum each_quorum"), + builtin: set("ascii bigint blob boolean counter decimal double float int text timestamp uuid varchar varint"), + atoms: set("false true"), + operatorChars: /^[<>=]/, + dateSQL: { }, + support: set("commentSlashSlash decimallessFloat"), + hooks: { } + }); + // this is based on Peter Raganitsch's 'plsql' mode CodeMirror.defineMIME("text/x-plsql", { name: "sql", @@ -262,6 +312,38 @@ CodeMirror.defineMode("sql", function(config, parserConfig) { functions: set("abs acos add_months ascii asin atan atan2 average bfilename ceil chartorowid chr concat convert cos cosh count decode deref dual dump dup_val_on_index empty error exp false floor found glb greatest hextoraw initcap instr instrb isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mod months_between new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null nvl others power rawtohex reftohex round rowcount rowidtochar rpad rtrim sign sin sinh soundex sqlcode sqlerrm sqrt stddev substr substrb sum sysdate tan tanh to_char to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid upper user userenv variance vsize"), builtin: set("bfile blob character clob dec float int integer mlslabel natural naturaln nchar nclob number numeric nvarchar2 real rowtype signtype smallint string varchar varchar2"), operatorChars: /^[*+\-%<>!=~]/, - dateSQL: set("date time timestamp") + dateSQL: set("date time timestamp"), + support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") }); }()); + +/* + How Properties of Mime Types are used by SQL Mode + ================================================= + + keywords: + A list of keywords you want to be highlighted. + functions: + A list of function names you want to be highlighted. + builtin: + A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). + operatorChars: + All characters that must be handled as operators. + client: + Commands parsed and executed by the client (not the server). + support: + A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. + * ODBCdotTable: .tableName + * zerolessFloat: .1 + * doubleQuote + * nCharCast: N'string' + * charsetCast: _utf8'string' + * commentHash: use # char for comments + * commentSlashSlash: use // for comments + * commentSpaceRequired: require a space after -- for comments + atoms: + Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: + UNKNOWN, INFINITY, UNDERFLOW, NaN... + dateSQL: + Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. +*/ diff --git a/themes/pmahomme/css/codemirror.css.php b/themes/pmahomme/css/codemirror.css.php index c9a25738f1..0817b0da77 100644 --- a/themes/pmahomme/css/codemirror.css.php +++ b/themes/pmahomme/css/codemirror.css.php @@ -198,6 +198,16 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} white-space: pre-wrap; word-break: normal; } +.CodeMirror-code pre { + border-right: 30px solid transparent; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; +} +.CodeMirror-wrap .CodeMirror-code pre { + border-right: none; + width: auto; +} .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; From 2c1f01417159311a302a8b5adf9f50495ac1fb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:29:47 +0200 Subject: [PATCH 031/141] Replace getCssCodeMirror by inline CSS --- libraries/Theme.class.php | 59 -------------------------- test/classes/PMA_Theme_test.php | 51 ---------------------- themes/pmahomme/css/codemirror.css.php | 34 ++++++++++++++- 3 files changed, 33 insertions(+), 111 deletions(-) diff --git a/libraries/Theme.class.php b/libraries/Theme.class.php index 8b34182877..22a68602ff 100644 --- a/libraries/Theme.class.php +++ b/libraries/Theme.class.php @@ -481,64 +481,5 @@ class PMA_Theme } return implode("\n", $result); } - - /** - * Returns CSS styles for CodeMirror editor based on query formatter colors. - * - * @return string CSS code. - */ - function getCssCodeMirror() - { - if (! $GLOBALS['cfg']['CodemirrorEnable']) { - return ''; - } - - $result[] = 'span.cm-keyword, span.cm-statement-verb {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_reservedWord'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-variable {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_identifier'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-comment {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['comment'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-mysql-string {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['quote'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-operator {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['punct'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-mysql-word {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_identifier'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-builtin {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_functionName'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-variable-2 {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_columnType'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-variable-3 {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_columnAttrib'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-separator {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['punct'] . ';'; - $result[] = '}'; - $result[] = 'span.cm-number {'; - $result[] = ' color: ' - . $GLOBALS['cfg']['SQP']['fmtColor']['digit_integer'] . ';'; - $result[] = '}'; - - return implode("\n", $result); - } } ?> diff --git a/test/classes/PMA_Theme_test.php b/test/classes/PMA_Theme_test.php index 7d8d2c7821..9d85a4a88d 100644 --- a/test/classes/PMA_Theme_test.php +++ b/test/classes/PMA_Theme_test.php @@ -305,57 +305,6 @@ background: -o-linear-gradient(top, #12345, #54321);' ); } - /** - * Test for getCssCodeMirror - * - * @return void - */ - public function testGetCssCodeMirror() - { - $this->assertEquals( - $this->object->getCssCodeMirror(), - 'span.cm-keyword, span.cm-statement-verb { - color: #909; -} -span.cm-variable { - color: black; -} -span.cm-comment { - color: #808000; -} -span.cm-mysql-string { - color: #008000; -} -span.cm-operator { - color: fuchsia; -} -span.cm-mysql-word { - color: black; -} -span.cm-builtin { - color: #f00; -} -span.cm-variable-2 { - color: #f90; -} -span.cm-variable-3 { - color: #00f; -} -span.cm-separator { - color: fuchsia; -} -span.cm-number { - color: teal; -}' - ); - - $GLOBALS['cfg']['CodemirrorEnable'] = false; - $this->assertEquals( - $this->object->getCssCodeMirror(), - '' - ); - } - /** * Test for getImgPath * diff --git a/themes/pmahomme/css/codemirror.css.php b/themes/pmahomme/css/codemirror.css.php index 0817b0da77..fb807ed8c0 100644 --- a/themes/pmahomme/css/codemirror.css.php +++ b/themes/pmahomme/css/codemirror.css.php @@ -264,4 +264,36 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} } } -getCssCodeMirror(); ?> +span.cm-keyword, span.cm-statement-verb { + color: #909; +} +span.cm-variable { + color: black; +} +span.cm-comment { + color: #808000; +} +span.cm-mysql-string { + color: #008000; +} +span.cm-operator { + color: fuchsia; +} +span.cm-mysql-word { + color: black; +} +span.cm-builtin { + color: #f00; +} +span.cm-variable-2 { + color: #f90; +} +span.cm-variable-3 { + color: #00f; +} +span.cm-separator { + color: fuchsia; +} +span.cm-number { + color: teal; +} From 2783d9262174d93c981e55af39b4be8a94b98daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:31:10 +0200 Subject: [PATCH 032/141] Drop no longer used $cfg['SQP']['fmtColor'] --- doc/config.rst | 67 --------------------------------- test/classes/PMA_Theme_test.php | 1 - themes/original/layout.inc.php | 28 -------------- themes/pmahomme/layout.inc.php | 28 -------------- 4 files changed, 124 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index 89d2ad9c1f..6b7a866657 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -2712,73 +2712,6 @@ SQL parser settings * ``'text'`` * ``'none'`` -.. config:option:: $cfg['SQP']['fmtColor'] - - :type: array of string tuples - :default: - - This array is used to define the colours for each type of element of - the pretty-printed :term:`SQL` queries. - The tuple format is *class* => [*HTML colour code* | *empty string*] - - - If you specify an empty string for the color of a class, it is ignored - in creating the stylesheet. You should not alter the class names, only - the colour strings. - - **Class name key:** - - comment - Applies to all comment sub-classes - comment\_mysql - Comments as ``"#...\n"`` - comment\_ansi - Comments as ``"-- ...\n"`` - comment\_c - Comments as ``"/*...*/"`` - digit - Applies to all digit sub-classes - digit\_hex - Hexadecimal numbers - digit\_integer - Integer numbers - digit\_float - Floating point numbers - punct - Applies to all punctuation sub-classes - punct\_bracket\_open\_round - Opening brackets ``"("`` - punct\_bracket\_close\_round - Closing brackets ``")"`` - punct\_listsep - List item Separator ``","`` - punct\_qualifier - Table/Column Qualifier ``"."`` - punct\_queryend - End of query marker ``";"`` - alpha - Applies to all alphabetic classes - alpha\_columnType - Identifiers matching a column type - alpha\_columnAttrib - Identifiers matching a database/table/column attribute - alpha\_functionName - Identifiers matching a MySQL function name - alpha\_reservedWord - Identifiers matching any other reserved word - alpha\_variable - Identifiers matching a :term:`SQL` variable ``"@foo"`` - alpha\_identifier - All other identifiers - quote - Applies to all quotation mark classes - quote\_double - Double quotes ``"`` - quote\_single - Single quotes ``'`` - quote\_backtick - Backtick quotes ````` - SQL validator settings ---------------------- diff --git a/test/classes/PMA_Theme_test.php b/test/classes/PMA_Theme_test.php index 9d85a4a88d..708cb690c8 100644 --- a/test/classes/PMA_Theme_test.php +++ b/test/classes/PMA_Theme_test.php @@ -34,7 +34,6 @@ class PMA_ThemeTest extends PHPUnit_Framework_TestCase $_SESSION['PMA_Theme'] = $this->object; $GLOBALS['PMA_Config'] = new PMA_Config(); $GLOBALS['PMA_Config']->enableBc(); - $GLOBALS['cfg']['SQP']['fmtColor'] = array('fake' => 'red'); $GLOBALS['text_dir'] = 'ltr'; include 'themes/pmahomme/layout.inc.php'; $GLOBALS['server'] = '99'; diff --git a/themes/original/layout.inc.php b/themes/original/layout.inc.php index 46e2f01ec6..084aeef1c0 100644 --- a/themes/original/layout.inc.php +++ b/themes/original/layout.inc.php @@ -83,34 +83,6 @@ $GLOBALS['cfg']['QueryWindowWidth'] = 600; // Height of Query window $GLOBALS['cfg']['QueryWindowHeight'] = 400; -/** - * SQL Parser Settings - * Syntax colouring data - */ -$GLOBALS['cfg']['SQP']['fmtColor'] = array( - 'comment' => '#808000', - 'comment_mysql' => '', - 'comment_ansi' => '', - 'comment_c' => '', - 'digit' => '', - 'digit_hex' => 'teal', - 'digit_integer' => 'teal', - 'digit_float' => 'aqua', - 'punct' => 'fuchsia', - 'alpha' => '', - 'alpha_columnType' => '#FF9900', - 'alpha_columnAttrib' => '#0000FF', - 'alpha_reservedWord' => '#990099', - 'alpha_functionName' => '#FF0000', - 'alpha_identifier' => 'black', - 'alpha_charset' => '#6495ed', - 'alpha_variable' => '#800000', - 'quote' => '#008000', - 'quote_double' => '', - 'quote_single' => '', - 'quote_backtick' => '' -); - /** * Chart colors */ diff --git a/themes/pmahomme/layout.inc.php b/themes/pmahomme/layout.inc.php index 7454cade49..c273b6b3b5 100644 --- a/themes/pmahomme/layout.inc.php +++ b/themes/pmahomme/layout.inc.php @@ -84,34 +84,6 @@ $GLOBALS['cfg']['QueryWindowWidth'] = 600; // Height of Query window $GLOBALS['cfg']['QueryWindowHeight'] = 400; -/** - * SQL Parser Settings - * Syntax colouring data - */ -$GLOBALS['cfg']['SQP']['fmtColor'] = array( - 'comment' => '#808000', - 'comment_mysql' => '', - 'comment_ansi' => '', - 'comment_c' => '', - 'digit' => '', - 'digit_hex' => 'teal', - 'digit_integer' => 'teal', - 'digit_float' => 'aqua', - 'punct' => 'fuchsia', - 'alpha' => '', - 'alpha_columnType' => '#f90', - 'alpha_columnAttrib' => '#00f', - 'alpha_reservedWord' => '#909', - 'alpha_functionName' => '#f00', - 'alpha_identifier' => 'black', - 'alpha_charset' => '#6495ed', - 'alpha_variable' => '#800000', - 'quote' => '#008000', - 'quote_double' => '', - 'quote_single' => '', - 'quote_backtick' => '' -); - /** * Chart colors */ From b8ea23ab9f0800fdcf7309de0dded4769eb45be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:35:09 +0200 Subject: [PATCH 033/141] Drop $cfg['SQP']['fmtType'] It has no effect anyway and in case we would want to make syntax highlighting optional, it needs to be done in javascript and needs better configuration name than this one. --- doc/config.rst | 19 ------- libraries/Util.class.php | 4 +- libraries/config.default.php | 14 ----- libraries/sqlparser.lib.php | 2 +- test/libraries/PMA_server_binlog_test.php | 31 ++++++----- test/libraries/PMA_server_collations_test.php | 47 +++++++++-------- test/libraries/PMA_server_databases_test.php | 51 +++++++++---------- test/libraries/PMA_server_engines_test.php | 19 ++++--- test/libraries/PMA_server_plugins_test.php | 17 +++---- .../libraries/PMA_server_replication_test.php | 49 +++++++++--------- .../PMA_server_status_advisor_test.php | 33 ++++++------ .../PMA_server_status_monitor_test.php | 47 +++++++++-------- .../PMA_server_status_queries_test.php | 35 +++++++------ test/libraries/PMA_server_status_test.php | 35 +++++++------ .../PMA_server_status_variables_test.php | 29 +++++------ test/libraries/PMA_server_variables_test.php | 1 - 16 files changed, 193 insertions(+), 240 deletions(-) diff --git a/doc/config.rst b/doc/config.rst index 6b7a866657..5ba6954e6c 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -2693,25 +2693,6 @@ Default queries Default queries that will be displayed in query boxes when user didn't specify any. You can use standard :ref:`faq6_27`. -.. _cfg_SQP: -SQL parser settings -------------------- - -.. config:option:: $cfg['SQP']['fmtType'] - - :type: string - :default: ``'html'`` - - The main use of the :term:`SQL` Parser - is to format and analyze :term:`SQL` queries. By - default we use text to format the query, but you can disable this by - setting this variable to ``'none'``. - - Available options: - - * ``'text'`` - * ``'none'`` - SQL validator settings ---------------------- diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 290ea49299..9f67134e31 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -1022,9 +1022,7 @@ class PMA_Util if (null === $sql_query) { if (! empty($GLOBALS['display_query'])) { $sql_query = $GLOBALS['display_query']; - } elseif ($cfg['SQP']['fmtType'] == 'none' - && ! empty($GLOBALS['unparsed_sql']) - ) { + } elseif (! empty($GLOBALS['unparsed_sql']) { $sql_query = $GLOBALS['unparsed_sql']; } elseif (! empty($GLOBALS['sql_query'])) { $sql_query = $GLOBALS['sql_query']; diff --git a/libraries/config.default.php b/libraries/config.default.php index 3ad4025240..be219e3a45 100644 --- a/libraries/config.default.php +++ b/libraries/config.default.php @@ -2830,20 +2830,6 @@ $cfg['LinkLengthLimit'] = 1000; */ $cfg['DisableMultiTableMaintenance'] = false; -/******************************************************************************* - * SQL Parser Settings - * - * @global array $cfg['SQP'] - */ -$cfg['SQP'] = array(); - -/** - * Pretty-printing style to use on queries (html, text, none) - * - * @global string $cfg['SQP']['fmtType'] - */ -$cfg['SQP']['fmtType'] = 'none'; - /******************************************************************************* * If you wish to use the SQL Validator service, you should be aware of the diff --git a/libraries/sqlparser.lib.php b/libraries/sqlparser.lib.php index 40cde13db8..c7f12533ad 100644 --- a/libraries/sqlparser.lib.php +++ b/libraries/sqlparser.lib.php @@ -2295,7 +2295,7 @@ function PMA_SQP_format( break; } // end switch // inner_sql is a span that exists for all cases, except query_only - // of $cfg['SQP']['fmtType'] to make possible a replacement + // to make possible a replacement // for inline editing if ($mode!='query_only') { $str .= ''; diff --git a/test/libraries/PMA_server_binlog_test.php b/test/libraries/PMA_server_binlog_test.php index 568c8ce600..33d6739dd8 100644 --- a/test/libraries/PMA_server_binlog_test.php +++ b/test/libraries/PMA_server_binlog_test.php @@ -39,7 +39,7 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['server'] = 1; @@ -48,16 +48,15 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; - + $GLOBALS['table'] = "table"; $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); - $_SESSION['PMA_Theme'] = new PMA_Theme(); + $_SESSION['PMA_Theme'] = new PMA_Theme(); } /** @@ -70,7 +69,7 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase $binary_log_file_names = array(); $binary_log_file_names[] = array("Log_name"=>"index1", "File_size"=>100); $binary_log_file_names[] = array("Log_name"=>"index2", "File_size"=>200); - + $url_params = array(); $url_params['log'] = "log"; $url_params['dontlimitchars'] = 1; @@ -100,16 +99,16 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase $binary_log_file_names = array(); $binary_log_file_names[] = array("Log_name"=>"index1", "File_size"=>100); $binary_log_file_names[] = array("Log_name"=>"index2", "File_size"=>200); - + $url_params = array(); $url_params['log'] = "log"; $url_params['dontlimitchars'] = 1; - + //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() ->getMock(); - + //expects return value $result = array( array( @@ -134,19 +133,19 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase 'Event_type' => "index1_Event_type", 'End_log_pos' => "index1_End_log_pos", 'Server_id' => "index1_Server_id", - ); + ); $count = 3; //expects functions $dbi->expects($this->once())->method('query') ->will($this->returnValue($result)); - + $dbi->expects($this->once())->method('numRows') ->will($this->returnValue($count)); - + $dbi->expects($this->at(0))->method('fetchAssoc') ->will($this->returnValue($value)); - + $dbi->expects($this->at(1))->method('fetchAssoc') ->will($this->returnValue(false)); @@ -154,7 +153,7 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase //Call the test function $html = PMA_getLogInfo($binary_log_file_names, $url_params); - + //validate 1: the sql has been executed $this->assertContains( 'Your SQL query has been executed successfully', @@ -180,7 +179,7 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase $this->assertContains( 'title="Previous"', $html - ); + ); //validate 5: Log Item $this->assertContains( 'Log name', @@ -203,4 +202,4 @@ class PMA_ServerBinlog_Test extends PHPUnit_Framework_TestCase $html ); } -} \ No newline at end of file +} diff --git a/test/libraries/PMA_server_collations_test.php b/test/libraries/PMA_server_collations_test.php index 8c94411cb8..5f27827e3e 100644 --- a/test/libraries/PMA_server_collations_test.php +++ b/test/libraries/PMA_server_collations_test.php @@ -17,14 +17,14 @@ $GLOBALS['url_query'] = "url_query"; $GLOBALS['PMA_PHP_SELF'] = PMA_getenv('PHP_SELF'); $GLOBALS['lang'] = "en"; $GLOBALS['available_languages']= array( - "en" => array("English", "US-ENGLISH"), + "en" => array("English", "US-ENGLISH"), "ch" => array("Chinese", "TW-Chinese") ); $GLOBALS['text_dir'] = "text_dir"; $GLOBALS['cfg']['DBG']['sql'] = false; //$_SESSION require_once 'libraries/Theme.class.php'; -$_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); +$_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); require_once 'libraries/Util.class.php'; require_once 'libraries/php-gettext/gettext.inc'; @@ -58,7 +58,7 @@ class PMA_ServerCollations_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['is_ajax_request'] = true; @@ -67,12 +67,11 @@ class PMA_ServerCollations_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; - + $GLOBALS['table'] = "table"; - $GLOBALS['pmaThemeImage'] = 'image'; + $GLOBALS['pmaThemeImage'] = 'image'; } /** @@ -84,30 +83,30 @@ class PMA_ServerCollations_Test extends PHPUnit_Framework_TestCase { $mysql_charsets = array("armscii8", "ascii", "big5", "binary"); $mysql_collations = array( - "armscii8" => array("armscii8"), - "ascii" => array("ascii"), - "big5" => array("big5"), - "binary" => array("binary"), + "armscii8" => array("armscii8"), + "ascii" => array("ascii"), + "big5" => array("big5"), + "binary" => array("binary"), ); $mysql_charsets_descriptions = array( - "armscii8" => "PMA_armscii8_general_ci", - "ascii" => "PMA_ascii_general_ci", - "big5" => "PMA_big5_general_ci", - "binary" => "PMA_binary_general_ci", + "armscii8" => "PMA_armscii8_general_ci", + "ascii" => "PMA_ascii_general_ci", + "big5" => "PMA_big5_general_ci", + "binary" => "PMA_binary_general_ci", ); $mysql_default_collations = array( - "armscii8" => "armscii8", - "ascii" => "ascii", - "big5" => "big5", - "binary" => "binary", + "armscii8" => "armscii8", + "ascii" => "ascii", + "big5" => "big5", + "binary" => "binary", ); $mysql_collations_available = array( - "armscii8" => true, - "ascii" => true, - "big5" => true, - "binary" => true, + "armscii8" => true, + "ascii" => true, + "big5" => true, + "binary" => true, ); - + //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() @@ -123,7 +122,7 @@ class PMA_ServerCollations_Test extends PHPUnit_Framework_TestCase $mysql_default_collations, $mysql_collations_available ); - + //validate 1: Charset HTML $this->assertContains( '
', diff --git a/test/libraries/PMA_server_databases_test.php b/test/libraries/PMA_server_databases_test.php index 2aadf5719e..5a7d62f473 100644 --- a/test/libraries/PMA_server_databases_test.php +++ b/test/libraries/PMA_server_databases_test.php @@ -42,7 +42,7 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['MaxDbList'] = 100; @@ -51,22 +51,21 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; $GLOBALS['cfg']['ActionLinksMode'] = "both"; $GLOBALS['cfg']['DefaultTabDatabase'] = 'db_structure.php'; - + $GLOBALS['table'] = "table"; $GLOBALS['server_master_status'] = false; $GLOBALS['server_slave_status'] = false; $GLOBALS['pmaThemeImage'] = 'image'; $GLOBALS['text_dir'] = "text_dir"; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); - $_SESSION['PMA_Theme'] = new PMA_Theme(); + $_SESSION['PMA_Theme'] = new PMA_Theme(); } @@ -76,7 +75,7 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase * @return void */ public function testPMAGetHtmlForDatabase() - { + { //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() @@ -90,9 +89,9 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase array("SCHEMA_NAME" => "information_schema"), array("SCHEMA_NAME" => "mysql"), array("SCHEMA_NAME" => "performance_schema"), - array("SCHEMA_NAME" => "phpmyadmin") + array("SCHEMA_NAME" => "phpmyadmin") ); - + $databases_count = 5; $pos = 0; $dbstats = 0; @@ -117,18 +116,18 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase ), ); $url_query = "token=27ae04f0b003a84e5c2796182f361ff1"; - + $html = PMA_getHtmlForDatabase( - $databases, - $databases_count, - $pos, - $dbstats, - $sort_by, - $sort_order, - $is_superuser, - $cfg, - $replication_types, - $replication_info, + $databases, + $databases_count, + $pos, + $dbstats, + $sort_by, + $sort_order, + $is_superuser, + $cfg, + $replication_types, + $replication_info, $url_query ); @@ -137,18 +136,18 @@ class PMA_ServerDatabases_Test extends PHPUnit_Framework_TestCase '
', $html ); - + //validate 2:ajax Form $this->assertContains( 'assertContains( '', $html ); - + //validate 3: PMA_getHtmlForColumnOrderWithSort $this->assertContains( 'assertContains( 'Total: 5', $html ); - + //validate 6: PMA_getHtmlForTableFooterButtons $this->assertContains( 'Check All', $html ); - + //validate 7: PMA_getHtmlForNoticeEnableStatistics $this->assertContains( 'Note: Enabling the database statistics here might cause heavy traffic', diff --git a/test/libraries/PMA_server_engines_test.php b/test/libraries/PMA_server_engines_test.php index 9943969962..494b57731e 100644 --- a/test/libraries/PMA_server_engines_test.php +++ b/test/libraries/PMA_server_engines_test.php @@ -41,7 +41,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['ServerDefault'] = "server"; @@ -49,18 +49,17 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; $GLOBALS['cfg']['MySQLManualType'] = 'viewable'; - + $GLOBALS['table'] = "table"; $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); - $_SESSION['PMA_Theme'] = new PMA_Theme(); + $_SESSION['PMA_Theme'] = new PMA_Theme(); } /** @@ -69,7 +68,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase * @return void */ public function testPMAGetPluginAndModuleInfo() - { + { //test PMA_getHtmlForAllServerEngines $html = PMA_getHtmlForServerEngines(); @@ -82,7 +81,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase '', $html ); - + //validate 2: FEDERATED $this->assertContains( '', @@ -96,7 +95,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase 'server_engines.php?engine=FEDERATED', $html ); - + //validate 3: dummy $this->assertContains( '', @@ -118,7 +117,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase * @return void */ public function testPMAGetPluginAndModuleInfoSpecific() - { + { $_REQUEST['engine'] = "FEDERATED"; //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') @@ -143,7 +142,7 @@ class PMA_ServerEngines_Test extends PHPUnit_Framework_TestCase 'This MySQL server does not support the FEDERATED storage engine.', $html ); - $enginer_info = 'There is no detailed status information ' + $enginer_info = 'There is no detailed status information ' . 'available for this storage engine'; $this->assertContains( $enginer_info, diff --git a/test/libraries/PMA_server_plugins_test.php b/test/libraries/PMA_server_plugins_test.php index 195af93624..174f6fe41e 100644 --- a/test/libraries/PMA_server_plugins_test.php +++ b/test/libraries/PMA_server_plugins_test.php @@ -39,7 +39,7 @@ class PMA_ServerPlugins_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['ServerDefault'] = "server"; @@ -47,17 +47,16 @@ class PMA_ServerPlugins_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; - + $GLOBALS['table'] = "table"; $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); - $_SESSION['PMA_Theme'] = new PMA_Theme(); + $_SESSION['PMA_Theme'] = new PMA_Theme(); } /** @@ -66,7 +65,7 @@ class PMA_ServerPlugins_Test extends PHPUnit_Framework_TestCase * @return void */ public function testPMAGetPluginAndModuleInfo() - { + { //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() @@ -95,9 +94,9 @@ class PMA_ServerPlugins_Test extends PHPUnit_Framework_TestCase $plugins[$row['plugin_type']][] = $row; $modules[$row['module_name']]['info'] = $row; $modules[$row['module_name']]['plugins'][$row['plugin_type']][] = $row; - + $html = PMA_getPluginAndModuleInfo($plugins, $modules); - + //validate 1: PMA_getPluginTab @@ -143,7 +142,7 @@ class PMA_ServerPlugins_Test extends PHPUnit_Framework_TestCase '', $html ); - + //validate 4: one Item HTML $this->assertContains( '', diff --git a/test/libraries/PMA_server_replication_test.php b/test/libraries/PMA_server_replication_test.php index cbf841d955..722cbc07d6 100644 --- a/test/libraries/PMA_server_replication_test.php +++ b/test/libraries/PMA_server_replication_test.php @@ -35,14 +35,14 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase * Prepares environment for the test. * * @return void - */ + */ public function setUp() { //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; $_REQUEST['mr_adduser'] = "mr_adduser"; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['ServerDefault'] = "server"; @@ -50,27 +50,26 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; $GLOBALS['cfg']['ShowHint'] = true; - + $GLOBALS['table'] = "table"; $GLOBALS['url_params'] = array(); $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); $_SESSION['PMA_Theme'] = new PMA_Theme(); - + //Mock DBI $slave_host = array( array('Server_id'=>'Server_id1', 'Host'=>'Host1'), array('Server_id'=>'Server_id2', 'Host'=>'Host2'), ); - + $fetchResult = array( array( "SHOW SLAVE HOSTS", @@ -81,7 +80,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase $slave_host ), ); - + $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() ->getMock(); @@ -98,8 +97,8 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase ); $dbi->expects($this->any())->method('getColumns') ->will($this->returnValue($fields_info)); - - $GLOBALS['dbi'] = $dbi; + + $GLOBALS['dbi'] = $dbi; } /** @@ -108,20 +107,20 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase * @return void */ public function testPMAGetHtmlForMasterReplication() - { + { global $master_variables; global $master_variables_alerts; global $master_variables_oks; global $server_master_replication; global $strReplicationStatus_master; - + $master_variables_alerts = null; $master_variables_oks = null; $strReplicationStatus_master = null; //Call the test function $html = PMA_getHtmlForMasterReplication(); - + //validate 1: Master replication $this->assertContains( 'Master replication', @@ -131,7 +130,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase 'This server is configured as master in a replication process.', $html ); - + //validate 2: PMA_getHtmlForReplicationStatusTable $this->assertContains( '
assertContains( 'replication_slaves_section', @@ -164,7 +163,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase $this->assertContains( '
', $html - ); + ); //slave host $this->assertContains( '', @@ -187,7 +186,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase 'Only slaves started with the', $html ); - + //validate 4: navigation URL $this->assertContains( '', @@ -212,9 +211,9 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHtmlForNotServerReplication() { - //Call the test function + //Call the test function $html = PMA_getHtmlForNotServerReplication(); - + $this->assertContains( 'Master replication', $html @@ -233,13 +232,13 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase public function testPMAGetHtmlForSlaveConfiguration() { global $server_slave_replication; - + //Call the test function $html = PMA_getHtmlForSlaveConfiguration( - true, + true, $server_slave_replication ); - + //legend $this->assertContains( 'Slave replication', @@ -285,7 +284,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHtmlForReplicationChangeMaster() { - //Call the test function + //Call the test function $html = PMA_getHtmlForReplicationChangeMaster("slave_changemaster"); $this->assertContains( @@ -300,7 +299,7 @@ class PMA_ServerReplication_Test extends PHPUnit_Framework_TestCase 'Change or reconfigure master server', $html ); - $notice = 'Make sure, you have unique server-id ' + $notice = 'Make sure, you have unique server-id ' . 'in your configuration file (my.cnf)'; $this->assertContains( $notice, diff --git a/test/libraries/PMA_server_status_advisor_test.php b/test/libraries/PMA_server_status_advisor_test.php index 04c494a322..86ac385f13 100644 --- a/test/libraries/PMA_server_status_advisor_test.php +++ b/test/libraries/PMA_server_status_advisor_test.php @@ -48,7 +48,7 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['ServerDefault'] = "server"; @@ -56,30 +56,29 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; - $GLOBALS['cfg']['Server']['host'] = "localhost"; - $GLOBALS['cfg']['MySQLManualType'] = 'viewable'; + $GLOBALS['cfg']['Server']['host'] = "localhost"; + $GLOBALS['cfg']['MySQLManualType'] = 'viewable'; $GLOBALS['cfg']['ShowHint'] = true; $GLOBALS['cfg']['ActionLinksMode'] = 'icons'; $GLOBALS['PMA_PHP_SELF'] = PMA_getenv('PHP_SELF'); $GLOBALS['server_master_status'] = false; $GLOBALS['server_slave_status'] = false; - + $GLOBALS['table'] = "table"; $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); $_SESSION['PMA_Theme'] = new PMA_Theme(); - + //Mock DBI $dbi = $this->getMockBuilder('PMA_DatabaseInterface') ->disableOriginalConstructor() ->getMock(); - + //this data is needed when PMA_ServerStatusData constructs $server_status = array( "Aborted_clients" => "0", @@ -88,7 +87,7 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase "Com_create_function" => "0", "Com_empty_query" => "0", ); - + $server_variables= array( "auto_increment_increment" => "1", "auto_increment_offset" => "1", @@ -96,7 +95,7 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase "back_log" => "50", "big_tables" => "OFF", ); - + $fetchResult = array( array( "SHOW GLOBAL STATUS", @@ -115,7 +114,7 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase $server_variables ), array( - "SELECT concat('Com_', variable_name), variable_value " + "SELECT concat('Com_', variable_name), variable_value " . "FROM data_dictionary.GLOBAL_STATEMENTS", 0, 1, @@ -124,12 +123,12 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase $server_status ), ); - + $dbi->expects($this->any())->method('fetchResult') ->will($this->returnValueMap($fetchResult)); - + $GLOBALS['dbi'] = $dbi; - + $this->ServerStatusData = new PMA_ServerStatusData(); } @@ -140,7 +139,7 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHTMLForAdvisor() { - //Call the test function + //Call the test function $html = PMA_getHTMLForAdvisor(); //validate 1: Advisor Instructions @@ -161,14 +160,14 @@ class PMA_ServerStatusAdvisor_Test extends PHPUnit_Framework_TestCase 'Do note however that this system provides recommendations', $html ); - + //Advisor datas, we just validate that the Advisor Array is right //Advisor logic related with OS should be validate on class Advisor $this->assertContains( '
DescriptionFederated MySQL storage enginedummy commentLicenseplugin_name1HostServer_id1
'; $this->assertContains( @@ -202,7 +201,7 @@ class PMA_ServerStatus_Test extends PHPUnit_Framework_TestCase ''; +echo ''; +echo '
' . $bytes_sent . ' B', $html ); - + //validate 3: PMA_getHtmlForServerStateConnections $this->assertContains( '', diff --git a/test/libraries/PMA_server_status_variables_test.php b/test/libraries/PMA_server_status_variables_test.php index 88168d1ed6..6ccb65606d 100644 --- a/test/libraries/PMA_server_status_variables_test.php +++ b/test/libraries/PMA_server_status_variables_test.php @@ -47,7 +47,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase //$_REQUEST $_REQUEST['log'] = "index1"; $_REQUEST['pos'] = 3; - + //$GLOBALS $GLOBALS['cfg']['MaxRows'] = 10; $GLOBALS['cfg']['ServerDefault'] = "server"; @@ -55,19 +55,18 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; - $GLOBALS['cfg']['Server']['host'] = "localhost"; - $GLOBALS['cfg']['MySQLManualType'] = 'viewable'; + $GLOBALS['cfg']['Server']['host'] = "localhost"; + $GLOBALS['cfg']['MySQLManualType'] = 'viewable'; $GLOBALS['PMA_PHP_SELF'] = PMA_getenv('PHP_SELF'); $GLOBALS['server_master_status'] = false; $GLOBALS['server_slave_status'] = false; - + $GLOBALS['table'] = "table"; $GLOBALS['pmaThemeImage'] = 'image'; - + //$_SESSION $_SESSION['PMA_Theme'] = PMA_Theme::load('./themes/pmahomme'); $_SESSION['PMA_Theme'] = new PMA_Theme(); @@ -85,7 +84,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase "Com_create_function" => "0", "Com_empty_query" => "0", ); - + $server_variables= array( "auto_increment_increment" => "1", "auto_increment_offset" => "1", @@ -93,7 +92,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase "back_log" => "50", "big_tables" => "OFF", ); - + $fetchResult = array( array( "SHOW GLOBAL STATUS", @@ -112,7 +111,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase $server_variables ), array( - "SELECT concat('Com_', variable_name), variable_value " + "SELECT concat('Com_', variable_name), variable_value " . "FROM data_dictionary.GLOBAL_STATEMENTS", 0, 1, @@ -121,10 +120,10 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase $server_status ), ); - + $dbi->expects($this->any())->method('fetchResult') ->will($this->returnValueMap($fetchResult)); - + $GLOBALS['dbi'] = $dbi; $this->ServerStatusData = new PMA_ServerStatusData(); } @@ -136,7 +135,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHtmlForFilter() { - //Call the test function + //Call the test function $html = PMA_getHtmlForFilter($this->ServerStatusData); //validate 1: PMA_getHtmlForFilter @@ -175,7 +174,7 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHtmlForLinkSuggestions() { - //Call the test function + //Call the test function $html = PMA_getHtmlForLinkSuggestions($this->ServerStatusData); //validate 1: PMA_getHtmlForLinkSuggestions @@ -205,11 +204,11 @@ class PMA_ServerStatusVariables_Test extends PHPUnit_Framework_TestCase */ public function testPMAGetHtmlForVariablesList() { - //Call the test function + //Call the test function $html = PMA_getHtmlForVariablesList($this->ServerStatusData); //validate 1: PMA_getHtmlForVariablesList - $table = '
'; $this->assertContains( $table, diff --git a/test/libraries/PMA_server_variables_test.php b/test/libraries/PMA_server_variables_test.php index 9d8cca9e8a..92685177df 100644 --- a/test/libraries/PMA_server_variables_test.php +++ b/test/libraries/PMA_server_variables_test.php @@ -47,7 +47,6 @@ class PMA_ServerVariables_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['SQP'] = array(); $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] = 1000; $GLOBALS['cfg']['ShowSQL'] = true; - $GLOBALS['cfg']['SQP']['fmtType'] = 'none'; $GLOBALS['cfg']['TableNavigationLinksMode'] = 'icons'; $GLOBALS['cfg']['LimitChars'] = 100; $GLOBALS['cfg']['DBG']['sql'] = false; From 79c64a0b7be7bb0f08ba94573d0d54585895d2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:37:25 +0200 Subject: [PATCH 034/141] Fix syntax error --- libraries/Util.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 9f67134e31..9a92490dec 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -1022,7 +1022,7 @@ class PMA_Util if (null === $sql_query) { if (! empty($GLOBALS['display_query'])) { $sql_query = $GLOBALS['display_query']; - } elseif (! empty($GLOBALS['unparsed_sql']) { + } elseif (! empty($GLOBALS['unparsed_sql'])) { $sql_query = $GLOBALS['unparsed_sql']; } elseif (! empty($GLOBALS['sql_query'])) { $sql_query = $GLOBALS['sql_query']; From d9278f4a04cad0143ce87499d2e93084d3e28e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:38:45 +0200 Subject: [PATCH 035/141] Document dropping some of the configuration --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 79040de7b9..3cef5c9300 100644 --- a/ChangeLog +++ b/ChangeLog @@ -30,6 +30,7 @@ phpMyAdmin - ChangeLog - bug #4035 Query "inline" link disappears when turning off "Explain SQL" option + rfe #1385 Hide tables, functions, procedures, events and views in navigation tree + rfe #1321 Export view as if it was a table ++ Dropped configuration directive: SQP 4.0.6.0 (not yet released) - bug #4036 Call to undefined function mb_detect_encoding (clarify the doc) From 554d0fbb42360401067a403bedcb3db1cc5dbc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:43:23 +0200 Subject: [PATCH 036/141] Remove tests for removed methods --- test/classes/PMA_Theme_test.php | 56 --------------------------------- 1 file changed, 56 deletions(-) diff --git a/test/classes/PMA_Theme_test.php b/test/classes/PMA_Theme_test.php index 708cb690c8..f5f4d33b3c 100644 --- a/test/classes/PMA_Theme_test.php +++ b/test/classes/PMA_Theme_test.php @@ -345,61 +345,5 @@ background: -o-linear-gradient(top, #12345, #54321);' ); } - - /** - * Test for buildSQPCssRule - * - * @return void - */ - public function testBuildSQPCssRule() - { - $this->assertEquals( - $this->object->buildSQPCssRule('PMA_Config', 'fontSize', '12px'), - '.PMA_Config {fontSize: 12px;} -' - ); - } - - /** - * Test for buildSQPCssData - * - * @return void - */ - public function testBuildSQPCssData() - { - $this->assertEquals( - $this->object->buildSQPCssData(), - '.syntax_comment {color: #808000;} -.syntax_comment_mysql {} -.syntax_comment_ansi {} -.syntax_comment_c {} -.syntax_digit {} -.syntax_digit_hex {color: teal;} -.syntax_digit_integer {color: teal;} -.syntax_digit_float {color: aqua;} -.syntax_punct {color: fuchsia;} -.syntax_alpha {} -.syntax_alpha_columnType {color: #f90;} -.syntax_alpha_columnAttrib {color: #00f;} -.syntax_alpha_reservedWord {color: #909;} -.syntax_alpha_functionName {color: #f00;} -.syntax_alpha_identifier {color: black;} -.syntax_alpha_charset {color: #6495ed;} -.syntax_alpha_variable {color: #800000;} -.syntax_quote {color: #008000;} -.syntax_quote_double {} -.syntax_quote_single {} -.syntax_quote_backtick {} -.syntax_indent0 {margin-left: 0em;} -.syntax_indent1 {margin-left: 1em;} -.syntax_indent2 {margin-left: 2em;} -.syntax_indent3 {margin-left: 3em;} -.syntax_indent4 {margin-left: 4em;} -.syntax_indent5 {margin-left: 5em;} -.syntax_indent6 {margin-left: 6em;} -.syntax_indent7 {margin-left: 7em;} -' - ); - } } ?> From 0e96f7a8af4a99deed4df1d7f2fafa95c180fc1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:49:20 +0200 Subject: [PATCH 037/141] Always initialize variable --- libraries/sql_query_form.lib.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/sql_query_form.lib.php b/libraries/sql_query_form.lib.php index 66bbb6b182..8e1e70cc74 100644 --- a/libraries/sql_query_form.lib.php +++ b/libraries/sql_query_form.lib.php @@ -42,6 +42,7 @@ require_once './libraries/bookmark.lib.php'; // used for bookmarks */ function PMA_sqlQueryForm($query = true, $display_tab = false, $delimiter = ';') { + $html = ''; // check tab to display if inside querywindow if (! $display_tab) { $display_tab = 'full'; @@ -92,7 +93,7 @@ function PMA_sqlQueryForm($query = true, $display_tab = false, $delimiter = ';') return checkSqlQuery(this)"> ' . "\n"; } From 53230cba4392e1d7ac33df17159cb02fe92fa36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 13:51:30 +0200 Subject: [PATCH 038/141] Fix variable name --- libraries/DisplayResults.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/DisplayResults.class.php b/libraries/DisplayResults.class.php index 657ccf2255..f23f55e679 100644 --- a/libraries/DisplayResults.class.php +++ b/libraries/DisplayResults.class.php @@ -4874,7 +4874,7 @@ class PMA_DisplayResults $message->addMessage('('); if (!$message_view_warning) { - $message_total = PMA_Message::notice($precount . __('%d total')); + $message_total = PMA_Message::notice($pre_count . __('%d total')); $message_total->addParam($total); if (!empty($after_count)) { From f829c43c0602b1bbac0a2c1b95aacfab6a1e6cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 14:38:52 +0200 Subject: [PATCH 039/141] Coding style --- themes/svg_gradient.php | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/themes/svg_gradient.php b/themes/svg_gradient.php index cb1211af0a..7e49037293 100644 --- a/themes/svg_gradient.php +++ b/themes/svg_gradient.php @@ -7,7 +7,15 @@ header('Content-Type: image/svg+xml'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) . ' GMT'); -function get_color($get_name, $default) +/** + * Gets single color from GET parameters validating it. + * + * @param string $get_name Name of parameter in request + * @param string $default Default value + * + * @return string Color name or code. + */ +function PMA_gradientGetColor($get_name, $default) { // get color from GET args, only alphanumeric chcracters $opts = array('options' => array('regexp' => '/^[a-z0-9]+$/i')); @@ -17,13 +25,28 @@ function get_color($get_name, $default) } return $color ? $color : $default; } + +$from = PMA_gradientGetColor('from', 'white'); +$to = PMA_gradientGetColor('to', 'blank'); + +echo ''; ?> -' ?> - + - - + + From 1d12c885aab51f4e6e75adf2db8a4c48880a05ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 14:52:04 +0200 Subject: [PATCH 040/141] Ensure same sorting --- scripts/generate-sprites | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate-sprites b/scripts/generate-sprites index 1a011e09f3..3e69e558f5 100755 --- a/scripts/generate-sprites +++ b/scripts/generate-sprites @@ -40,7 +40,7 @@ if [ -d $1/themes ]; then cd "$d"img echo "Processing folder: $PWD" FILES='' - for f in $(ls *.png); do + for f in $(ls *.png| LC_ALL=C sort); do VALID=true # Do not include blacklisted icons for b in $BLACKLIST; do From adf5b3bb97f3d05e0d0ec259ad6080a5a3f781c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 14:57:25 +0200 Subject: [PATCH 041/141] Correctly format comments in generated file --- scripts/generate-sprites | 18 +- themes/original/img/sprites.png | Bin 19261 -> 19390 bytes themes/original/sprites.lib.php | 356 ++++++++++++++-------------- themes/pmahomme/img/sprites.png | Bin 40334 -> 40532 bytes themes/pmahomme/sprites.lib.php | 396 ++++++++++++++++---------------- 5 files changed, 400 insertions(+), 370 deletions(-) diff --git a/scripts/generate-sprites b/scripts/generate-sprites index 3e69e558f5..93320435d8 100755 --- a/scripts/generate-sprites +++ b/scripts/generate-sprites @@ -92,10 +92,20 @@ if [ -d $1/themes ]; then # Generate the library file that contains the information # about individual images that are part of the sprite - echo " $LIBRARY - echo "/* AUTOGENERATED CONTENT - DO NOT EDIT */" >> $LIBRARY - echo "/* ALL CHANGES WILL BE UNDONE */" >> $LIBRARY - echo "/* RUN './scripts/generate-sprites' TO UPDATE THIS FILE */" >> $LIBRARY + echo ' $LIBRARY + echo '/**' >> $LIBRARY + echo ' * AUTOGENERATED CONTENT - DO NOT EDIT!' >> $LIBRARY + echo ' * ALL CHANGES WILL BE UNDONE!' >> $LIBRARY + echo ' * RUN `./scripts/generate-sprites` TO UPDATE THIS FILE' >> $LIBRARY + echo ' *' >> $LIBRARY + echo ' * @package PhpMyAdmin-theme' >> $LIBRARY + echo ' */' >> $LIBRARY + echo '' >> $LIBRARY + echo '/**' >> $LIBRARY + echo ' * Returns map of sprites inside sprite.png' >> $LIBRARY + echo ' *' >> $LIBRARY + echo ' * @return array Data of sprites' >> $LIBRARY + echo ' */' >> $LIBRARY echo "function PMA_sprites()" >> $LIBRARY echo "{" >> $LIBRARY echo " return array(" >> $LIBRARY diff --git a/themes/original/img/sprites.png b/themes/original/img/sprites.png index 0ba09692431ab1a22e06ea19b2e85ddf133fdaf5..cf9cc30175deb199ea7a6de8be68955193e653a1 100644 GIT binary patch delta 19111 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 diff --git a/themes/original/sprites.lib.php b/themes/original/sprites.lib.php index eda977bae5..5ef135db43 100644 --- a/themes/original/sprites.lib.php +++ b/themes/original/sprites.lib.php @@ -1,7 +1,17 @@ '16', 'height' => '16' ), - 'bd_browse' => array( + 'b_dbstatistics' => array( 'position' => '8', 'width' => '16', 'height' => '16' ), - 'b_dbstatistics' => array( + 'b_deltbl' => array( 'position' => '9', 'width' => '16', 'height' => '16' ), - 'bd_deltbl' => array( + 'b_docs' => array( 'position' => '10', 'width' => '16', 'height' => '16' ), - 'bd_drop' => array( + 'b_drop' => array( 'position' => '11', 'width' => '16', 'height' => '16' ), - 'bd_edit' => array( + 'b_edit' => array( 'position' => '12', 'width' => '16', 'height' => '16' ), - 'b_deltbl' => array( + 'b_empty' => array( 'position' => '13', 'width' => '16', 'height' => '16' ), - 'bd_empty' => array( + 'b_engine' => array( 'position' => '14', 'width' => '16', 'height' => '16' ), - 'bd_export' => array( + 'b_event_add' => array( 'position' => '15', 'width' => '16', 'height' => '16' ), - 'bd_ftext' => array( + 'b_events' => array( 'position' => '16', 'width' => '16', 'height' => '16' ), - 'bd_index' => array( + 'b_export' => array( 'position' => '17', 'width' => '16', 'height' => '16' ), - 'bd_insrow' => array( + 'b_find_replace' => array( 'position' => '18', 'width' => '16', 'height' => '16' ), - 'bd_nextpage' => array( - 'position' => '19', - 'width' => '8', - 'height' => '13' - ), - 'b_docs' => array( - 'position' => '20', - 'width' => '16', - 'height' => '16' - ), - 'bd_primary' => array( - 'position' => '21', - 'width' => '16', - 'height' => '16' - ), - 'b_drop' => array( - 'position' => '22', - 'width' => '16', - 'height' => '16' - ), - 'bd_sbrowse' => array( - 'position' => '23', - 'width' => '10', - 'height' => '10' - ), - 'bd_select' => array( - 'position' => '24', - 'width' => '16', - 'height' => '16' - ), - 'bd_spatial' => array( - 'position' => '25', - 'width' => '16', - 'height' => '16' - ), - 'bd_unique' => array( - 'position' => '26', - 'width' => '16', - 'height' => '16' - ), - 'b_edit' => array( - 'position' => '27', - 'width' => '16', - 'height' => '16' - ), - 'b_empty' => array( - 'position' => '28', - 'width' => '16', - 'height' => '16' - ), - 'b_engine' => array( - 'position' => '29', - 'width' => '16', - 'height' => '16' - ), - 'b_event_add' => array( - 'position' => '30', - 'width' => '16', - 'height' => '16' - ), - 'b_events' => array( - 'position' => '31', - 'width' => '16', - 'height' => '16' - ), - 'b_export' => array( - 'position' => '32', - 'width' => '16', - 'height' => '16' - ), - 'b_find_replace' => array( - 'position' => '33', - 'width' => '16', - 'height' => '16' - ), 'b_ftext' => array( - 'position' => '34', + 'position' => '19', 'width' => '16', 'height' => '16' ), 'b_group' => array( - 'position' => '35', + 'position' => '20', 'width' => '16', 'height' => '16' ), 'b_help' => array( - 'position' => '36', + 'position' => '21', 'width' => '11', 'height' => '11' ), 'b_home' => array( - 'position' => '37', + 'position' => '22', 'width' => '16', 'height' => '16' ), 'b_import' => array( - 'position' => '38', - 'width' => '16', - 'height' => '16' - ), - 'b_index_add' => array( - 'position' => '39', + 'position' => '23', 'width' => '16', 'height' => '16' ), 'b_index' => array( - 'position' => '40', + 'position' => '24', + 'width' => '16', + 'height' => '16' + ), + 'b_index_add' => array( + 'position' => '25', 'width' => '16', 'height' => '16' ), 'b_info' => array( - 'position' => '41', + 'position' => '26', 'width' => '11', 'height' => '11' ), 'b_inline_edit' => array( - 'position' => '42', + 'position' => '27', 'width' => '16', 'height' => '16' ), 'b_insrow' => array( - 'position' => '43', + 'position' => '28', 'width' => '16', 'height' => '16' ), 'b_minus' => array( - 'position' => '44', + 'position' => '29', 'width' => '9', 'height' => '9' ), 'b_more' => array( - 'position' => '45', + 'position' => '30', 'width' => '16', 'height' => '16' ), 'b_move' => array( - 'position' => '46', + 'position' => '31', 'width' => '16', 'height' => '16' ), 'b_newdb' => array( - 'position' => '47', + 'position' => '32', 'width' => '16', 'height' => '16' ), 'b_newtbl' => array( - 'position' => '48', + 'position' => '33', 'width' => '16', 'height' => '16' ), 'b_nextpage' => array( - 'position' => '49', + 'position' => '34', 'width' => '16', 'height' => '16' ), 'b_plus' => array( - 'position' => '50', + 'position' => '35', 'width' => '9', 'height' => '9' ), 'b_primary' => array( - 'position' => '51', + 'position' => '36', 'width' => '16', 'height' => '16' ), 'b_print' => array( - 'position' => '52', + 'position' => '37', 'width' => '16', 'height' => '16' ), 'b_props' => array( - 'position' => '53', + 'position' => '38', 'width' => '16', 'height' => '16' ), 'b_relations' => array( - 'position' => '54', + 'position' => '39', 'width' => '16', 'height' => '16' ), 'b_routine_add' => array( - 'position' => '55', + 'position' => '40', 'width' => '16', 'height' => '16' ), 'b_routines' => array( - 'position' => '56', + 'position' => '41', 'width' => '16', 'height' => '16' ), 'b_save' => array( - 'position' => '57', + 'position' => '42', 'width' => '16', 'height' => '16' ), 'b_sbrowse' => array( - 'position' => '58', + 'position' => '43', 'width' => '10', 'height' => '10' ), 'b_search' => array( - 'position' => '59', + 'position' => '44', 'width' => '16', 'height' => '16' ), 'b_selboard' => array( - 'position' => '60', + 'position' => '45', 'width' => '16', 'height' => '16' ), 'b_select' => array( - 'position' => '61', + 'position' => '46', 'width' => '16', 'height' => '16' ), 'b_snewtbl' => array( - 'position' => '62', + 'position' => '47', 'width' => '10', 'height' => '10' ), 'b_spatial' => array( - 'position' => '63', - 'width' => '16', - 'height' => '16' - ), - 'b_sqlhelp' => array( - 'position' => '64', + 'position' => '48', 'width' => '16', 'height' => '16' ), 'b_sql' => array( - 'position' => '65', + 'position' => '49', + 'width' => '16', + 'height' => '16' + ), + 'b_sqlhelp' => array( + 'position' => '50', 'width' => '16', 'height' => '16' ), 'b_table_add' => array( - 'position' => '66', + 'position' => '51', 'width' => '16', 'height' => '16' ), 'b_tblanalyse' => array( - 'position' => '67', + 'position' => '52', 'width' => '16', 'height' => '16' ), 'b_tblexport' => array( - 'position' => '68', + 'position' => '53', 'width' => '16', 'height' => '16' ), 'b_tblimport' => array( - 'position' => '69', + 'position' => '54', 'width' => '16', 'height' => '16' ), 'b_tblops' => array( - 'position' => '70', + 'position' => '55', 'width' => '16', 'height' => '16' ), 'b_tbloptimize' => array( - 'position' => '71', + 'position' => '56', 'width' => '16', 'height' => '16' ), 'b_tipp' => array( - 'position' => '72', + 'position' => '57', 'width' => '16', 'height' => '16' ), 'b_trigger_add' => array( - 'position' => '73', + 'position' => '58', 'width' => '16', 'height' => '16' ), 'b_triggers' => array( - 'position' => '74', + 'position' => '59', 'width' => '16', 'height' => '16' ), 'b_undo' => array( - 'position' => '75', + 'position' => '60', 'width' => '16', 'height' => '16' ), 'b_unique' => array( - 'position' => '76', + 'position' => '61', 'width' => '16', 'height' => '16' ), 'b_usradd' => array( - 'position' => '77', + 'position' => '62', 'width' => '16', 'height' => '16' ), 'b_usrcheck' => array( - 'position' => '78', + 'position' => '63', 'width' => '16', 'height' => '16' ), 'b_usrdrop' => array( - 'position' => '79', + 'position' => '64', 'width' => '16', 'height' => '16' ), 'b_usredit' => array( - 'position' => '80', + 'position' => '65', 'width' => '16', 'height' => '16' ), 'b_usrlist' => array( - 'position' => '81', - 'width' => '16', - 'height' => '16' - ), - 'b_view_add' => array( - 'position' => '82', + 'position' => '66', 'width' => '16', 'height' => '16' ), 'b_view' => array( - 'position' => '83', + 'position' => '67', + 'width' => '16', + 'height' => '16' + ), + 'b_view_add' => array( + 'position' => '68', 'width' => '16', 'height' => '16' ), 'b_views' => array( + 'position' => '69', + 'width' => '16', + 'height' => '16' + ), + 'bd_browse' => array( + 'position' => '70', + 'width' => '16', + 'height' => '16' + ), + 'bd_deltbl' => array( + 'position' => '71', + 'width' => '16', + 'height' => '16' + ), + 'bd_drop' => array( + 'position' => '72', + 'width' => '16', + 'height' => '16' + ), + 'bd_edit' => array( + 'position' => '73', + 'width' => '16', + 'height' => '16' + ), + 'bd_empty' => array( + 'position' => '74', + 'width' => '16', + 'height' => '16' + ), + 'bd_export' => array( + 'position' => '75', + 'width' => '16', + 'height' => '16' + ), + 'bd_ftext' => array( + 'position' => '76', + 'width' => '16', + 'height' => '16' + ), + 'bd_index' => array( + 'position' => '77', + 'width' => '16', + 'height' => '16' + ), + 'bd_insrow' => array( + 'position' => '78', + 'width' => '16', + 'height' => '16' + ), + 'bd_nextpage' => array( + 'position' => '79', + 'width' => '8', + 'height' => '13' + ), + 'bd_primary' => array( + 'position' => '80', + 'width' => '16', + 'height' => '16' + ), + 'bd_sbrowse' => array( + 'position' => '81', + 'width' => '10', + 'height' => '10' + ), + 'bd_select' => array( + 'position' => '82', + 'width' => '16', + 'height' => '16' + ), + 'bd_spatial' => array( + 'position' => '83', + 'width' => '16', + 'height' => '16' + ), + 'bd_unique' => array( 'position' => '84', 'width' => '16', 'height' => '16' @@ -430,12 +440,12 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 'eye_grey' => array( + 'eye' => array( 'position' => '86', 'width' => '16', 'height' => '16' ), - 'eye' => array( + 'eye_grey' => array( 'position' => '87', 'width' => '16', 'height' => '16' @@ -445,42 +455,42 @@ function PMA_sprites() 'width' => '13', 'height' => '16' ), - 'new_data_hovered' => array( + 'new_data' => array( 'position' => '89', 'width' => '16', 'height' => '16' ), - 'new_data' => array( + 'new_data_hovered' => array( 'position' => '90', 'width' => '16', 'height' => '16' ), - 'new_data_selected_hovered' => array( + 'new_data_selected' => array( 'position' => '91', 'width' => '16', 'height' => '16' ), - 'new_data_selected' => array( + 'new_data_selected_hovered' => array( 'position' => '92', 'width' => '16', 'height' => '16' ), - 'new_struct_hovered' => array( + 'new_struct' => array( 'position' => '93', 'width' => '16', 'height' => '16' ), - 'new_struct' => array( + 'new_struct_hovered' => array( 'position' => '94', 'width' => '16', 'height' => '16' ), - 'new_struct_selected_hovered' => array( + 'new_struct_selected' => array( 'position' => '95', 'width' => '16', 'height' => '16' ), - 'new_struct_selected' => array( + 'new_struct_selected_hovered' => array( 'position' => '96', 'width' => '16', 'height' => '16' @@ -495,16 +505,16 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 's_asci' => array( - 'position' => '99', - 'width' => '16', - 'height' => '16' - ), 's_asc' => array( - 'position' => '100', + 'position' => '99', 'width' => '11', 'height' => '9' ), + 's_asci' => array( + 'position' => '100', + 'width' => '16', + 'height' => '16' + ), 's_cancel' => array( 'position' => '101', 'width' => '16', @@ -525,16 +535,16 @@ function PMA_sprites() 'width' => '11', 'height' => '9' ), - 's_error2' => array( - 'position' => '105', - 'width' => '11', - 'height' => '11' - ), 's_error' => array( - 'position' => '106', + 'position' => '105', 'width' => '16', 'height' => '16' ), + 's_error2' => array( + 'position' => '106', + 'width' => '11', + 'height' => '11' + ), 's_host' => array( 'position' => '107', 'width' => '16', diff --git a/themes/pmahomme/img/sprites.png b/themes/pmahomme/img/sprites.png index 2835f236858e6bc582b4f68e83d253fa1b034995..e2cd2b30162d0dfedbe8feefb29f2aef96ddacb2 100644 GIT binary patch literal 40532 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 b%JlyL;mkBW-4&ni00000NkvXXu0mjfw>T^o literal 40334 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%0A2z4!VQcZ*@SoCUoZab%9 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 diff --git a/themes/pmahomme/sprites.lib.php b/themes/pmahomme/sprites.lib.php index da85bbdf97..b15a23b979 100644 --- a/themes/pmahomme/sprites.lib.php +++ b/themes/pmahomme/sprites.lib.php @@ -1,7 +1,17 @@ '16', 'height' => '16' ), - 'bd_browse' => array( + 'b_dbstatistics' => array( 'position' => '9', 'width' => '16', 'height' => '16' ), - 'b_dbstatistics' => array( + 'b_deltbl' => array( 'position' => '10', 'width' => '16', 'height' => '16' ), - 'bd_deltbl' => array( + 'b_docs' => array( 'position' => '11', 'width' => '16', 'height' => '16' ), - 'bd_drop' => array( + 'b_docsql' => array( 'position' => '12', 'width' => '16', 'height' => '16' ), - 'bd_edit' => array( + 'b_drop' => array( 'position' => '13', 'width' => '16', 'height' => '16' ), - 'b_deltbl' => array( + 'b_edit' => array( 'position' => '14', 'width' => '16', 'height' => '16' ), - 'bd_empty' => array( + 'b_empty' => array( 'position' => '15', 'width' => '16', 'height' => '16' ), - 'bd_export' => array( + 'b_engine' => array( 'position' => '16', 'width' => '16', 'height' => '16' ), - 'bd_firstpage' => array( + 'b_event_add' => array( 'position' => '17', 'width' => '16', 'height' => '16' ), - 'bd_ftext' => array( + 'b_events' => array( 'position' => '18', 'width' => '16', 'height' => '16' ), - 'bd_index' => array( + 'b_export' => array( 'position' => '19', 'width' => '16', 'height' => '16' ), - 'bd_insrow' => array( + 'b_find_replace' => array( 'position' => '20', 'width' => '16', 'height' => '16' ), - 'bd_lastpage' => array( + 'b_firstpage' => array( 'position' => '21', 'width' => '16', 'height' => '16' ), - 'bd_nextpage' => array( + 'b_ftext' => array( 'position' => '22', 'width' => '16', 'height' => '16' ), - 'b_docs' => array( + 'b_group' => array( 'position' => '23', 'width' => '16', 'height' => '16' ), - 'b_docsql' => array( + 'b_help' => array( 'position' => '24', 'width' => '16', 'height' => '16' ), - 'bd_prevpage' => array( + 'b_home' => array( 'position' => '25', 'width' => '16', 'height' => '16' ), - 'bd_primary' => array( + 'b_import' => array( 'position' => '26', 'width' => '16', 'height' => '16' ), - 'b_drop' => array( + 'b_index' => array( 'position' => '27', 'width' => '16', 'height' => '16' ), - 'bd_sbrowse' => array( + 'b_index_add' => array( 'position' => '28', 'width' => '16', 'height' => '16' ), - 'bd_select' => array( - 'position' => '29', - 'width' => '16', - 'height' => '16' - ), - 'bd_spatial' => array( - 'position' => '30', - 'width' => '16', - 'height' => '16' - ), - 'bd_unique' => array( - 'position' => '31', - 'width' => '16', - 'height' => '16' - ), - 'b_edit' => array( - 'position' => '32', - 'width' => '16', - 'height' => '16' - ), - 'b_empty' => array( - 'position' => '33', - 'width' => '16', - 'height' => '16' - ), - 'b_engine' => array( - 'position' => '34', - 'width' => '16', - 'height' => '16' - ), - 'b_event_add' => array( - 'position' => '35', - 'width' => '16', - 'height' => '16' - ), - 'b_events' => array( - 'position' => '36', - 'width' => '16', - 'height' => '16' - ), - 'b_export' => array( - 'position' => '37', - 'width' => '16', - 'height' => '16' - ), - 'b_find_replace' => array( - 'position' => '38', - 'width' => '16', - 'height' => '16' - ), - 'b_firstpage' => array( - 'position' => '39', - 'width' => '16', - 'height' => '16' - ), - 'b_ftext' => array( - 'position' => '40', - 'width' => '16', - 'height' => '16' - ), - 'b_group' => array( - 'position' => '41', - 'width' => '16', - 'height' => '16' - ), - 'b_help' => array( - 'position' => '42', - 'width' => '16', - 'height' => '16' - ), - 'b_home' => array( - 'position' => '43', - 'width' => '16', - 'height' => '16' - ), - 'b_import' => array( - 'position' => '44', - 'width' => '16', - 'height' => '16' - ), - 'b_index_add' => array( - 'position' => '45', - 'width' => '16', - 'height' => '16' - ), - 'b_index' => array( - 'position' => '46', - 'width' => '16', - 'height' => '16' - ), 'b_info' => array( - 'position' => '47', + 'position' => '29', 'width' => '11', 'height' => '11' ), 'b_inline_edit' => array( - 'position' => '48', + 'position' => '30', 'width' => '16', 'height' => '16' ), 'b_insrow' => array( - 'position' => '49', + 'position' => '31', 'width' => '16', 'height' => '16' ), 'b_lastpage' => array( - 'position' => '50', + 'position' => '32', 'width' => '16', 'height' => '16' ), 'b_minus' => array( - 'position' => '51', + 'position' => '33', 'width' => '16', 'height' => '16' ), 'b_more' => array( - 'position' => '52', + 'position' => '34', 'width' => '16', 'height' => '16' ), 'b_move' => array( - 'position' => '53', + 'position' => '35', 'width' => '16', 'height' => '16' ), 'b_newdb' => array( - 'position' => '54', + 'position' => '36', 'width' => '16', 'height' => '16' ), 'b_newtbl' => array( - 'position' => '55', + 'position' => '37', 'width' => '16', 'height' => '16' ), 'b_nextpage' => array( - 'position' => '56', + 'position' => '38', 'width' => '16', 'height' => '16' ), 'b_pdfdoc' => array( - 'position' => '57', + 'position' => '39', 'width' => '16', 'height' => '16' ), 'b_plus' => array( - 'position' => '58', + 'position' => '40', 'width' => '16', 'height' => '16' ), 'b_prevpage' => array( - 'position' => '59', + 'position' => '41', 'width' => '16', 'height' => '16' ), 'b_primary' => array( - 'position' => '60', + 'position' => '42', 'width' => '16', 'height' => '16' ), 'b_print' => array( - 'position' => '61', + 'position' => '43', 'width' => '16', 'height' => '16' ), 'b_props' => array( - 'position' => '62', + 'position' => '44', 'width' => '16', 'height' => '16' ), 'b_relations' => array( - 'position' => '63', + 'position' => '45', 'width' => '16', 'height' => '16' ), 'b_routine_add' => array( - 'position' => '64', + 'position' => '46', 'width' => '16', 'height' => '16' ), 'b_routines' => array( - 'position' => '65', + 'position' => '47', 'width' => '16', 'height' => '16' ), 'b_save' => array( - 'position' => '66', + 'position' => '48', 'width' => '16', 'height' => '16' ), 'b_sbrowse' => array( - 'position' => '67', + 'position' => '49', 'width' => '16', 'height' => '16' ), 'b_sdb' => array( - 'position' => '68', + 'position' => '50', 'width' => '10', 'height' => '10' ), 'b_search' => array( - 'position' => '69', + 'position' => '51', 'width' => '16', 'height' => '16' ), 'b_selboard' => array( - 'position' => '70', + 'position' => '52', 'width' => '16', 'height' => '16' ), 'b_select' => array( - 'position' => '71', + 'position' => '53', 'width' => '16', 'height' => '16' ), 'b_snewtbl' => array( - 'position' => '72', + 'position' => '54', 'width' => '16', 'height' => '16' ), 'b_spatial' => array( - 'position' => '73', - 'width' => '16', - 'height' => '16' - ), - 'b_sqldoc' => array( - 'position' => '74', - 'width' => '16', - 'height' => '16' - ), - 'b_sqlhelp' => array( - 'position' => '75', + 'position' => '55', 'width' => '16', 'height' => '16' ), 'b_sql' => array( - 'position' => '76', + 'position' => '56', + 'width' => '16', + 'height' => '16' + ), + 'b_sqldoc' => array( + 'position' => '57', + 'width' => '16', + 'height' => '16' + ), + 'b_sqlhelp' => array( + 'position' => '58', 'width' => '16', 'height' => '16' ), 'b_table_add' => array( - 'position' => '77', + 'position' => '59', 'width' => '16', 'height' => '16' ), 'b_tblanalyse' => array( - 'position' => '78', + 'position' => '60', 'width' => '16', 'height' => '16' ), 'b_tblexport' => array( - 'position' => '79', + 'position' => '61', 'width' => '16', 'height' => '16' ), 'b_tblimport' => array( - 'position' => '80', + 'position' => '62', 'width' => '16', 'height' => '16' ), 'b_tblops' => array( - 'position' => '81', + 'position' => '63', 'width' => '16', 'height' => '16' ), 'b_tbloptimize' => array( - 'position' => '82', + 'position' => '64', 'width' => '16', 'height' => '16' ), 'b_tipp' => array( - 'position' => '83', + 'position' => '65', 'width' => '16', 'height' => '16' ), 'b_trigger_add' => array( - 'position' => '84', + 'position' => '66', 'width' => '16', 'height' => '16' ), 'b_triggers' => array( - 'position' => '85', + 'position' => '67', 'width' => '16', 'height' => '16' ), 'b_undo' => array( - 'position' => '86', + 'position' => '68', 'width' => '16', 'height' => '16' ), 'b_unique' => array( - 'position' => '87', + 'position' => '69', 'width' => '16', 'height' => '16' ), 'b_usradd' => array( - 'position' => '88', + 'position' => '70', 'width' => '16', 'height' => '16' ), 'b_usrcheck' => array( - 'position' => '89', + 'position' => '71', 'width' => '16', 'height' => '16' ), 'b_usrdrop' => array( - 'position' => '90', + 'position' => '72', 'width' => '16', 'height' => '16' ), 'b_usredit' => array( - 'position' => '91', + 'position' => '73', 'width' => '16', 'height' => '16' ), 'b_usrlist' => array( - 'position' => '92', - 'width' => '16', - 'height' => '16' - ), - 'b_view_add' => array( - 'position' => '93', + 'position' => '74', 'width' => '16', 'height' => '16' ), 'b_view' => array( - 'position' => '94', + 'position' => '75', + 'width' => '16', + 'height' => '16' + ), + 'b_view_add' => array( + 'position' => '76', 'width' => '16', 'height' => '16' ), 'b_views' => array( + 'position' => '77', + 'width' => '16', + 'height' => '16' + ), + 'bd_browse' => array( + 'position' => '78', + 'width' => '16', + 'height' => '16' + ), + 'bd_deltbl' => array( + 'position' => '79', + 'width' => '16', + 'height' => '16' + ), + 'bd_drop' => array( + 'position' => '80', + 'width' => '16', + 'height' => '16' + ), + 'bd_edit' => array( + 'position' => '81', + 'width' => '16', + 'height' => '16' + ), + 'bd_empty' => array( + 'position' => '82', + 'width' => '16', + 'height' => '16' + ), + 'bd_export' => array( + 'position' => '83', + 'width' => '16', + 'height' => '16' + ), + 'bd_firstpage' => array( + 'position' => '84', + 'width' => '16', + 'height' => '16' + ), + 'bd_ftext' => array( + 'position' => '85', + 'width' => '16', + 'height' => '16' + ), + 'bd_index' => array( + 'position' => '86', + 'width' => '16', + 'height' => '16' + ), + 'bd_insrow' => array( + 'position' => '87', + 'width' => '16', + 'height' => '16' + ), + 'bd_lastpage' => array( + 'position' => '88', + 'width' => '16', + 'height' => '16' + ), + 'bd_nextpage' => array( + 'position' => '89', + 'width' => '16', + 'height' => '16' + ), + 'bd_prevpage' => array( + 'position' => '90', + 'width' => '16', + 'height' => '16' + ), + 'bd_primary' => array( + 'position' => '91', + 'width' => '16', + 'height' => '16' + ), + 'bd_sbrowse' => array( + 'position' => '92', + 'width' => '16', + 'height' => '16' + ), + 'bd_select' => array( + 'position' => '93', + 'width' => '16', + 'height' => '16' + ), + 'bd_spatial' => array( + 'position' => '94', + 'width' => '16', + 'height' => '16' + ), + 'bd_unique' => array( 'position' => '95', 'width' => '16', 'height' => '16' @@ -490,12 +500,12 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 'eye_grey' => array( + 'eye' => array( 'position' => '98', 'width' => '16', 'height' => '16' ), - 'eye' => array( + 'eye_grey' => array( 'position' => '99', 'width' => '16', 'height' => '16' @@ -510,42 +520,42 @@ function PMA_sprites() 'width' => '13', 'height' => '16' ), - 'new_data_hovered' => array( + 'new_data' => array( 'position' => '102', 'width' => '16', 'height' => '16' ), - 'new_data' => array( + 'new_data_hovered' => array( 'position' => '103', 'width' => '16', 'height' => '16' ), - 'new_data_selected_hovered' => array( + 'new_data_selected' => array( 'position' => '104', 'width' => '16', 'height' => '16' ), - 'new_data_selected' => array( + 'new_data_selected_hovered' => array( 'position' => '105', 'width' => '16', 'height' => '16' ), - 'new_struct_hovered' => array( + 'new_struct' => array( 'position' => '106', 'width' => '16', 'height' => '16' ), - 'new_struct' => array( + 'new_struct_hovered' => array( 'position' => '107', 'width' => '16', 'height' => '16' ), - 'new_struct_selected_hovered' => array( + 'new_struct_selected' => array( 'position' => '108', 'width' => '16', 'height' => '16' ), - 'new_struct_selected' => array( + 'new_struct_selected_hovered' => array( 'position' => '109', 'width' => '16', 'height' => '16' @@ -565,12 +575,12 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 's_asci' => array( + 's_asc' => array( 'position' => '113', 'width' => '16', 'height' => '16' ), - 's_asc' => array( + 's_asci' => array( 'position' => '114', 'width' => '16', 'height' => '16' @@ -580,12 +590,12 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 's_cancel2' => array( + 's_cancel' => array( 'position' => '116', 'width' => '16', 'height' => '16' ), - 's_cancel' => array( + 's_cancel2' => array( 'position' => '117', 'width' => '16', 'height' => '16' @@ -605,16 +615,16 @@ function PMA_sprites() 'width' => '16', 'height' => '16' ), - 's_error2' => array( - 'position' => '121', - 'width' => '11', - 'height' => '11' - ), 's_error' => array( - 'position' => '122', + 'position' => '121', 'width' => '16', 'height' => '16' ), + 's_error2' => array( + 'position' => '122', + 'width' => '11', + 'height' => '11' + ), 's_host' => array( 'position' => '123', 'width' => '16', From dba4f079148ab1fe3446622f345954a47fa8cb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 15:01:16 +0200 Subject: [PATCH 042/141] Add missing docs --- libraries/Theme_Manager.class.php | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/libraries/Theme_Manager.class.php b/libraries/Theme_Manager.class.php index 66c9150cb9..cb16164b6a 100644 --- a/libraries/Theme_Manager.class.php +++ b/libraries/Theme_Manager.class.php @@ -1,6 +1,7 @@ getThemesPath(), + 'phpMyAdmin-ERROR: cannot open themes folder: ' + . $this->getThemesPath(), E_USER_WARNING ); return false; @@ -359,16 +365,19 @@ class PMA_Theme_Manager } $theme_preview_path= './themes.php'; - $theme_preview_href = ''; + $theme_preview_href = ''; $select_box .= $theme_preview_href . __('Theme:') . '' . "\n"; - $select_box .= ''; foreach ($this->themes as $each_theme_id => $each_theme) { $select_box .= ''; + $select_box .= '>' . htmlspecialchars($each_theme->getName()) + . ''; } $select_box .= ''; From ee4a97ede0223d2d36bd35c21729865e575736bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 15:02:08 +0200 Subject: [PATCH 043/141] Wrap long condition --- libraries/Table.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/Table.class.php b/libraries/Table.class.php index 6f00ca2f27..9f946cb48e 100644 --- a/libraries/Table.class.php +++ b/libraries/Table.class.php @@ -593,7 +593,9 @@ class PMA_Table // Make an exception for views in I_S and D_D schema in // Drizzle, as these map to in-memory data and should execute // fast enough - if (! $is_view || (PMA_DRIZZLE && $GLOBALS['dbi']->isSystemSchema($db))) { + if (! $is_view + || (PMA_DRIZZLE && $GLOBALS['dbi']->isSystemSchema($db)) + ) { $row_count = $GLOBALS['dbi']->fetchValue( 'SELECT COUNT(*) FROM ' . PMA_Util::backquote($db) . '.' . PMA_Util::backquote($table) From 15c3fee596a915c3260dd08a9b408dd4d18cf545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 15:03:33 +0200 Subject: [PATCH 044/141] Document file --- libraries/special_schema_links.lib.php | 49 +++++++++++++------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/libraries/special_schema_links.lib.php b/libraries/special_schema_links.lib.php index d012f4b225..36d747e26e 100644 --- a/libraries/special_schema_links.lib.php +++ b/libraries/special_schema_links.lib.php @@ -1,6 +1,7 @@ 'hostname', * // Column name related to url param - * 'column_name' => 'host' + * 'column_name' => 'host' * ) * ), * // Page to link @@ -41,7 +42,7 @@ if (! defined('PHPMYADMIN')) { * ) * ) * ); - * + * */ $GLOBALS['special_schema_links'] = array( 'mysql' => array( @@ -55,7 +56,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'hostname', - 'column_name' => 'host' + 'column_name' => 'host' ) ), 'default_page' => 'server_privileges.php' @@ -74,7 +75,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'hostname', - 'column_name' => 'host' + 'column_name' => 'host' ) ), 'default_page' => 'server_privileges.php' @@ -103,11 +104,11 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ), 1 => array( 'param_info' => 'table', - 'column_name' => 'table_name' + 'column_name' => 'table_name' ) ), 'default_page' => 'index.php' @@ -119,7 +120,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'constraint_schema' + 'column_name' => 'constraint_schema' ) ), 'default_page' => 'index.php' @@ -133,11 +134,11 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ), 1 => array( 'param_info' => 'table', - 'column_name' => 'table_name' + 'column_name' => 'table_name' ) ), 'default_page' => 'index.php' @@ -151,7 +152,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'referenced_table_schema' + 'column_name' => 'referenced_table_schema' ) ), 'default_page' => 'index.php' @@ -165,11 +166,11 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'referenced_table_schema' + 'column_name' => 'referenced_table_schema' ), 1 => array( 'param_info' => 'table', - 'column_name' => 'referenced_table_name' + 'column_name' => 'referenced_table_name' ) ), 'default_page' => 'index.php' @@ -185,7 +186,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ) ), 'default_page' => 'index.php' @@ -201,7 +202,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'hostname', - 'column_name' => 'host' + 'column_name' => 'host' ) ), 'default_page' => 'server_privileges.php' @@ -221,7 +222,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'constraint_schema' + 'column_name' => 'constraint_schema' ) ), 'default_page' => 'index.php' @@ -231,11 +232,11 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'constraint_schema' + 'column_name' => 'constraint_schema' ) ), 'default_page' => 'index.php' - ) + ) ), 'routines' => array( 'routine_name' => array( @@ -243,7 +244,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'routine_schema' + 'column_name' => 'routine_schema' ), 1 => array( 'param_info' => 'item_type', @@ -269,7 +270,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ) ), 'default_page' => 'index.php' @@ -283,11 +284,11 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ), 1 => array( 'param_info' => 'table', - 'column_name' => 'table_name' + 'column_name' => 'table_name' ) ), 'default_page' => 'index.php' @@ -299,7 +300,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ) ), 'default_page' => 'index.php' @@ -311,7 +312,7 @@ $GLOBALS['special_schema_links'] = array( 'link_dependancy_params' => array( 0 => array( 'param_info' => 'db', - 'column_name' => 'table_schema' + 'column_name' => 'table_schema' ) ), 'default_page' => 'index.php' From 46fe6a0f3d8e1942158b8acac6e7a7a495b9c23f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Tue, 6 Aug 2013 15:04:17 +0200 Subject: [PATCH 045/141] Wrap long lines --- libraries/select_server.lib.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/select_server.lib.php b/libraries/select_server.lib.php index adf52fb319..b6fdff02a8 100644 --- a/libraries/select_server.lib.php +++ b/libraries/select_server.lib.php @@ -30,13 +30,15 @@ function PMA_selectServer($not_only_options, $ommit_fieldset) } if ($not_only_options) { - $retval .= ''; + $retval .= ''; $retval .= PMA_generate_common_hidden_inputs(); if (! $ommit_fieldset) { $retval .= '
'; } - $retval .= ' '; + $retval .= ' '; $retval .= ''; $html .= '
'; - $html .= ''; - + $html .= ''; + } else { $html = null; } - + return $html; } @@ -1029,7 +1025,7 @@ function PMA_addBookmark($pmaAbsoluteUri, $goto) } else { // go back to sql.php to redisplay query; do not use & in this case: /** - * @todo In which scenario does this happen? + * @todo In which scenario does this happen? */ PMA_sendHeaderLocation( $pmaAbsoluteUri . $goto @@ -1332,7 +1328,7 @@ function PMA_hasCurrentDbChanged($db) * @param String $dropped_column dropped column if any * @param bool $purge whether purge set or not * @param array $extra_data extra data - * + * * @return array $extra_data */ function PMA_cleanupRelations($db, $table, $dropped_column, $purge, $extra_data) @@ -1471,7 +1467,7 @@ function PMA_countQueryResults( /** * Function to handle all aspects relating to executing the query - * + * * @param array $analyzed_sql_results analyzed sql results * @param String $full_sql_query full sql query * @param boolean $is_gotofile whether to go to a file @@ -1480,7 +1476,7 @@ function PMA_countQueryResults( * @param boolean $find_real_end whether to find the real end * @param String $import_text sql command * @param array $extra_data extra data - * + * * @return mixed */ function PMA_executeTheQuery($analyzed_sql_results, $full_sql_query, $is_gotofile, @@ -1738,9 +1734,9 @@ function PMA_sendQueryResponseForNoResultsReturned($analyzed_sql_results, $db, /** * Function to send response for ajax grid edit - * + * * @param object $result result of the executed query - * + * * @return void */ function PMA_sendResponseForGridEdit($result) @@ -1753,7 +1749,7 @@ function PMA_sendResponseForGridEdit($result) /** * Function to get html for the sql query results div - * + * * @param string $previous_update_query_html html for the previously executed query * @param string $profiling_chart_html html for profiling * @param object $missing_unique_column_msg message for the missing unique column @@ -1763,7 +1759,7 @@ function PMA_sendResponseForGridEdit($result) * @param string $indexes_problems_html html for displaying errors in indexes * @param string $bookmark_support_html html for displaying bookmark form * @param string $print_button_html html for the print button in printview - * + * * @return string $html_output */ function PMA_getHtmlForSqlQueryResults($previous_update_query_html, @@ -1784,14 +1780,14 @@ function PMA_getHtmlForSqlQueryResults($previous_update_query_html, $html_output .= isset($bookmark_support_html) ? $bookmark_support_html : ''; $html_output .= isset($print_button_html) ? $print_button_html : ''; $html_output .= ''; // end sqlqueryresults div - + return $html_output; } /** * Returns a message for successful creation of a bookmark or null if a bookmark * was not created - * + * * @return object $bookmark_created_msg */ function PMA_getBookmarkCreatedMessage() @@ -1802,13 +1798,13 @@ function PMA_getBookmarkCreatedMessage() } else { $bookmark_created_msg = null; } - + return $bookmark_created_msg; } /** * Function to get html for the sql query results table - * + * * @param array $sql_data sql data * @param object $displayResultsObject instance of DisplayResult.class * @param string $db current database @@ -1823,7 +1819,7 @@ function PMA_getBookmarkCreatedMessage() * @param bool $showtable whether to show table or not * @param object $result result of the executed query * @param array $analyzed_sql_results analyzed sql results - * + * * @return type */ function PMA_getHtmlForSqlQueryResultsTable($sql_data, $displayResultsObject, $db, @@ -1832,7 +1828,7 @@ function PMA_getHtmlForSqlQueryResultsTable($sql_data, $displayResultsObject, $d $analyzed_sql_results ) { $printview = isset($_REQUEST['printview']) ? $_REQUEST['printview'] : null; - if (! empty($sql_data) && ($sql_data['valid_queries'] > 1) + if (! empty($sql_data) && ($sql_data['valid_queries'] > 1) || $analyzed_sql_results['is_procedure'] ) { $_SESSION['is_multi_query'] = true; @@ -1862,19 +1858,19 @@ function PMA_getHtmlForSqlQueryResultsTable($sql_data, $displayResultsObject, $d ); $GLOBALS['dbi']->freeResult($result); } - + return $table_html; } /** * Function to get html for the previous query if there is such. If not will return * null - * + * * @param string $disp_query display query * @param bool $showSql whether to show sql * @param array $sql_data sql data * @param string $disp_message display message - * + * * @return string $previous_update_query_html */ function PMA_getHtmlForPreviousUpdateQuery($disp_query, $showSql, $sql_data, @@ -1888,18 +1884,18 @@ function PMA_getHtmlForPreviousUpdateQuery($disp_query, $showSql, $sql_data, } else { $previous_update_query_html = null; } - + return $previous_update_query_html; } /** * To get the message if a column index is missing. If not will return null - * + * * @param string $table current table * @param string $db current database * @param boolean $editable whether the results table can be editable or not * @param string $disp_mode display mode - * + * * @return object $message */ function PMA_getMessageIfMissingColumnIndex($table, $db, $editable, $disp_mode) @@ -1916,20 +1912,20 @@ function PMA_getMessageIfMissingColumnIndex($table, $db, $editable, $disp_mode) } else { $missing_unique_column_msg = null; } - + return $missing_unique_column_msg; } /** * Function to get html to display problems in indexes - * + * * @param string $query_type query type * @param bool $selected whether check table, optimize table, analyze * table or repair table has been selected with - * respect to the selected tables from the + * respect to the selected tables from the * database structure page. * @param string $db current database - * + * * @return void */ function PMA_getHtmlForIndexesProblems($query_type, $selected, $db) @@ -1953,13 +1949,13 @@ function PMA_getHtmlForIndexesProblems($query_type, $selected, $db) } else { $indexes_problems_html = null; } - + return $indexes_problems_html; } /** * Function to get the html for the print button in printview - * + * * @return string $print_button_html html for the print button */ function PMA_getHtmlForPrintButton() @@ -1970,13 +1966,13 @@ function PMA_getHtmlForPrintButton() } else { $print_button_html = null; } - + return $print_button_html; } /** * Function to display results when the executed query returns non empty results - * + * * @param array $result executed query results * @param bool $justBrowsing whether just browsing or not * @param array $analyzed_sql_results analysed sql results @@ -1998,11 +1994,11 @@ function PMA_getHtmlForPrintButton() * @param string $query_type query type * @param bool $selected whether check table, optimize table, analyze * table or repair table has been selected with - * respect to the selected tables from the + * respect to the selected tables from the * database structure page. * @param string $sql_query sql query * @param string $complete_query complete sql query - * + * * @return void */ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, @@ -2023,45 +2019,45 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, if (isset($result) && $result) { $fields_meta = $GLOBALS['dbi']->getFieldsMeta($result); } - + // Should be initialized these parameters before parsing $showtable = isset($showtable) ? $showtable : null; $url_query = isset($url_query) ? $url_query : null; - + $response = PMA_Response::getInstance(); $header = $response->getHeader(); $scripts = $header->getScripts(); - + // hide edit and delete links: // - for information_schema // - if the result set does not contain all the columns of a unique key // and we are not just browing all the columns of an updatable view - + $sele_exp_cls = $analyzed_sql_results['analyzed_sql'][0]['select_expr_clause']; $updatableView = $justBrowsing && trim($sele_exp_cls) == '*' && PMA_Table::isUpdatableView($db, $table); - + $has_unique = PMA_resultSetContainsUniqueKey( $db, $table, $fields_meta ); - + $editable = $has_unique || $updatableView; - + // Displays the results in a table if (empty($disp_mode)) { // see the "PMA_setDisplayMode()" function in // libraries/DisplayResults.class.php $disp_mode = 'urdr111101'; - } + } if (!empty($table) && ($GLOBALS['dbi']->isSystemSchema($db) || !$editable)) { $disp_mode = 'nnnn110111'; } if ( isset($_REQUEST['printview']) && $_REQUEST['printview'] == '1') { $disp_mode = 'nnnn000000'; } - + if (isset($_REQUEST['table_maintenance'])) { $scripts->addFile('makegrid.js'); $scripts->addFile('sql.js'); @@ -2079,23 +2075,23 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, ); if (empty($sql_data) || ($sql_data['valid_queries'] = 1)) { $response->addHTML($table_maintenance_html); - exit(); + exit(); } } if (!isset($_REQUEST['printview']) || $_REQUEST['printview'] != '1') { $scripts->addFile('makegrid.js'); $scripts->addFile('sql.js'); - unset($GLOBALS['message']); + unset($GLOBALS['message']); //we don't need to buffer the output in getMessage here. //set a global variable and check against it in the function $GLOBALS['buffer_message'] = false; } - + $print_view_header_html = PMA_getHtmlForPrintViewHeader( $db, $full_sql_query, $num_rows ); - + $previous_update_query_html = PMA_getHtmlForPreviousUpdateQuery( isset($disp_query) ? $disp_query : null, $GLOBALS['cfg']['ShowSQL'], isset($sql_data) ? $sql_data : null, @@ -2105,11 +2101,11 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, $profiling_chart_html = PMA_getHtmlForProfilingChart( $disp_mode, $db, isset($profiling_results) ? $profiling_results : null ); - + $missing_unique_column_msg = PMA_getMessageIfMissingColumnIndex( $table, $db, $editable, $disp_mode ); - + $bookmark_created_msg = PMA_getBookmarkCreatedMessage(); $table_html = PMA_getHtmlForSqlQueryResultsTable( @@ -2118,12 +2114,12 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, $editable, $unlim_num_rows, $num_rows, $showtable, $result, $analyzed_sql_results ); - + $indexes_problems_html = PMA_getHtmlForIndexesProblems( isset($query_type) ? $query_type : null, isset($selected) ? $selected : null, $db ); - + $bookmark_support_html = PMA_getHtmlForBookmark( $disp_mode, isset($GLOBALS['cfg']['Bookmark']) ? $GLOBALS['cfg']['Bookmark'] : '', @@ -2133,26 +2129,26 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, ); $print_button_html = PMA_getHtmlForPrintButton(); - + $html_output = isset($table_maintenance_html) ? $table_maintenance_html : ''; - + $html_output .= isset($print_view_header_html) ? $print_view_header_html : ''; - + $html_output .= PMA_getHtmlForSqlQueryResults( $previous_update_query_html, $profiling_chart_html, $missing_unique_column_msg, $bookmark_created_msg, $table_html, $indexes_problems_html, $bookmark_support_html, $print_button_html ); - - $response->addHTML($html_output); + + $response->addHTML($html_output); exit(); } /** * Function to send response for both empty results and non empty results - * + * * @param int $num_rows number of rows returned by the executed query * @param int $unlim_num_rows unlimited number of rows * @param bool $is_affected is affected @@ -2177,11 +2173,11 @@ function PMA_sendQueryResponseForResultsReturned($result, $justBrowsing, * @param string $query_type query type * @param bool $selected whether check table, optimize table, analyze * table or repair table has been selected with - * respect to the selected tables from the + * respect to the selected tables from the * database structure page. * @param string $sql_query sql query * @param string $complete_query complete query - * + * * @return void */ function PMA_sendQueryResponse($num_rows, $unlim_num_rows, $is_affected, @@ -2200,7 +2196,7 @@ function PMA_sendQueryResponse($num_rows, $unlim_num_rows, $is_affected, ); } else { - // At least one row is returned -> displays a table with results + // At least one row is returned -> displays a table with results PMA_sendQueryResponseForResultsReturned( isset($result) ? $result : null, $justBrowsing, $analyzed_sql_results, $db, $table, isset($disp_mode) ? $disp_mode : null, @@ -2219,7 +2215,7 @@ function PMA_sendQueryResponse($num_rows, $unlim_num_rows, $is_affected, /** * Function to execute the query and send the response - * + * * @param array $analyzed_sql_results analysed sql results * @param bool $is_gotofile whether goto file or not * @param string $db current database @@ -2240,10 +2236,10 @@ function PMA_sendQueryResponse($num_rows, $unlim_num_rows, $is_affected, * @param string $sql_query sql query * @param bool $selected whether check table, optimize table, analyze * table or repair table has been selected with - * respect to the selected tables from the + * respect to the selected tables from the * database structure page. * @param string $complete_query complete query - * + * * @return void */ function PMA_executeQueryAndSendQueryResponse($analyzed_sql_results, @@ -2262,7 +2258,7 @@ function PMA_executeQueryAndSendQueryResponse($analyzed_sql_results, ); $displayResultsObject->setConfigParamsForDisplayTable(); - + // assign default full_sql_query $full_sql_query = $sql_query; @@ -2284,7 +2280,7 @@ function PMA_executeQueryAndSendQueryResponse($analyzed_sql_results, } $reload = PMA_hasCurrentDbChanged($db); - + // Execute the query list($result, $num_rows, $unlim_num_rows, $profiling_results, $justBrowsing, $extra_data diff --git a/libraries/sql_query_form.lib.php b/libraries/sql_query_form.lib.php index 8e1e70cc74..fbac797daf 100644 --- a/libraries/sql_query_form.lib.php +++ b/libraries/sql_query_form.lib.php @@ -238,7 +238,7 @@ function PMA_sqlQueryFormInsert( ); } } - $legend .= ': ' . PMA_Util::showMySQLDocu('SQL-Syntax', 'SELECT'); + $legend .= ': ' . PMA_Util::showMySQLDocu('SELECT'); if (count($fields_list)) { $sqlquerycontainer_id = 'sqlquerycontainer'; diff --git a/libraries/structure.lib.php b/libraries/structure.lib.php index b4eb649b6d..94d88dee57 100644 --- a/libraries/structure.lib.php +++ b/libraries/structure.lib.php @@ -1522,9 +1522,7 @@ function PMA_getHtmlForOptionalActionLinks($url_query, $tbl_is_view, true ) . ''; - $html_output .= PMA_Util::showMySQLDocu( - 'Extending_MySQL', 'procedure_analyse' - ) . "\n"; + $html_output .= PMA_Util::showMySQLDocu('procedure_analyse') . "\n"; } if (PMA_Tracker::isActive()) { $html_output .= '' diff --git a/libraries/tbl_columns_definition_form.lib.php b/libraries/tbl_columns_definition_form.lib.php index 71b2a91ba1..0ca2670118 100644 --- a/libraries/tbl_columns_definition_form.lib.php +++ b/libraries/tbl_columns_definition_form.lib.php @@ -70,7 +70,7 @@ function PMA_getHtmlForTableConfigurations() . '
' . '' . '' . '' . '' @@ -108,7 +108,7 @@ function PMA_getHtmlForTableConfigurations() if (PMA_Partition::havePartitioning()) { $html .= '' . '' . '' . '' @@ -197,7 +197,7 @@ function PMA_getHtmlForTableFieldDefinitions($header_cells, $content_cells) { $html = '
' . __('Table comments:') . ' ' . __('Storage Engine:') - . PMA_Util::showMySQLDocu('Storage_engines', 'Storage_engines') + . PMA_Util::showMySQLDocu('Storage_engines') . ' ' . __('Collation:') . '
' . __('PARTITION definition:') . ' ' - . PMA_Util::showMySQLDocu('Partitioning', 'Partitioning') + . PMA_Util::showMySQLDocu('Partitioning') . '
'; $html .= ''; + . PMA_Util::showMySQLDocu('CREATE_TABLE') . ''; $html .= ''; foreach ($header_cells as $header_val) { @@ -274,7 +274,7 @@ function PMA_getHeaderCells($is_backup, $fields_meta, $mimework, $db, $table) $header_cells = array(); $header_cells[] = __('Name'); $header_cells[] = __('Type') - . PMA_Util::showMySQLDocu('SQL-Syntax', 'data-types'); + . PMA_Util::showMySQLDocu('data-types'); $header_cells[] = __('Length/Values') . PMA_Util::showHint( __( diff --git a/server_variables.php b/server_variables.php index e832e9cf55..b287777206 100644 --- a/server_variables.php +++ b/server_variables.php @@ -42,9 +42,7 @@ if (isset($_REQUEST['ajax_request']) && $_REQUEST['ajax_request'] == true) { /** * Displays the sub-page heading */ -$doc_link = PMA_Util::showMySQLDocu( - 'server_system_variables', 'server_system_variables' -); +$doc_link = PMA_Util::showMySQLDocu('server_system_variables'); $response->addHtml(PMA_getHtmlForSubPageHeader('variables', $doc_link)); /** diff --git a/tbl_relation.php b/tbl_relation.php index 86188dd2a1..2789099072 100644 --- a/tbl_relation.php +++ b/tbl_relation.php @@ -286,7 +286,7 @@ if (isset($destination_foreign_db)) { ); } $html_output .= PMA_Util::showMySQLDocu( - 'manual_Table_types', 'InnoDB_foreign_key_constraints' + 'InnoDB_foreign_key_constraints' ) . "\n"; } From 969c3cca56d76f84f8e9840accbfd90dbf44f48f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 08:49:43 +0200 Subject: [PATCH 082/141] Remove unused params doc --- libraries/Util.class.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 0087005c01..b117dc6569 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -432,9 +432,8 @@ class PMA_Util /** * Get a URL link to the official MySQL documentation * - * @param string $chapter chapter of "HTML, one page per chapter" documentation - * @param string $link contains name of page/anchor that is being linked - * @param string $anchor anchor to page part + * @param string $link contains name of page/anchor that is being linked + * @param string $anchor anchor to page part * * @return string the URL link * @@ -474,7 +473,6 @@ class PMA_Util /** * Displays a link to the official MySQL documentation * - * @param string $chapter chapter of "HTML, one page per chapter" documentation * @param string $link contains name of page/anchor that is being linked * @param bool $big_icon whether to use big icon (like in left frame) * @param string $anchor anchor to page part From 160457e25f58c746684af696f69d9b5f3c706bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:20:44 +0200 Subject: [PATCH 083/141] Fix session path for javascript loader --- js/messages.php | 1 + libraries/Config.class.php | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/js/messages.php b/js/messages.php index 043d713a8b..0960d89883 100644 --- a/js/messages.php +++ b/js/messages.php @@ -18,6 +18,7 @@ header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) . ' GMT'); // Avoid loading the full common.inc.php because this would add many // non-js-compatible stuff like DOCTYPE define('PMA_MINIMUM_COMMON', true); +define('PMA_PATH_TO_BASEDIR', '../'); require_once './libraries/common.inc.php'; // Close session early as we won't write anything there session_write_close(); diff --git a/libraries/Config.class.php b/libraries/Config.class.php index e5c6c2cc9f..8a5b27f4ea 100644 --- a/libraries/Config.class.php +++ b/libraries/Config.class.php @@ -1314,12 +1314,12 @@ class PMA_Config $path = dirname($url['path'] . 'a'); } - // To work correctly within transformations overview: - if (defined('PMA_PATH_TO_BASEDIR') && PMA_PATH_TO_BASEDIR == '../../') { + // To work correctly within javascript + if (defined('PMA_PATH_TO_BASEDIR') && PMA_PATH_TO_BASEDIR == '../') { if ($this->get('PMA_IS_WINDOWS') == 1) { - $path = str_replace("\\", "/", dirname(dirname($path))); + $path = str_replace("\\", "/", dirname($path)); } else { - $path = dirname(dirname($path)); + $path = dirname($path); } } From 7deb885d18aca1de277b3975acea1bf9a41a6ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:25:16 +0200 Subject: [PATCH 084/141] Remove no longer used syntax css --- themes/original/css/common.css.php | 66 ++---------------------------- themes/pmahomme/css/common.css.php | 65 +---------------------------- 2 files changed, 5 insertions(+), 126 deletions(-) diff --git a/themes/original/css/common.css.php b/themes/original/css/common.css.php index 52617b9419..8aba8e8f0a 100644 --- a/themes/original/css/common.css.php +++ b/themes/original/css/common.css.php @@ -368,70 +368,10 @@ img.lightbulb { border: 1px dashed #000000; } -/* MySQL Parser */ -.syntax { - font-size: 80%; -} - -.syntax a { +/* Doc links in SQL */ +.sql-higlight a { text-decoration: none; - border-bottom:1px dotted black; -} - -.syntax_comment { - padding-left: 4pt; - padding-right: 4pt; -} - -.syntax_digit { -} - -.syntax_digit_hex { -} - -.syntax_digit_integer { -} - -.syntax_digit_float { -} - -.syntax_punct { -} - -.syntax_alpha { -} - -.syntax_alpha_columnType { - text-transform: uppercase; -} - -.syntax_alpha_columnAttrib { - text-transform: uppercase; -} - -.syntax_alpha_reservedWord { - text-transform: uppercase; - font-weight: bold; -} - -.syntax_alpha_functionName { - text-transform: uppercase; -} - -.syntax_alpha_identifier { -} - -.syntax_alpha_charset { -} - -.syntax_alpha_variable { -} - -.syntax_quote { - white-space: pre; -} - -.syntax_quote_backtick { + border-bottom: 1px dotted #000; } /* leave some space between icons and text */ diff --git a/themes/pmahomme/css/common.css.php b/themes/pmahomme/css/common.css.php index 3c4bdca6bc..f4ba973515 100644 --- a/themes/pmahomme/css/common.css.php +++ b/themes/pmahomme/css/common.css.php @@ -602,73 +602,12 @@ img.lightbulb { border: 1px dashed #000; } -/* MySQL Parser */ -.syntax { - font-family: Verdana, 'Segoe UI', Arial, Tahoma; - font-size: 110%; -} - -.syntax a { +/* Doc links in SQL */ +.sql-higlight a { text-decoration: none; border-bottom: 1px dotted #000; } -.syntax_comment { - padding-left: 4pt; - padding-right: 4pt; -} - -.syntax_digit { -} - -.syntax_digit_hex { -} - -.syntax_digit_integer { -} - -.syntax_digit_float { -} - -.syntax_punct { -} - -.syntax_alpha { -} - -.syntax_alpha_columnType { - text-transform: uppercase; -} - -.syntax_alpha_columnAttrib { - text-transform: uppercase; -} - -.syntax_alpha_reservedWord { - text-transform: uppercase; - font-weight: bold; -} - -.syntax_alpha_functionName { - text-transform: uppercase; -} - -.syntax_alpha_identifier { -} - -.syntax_alpha_charset { -} - -.syntax_alpha_variable { -} - -.syntax_quote { - white-space: pre; -} - -.syntax_quote_backtick { -} - /* no extra space in table cells */ td .icon { margin: 0; From b4dc0213e644204a581535ef29f12eea931e9cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:28:19 +0200 Subject: [PATCH 085/141] Add infrastructure for doc links in SQL highlighter --- js/doclinks.js | 7 +++++++ js/functions.js | 20 ++++++++++++++++++++ js/messages.php | 3 +++ libraries/Header.class.php | 1 + themes/original/css/common.css.php | 2 +- themes/pmahomme/css/common.css.php | 2 +- 6 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 js/doclinks.js diff --git a/js/doclinks.js b/js/doclinks.js new file mode 100644 index 0000000000..3d88789caa --- /dev/null +++ b/js/doclinks.js @@ -0,0 +1,7 @@ +/** + * Definition of links to MySQL documentation. + */ + +var mysql_doc_keyword = { + 'SELECT': Array('select') +}; diff --git a/js/functions.js b/js/functions.js index b580023574..e5beb7de3c 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1488,6 +1488,25 @@ function catchKeypressesFromSqlTextboxes(event) { } } +function PMA_doc_keyword(idx, elm) +{ + var $elm = $(elm); + var keyword = $elm.text().toUpperCase(); + if (keyword in mysql_doc_keyword) { + var params = mysql_doc_keyword[keyword]; + var url = $.sprintf( + mysql_doc_template, + params[0] + ); + if (params.length > 1) { + url += '#' + params[1]; + } + var content = $elm.text(); + $elm.text(''); + $elm.append('' + content + ''); + } +} + /** * Higlights SQL using CodeMirror. */ @@ -1505,6 +1524,7 @@ function PMA_highlightSQL(base) CodeMirror.runMode($sql.text(), 'text/x-mysql', $highlight[0]); $pre.hide(); } + $highlight.find('.cm-keyword').each(PMA_doc_keyword); } }); } diff --git a/js/messages.php b/js/messages.php index 0960d89883..4632d911d8 100644 --- a/js/messages.php +++ b/js/messages.php @@ -24,6 +24,7 @@ require_once './libraries/common.inc.php'; session_write_close(); // But this one is needed for PMA_escapeJsString() require_once './libraries/js_escape.lib.php'; +require_once './libraries/Util.class.php'; $js_messages['strNoDropDatabases'] = $cfg['AllowUserDropDatabase'] ? '' : __('"DROP DATABASE" statements are disabled.'); @@ -396,6 +397,8 @@ echo "var pmaThemeImage = '" . $GLOBALS['pmaThemeImage'] . "';\n"; /* Version */ echo "var pmaversion = '" . PMA_VERSION . "';\n"; +echo "var mysql_doc_template = '" . PMA_Util::getMySQLDocuURL('%s') . "';\n"; + echo "if ($.datepicker) {\n"; /* l10n: Display text for calendar close link */ PMA_printJsValue("$.datepicker.regional['']['closeText']", __('Done')); diff --git a/libraries/Header.class.php b/libraries/Header.class.php index 01f750dfad..379bd18a01 100644 --- a/libraries/Header.class.php +++ b/libraries/Header.class.php @@ -186,6 +186,7 @@ class PMA_Header $this->_scripts->addFile( 'get_image.js.php?theme=' . $theme_id ); + $this->_scripts->addFile('doclinks.js'); $this->_scripts->addFile('functions.js'); $this->_scripts->addFile('navigation.js'); $this->_scripts->addFile('indexes.js'); diff --git a/themes/original/css/common.css.php b/themes/original/css/common.css.php index 8aba8e8f0a..3c46eb6737 100644 --- a/themes/original/css/common.css.php +++ b/themes/original/css/common.css.php @@ -369,7 +369,7 @@ img.lightbulb { } /* Doc links in SQL */ -.sql-higlight a { +.cm-sql-doc { text-decoration: none; border-bottom: 1px dotted #000; } diff --git a/themes/pmahomme/css/common.css.php b/themes/pmahomme/css/common.css.php index f4ba973515..f38fa8df50 100644 --- a/themes/pmahomme/css/common.css.php +++ b/themes/pmahomme/css/common.css.php @@ -603,7 +603,7 @@ img.lightbulb { } /* Doc links in SQL */ -.sql-higlight a { +.cm-sql-doc { text-decoration: none; border-bottom: 1px dotted #000; } From 1102d68c3911481a9bb5c82eae8dc592cd680a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:35:22 +0200 Subject: [PATCH 086/141] Documentation for types --- js/doclinks.js | 34 ++++++++++++++++++++++++++++++++++ js/functions.js | 36 +++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/js/doclinks.js b/js/doclinks.js index 3d88789caa..cd53aeef18 100644 --- a/js/doclinks.js +++ b/js/doclinks.js @@ -5,3 +5,37 @@ var mysql_doc_keyword = { 'SELECT': Array('select') }; + +var mysql_doc_builtin = { + 'TINYINT': Array('numeric-types'), + 'SMALLINT': Array('numeric-types'), + 'MEDIUMINT': Array('numeric-types'), + 'INT': Array('numeric-types'), + 'BIGINT': Array('numeric-types'), + 'DECIMAL': Array('numeric-types'), + 'FLOAT': Array('numeric-types'), + 'DOUBLE': Array('numeric-types'), + 'REAL': Array('numeric-types'), + 'BIT': Array('numeric-types'), + 'BOOLEAN': Array('numeric-types'), + 'SERIAL': Array('numeric-types'), + 'DATE': Array('date-and-time-types'), + 'DATETIME': Array('date-and-time-types'), + 'TIMESTAMP': Array('date-and-time-types'), + 'TIME': Array('date-and-time-types'), + 'YEAR': Array('date-and-time-types'), + 'CHAR': Array('string-types'), + 'VARCHAR': Array('string-types'), + 'TINYTEXT': Array('string-types'), + 'TEXT': Array('string-types'), + 'MEDIUMTEXT': Array('string-types'), + 'LONGTEXT': Array('string-types'), + 'BINARY': Array('string-types'), + 'VARBINARY': Array('string-types'), + 'TINYBLOB': Array('string-types'), + 'MEDIUMBLOB': Array('string-types'), + 'BLOB': Array('string-types'), + 'LONGBLOB': Array('string-types'), + 'ENUM': Array('string-types'), + 'SET': Array('string-types') +}; diff --git a/js/functions.js b/js/functions.js index e5beb7de3c..48cee08747 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1488,22 +1488,35 @@ function catchKeypressesFromSqlTextboxes(event) { } } +function PMA_doc_add($elm, params) +{ + var url = $.sprintf( + mysql_doc_template, + params[0] + ); + if (params.length > 1) { + url += '#' + params[1]; + } + var content = $elm.text(); + $elm.text(''); + $elm.append('' + content + ''); +} + function PMA_doc_keyword(idx, elm) { var $elm = $(elm); var keyword = $elm.text().toUpperCase(); if (keyword in mysql_doc_keyword) { - var params = mysql_doc_keyword[keyword]; - var url = $.sprintf( - mysql_doc_template, - params[0] - ); - if (params.length > 1) { - url += '#' + params[1]; - } - var content = $elm.text(); - $elm.text(''); - $elm.append('' + content + ''); + PMA_doc_add($elm, mysql_doc_keyword[keyword]); + } +} + +function PMA_doc_builtin(idx, elm) +{ + var $elm = $(elm); + var builtin = $elm.text().toUpperCase(); + if (builtin in mysql_doc_builtin) { + PMA_doc_add($elm, mysql_doc_builtin[builtin]); } } @@ -1525,6 +1538,7 @@ function PMA_highlightSQL(base) $pre.hide(); } $highlight.find('.cm-keyword').each(PMA_doc_keyword); + $highlight.find('.cm-builtin').each(PMA_doc_builtin); } }); } From 5e2bf80e4e6b5c7ac0039dbef4caed9e1dbf9fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:45:43 +0200 Subject: [PATCH 087/141] Add more doc links --- js/doclinks.js | 246 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 245 insertions(+), 1 deletion(-) diff --git a/js/doclinks.js b/js/doclinks.js index cd53aeef18..71d111a9d4 100644 --- a/js/doclinks.js +++ b/js/doclinks.js @@ -3,7 +3,251 @@ */ var mysql_doc_keyword = { - 'SELECT': Array('select') + /* Statements */ + 'SELECT': Array('select'), + 'SET': Array('set'), + 'EXPLAIN': Array('explain'), + 'DESCRIBE': Array('describe'), + 'DELETE': Array('delete'), + 'SHOW': Array('show'), /* TODO: SHOW SOMETHING */ + 'UPDATE': Array('update'), + 'INSERT': Array('insert'), + 'REPLACE': Array('replace'), + 'CALL': Array('call'), + 'DO': Array('do'), + 'HANDLER': Array('handler'), + + /* Functions */ + 'ABS': Array('mathematical-functions', 'function_abs'), + 'ACOS': Array('mathematical-functions', 'function_acos'), + 'ADDDATE': Array('date-and-time-functions', 'function_adddate'), + 'ADDTIME': Array('date-and-time-functions', 'function_addtime'), + 'AES_DECRYPT': Array('encryption-functions', 'function_aes_decrypt'), + 'AES_ENCRYPT': Array('encryption-functions', 'function_aes_encrypt'), + 'AND': Array('logical-operators', 'operator_and'), + 'ASCII': Array('string-functions', 'function_ascii'), + 'ASIN': Array('mathematical-functions', 'function_asin'), + 'ATAN2': Array('mathematical-functions', 'function_atan2'), + 'ATAN': Array('mathematical-functions', 'function_atan'), + 'AVG': Array('group-by-functions', 'function_avg'), + 'BENCHMARK': Array('information-functions', 'function_benchmark'), + 'BIN': Array('string-functions', 'function_bin'), + 'BINARY': Array('cast-functions', 'operator_binary'), + 'BIT_AND': Array('group-by-functions', 'function_bit_and'), + 'BIT_COUNT': Array('bit-functions', 'function_bit_count'), + 'BIT_LENGTH': Array('string-functions', 'function_bit_length'), + 'BIT_OR': Array('group-by-functions', 'function_bit_or'), + 'BIT_XOR': Array('group-by-functions', 'function_bit_xor'), + 'CASE': Array('control-flow-functions', 'operator_case'), + 'CAST': Array('cast-functions', 'function_cast'), + 'CEIL': Array('mathematical-functions', 'function_ceil'), + 'CEILING': Array('mathematical-functions', 'function_ceiling'), + 'CHAR_LENGTH': Array('string-functions', 'function_char_length'), + 'CHAR': Array('string-functions', 'function_char'), + 'CHARACTER_LENGTH': Array('string-functions', 'function_character_length'), + 'CHARSET': Array('information-functions', 'function_charset'), + 'COALESCE': Array('comparison-operators', 'function_coalesce'), + 'COERCIBILITY': Array('information-functions', 'function_coercibility'), + 'COLLATION': Array('information-functions', 'function_collation'), + 'COMPRESS': Array('encryption-functions', 'function_compress'), + 'CONCAT_WS': Array('string-functions', 'function_concat_ws'), + 'CONCAT': Array('string-functions', 'function_concat'), + 'CONNECTION_ID': Array('information-functions', 'function_connection_id'), + 'CONV': Array('mathematical-functions', 'function_conv'), + 'CONVERT_TZ': Array('date-and-time-functions', 'function_convert_tz'), + 'Convert': Array('cast-functions', 'function_convert'), + 'COS': Array('mathematical-functions', 'function_cos'), + 'COT': Array('mathematical-functions', 'function_cot'), + 'COUNT': Array('group-by-functions', 'function_count'), + 'CRC32': Array('mathematical-functions', 'function_crc32'), + 'CURDATE': Array('date-and-time-functions', 'function_curdate'), + 'CURRENT_DATE': Array('date-and-time-functions', 'function_current_date'), + 'CURRENT_TIME': Array('date-and-time-functions', 'function_current_time'), + 'CURRENT_TIMESTAMP': Array('date-and-time-functions', 'function_current_timestamp'), + 'CURRENT_USER': Array('information-functions', 'function_current_user'), + 'CURTIME': Array('date-and-time-functions', 'function_curtime'), + 'DATABASE': Array('information-functions', 'function_database'), + 'DATE_ADD': Array('date-and-time-functions', 'function_date_add'), + 'DATE_FORMAT': Array('date-and-time-functions', 'function_date_format'), + 'DATE_SUB': Array('date-and-time-functions', 'function_date_sub'), + 'DATE': Array('date-and-time-functions', 'function_date'), + 'DATEDIFF': Array('date-and-time-functions', 'function_datediff'), + 'DAY': Array('date-and-time-functions', 'function_day'), + 'DAYNAME': Array('date-and-time-functions', 'function_dayname'), + 'DAYOFMONTH': Array('date-and-time-functions', 'function_dayofmonth'), + 'DAYOFWEEK': Array('date-and-time-functions', 'function_dayofweek'), + 'DAYOFYEAR': Array('date-and-time-functions', 'function_dayofyear'), + 'DECLARE': Array('declare', 'declare'), + 'DECODE': Array('encryption-functions', 'function_decode'), + 'DEFAULT': Array('miscellaneous-functions', 'function_default'), + 'DEGREES': Array('mathematical-functions', 'function_degrees'), + 'DES_DECRYPT': Array('encryption-functions', 'function_des_decrypt'), + 'DES_ENCRYPT': Array('encryption-functions', 'function_des_encrypt'), + 'DIV': Array('arithmetic-functions', 'operator_div'), + 'ELT': Array('string-functions', 'function_elt'), + 'ENCODE': Array('encryption-functions', 'function_encode'), + 'ENCRYPT': Array('encryption-functions', 'function_encrypt'), + 'EXP': Array('mathematical-functions', 'function_exp'), + 'EXPORT_SET': Array('string-functions', 'function_export_set'), + 'EXTRACT': Array('date-and-time-functions', 'function_extract'), + 'ExtractValue': Array('xml-functions', 'function_extractvalue'), + 'FIELD': Array('string-functions', 'function_field'), + 'FIND_IN_SET': Array('string-functions', 'function_find_in_set'), + 'FLOOR': Array('mathematical-functions', 'function_floor'), + 'FORMAT': Array('string-functions', 'function_format'), + 'FOUND_ROWS': Array('information-functions', 'function_found_rows'), + 'FROM_DAYS': Array('date-and-time-functions', 'function_from_days'), + 'FROM_UNIXTIME': Array('date-and-time-functions', 'function_from_unixtime'), + 'GET_FORMAT': Array('date-and-time-functions', 'function_get_format'), + 'GET_LOCK': Array('miscellaneous-functions', 'function_get_lock'), + 'GREATEST': Array('comparison-operators', 'function_greatest'), + 'GROUP_CONCAT': Array('group-by-functions', 'function_group_concat'), + 'HEX': Array('string-functions', 'function_hex'), + 'HOUR': Array('date-and-time-functions', 'function_hour'), + 'IF': Array('control-flow-functions', 'function_if'), + 'IFNULL': Array('control-flow-functions', 'function_ifnull'), + 'IN': Array('comparison-operators', 'function_in'), + 'INET_ATON': Array('miscellaneous-functions', 'function_inet_aton'), + 'INET_NTOA': Array('miscellaneous-functions', 'function_inet_ntoa'), + 'INSERT': Array('string-functions', 'function_insert'), + 'INSTR': Array('string-functions', 'function_instr'), + 'INTERVAL': Array('comparison-operators', 'function_interval'), + 'IS_FREE_LOCK': Array('miscellaneous-functions', 'function_is_free_lock'), + 'IS_USED_LOCK': Array('miscellaneous-functions', 'function_is_used_lock'), + 'IS': Array('comparison-operators', 'operator_is'), + 'ISNULL': Array('comparison-operators', 'function_isnull'), + 'LAST_DAY': Array('date-and-time-functions', 'function_last_day'), + 'LAST_INSERT_ID': Array('information-functions', 'function_last_insert_id'), + 'LCASE': Array('string-functions', 'function_lcase'), + 'LEAST': Array('comparison-operators', 'function_least'), + 'LEFT': Array('string-functions', 'function_left'), + 'LENGTH': Array('string-functions', 'function_length'), + 'LIKE': Array('string-comparison-functions', 'operator_like'), + 'LN': Array('mathematical-functions', 'function_ln'), + 'LOAD_FILE': Array('string-functions', 'function_load_file'), + 'LOCALTIME': Array('date-and-time-functions', 'function_localtime'), + 'LOCALTIMESTAMP': Array('date-and-time-functions', 'function_localtimestamp'), + 'LOCATE': Array('string-functions', 'function_locate'), + 'LOG10': Array('mathematical-functions', 'function_log10'), + 'LOG2': Array('mathematical-functions', 'function_log2'), + 'LOG': Array('mathematical-functions', 'function_log'), + 'LOWER': Array('string-functions', 'function_lower'), + 'LPAD': Array('string-functions', 'function_lpad'), + 'LTRIM': Array('string-functions', 'function_ltrim'), + 'MAKE_SET': Array('string-functions', 'function_make_set'), + 'MAKEDATE': Array('date-and-time-functions', 'function_makedate'), + 'MAKETIME': Array('date-and-time-functions', 'function_maketime'), + 'MASTER_POS_WAIT': Array('miscellaneous-functions', 'function_master_pos_wait'), + 'MATCH': Array('fulltext-search', 'function_match'), + 'MAX': Array('group-by-functions', 'function_max'), + 'MD5': Array('encryption-functions', 'function_md5'), + 'MICROSECOND': Array('date-and-time-functions', 'function_microsecond'), + 'MID': Array('string-functions', 'function_mid'), + 'MIN': Array('group-by-functions', 'function_min'), + 'MINUTE': Array('date-and-time-functions', 'function_minute'), + 'MOD': Array('mathematical-functions', 'function_mod'), + 'MONTH': Array('date-and-time-functions', 'function_month'), + 'MONTHNAME': Array('date-and-time-functions', 'function_monthname'), + 'NAME_CONST': Array('miscellaneous-functions', 'function_name_const'), + 'NOT': Array('logical-operators', 'operator_not'), + 'NOW': Array('date-and-time-functions', 'function_now'), + 'NULLIF': Array('control-flow-functions', 'function_nullif'), + 'OCT': Array('mathematical-functions', 'function_oct'), + 'OCTET_LENGTH': Array('string-functions', 'function_octet_length'), + 'OLD_PASSWORD': Array('encryption-functions', 'function_old_password'), + 'OR': Array('logical-operators', 'operator_or'), + 'ORD': Array('string-functions', 'function_ord'), + 'PASSWORD': Array('encryption-functions', 'function_password'), + 'PERIOD_ADD': Array('date-and-time-functions', 'function_period_add'), + 'PERIOD_DIFF': Array('date-and-time-functions', 'function_period_diff'), + 'PI': Array('mathematical-functions', 'function_pi'), + 'POSITION': Array('string-functions', 'function_position'), + 'POW': Array('mathematical-functions', 'function_pow'), + 'POWER': Array('mathematical-functions', 'function_power'), + 'QUARTER': Array('date-and-time-functions', 'function_quarter'), + 'QUOTE': Array('string-functions', 'function_quote'), + 'RADIANS': Array('mathematical-functions', 'function_radians'), + 'RAND': Array('mathematical-functions', 'function_rand'), + 'REGEXP': Array('regexp', 'operator_regexp'), + 'RELEASE_LOCK': Array('miscellaneous-functions', 'function_release_lock'), + 'REPEAT': Array('string-functions', 'function_repeat'), + 'REPLACE': Array('string-functions', 'function_replace'), + 'REVERSE': Array('string-functions', 'function_reverse'), + 'RIGHT': Array('string-functions', 'function_right'), + 'RLIKE': Array('regexp', 'operator_rlike'), + 'ROUND': Array('mathematical-functions', 'function_round'), + 'ROW_COUNT': Array('information-functions', 'function_row_count'), + 'RPAD': Array('string-functions', 'function_rpad'), + 'RTRIM': Array('string-functions', 'function_rtrim'), + 'SCHEMA': Array('information-functions', 'function_schema'), + 'SEC_TO_TIME': Array('date-and-time-functions', 'function_sec_to_time'), + 'SECOND': Array('date-and-time-functions', 'function_second'), + 'SESSION_USER': Array('information-functions', 'function_session_user'), + 'SHA': Array('encryption-functions', 'function_sha1'), + 'SHA1': Array('encryption-functions', 'function_sha1'), + 'SIGN': Array('mathematical-functions', 'function_sign'), + 'SIN': Array('mathematical-functions', 'function_sin'), + 'SLEEP': Array('miscellaneous-functions', 'function_sleep'), + 'SOUNDEX': Array('string-functions', 'function_soundex'), + 'SPACE': Array('string-functions', 'function_space'), + 'SQRT': Array('mathematical-functions', 'function_sqrt'), + 'STD': Array('group-by-functions', 'function_std'), + 'STDDEV_POP': Array('group-by-functions', 'function_stddev_pop'), + 'STDDEV_SAMP': Array('group-by-functions', 'function_stddev_samp'), + 'STDDEV': Array('group-by-functions', 'function_stddev'), + 'STR_TO_DATE': Array('date-and-time-functions', 'function_str_to_date'), + 'STRCMP': Array('string-comparison-functions', 'function_strcmp'), + 'SUBDATE': Array('date-and-time-functions', 'function_subdate'), + 'SUBSTR': Array('string-functions', 'function_substr'), + 'SUBSTRING_INDEX': Array('string-functions', 'function_substring_index'), + 'SUBSTRING': Array('string-functions', 'function_substring'), + 'SUBTIME': Array('date-and-time-functions', 'function_subtime'), + 'SUM': Array('group-by-functions', 'function_sum'), + 'SYSDATE': Array('date-and-time-functions', 'function_sysdate'), + 'SYSTEM_USER': Array('information-functions', 'function_system_user'), + 'TAN': Array('mathematical-functions', 'function_tan'), + 'TIME_FORMAT': Array('date-and-time-functions', 'function_time_format'), + 'TIME_TO_SEC': Array('date-and-time-functions', 'function_time_to_sec'), + 'TIME': Array('date-and-time-functions', 'function_time'), + 'TIMEDIFF': Array('date-and-time-functions', 'function_timediff'), + 'TIMESTAMP': Array('date-and-time-functions', 'function_timestamp'), + 'TIMESTAMPADD': Array('date-and-time-functions', 'function_timestampadd'), + 'TIMESTAMPDIFF': Array('date-and-time-functions', 'function_timestampdiff'), + 'TO_DAYS': Array('date-and-time-functions', 'function_to_days'), + 'TRIM': Array('string-functions', 'function_trim'), + 'TRUNCATE': Array('mathematical-functions', 'function_truncate'), + 'UCASE': Array('string-functions', 'function_ucase'), + 'UNCOMPRESS': Array('encryption-functions', 'function_uncompress'), + 'UNCOMPRESSED_LENGTH': Array('encryption-functions', 'function_uncompressed_length'), + 'UNHEX': Array('string-functions', 'function_unhex'), + 'UNIX_TIMESTAMP': Array('date-and-time-functions', 'function_unix_timestamp'), + 'UpdateXML': Array('xml-functions', 'function_updatexml'), + 'UPPER': Array('string-functions', 'function_upper'), + 'USER': Array('information-functions', 'function_user'), + 'UTC_DATE': Array('date-and-time-functions', 'function_utc_date'), + 'UTC_TIME': Array('date-and-time-functions', 'function_utc_time'), + 'UTC_TIMESTAMP': Array('date-and-time-functions', 'function_utc_timestamp'), + 'UUID_SHORT': Array('miscellaneous-functions', 'function_uuid_short'), + 'UUID': Array('miscellaneous-functions', 'function_uuid'), + 'VALUES': Array('miscellaneous-functions', 'function_values'), + 'VAR_POP': Array('group-by-functions', 'function_var_pop'), + 'VAR_SAMP': Array('group-by-functions', 'function_var_samp'), + 'VARIANCE': Array('group-by-functions', 'function_variance'), + 'VERSION': Array('information-functions', 'function_version'), + 'WEEK': Array('date-and-time-functions', 'function_week'), + 'WEEKDAY': Array('date-and-time-functions', 'function_weekday'), + 'WEEKOFYEAR': Array('date-and-time-functions', 'function_weekofyear'), + 'XOR': Array('logical-operators', 'operator_xor'), + 'YEAR': Array('date-and-time-functions', 'function_year'), + 'YEARWEEK': Array('date-and-time-functions', 'function_yearweek'), + 'SOUNDS_LIKE': Array('string-functions', 'operator_sounds-like'), + 'IS_NOT_NULL': Array('comparison-operators', 'operator_is-not-null'), + 'IS_NOT': Array('comparison-operators', 'operator_is-not'), + 'IS_NULL': Array('comparison-operators', 'operator_is-null'), + 'NOT_LIKE': Array('string-comparison-functions', 'operator_not-like'), + 'NOT_REGEXP': Array('regexp', 'operator_not-regexp'), + 'COUNT_DISTINCT': Array('group-by-functions', 'function_count-distinct'), + 'NOT_IN': Array('comparison-operators', 'function_not-in'), }; var mysql_doc_builtin = { From 6a89d16f9327131f9a38c1ebba6c5cdd6b81a219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 09:49:34 +0200 Subject: [PATCH 088/141] Keep syntax colors on links --- themes/original/css/common.css.php | 1 + themes/pmahomme/css/common.css.php | 1 + 2 files changed, 2 insertions(+) diff --git a/themes/original/css/common.css.php b/themes/original/css/common.css.php index 3c46eb6737..e5b3132dd0 100644 --- a/themes/original/css/common.css.php +++ b/themes/original/css/common.css.php @@ -372,6 +372,7 @@ img.lightbulb { .cm-sql-doc { text-decoration: none; border-bottom: 1px dotted #000; + color: inherit !important; } /* leave some space between icons and text */ diff --git a/themes/pmahomme/css/common.css.php b/themes/pmahomme/css/common.css.php index f38fa8df50..ce913348bc 100644 --- a/themes/pmahomme/css/common.css.php +++ b/themes/pmahomme/css/common.css.php @@ -606,6 +606,7 @@ img.lightbulb { .cm-sql-doc { text-decoration: none; border-bottom: 1px dotted #000; + color: inherit !important; } /* no extra space in table cells */ From 2822419f10dffdd579246cf36142d6f0d520ce6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:25:39 +0200 Subject: [PATCH 089/141] Show docs for multiword statements as well --- js/doclinks.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++- js/functions.js | 26 +++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/js/doclinks.js b/js/doclinks.js index 71d111a9d4..a90b606fe7 100644 --- a/js/doclinks.js +++ b/js/doclinks.js @@ -3,19 +3,103 @@ */ var mysql_doc_keyword = { + /* Multi word */ + 'CHARACTER SET': Array('charset'), + 'SHOW AUTHORS': Array('show-authors'), + 'SHOW BINARY LOGS': Array('show-binary-logs'), + 'SHOW BINLOG EVENTS': Array('show-binlog-events'), + 'SHOW CHARACTER SET': Array('show-character-set'), + 'SHOW COLLATION': Array('show-collation'), + 'SHOW COLUMNS': Array('show-columns'), + 'SHOW CONTRIBUTORS': Array('show-contributors'), + 'SHOW CREATE DATABASE': Array('show-create-database'), + 'SHOW CREATE EVENT': Array('show-create-event'), + 'SHOW CREATE FUNCTION': Array('show-create-function'), + 'SHOW CREATE PROCEDURE': Array('show-create-procedure'), + 'SHOW CREATE TABLE': Array('show-create-table'), + 'SHOW CREATE TRIGGER': Array('show-create-trigger'), + 'SHOW CREATE VIEW': Array('show-create-view'), + 'SHOW DATABASES': Array('show-databases'), + 'SHOW ENGINE': Array('show-engine'), + 'SHOW ENGINES': Array('show-engines'), + 'SHOW ERRORS': Array('show-errors'), + 'SHOW EVENTS': Array('show-events'), + 'SHOW FUNCTION CODE': Array('show-function-code'), + 'SHOW FUNCTION STATUS': Array('show-function-status'), + 'SHOW GRANTS': Array('show-grants'), + 'SHOW INDEX': Array('show-index'), + 'SHOW MASTER STATUS': Array('show-master-status'), + 'SHOW OPEN TABLES': Array('show-open-tables'), + 'SHOW PLUGINS': Array('show-plugins'), + 'SHOW PRIVILEGES': Array('show-privileges'), + 'SHOW PROCEDURE CODE': Array('show-procedure-code'), + 'SHOW PROCEDURE STATUS': Array('show-procedure-status'), + 'SHOW PROCESSLIST': Array('show-processlist'), + 'SHOW PROFILE': Array('show-profile'), + 'SHOW PROFILES': Array('show-profiles'), + 'SHOW RELAYLOG EVENTS': Array('show-relaylog-events'), + 'SHOW SLAVE HOSTS': Array('show-slave-hosts'), + 'SHOW SLAVE STATUS': Array('show-slave-status'), + 'SHOW STATUS': Array('show-status'), + 'SHOW TABLE STATUS': Array('show-table-status'), + 'SHOW TABLES': Array('show-tables'), + 'SHOW TRIGGERS': Array('show-triggers'), + 'SHOW VARIABLES': Array('show-variables'), + 'SHOW WARNINGS': Array('show-warnings'), + 'LOAD DATA INFILE': Array('load-data'), + 'LOAD XML': Array('load-xml'), + 'LOCK TABLES': Array('lock-tables'), + 'UNLOCK TABLES': Array('lock-tables'), + 'ALTER DATABASE': Array('alter-database'), + 'ALTER EVENT': Array('alter-event'), + 'ALTER LOGFILE GROUP': Array('alter-logfile-group'), + 'ALTER FUNCTION': Array('alter-function'), + 'ALTER PROCEDURE': Array('alter-procedure'), + 'ALTER SERVER': Array('alter-server'), + 'ALTER TABLE': Array('alter-table'), + 'ALTER TABLESPACE': Array('alter-tablespace'), + 'ALTER VIEW': Array('alter-view'), + 'CREATE DATABASE': Array('create-database'), + 'CREATE EVENT': Array('create-event'), + 'CREATE FUNCTION': Array('create-function'), + 'CREATE INDEX': Array('create-index'), + 'CREATE LOGFILE GROUP': Array('create-logfile-group'), + 'CREATE PROCEDURE': Array('create-procedure'), + 'CREATE FUNCTION': Array('create-procedure'), + 'CREATE SERVER': Array('create-server'), + 'CREATE TABLE': Array('create-table'), + 'CREATE TABLESPACE': Array('create-tablespace'), + 'CREATE TRIGGER': Array('create-trigger'), + 'CREATE VIEW': Array('create-view'), + 'DROP DATABASE': Array('drop-database'), + 'DROP EVENT': Array('drop-event'), + 'DROP FUNCTION': Array('drop-function'), + 'DROP INDEX': Array('drop-index'), + 'DROP LOGFILE GROUP': Array('drop-logfile-group'), + 'DROP PROCEDURE': Array('drop-procedure'), + 'DROP FUNCTION': Array('drop-procedure'), + 'DROP SERVER': Array('drop-server'), + 'DROP TABLE': Array('drop-table'), + 'DROP TABLESPACE': Array('drop-tablespace'), + 'DROP TRIGGER': Array('drop-trigger'), + 'DROP VIEW': Array('drop-view'), + 'RENAME TABLE': Array('rename-table'), + 'TRUNCATE TABLE': Array('truncate-table'), + /* Statements */ 'SELECT': Array('select'), 'SET': Array('set'), 'EXPLAIN': Array('explain'), 'DESCRIBE': Array('describe'), 'DELETE': Array('delete'), - 'SHOW': Array('show'), /* TODO: SHOW SOMETHING */ + 'SHOW': Array('show'), 'UPDATE': Array('update'), 'INSERT': Array('insert'), 'REPLACE': Array('replace'), 'CALL': Array('call'), 'DO': Array('do'), 'HANDLER': Array('handler'), + 'COLLATE': Array('charset-collations'), /* Functions */ 'ABS': Array('mathematical-functions', 'function_abs'), diff --git a/js/functions.js b/js/functions.js index 48cee08747..3ec02dbdeb 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1505,7 +1505,33 @@ function PMA_doc_add($elm, params) function PMA_doc_keyword(idx, elm) { var $elm = $(elm); + /* Skip already processed ones */ + if ($elm.find('a').length > 0) { + return; + } var keyword = $elm.text().toUpperCase(); + var $next = $elm.next('.cm-keyword'); + if ($next) { + var next_keyword = $next.text().toUpperCase(); + var full = keyword + ' ' + next_keyword; + + var $next2 = $next.next('.cm-keyword'); + if ($next2) { + var next2_keyword = $next2.text().toUpperCase(); + var full2 = full + ' ' + next2_keyword; + if (full2 in mysql_doc_keyword) { + PMA_doc_add($elm, mysql_doc_keyword[full2]); + PMA_doc_add($next, mysql_doc_keyword[full2]); + PMA_doc_add($next2, mysql_doc_keyword[full2]); + return; + } + } + if (full in mysql_doc_keyword) { + PMA_doc_add($elm, mysql_doc_keyword[full]); + PMA_doc_add($next, mysql_doc_keyword[full]); + return; + } + } if (keyword in mysql_doc_keyword) { PMA_doc_add($elm, mysql_doc_keyword[keyword]); } From dd5fd448d6c65399629e94e4cbdd8eaefb644d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:26:55 +0200 Subject: [PATCH 090/141] Properly set target for MySQL doc links --- js/functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/functions.js b/js/functions.js index 3ec02dbdeb..498b90b888 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1499,7 +1499,7 @@ function PMA_doc_add($elm, params) } var content = $elm.text(); $elm.text(''); - $elm.append('' + content + ''); + $elm.append('' + content + ''); } function PMA_doc_keyword(idx, elm) From 2e03f816334668915ea8cdf8daae20a9a44e7f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:27:46 +0200 Subject: [PATCH 091/141] Doc links only with CodeMirror enabled --- js/functions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/functions.js b/js/functions.js index 498b90b888..6c6bf48148 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1562,9 +1562,9 @@ function PMA_highlightSQL(base) if (typeof CodeMirror != 'undefined') { CodeMirror.runMode($sql.text(), 'text/x-mysql', $highlight[0]); $pre.hide(); + $highlight.find('.cm-keyword').each(PMA_doc_keyword); + $highlight.find('.cm-builtin').each(PMA_doc_builtin); } - $highlight.find('.cm-keyword').each(PMA_doc_keyword); - $highlight.find('.cm-builtin').each(PMA_doc_builtin); } }); } From 151d8566e8b9da406ca9f83b947aab39315227f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:28:56 +0200 Subject: [PATCH 092/141] Document functions --- js/functions.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/functions.js b/js/functions.js index 6c6bf48148..35c8d86e02 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1488,6 +1488,9 @@ function catchKeypressesFromSqlTextboxes(event) { } } +/** + * Adds doc link to single highlighted SQL element + */ function PMA_doc_add($elm, params) { var url = $.sprintf( @@ -1502,6 +1505,9 @@ function PMA_doc_add($elm, params) $elm.append('' + content + ''); } +/** + * Generates doc links for keywords inside highlighted SQL + */ function PMA_doc_keyword(idx, elm) { var $elm = $(elm); @@ -1537,6 +1543,9 @@ function PMA_doc_keyword(idx, elm) } } +/** + * Generates doc links for builtins inside highlighted SQL + */ function PMA_doc_builtin(idx, elm) { var $elm = $(elm); From ddf42335d995f93f3a6dc7666cb416a13138c0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:31:16 +0200 Subject: [PATCH 093/141] Add function docs --- libraries/operations.lib.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/operations.lib.php b/libraries/operations.lib.php index d14618b649..75c6064862 100644 --- a/libraries/operations.lib.php +++ b/libraries/operations.lib.php @@ -1206,14 +1206,15 @@ function PMA_getListofMaintainActionLink($is_myisam_or_aria, /** * Get maintain action HTML link * - * @param string $action + * @param string $action action name * @param array $params url parameters array - * @param array $url_params + * @param array $url_params additional url parameters * @param string $link contains name of page/anchor that is being linked * * @return string $html_output */ -function PMA_getMaintainActionlink($action, $params, $url_params, $link) { +function PMA_getMaintainActionlink($action, $params, $url_params, $link) +{ return '
  • ' . 'fetchSingleRow($query, 'ASSOC', $GLOBALS['controllink']); return array( @@ -97,18 +98,23 @@ function PMA_saveUserprefs(array $config_array) // save configuration to pmadb $query_table = PMA_Util::backquote($cfgRelation['db']) . '.' . PMA_Util::backquote($cfgRelation['userconfig']); - $query = ' - SELECT `username` - FROM ' . $query_table . ' - WHERE `username` = \'' . PMA_Util::sqlAddSlashes($cfgRelation['user']) . '\''; + $query = 'SELECT `username` FROM ' . $query_table + . 'WHERE `username` = \'' + . PMA_Util::sqlAddSlashes($cfgRelation['user']) + . '\''; - $has_config = $GLOBALS['dbi']->fetchValue($query, 0, 0, $GLOBALS['controllink']); + $has_config = $GLOBALS['dbi']->fetchValue( + $query, 0, 0, $GLOBALS['controllink'] + ); $config_data = json_encode($config_array); if ($has_config) { - $query = ' - UPDATE ' . $query_table . ' - SET `config_data` = \'' . PMA_Util::sqlAddSlashes($config_data) . '\' - WHERE `username` = \'' . PMA_Util::sqlAddSlashes($cfgRelation['user']) . '\''; + $query = 'UPDATE ' . $query_table + . 'SET `config_data` = \'' + . PMA_Util::sqlAddSlashes($config_data) + . '\'' + . 'WHERE `username` = \'' + . PMA_Util::sqlAddSlashes($cfgRelation['user']) + . '\''; } else { $query = ' INSERT INTO ' . $query_table . ' (`username`, `config_data`) @@ -122,7 +128,9 @@ function PMA_saveUserprefs(array $config_array) $message = PMA_Message::error(__('Could not save configuration')); $message->addMessage('

    '); $message->addMessage( - PMA_Message::rawError($GLOBALS['dbi']->getError($GLOBALS['controllink'])) + PMA_Message::rawError( + $GLOBALS['dbi']->getError($GLOBALS['controllink']) + ) ); return $message; } @@ -275,7 +283,8 @@ function PMA_userprefsAutoloadGetHeader() $retval .= PMA_generate_common_hidden_inputs(); $retval .= ''; $retval .= ''; - $retval .= ''; + $retval .= ''; $retval .= __( 'Your browser has phpMyAdmin configuration for this domain. ' . 'Would you like to import it for current session?' diff --git a/setup/validate.php b/setup/validate.php index 393af94deb..7c2308a3c6 100644 --- a/setup/validate.php +++ b/setup/validate.php @@ -22,7 +22,7 @@ if (!($values instanceof stdClass)) { PMA_fatalError(__('Wrong data')); } $values = (array)$values; -$result = PMA_Validator::config_validate($vids, $values, true); +$result = PMA_Validator::validate($vids, $values, true); if ($result === false) { $result = 'Wrong data or no validation for ' . $vids; } From 8e71b13ced9ab158b26564dc5c9911a75a3cb36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:53:09 +0200 Subject: [PATCH 097/141] CS compliant transformation helper functions --- libraries/DisplayResults.class.php | 4 ++-- libraries/insert_edit.lib.php | 2 +- .../abstract/ImageLinkTransformationsPlugin.class.php | 4 ++-- .../abstract/InlineTransformationsPlugin.class.php | 4 ++-- .../abstract/TextImageLinkTransformationsPlugin.class.php | 4 ++-- .../abstract/TextLinkTransformationsPlugin.class.php | 4 ++-- libraries/transformations.lib.php | 6 +++--- test/libraries/PMA_transformation_test.php | 2 +- transformation_wrapper.php | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/libraries/DisplayResults.class.php b/libraries/DisplayResults.class.php index f23f55e679..47dfd29350 100644 --- a/libraries/DisplayResults.class.php +++ b/libraries/DisplayResults.class.php @@ -2749,7 +2749,7 @@ class PMA_DisplayResults $plugin_manager ); - $transform_options = PMA_transformation_getOptions( + $transform_options = PMA_Transformation_getOptions( isset($mime_map[$meta->name] ['transformation_options'] ) @@ -2796,7 +2796,7 @@ class PMA_DisplayResults [strtolower($this->__get('table'))] [strtolower($meta->name)][1](null); - $transform_options = PMA_transformation_getOptions( + $transform_options = PMA_Transformation_getOptions( isset($mime_map[$meta->name]['transformation_options']) ? $mime_map[$meta->name]['transformation_options'] : '' diff --git a/libraries/insert_edit.lib.php b/libraries/insert_edit.lib.php index e19058da82..ddfa404cf6 100644 --- a/libraries/insert_edit.lib.php +++ b/libraries/insert_edit.lib.php @@ -2088,7 +2088,7 @@ function PMA_transformEditedValues($db, $table, if (file_exists($include_file)) { include_once $include_file; - $transform_options = PMA_transformation_getOptions( + $transform_options = PMA_Transformation_getOptions( isset($transformation['transformation_options']) ? $transformation['transformation_options'] : '' diff --git a/libraries/plugins/transformations/abstract/ImageLinkTransformationsPlugin.class.php b/libraries/plugins/transformations/abstract/ImageLinkTransformationsPlugin.class.php index 794c95aeab..70909960e1 100644 --- a/libraries/plugins/transformations/abstract/ImageLinkTransformationsPlugin.class.php +++ b/libraries/plugins/transformations/abstract/ImageLinkTransformationsPlugin.class.php @@ -12,7 +12,7 @@ if (! defined('PHPMYADMIN')) { /* Get the transformations interface */ require_once 'libraries/plugins/TransformationsPlugin.class.php'; -/* For PMA_transformation_global_html_replace */ +/* For PMA_Transformation_globalHtmlReplace */ require_once 'libraries/transformations.lib.php'; /** @@ -49,7 +49,7 @@ abstract class ImageLinkTransformationsPlugin extends TransformationsPlugin 'string' => '
    [BLOB]' ); - return PMA_transformation_global_html_replace( + return PMA_Transformation_globalHtmlReplace( $buffer, $transform_options ); diff --git a/libraries/plugins/transformations/abstract/InlineTransformationsPlugin.class.php b/libraries/plugins/transformations/abstract/InlineTransformationsPlugin.class.php index 842bdcd2d6..3f6db3405c 100644 --- a/libraries/plugins/transformations/abstract/InlineTransformationsPlugin.class.php +++ b/libraries/plugins/transformations/abstract/InlineTransformationsPlugin.class.php @@ -12,7 +12,7 @@ if (! defined('PHPMYADMIN')) { /* Get the transformations interface */ require_once 'libraries/plugins/TransformationsPlugin.class.php'; -/* For PMA_transformation_global_html_replace */ +/* For PMA_Transformation_globalHtmlReplace */ require_once 'libraries/transformations.lib.php'; /** @@ -63,7 +63,7 @@ abstract class InlineTransformationsPlugin extends TransformationsPlugin . '" alt="[__BUFFER__]" width="320" height="240" />' ); } - return PMA_transformation_global_html_replace( + return PMA_Transformation_globalHtmlReplace( $buffer, $transform_options ); diff --git a/libraries/plugins/transformations/abstract/TextImageLinkTransformationsPlugin.class.php b/libraries/plugins/transformations/abstract/TextImageLinkTransformationsPlugin.class.php index 054b2f9b8d..2822bf9a25 100644 --- a/libraries/plugins/transformations/abstract/TextImageLinkTransformationsPlugin.class.php +++ b/libraries/plugins/transformations/abstract/TextImageLinkTransformationsPlugin.class.php @@ -12,7 +12,7 @@ if (! defined('PHPMYADMIN')) { /* Get the transformations interface */ require_once 'libraries/plugins/TransformationsPlugin.class.php'; -/* For PMA_transformation_global_html_replace */ +/* For PMA_Transformation_globalHtmlReplace */ require_once 'libraries/transformations.lib.php'; /** @@ -56,7 +56,7 @@ abstract class TextImageLinkTransformationsPlugin extends TransformationsPlugin . $buffer . '' ); - $buffer = PMA_transformation_global_html_replace( + $buffer = PMA_Transformation_globalHtmlReplace( $buffer, $transform_options ); diff --git a/libraries/plugins/transformations/abstract/TextLinkTransformationsPlugin.class.php b/libraries/plugins/transformations/abstract/TextLinkTransformationsPlugin.class.php index 054c1815c6..4ffaf9058d 100644 --- a/libraries/plugins/transformations/abstract/TextLinkTransformationsPlugin.class.php +++ b/libraries/plugins/transformations/abstract/TextLinkTransformationsPlugin.class.php @@ -12,7 +12,7 @@ if (! defined('PHPMYADMIN')) { /* Get the transformations interface */ require_once 'libraries/plugins/TransformationsPlugin.class.php'; -/* For PMA_transformation_global_html_replace */ +/* For PMA_Transformation_globalHtmlReplace */ require_once 'libraries/transformations.lib.php'; /** @@ -60,7 +60,7 @@ abstract class TextLinkTransformationsPlugin extends TransformationsPlugin . '' ); - return PMA_transformation_global_html_replace( + return PMA_Transformation_globalHtmlReplace( $buffer, $transform_options ); diff --git a/libraries/transformations.lib.php b/libraries/transformations.lib.php index 86af676a5e..765fc74500 100644 --- a/libraries/transformations.lib.php +++ b/libraries/transformations.lib.php @@ -24,7 +24,7 @@ if (! defined('PHPMYADMIN')) { * removes quotes * * - * PMA_transformation_getOptions("'option ,, quoted',abd,'2,3',"); + * PMA_Transformation_getOptions("'option ,, quoted',abd,'2,3',"); * // array { * // 'option ,, quoted', * // 'abc', @@ -37,7 +37,7 @@ if (! defined('PHPMYADMIN')) { * * @return array options */ -function PMA_transformation_getOptions($option_string) +function PMA_Transformation_getOptions($option_string) { $result = array(); @@ -348,7 +348,7 @@ function PMA_setMIME($db, $table, $key, $mimetype, $transformation, * * @return string containing the text with all the replacements */ -function PMA_transformation_global_html_replace($buffer, $options = array()) +function PMA_Transformation_globalHtmlReplace($buffer, $options = array()) { if ( ! isset($options['string']) ) { $options['string'] = ''; diff --git a/test/libraries/PMA_transformation_test.php b/test/libraries/PMA_transformation_test.php index 101bf86e9e..4a365a2b44 100644 --- a/test/libraries/PMA_transformation_test.php +++ b/test/libraries/PMA_transformation_test.php @@ -66,7 +66,7 @@ class PMA_Transformation_Test extends PHPUnit_Framework_TestCase { $this->assertEquals( $expected, - PMA_transformation_getOptions($input) + PMA_Transformation_getOptions($input) ); } diff --git a/transformation_wrapper.php b/transformation_wrapper.php index b7e0780ec0..23a8107f5d 100644 --- a/transformation_wrapper.php +++ b/transformation_wrapper.php @@ -74,7 +74,7 @@ $default_ct = 'application/octet-stream'; if ($cfgRelation['commwork'] && $cfgRelation['mimework']) { $mime_map = PMA_getMime($db, $table); - $mime_options = PMA_transformation_getOptions( + $mime_options = PMA_Transformation_getOptions( isset($mime_map[$transform_key]['transformation_options']) ? $mime_map[$transform_key]['transformation_options'] : '' ); From ffae07abda9cc3538c4ae137466595c633c1a21f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:54:51 +0200 Subject: [PATCH 098/141] Wrap long lines --- libraries/transformations.lib.php | 38 ++++++++++++++++++------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/libraries/transformations.lib.php b/libraries/transformations.lib.php index 765fc74500..756d737add 100644 --- a/libraries/transformations.lib.php +++ b/libraries/transformations.lib.php @@ -289,14 +289,18 @@ function PMA_setMIME($db, $table, $key, $mimetype, $transformation, && (strlen($mimetype) || strlen($transformation) || strlen($transformation_options) || strlen($row['comment'])) ) { - $upd_query = ' - UPDATE ' . PMA_Util::backquote($cfgRelation['db']) . '.' - . PMA_Util::backquote($cfgRelation['column_info']) . ' - SET `mimetype` = \'' . PMA_Util::sqlAddSlashes($mimetype) . '\', - `transformation` = \'' . PMA_Util::sqlAddSlashes($transformation) . '\', - `transformation_options` = \'' . PMA_Util::sqlAddSlashes($transformation_options) . '\''; + $upd_query = 'UPDATE ' . PMA_Util::backquote($cfgRelation['db']) . '.' + . PMA_Util::backquote($cfgRelation['column_info']) . + . 'SET ' + . '`mimetype` = \'' + . PMA_Util::sqlAddSlashes($mimetype) . '\', ' + . '`transformation` = \'' + . PMA_Util::sqlAddSlashes($transformation) . '\', ' + . '`transformation_options` = \'' + . PMA_Util::sqlAddSlashes($transformation_options) . '\''; } else { - $upd_query = 'DELETE FROM ' . PMA_Util::backquote($cfgRelation['db']) . '.' . PMA_Util::backquote($cfgRelation['column_info']); + $upd_query = 'DELETE FROM ' . PMA_Util::backquote($cfgRelation['db']) + . '.' . PMA_Util::backquote($cfgRelation['column_info']); } $upd_query .= ' WHERE `db_name` = \'' . PMA_Util::sqlAddSlashes($db) . '\' @@ -307,15 +311,17 @@ function PMA_setMIME($db, $table, $key, $mimetype, $transformation, || strlen($transformation_options) ) { - $upd_query = 'INSERT INTO ' . PMA_Util::backquote($cfgRelation['db']) . '.' . PMA_Util::backquote($cfgRelation['column_info']) - . ' (db_name, table_name, column_name, mimetype, transformation, transformation_options) ' - . ' VALUES(' - . '\'' . PMA_Util::sqlAddSlashes($db) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($table) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($key) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($mimetype) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($transformation) . '\',' - . '\'' . PMA_Util::sqlAddSlashes($transformation_options) . '\')'; + $upd_query = 'INSERT INTO ' . PMA_Util::backquote($cfgRelation['db']) + . '.' . PMA_Util::backquote($cfgRelation['column_info']) + . ' (db_name, table_name, column_name, mimetype, ' + . 'transformation, transformation_options) ' + . ' VALUES(' + . '\'' . PMA_Util::sqlAddSlashes($db) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($table) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($key) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($mimetype) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($transformation) . '\',' + . '\'' . PMA_Util::sqlAddSlashes($transformation_options) . '\')'; } if (isset($upd_query)) { From 0a3d1d5be80a93d24e40b3e90c5b6491da1141fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 10:58:17 +0200 Subject: [PATCH 099/141] Better names for URL generating functions --- browse_foreigners.php | 2 +- db_create.php | 6 +-- db_datadict.php | 4 +- db_printview.php | 2 +- db_qbe.php | 2 +- db_structure.php | 4 +- export.php | 12 ++--- gis_data_editor.php | 2 +- import.php | 12 ++--- index.php | 4 +- libraries/Advisor.class.php | 2 +- libraries/Config.class.php | 2 +- libraries/DBQbe.class.php | 4 +- libraries/DatabaseInterface.class.php | 2 +- libraries/DbSearch.class.php | 8 +-- libraries/DisplayResults.class.php | 52 +++++++++---------- libraries/Footer.class.php | 4 +- libraries/Header.class.php | 8 +-- libraries/Index.class.php | 4 +- libraries/Menu.class.php | 6 +-- libraries/ServerStatusData.class.php | 14 ++--- libraries/TableSearch.class.php | 10 ++-- libraries/Theme.class.php | 2 +- libraries/Theme_Manager.class.php | 2 +- libraries/Util.class.php | 38 +++++++------- libraries/common.inc.php | 2 +- libraries/config/FormDisplay.tpl.php | 2 +- libraries/core.lib.php | 6 +-- libraries/db_common.inc.php | 8 +-- libraries/db_table_exists.lib.php | 2 +- libraries/display_change_password.lib.php | 2 +- libraries/display_create_database.lib.php | 2 +- libraries/display_create_table.lib.php | 2 +- libraries/display_export.lib.php | 6 +-- libraries/display_import.lib.php | 10 ++-- libraries/display_indexes.lib.php | 2 +- libraries/display_select_lang.lib.php | 2 +- libraries/display_structure.lib.php | 2 +- libraries/import.lib.php | 10 ++-- libraries/index.lib.php | 2 +- libraries/insert_edit.lib.php | 18 +++---- libraries/mult_submits.inc.php | 8 +-- libraries/navigation/Navigation.class.php | 4 +- .../navigation/NavigationHeader.class.php | 10 ++-- .../navigation/Nodes/Node_Database.class.php | 2 +- .../Nodes/Node_DatabaseChild.class.php | 2 +- libraries/operations.lib.php | 26 +++++----- .../auth/AuthenticationConfig.class.php | 2 +- .../auth/AuthenticationCookie.class.php | 4 +- libraries/replication_gui.lib.php | 28 +++++----- libraries/rte/rte_events.lib.php | 2 +- libraries/rte/rte_main.inc.php | 2 +- libraries/rte/rte_routines.lib.php | 4 +- libraries/rte/rte_triggers.lib.php | 2 +- .../schema/Export_Relation_Schema.class.php | 2 +- libraries/schema/User_Schema.class.php | 10 ++-- libraries/select_server.lib.php | 4 +- libraries/server_bin_log.lib.php | 8 +-- libraries/server_common.inc.php | 2 +- libraries/server_databases.lib.php | 6 +-- libraries/server_engines.lib.php | 6 +-- libraries/server_privileges.lib.php | 28 +++++----- libraries/server_status.lib.php | 8 +-- libraries/server_status_variables.lib.php | 2 +- libraries/server_variables.lib.php | 2 +- libraries/sql.lib.php | 10 ++-- libraries/sql_query_form.lib.php | 6 +-- libraries/structure.lib.php | 10 ++-- libraries/tbl_columns_definition_form.lib.php | 4 +- libraries/tbl_common.inc.php | 6 +-- libraries/tbl_gis_visualization.lib.php | 4 +- libraries/url_generating.lib.php | 18 +++---- libraries/user_preferences.lib.php | 4 +- pmd_general.php | 2 +- pmd_pdf.php | 2 +- prefs_forms.php | 2 +- prefs_manage.php | 8 +-- querywindow.php | 8 +-- server_databases.php | 2 +- setup/frames/index.inc.php | 4 +- setup/frames/menu.inc.php | 2 +- setup/lib/form_processing.lib.php | 2 +- sql.php | 4 +- tbl_addfield.php | 2 +- tbl_change.php | 4 +- tbl_chart.php | 2 +- tbl_create.php | 18 +++---- tbl_find_replace.php | 2 +- tbl_move_copy.php | 2 +- tbl_printview.php | 4 +- tbl_relation.php | 2 +- tbl_row_action.php | 4 +- tbl_select.php | 2 +- tbl_structure.php | 2 +- tbl_tracking.php | 16 +++--- tbl_zoom_select.php | 2 +- test/libraries/PMA_display_export_test.php | 2 +- test/libraries/PMA_generateCommonUrl_test.php | 26 +++++----- .../libraries/PMA_server_user_groups_test.php | 8 +-- test/libraries/PMA_server_variables_test.php | 2 +- .../core/PMA_headerLocation_test.php | 6 +-- test/theme.php | 4 +- user_password.php | 4 +- view_create.php | 2 +- view_operations.php | 2 +- 105 files changed, 338 insertions(+), 338 deletions(-) diff --git a/browse_foreigners.php b/browse_foreigners.php index 6ef81be26a..8f40f211cb 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -164,7 +164,7 @@ $header->getScripts()->addCode($code); // HTML output $output = '
    ' . '
    ' - . PMA_generate_common_hidden_inputs($db, $table) + . PMA_URL_getHiddenInputs($db, $table) . '' . ''; diff --git a/db_create.php b/db_create.php index d99a851090..a5cd007f25 100644 --- a/db_create.php +++ b/db_create.php @@ -20,7 +20,7 @@ require 'libraries/build_html_for_db.lib.php'; /** * Defines the url to return to in case of error in a sql statement */ -$err_url = 'index.php?' . PMA_generate_common_url(); +$err_url = 'index.php?' . PMA_URL_getCommon(); /** * Builds and executes the db creation sql query @@ -70,7 +70,7 @@ if (! $result) { // the list of databases on server_databases.php /** - * Build the array to be passed to {@link PMA_generate_common_url} + * Build the array to be passed to {@link PMA_URL_getCommon} * to generate the links * * @global array $GLOBALS['db_url_params'] @@ -80,7 +80,7 @@ if (! $result) { $is_superuser = $GLOBALS['dbi']->isSuperuser(); $column_order = PMA_getColumnOrder(); - $url_query = PMA_generate_common_url($_POST['new_db']); + $url_query = PMA_URL_getCommon($_POST['new_db']); /** * String that will contain the output HTML diff --git a/db_datadict.php b/db_datadict.php index 688d18ca50..6a17a57af8 100644 --- a/db_datadict.php +++ b/db_datadict.php @@ -37,9 +37,9 @@ PMA_Util::checkParameters(array('db')); * Defines the url to return to in case of error in a sql statement */ if (strlen($table)) { - $err_url = 'tbl_sql.php?' . PMA_generate_common_url($db, $table); + $err_url = 'tbl_sql.php?' . PMA_URL_getCommon($db, $table); } else { - $err_url = 'db_sql.php?' . PMA_generate_common_url($db); + $err_url = 'db_sql.php?' . PMA_URL_getCommon($db); } if ($cfgRelation['commwork']) { diff --git a/db_printview.php b/db_printview.php index 965ca1af76..92f70024b9 100644 --- a/db_printview.php +++ b/db_printview.php @@ -20,7 +20,7 @@ PMA_Util::checkParameters(array('db')); /** * Defines the url to return to in case of error in a sql statement */ -$err_url = 'db_sql.php?' . PMA_generate_common_url($db); +$err_url = 'db_sql.php?' . PMA_URL_getCommon($db); /** * Settings for relations stuff diff --git a/db_qbe.php b/db_qbe.php index 849d10eff0..7fad34d72d 100644 --- a/db_qbe.php +++ b/db_qbe.php @@ -58,7 +58,7 @@ $db_qbe = new PMA_DBQbe($GLOBALS['db']); * Displays the Query by example form */ if ($cfgRelation['designerwork']) { - $url = 'pmd_general.php' . PMA_generate_common_url( + $url = 'pmd_general.php' . PMA_URL_getCommon( array_merge( $url_params, array('query' => 1) diff --git a/db_structure.php b/db_structure.php index 3437122454..0eed9ad925 100644 --- a/db_structure.php +++ b/db_structure.php @@ -28,7 +28,7 @@ if ((!empty($_POST['submit_mult']) && isset($_POST['selected_tbl'])) || isset($_POST['mult_btn']) ) { $action = 'db_structure.php'; - $err_url = 'db_structure.php?'. PMA_generate_common_url($db); + $err_url = 'db_structure.php?'. PMA_URL_getCommon($db); // see bug #2794840; in this case, code path is: // db_structure.php -> libraries/mult_submits.inc.php -> sql.php @@ -111,7 +111,7 @@ $response->addHTML( . 'name="tablesForm" id="tablesForm">' ); -$response->addHTML(PMA_generate_common_hidden_inputs($db)); +$response->addHTML(PMA_URL_getHiddenInputs($db)); $response->addHTML( PMA_tableHeader($db_is_information_schema, $server_slave_status) diff --git a/export.php b/export.php index 9f3807713c..4abd931eac 100644 --- a/export.php +++ b/export.php @@ -219,9 +219,9 @@ if (!defined('TESTSUITE')) { // Generate error url and check for needed variables if ($export_type == 'server') { - $err_url = 'server_export.php?' . PMA_generate_common_url(); + $err_url = 'server_export.php?' . PMA_URL_getCommon(); } elseif ($export_type == 'database' && strlen($db)) { - $err_url = 'db_export.php?' . PMA_generate_common_url($db); + $err_url = 'db_export.php?' . PMA_URL_getCommon($db); // Check if we have something to export if (isset($table_select)) { $tables = $table_select; @@ -229,7 +229,7 @@ if (!defined('TESTSUITE')) { $tables = array(); } } elseif ($export_type == 'table' && strlen($db) && strlen($table)) { - $err_url = 'tbl_export.php?' . PMA_generate_common_url($db, $table); + $err_url = 'tbl_export.php?' . PMA_URL_getCommon($db, $table); } else { PMA_fatalError(__('Bad parameters!')); } @@ -576,11 +576,11 @@ if (!defined('TESTSUITE')) { */ $back_button = '

    [ '; } -echo PMA_generate_common_hidden_inputs(); +echo PMA_URL_getHiddenInputs(); echo ''; echo '

    '; echo ' ' . "\n" - . PMA_generate_common_hidden_inputs(null, null, 4, 'collation_connection') + . PMA_URL_getHiddenInputs(null, null, 4, 'collation_connection') . ' \1', $this->translate($rule['recommendation']) ); diff --git a/libraries/Config.class.php b/libraries/Config.class.php index 8a5b27f4ea..0b81062b9d 100644 --- a/libraries/Config.class.php +++ b/libraries/Config.class.php @@ -1738,7 +1738,7 @@ class PMA_Config { return '' . "\n" - . PMA_generate_common_hidden_inputs() . "\n" + . PMA_URL_getHiddenInputs() . "\n" . PMA_Config::getFontsizeSelection() . "\n" . ''; } diff --git a/libraries/DBQbe.class.php b/libraries/DBQbe.class.php index cd55607f6a..8b93578989 100644 --- a/libraries/DBQbe.class.php +++ b/libraries/DBQbe.class.php @@ -1304,7 +1304,7 @@ class PMA_DbQbe $url_params['db'] = $this->_db; $url_params['criteriaColumnCount'] = $this->_new_column_count; $url_params['rows'] = $this->_new_row_count; - $html_output .= PMA_generate_common_hidden_inputs($url_params); + $html_output .= PMA_URL_getHiddenInputs($url_params); $html_output .= '
    '; // get footers $html_output .= $this->_getTableFooters(); @@ -1312,7 +1312,7 @@ class PMA_DbQbe $html_output .= $this->_getTablesList(); $html_output .= ''; $html_output .= '
    '; - $html_output .= PMA_generate_common_hidden_inputs(array('db' => $this->_db)); + $html_output .= PMA_URL_getHiddenInputs(array('db' => $this->_db)); // get SQL query $html_output .= '
    '; $html_output .= '
    '; diff --git a/libraries/DatabaseInterface.class.php b/libraries/DatabaseInterface.class.php index 29502e2751..0cc6cadbe8 100644 --- a/libraries/DatabaseInterface.class.php +++ b/libraries/DatabaseInterface.class.php @@ -2027,7 +2027,7 @@ class PMA_DatabaseInterface */ $error .= ' - ' . $error_message . ' (' . __('Details…') . ')'; } diff --git a/libraries/DbSearch.class.php b/libraries/DbSearch.class.php index ec0f3d7df3..15f178afd6 100644 --- a/libraries/DbSearch.class.php +++ b/libraries/DbSearch.class.php @@ -337,15 +337,15 @@ class PMA_DbSearch // Displays browse/delete link if result count > 0 if ($res_cnt > 0) { $this_url_params['sql_query'] = $newsearchsqls['select_columns']; - $browse_result_path = 'sql.php' . PMA_generate_common_url($this_url_params); + $browse_result_path = 'sql.php' . PMA_URL_getCommon($this_url_params); $html_output .= '
  • '; $this_url_params['sql_query'] = $newsearchsqls['delete']; - $delete_result_path = 'sql.php' . PMA_generate_common_url($this_url_params); + $delete_result_path = 'sql.php' . PMA_URL_getCommon($this_url_params); $html_output .= '' . "\n"; $this_params = $GLOBALS['url_params']; @@ -618,7 +618,7 @@ class PMA_Index . ' value="' . $js_msg . '" />'; $r .= ' ' . PMA_Util::getIcon('b_drop.png', __('Drop')) . '' . '' . "\n"; diff --git a/libraries/Menu.class.php b/libraries/Menu.class.php index ad5eb52e17..9a23e523ac 100644 --- a/libraries/Menu.class.php +++ b/libraries/Menu.class.php @@ -194,7 +194,7 @@ class PMA_Menu $retval .= sprintf( $item, $GLOBALS['cfg']['DefaultTabServer'], - PMA_generate_common_url(), + PMA_URL_getCommon(), htmlspecialchars($server_info), __('Server') ); @@ -211,7 +211,7 @@ class PMA_Menu $retval .= sprintf( $item, $GLOBALS['cfg']['DefaultTabDatabase'], - PMA_generate_common_url($this->_db), + PMA_URL_getCommon($this->_db), htmlspecialchars($this->_db), __('Database') ); @@ -234,7 +234,7 @@ class PMA_Menu $retval .= sprintf( $item, $GLOBALS['cfg']['DefaultTabTable'], - PMA_generate_common_url($this->_db, $this->_table), + PMA_URL_getCommon($this->_db, $this->_table), str_replace(' ', ' ', htmlspecialchars($this->_table)), $tbl_is_view ? __('View') : __('Table') ); diff --git a/libraries/ServerStatusData.class.php b/libraries/ServerStatusData.class.php index 324493a348..dc000dd33d 100644 --- a/libraries/ServerStatusData.class.php +++ b/libraries/ServerStatusData.class.php @@ -208,16 +208,16 @@ class PMA_ServerStatusData $links = array(); $links['table'][__('Flush (close) all tables')] - = $this->selfUrl . '?flush=TABLES&' . PMA_generate_common_url(); + = $this->selfUrl . '?flush=TABLES&' . PMA_URL_getCommon(); $links['table'][__('Show open tables')] = 'sql.php?sql_query=' . urlencode('SHOW OPEN TABLES') . - '&goto=' . $this->selfUrl . '&' . PMA_generate_common_url(); + '&goto=' . $this->selfUrl . '&' . PMA_URL_getCommon(); if ($GLOBALS['server_master_status']) { $links['repl'][__('Show slave hosts')] = 'sql.php?sql_query=' . urlencode('SHOW SLAVE HOSTS') . '&goto=' . $this->selfUrl . '&' - . PMA_generate_common_url(); + . PMA_URL_getCommon(); $links['repl'][__('Show master status')] = '#replication_master'; } if ($GLOBALS['server_slave_status']) { @@ -228,7 +228,7 @@ class PMA_ServerStatusData $links['qcache'][__('Flush query cache')] = $this->selfUrl . '?flush=' . urlencode('QUERY CACHE') . '&' . - PMA_generate_common_url(); + PMA_URL_getCommon(); $links['qcache']['doc'] = 'query_cache'; $links['threads']['doc'] = 'mysql_threads'; @@ -240,10 +240,10 @@ class PMA_ServerStatusData $links['Slow_queries']['doc'] = 'slow_query_log'; $links['innodb'][__('Variables')] - = 'server_engines.php?engine=InnoDB&' . PMA_generate_common_url(); + = 'server_engines.php?engine=InnoDB&' . PMA_URL_getCommon(); $links['innodb'][__('InnoDB Status')] = 'server_engines.php?engine=InnoDB&page=Status&' . - PMA_generate_common_url(); + PMA_URL_getCommon(); $links['innodb']['doc'] = 'innodb'; @@ -336,7 +336,7 @@ class PMA_ServerStatusData */ public function getMenuHtml() { - $url_params = PMA_generate_common_url(); + $url_params = PMA_URL_getCommon(); $items = array( array( 'name' => __('Server'), diff --git a/libraries/TableSearch.class.php b/libraries/TableSearch.class.php index 212387f145..198f346084 100644 --- a/libraries/TableSearch.class.php +++ b/libraries/TableSearch.class.php @@ -235,7 +235,7 @@ class PMA_TableSearch . ' size="40" class="textfield" id="field_' . $column_index . '" />'; if ($in_fbs) { - $edit_url = 'gis_data_editor.php?' . PMA_generate_common_url(); + $edit_url = 'gis_data_editor.php?' . PMA_URL_getCommon(); $edit_str = PMA_Util::getIcon('b_edit.png', __('Edit/Insert')); $html_output .= ''; $html_output .= PMA_Util::linkOrButton( @@ -288,7 +288,7 @@ class PMA_TableSearch $html_output .= <<'; - $html_output .= PMA_generate_common_hidden_inputs($this->_db, $this->_table); + $html_output .= PMA_URL_getHiddenInputs($this->_db, $this->_table); $html_output .= ''; $html_output .= ''; @@ -1202,7 +1202,7 @@ EOT; $html_output .= ''; - $html_output .= PMA_generate_common_hidden_inputs($this->_db, $this->_table); + $html_output .= PMA_URL_getHiddenInputs($this->_db, $this->_table); $html_output .= ''; $html_output .= ''; @@ -1326,7 +1326,7 @@ EOT; $htmlOutput = ''; - $htmlOutput .= PMA_generate_common_hidden_inputs($this->_db, $this->_table); + $htmlOutput .= PMA_URL_getHiddenInputs($this->_db, $this->_table); $htmlOutput .= ''; $htmlOutput .= ''; diff --git a/libraries/Theme.class.php b/libraries/Theme.class.php index 22a68602ff..9126a2e5ec 100644 --- a/libraries/Theme.class.php +++ b/libraries/Theme.class.php @@ -381,7 +381,7 @@ class PMA_Theme public function getPrintPreview() { $url_params = array('set_theme' => $this->getId()); - $url = 'index.php'. PMA_generate_common_url($url_params); + $url = 'index.php'. PMA_URL_getCommon($url_params); $retval = '
    '; $retval .= '

    '; diff --git a/libraries/Theme_Manager.class.php b/libraries/Theme_Manager.class.php index cb16164b6a..9a99e00e23 100644 --- a/libraries/Theme_Manager.class.php +++ b/libraries/Theme_Manager.class.php @@ -361,7 +361,7 @@ class PMA_Theme_Manager if ($form) { $select_box .= ''; + . PMA_URL_getCommon($_url_params) . '">'; } elseif (strlen($db)) { $_url_params['db'] = $db; $doedit_goto = ''; + . PMA_URL_getCommon($_url_params) . '">'; } else { $doedit_goto = ''; + . PMA_URL_getCommon($_url_params) . '">'; } $error_msg .= $doedit_goto @@ -1185,7 +1185,7 @@ class PMA_Util } if (isset($explain_params['sql_query'])) { $explain_link = 'import.php' - . PMA_generate_common_url($explain_params); + . PMA_URL_getCommon($explain_params); $explain_link = ' [' . self::linkOrButton($explain_link, $_message) . ']'; } @@ -1204,7 +1204,7 @@ class PMA_Util $onclick = ''; } - $edit_link .= PMA_generate_common_url($url_params) . '#querybox'; + $edit_link .= PMA_URL_getCommon($url_params) . '#querybox'; $edit_link = ' [' . self::linkOrButton( $edit_link, __('Edit'), @@ -1227,13 +1227,13 @@ class PMA_Util $_message = __('Create PHP Code'); } - $php_link = 'import.php' . PMA_generate_common_url($php_params); + $php_link = 'import.php' . PMA_URL_getCommon($php_params); $php_link = ' [' . self::linkOrButton($php_link, $_message) . ']'; if (isset($GLOBALS['show_as_php'])) { $runquery_link = 'import.php' - . PMA_generate_common_url($url_params); + . PMA_URL_getCommon($url_params); $php_link .= ' [' . self::linkOrButton($runquery_link, __('Submit Query')) @@ -1248,7 +1248,7 @@ class PMA_Util && ! isset($GLOBALS['show_as_php']) // 'Submit query' does the same && preg_match('@^(SELECT|SHOW)[[:space:]]+@i', $sql_query) ) { - $refresh_link = 'import.php' . PMA_generate_common_url($url_params); + $refresh_link = 'import.php' . PMA_URL_getCommon($url_params); $refresh_link = ' [' . self::linkOrButton($refresh_link, __('Refresh')) . ']'; } else { @@ -1267,7 +1267,7 @@ class PMA_Util } $validate_link = 'import.php' - . PMA_generate_common_url($validate_params); + . PMA_URL_getCommon($validate_params); $validate_link = ' [' . self::linkOrButton($validate_link, $validate_message) . ']'; } else { @@ -1297,7 +1297,7 @@ class PMA_Util $retval .= '
    '; $retval .= ''; - $retval .= PMA_generate_common_hidden_inputs( + $retval .= PMA_URL_getHiddenInputs( $GLOBALS['db'], $GLOBALS['table'] ); $retval .= '' . $caption1 + . PMA_URL_getCommon($_url_params) . '">' . $caption1 . ''; $_url_params[$name] = $pos - $max_count; $list_navigator_html .= '' . $caption2 + . PMA_URL_getCommon($_url_params) . '">' . $caption2 . ''; } $list_navigator_html .= ''; - $list_navigator_html .= PMA_generate_common_hidden_inputs($_url_params); + $list_navigator_html .= PMA_URL_getHiddenInputs($_url_params); $list_navigator_html .= self::pageselector( $name, $max_count, @@ -2532,7 +2532,7 @@ class PMA_Util $_url_params[$name] = $pos + $max_count; $list_navigator_html .= '' . $caption3 + . PMA_URL_getCommon($_url_params) . '" >' . $caption3 . ''; $_url_params[$name] = floor($count / $max_count) * $max_count; @@ -2541,7 +2541,7 @@ class PMA_Util } $list_navigator_html .= '' . $caption4 + . PMA_URL_getCommon($_url_params) . '" >' . $caption4 . ''; } $list_navigator_html .= '
    ' . "\n"; @@ -2592,7 +2592,7 @@ class PMA_Util } return '' . "\n"; } - echo PMA_generate_common_hidden_inputs('', '', 0, 'server') . "\n"; + echo PMA_URL_getHiddenInputs('', '', 0, 'server') . "\n"; echo PMA_getHiddenFields((array)$hidden_fields); } diff --git a/libraries/core.lib.php b/libraries/core.lib.php index da2cce43a7..bc283b74f3 100644 --- a/libraries/core.lib.php +++ b/libraries/core.lib.php @@ -560,7 +560,7 @@ function PMA_sendHeaderLocation($uri, $use_refresh = false) if (strpos($uri, '?') === false) { header('Location: ' . $uri . '?' . SID); } else { - $separator = PMA_get_arg_separator(); + $separator = PMA_URL_getArgSeparator(); header('Location: ' . $uri . $separator . SID); } } else { @@ -756,12 +756,12 @@ function PMA_linkURL($url) if (!preg_match('#^https?://#', $url) || defined('PMA_SETUP')) { return $url; } else { - if (!function_exists('PMA_generate_common_url')) { + if (!function_exists('PMA_URL_getCommon')) { include_once './libraries/url_generating.lib.php'; } $params = array(); $params['url'] = $url; - return './url.php' . PMA_generate_common_url($params); + return './url.php' . PMA_URL_getCommon($params); } } diff --git a/libraries/db_common.inc.php b/libraries/db_common.inc.php index 3c23895224..a16a700890 100644 --- a/libraries/db_common.inc.php +++ b/libraries/db_common.inc.php @@ -26,8 +26,8 @@ if ($db_is_information_schema) { /** * Defines the urls to return to in case of error in a sql statement */ -$err_url_0 = 'index.php?' . PMA_generate_common_url(); -$err_url = $cfg['DefaultTabDatabase'] . '?' . PMA_generate_common_url($db); +$err_url_0 = 'index.php?' . PMA_URL_getCommon(); +$err_url = $cfg['DefaultTabDatabase'] . '?' . PMA_URL_getCommon($db); /** @@ -47,7 +47,7 @@ if (! isset($is_db) || ! $is_db) { } // Not a valid db name -> back to the welcome page $uri = $cfg['PmaAbsoluteUri'] . 'index.php?' - . PMA_generate_common_url('', '', '&') + . PMA_URL_getCommon('', '', '&') . (isset($message) ? '&message=' . urlencode($message) : '') . '&reload=1'; if (! strlen($db) || ! $is_db) { $response = PMA_Response::getInstance(); @@ -95,6 +95,6 @@ if (isset($_REQUEST['submitcollation']) /** * Set parameters for links */ -$url_query = PMA_generate_common_url($db); +$url_query = PMA_URL_getCommon($db); ?> diff --git a/libraries/db_table_exists.lib.php b/libraries/db_table_exists.lib.php index f2eaf6727e..706629e488 100644 --- a/libraries/db_table_exists.lib.php +++ b/libraries/db_table_exists.lib.php @@ -40,7 +40,7 @@ if (empty($is_db)) { } PMA_sendHeaderLocation( $cfg['PmaAbsoluteUri'] . 'index.php' - . PMA_generate_common_url($url_params, '&') + . PMA_URL_getCommon($url_params, '&') ); } exit; diff --git a/libraries/display_change_password.lib.php b/libraries/display_change_password.lib.php index 06b0b2eec7..3d068d4c2a 100644 --- a/libraries/display_change_password.lib.php +++ b/libraries/display_change_password.lib.php @@ -34,7 +34,7 @@ function PMA_getHtmlForChangePassword($username, $hostname) . 'name="chgPassword" ' . 'class="ajax" >'; - $html .= PMA_generate_common_hidden_inputs(); + $html .= PMA_URL_getHiddenInputs(); if (strpos($GLOBALS['PMA_PHP_SELF'], 'server_privileges') !== false) { $html .= ' ' . PMA_Util::showMySQLDocu('CREATE_DATABASE'); $html .= '
    '; - $html .= PMA_generate_common_hidden_inputs('', '', 5); + $html .= PMA_URL_getHiddenInputs('', '', 5); $html .= ''; $html .= ''; diff --git a/libraries/display_create_table.lib.php b/libraries/display_create_table.lib.php index dcdeca84b7..f358eb8615 100644 --- a/libraries/display_create_table.lib.php +++ b/libraries/display_create_table.lib.php @@ -46,7 +46,7 @@ if (PMA_Util::showIcons('ActionLinksMode')) { echo __('Create table'); ?> - +
    : diff --git a/libraries/display_export.lib.php b/libraries/display_export.lib.php index f7730601c8..345bd6fe37 100644 --- a/libraries/display_export.lib.php +++ b/libraries/display_export.lib.php @@ -107,11 +107,11 @@ function PMA_getHtmlForHiddenInput( global $cfg; $html = ""; if ($export_type == 'server') { - $html .= PMA_generate_common_hidden_inputs('', '', 1); + $html .= PMA_URL_getHiddenInputs('', '', 1); } elseif ($export_type == 'database') { - $html .= PMA_generate_common_hidden_inputs($db, '', 1); + $html .= PMA_URL_getHiddenInputs($db, '', 1); } else { - $html .= PMA_generate_common_hidden_inputs($db, $table, 1); + $html .= PMA_URL_getHiddenInputs($db, $table, 1); } // just to keep this value for possible next display of this form after saving diff --git a/libraries/display_import.lib.php b/libraries/display_import.lib.php index 4c9cf29a16..e1cea907f9 100644 --- a/libraries/display_import.lib.php +++ b/libraries/display_import.lib.php @@ -26,11 +26,11 @@ function PMA_getHtmlForHiddenInputs($import_type, $db, $table) { $html = ''; if ($import_type == 'server') { - $html .= PMA_generate_common_hidden_inputs('', '', 1); + $html .= PMA_URL_getHiddenInputs('', '', 1); } elseif ($import_type == 'database') { - $html .= PMA_generate_common_hidden_inputs($db, '', 1); + $html .= PMA_URL_getHiddenInputs($db, '', 1); } else { - $html .= PMA_generate_common_hidden_inputs($db, $table, 1); + $html .= PMA_URL_getHiddenInputs($db, $table, 1); } $html .= ' '."\n"; @@ -441,7 +441,7 @@ function PMA_getHtmlForImportWithPlugin($upload_id) { //some variable for javasript $ajax_url = "import_status.php?id=" . $upload_id . "&" - . PMA_generate_common_url(array('import_status'=>1), '&'); + . PMA_URL_getCommon(array('import_status'=>1), '&'); $promot_str = PMA_jsFormat( __( 'The file being uploaded is probably larger than ' @@ -459,7 +459,7 @@ function PMA_getHtmlForImportWithPlugin($upload_id) __('The file is being processed, please be patient.'), false ); - $import_url = PMA_generate_common_url(array('import_status'=>1), '&'); + $import_url = PMA_URL_getCommon(array('import_status'=>1), '&'); //start output $html = 'var finished = false; '; diff --git a/libraries/display_indexes.lib.php b/libraries/display_indexes.lib.php index e4ed7f2f03..31aa5da33c 100644 --- a/libraries/display_indexes.lib.php +++ b/libraries/display_indexes.lib.php @@ -40,7 +40,7 @@ if (isset($_REQUEST['create_index'])) { $form_params['old_index'] = $_REQUEST['index']; } -$html .= PMA_generate_common_hidden_inputs($form_params); +$html .= PMA_URL_getHiddenInputs($form_params); $html .= '
    '; diff --git a/libraries/display_select_lang.lib.php b/libraries/display_select_lang.lib.php index 4ea824f975..bab89e829a 100644 --- a/libraries/display_select_lang.lib.php +++ b/libraries/display_select_lang.lib.php @@ -48,7 +48,7 @@ function PMA_getLanguageSelectorHtml($use_fieldset = false, $show_doc = true) 'db' => $GLOBALS['db'], 'table' => $GLOBALS['table'], ); - $retval .= PMA_generate_common_hidden_inputs($_form_params); + $retval .= PMA_URL_getHiddenInputs($_form_params); // For non-English, display "Language" with emphasis because it's // not a proper word in the current language; we show it to help diff --git a/libraries/display_structure.lib.php b/libraries/display_structure.lib.php index 0a92e30f6e..60eeba3c00 100644 --- a/libraries/display_structure.lib.php +++ b/libraries/display_structure.lib.php @@ -31,7 +31,7 @@ $html_form = ''; $response->addHTML($html_form); -$response->addHTML(PMA_generate_common_hidden_inputs($db, $table)); +$response->addHTML(PMA_URL_getHiddenInputs($db, $table)); $tabletype = ' (string)$db_name); - $db_url = 'db_structure.php' . PMA_generate_common_url($params); - $db_ops_url = 'db_operations.php' . PMA_generate_common_url($params); + $db_url = 'db_structure.php' . PMA_URL_getCommon($params); + $db_ops_url = 'db_operations.php' . PMA_URL_getCommon($params); $message = '

    '; $message .= '' . __('The following structures have either been created or altered. Here you can:') . '
    '; @@ -1216,9 +1216,9 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, 'db' => (string) $db_name, 'table' => (string) $tables[$i][TBL_NAME] ); - $tbl_url = 'sql.php' . PMA_generate_common_url($params); - $tbl_struct_url = 'tbl_structure.php' . PMA_generate_common_url($params); - $tbl_ops_url = 'tbl_operations.php' . PMA_generate_common_url($params); + $tbl_url = 'sql.php' . PMA_URL_getCommon($params); + $tbl_struct_url = 'tbl_structure.php' . PMA_URL_getCommon($params); + $tbl_ops_url = 'tbl_operations.php' . PMA_URL_getCommon($params); unset($params); diff --git a/libraries/index.lib.php b/libraries/index.lib.php index 02596a6c16..2824af1b2b 100644 --- a/libraries/index.lib.php +++ b/libraries/index.lib.php @@ -25,7 +25,7 @@ function PMA_getHtmlForDisplayIndexes() $html_output .= PMA_Index::getView($GLOBALS['table'], $GLOBALS['db']); $html_output .= '
    ' . ''; - $html_output .= PMA_generate_common_hidden_inputs( + $html_output .= PMA_URL_getHiddenInputs( $GLOBALS['db'], $GLOBALS['table'] ); $html_output .= sprintf( diff --git a/libraries/insert_edit.lib.php b/libraries/insert_edit.lib.php index ddfa404cf6..083e78b9a0 100644 --- a/libraries/insert_edit.lib.php +++ b/libraries/insert_edit.lib.php @@ -207,12 +207,12 @@ function PMA_showFunctionFieldsInEditMode($url_params, $showFuncFields) $this_url_params = array_merge($url_params, $params); if (! $showFuncFields) { return ' : ' + . PMA_URL_getCommon($this_url_params) . '">' . __('Function') . '' . "\n"; } return '

    ' . "\n"; @@ -239,11 +239,11 @@ function PMA_showColumnTypesInDataEditView($url_params, $showColumnType) $this_other_url_params = array_merge($url_params, $params); if (! $showColumnType) { return ' : ' + . PMA_URL_getCommon($this_other_url_params) . '">' . __('Type') . '' . "\n"; } return '' . "\n"; } @@ -734,7 +734,7 @@ function PMA_getForeignLink($column, $backup_field, $column_name_appendix, . 'onclick="window.open(this.href,\'foreigners\', \'width=640,height=240,' . 'scrollbars=yes,resizable=yes\'); return false;" ' . 'href="browse_foreigners.php?' - . PMA_generate_common_url($db, $table) . '&field=' + . PMA_URL_getCommon($db, $table) . '&field=' . PMA_escapeJsString(urlencode($column['Field']) . $rownumber_param) . '">' . str_replace("'", "\'", $titles['Browse']) . ''; return $html_output; @@ -1371,7 +1371,7 @@ function PMA_getContinueInsertionForm($table, $db, $where_clause_array, $err_url { $html_output = '' - . PMA_generate_common_hidden_inputs($db, $table) + . PMA_URL_getHiddenInputs($db, $table) . '' . ''; + . PMA_URL_getCommon($_url_params) . '"' . $title . '>'; if ('D' == $_SESSION['tmp_user_values']['relational_display']) { // user chose "relational display field" in the @@ -2094,7 +2094,7 @@ function PMA_transformEditedValues($db, $table, : '' ); $transform_options['wrapper_link'] - = PMA_generate_common_url($_url_params); + = PMA_URL_getCommon($_url_params); $class_name = str_replace('.class.php', '', $file); $plugin_manager = null; $transformation_plugin = new $class_name( diff --git a/libraries/mult_submits.inc.php b/libraries/mult_submits.inc.php index 493436ceec..a3fc79c8bb 100644 --- a/libraries/mult_submits.inc.php +++ b/libraries/mult_submits.inc.php @@ -286,7 +286,7 @@ if (!empty($submit_mult) && !empty($what)) { } if ($what == 'replace_prefix_tbl' || $what == 'copy_tbl_change_prefix') { echo ''; - echo PMA_generate_common_hidden_inputs($_url_params); + echo PMA_URL_getHiddenInputs($_url_params); echo '
    '; echo ''; if ($what == 'replace_prefix_tbl') { @@ -317,7 +317,7 @@ if (!empty($submit_mult) && !empty($what)) { echo ''; } elseif ($what == 'add_prefix_tbl') { echo '
    '; - echo PMA_generate_common_hidden_inputs($_url_params); + echo PMA_URL_getHiddenInputs($_url_params); echo '
    '; echo '' . __('Add table prefix:') . ''; echo '
    ' . __('Structure') - . PMA_Util::showMySQLDocu('SQL-Syntax', 'CREATE_TABLE') . '
    ' . __('Browse') . ''; - $html_output .= PMA_generate_common_hidden_inputs($GLOBALS['db']); + $html_output .= PMA_URL_getHiddenInputs($GLOBALS['db']); $html_output .= '
    '; // set legend caption $html_output .= '' . __('Search in database') . ''; diff --git a/libraries/DisplayResults.class.php b/libraries/DisplayResults.class.php index 47dfd29350..bd69378184 100644 --- a/libraries/DisplayResults.class.php +++ b/libraries/DisplayResults.class.php @@ -546,7 +546,7 @@ class PMA_DisplayResults return '
    ' . '' - . PMA_generate_common_hidden_inputs( + . PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table') ) . ''; $table_navigation_html .= PMA_Util::pageselector( @@ -733,7 +733,7 @@ class PMA_DisplayResults . ')' .'">'; - $table_navigation_html .= PMA_generate_common_hidden_inputs( + $table_navigation_html .= PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table') ); @@ -793,7 +793,7 @@ class PMA_DisplayResults return "\n" . '' . '' - . PMA_generate_common_hidden_inputs( + . PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table') ) . '' . '
    ' - . PMA_generate_common_hidden_inputs( + . PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table') ) . '
    '; @@ -1219,7 +1219,7 @@ class PMA_DisplayResults $drop_down_html = ''; $drop_down_html .= '' . "\n" - . PMA_generate_common_hidden_inputs( + . PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table') ) . __('Sort by key') @@ -1560,7 +1560,7 @@ class PMA_DisplayResults 'display_options_form' => 1 ); - $options_html .= PMA_generate_common_hidden_inputs($url_params) + $options_html .= PMA_URL_getHiddenInputs($url_params) . '
    ' . PMA_Util::getDivForSliderEffect( 'displayoptions', __('Options') @@ -1685,7 +1685,7 @@ class PMA_DisplayResults $tmp_image = ''
                      . $tmp_txt . ''; - $tmp_url = 'sql.php' . PMA_generate_common_url($url_params_full_text); + $tmp_url = 'sql.php' . PMA_URL_getCommon($url_params_full_text); return PMA_Util::linkOrButton( $tmp_url, $tmp_image, array(), false @@ -1718,7 +1718,7 @@ class PMA_DisplayResults $form_html .= ' class="ajax" '; $form_html .= '>' - . PMA_generate_common_hidden_inputs( + . PMA_URL_getHiddenInputs( $this->__get('db'), $this->__get('table'), 1 ) . ''; @@ -1872,7 +1872,7 @@ class PMA_DisplayResults 'sql_query' => $sorted_sql_query, 'session_max_rows' => $session_max_rows ); - $order_url = 'sql.php' . PMA_generate_common_url($_url_params); + $order_url = 'sql.php' . PMA_URL_getCommon($_url_params); // Displays the sorting URL // enable sort order swapping for image @@ -2779,7 +2779,7 @@ class PMA_DisplayResults } $transform_options['wrapper_link'] - = PMA_generate_common_url($_url_params); + = PMA_URL_getCommon($_url_params); $vertical_display = $this->__get('vertical_display'); @@ -3113,7 +3113,7 @@ class PMA_DisplayResults } return $link_relations['default_page'] - . PMA_generate_common_url($linking_url_params); + . PMA_URL_getCommon($linking_url_params); } @@ -3290,12 +3290,12 @@ class PMA_DisplayResults ); $edit_url = 'tbl_change.php' - . PMA_generate_common_url( + . PMA_URL_getCommon( $_url_params + array('default_action' => 'update') ); $copy_url = 'tbl_change.php' - . PMA_generate_common_url( + . PMA_URL_getCommon( $_url_params + array('default_action' => 'insert') ); @@ -3349,7 +3349,7 @@ class PMA_DisplayResults 'goto' => (empty($goto) ? 'tbl_sql.php' : $goto), ); - $lnk_goto = 'sql.php' . PMA_generate_common_url($_url_params, 'text'); + $lnk_goto = 'sql.php' . PMA_URL_getCommon($_url_params, 'text'); $del_query = 'DELETE FROM ' . PMA_Util::backquote($this->__get('db')) . '.' @@ -3364,7 +3364,7 @@ class PMA_DisplayResults 'message_to_show' => __('The row has been deleted'), 'goto' => $lnk_goto, ); - $del_url = 'sql.php' . PMA_generate_common_url($_url_params); + $del_url = 'sql.php' . PMA_URL_getCommon($_url_params); $js_conf = 'DELETE FROM ' . PMA_jsFormat($this->__get('db')) . '.' . PMA_jsFormat($this->__get('table')) @@ -3385,7 +3385,7 @@ class PMA_DisplayResults ); $lnk_goto = 'sql.php' - . PMA_generate_common_url( + . PMA_URL_getCommon( $_url_params, 'text' ); @@ -3395,7 +3395,7 @@ class PMA_DisplayResults 'goto' => $lnk_goto, ); - $del_url = 'sql.php' . PMA_generate_common_url($_url_params); + $del_url = 'sql.php' . PMA_URL_getCommon($_url_params); $del_query = 'KILL ' . $row[0]; $js_conf = 'KILL ' . $row[0]; $del_str = PMA_Util::getIcon( @@ -5160,7 +5160,7 @@ class PMA_DisplayResults 'printview' => '1', 'sql_query' => $this->__get('sql_query'), ); - $url_query = PMA_generate_common_url($_url_params); + $url_query = PMA_URL_getCommon($_url_params); if (!$header_shown) { $results_operations_html .= $header; @@ -5202,7 +5202,7 @@ class PMA_DisplayResults $results_operations_html .= PMA_Util::linkOrButton( - 'sql.php' . PMA_generate_common_url($_url_params), + 'sql.php' . PMA_URL_getCommon($_url_params), PMA_Util::getIcon( 'b_print.png', __('Print view (with full texts)'), true @@ -5261,7 +5261,7 @@ class PMA_DisplayResults } $results_operations_html .= PMA_Util::linkOrButton( - 'tbl_export.php' . PMA_generate_common_url($_url_params), + 'tbl_export.php' . PMA_URL_getCommon($_url_params), PMA_Util::getIcon( 'b_tblexport.png', __('Export'), true ), @@ -5274,7 +5274,7 @@ class PMA_DisplayResults // prepare chart $results_operations_html .= PMA_Util::linkOrButton( - 'tbl_chart.php' . PMA_generate_common_url($_url_params), + 'tbl_chart.php' . PMA_URL_getCommon($_url_params), PMA_Util::getIcon( 'b_chart.png', __('Display chart'), true ), @@ -5299,7 +5299,7 @@ class PMA_DisplayResults $results_operations_html .= PMA_Util::linkOrButton( 'tbl_gis_visualization.php' - . PMA_generate_common_url($_url_params), + . PMA_URL_getCommon($_url_params), PMA_Util::getIcon( 'b_globe.gif', __('Visualize GIS data'), true ), @@ -5414,7 +5414,7 @@ class PMA_DisplayResults /* Create link to download */ if (count($url_params) > 0) { $result = '' . $result . ''; } @@ -5572,7 +5572,7 @@ class PMA_DisplayResults ); $result .= ''; if ($transformation_plugin != $default_function) { @@ -5627,7 +5627,7 @@ class PMA_DisplayResults ); $result .= ''; + . PMA_URL_getCommon($_url_params_for_show_data_row). '" />'; } diff --git a/libraries/Footer.class.php b/libraries/Footer.class.php index 83a0e88c24..63755abfc2 100644 --- a/libraries/Footer.class.php +++ b/libraries/Footer.class.php @@ -128,7 +128,7 @@ class PMA_Footer /** * Returns the url of the current page * - * @param mixed $encoding See PMA_generate_common_url() + * @param mixed $encoding See PMA_URL_getCommon() * * @return string */ @@ -137,7 +137,7 @@ class PMA_Footer $db = ! empty($GLOBALS['db']) ? $GLOBALS['db'] : ''; $table = ! empty($GLOBALS['table']) ? $GLOBALS['table'] : ''; $target = ! empty($_REQUEST['target']) ? $_REQUEST['target'] : ''; - return basename(PMA_getenv('SCRIPT_NAME')) . PMA_generate_common_url( + return basename(PMA_getenv('SCRIPT_NAME')) . PMA_URL_getCommon( array( 'db' => $db, 'table' => $table, diff --git a/libraries/Header.class.php b/libraries/Header.class.php index 379bd18a01..cd811616d3 100644 --- a/libraries/Header.class.php +++ b/libraries/Header.class.php @@ -174,7 +174,7 @@ class PMA_Header if (isset($GLOBALS['db'])) { $params['db'] = $GLOBALS['db']; } - $this->_scripts->addFile('messages.php' . PMA_generate_common_url($params)); + $this->_scripts->addFile('messages.php' . PMA_URL_getCommon($params)); // Append the theme id to this url to invalidate // the cache on a theme change. Though this might be // unavailable for fatal errors. @@ -205,7 +205,7 @@ class PMA_Header $db = ! empty($GLOBALS['db']) ? $GLOBALS['db'] : ''; $table = ! empty($GLOBALS['table']) ? $GLOBALS['table'] : ''; return array( - 'common_query' => PMA_generate_common_url('', '', '&'), + 'common_query' => PMA_URL_getCommon('', '', '&'), 'opendb_url' => $GLOBALS['cfg']['DefaultTabDatabase'], 'safari_browser' => PMA_USR_BROWSER_AGENT == 'SAFARI' ? 1 : 0, 'querywindow_height' => $GLOBALS['cfg']['QueryWindowHeight'], @@ -560,7 +560,7 @@ class PMA_Header . 'type="image/x-icon" />'; // stylesheets $basedir = defined('PMA_PATH_TO_BASEDIR') ? PMA_PATH_TO_BASEDIR : ''; - $common_url = PMA_generate_common_url(array('server' => $GLOBALS['server'])); + $common_url = PMA_URL_getCommon(array('server' => $GLOBALS['server'])); $theme_id = $GLOBALS['PMA_Config']->getThemeUniqueValue(); $theme_path = $GLOBALS['pmaThemePath']; @@ -670,7 +670,7 @@ class PMA_Header $tmp_result = PMA_RecentTable::getInstance()->add($db, $table); if ($tmp_result === true) { $params = array('ajax_request' => true, 'recent_table' => true); - $url = 'index.php' . PMA_generate_common_url($params); + $url = 'index.php' . PMA_URL_getCommon($params); $retval = ''; } else { diff --git a/libraries/Index.class.php b/libraries/Index.class.php index 5a193b95eb..6a3b7a26e3 100644 --- a/libraries/Index.class.php +++ b/libraries/Index.class.php @@ -585,7 +585,7 @@ class PMA_Index $r .= '" ' . $row_span . '>' . ' ' . PMA_Util::getIcon('b_edit.png', __('Edit')) . '' . '
    ' . __('Function') . '' . __('Type') . '
    '; @@ -347,7 +347,7 @@ if (!empty($submit_mult) && !empty($what)) { echo ''; echo '
    '; echo ''; - echo PMA_generate_common_hidden_inputs($_url_params); + echo PMA_URL_getHiddenInputs($_url_params); // Display option to disable foreign key checks while dropping tables if ($what == 'drop_tbl') { echo '
    '; @@ -371,7 +371,7 @@ if (!empty($submit_mult) && !empty($what)) { echo ''; echo '
    '; - echo PMA_generate_common_hidden_inputs($_url_params); + echo PMA_URL_getHiddenInputs($_url_params); echo ''; echo ''; echo ''; diff --git a/libraries/navigation/Navigation.class.php b/libraries/navigation/Navigation.class.php index 98665ce07d..ec49c73013 100644 --- a/libraries/navigation/Navigation.class.php +++ b/libraries/navigation/Navigation.class.php @@ -144,7 +144,7 @@ class PMA_Navigation { $html = '
    '; $html .= '
    '; - $html .= PMA_generate_common_hidden_inputs($dbName, $tableName); + $html .= PMA_URL_getHiddenInputs($dbName, $tableName); $navTable = PMA_Util::backquote($GLOBALS['cfgRelation']['db']) . "." . PMA_Util::backquote($GLOBALS['cfgRelation']['navigationhiding']); @@ -189,7 +189,7 @@ class PMA_Navigation $html .= '
    '; $html .= ''; $html .= ' diff --git a/libraries/plugins/auth/AuthenticationCookie.class.php b/libraries/plugins/auth/AuthenticationCookie.class.php index 2b68f358ab..12d4526fcb 100644 --- a/libraries/plugins/auth/AuthenticationCookie.class.php +++ b/libraries/plugins/auth/AuthenticationCookie.class.php @@ -292,7 +292,7 @@ class AuthenticationCookie extends AuthenticationPlugin } // do not generate a "server" hidden field as we want the "server" // drop-down to have priority - echo PMA_generate_common_hidden_inputs($_form_params, '', 0, 'server'); + echo PMA_URL_getHiddenInputs($_form_params, '', 0, 'server'); echo ' '; @@ -640,7 +640,7 @@ class AuthenticationCookie extends AuthenticationPlugin PMA_Response::getInstance()->disable(); PMA_sendHeaderLocation( - $redirect_url . PMA_generate_common_url($url_params, '&'), + $redirect_url . PMA_URL_getCommon($url_params, '&'), true ); if (! defined('TESTSUITE')) { diff --git a/libraries/replication_gui.lib.php b/libraries/replication_gui.lib.php index 19a6518035..b09526057f 100644 --- a/libraries/replication_gui.lib.php +++ b/libraries/replication_gui.lib.php @@ -60,7 +60,7 @@ function PMA_getHtmlForMasterReplication() $_url_params['repl_clear_scr'] = true; $html .= '
  • '; $html .= __('Add slave replication user') . '
  • '; } @@ -117,7 +117,7 @@ function PMA_getHtmlForMasterConfiguration() $html .= ''; $html .= '
    '; $html .= '
    '; - $html .= PMA_generate_common_hidden_inputs('', ''); + $html .= PMA_URL_getHiddenInputs('', ''); $html .= ' '; $html .= ' '; $html .= '
    '; @@ -152,7 +152,7 @@ function PMA_getHtmlForSlaveConfiguration($server_slave_status, $server_slave_re $_url_params['sr_slave_control_parm'] = 'IO_THREAD'; $slave_control_io_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); if ($server_slave_replication[0]['Slave_SQL_Running'] == 'No') { $_url_params['sr_slave_action'] = 'start'; @@ -162,7 +162,7 @@ function PMA_getHtmlForSlaveConfiguration($server_slave_status, $server_slave_re $_url_params['sr_slave_control_parm'] = 'SQL_THREAD'; $slave_control_sql_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); if ($server_slave_replication[0]['Slave_IO_Running'] == 'No' || $server_slave_replication[0]['Slave_SQL_Running'] == 'No' @@ -174,16 +174,16 @@ function PMA_getHtmlForSlaveConfiguration($server_slave_status, $server_slave_re $_url_params['sr_slave_control_parm'] = null; $slave_control_full_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); $_url_params['sr_slave_action'] = 'reset'; $slave_control_reset_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); $_url_params = $GLOBALS['url_params']; $_url_params['sr_slave_skip_error'] = true; $slave_skip_error_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); if ($server_slave_replication[0]['Slave_SQL_Running'] == 'No') { $html .= PMA_Message::error( @@ -201,7 +201,7 @@ function PMA_getHtmlForSlaveConfiguration($server_slave_status, $server_slave_re $_url_params['repl_clear_scr'] = true; $reconfiguremaster_link = 'server_replication.php' - . PMA_generate_common_url($_url_params); + . PMA_URL_getCommon($_url_params); $html .= __('Server is configured as slave in a replication process. Would you like to:'); $html .= '
    '; @@ -257,7 +257,7 @@ function PMA_getHtmlForSlaveConfiguration($server_slave_status, $server_slave_re 'This server is not configured as slave in a replication process. ' . 'Would you like to configure it?' ), - 'server_replication.php' . PMA_generate_common_url($_url_params) + 'server_replication.php' . PMA_URL_getCommon($_url_params) ); } $html .= ''; @@ -285,7 +285,7 @@ function PMA_getHtmlForSlaveErrorManagement($slave_skip_error_link) $html .= __('Skip current error') . ''; $html .= '
  • ' . __('Skip next'); $html .= '
    '; - $html .= PMA_generate_common_hidden_inputs('', ''); + $html .= PMA_URL_getHiddenInputs('', ''); $html .= ' configure it?' ), - 'server_replication.php' . PMA_generate_common_url($_url_params) + 'server_replication.php' . PMA_URL_getCommon($_url_params) ); $html .= ''; return $html; @@ -369,7 +369,7 @@ function PMA_getHtmlForReplicationChangeMaster($submitname) = PMA_replicationGetUsernameHostnameLength(); $html .= ''; - $html .= PMA_generate_common_hidden_inputs('', ''); + $html .= PMA_URL_getHiddenInputs('', ''); $html .= '
    '; $html .= ' ' . __('Slave configuration'); $html .= ' - ' . __('Change or reconfigure master server') . ''; @@ -662,7 +662,7 @@ function PMA_getHtmlForReplicationMasterAddSlaveuser() $html .= '' . __('Add slave replication user') . '' . PMA_getHtmlForAddUserLoginForm($username_length) @@ -894,7 +894,7 @@ function PMA_handleControlRequest() if ($refresh) { Header( "Location: server_replication.php" - . PMA_generate_common_url($GLOBALS['url_params']) + . PMA_URL_getCommon($GLOBALS['url_params']) ); } unset($refresh); diff --git a/libraries/rte/rte_events.lib.php b/libraries/rte/rte_events.lib.php index 74c6b7a0f5..f8f34f77b7 100644 --- a/libraries/rte/rte_events.lib.php +++ b/libraries/rte/rte_events.lib.php @@ -412,7 +412,7 @@ function PMA_EVN_getEditorForm($mode, $operation, $item) $retval .= "\n"; $retval .= "\n"; $retval .= $original_data; - $retval .= PMA_generate_common_hidden_inputs($db, $table) . "\n"; + $retval .= PMA_URL_getHiddenInputs($db, $table) . "\n"; $retval .= "
    \n"; $retval .= "" . __('Details') . "\n"; $retval .= "
  • ' . htmlspecialchars($hiddenItem) . ''; $retval .= $this->_getLink( - 'index.php?' . PMA_generate_common_url(), + 'index.php?' . PMA_URL_getCommon(), $showText, __('Home'), $showIcon, @@ -201,7 +201,7 @@ class PMA_NavigationHeader ); } $link = 'querywindow.php?'; - $link .= PMA_generate_common_url($GLOBALS['db'], $GLOBALS['table']); + $link .= PMA_URL_getCommon($GLOBALS['db'], $GLOBALS['table']); $link .= '&no_js=true'; $retval .= $this->_getLink( $link, @@ -285,7 +285,7 @@ class PMA_NavigationHeader $retval .= '
    '; $retval .= ''; - $retval .= PMA_generate_common_hidden_inputs( + $retval .= PMA_URL_getHiddenInputs( array( 'db' => '', 'table' => '', diff --git a/libraries/navigation/Nodes/Node_Database.class.php b/libraries/navigation/Nodes/Node_Database.class.php index b5026b4153..03f6337eb9 100644 --- a/libraries/navigation/Nodes/Node_Database.class.php +++ b/libraries/navigation/Nodes/Node_Database.class.php @@ -504,7 +504,7 @@ class Node_Database extends Node if ($count > 0) { $ret = '' . '' diff --git a/libraries/navigation/Nodes/Node_DatabaseChild.class.php b/libraries/navigation/Nodes/Node_DatabaseChild.class.php index e080e4ab37..5b686ac560 100644 --- a/libraries/navigation/Nodes/Node_DatabaseChild.class.php +++ b/libraries/navigation/Nodes/Node_DatabaseChild.class.php @@ -30,7 +30,7 @@ abstract class Node_DatabaseChild extends Node $item = $this->real_name; $ret = '' . '' . '' - . PMA_generate_common_hidden_inputs($db) + . PMA_URL_getHiddenInputs($db) . '
    ' . ''; if (PMA_Util::showIcons('ActionLinksMode')) { @@ -65,7 +65,7 @@ function PMA_getHtmlForRenameDatabase($db) } $html_output .= '' . '' - . PMA_generate_common_hidden_inputs($db) + . PMA_URL_getHiddenInputs($db) . '
    ' . ''; @@ -165,7 +165,7 @@ function PMA_getHtmlForCopyDatabase($db) . 'value="' . $_REQUEST['db_collation'] .'" />' . "\n"; } $html_output .= '' . "\n" - . PMA_generate_common_hidden_inputs($db); + . PMA_URL_getHiddenInputs($db); $html_output .= '
    ' . ''; @@ -230,7 +230,7 @@ function PMA_getHtmlForChangeDatabaseCharset($db, $table) $html_output .= 'class="ajax" '; $html_output .= 'method="post" action="db_operations.php">'; - $html_output .= PMA_generate_common_hidden_inputs($db, $table); + $html_output .= PMA_URL_getHiddenInputs($db, $table); $html_output .= '
    ' . "\n" . ' '; @@ -620,7 +620,7 @@ function PMA_getHtmlForOrderTheTable($columns) $html_output = '
    '; $html_output .= ''; - $html_output .= PMA_generate_common_hidden_inputs( + $html_output .= PMA_URL_getHiddenInputs( $GLOBALS['db'], $GLOBALS['table'] ); $html_output .= '
    ' @@ -662,7 +662,7 @@ function PMA_getHtmlForMoveTable() $html_output .= '' - . PMA_generate_common_hidden_inputs($GLOBALS['db'], $GLOBALS['table']); + . PMA_URL_getHiddenInputs($GLOBALS['db'], $GLOBALS['table']); $html_output .= '' . '' @@ -731,7 +731,7 @@ function PMA_getTableOptionDiv($comment, $tbl_collation, $tbl_storage_engine, $html_output = '
    '; $html_output .= '' - . PMA_generate_common_hidden_inputs($GLOBALS['db'], $GLOBALS['table']) + . PMA_URL_getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) . ''; $html_output .= '
    '; @@ -1218,7 +1218,7 @@ function PMA_getMaintainActionlink($action, $params, $url_params, $link) return '
  • ' . '' + . PMA_URL_getCommon(array_merge($url_params, $params)) .'">' . $action . '' . PMA_Util::showMySQLDocu($link) @@ -1277,7 +1277,7 @@ function PMA_getHtmlForDeleteDataOrTable( function PMA_getDeleteDataOrTablelink($url_params, $syntax, $link, $id) { return '
  • ' . $link . '' . PMA_Util::showMySQLDocu($syntax) @@ -1304,7 +1304,7 @@ function PMA_getHtmlForPartitionMaintenance($partition_names, $url_params) $html_output = '
    ' . '' - . PMA_generate_common_hidden_inputs($GLOBALS['db'], $GLOBALS['table']) + . PMA_URL_getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) . '
    ' . '' . __('Partition maintenance') . ''; @@ -1330,7 +1330,7 @@ function PMA_getHtmlForPartitionMaintenance($partition_names, $url_params) ) ); $html_output .= '
    ' + . PMA_URL_getCommon($this_url_params) . '">' . __('Remove partitioning') . ''; $html_output .= '
    ' @@ -1399,7 +1399,7 @@ function PMA_getHtmlForReferentialIntegrityCheck($foreign, $url_params) $html_output .= '
  • ' . '' . $master . ' -> ' . $arr['foreign_db'] . '.' . $arr['foreign_table'] . '.' . $arr['foreign_field'] diff --git a/libraries/plugins/auth/AuthenticationConfig.class.php b/libraries/plugins/auth/AuthenticationConfig.class.php index 5e33a07f1a..c0ea3892a3 100644 --- a/libraries/plugins/auth/AuthenticationConfig.class.php +++ b/libraries/plugins/auth/AuthenticationConfig.class.php @@ -138,7 +138,7 @@ class AuthenticationConfig extends AuthenticationPlugin
  • ' . "\n"; echo '' + . PMA_URL_getCommon(array()) . '" class="button disableAjax">' . __('Retry to connect') . '' . "\n"; echo '
    \n"; diff --git a/libraries/rte/rte_main.inc.php b/libraries/rte/rte_main.inc.php index a36221c9c5..de48f31ad3 100644 --- a/libraries/rte/rte_main.inc.php +++ b/libraries/rte/rte_main.inc.php @@ -38,7 +38,7 @@ if ($GLOBALS['is_ajax_request'] != true) { if (strlen($db)) { $GLOBALS['dbi']->selectDb($db); if (! isset($url_query)) { - $url_query = PMA_generate_common_url($db, $table); + $url_query = PMA_URL_getCommon($db, $table); } } } diff --git a/libraries/rte/rte_routines.lib.php b/libraries/rte/rte_routines.lib.php index c44032bf04..a08f6914ab 100644 --- a/libraries/rte/rte_routines.lib.php +++ b/libraries/rte/rte_routines.lib.php @@ -926,7 +926,7 @@ function PMA_RTN_getEditorForm($mode, $operation, $routine) $retval .= "\n"; $retval .= "\n"; $retval .= $original_routine; - $retval .= PMA_generate_common_hidden_inputs($db) . "\n"; + $retval .= PMA_URL_getHiddenInputs($db) . "\n"; $retval .= "
    \n"; $retval .= "" . __('Details') . "\n"; $retval .= "
    \n"; @@ -1563,7 +1563,7 @@ function PMA_RTN_getExecuteForm($routine) $retval .= " value='{$routine['item_name']}' />\n"; $retval .= "\n"; $retval .= "
    \n"; diff --git a/libraries/schema/Export_Relation_Schema.class.php b/libraries/schema/Export_Relation_Schema.class.php index 66e19974d3..bb7f87ede4 100644 --- a/libraries/schema/Export_Relation_Schema.class.php +++ b/libraries/schema/Export_Relation_Schema.class.php @@ -240,7 +240,7 @@ class PMA_Export_Relation_Schema echo '

    ' . "\n"; echo ' ' . $error_message . "\n"; echo '

    ' . "\n"; - echo '' . __('Back') . ''; diff --git a/libraries/schema/User_Schema.class.php b/libraries/schema/User_Schema.class.php index 0ff556ae41..b3ef37be04 100644 --- a/libraries/schema/User_Schema.class.php +++ b/libraries/schema/User_Schema.class.php @@ -131,7 +131,7 @@ class PMA_User_Schema - +
    @@ -194,7 +194,7 @@ class PMA_User_Schema - + '; echo ''; @@ -408,7 +408,7 @@ class PMA_User_Schema
    ' . "\n" - . PMA_generate_common_hidden_inputs($db) + . PMA_URL_getHiddenInputs($db) . '' . "\n" . ''; - $retval .= PMA_generate_common_hidden_inputs(); + $retval .= PMA_URL_getHiddenInputs(); if (! $ommit_fieldset) { $retval .= '
    '; @@ -85,7 +85,7 @@ function PMA_selectServer($not_only_options, $ommit_fieldset) $retval .= '' . htmlspecialchars($label) . ''; } $retval .= ''; diff --git a/libraries/server_bin_log.lib.php b/libraries/server_bin_log.lib.php index ecefa4d812..5ab4f0f560 100644 --- a/libraries/server_bin_log.lib.php +++ b/libraries/server_bin_log.lib.php @@ -25,7 +25,7 @@ function PMA_getLogSelector($binary_log_file_names, $url_params) $html = ""; if (count($binary_log_file_names) > 1) { $html .= ''; - $html .= PMA_generate_common_hidden_inputs($url_params); + $html .= PMA_URL_getHiddenInputs($url_params); $html .= '
    '; $html .= __('Select binary log to view'); $html .= '
    ' . "\n" . ' ' . "\n" @@ -109,7 +109,7 @@ function PMA_getHtmlForSpecifiedServerEngines() $html .= ' ' . __('Variables') . '' . "\n"; } else { $html .= ' ' . __('Variables') . '' . "\n"; } foreach ($infoPages as $current => $label) { @@ -118,7 +118,7 @@ function PMA_getHtmlForSpecifiedServerEngines() $html .= ' ' . $label . '' . "\n"; } else { $html .= ' ' . htmlspecialchars($label) . '' . "\n"; diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index 9ca619d673..0c6ac22c02 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -404,7 +404,7 @@ function PMA_getHtmlToChoseUserGroup($username) $html_output = ''; $params = array('username' => $username); - $html_output .= PMA_generate_common_hidden_inputs($params); + $html_output .= PMA_URL_getHiddenInputs($params); $html_output .= '
    '; $html_output .= '' . __('User group') . ''; @@ -1566,7 +1566,7 @@ function PMA_getHtmlForAddUser($dbname) . '' . "\n" . '' . "\n" - . PMA_generate_common_hidden_inputs('', '') + . PMA_URL_getHiddenInputs('', '') . PMA_getHtmlForDisplayLoginInformationFields('new'); $html_output .= '
    ' . "\n" @@ -1685,7 +1685,7 @@ function PMA_getHtmlForSpecificDbPrivileges($link_edit, $conditional_class) . sprintf( __('Users having access to "%s"'), '' + . PMA_URL_getCommon($_REQUEST['checkprivs']) . '">' . htmlspecialchars($_REQUEST['checkprivs']) . '' ) @@ -2072,7 +2072,7 @@ function PMA_getChangeLoginInformationHtmlForm($username, $hostname) $class = ' ajax'; $html_output = '' . "\n" - . PMA_generate_common_hidden_inputs('', '') + . PMA_URL_getHiddenInputs('', '') . '' . "\n" . '' . "\n" . '' . "\n" - . PMA_generate_common_hidden_inputs('', '') + . PMA_URL_getHiddenInputs('', '') . '
    ' . "\n" + . PMA_URL_getCommon($_url_params) . '">' . "\n" . ' ' . __('Database') . "\n" . ($sort_by == 'SCHEMA_NAME' ? ' ' . PMA_Util::getImage( @@ -331,7 +331,7 @@ function PMA_getHtmlForColumnOrderWithSort( = ($sort_by == $stat_name && $sort_order == 'desc') ? 'asc' : 'desc'; $html .= ' ' . '' . "\n" + . PMA_URL_getCommon($_url_params) . '">' . "\n" . ' ' . $stat['disp_name'] . "\n" . ($sort_by == $stat_name ? ' ' . PMA_Util::getImage( diff --git a/libraries/server_engines.lib.php b/libraries/server_engines.lib.php index 35ebc13e05..f8c9710171 100644 --- a/libraries/server_engines.lib.php +++ b/libraries/server_engines.lib.php @@ -64,7 +64,7 @@ function PMA_getHtmlForAllServerEngines() ? ' disabled' : '') . '">' . "\n" . ' ' . "\n" + . PMA_URL_getCommon(array('engine' => $engine)) . '">' . "\n" . ' ' . htmlspecialchars($details['Engine']) . "\n" . ' ' . htmlspecialchars($details['Comment']) . '
    ' . "\n" . '' . "\n" . '' . "\n" @@ -3243,7 +3243,7 @@ function PMA_getHtmlForUserGroupsTable() if ($result && $GLOBALS['dbi']->numRows($result)) { $html_output .= ''; - $html_output .= PMA_generate_common_hidden_inputs(); + $html_output .= PMA_URL_getHiddenInputs(); $html_output .= '
    '; $html_output .= ''; $html_output .= ''; @@ -3294,7 +3294,7 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= '
    '; $html_output .= '' + . PMA_URL_getCommon() . '&addUserGroup=1">' . PMA_Util::getIcon('b_usradd.png') . __('Add user group') . ''; $html_output .= '
    '; @@ -3373,7 +3373,7 @@ function PMA_getHtmlToEditUserGroup($userGroup = null) } else { $urlParams['addUserGroupSubmit'] = '1'; } - $html_output .= PMA_generate_common_hidden_inputs($urlParams); + $html_output .= PMA_URL_getHiddenInputs($urlParams); $html_output .= '
    '; $html_output .= '' . __('User group menu assignments') @@ -3554,7 +3554,7 @@ function PMA_getHtmlForDisplayUserProperties($dbname_is_wildcard,$url_dbname, $html_output .= '' . "\n"; - $html_output .= PMA_generate_common_hidden_inputs($_params); + $html_output .= PMA_URL_getHiddenInputs($_params); $html_output .= PMA_getHtmlToDisplayPrivilegesTable( PMA_ifSetOr($dbname, '*', 'length'), PMA_ifSetOr($tablename, '*', 'length') @@ -3884,7 +3884,7 @@ function PMA_getSqlQueriesForDisplayAndAddUser($username, $hostname, $password) */ function PMA_getHtmlForSubMenusOnUsersPage($selfUrl) { - $url_params = PMA_generate_common_url(); + $url_params = PMA_URL_getCommon(); $items = array( array( 'name' => __('Users overview'), diff --git a/libraries/server_status.lib.php b/libraries/server_status.lib.php index cef78c9fef..41c7efea69 100644 --- a/libraries/server_status.lib.php +++ b/libraries/server_status.lib.php @@ -323,11 +323,11 @@ function PMA_getHtmlForServerProcesslist($ServerStatusData) $show_full_sql = ! empty($_REQUEST['full']); if ($show_full_sql) { $url_params['full'] = 1; - $full_text_link = 'server_status.php' . PMA_generate_common_url( + $full_text_link = 'server_status.php' . PMA_URL_getCommon( array(), 'html', '?' ); } else { - $full_text_link = 'server_status.php' . PMA_generate_common_url( + $full_text_link = 'server_status.php' . PMA_URL_getCommon( array('full' => 1) ); } @@ -434,7 +434,7 @@ function PMA_getHtmlForServerProcesslist($ServerStatusData) } $retval .= '
    '; diff --git a/libraries/server_status_variables.lib.php b/libraries/server_status_variables.lib.php index 435c8f089e..a8e62702bf 100644 --- a/libraries/server_status_variables.lib.php +++ b/libraries/server_status_variables.lib.php @@ -38,7 +38,7 @@ function PMA_getHtmlForFilter($ServerStatusData) $retval .= '
    '; $retval .= '' . __('Filters') . ''; $retval .= ''; + . PMA_URL_getCommon() . '">'; $retval .= ''; $retval .= '
    '; $retval .= ''; diff --git a/libraries/server_variables.lib.php b/libraries/server_variables.lib.php index 1808c07eee..756ca1b7d7 100644 --- a/libraries/server_variables.lib.php +++ b/libraries/server_variables.lib.php @@ -149,7 +149,7 @@ function PMA_formatVariable($name, $value, $variable_doc_links) */ function PMA_getHtmlForLinkTemplates() { - $url = htmlspecialchars('server_variables.php?' . PMA_generate_common_url()); + $url = htmlspecialchars('server_variables.php?' . PMA_URL_getCommon()); $output = ''; $output .= ''; @@ -454,7 +454,7 @@ function PMA_getHtmlForProfilingChart($url_query, $db, $profiling_results) { if (isset($profiling_results)) { $pma_token = $_SESSION[' PMA_token ']; - $url_query = (isset($url_query) ? $url_query : PMA_generate_common_url($db)); + $url_query = (isset($url_query) ? $url_query : PMA_URL_getCommon($db)); $profiling_table = ''; $profiling_table .= '
    ' . __('Profiling') @@ -730,7 +730,7 @@ function PMA_getHtmlForBookmark($disp_mode, $cfgBookmark, $sql_query, $db, $tabl ) { $html = "\n"; $goto = 'sql.php?' - . PMA_generate_common_url($db, $table) + . PMA_URL_getCommon($db, $table) . '&sql_query=' . urlencode($sql_query) . '&id_bookmark=1'; $bkm_sql_query = urlencode( @@ -740,7 +740,7 @@ function PMA_getHtmlForBookmark($disp_mode, $cfgBookmark, $sql_query, $db, $tabl . ' onsubmit="return ! emptyFormElements(this,' . '\'bkm_fields[bkm_label]\');"' . ' id="bookmarkQueryForm">'; - $html .= PMA_generate_common_hidden_inputs(); + $html .= PMA_URL_getHiddenInputs(); $html .= ''; $html .= ''; diff --git a/libraries/sql_query_form.lib.php b/libraries/sql_query_form.lib.php index fbac797daf..d884019d49 100644 --- a/libraries/sql_query_form.lib.php +++ b/libraries/sql_query_form.lib.php @@ -109,7 +109,7 @@ function PMA_sqlQueryForm($query = true, $display_tab = false, $delimiter = ';') } } $html .= '' - . "\n" . PMA_generate_common_hidden_inputs($db, $table) . "\n" + . "\n" . PMA_URL_getHiddenInputs($db, $table) . "\n" .'' . "\n" .'' . "\n" @@ -198,7 +198,7 @@ function PMA_sqlQueryFormInsert( $db = $GLOBALS['db']; // if you want navigation: $tmp_db_link = 'getColumns($db, $GLOBALS['table'], null, true); $tmp_db_link = ' $_REQUEST['db'], ); - $url = 'db_structure.php'.PMA_generate_common_url($_url_params); + $url = 'db_structure.php'.PMA_URL_getCommon($_url_params); // We set the position back to 0 every time they sort. $url .= "&pos=0&sort=$sort&sort_order=$future_sort_order"; @@ -1427,7 +1427,7 @@ function PMA_getHtmlDivForMoveColumnsDialog() $html_output .= '' . '
    ' - . PMA_generate_common_hidden_inputs($GLOBALS['db'], $GLOBALS['table']) + . PMA_URL_getHiddenInputs($GLOBALS['db'], $GLOBALS['table']) . '
      ' . '
      ' . '' @@ -1460,7 +1460,7 @@ function PMA_getHtmlForEditView($url_params) 'as' => $item['VIEW_DEFINITION'], 'with' => $item['CHECK_OPTION'], ); - $url = 'view_create.php' . PMA_generate_common_url($url_params) . '&'; + $url = 'view_create.php' . PMA_URL_getCommon($url_params) . '&'; $url .= implode( '&', array_map( @@ -1556,7 +1556,7 @@ function PMA_getHtmlForAddColumn($columns_list) ) . '\', 1)' . '">'; - $html_output .= PMA_generate_common_hidden_inputs( + $html_output .= PMA_URL_getHiddenInputs( $GLOBALS['db'], $GLOBALS['table'] ); @@ -2301,7 +2301,7 @@ function PMA_displayHtmlForColumnChange($db, $table, $selected, $action) */ function PMA_updateColumns($db, $table) { - $err_url = 'tbl_structure.php?' . PMA_generate_common_url($db, $table); + $err_url = 'tbl_structure.php?' . PMA_URL_getCommon($db, $table); $regenerate = false; $field_cnt = count($_REQUEST['field_name']); $key_fields = array(); diff --git a/libraries/tbl_columns_definition_form.lib.php b/libraries/tbl_columns_definition_form.lib.php index 0ca2670118..9c6deee76b 100644 --- a/libraries/tbl_columns_definition_form.lib.php +++ b/libraries/tbl_columns_definition_form.lib.php @@ -239,7 +239,7 @@ function PMA_getHtmlForTableCreateOrAddField($action, $form_params, $content_cel $html = '
      '; - $html .= PMA_generate_common_hidden_inputs($form_params); + $html .= PMA_URL_getHiddenInputs($form_params); if ($action == 'tbl_create.php') { $html .= PMA_getHtmlForTableNameAndNoOfColumns(); @@ -319,7 +319,7 @@ function PMA_getHeaderCells($is_backup, $fields_meta, $mimework, $db, $table) . ' %stransformation descriptions%s' ), '
      ', '' ); diff --git a/libraries/tbl_common.inc.php b/libraries/tbl_common.inc.php index ae8c4e74b8..ea079474f8 100644 --- a/libraries/tbl_common.inc.php +++ b/libraries/tbl_common.inc.php @@ -23,7 +23,7 @@ $db_is_information_schema = $GLOBALS['dbi']->isSystemSchema($db); * Set parameters for links * @deprecated */ -$url_query = PMA_generate_common_url($db, $table); +$url_query = PMA_URL_getCommon($db, $table); /** * Set parameters for links @@ -36,8 +36,8 @@ $url_params['table'] = $table; * Defines the urls to return to in case of error in a sql statement */ $err_url_0 = $cfg['DefaultTabDatabase'] - . PMA_generate_common_url(array('db' => $db,)); -$err_url = $cfg['DefaultTabTable'] . PMA_generate_common_url($url_params); + . PMA_URL_getCommon(array('db' => $db,)); +$err_url = $cfg['DefaultTabTable'] . PMA_URL_getCommon($url_params); /** diff --git a/libraries/tbl_gis_visualization.lib.php b/libraries/tbl_gis_visualization.lib.php index b2d07318c2..6f184fc75b 100644 --- a/libraries/tbl_gis_visualization.lib.php +++ b/libraries/tbl_gis_visualization.lib.php @@ -289,7 +289,7 @@ function PMA_getHtmlForGisVisualization( $html .= '
      '; $html .= ''; - $html .= PMA_generate_common_hidden_inputs($url_params); + $html .= PMA_URL_getHiddenInputs($url_params); $html .= '
      ' @@ -3265,18 +3265,18 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= ''; $html_output .= '' . PMA_Util::getIcon('b_usrlist.png', __('View users')) . ''; $html_output .= '  '; $html_output .= '' . PMA_Util::getIcon('b_edit.png', __('Edit')) . ''; $html_output .= '  '; $html_output .= '' . PMA_Util::getIcon('b_drop.png', __('Delete')) . ''; $html_output .= ''; - $columnUrl = PMA_generate_common_url($column); + $columnUrl = PMA_URL_getCommon($column); $retval .= ''; $retval .= '' . __('Kill') . '
      '; $html .= PMA_getHtmlForColumn( @@ -319,7 +319,7 @@ function PMA_getHtmlForGisVisualization( $html .= '
      '; $html .= ''; - $html .= PMA_generate_common_hidden_inputs($url_params); + $html .= PMA_URL_getHiddenInputs($url_params); $html .= '
      '; $html .= ''; diff --git a/libraries/url_generating.lib.php b/libraries/url_generating.lib.php index e995710052..345fea01d6 100644 --- a/libraries/url_generating.lib.php +++ b/libraries/url_generating.lib.php @@ -19,7 +19,7 @@ if (! defined('PHPMYADMIN')) { * @param string $skip do not generate a hidden field for this parameter * (can be an array of strings) * - * @see PMA_generate_common_url() + * @see PMA_URL_getCommon() * * @return string string with input fields * @@ -32,7 +32,7 @@ if (! defined('PHPMYADMIN')) { * * @access public */ -function PMA_generate_common_hidden_inputs($db = '', $table = '', +function PMA_URL_getHiddenInputs($db = '', $table = '', $indent = 0, $skip = array() ) { if (is_array($db)) { @@ -125,7 +125,7 @@ function PMA_getHiddenFields($values, $pre = '') $fields .= PMA_getHiddenFields($value, $name); } else { // do not generate an ending "\n" because - // PMA_generate_common_hidden_inputs() is sometimes called + // PMA_URL_getHiddenInputs() is sometimes called // from a JS document.write() $fields .= ''; @@ -141,7 +141,7 @@ function PMA_getHiddenFields($values, $pre = '') * * // OLD (deprecated) style * // note the ? - * echo 'script.php?' . PMA_generate_common_url('mysql', 'rights'); + * echo 'script.php?' . PMA_URL_getCommon('mysql', 'rights'); * // produces with cookies enabled: * // script.php?db=mysql&table=rights * // with cookies disabled: @@ -152,14 +152,14 @@ function PMA_getHiddenFields($values, $pre = '') * $params['db'] = 'mysql'; * $params['table'] = 'rights'; * // note the missing ? - * echo 'script.php' . PMA_generate_common_url($params); + * echo 'script.php' . PMA_URL_getCommon($params); * // produces with cookies enabled: * // script.php?myparam=myvalue&db=mysql&table=rights * // with cookies disabled: * // script.php?server=1&lang=en&myparam=myvalue&db=mysql&table=rights * * // note the missing ? - * echo 'script.php' . PMA_generate_common_url(); + * echo 'script.php' . PMA_URL_getCommon(); * // produces with cookies enabled: * // script.php * // with cookies disabled: @@ -183,7 +183,7 @@ function PMA_getHiddenFields($values, $pre = '') * @return string string with URL parameters * @access public */ -function PMA_generate_common_url() +function PMA_URL_getCommon() { $args = func_get_args(); @@ -222,7 +222,7 @@ function PMA_generate_common_url() $questionmark = ''; } - $separator = PMA_get_arg_separator(); + $separator = PMA_URL_getArgSeparator(); // avoid overwriting when creating navi panel links to servers if (isset($GLOBALS['server']) @@ -270,7 +270,7 @@ function PMA_generate_common_url() * @return string character used for separating url parts usally ; or & * @access public */ -function PMA_get_arg_separator($encode = 'none') +function PMA_URL_getArgSeparator($encode = 'none') { static $separator = null; diff --git a/libraries/user_preferences.lib.php b/libraries/user_preferences.lib.php index a1cef249e1..539b95391d 100644 --- a/libraries/user_preferences.lib.php +++ b/libraries/user_preferences.lib.php @@ -254,7 +254,7 @@ function PMA_userprefsRedirect($file_name, } PMA_sendHeaderLocation( $GLOBALS['cfg']['PmaAbsoluteUri'] . $file_name - . PMA_generate_common_url($url_params, '&') . $hash + . PMA_URL_getCommon($url_params, '&') . $hash ); } @@ -280,7 +280,7 @@ function PMA_userprefsAutoloadGetHeader() $retval .= ''; diff --git a/pmd_pdf.php b/pmd_pdf.php index 9a1adb9f5a..566b7a4454 100644 --- a/pmd_pdf.php +++ b/pmd_pdf.php @@ -104,7 +104,7 @@ if (! empty($message)) { ?>
      '; echo '
      ' . __('Import/Export coordinates for PDF schema') . ''; diff --git a/prefs_forms.php b/prefs_forms.php index 52d25d91e6..5d8b787dee 100644 --- a/prefs_forms.php +++ b/prefs_forms.php @@ -44,7 +44,7 @@ if (isset($_POST['revert'])) { $url_params = array('form' => $form_param); PMA_sendHeaderLocation( $cfg['PmaAbsoluteUri'] . 'prefs_forms.php' - . PMA_generate_common_url($url_params, '&') + . PMA_URL_getCommon($url_params, '&') ); exit; } diff --git a/prefs_manage.php b/prefs_manage.php index 3b15ecadc0..e8a5ada593 100644 --- a/prefs_manage.php +++ b/prefs_manage.php @@ -118,7 +118,7 @@ if (isset($_POST['submit_export']) $form_display->displayErrors(); echo ''; echo ''; - echo PMA_generate_common_hidden_inputs() . "\n"; + echo PMA_URL_getHiddenInputs() . "\n"; echo ''; echo ''; @@ -239,7 +239,7 @@ PMA_printJsValue("PMA_messages['strSavedOn']", __('Saved on: @DATE@')); @@ -299,7 +299,7 @@ PMA_printJsValue("PMA_messages['strSavedOn']", __('Saved on: @DATE@')); ?> - +
      @@ -325,7 +325,7 @@ PMA_printJsValue("PMA_messages['strSavedOn']", __('Saved on: @DATE@'));

      - +

      diff --git a/querywindow.php b/querywindow.php index 551176b677..880e32a968 100644 --- a/querywindow.php +++ b/querywindow.php @@ -83,7 +83,7 @@ if ($no_js) { } $titles['Change'] = PMA_Util::getIcon('b_edit.png', __('Change')); -$url_query = PMA_generate_common_url($db, $table); +$url_query = PMA_URL_getCommon($db, $table); if (! empty($sql_query)) { $show_query = 1; @@ -163,12 +163,12 @@ if (! empty($_sql_history) 'db' => $query['db'], 'table' => $query['table'], ); - echo '' . $titles['Change'] . ''; // execute link $url_params['auto_commit'] = 'true'; - echo ''; if (! empty($query['db'])) { @@ -196,7 +196,7 @@ if (! empty($_sql_history) echo ''; -echo PMA_generate_common_hidden_inputs('', ''); +echo PMA_URL_getHiddenInputs('', ''); echo ''; echo ''; diff --git a/server_databases.php b/server_databases.php index 762e859d31..94eb52b54f 100644 --- a/server_databases.php +++ b/server_databases.php @@ -92,7 +92,7 @@ if ((isset($_REQUEST['drop_selected_dbs']) || isset($_REQUEST['query_type'])) } else { $action = 'server_databases.php'; $submit_mult = 'drop_db'; - $err_url = 'server_databases.php?' . PMA_generate_common_url(); + $err_url = 'server_databases.php?' . PMA_URL_getCommon(); if (isset($_REQUEST['selected_dbs']) && !isset($_REQUEST['is_js_confirmed']) ) { diff --git a/setup/frames/index.inc.php b/setup/frames/index.inc.php index 26c7b08332..8b5718628f 100644 --- a/setup/frames/index.inc.php +++ b/setup/frames/index.inc.php @@ -22,7 +22,7 @@ $all_languages = PMA_langList(); uasort($all_languages, 'PMA_languageCmp'); $cf = ConfigFile::getInstance(); -$separator = PMA_get_arg_separator('html'); +$separator = PMA_URL_getArgSeparator('html'); // message handling messages_begin(); @@ -70,7 +70,7 @@ if (!$is_https) { ?> - +
      diff --git a/setup/frames/menu.inc.php b/setup/frames/menu.inc.php index 69563a243b..35011d4807 100644 --- a/setup/frames/menu.inc.php +++ b/setup/frames/menu.inc.php @@ -10,7 +10,7 @@ if (!defined('PHPMYADMIN')) { exit; } -$separator = PMA_get_arg_separator('html'); +$separator = PMA_URL_getArgSeparator('html'); ?>
      • diff --git a/setup/lib/form_processing.lib.php b/setup/lib/form_processing.lib.php index 65ebb1db2e..082c28675b 100644 --- a/setup/lib/form_processing.lib.php +++ b/setup/lib/form_processing.lib.php @@ -33,7 +33,7 @@ function process_formset(FormDisplay $form_display) // check for form errors if ($form_display->hasErrors()) { // form has errors, show warning - $separator = PMA_get_arg_separator('html'); + $separator = PMA_URL_getArgSeparator('html'); $page = filter_input(INPUT_GET, 'page'); $formset = filter_input(INPUT_GET, 'formset'); $formset = $formset ? "{$separator}formset=$formset" : ''; diff --git a/sql.php b/sql.php index 2aeadebbb6..039da0366f 100644 --- a/sql.php +++ b/sql.php @@ -57,7 +57,7 @@ if (! empty($goto)) { if (! isset($err_url)) { $err_url = (! empty($back) ? $back : $goto) - . '?' . PMA_generate_common_url($db) + . '?' . PMA_URL_getCommon($db) . ((strpos(' ' . $goto, 'db_') != 1 && strlen($table)) ? '&table=' . urlencode($table) : '' @@ -165,7 +165,7 @@ if (isset($_POST['store_bkm'])) { if ($goto == 'sql.php') { $is_gotofile = false; $goto = 'sql.php?' - . PMA_generate_common_url($db, $table) + . PMA_URL_getCommon($db, $table) . '&sql_query=' . urlencode($sql_query); } // end if diff --git a/tbl_addfield.php b/tbl_addfield.php index 4b2c3fe216..4968840863 100644 --- a/tbl_addfield.php +++ b/tbl_addfield.php @@ -23,7 +23,7 @@ PMA_Util::checkParameters(array('db', 'table')); /** * Defines the url to return to in case of error in a sql statement */ -$err_url = 'tbl_sql.php?' . PMA_generate_common_url($db, $table); +$err_url = 'tbl_sql.php?' . PMA_URL_getCommon($db, $table); /** * The form used to define the field to add has been submitted diff --git a/tbl_change.php b/tbl_change.php index c1ecdd74c8..b5de613b2c 100644 --- a/tbl_change.php +++ b/tbl_change.php @@ -51,7 +51,7 @@ if (empty($GLOBALS['goto'])) { $_url_params = PMA_getUrlParameters($db, $table); -$err_url = $GLOBALS['goto'] . PMA_generate_common_url($_url_params); +$err_url = $GLOBALS['goto'] . PMA_URL_getCommon($_url_params); unset($_url_params); $comments_map = PMA_getCommentsMap($db, $table); @@ -141,7 +141,7 @@ if ($is_upload) { $html_output .= ' enctype="multipart/form-data"'; } $html_output .= '>'; -$html_output .= PMA_generate_common_hidden_inputs($_form_params); +$html_output .= PMA_URL_getHiddenInputs($_form_params); $titles['Browse'] = PMA_Util::getIcon('b_browse.png', __('Browse foreign values')); diff --git a/tbl_chart.php b/tbl_chart.php index 88170772b2..5aa41e1d87 100644 --- a/tbl_chart.php +++ b/tbl_chart.php @@ -146,7 +146,7 @@ $htmlString = ' @@ -53,7 +53,7 @@ echo '
        ' . "\n"; printf( $item, $GLOBALS['cfg']['DefaultTabServer'], - PMA_generate_common_url(), + PMA_URL_getCommon(), 'Server', __('Server'), 'ic_s_host' diff --git a/user_password.php b/user_password.php index 6e9c4c8a77..75316cbfd2 100644 --- a/user_password.php +++ b/user_password.php @@ -170,7 +170,7 @@ function PMA_changePassHashingFunction() function PMA_changePassUrlParamsAndSubmitQuery( $password, $_url_params, $sql_query, $hashing_function ) { - $err_url = 'user_password.php' . PMA_generate_common_url($_url_params); + $err_url = 'user_password.php' . PMA_URL_getCommon($_url_params); $local_query = 'SET password = ' . (($password == '') ? '\'\'' : $hashing_function . '(\'' . PMA_Util::sqlAddSlashes($password) . '\')'); @@ -234,7 +234,7 @@ function PMA_changePassDisplayPage($message, $sql_query, $_url_params) echo PMA_Util::getMessage( $message, $sql_query, 'success' ); - echo ''. "\n" .''.__('Back').''; exit; diff --git a/view_create.php b/view_create.php index 743329f3b8..d59eb9c39b 100644 --- a/view_create.php +++ b/view_create.php @@ -170,7 +170,7 @@ $url_params['reload'] = 1; $htmlString = '' . '
        ' . '' - . PMA_generate_common_hidden_inputs($url_params) + . PMA_URL_getHiddenInputs($url_params) . '
        ' . '' . (isset($_REQUEST['ajax_dialog']) ? diff --git a/view_operations.php b/view_operations.php index 3be8ce94d6..05c310536e 100644 --- a/view_operations.php +++ b/view_operations.php @@ -81,7 +81,7 @@ $url_params['back'] = 'view_operations.php';
        - +
        From 1a9edda11957908bf720491f92a315cbcc8f099c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:06:41 +0200 Subject: [PATCH 100/141] Various coding style fixes --- libraries/operations.lib.php | 45 +++++++++++-------- libraries/plugin_interface.lib.php | 3 +- libraries/tbl_columns_definition_form.lib.php | 10 ++--- libraries/url_generating.lib.php | 3 +- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/libraries/operations.lib.php b/libraries/operations.lib.php index 9d5e57d740..6da7a42895 100644 --- a/libraries/operations.lib.php +++ b/libraries/operations.lib.php @@ -261,7 +261,7 @@ function PMA_getHtmlForChangeDatabaseCharset($db, $table) /** * Get HTML snippet for export relational schema view * - * @param string $url_query + * @param string $url_query Query string for link * * @return string $html_output */ @@ -312,7 +312,9 @@ function PMA_runProcedureAndFunctionDefinitions($db) if ($function_names) { foreach ($function_names as $function_name) { $GLOBALS['dbi']->selectDb($db); - $tmp_query = $GLOBALS['dbi']->getDefinition($db, 'FUNCTION', $function_name); + $tmp_query = $GLOBALS['dbi']->getDefinition( + $db, 'FUNCTION', $function_name + ); // collect for later display $GLOBALS['sql_query'] .= "\n" . $tmp_query; $GLOBALS['dbi']->selectDb($_REQUEST['newname']); @@ -334,7 +336,9 @@ function PMA_getSqlQueryAndCreateDbBeforeCopy() 'SHOW VARIABLES LIKE "lower_case_table_names"', 0, 1 ); if ($lower_case_table_names === '1') { - $_REQUEST['newname'] = $GLOBALS['PMA_String']->strtolower($_REQUEST['newname']); + $_REQUEST['newname'] = $GLOBALS['PMA_String']->strtolower( + $_REQUEST['newname'] + ); } } @@ -1012,8 +1016,8 @@ function PMA_getHtmlForCopytable() . ''; } $html_output .= ' . '; - $html_output .= '
        '; $choices = array( @@ -1410,6 +1414,11 @@ function PMA_getHtmlForReferentialIntegrityCheck($foreign, $url_params) return $html_output; } +/** + * Reorder table based on request params + * + * @return array SQL query and result + */ function PMA_getQueryAndResultForReorderingTable() { $sql_query = 'ALTER TABLE ' @@ -1430,19 +1439,19 @@ function PMA_getQueryAndResultForReorderingTable() /** * Get table alters array * - * @param boolean $is_myisam_or_aria whether MYISAM | ARIA or not - * @param boolean $is_isam whether ISAM or not - * @param string $pack_keys pack keys - * @param string $checksum value of checksum - * @param boolean $is_aria whether ARIA or not - * @param string $page_checksum value of page checksum - * @param string $delay_key_write delay key write - * @param boolean $is_innodb whether INNODB or not - * @param boolean $is_pbxt whether PBXT or not - * @param string $row_format row format - * @param string $tbl_storage_engine table storage engine - * @param string $transactional value of transactional - * @param string $tbl_collation collation of the table + * @param boolean $is_myisam_or_aria whether MYISAM | ARIA or not + * @param boolean $is_isam whether ISAM or not + * @param string $pack_keys pack keys + * @param string $checksum value of checksum + * @param boolean $is_aria whether ARIA or not + * @param string $page_checksum value of page checksum + * @param string $delay_key_write delay key write + * @param boolean $is_innodb whether INNODB or not + * @param boolean $is_pbxt whether PBXT or not + * @param string $row_format row format + * @param string $new_tbl_storage_engine table storage engine + * @param string $transactional value of transactional + * @param string $tbl_collation collation of the table * * @return array $table_alters */ diff --git a/libraries/plugin_interface.lib.php b/libraries/plugin_interface.lib.php index 23cc9cd0da..be016bbb43 100644 --- a/libraries/plugin_interface.lib.php +++ b/libraries/plugin_interface.lib.php @@ -134,7 +134,8 @@ function PMA_pluginGetDefault($section, $opt) return htmlspecialchars($_GET[$opt]); } elseif (isset($GLOBALS['timeout_passed']) && $GLOBALS['timeout_passed'] - && isset($_REQUEST[$opt])) { + && isset($_REQUEST[$opt]) + ) { return htmlspecialchars($_REQUEST[$opt]); } elseif (isset($GLOBALS['cfg'][$section][$opt])) { $matches = array(); diff --git a/libraries/tbl_columns_definition_form.lib.php b/libraries/tbl_columns_definition_form.lib.php index 9c6deee76b..d8356f4131 100644 --- a/libraries/tbl_columns_definition_form.lib.php +++ b/libraries/tbl_columns_definition_form.lib.php @@ -12,11 +12,11 @@ if (!defined('PHPMYADMIN')) { /** * Function to get form parameters * - * @param string $db database - * @param string $table table - * @param string $action action - * @param int $num_fields number of fields - * @param bool $selected selected + * @param string $db database + * @param string $table table + * @param string $action action + * @param int $num_fields number of fields + * @param bool $selected selected * * @return array $form_params form parameters */ diff --git a/libraries/url_generating.lib.php b/libraries/url_generating.lib.php index 345fea01d6..5bfbf9a297 100644 --- a/libraries/url_generating.lib.php +++ b/libraries/url_generating.lib.php @@ -156,7 +156,8 @@ function PMA_getHiddenFields($values, $pre = '') * // produces with cookies enabled: * // script.php?myparam=myvalue&db=mysql&table=rights * // with cookies disabled: - * // script.php?server=1&lang=en&myparam=myvalue&db=mysql&table=rights + * // script.php?server=1&lang=en&myparam=myvalue&db=mysql + * // &table=rights * * // note the missing ? * echo 'script.php' . PMA_URL_getCommon(); From 622523de4108130a32b0aff1af3da7c2cda98329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:20:01 +0200 Subject: [PATCH 101/141] Use parser flags instead of regexp matching --- libraries/Util.class.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 76ac79e247..825a1f4d1f 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -439,7 +439,8 @@ class PMA_Util * * @access public */ - public static function getMySQLDocuURL($link, $anchor = '') { + public static function getMySQLDocuURL($link, $anchor = '') + { global $cfg; // Fixup for newly used names: @@ -1164,7 +1165,6 @@ class PMA_Util // but only explain a SELECT (that has not been explained) /* SQL-Parser-Analyzer */ $explain_link = ''; - $is_select = preg_match('@^SELECT[[:space:]]+@i', $sql_query); if (! empty($cfg['SQLQuery']['Explain']) && ! $query_too_big) { $explain_params = $url_params; // Detect if we are validating as well @@ -1172,14 +1172,10 @@ class PMA_Util if (! empty($GLOBALS['validatequery'])) { $explain_params['validatequery'] = 1; } - if ($is_select) { + if ($analyzed_display_query[0]['queryflags']['select_from']) { $explain_params['sql_query'] = 'EXPLAIN ' . $sql_query; $_message = __('Explain SQL'); - } elseif ( - preg_match( - '@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $sql_query - ) - ) { + } elseif ($analyzed_display_query[0]['queryflags']['is_explain']) { $explain_params['sql_query'] = substr($sql_query, 8); $_message = __('Skip Explain SQL'); } @@ -1317,7 +1313,7 @@ class PMA_Util * TODO: Should we have $cfg['SQLQuery']['InlineEdit']? */ if (! empty($cfg['SQLQuery']['Edit']) - && $is_select + && $analyzed_display_query[0]['queryflags']['select_from'] && ! $query_too_big ) { $inline_edit_link = ' [' From 4734ffae580d3598d11a27c080ad43b1aac89d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:20:48 +0200 Subject: [PATCH 102/141] Wrap line --- libraries/Util.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 825a1f4d1f..bf42d03474 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -1711,8 +1711,8 @@ class PMA_Util $tab['link'] = $tab['link'] . PMA_URL_getCommon($url_params); if (! empty($tab['args'])) { foreach ($tab['args'] as $param => $value) { - $tab['link'] .= PMA_URL_getArgSeparator('html') . urlencode($param) - . '=' . urlencode($value); + $tab['link'] .= PMA_URL_getArgSeparator('html') + . urlencode($param) . '=' . urlencode($value); } } } From e725e3b55e7107bc686c93d5802cb8c07b8e0be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:21:14 +0200 Subject: [PATCH 103/141] Do not assign inside if statement --- libraries/Util.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index bf42d03474..f40145cea8 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -1859,7 +1859,8 @@ class PMA_Util // Suhosin: Check that each query parameter is not above maximum $in_suhosin_limits = true; if ($url_length <= $GLOBALS['cfg']['LinkLengthLimit']) { - if ($suhosin_get_MaxValueLength = ini_get('suhosin.get.max_value_length')) { + $suhosin_get_MaxValueLength = ini_get('suhosin.get.max_value_length'); + if ($suhosin_get_MaxValueLength) { $query_parts = self::splitURLQuery($url); foreach ($query_parts as $query_pair) { list($eachvar, $eachval) = explode('=', $query_pair); From 2c17db106352ac5662b215b295d29556a64f9607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:22:39 +0200 Subject: [PATCH 104/141] Calculate file path just once --- libraries/Util.class.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index f40145cea8..9d3e5c2e56 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -180,8 +180,9 @@ class PMA_Util // If it's the first time this function is called if (! isset($sprites)) { // Try to load the list of sprites - if (is_readable($_SESSION['PMA_Theme']->getPath() . '/sprites.lib.php')) { - include_once $_SESSION['PMA_Theme']->getPath() . '/sprites.lib.php'; + $sprite_file = $_SESSION['PMA_Theme']->getPath() . '/sprites.lib.php'; + if (is_readable($sprite_file)) { + include_once $sprite_file; $sprites = PMA_sprites(); } else { // No sprites are available for this theme @@ -2180,10 +2181,11 @@ class PMA_Util ) { $con_val = '= ' . $row[$i]; } elseif ((($meta->type == 'blob') || ($meta->type == 'string')) - // hexify only if this is a true not empty BLOB or a BINARY && stristr($field_flags, 'BINARY') && ! empty($row[$i]) ) { + // hexify only if this is a true not empty BLOB or a BINARY + // do not waste memory building a too big condition if (strlen($row[$i]) < 1000) { // use a CAST if possible, to avoid problems From 865de7028ae09b0de2a57383452d092f183a04fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:25:18 +0200 Subject: [PATCH 105/141] Use foreach instead of for --- libraries/Util.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 9d3e5c2e56..80f12f77ed 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -4051,12 +4051,12 @@ class PMA_Util $minimum_first_occurence_index = null; $regex = null; - for ($i = 0; $i < count($regex_array); $i++) { - if (preg_match($regex_array[$i], $query, $matches, PREG_OFFSET_CAPTURE)) { + foreach ($regex_array as $test_regex) { + if (preg_match($test_regex, $query, $matches, PREG_OFFSET_CAPTURE)) { if (is_null($minimum_first_occurence_index) || ($matches[0][1] < $minimum_first_occurence_index) ) { - $regex = $regex_array[$i]; + $regex = $test_regex; $minimum_first_occurence_index = $matches[0][1]; } } From 7a70c0581a1e01b12c9bda9109276a4e57761fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:26:24 +0200 Subject: [PATCH 106/141] Fix syntax error --- libraries/user_preferences.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/user_preferences.lib.php b/libraries/user_preferences.lib.php index 539b95391d..6e22892d87 100644 --- a/libraries/user_preferences.lib.php +++ b/libraries/user_preferences.lib.php @@ -58,8 +58,8 @@ function PMA_loadUserprefs() $query_table = PMA_Util::backquote($cfgRelation['db']) . '.' . PMA_Util::backquote($cfgRelation['userconfig']); $query = 'SELECT `config_data`, UNIX_TIMESTAMP(`timevalue`) ts' - . 'FROM ' . $query_table . - . 'WHERE `username` = \'' + . ' FROM ' . $query_table + . ' WHERE `username` = \'' . PMA_Util::sqlAddSlashes($cfgRelation['user']) . '\''; $row = $GLOBALS['dbi']->fetchSingleRow($query, 'ASSOC', $GLOBALS['controllink']); From 48df0d6d2349f912b1c8d9e5df5c58ee1da4960d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:30:20 +0200 Subject: [PATCH 107/141] Another syntax error --- libraries/transformations.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/transformations.lib.php b/libraries/transformations.lib.php index 756d737add..b37b7406e7 100644 --- a/libraries/transformations.lib.php +++ b/libraries/transformations.lib.php @@ -290,8 +290,8 @@ function PMA_setMIME($db, $table, $key, $mimetype, $transformation, || strlen($transformation_options) || strlen($row['comment'])) ) { $upd_query = 'UPDATE ' . PMA_Util::backquote($cfgRelation['db']) . '.' - . PMA_Util::backquote($cfgRelation['column_info']) . - . 'SET ' + . PMA_Util::backquote($cfgRelation['column_info']) + . ' SET ' . '`mimetype` = \'' . PMA_Util::sqlAddSlashes($mimetype) . '\', ' . '`transformation` = \'' From 07c1e0a14a5aa6cf915534f04af75a85967f7c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:37:30 +0200 Subject: [PATCH 108/141] Revert "Use parser flags instead of regexp matching" This reverts commit 622523de4108130a32b0aff1af3da7c2cda98329. We don't have flags always available... --- libraries/Util.class.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/Util.class.php b/libraries/Util.class.php index 80f12f77ed..e2b5213a83 100644 --- a/libraries/Util.class.php +++ b/libraries/Util.class.php @@ -1166,6 +1166,7 @@ class PMA_Util // but only explain a SELECT (that has not been explained) /* SQL-Parser-Analyzer */ $explain_link = ''; + $is_select = preg_match('@^SELECT[[:space:]]+@i', $sql_query); if (! empty($cfg['SQLQuery']['Explain']) && ! $query_too_big) { $explain_params = $url_params; // Detect if we are validating as well @@ -1173,10 +1174,14 @@ class PMA_Util if (! empty($GLOBALS['validatequery'])) { $explain_params['validatequery'] = 1; } - if ($analyzed_display_query[0]['queryflags']['select_from']) { + if ($is_select) { $explain_params['sql_query'] = 'EXPLAIN ' . $sql_query; $_message = __('Explain SQL'); - } elseif ($analyzed_display_query[0]['queryflags']['is_explain']) { + } elseif ( + preg_match( + '@^EXPLAIN[[:space:]]+SELECT[[:space:]]+@i', $sql_query + ) + ) { $explain_params['sql_query'] = substr($sql_query, 8); $_message = __('Skip Explain SQL'); } @@ -1314,7 +1319,7 @@ class PMA_Util * TODO: Should we have $cfg['SQLQuery']['InlineEdit']? */ if (! empty($cfg['SQLQuery']['Edit']) - && $analyzed_display_query[0]['queryflags']['select_from'] + && $is_select && ! $query_too_big ) { $inline_edit_link = ' [' From c419f5be598a34aa129314efc7b7325abc85cfe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:40:28 +0200 Subject: [PATCH 109/141] Add some missing includes --- test/libraries/PMA_user_preferences_test.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/test/libraries/PMA_user_preferences_test.php b/test/libraries/PMA_user_preferences_test.php index 3741fe1065..5c10e4b2e3 100644 --- a/test/libraries/PMA_user_preferences_test.php +++ b/test/libraries/PMA_user_preferences_test.php @@ -13,6 +13,8 @@ require_once 'libraries/user_preferences.lib.php'; require_once 'libraries/config/ConfigFile.class.php'; require_once 'libraries/core.lib.php'; require_once 'libraries/Util.class.php'; +require_once 'libraries/php-gettext/gettext.inc'; +require_once 'libraries/relation.lib.php'; /** * tests for methods under user_preferences libarary @@ -109,10 +111,8 @@ class PMA_User_Preferences_Test extends PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $query = ' - SELECT `config_data`, UNIX_TIMESTAMP(`timevalue`) ts - FROM `pma\'db`.`testconf` - WHERE `username` = \'user\''; + $query = 'SELECT `config_data`, UNIX_TIMESTAMP(`timevalue`) ts ' + . 'FROM `pma\'db`.`testconf` WHERE `username` = \'user\''; $dbi->expects($this->once()) ->method('fetchSingleRow') @@ -189,10 +189,8 @@ class PMA_User_Preferences_Test extends PHPUnit_Framework_TestCase $_SESSION['relation'][$GLOBALS['server']]['user'] = "user"; $GLOBALS['controllink'] = null; - $query1 = ' - SELECT `username` - FROM `pmadb`.`testconf` - WHERE `username` = \'user\''; + $query1 = 'SELECT `username` FROM `pmadb`.`testconf` ' + . 'WHERE `username` = \'user\''; $query2 = ' UPDATE `pmadb`.`testconf` From e9da696911782983744bc5e62d7bafd303c3335a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 11:59:01 +0200 Subject: [PATCH 110/141] Various coding style fixes --- libraries/Error.class.php | 27 ++++----- libraries/Header.class.php | 11 ++-- libraries/Index.class.php | 3 + libraries/List.class.php | 12 ++-- libraries/List_Database.class.php | 29 ++++++---- libraries/Menu.class.php | 3 +- libraries/PDF.class.php | 1 + libraries/RecentTable.class.php | 10 +++- libraries/ServerStatusData.class.php | 10 ++-- libraries/Types.class.php | 9 +-- libraries/build_html_for_db.lib.php | 1 + libraries/check_user_privileges.lib.php | 21 +++++-- libraries/data_dictionary_relations.lib.php | 1 + libraries/db_info.inc.php | 5 +- libraries/iconv_wrapper.lib.php | 1 + .../information_schema_relations.lib.php | 1 + libraries/mysql_charsets.inc.php | 57 ++++++++++++++----- libraries/mysql_charsets.lib.php | 1 - 18 files changed, 138 insertions(+), 65 deletions(-) diff --git a/libraries/Error.class.php b/libraries/Error.class.php index e0c8e0a02b..3874769eb3 100644 --- a/libraries/Error.class.php +++ b/libraries/Error.class.php @@ -260,7 +260,8 @@ class PMA_Error extends PMA_Message foreach ($this->getBacktrace() as $step) { if (isset($step['file']) && isset($step['line'])) { - $retval .= PMA_Error::relPath($step['file']) . '#' . $step['line'] . ': '; + $retval .= PMA_Error::relPath($step['file']) + . '#' . $step['line'] . ': '; } if (isset($step['class'])) { $retval .= $step['class'] . $step['type']; @@ -290,8 +291,8 @@ class PMA_Error extends PMA_Message * if $function is one of include/require * the $arg is converted to a relative path * - * @param string $arg - * @param string $function + * @param string $arg argument to process + * @param string $function function name * * @return string */ @@ -381,31 +382,31 @@ class PMA_Error extends PMA_Message $dest = realpath($dest); if (substr(PHP_OS, 0, 3) == 'WIN') { - $path_separator = '\\'; + $separator = '\\'; } else { - $path_separator = '/'; + $separator = '/'; } $Ahere = explode( - $path_separator, - realpath(__DIR__ . $path_separator . '..') + $separator, + realpath(__DIR__ . $separator . '..') ); - $Adest = explode($path_separator, $dest); + $Adest = explode($separator, $dest); $result = '.'; // && count ($Adest)>0 && count($Ahere)>0 ) - while (implode($path_separator, $Adest) != implode($path_separator, $Ahere)) { + while (implode($separator, $Adest) != implode($separator, $Ahere)) { if (count($Ahere) > count($Adest)) { array_pop($Ahere); - $result .= $path_separator . '..'; + $result .= $separator . '..'; } else { array_pop($Adest); } } - $path = $result . str_replace(implode($path_separator, $Adest), '', $dest); + $path = $result . str_replace(implode($separator, $Adest), '', $dest); return str_replace( - $path_separator . $path_separator, - $path_separator, + $separator . $separator, + $separator, $path ); } diff --git a/libraries/Header.class.php b/libraries/Header.class.php index cd811616d3..1e0a6d61b7 100644 --- a/libraries/Header.class.php +++ b/libraries/Header.class.php @@ -394,9 +394,8 @@ class PMA_Header $retval .= $this->_getWarnings(); if ($this->_menuEnabled && $GLOBALS['server'] > 0) { $retval .= $this->_menu->getDisplay(); - $pagetop_link = '%s'; $retval .= sprintf( - $pagetop_link, + '%s', __('Click on the bar to scroll to top of page'), PMA_Util::getImage('s_top.png') ); @@ -526,7 +525,8 @@ class PMA_Header $retval = ""; $retval .= ""; + $retval .= strtolower(PMA_USR_BROWSER_AGENT) + . intval(PMA_USR_BROWSER_VER) . "'>"; return $retval; } @@ -666,7 +666,10 @@ class PMA_Header private function _addRecentTable($db, $table) { $retval = ''; - if ($this->_menuEnabled && strlen($table) && $GLOBALS['cfg']['NumRecentTables'] > 0) { + if ($this->_menuEnabled + && strlen($table) + && $GLOBALS['cfg']['NumRecentTables'] > 0 + ) { $tmp_result = PMA_RecentTable::getInstance()->add($db, $table); if ($tmp_result === true) { $params = array('ajax_request' => true, 'recent_table' => true); diff --git a/libraries/Index.class.php b/libraries/Index.class.php index 6a3b7a26e3..276866e136 100644 --- a/libraries/Index.class.php +++ b/libraries/Index.class.php @@ -10,6 +10,7 @@ if (! defined('PHPMYADMIN')) { } /** + * Index manipulation class * * @package PhpMyAdmin * @since phpMyAdmin 3.0.0 @@ -747,6 +748,8 @@ class PMA_Index } /** + * Index column wrapper + * * @package PhpMyAdmin */ class PMA_Index_Column diff --git a/libraries/List.class.php b/libraries/List.class.php index 1d8824ac6e..e44edd55cc 100644 --- a/libraries/List.class.php +++ b/libraries/List.class.php @@ -10,6 +10,8 @@ if (! defined('PHPMYADMIN')) { } /** + * Generic list class + * * @todo add caching * @abstract * @package PhpMyAdmin @@ -22,8 +24,9 @@ abstract class PMA_List extends ArrayObject */ protected $item_empty = ''; - public function __construct($array = array(), $flags = 0, $iterator_class = "ArrayIterator") - { + public function __construct( + $array = array(), $flags = 0, $iterator_class = "ArrayIterator" + ) { parent::__construct($array, $flags, $iterator_class); } @@ -78,8 +81,9 @@ abstract class PMA_List extends ArrayObject * * @return string HTML option tags */ - public function getHtmlOptions($selected = '', $include_information_schema = true) - { + public function getHtmlOptions( + $selected = '', $include_information_schema = true + ) { if (true === $selected) { $selected = $this->getDefault(); } diff --git a/libraries/List_Database.class.php b/libraries/List_Database.class.php index de5a2834ef..c6a335ebc0 100644 --- a/libraries/List_Database.class.php +++ b/libraries/List_Database.class.php @@ -123,7 +123,9 @@ class PMA_List_Database extends PMA_List $command = $this->command; } - $database_list = $GLOBALS['dbi']->fetchResult($command, null, null, $this->db_link); + $database_list = $GLOBALS['dbi']->fetchResult( + $command, null, null, $this->db_link + ); $GLOBALS['dbi']->getError(); if ($GLOBALS['errno'] !== 0) { @@ -137,9 +139,9 @@ class PMA_List_Database extends PMA_List $GLOBALS['dbi']->getError(); if ($GLOBALS['errno'] !== 0) { - // failed! we will display a warning that phpMyAdmin could not safely - // retrieve database list, the admin has to setup a control user or - // allow SHOW DATABASES + // failed! we will display a warning that phpMyAdmin could not + // safely retrieve database list, the admin has to setup a control + // user or allow SHOW DATABASES $GLOBALS['error_showdatabases'] = true; $this->show_databases_disabled = true; } @@ -244,7 +246,9 @@ class PMA_List_Database extends PMA_List SELECT DISTINCT `Db` FROM `mysql`.`db` WHERE `Select_priv` = 'Y' AND `User` - IN ('" . PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) . "', '')"; + IN ('" + . PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) + . "', '')"; $tmp_mydbs = $GLOBALS['dbi']->fetchResult( $local_query, null, null, $GLOBALS['controllink'] ); @@ -260,7 +264,9 @@ class PMA_List_Database extends PMA_List // populating $dblist[], as previous code did. But it is // now populated with actual database names instead of // with regular expressions. - $tmp_alldbs = $GLOBALS['dbi']->query('SHOW DATABASES;', $GLOBALS['controllink']); + $tmp_alldbs = $GLOBALS['dbi']->query( + 'SHOW DATABASES;', $GLOBALS['controllink'] + ); // all databases cases - part 2 if (isset($tmp_mydbs['%'])) { while ($tmp_row = $GLOBALS['dbi']->fetchRow($tmp_alldbs)) { @@ -287,9 +293,8 @@ class PMA_List_Database extends PMA_List $tmp_matchpattern ) ); - // Fixed db name matching - // 2000-08-28 -- Benjamin Gandon - if (preg_match('/^' . addcslashes($tmp_regex, '/') . '$/', $tmp_db)) { + $tmp_regex = '/^' . addcslashes($tmp_regex, '/') . '$/'; + if (preg_match($tmp_regex, $tmp_db)) { $dblist[] = $tmp_db; break; } @@ -305,8 +310,10 @@ class PMA_List_Database extends PMA_List $local_query = 'SELECT DISTINCT `Db` FROM `mysql`.`tables_priv`'; $local_query .= ' WHERE `Table_priv` LIKE \'%Select%\''; $local_query .= ' AND `User` = \''; - $local_query .= PMA_Util::sqlAddSlashes($GLOBALS['cfg']['Server']['user']) . '\''; - $rs = $GLOBALS['dbi']->tryQuery($local_query, $GLOBALS['controllink']); + $local_query .= PMA_Util::sqlAddSlashes( + $GLOBALS['cfg']['Server']['user'] + ) . '\''; + $rs = $GLOBALS['dbi']->tryQuery($local_query, $GLOBALS['controllink']); if ($rs && @$GLOBALS['dbi']->numRows($rs)) { while ($row = $GLOBALS['dbi']->fetchAssoc($rs)) { if (!in_array($row['Db'], $dblist)) { diff --git a/libraries/Menu.class.php b/libraries/Menu.class.php index 9a23e523ac..5bdcaf39eb 100644 --- a/libraries/Menu.class.php +++ b/libraries/Menu.class.php @@ -135,7 +135,8 @@ class PMA_Menu $cfgRelation = PMA_getRelationsParam(); if ($cfgRelation['menuswork']) { $groupTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) - . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); + . "." + . PMA_Util::backquote($GLOBALS['cfg']['Server']['usergroups']); $userTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) . "." . PMA_Util::backquote($GLOBALS['cfg']['Server']['users']); diff --git a/libraries/PDF.class.php b/libraries/PDF.class.php index 891d772273..72bb11c08d 100644 --- a/libraries/PDF.class.php +++ b/libraries/PDF.class.php @@ -36,6 +36,7 @@ class PMA_PDF extends TCPDF * @param string $encoding charset encoding; default is UTF-8. * @param boolean $diskcache if true reduce the RAM memory usage by caching * temporary data on filesystem (slower). + * @param boolean $pdfa If TRUE set the document to PDF/A mode. * * @return void * @access public diff --git a/libraries/RecentTable.class.php b/libraries/RecentTable.class.php index 62a026544f..f246b52238 100644 --- a/libraries/RecentTable.class.php +++ b/libraries/RecentTable.class.php @@ -1,6 +1,7 @@ addMessage('

        '); $message->addMessage( - PMA_Message::rawError($GLOBALS['dbi']->getError($GLOBALS['controllink'])) + PMA_Message::rawError( + $GLOBALS['dbi']->getError($GLOBALS['controllink']) + ) ); return $message; } diff --git a/libraries/ServerStatusData.class.php b/libraries/ServerStatusData.class.php index dc000dd33d..48fb41eebc 100644 --- a/libraries/ServerStatusData.class.php +++ b/libraries/ServerStatusData.class.php @@ -6,9 +6,9 @@ * * @package PhpMyAdmin */ -if (!defined('TESTSUITE')) { - //the TESTSUITE has already included common.inc.php - require_once 'libraries/common.inc.php'; + +if (! defined('PHPMYADMIN')) { + exit; } /** @@ -71,7 +71,9 @@ class PMA_ServerStatusData /** * for some calculations we require also some server settings */ - $server_variables = $GLOBALS['dbi']->fetchResult('SHOW GLOBAL VARIABLES', 0, 1); + $server_variables = $GLOBALS['dbi']->fetchResult( + 'SHOW GLOBAL VARIABLES', 0, 1 + ); /** * cleanup of some deprecated values diff --git a/libraries/Types.class.php b/libraries/Types.class.php index c6c007cbfc..455c27dc90 100644 --- a/libraries/Types.class.php +++ b/libraries/Types.class.php @@ -161,12 +161,13 @@ class PMA_Types foreach ($this->getTypeOperators($type, $null) as $fc) { if (isset($selectedOperator) && $selectedOperator == $fc) { - $html .= ''; + $selected = ' selected="selected"'; } else { - $html .= ''; + $selected = ''; } + $html .= ''; } return $html; diff --git a/libraries/build_html_for_db.lib.php b/libraries/build_html_for_db.lib.php index 70c754d922..466e4506cc 100644 --- a/libraries/build_html_for_db.lib.php +++ b/libraries/build_html_for_db.lib.php @@ -2,6 +2,7 @@ /* vim: set expandtab sw=4 ts=4 sts=4: */ /** + * HTML geneartor for database listing * * @package PhpMyAdmin */ diff --git a/libraries/check_user_privileges.lib.php b/libraries/check_user_privileges.lib.php index 8d97f37a84..98e23a5c94 100644 --- a/libraries/check_user_privileges.lib.php +++ b/libraries/check_user_privileges.lib.php @@ -35,12 +35,21 @@ $GLOBALS['is_superuser'] = $GLOBALS['dbi']->isSuperuser(); function PMA_analyseShowGrant() { if (PMA_Util::cacheExists('is_create_db_priv', true)) { - $GLOBALS['is_create_db_priv'] = PMA_Util::cacheGet('is_create_db_priv', true); - $GLOBALS['is_process_priv'] = PMA_Util::cacheGet('is_process_priv', true); - $GLOBALS['is_reload_priv'] = PMA_Util::cacheGet('is_reload_priv', true); - $GLOBALS['db_to_create'] = PMA_Util::cacheGet('db_to_create', true); - $GLOBALS['dbs_where_create_table_allowed'] - = PMA_Util::cacheGet('dbs_where_create_table_allowed', true); + $GLOBALS['is_create_db_priv'] = PMA_Util::cacheGet( + 'is_create_db_priv', true + ); + $GLOBALS['is_process_priv'] = PMA_Util::cacheGet( + 'is_process_priv', true + ); + $GLOBALS['is_reload_priv'] = PMA_Util::cacheGet( + 'is_reload_priv', true + ); + $GLOBALS['db_to_create'] = PMA_Util::cacheGet( + 'db_to_create', true + ); + $GLOBALS['dbs_where_create_table_allowed'] = PMA_Util::cacheGet( + 'dbs_where_create_table_allowed', true + ); return; } diff --git a/libraries/data_dictionary_relations.lib.php b/libraries/data_dictionary_relations.lib.php index 651dd658f4..99a0526da3 100644 --- a/libraries/data_dictionary_relations.lib.php +++ b/libraries/data_dictionary_relations.lib.php @@ -1,6 +1,7 @@ query( - 'SHOW TABLES FROM ' . PMA_Util::backquote($db) . $tbl_group_sql . ';', + 'SHOW TABLES FROM ' . PMA_Util::backquote($db) . $tbl_group_sql, null, PMA_DatabaseInterface::QUERY_STORE ); if ($db_info_result && $GLOBALS['dbi']->numRows($db_info_result) > 0) { @@ -90,7 +90,8 @@ if (true === $cfg['SkipLockedTables']) { if (! isset($sot_cache[$tmp[0]])) { $sts_result = $GLOBALS['dbi']->query( 'SHOW TABLE STATUS FROM ' . PMA_Util::backquote($db) - . ' LIKE \'' . PMA_Util::sqlAddSlashes($tmp[0], true) . '\';' + . ' LIKE \'' . PMA_Util::sqlAddSlashes($tmp[0], true) + . '\';' ); $sts_tmp = $GLOBALS['dbi']->fetchAssoc($sts_result); $GLOBALS['dbi']->freeResult($sts_result); diff --git a/libraries/iconv_wrapper.lib.php b/libraries/iconv_wrapper.lib.php index 17e4fe0188..bc822e6fee 100644 --- a/libraries/iconv_wrapper.lib.php +++ b/libraries/iconv_wrapper.lib.php @@ -1,6 +1,7 @@ Date: Wed, 7 Aug 2013 06:03:53 -0400 Subject: [PATCH 111/141] Directly use the post parameter --- pmd_pdf.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pmd_pdf.php b/pmd_pdf.php index 566b7a4454..f4bf3e94d0 100644 --- a/pmd_pdf.php +++ b/pmd_pdf.php @@ -22,7 +22,6 @@ if (isset($_POST['scale']) && ! PMA_isValid($_POST['scale'], 'numeric')) { $post_params = array( 'db', 'mode', - 'newpage', 'pdf_page_number', 'scale' ); @@ -52,7 +51,7 @@ if (isset($mode)) { $scale_q = PMA_Util::sqlAddSlashes($scale); if ('create_export' == $mode) { - $pdf_page_number = PMA_REL_createPage($newpage, $cfgRelation, $db); + $pdf_page_number = PMA_REL_createPage($_POST['newpage'], $cfgRelation, $db); if ($pdf_page_number > 0) { $message = PMA_Message::success(__('Page has been created')); $mode = 'export'; From fb8d73cd2a1ce6656b03bd18b9cfc83a216d9d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 13:17:26 +0200 Subject: [PATCH 112/141] Add comments --- libraries/engines/innobase.lib.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/engines/innobase.lib.php b/libraries/engines/innobase.lib.php index f81ae3f3b9..88dbecde3e 100644 --- a/libraries/engines/innobase.lib.php +++ b/libraries/engines/innobase.lib.php @@ -1,6 +1,7 @@ Date: Wed, 7 Aug 2013 13:20:47 +0200 Subject: [PATCH 113/141] Various coding style fixes --- import.php | 11 ++++++++--- js/messages.php | 14 +++++++++++--- libraries/PDF.class.php | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/import.php b/import.php index f6f49323bf..9a835667aa 100644 --- a/import.php +++ b/import.php @@ -545,7 +545,9 @@ if (! empty($id_bookmark) && $action_bookmark == 2) { } else { if ($import_notice) { $message = PMA_Message::success( - '' . __('Import has been successfully finished, %d queries executed.') . '' + '' + . __('Import has been successfully finished, %d queries executed.') + . '' ); $message->addParam($executed_queries); @@ -605,7 +607,7 @@ if (isset($my_die)) { if ($go_sql) { // parse sql query - require_once 'libraries/parse_analyze.inc.php'; + include_once 'libraries/parse_analyze.inc.php'; PMA_executeQueryAndSendQueryResponse( $analyzed_sql_results, false, $db, $table, null, null, null, false, null, @@ -616,7 +618,10 @@ if ($go_sql) { $response = PMA_Response::getInstance(); $response->isSuccess(true); $response->addJSON('message', PMA_Message::success($msg)); - $response->addJSON('sql_query', PMA_Util::getMessage($msg, $sql_query, 'success')); + $response->addJSON( + 'sql_query', + PMA_Util::getMessage($msg, $sql_query, 'success') + ); } else if ($result == false) { $response = PMA_Response::getInstance(); $response->isSuccess(false); diff --git a/js/messages.php b/js/messages.php index 4632d911d8..11296da952 100644 --- a/js/messages.php +++ b/js/messages.php @@ -26,7 +26,10 @@ session_write_close(); require_once './libraries/js_escape.lib.php'; require_once './libraries/Util.class.php'; -$js_messages['strNoDropDatabases'] = $cfg['AllowUserDropDatabase'] ? '' : __('"DROP DATABASE" statements are disabled.'); +$js_messages['strNoDropDatabases'] = __('"DROP DATABASE" statements are disabled.'); +if ($cfg['AllowUserDropDatabase']) { + $js_messages['strNoDropDatabases'] = ''; +} /* For confirmations */ $js_messages['strConfirm'] = __('Confirm'); @@ -298,7 +301,9 @@ $js_messages['strDisplayHelp'] = '
        • ' . __('The plot can be resized by dragging it along the bottom right corner.') . '
        '; $js_messages['strInputNull'] = '' . __('Select two columns') . ''; -$js_messages['strSameInputs'] = '' . __('Select two different columns') . ''; +$js_messages['strSameInputs'] = '' + . __('Select two different columns') + . ''; $js_messages['strQueryResults'] = __('Query results'); $js_messages['strDataPointContent'] = __('Data point content'); @@ -517,7 +522,10 @@ PMA_printJsValue("$.datepicker.regional['']['weekHeader']", __('Wk')); PMA_printJsValue("$.datepicker.regional['']['showMonthAfterYear']", (__('calendar-month-year') == 'calendar-year-month')); /* l10n: Year suffix for calendar, "none" is empty. */ $year_suffix = _pgettext('Year suffix', 'none'); -PMA_printJsValue("$.datepicker.regional['']['yearSuffix']", ($year_suffix == 'none' ? '' : $year_suffix)); +PMA_printJsValue( + "$.datepicker.regional['']['yearSuffix']", + ($year_suffix == 'none' ? '' : $year_suffix) +); ?> $.extend($.datepicker._defaults, $.datepicker.regional['']); } /* if ($.datepicker) */ diff --git a/libraries/PDF.class.php b/libraries/PDF.class.php index 72bb11c08d..e0c2344b12 100644 --- a/libraries/PDF.class.php +++ b/libraries/PDF.class.php @@ -36,7 +36,7 @@ class PMA_PDF extends TCPDF * @param string $encoding charset encoding; default is UTF-8. * @param boolean $diskcache if true reduce the RAM memory usage by caching * temporary data on filesystem (slower). - * @param boolean $pdfa If TRUE set the document to PDF/A mode. + * @param boolean $pdfa If TRUE set the document to PDF/A mode. * * @return void * @access public From 6ac552ac7cd3f8f2ad817fd3b4349a9105417be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 13:43:30 +0200 Subject: [PATCH 114/141] No more inline html --- setup/frames/config.inc.php | 44 +++--- setup/frames/index.inc.php | 269 ++++++++++++++++++++---------------- setup/frames/menu.inc.php | 25 ++-- 3 files changed, 192 insertions(+), 146 deletions(-) diff --git a/setup/frames/config.inc.php b/setup/frames/config.inc.php index c409c64756..40555463d4 100644 --- a/setup/frames/config.inc.php +++ b/setup/frames/config.inc.php @@ -21,28 +21,32 @@ $config_readable = false; $config_writable = false; $config_exists = false; check_config_rw($config_readable, $config_writable, $config_exists); -?> -

        - - - 'simple')); ?> -
      - - - - '; +echo ''; +echo ''; +echo ''; +echo ' - -'; +echo ''; +echo ''; + PMA_displayFieldsetBottomSimple(); PMA_displayFormBottom(); ?> diff --git a/setup/frames/index.inc.php b/setup/frames/index.inc.php index 8b5718628f..195df033fe 100644 --- a/setup/frames/index.inc.php +++ b/setup/frames/index.inc.php @@ -49,7 +49,14 @@ check_config_rw($config_readable, $config_writable, $config_exists); if (!$config_writable || !$config_readable) { messages_set( 'error', 'config_rw', __('Cannot load or save configuration'), - PMA_lang(__('Please create web server writable folder [em]config[/em] in phpMyAdmin top level directory as described in [doc@setup_script]documentation[/doc]. Otherwise you will be only able to download or display it.')) + PMA_sanitize( + __( + 'Please create web server writable folder [em]config[/em] in ' + . 'phpMyAdmin top level directory as described in ' + . '[doc@setup_script]documentation[/doc]. Otherwise you will be ' + . 'only able to download or display it.' + ) + ) ); } // @@ -57,65 +64,83 @@ if (!$config_writable || !$config_readable) { // $is_https = !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on'; if (!$is_https) { - $text = __('You are not using a secure connection; all data (including potentially sensitive information, like passwords) is transferred unencrypted!'); + $text = __( + 'You are not using a secure connection; all data (including potentially ' + . 'sensitive information, like passwords) is transferred unencrypted!' + ); if (!empty($_SERVER['REQUEST_URI']) && !empty($_SERVER['HTTP_HOST'])) { - $link = 'https://' . htmlspecialchars($_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); - $strInsecureConnectionMsg2 = __('If your server is also configured to accept HTTPS requests follow [a@%s]this link[/a] to use a secure connection.'); - $strInsecureConnectionMsg2 = sprintf($strInsecureConnectionMsg2, $link); - $text .= ' ' . PMA_lang($strInsecureConnectionMsg2); + $link = htmlspecialchars( + 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] + ); + $text .= ' '; + $text .= PMA_sanitize( + sprintf( + __( + 'If your server is also configured to accept HTTPS requests ' + . 'follow [a@%s]this link[/a] to use a secure connection.' + ), + $link + ) + ); } messages_set('notice', 'no_https', __('Insecure connection'), $text); } -?> - - -
      - - +echo '
      '; +echo PMA_URL_getHiddenInputs(); +echo '
      '; +echo ''; +echo ''; - -

      +echo '

      ' . __('Overview') . '

      '; - - +echo ''; + +echo '
      '; +echo __('Servers'); +echo ''; -
      - 'add' ) ); -?> -
      -getServerCount() > 0) { ?> -
      - -
      - - ' . __('Configuration file') . ''; + +PMA_displayFormTop('config.php'); +echo ''; +PMA_displayFieldsetTop('', '', null, array('class' => 'simple')); +echo '
      '; +echo ''; +echo '
      '; +echo ''; +echo ' /> -
      - - - - - - -getServers() as $id => $server) { ?> - - - - - - - - -
      #DSN
      getServerName($id)) ?>getValue("Servers/$id/auth_type")) ?>getServerDSN($id)) ?> - - "> - | "> - -
      - - - - - -
      - -
      - - - - - -
      - -
      - - - +echo '
      '; +if ($cf->getServerCount() > 0) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + foreach ($cf->getServers() as $id => $server) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
      #' . __('Name') . '' . __('Authentication type') . 'DSN
      ' . $id . '' . htmlspecialchars($cf->getServerName($id)) . '' + . htmlspecialchars($cf->getValue("Servers/$id/auth_type")) + . '' . htmlspecialchars($cf->getServerDSN($id)) . ''; + echo ''; + echo '' + . __('Edit') . ''; + echo ' | '; + echo '' + . __('Delete') . ''; + echo ''; + echo '
      '; +} else { + echo ''; + echo ''; + echo ''; + echo ''; + echo '
      '; + echo '' . __('There are no configured servers') . ''; + echo '
      '; +} + +echo ''; +echo ''; +echo ''; +echo ''; +echo '
      '; +echo ''; +echo '
      '; +echo '
      '; + +PMA_displayFormBottom(); + +echo ''; + +echo '
      ' . __('Configuration file') . ''; -
      - - -'; // Display language list $opts = array( @@ -237,40 +268,46 @@ PMA_displayInput( 'eol', __('End of line'), 'select', $eol, '', true, $opts ); -?> - - - -
      - - -     - '; +echo ''; +echo ''; +echo ''; +echo '   '; + +echo ' /> - '; + +echo ' /> - '; + +echo ' /> -     - -
      -'; + +echo '   '; +echo ''; +echo '
      '; + PMA_displayFormBottom(); -?> - - + +echo ''; +echo ''; diff --git a/setup/frames/menu.inc.php b/setup/frames/menu.inc.php index 35011d4807..0ca99109a9 100644 --- a/setup/frames/menu.inc.php +++ b/setup/frames/menu.inc.php @@ -11,13 +11,18 @@ if (!defined('PHPMYADMIN')) { } $separator = PMA_URL_getArgSeparator('html'); -?> -
        -
      • -
      • -
      • -
      • -
      • -
      • -
      • -
      +echo ''; From bb03e612f0579a989ad98bc4e312980009f4fe85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 13:54:17 +0200 Subject: [PATCH 115/141] Add missing space --- libraries/user_preferences.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/user_preferences.lib.php b/libraries/user_preferences.lib.php index 6e22892d87..78bd0adeb5 100644 --- a/libraries/user_preferences.lib.php +++ b/libraries/user_preferences.lib.php @@ -99,7 +99,7 @@ function PMA_saveUserprefs(array $config_array) $query_table = PMA_Util::backquote($cfgRelation['db']) . '.' . PMA_Util::backquote($cfgRelation['userconfig']); $query = 'SELECT `username` FROM ' . $query_table - . 'WHERE `username` = \'' + . ' WHERE `username` = \'' . PMA_Util::sqlAddSlashes($cfgRelation['user']) . '\''; From c2b2c7b6e901ae9f786b5206085d62a67b54f66f Mon Sep 17 00:00:00 2001 From: Marc Delisle Date: Wed, 7 Aug 2013 08:27:34 -0400 Subject: [PATCH 116/141] Bug #4048 Cannot select foreign value in Search --- ChangeLog | 1 + browse_foreigners.php | 13 ++++++++++--- libraries/TableSearch.class.php | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 628bfbeeae..dbcbd58d56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ phpMyAdmin - ChangeLog 4.0.6.0 (not yet released) - bug #4036 Call to undefined function mb_detect_encoding (clarify the doc) - bug Missing hints when changing a column's structure +- bug #4048 Cannot select foreign value in Search 4.0.5.0 (2013-08-04) - bug #3977 Not detected configuration storage diff --git a/browse_foreigners.php b/browse_foreigners.php index 9a9fdf9043..c3301192c1 100644 --- a/browse_foreigners.php +++ b/browse_foreigners.php @@ -95,15 +95,22 @@ if (is_array($foreignData['disp_row'])) { } } - +// When coming from Table/Zoom search +if (isset($_REQUEST['fromsearch'])) { + // In table or zoom search, input fields are named "criteriaValues" + $element_name = " var field = 'criteriaValues';\n"; +} else { + // In insert/edit, input fields are named "fields" + $element_name = " var field = 'fields';\n"; +} if (isset($rownumber)) { - $element_name = " var element_name = field + '[multi_edit][" + $element_name .= " var element_name = field + '[multi_edit][" . htmlspecialchars($rownumber) . "][' + fieldmd5 + ']';\n" . " var null_name = field_null + '[multi_edit][" . htmlspecialchars($rownumber) . "][' + fieldmd5 + ']';\n"; } else { - $element_name = "var element_name = field + '[]'"; + $element_name .= "var element_name = field + '[]'"; } $error = PMA_jsFormat( __( diff --git a/libraries/TableSearch.class.php b/libraries/TableSearch.class.php index d9bb83079b..65f45ada66 100644 --- a/libraries/TableSearch.class.php +++ b/libraries/TableSearch.class.php @@ -283,7 +283,7 @@ class PMA_TableSearch EOT; $html_output .= '' . PMA_generate_common_url($this->_db, $this->_table) . '&field=' . urlencode($column_name) . '&fieldkey=' - . $column_index . '"'; + . $column_index . '&fromsearch=1"'; if ($in_zoom_search_edit) { $html_output .= ' class="browse_foreign"'; } From 1b70a0086be269e11c2502c3f4e29b787e2f305b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=B1=ED=98=84=20=EC=96=91?= Date: Wed, 7 Aug 2013 00:59:17 +0200 Subject: [PATCH 117/141] Translated using Weblate (Korean) Currently translated at 73.1% (1908 of 2609) --- po/ko.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/ko.po b/po/ko.po index 11a2917487..5837155c3a 100644 --- a/po/ko.po +++ b/po/ko.po @@ -4,8 +4,8 @@ msgstr "" "Project-Id-Version: phpMyAdmin 4.0.6-dev\n" "Report-Msgid-Bugs-To: phpmyadmin-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2013-07-29 15:07+0200\n" -"PO-Revision-Date: 2013-08-06 03:07+0200\n" -"Last-Translator: Myung Han Yu \n" +"PO-Revision-Date: 2013-08-07 00:58+0200\n" +"Last-Translator: 성현 양 \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -564,7 +564,7 @@ msgstr "포인트 %d" #: gis_data_editor.php:245 gis_data_editor.php:300 gis_data_editor.php:373 #: js/messages.php:318 msgid "Add a point" -msgstr "포인트 추가하기" +msgstr "포인트 추가" #: gis_data_editor.php:262 js/messages.php:313 msgid "Linestring" From 01ebe9c03017fc1c8ccdbec3fad41f64027e5d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 14:39:39 +0200 Subject: [PATCH 118/141] Do not double HTML encode URL PMA_generate_common_url already does HTML encoding, so there is no need to do that again (bug #4026). --- server_variables.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_variables.php b/server_variables.php index d1d6b9169c..6bad829d02 100644 --- a/server_variables.php +++ b/server_variables.php @@ -125,7 +125,7 @@ $output = '

      ' . PMA_Util::getImage('s_vars.png') /** * Link templates */ -$url = htmlspecialchars('server_variables.php?' . PMA_generate_common_url()); +$url = 'server_variables.php?' . PMA_generate_common_url(); $output .= ''; $output .= ''; $output .= '' @@ -1749,8 +1748,7 @@ function PMA_getHtmlForSpecificDbPrivileges($link_edit, $conditional_class) .'" rel="' .'checkprivs='.htmlspecialchars($_REQUEST['checkprivs']) . '&'.$GLOBALS['url_query'] - . '" class="'.$conditional_class - .'" name="db_specific">' . "\n" + . '" class="ajax" name="db_specific">' . "\n" . PMA_Util::getIcon('b_usradd.png') . ' ' . __('Add user') . '' . "\n"; @@ -1880,13 +1878,11 @@ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, * Define some standard links * $link_edit, $link_revoke, $link_export * - * @param string $conditional_class if ajaxable 'Ajax' otherwise '' - * * @return array with some standard links */ -function PMA_getStandardLinks($conditional_class) +function PMA_getStandardLinks() { - $link_edit = '

      '; // add/delete user fieldset - $html_output .= PMA_getFieldsetForAddDeleteUser($conditional_class); + $html_output .= PMA_getFieldsetForAddDeleteUser(); $html_output .= '' . "\n"; return $html_output; @@ -2702,16 +2697,14 @@ function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export /** * Get HTML fieldset for Add/Delete user * - * @param string $conditional_class if ajaxable 'Ajax' otherwise '' - * * @return string HTML snippet */ -function PMA_getFieldsetForAddDeleteUser($conditional_class) +function PMA_getFieldsetForAddDeleteUser() { $html_output = '
      ' . "\n"; $html_output .= '' . "\n" + . 'class="ajax">' . "\n" . PMA_Util::getIcon('b_usradd.png') . ' ' . __('Add user') . '' . "\n"; $html_output .= '
      ' . "\n"; @@ -2739,7 +2732,7 @@ function PMA_getFieldsetForAddDeleteUser($conditional_class) $html_output .= '' . "\n"; @@ -2750,11 +2743,10 @@ function PMA_getFieldsetForAddDeleteUser($conditional_class) * Get HTML for Displays the initials * * @param array $array_initials array for all initials, even non A-Z - * @param string $conditional_class if ajaxable 'Ajax' otherwise '' * * @return string HTML snippet */ -function PMA_getHtmlForDisplayTheInitials($array_initials, $conditional_class) +function PMA_getHtmlForDisplayTheInitials($array_initials) { // initialize to false the letters A-Z for ($letter_counter = 1; $letter_counter < 27; $letter_counter++) { @@ -2784,7 +2776,7 @@ function PMA_getHtmlForDisplayTheInitials($array_initials, $conditional_class) if (! empty($tmp_initial)) { if ($initial_was_found) { $html_output .= '' - . '' . $tmp_initial @@ -3004,16 +2996,14 @@ function PMA_getHtmlForExportUserDefinition($username, $hostname) /** * Get HTML for display Add userfieldset * - * @param string $conditional_class if ajaxable 'Ajax' otherwise '' - * * @return string html output */ -function PMA_getAddUserHtmlFieldset($conditional_class) +function PMA_getAddUserHtmlFieldset() { return '
      ' . "\n" . '' . "\n" + . 'class="ajax">' . "\n" . PMA_Util::getIcon('b_usradd.png') . ' ' . __('Add user') . '' . "\n" . '
      ' . "\n"; @@ -3080,13 +3070,12 @@ function PMA_getHtmlHeaderForDisplayUserProperties( * @param string $link_edit standard link to edit privileges * @param string $pmaThemeImage a image source link * @param string $text_dir text directory - * @param string $conditional_class if ajaxable 'Ajax' otherwise '' * @param string $link_export standard link to export privileges * * @return string $html_output */ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, - $text_dir, $conditional_class, $link_export + $text_dir, $link_export ) { $html_output = '

      ' . "\n" . PMA_Util::getIcon('b_usrlist.png') @@ -3143,7 +3132,7 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, */ if ($GLOBALS['dbi']->numRows($res) > 20 ) { $html_output .= PMA_getHtmlForDisplayTheInitials( - $array_initials, $conditional_class + $array_initials, ); } @@ -3157,10 +3146,10 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, ) { $html_output .= PMA_getUsersOverview( $res, $db_rights, $link_edit, $pmaThemeImage, - $text_dir, $conditional_class, $link_export + $text_dir, $link_export ); } else { - $html_output .= PMA_getAddUserHtmlFieldset($conditional_class); + $html_output .= PMA_getAddUserHtmlFieldset(); } // end if (display overview) if (! $GLOBALS['is_ajax_request'] || ! empty($_REQUEST['ajax_page_request'])) { diff --git a/server_privileges.php b/server_privileges.php index 8942389795..0f5536f38f 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -59,8 +59,6 @@ foreach (array_keys($_POST) as $post_key) { require 'libraries/server_common.inc.php'; -$conditional_class = 'ajax'; - /** * Messages are built using the message name */ @@ -382,8 +380,7 @@ if (isset($_REQUEST['validate_username'])) { /** * some standard links */ -list($link_edit, $link_revoke, $link_export) - = PMA_getStandardLinks($conditional_class); +list($link_edit, $link_revoke, $link_export) = PMA_getStandardLinks(); /** * If we are in an Ajax request for Create User/Edit User/Revoke User/ @@ -485,8 +482,7 @@ if (empty($_REQUEST['adduser']) // No username is given --> display the overview $response->addHTML( PMA_getHtmlForDisplayUserOverviewPage( - $link_edit, $pmaThemeImage, $text_dir, - $conditional_class, $link_export + $link_edit, $pmaThemeImage, $text_dir, $link_export ) ); } else { @@ -519,7 +515,7 @@ if (empty($_REQUEST['adduser']) } else { // check the privileges for a particular database. $response->addHTML( - PMA_getHtmlForSpecificDbPrivileges($link_edit, $conditional_class) + PMA_getHtmlForSpecificDbPrivileges($link_edit) ); } // end if (empty($_REQUEST['adduser']) && empty($checkprivs))... elseif... else... From 056ed1929ef473bf1d9e17e4728a14c3a8a22175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 15:57:46 +0200 Subject: [PATCH 126/141] Correctly generate link for editing user With PMA_URL_getCommon we get correct separator and escaping for free. --- libraries/server_privileges.lib.php | 117 ++++++++++++---------------- server_privileges.php | 9 +-- 2 files changed, 53 insertions(+), 73 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index aa55883806..08e4283e44 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1669,11 +1669,9 @@ function PMA_getListOfPrivilegesAndComparedPrivileges() /** * Get the HTML for user form and check the privileges for a particular database. * - * @param string $link_edit standard link for edit - * * @return string $html_output */ -function PMA_getHtmlForSpecificDbPrivileges($link_edit) +function PMA_getHtmlForSpecificDbPrivileges() { // check the privileges for a particular database. $html_output = '
      ' @@ -1725,7 +1723,7 @@ function PMA_getHtmlForSpecificDbPrivileges($link_edit) $found = true; } $html_output .= PMA_getHtmlTableBodyForSpecificDbPrivs( - $found, $row, $odd_row, $link_edit, $res + $found, $row, $odd_row, $res ); $html_output .= '' . '' @@ -1764,13 +1762,12 @@ function PMA_getHtmlForSpecificDbPrivileges($link_edit) * @param array $row array of rows from mysql, * db table with list of privileges * @param boolean $odd_row whether odd or not - * @param string $link_edit standard link for edit * @param string $res ran sql query * * @return string $html_output */ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, - $link_edit, $res + $res ) { $html_output = '' . "\n"; if ($found) { @@ -1840,14 +1837,9 @@ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, . "\n" . '' . "\n" . '' . "\n"; - $html_output .= sprintf( - $link_edit, - urlencode($current_user), - urlencode($current_host), - urlencode( - ! (isset($current['Db']) || $current['Db'] == '*') ? '' : $current['Db'] - ), - '' + $html_output .= PMA_getUserEditLink( + $current_user, $current_host, + ! (isset($current['Db']) || $current['Db'] == '*') ? '' : $current['Db'] ); $html_output .= '' . "\n" . ' ' . "\n"; @@ -1874,24 +1866,34 @@ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, return $html_output; } +/** + * Returns edit link for a user. + */ +function PMA_getUserEditLink($username, $hostname, $dbname = '', $tablename = '') +{ + return '' + . PMA_Util::getIcon('b_usredit.png', __('Edit Privileges')) + . ''; +} + /** * Define some standard links - * $link_edit, $link_revoke, $link_export + * $link_revoke, $link_export * * @return array with some standard links */ function PMA_getStandardLinks() { - $link_edit = '' - . PMA_Util::getIcon('b_usredit.png', __('Edit Privileges')) - . ''; - $link_revoke = ''; - return array($link_edit, $link_revoke, $link_export); + return array($link_revoke, $link_export); } /** @@ -1922,14 +1924,13 @@ function PMA_getStandardLinks() * @param string $password password * @param string $link_export export link * @param string $sql_query sql query - * @param string $link_edit standard link for edit * @param string $hostname hostname * @param string $username username * * @return array $extra_data */ function PMA_getExtraDataForAjaxBehavior($password, $link_export, $sql_query, - $link_edit, $hostname, $username + $hostname, $username ) { if (isset($GLOBALS['dbname'])) { //if (preg_match('/\\\\(?:_|%)/i', $dbname)) { @@ -1989,13 +1990,7 @@ function PMA_getExtraDataForAjaxBehavior($password, $link_export, $sql_query, $new_user_string .=''; $new_user_string .= '' - . sprintf( - $link_edit, - urlencode($username), - urlencode($hostname), - '', - '' - ) + . PMA_getUserEditLink($username, $hostname) . '' . "\n"; $new_user_string .= '' . sprintf( @@ -2236,7 +2231,6 @@ function PMA_getUserSpecificRights($tables, $user_host_condition, $dbname) * Display user rights in table rows(Table specific or database specific privs) * * @param array $db_rights user's database rights array - * @param string $link_edit standard link to edit privileges * @param string $dbname database name * @param string $link_revoke standard link to revoke * @param string $hostname host name @@ -2244,7 +2238,7 @@ function PMA_getUserSpecificRights($tables, $user_host_condition, $dbname) * * @return array $found_rows, $html_output */ -function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $link_edit, $dbname, +function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $dbname, $link_revoke, $hostname, $username ) { $html_output = ''; @@ -2287,14 +2281,11 @@ function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $link_edit, $dbname, } $html_output .= '' . "\n" . ''; - $html_output .= sprintf( - $link_edit, - htmlspecialchars(urlencode($username)), - urlencode(htmlspecialchars($hostname)), - urlencode( - (! strlen($dbname)) ? $row['Db'] : htmlspecialchars($dbname) - ), - urlencode((! strlen($dbname)) ? '' : $row['Table_name']) + $html_output .= PMA_getUserEditLink( + $username, + $hostname, + (! strlen($dbname)) ? $row['Db'] : $dbname, + (! strlen($dbname)) ? '' : $row['Table_name'] ); $html_output .= '' . "\n" . ' '; @@ -2325,14 +2316,13 @@ function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $link_edit, $dbname, * * @param string $username username * @param string $hostname host name - * @param string $link_edit standard link to edit privileges * @param string $link_revoke standard link to revoke * @param string $dbname database name * * @return array $html_output, $found_rows */ function PMA_getTableForDisplayAllTableSpecificRights($username, $hostname - , $link_edit, $link_revoke, $dbname + , $link_revoke, $dbname ) { // table header $html_output = PMA_URL_getHiddenInputs('', '') @@ -2386,7 +2376,7 @@ function PMA_getTableForDisplayAllTableSpecificRights($username, $hostname $html_output .= '' . "\n"; // display rows list ($found_rows, $html_out) = PMA_getHtmlForDisplayUserRightsInRows( - $db_rights, $link_edit, $dbname, $link_revoke, $hostname, $username + $db_rights, $dbname, $link_revoke, $hostname, $username ); $html_output .= $html_out; @@ -2492,14 +2482,13 @@ function PMA_displayTablesInEditPrivs($dbname, $found_rows) * * @param array $result ran sql query * @param array $db_rights user's database rights array - * @param string $link_edit standard link to edit privileges * @param string $pmaThemeImage a image source link * @param string $text_dir text directory * @param string $link_export standard link to export privileges * * @return string HTML snippet */ -function PMA_getUsersOverview($result, $db_rights, $link_edit, $pmaThemeImage, +function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, $text_dir, $link_export ) { while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { @@ -2533,7 +2522,7 @@ function PMA_getUsersOverview($result, $db_rights, $link_edit, $pmaThemeImage, $html_output .= '' . "\n"; $html_output .= PMA_getTableBodyForUserRightsTable( - $db_rights, $link_edit, $link_export + $db_rights, $link_export ); $html_output .= '' . '' . "\n"; @@ -2568,12 +2557,11 @@ function PMA_getUsersOverview($result, $db_rights, $link_edit, $pmaThemeImage, * Get table body for 'tableuserrights' table in userform * * @param array $db_rights user's database rights array - * @param string $link_edit standard link to edit privileges * @param string $link_export Link for export all users * * @return string HTML snippet */ -function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export) +function PMA_getTableBodyForUserRightsTable($db_rights, $link_export) { if ($GLOBALS['cfgRelation']['menuswork']) { $usersTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) @@ -2659,12 +2647,9 @@ function PMA_getTableBodyForUserRightsTable($db_rights, $link_edit, $link_export . '' . "\n"; $html_output .= '' - . sprintf( - $link_edit, - urlencode($host['User']), - urlencode($host['Host']), - '', - '' + . PMA_getUserEditLink( + $host['User'], + $host['Host'] ) . ''; if ($GLOBALS['cfgRelation']['menuswork'] && $userGroupCount > 0) { @@ -3067,14 +3052,13 @@ function PMA_getHtmlHeaderForDisplayUserProperties( /** * Get HTML snippet for display user overview page * - * @param string $link_edit standard link to edit privileges * @param string $pmaThemeImage a image source link * @param string $text_dir text directory * @param string $link_export standard link to export privileges * * @return string $html_output */ -function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, +function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, $text_dir, $link_export ) { $html_output = '

      ' . "\n" @@ -3131,9 +3115,7 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, * Also not necassary if there is less than 20 privileges */ if ($GLOBALS['dbi']->numRows($res) > 20 ) { - $html_output .= PMA_getHtmlForDisplayTheInitials( - $array_initials, - ); + $html_output .= PMA_getHtmlForDisplayTheInitials($array_initials); } /** @@ -3145,7 +3127,7 @@ function PMA_getHtmlForDisplayUserOverviewPage($link_edit, $pmaThemeImage, || $GLOBALS['dbi']->numRows($res) < 50 ) { $html_output .= PMA_getUsersOverview( - $res, $db_rights, $link_edit, $pmaThemeImage, + $res, $db_rights, $pmaThemeImage, $text_dir, $link_export ); } else { @@ -3501,7 +3483,6 @@ function PMA_editUserGroup($userGroup, $new = false) * @param type $url_dbname url database name that urlencode() string * @param string $username username * @param string $hostname host name - * @param string $link_edit standard link to edit privileges * @param string $link_revoke standard link to revoke * @param string $dbname database name * @param string $tablename table name @@ -3509,7 +3490,7 @@ function PMA_editUserGroup($userGroup, $new = false) * @return string $html_output */ function PMA_getHtmlForDisplayUserProperties($dbname_is_wildcard,$url_dbname, - $username, $hostname, $link_edit, $link_revoke, $dbname, $tablename + $username, $hostname, $link_revoke, $dbname, $tablename ) { $html_output = PMA_getHtmlHeaderForDisplayUserProperties( $dbname_is_wildcard, $url_dbname, $dbname, $username, $hostname, $tablename @@ -3563,7 +3544,7 @@ function PMA_getHtmlForDisplayUserProperties($dbname_is_wildcard,$url_dbname, $unescaped_db = PMA_Util::unescapeMysqlWildcards($dbname); list($html_rightsTable, $found_rows) = PMA_getTableForDisplayAllTableSpecificRights( - $username, $hostname, $link_edit, $link_revoke, $unescaped_db + $username, $hostname, $link_revoke, $unescaped_db ); $html_output .= $html_rightsTable; diff --git a/server_privileges.php b/server_privileges.php index 0f5536f38f..1901c12b60 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -380,7 +380,7 @@ if (isset($_REQUEST['validate_username'])) { /** * some standard links */ -list($link_edit, $link_revoke, $link_export) = PMA_getStandardLinks(); +list($link_revoke, $link_export) = PMA_getStandardLinks(); /** * If we are in an Ajax request for Create User/Edit User/Revoke User/ @@ -401,7 +401,6 @@ if ($GLOBALS['is_ajax_request'] (isset($password) ? $password : ''), $link_export, (isset($sql_query) ? $sql_query : ''), - $link_edit, (isset($hostname) ? $hostname : ''), (isset($username) ? $username : '') ); @@ -482,7 +481,7 @@ if (empty($_REQUEST['adduser']) // No username is given --> display the overview $response->addHTML( PMA_getHtmlForDisplayUserOverviewPage( - $link_edit, $pmaThemeImage, $text_dir, $link_export + $pmaThemeImage, $text_dir, $link_export ) ); } else { @@ -501,7 +500,7 @@ if (empty($_REQUEST['adduser']) $response->addHTML( PMA_getHtmlForDisplayUserProperties( ((isset ($dbname_is_wildcard)) ? $dbname_is_wildcard : ''), - $url_dbname, $username, $hostname, $link_edit, $link_revoke, + $url_dbname, $username, $hostname, $link_revoke, (isset($dbname) ? $dbname : ''), (isset($tablename) ? $tablename : '') ) @@ -515,7 +514,7 @@ if (empty($_REQUEST['adduser']) } else { // check the privileges for a particular database. $response->addHTML( - PMA_getHtmlForSpecificDbPrivileges($link_edit) + PMA_getHtmlForSpecificDbPrivileges() ); } // end if (empty($_REQUEST['adduser']) && empty($checkprivs))... elseif... else... From 950af59138909552f842d21f4ffe9f515d68add5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 16:01:10 +0200 Subject: [PATCH 127/141] Correctly use PMA_URL_getCommon instead of manually adding some parameters --- libraries/server_privileges.lib.php | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index 08e4283e44..c5e8aae047 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -2282,7 +2282,7 @@ function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $dbname, $html_output .= '' . "\n" . ''; $html_output .= PMA_getUserEditLink( - $username, + $username, $hostname, (! strlen($dbname)) ? $row['Db'] : $dbname, (! strlen($dbname)) ? '' : $row['Table_name'] @@ -3236,19 +3236,25 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= ''; $html_output .= '' + . PMA_URL_getCommon(array( + 'viewUsers' => 1, 'userGroup' => $row['usergroup'] + )) + . '">' . PMA_Util::getIcon('b_usrlist.png', __('View users')) . ''; $html_output .= '  '; $html_output .= '' + . PMA_URL_getCommon(array( + 'editUserGroup' => 1, 'userGroup' => $row['usergroup'] + )) + . '">' . PMA_Util::getIcon('b_edit.png', __('Edit')) . ''; $html_output .= '  '; $html_output .= '' + . PMA_URL_getCommon(array( + 'deleteUserGroup' => 1, 'userGroup' => $row['usergroup'] + )) + . '">' . PMA_Util::getIcon('b_drop.png', __('Delete')) . ''; $html_output .= ''; @@ -3264,8 +3270,8 @@ function PMA_getHtmlForUserGroupsTable() $GLOBALS['dbi']->freeResult($result); $html_output .= '
      '; - $html_output .= '' + $html_output .= '' . PMA_Util::getIcon('b_usradd.png') . __('Add user group') . ''; $html_output .= '
      '; From 311fc81bcec18cd1693554251f914aa2e7138e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 16:07:24 +0200 Subject: [PATCH 128/141] Correctly generate link for revoking user With PMA_URL_getCommon we get correct separator and escaping for free. --- libraries/server_privileges.lib.php | 63 +++++++++++++++-------------- server_privileges.php | 4 +- 2 files changed, 35 insertions(+), 32 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index c5e8aae047..b18589afe7 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1886,25 +1886,34 @@ function PMA_getUserEditLink($username, $hostname, $dbname = '', $tablename = '' . ''; } +/** + * Returns revoke link for a user. + */ +function PMA_getUserRevokeLink($username, $hostname, $dbname = '', $tablename = '') +{ + return '' + . PMA_Util::getIcon('b_usrdrop.png', __('Revoke')) + . ''; +} + /** * Define some standard links - * $link_revoke, $link_export + * $link_export * * @return array with some standard links */ function PMA_getStandardLinks() { - $link_revoke = '' - . PMA_Util::getIcon('b_usrdrop.png', __('Revoke')) - . ''; - $link_export = 'addHTML( PMA_getHtmlForDisplayUserProperties( ((isset ($dbname_is_wildcard)) ? $dbname_is_wildcard : ''), - $url_dbname, $username, $hostname, $link_revoke, + $url_dbname, $username, $hostname, (isset($dbname) ? $dbname : ''), (isset($tablename) ? $tablename : '') ) From 7e142381c91c4470d6a96e6d62cb482bf59a9a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 16:11:19 +0200 Subject: [PATCH 129/141] Correctly generate link for exporting user With PMA_URL_getCommon we get correct separator and escaping for free. --- libraries/server_privileges.lib.php | 70 ++++++++++++----------------- server_privileges.php | 10 +---- 2 files changed, 29 insertions(+), 51 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index b18589afe7..f3e6414016 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1907,39 +1907,37 @@ function PMA_getUserRevokeLink($username, $hostname, $dbname = '', $tablename = } /** - * Define some standard links - * $link_export - * - * @return array with some standard links + * Returns revoke link for a user. */ -function PMA_getStandardLinks() +function PMA_getUserExportLink($username, $hostname, $initial = '') { - $link_export = '' + return '' . PMA_Util::getIcon('b_tblexport.png', __('Export')) . ''; - - return array($link_export); } /** * This function return the extra data array for the ajax behavior * * @param string $password password - * @param string $link_export export link * @param string $sql_query sql query * @param string $hostname hostname * @param string $username username * * @return array $extra_data */ -function PMA_getExtraDataForAjaxBehavior($password, $link_export, $sql_query, - $hostname, $username +function PMA_getExtraDataForAjaxBehavior( + $password, $sql_query, $hostname, $username ) { if (isset($GLOBALS['dbname'])) { //if (preg_match('/\\\\(?:_|%)/i', $dbname)) { @@ -2002,11 +2000,10 @@ function PMA_getExtraDataForAjaxBehavior($password, $link_export, $sql_query, . PMA_getUserEditLink($username, $hostname) . '' . "\n"; $new_user_string .= '' - . sprintf( - $link_export, - urlencode($username), - urlencode($hostname), - (isset($_GET['initial']) ? $_GET['initial'] : '') + . PMA_getUserExportLink( + $username, + $hostname, + isset($_GET['initial']) ? $_GET['initial'] : '' ) . '' . "\n"; @@ -2488,13 +2485,10 @@ function PMA_displayTablesInEditPrivs($dbname, $found_rows) * @param array $db_rights user's database rights array * @param string $pmaThemeImage a image source link * @param string $text_dir text directory - * @param string $link_export standard link to export privileges * * @return string HTML snippet */ -function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, - $text_dir, $link_export -) { +function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, $text_dir) { while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { $row['privs'] = PMA_extractPrivInfo($row, true); $db_rights[$row['User']][$row['Host']] = $row; @@ -2525,9 +2519,7 @@ function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, . '' . "\n"; $html_output .= '' . "\n"; - $html_output .= PMA_getTableBodyForUserRightsTable( - $db_rights, $link_export - ); + $html_output .= PMA_getTableBodyForUserRightsTable($db_rights); $html_output .= '' . '' . "\n"; @@ -2561,11 +2553,10 @@ function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, * Get table body for 'tableuserrights' table in userform * * @param array $db_rights user's database rights array - * @param string $link_export Link for export all users * * @return string HTML snippet */ -function PMA_getTableBodyForUserRightsTable($db_rights, $link_export) +function PMA_getTableBodyForUserRightsTable($db_rights) { if ($GLOBALS['cfgRelation']['menuswork']) { $usersTable = PMA_Util::backquote($GLOBALS['cfg']['Server']['pmadb']) @@ -2669,11 +2660,10 @@ function PMA_getTableBodyForUserRightsTable($db_rights, $link_export) } } $html_output .= '' - . sprintf( - $link_export, - urlencode($host['User']), - urlencode($host['Host']), - (isset($_GET['initial']) ? $_GET['initial'] : '') + . PMA_getUserExportLink( + $host['User'], + $host['Host'], + isset($_GET['initial']) ? $_GET['initial'] : '' ) . ''; $html_output .= ''; @@ -3058,13 +3048,10 @@ function PMA_getHtmlHeaderForDisplayUserProperties( * * @param string $pmaThemeImage a image source link * @param string $text_dir text directory - * @param string $link_export standard link to export privileges * * @return string $html_output */ -function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, - $text_dir, $link_export -) { +function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, $text_dir) { $html_output = '

      ' . "\n" . PMA_Util::getIcon('b_usrlist.png') . __('Users overview') . "\n" @@ -3131,8 +3118,7 @@ function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, || $GLOBALS['dbi']->numRows($res) < 50 ) { $html_output .= PMA_getUsersOverview( - $res, $db_rights, $pmaThemeImage, - $text_dir, $link_export + $res, $db_rights, $pmaThemeImage, $text_dir ); } else { $html_output .= PMA_getAddUserHtmlFieldset(); diff --git a/server_privileges.php b/server_privileges.php index c06be9fce3..7188a4d880 100644 --- a/server_privileges.php +++ b/server_privileges.php @@ -377,11 +377,6 @@ if (isset($_REQUEST['validate_username'])) { $message = PMA_Message::success(); } -/** - * some standard links - */ -list($link_export) = PMA_getStandardLinks(); - /** * If we are in an Ajax request for Create User/Edit User/Revoke User/ * Flush Privileges, show $message and exit. @@ -399,7 +394,6 @@ if ($GLOBALS['is_ajax_request'] ) { $extra_data = PMA_getExtraDataForAjaxBehavior( (isset($password) ? $password : ''), - $link_export, (isset($sql_query) ? $sql_query : ''), (isset($hostname) ? $hostname : ''), (isset($username) ? $username : '') @@ -480,9 +474,7 @@ if (empty($_REQUEST['adduser']) if (! isset($username)) { // No username is given --> display the overview $response->addHTML( - PMA_getHtmlForDisplayUserOverviewPage( - $pmaThemeImage, $text_dir, $link_export - ) + PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, $text_dir) ); } else { // A user was selected -> display the user's properties From a14a83b4a8884580122e7885b283bc6428a45df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 16:17:02 +0200 Subject: [PATCH 130/141] Documentation and coding style improvements --- libraries/server_privileges.lib.php | 100 ++++++++++++++++++---------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index f3e6414016..2da7e71510 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1758,11 +1758,11 @@ function PMA_getHtmlForSpecificDbPrivileges() /** * Get HTML snippet for table body of specific database privileges * - * @param boolean $found whether user found or not - * @param array $row array of rows from mysql, - * db table with list of privileges - * @param boolean $odd_row whether odd or not - * @param string $res ran sql query + * @param boolean $found whether user found or not + * @param array $row array of rows from mysql, + * db table with list of privileges + * @param boolean $odd_row whether odd or not + * @param string $res ran sql query * * @return string $html_output */ @@ -1868,6 +1868,13 @@ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, /** * Returns edit link for a user. + * + * @param string $username User name + * @param string $hostname Host name + * @param string $dbname Database name + * @param string $tablename Table name + * + * @return HTML code with link */ function PMA_getUserEditLink($username, $hostname, $dbname = '', $tablename = '') { @@ -1888,6 +1895,13 @@ function PMA_getUserEditLink($username, $hostname, $dbname = '', $tablename = '' /** * Returns revoke link for a user. + * + * @param string $username User name + * @param string $hostname Host name + * @param string $dbname Database name + * @param string $tablename Table name + * + * @return HTML code with link */ function PMA_getUserRevokeLink($username, $hostname, $dbname = '', $tablename = '') { @@ -1907,7 +1921,13 @@ function PMA_getUserRevokeLink($username, $hostname, $dbname = '', $tablename = } /** - * Returns revoke link for a user. + * Returns export link for a user. + * + * @param string $username User name + * @param string $hostname Host name + * @param string $initial Initial value + * + * @return HTML code with link */ function PMA_getUserExportLink($username, $hostname, $initial = '') { @@ -1929,10 +1949,10 @@ function PMA_getUserExportLink($username, $hostname, $initial = '') /** * This function return the extra data array for the ajax behavior * - * @param string $password password - * @param string $sql_query sql query - * @param string $hostname hostname - * @param string $username username + * @param string $password password + * @param string $sql_query sql query + * @param string $hostname hostname + * @param string $username username * * @return array $extra_data */ @@ -2236,10 +2256,10 @@ function PMA_getUserSpecificRights($tables, $user_host_condition, $dbname) /** * Display user rights in table rows(Table specific or database specific privs) * - * @param array $db_rights user's database rights array - * @param string $dbname database name - * @param string $hostname host name - * @param string $username username + * @param array $db_rights user's database rights array + * @param string $dbname database name + * @param string $hostname host name + * @param string $username username * * @return array $found_rows, $html_output */ @@ -2316,9 +2336,9 @@ function PMA_getHtmlForDisplayUserRightsInRows($db_rights, $dbname, /** * Get a HTML table for display user's tabel specific or database specific rights * - * @param string $username username - * @param string $hostname host name - * @param string $dbname database name + * @param string $username username + * @param string $hostname host name + * @param string $dbname database name * * @return array $html_output, $found_rows */ @@ -2481,14 +2501,15 @@ function PMA_displayTablesInEditPrivs($dbname, $found_rows) * Get HTML for display the users overview * (if less than 50 users, display them immediately) * - * @param array $result ran sql query - * @param array $db_rights user's database rights array - * @param string $pmaThemeImage a image source link - * @param string $text_dir text directory + * @param array $result ran sql query + * @param array $db_rights user's database rights array + * @param string $pmaThemeImage a image source link + * @param string $text_dir text directory * * @return string HTML snippet */ -function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, $text_dir) { +function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, $text_dir) +{ while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { $row['privs'] = PMA_extractPrivInfo($row, true); $db_rights[$row['User']][$row['Host']] = $row; @@ -2552,7 +2573,7 @@ function PMA_getUsersOverview($result, $db_rights, $pmaThemeImage, $text_dir) { /** * Get table body for 'tableuserrights' table in userform * - * @param array $db_rights user's database rights array + * @param array $db_rights user's database rights array * * @return string HTML snippet */ @@ -2721,7 +2742,7 @@ function PMA_getFieldsetForAddDeleteUser() /** * Get HTML for Displays the initials * - * @param array $array_initials array for all initials, even non A-Z + * @param array $array_initials array for all initials, even non A-Z * * @return string HTML snippet */ @@ -3046,12 +3067,13 @@ function PMA_getHtmlHeaderForDisplayUserProperties( /** * Get HTML snippet for display user overview page * - * @param string $pmaThemeImage a image source link - * @param string $text_dir text directory + * @param string $pmaThemeImage a image source link + * @param string $text_dir text directory * * @return string $html_output */ -function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, $text_dir) { +function PMA_getHtmlForDisplayUserOverviewPage($pmaThemeImage, $text_dir) +{ $html_output = '

      ' . "\n" . PMA_Util::getIcon('b_usrlist.png') . __('Users overview') . "\n" @@ -3226,24 +3248,30 @@ function PMA_getHtmlForUserGroupsTable() $html_output .= ''; $html_output .= '' . PMA_Util::getIcon('b_usrlist.png', __('View users')) . ''; $html_output .= '  '; $html_output .= '' . PMA_Util::getIcon('b_edit.png', __('Edit')) . ''; $html_output .= '  '; $html_output .= '' . PMA_Util::getIcon('b_drop.png', __('Delete')) . ''; $html_output .= ''; From 657c3dfdc3fda96ea0789e20704065e2d8b9fd95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 7 Aug 2013 16:20:15 +0200 Subject: [PATCH 131/141] Various coding style fixes --- libraries/server_privileges.lib.php | 38 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index 2da7e71510..37a578bcd6 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1729,7 +1729,9 @@ function PMA_getHtmlForSpecificDbPrivileges() . '' . '' . "\n"; - if ($GLOBALS['is_ajax_request'] == true && empty($_REQUEST['ajax_page_request'])) { + if ($GLOBALS['is_ajax_request'] == true + && empty($_REQUEST['ajax_page_request']) + ) { $message = PMA_Message::success(__('User has been added.')); $response = PMA_Response::getInstance(); $response->addJSON('message', $message); @@ -1839,7 +1841,8 @@ function PMA_getHtmlTableBodyForSpecificDbPrivs($found, $row, $odd_row, . '' . "\n"; $html_output .= PMA_getUserEditLink( $current_user, $current_host, - ! (isset($current['Db']) || $current['Db'] == '*') ? '' : $current['Db'] + (isset($current['Db']) && $current['Db'] != '*') + ? $current['Db'] : '' ); $html_output .= '' . "\n" . ' ' . "\n"; @@ -2159,7 +2162,8 @@ function PMA_getLinkToDbAndTable($url_dbname, $dbname, $tablename) * So this function returns user rights as an array * * @param array $tables tables - * @param string $user_host_condition a where clause that containd user's host condition + * @param string $user_host_condition a where clause that containd user's host + * condition * @param string $dbname database name * * @return array $db_rights database rights @@ -2432,7 +2436,8 @@ function PMA_getHtmlForDisplaySelectDbInEditPrivs($found_rows) // already escaped in $found_rows, // contrary to the output of SHOW DATABASES if (empty($found_rows) || ! in_array($current_db, $found_rows)) { - $html_output .= '' . "\n"; } } @@ -2716,20 +2721,29 @@ function PMA_getFieldsetForAddDeleteUser() . '' . "\n"; $html_output .= '' . "\n" - . '(' . __('Revoke all active privileges from the users and delete them afterwards.') . ')' + . '(' + . __('Revoke all active privileges from the users and delete them afterwards.') + . ')' . '
      ' . "\n"; $html_output .= '' . "\n"; $html_output .= '' . "\n" . '' . "\n"; - $html_output .= '