1
0
mirror of https://github.com/vrana/adminer.git synced 2025-08-29 17:19:52 +02:00

Compare commits

...

1150 Commits

Author SHA1 Message Date
Jakub Vrana
7247f801bd Release 4.7.1 2019-01-24 15:57:17 +01:00
Jakub Vrana
21f0481a1d Remember visible columns in Create Table form (bug #493) 2019-01-22 13:24:15 +01:00
Jakub Vrana
7defb7787d Editor: Allow disabling boolean fields in PostgreSQL (bug #640) 2019-01-22 12:04:08 +01:00
Jan
659003e07f fix: haeckel adminer.css (#323)
- fix: broken menu layout on Firefox 64+
 - add: option to hide "new version" link (commented out)
 - add: author credits for changes made in 2018
2019-01-22 10:39:52 +01:00
Jakub Vrana
2cb426b464 SQLite: Hide server field in login form 2019-01-16 14:57:21 +01:00
Jakub Vrana
2117f224b6 Improve MariaDB status variables link (bug #658) 2019-01-16 12:49:24 +01:00
popcorner
7ea6266482 Update zh-tw.inc.php 2019-01-16 12:26:58 +01:00
popcorner
edb79998a9 Update zh.inc.php 2019-01-16 12:26:58 +01:00
Jakub Vrana
41043f8dad Display the tables scrollbar (bug #647) 2019-01-16 12:16:51 +01:00
Jakub Vrana
31bbadb479 Document change 2018-12-18 16:20:34 +01:00
Tim Düsterhus
a2fbcbe28e Fix PHP 7.3 compatibility (#318) 2018-12-18 16:17:21 +01:00
Edgar Barrantes
a623cd69de Position of the background database image changed. (#316) 2018-12-18 16:07:53 +01:00
alekseymvt
ed346be313 Fix mvt theme (#315) 2018-12-18 15:52:43 +01:00
Peter Knut
7eaa57fc0b Use <ul> list for logins (#314) 2018-12-18 15:45:04 +01:00
Jakub Vrana
c275362c30 Add missing Japanese translations (thanks to Shirai Takashi) 2018-12-18 14:45:46 +01:00
Peter Knut
b2606cda0e Change '...' to horizontal ellipsis character 2018-12-18 14:45:37 +01:00
helix84
da76e6b9b8 php <5.4 compat: array syntax (#313) 2018-12-18 14:21:23 +01:00
Jakub Vrana
83fe083f2f Add autocomplete attributes to login form 2018-12-12 16:13:14 +01:00
Jakub Vrana
85e6f2ac9e Release 4.7.0 2018-11-24 14:13:01 +01:00
Jakub Vrana
e148db4b0f Fix whitespace 2018-11-24 12:16:12 +01:00
Jakub Vrana
660703e422 Clarify change description 2018-11-24 12:08:02 +01:00
Lucas Sandery
55f11df052 Updated theme for v4.7 (#310)
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2018-11-24 11:09:47 +01:00
Winnie Lin
ea6370ef77 Update zh-tw.inc.php (#299)
Fix some typo and add white spaces for readability
2018-11-01 07:03:53 +01:00
Jakub Vrana
0ad6a1e578 Fix a typo 2018-10-29 11:46:04 +01:00
Jakub Vrana
e546b483a1 Delete copy/pasted code 2018-10-29 11:43:45 +01:00
Jakub Vrana
5b443a4e7d Change inline style to class name 2018-10-27 21:21:20 +02:00
kPherox
e4837a0564 Wrap table.nowrap with div[style="overflow-x: auto"] 2018-10-27 21:16:57 +02:00
Jakub Vrana
83a0776e8d Fix MariaDB link to numeric types 2018-10-27 20:13:55 +02:00
Jakub Vrana
5bebb439a1 MySQL: Descending indexes in MySQL 8 (bug #643) 2018-10-27 20:05:04 +02:00
sartor
9f0ee9cf41 PostgreSQL: Support for GENERATED BY DEFAULT AS IDENTITY 2018-10-27 19:42:01 +02:00
Jakub Vrana
c002009bfe Fix style 2018-10-27 19:38:43 +02:00
sartor
a592ad52f1 ClickHouse: support for decimal types, SQL operator 2018-10-27 19:32:52 +02:00
sartor
3127c0d95e ClickHouse: Fix for drop multiple tables and views 2018-10-27 19:32:10 +02:00
sartor
9447d97a6a ClickHouse ALTER DELETE and ALTER UPDATE support 2018-10-27 19:31:35 +02:00
sartor
c8e41ee649 ClickHouse fix select-like queries format postfix 2018-10-27 19:30:33 +02:00
Jakub Vrana
b327a76fc0 Avoid overwriting existing tables when copying tables (bug #642) 2018-10-27 18:50:50 +02:00
Jakub Vrana
7f2dd73670 PostgreSQL: Export DESC indexes (bug #639) 2018-10-27 18:14:00 +02:00
Jakub Vrana
c8975a151c Recognize current_timestamp() in edit (bug #638) 2018-10-27 18:06:20 +02:00
ilessiivi
150841e5d7 Hide import from server if no path 2018-10-01 18:07:51 +02:00
Jakub Vrana
ae03bdd4c4 Simplify storing executed SQL queries to bookmarks 2018-10-01 17:08:58 +02:00
alekseymvt
01e08cc053 fix editor theme (#302) 2018-09-19 16:42:22 +02:00
Jakub Vrana
a426fefd40 Remove unused code 2018-09-19 11:16:21 +02:00
Jakub Vrana
90df1b14f0 MySQL: Recognize ON UPDATE current_timestamp() (bug #632) 2018-09-19 10:08:41 +02:00
Jakub Vrana
cd3231b4af PostgreSQL: Quote array values in export (bug #621) 2018-09-19 09:49:56 +02:00
Christopher CHEN
65c52735fb Add plugin pretty-json-column
(cherry picked from commit 9b8612a49c43ff170837dbf84f8c08a0e85386a8)
2018-09-18 18:59:24 +02:00
Jakub Vrana
93ccc7502b Update translation 2018-09-18 15:47:22 +02:00
Christopher CHEN
84e86cf572 DOM not ready when restoring adminer_tables_filter (#289)
Uncaught TypeError: Cannot set property 'value' of null
2018-09-18 15:38:13 +02:00
Jakub Vrana
1ce5b5ad31 Add Georgian translation 2018-09-18 15:34:09 +02:00
Aleksey M
941bf22e52 Update mvt design 2018-09-18 13:40:58 +02:00
Jakub Vrana
a5c54563c6 Fix design (thanks to apmuthu) 2018-09-18 13:32:26 +02:00
Jakub Vrana
0234fe4a66 ClickHouse: Fix escaping 2018-09-18 13:13:34 +02:00
Sartor
1883e250ff ClickHouse support alpha version 2018-09-18 13:09:46 +02:00
Huy Cat, Hoang
56d8b89bee Fix typo in Vietnamese translation 2018-09-18 12:20:21 +02:00
Peter Knut
4d66e42817 Add class 'layout' to all non-data tables 2018-09-18 12:08:19 +02:00
harryxu
94f6a45a2a Set default db to sqlsrv connection 2018-09-18 11:44:02 +02:00
Jakub Vrana
0f08592bc0 Warn when using password with leading or trailing spaces 2018-09-13 16:08:57 +02:00
Jakub Vrana
a5cbad504c Update donation link 2018-09-06 17:22:56 +02:00
Jakub Vrana
d581f3dedb Make maxlength in all fields a soft limit 2018-07-15 21:05:26 +02:00
Jakub Vrana
e8e4934e97 Increase username maxlength to 80 (bug #623) 2018-07-15 21:01:38 +02:00
Jared Brandt
e959e46fa5 Fixes foreign key pattern in MySQL
Foreign keys are not displaying in MySQL when ANSI_QUOTES is enabled because the preg_match_all() is looking specifically for backticks. This fix allows for double quotes as well, so foreign keys are recognized even when ANSI_QUOTES is enabled.
2018-07-15 20:51:09 +02:00
Jakub Vrana
bb3d2957e1 Fix function change with set data type (thanks to osoba hrdelnata) 2018-07-15 20:37:47 +02:00
Aleksey M
ea408aa530 Adminer theme 2018-07-15 20:12:07 +02:00
Jakub Vrana
df90d9f68c Reset event handlers after cloning (thanks to Salko) 2018-07-15 20:10:13 +02:00
Jakub Vrana
cf76ad529b Fix inline editing of empty cells 2018-07-09 16:52:10 +02:00
Jakub Vrana
3d84dcf859 Release 4.6.3 2018-06-28 21:58:29 +02:00
Jakub Vrana
4b9d88545e Fix typo 2018-06-28 20:35:19 +02:00
Jakub Vrana
26a39ac243 Revert "PgSQL search operator "SQL" added"
This reverts commit af7ac6f06a.
2018-06-27 22:23:56 +02:00
Jakub Vrana
3676b7fb71 Add TODO 2018-06-27 08:55:19 +02:00
Jakub Vrana
c564a8ef50 MySQL: Disallow LOAD DATA LOCAL INFILE 2018-06-26 08:53:12 +02:00
Jakub Vrana
2780eb01f5 PostgreSQL: Export false as 0 in PDO (bug #619) 2018-06-09 12:45:17 +02:00
Gintautas Miselis
b98d0bcc55 mssql: ignore serverproperty error
This change allows connection to Sybase ASE 15
2018-06-09 12:25:24 +02:00
Jakub Vrana
e856e28892 Add spaces 2018-06-09 12:24:18 +02:00
Petr Sedlacek
8f269d66b0 Fix table list in sidebar in designs/pokorny (#278) 2018-06-09 12:23:15 +02:00
Peter Knut
3de94b67ca Allow AdminerTablesFilter plugin to be used with third-party table list plugins (#275) 2018-05-13 09:49:09 +02:00
Jakub Vrana
a9a7488454 Recommend inlining the hash 2018-05-07 12:23:13 +02:00
Jakub Vrana
36f13031f7 Improve error message 2018-05-07 12:22:52 +02:00
Jakub Vrana
6f25b1b5cf Escape \ in enum edit 2018-05-06 19:21:58 +02:00
Jakub Vrana
659c34f7c5 Improve enum parsing 2018-05-06 19:21:58 +02:00
Jakub Vrana
11f24a52e4 Order database names in MySQL 8(bug #613) 2018-05-06 18:11:03 +02:00
Franklin Tse
3c3d861f41 Respect 'session.cookie_secure' if it is On 2018-05-06 17:49:39 +02:00
Jakub Vrana
7b60b03e6a Copy triggers when copying table 2018-05-06 17:36:52 +02:00
Jakub Vrana
84c65fcca6 MS SQL: Support port with sqlsrc 2018-05-06 11:46:36 +02:00
Jakub Vrana
733fe9e430 PostgreSQL: Do not cast uuid searches to text (bug #608) 2018-05-06 11:41:59 +02:00
Jakub Vrana
5c3fb875e1 Editor: Do not check boolean checkboxes with false in PostgreSQL (bug #607) 2018-05-06 11:26:43 +02:00
Jakub Vrana
60d1b7b3b4 Disallow using password-less databases 2018-05-04 16:52:41 +02:00
Jakub Vrana
db11fa4c1a MongoDB: Consolidate code 2018-05-04 16:39:21 +02:00
Jakub Vrana
c3cfc0e69b MongoDB: Consolidate code 2018-05-04 16:38:24 +02:00
Jakub Vrana
5f4d407f2e MongoDB: Consolidate code 2018-05-04 16:37:36 +02:00
Jakub Vrana
70afe70b72 MongoDB: Report version 2018-05-04 15:37:29 +02:00
Jakub Vrana
75f43a4454 Document that Elasticsearch requires allow_url_fopen 2018-05-04 15:26:57 +02:00
Matěj Humpál
78f4513d9d PostgreSQL: Do not cast boolean to text on search (#264) 2018-03-18 14:34:54 +01:00
Jakub Vrana
89c66ccabe PostgreSQL: Do not cast number searches to text 2018-03-13 14:09:53 +01:00
Jakub Vrana
6ba77b7899 PostgreSQL: Fix editing data in views (bug #605) 2018-03-11 16:41:04 +01:00
Jakub Vrana
d271d0b481 Elasticsearch: Fix PHP warning 2018-03-11 16:07:54 +01:00
Sartor
af7ac6f06a PgSQL search operator "SQL" added 2018-03-11 15:48:42 +01:00
Jakub Vrana
19034c35fe PostgreSQL: Fix slow query 2018-03-10 17:16:07 +01:00
Jakub Vrana
88438cd607 Update JUSH 2018-03-10 17:15:55 +01:00
Jakub Vrana
34c792bb59 Display that *.gz files are supported in file upload 2018-03-09 18:21:44 +01:00
Jakub Vrana
6ed94f1f6d Save bytes 2018-03-09 18:19:14 +01:00
Jakub Vrana
8c4726bb61 Stay on import page when switching database 2018-03-09 18:19:14 +01:00
Jakub Vrana
8ab2c7e03b Decrease timeout for running slow queries from 5 seconds to 2 seconds 2018-03-09 18:19:14 +01:00
Jakub Vrana
665fafb297 Simplify running slow queries 2018-03-09 18:19:14 +01:00
Jakub Vrana
67c2a91c67 Remove unused argument 2018-03-09 18:19:14 +01:00
Jakub Vrana
78b8707bd0 Update JUSH 2018-03-09 18:19:14 +01:00
Jakub Vrana
7c15940be8 Use JUSH from GitHub 2018-03-02 09:38:58 +01:00
Jakub Vrana
8c5603a822 Clarify changelog 2018-03-01 13:08:58 +01:00
Jakub Vrana
4e7c31a589 Display missing database in navigation 2018-03-01 12:09:10 +01:00
David Sinquin
cf9cad66e2 MongoDB driver: Add create_database methods.
MongoDB databases are created on the fly when some data is written in
the database, so this method does not need to do anything.
2018-03-01 11:48:02 +01:00
Jakub Vrana
26a3967cf9 Fix comment 2018-03-01 11:46:23 +01:00
Pero Brbora
6c63c2f91e Add $driver to global variables 2018-03-01 11:46:12 +01:00
Pero Brbora
acee5c0011 Add $driver to global variables 2018-03-01 11:30:13 +01:00
Jakub Vrana
36b75b4203 Use $adminer->operators 2018-03-01 11:29:04 +01:00
Jakub Vrana
4a24ee7672 PostgreSQL: Do not cast time search 2018-03-01 11:23:01 +01:00
Matěj Humpál
e21ddd9767 Do not cast date/timestamp exact searches in PostgreSQL to text 2018-03-01 11:21:50 +01:00
Matěj Humpál
f844fc499e Do not cast date/timestamp exact searches in PostgreSQL to text 2018-03-01 11:06:12 +01:00
Jakub Vrana
52d7c38ef1 MySQL: Use CONVERT() only when searching for non-ASCII (bug #603) 2018-03-01 11:01:35 +01:00
Jakub Vrana
53dd78f5af Remove optional submodule 2018-03-01 09:54:20 +01:00
Róbert Mesároš
ea1dad584b Update adminer-design (rmsoft) to version 4.6.2.1 2018-02-23 08:12:11 +01:00
Jakub Vrana
910bb39424 Wrap lines 2018-02-23 08:09:21 +01:00
Jakub Vrana
14db884471 Fix displaying info about non-alphabetical objects (bug #599) 2018-02-22 16:47:30 +01:00
Jakub Vrana
3410836c12 Allow connecting to different drivers in login-servers 2018-02-22 12:38:22 +01:00
Jakub Vrana
cd503f6a0d Wrap long line 2018-02-22 11:39:09 +01:00
Jakub Vrana
00721402e0 Add login-otp plugin 2018-02-22 11:36:11 +01:00
Jakub Vrana
4355aaa96f Update translation 2018-02-21 21:36:55 +01:00
Jakub Vrana
b1cdc7902b Comment 2018-02-21 00:28:59 +01:00
Jakub Vrana
3f4f3454f8 Centralize stopping session 2018-02-20 23:14:36 +01:00
Jakub Vrana
846435aef8 Stop session before connecting (thanks to Kareem Zidane) 2018-02-20 23:11:05 +01:00
Jakub Vrana
d7982e0b29 Update design (thanks to Jan) 2018-02-20 22:44:10 +01:00
Jakub Vrana
7b35ebd82e PDO: Support binary fields download 2018-02-20 22:40:20 +01:00
Jakub Vrana
5b359263eb Don't try to check missing checkboxes 2018-02-20 22:09:47 +01:00
Jakub Vrana
6ebbd8c719 Use file caching only in non-dev 2018-02-20 22:08:52 +01:00
Jakub Vrana
8bb51bec36 Editor: Delete images from compiled version 2018-02-20 16:53:53 +01:00
Jakub Vrana
fc5ddddf92 Remove driver from file URLs (stored in path) 2018-02-20 16:40:14 +01:00
Jakub Vrana
d3a429314a Fix image in compiled version 2018-02-20 16:35:34 +01:00
Jakub Vrana
b4392b3f91 Use single \ in ' strings 2018-02-20 16:27:40 +01:00
Jakub Vrana
2021ea8fd7 &nbsp; is not needed with border-collapse 2018-02-20 16:02:25 +01:00
Jakub Vrana
7cb3e768bb Release 4.6.2 2018-02-20 09:20:42 +01:00
Jakub Vrana
baf7225602 Fix test 2018-02-20 09:17:13 +01:00
Jakub Vrana
0cfc68e6c6 Fix typo 2018-02-20 00:00:47 +01:00
Jakub Vrana
03dfea2943 Comment 2018-02-20 00:00:00 +01:00
Jakub Vrana
54f6806339 Use function after declaring it 2018-02-19 23:48:51 +01:00
Jakub Vrana
ee4f7db641 Remove test server 2018-02-19 23:38:32 +01:00
Jakub Vrana
b53762ae5f Make test works with MariaDB 2018-02-19 23:37:19 +01:00
Jakub Vrana
866d109a9b Make test work on wide screen 2018-02-19 23:25:43 +01:00
Jakub Vrana
37c57c386a Editor: Fix displaying of true boolean values 2018-02-19 23:09:46 +01:00
Jakub Vrana
1f5ca321b6 Comment 2018-02-19 23:04:27 +01:00
Jakub Vrana
059d6266e2 Store current version before authentication and in Editor 2018-02-19 23:02:39 +01:00
Jakub Vrana
0e1d8c67fc Update design (thanks to Jan) 2018-02-19 14:07:11 +01:00
Jakub Vrana
a113a25123 Add missing fullstop 2018-02-15 22:25:45 +01:00
Róbert Mesároš
49a865d106 Version 4.6.1.1 (#254)
Update to Version 4.6.1.1
2018-02-15 22:25:16 +01:00
Nuri Akman
026b362e7d Turkish language file updated. 2018-02-15 22:20:58 +01:00
Jakub Vrana
7c32360c67 Align Whole result 2018-02-14 06:46:59 +01:00
Jakub Vrana
8a94bc6f41 Always hide import 2018-02-14 06:42:07 +01:00
Jakub Vrana
3f901cfe30 Print email only with rows or page 2018-02-14 06:41:44 +01:00
Jakub Vrana
c8fd73d70a Move import out of footer 2018-02-13 22:24:59 +01:00
Jakub Vrana
30d0060b96 Move pagination to fieldset 2018-02-13 22:17:59 +01:00
Jakub Vrana
8b157a673e Update readme 2018-02-10 01:58:14 +01:00
Jakub Vrana
ce381aaf48 Make Login test work with jush-textarea 2018-02-10 01:56:48 +01:00
Jakub Vrana
d3eac979d4 Add SQLite test 2018-02-10 01:51:03 +01:00
Jakub Vrana
f19e23c98b Test warnings 2018-02-10 01:47:29 +01:00
Jakub Vrana
705d3a910f Convert tests to Katalon 2018-02-10 01:24:14 +01:00
Jakub Vrana
d18c7b3587 Promote MongoDB, demote Oracle and MS SQL 2018-02-10 00:09:07 +01:00
Jakub Vrana
1f12ea4e4a Capitalize Whole result 2018-02-09 23:45:53 +01:00
Jakub Vrana
71a6a1269d Fill footer to the right 2018-02-09 23:36:53 +01:00
Jakub Vrana
6a3bce1174 Make footer smaller 2018-02-09 23:33:46 +01:00
Jakub Vrana
28acee861f Move pagination outside footer 2018-02-09 23:28:19 +01:00
Jakub Vrana
42b15654c4 Wrap more into if (!is_ajax) 2018-02-09 23:09:05 +01:00
Jakub Vrana
e2d858d638 Move <p> 2018-02-09 23:05:21 +01:00
Jakub Vrana
879963dec1 PostgreSQL: Add IF EXISTS to DROP SEQUENCE in export (bug #595) 2018-02-09 22:11:27 +01:00
Jakub Vrana
daa19b0a6e Make footer border more obvious 2018-02-09 22:05:11 +01:00
Jakub Vrana
d27ee7a388 Make footer margin not transparent 2018-02-09 21:55:18 +01:00
Jakub Vrana
1ec4637ade Centralize oninput 2018-02-09 21:23:42 +01:00
Jakub Vrana
ea1ff7e902 Speed up alter table
Alter table mysql.user takes 0.9 instead of 1.5 seconds.
2018-02-09 21:11:12 +01:00
Jakub Vrana
2761f44cf4 Use Unicode arrows in alt 2018-02-09 17:54:52 +01:00
Jakub Vrana
557b8b178e Avoid hiding column only to show it later 2018-02-09 17:50:25 +01:00
Jakub Vrana
07d1bc4291 Respect unchecked Default values 2018-02-09 17:45:50 +01:00
Jakub Vrana
7ac96dd0b2 Update UI when coming from history 2018-02-09 17:35:17 +01:00
Jakub Vrana
eeb7ce1939 PostgreSQL: Fix exporting string default values (thanks to PotatoPangolin) 2018-02-09 15:29:54 +01:00
Jakub Vrana
ea4ac5c8f3 Semi-transparent border on table actions 2018-02-09 15:14:10 +01:00
Jakub Vrana
3906231dc5 Fix exporting sequences in PostgreSQL 10 2018-02-09 14:43:25 +01:00
Jakub Vrana
fad20d1065 Do not append empty values 2018-02-09 13:48:50 +01:00
Jakub Vrana
ffb4ee3a61 Shorten JSON values in select (bug #594) 2018-02-09 13:48:33 +01:00
Jakub Vrana
34d338b185 Fix id in databases list 2018-02-09 13:34:46 +01:00
Jakub Vrana
1b148bc08c Suggest updating Git submodules 2018-02-09 11:09:49 +01:00
Jakub Vrana
f4983dfd5f Declare MariaDB support 2018-02-09 09:24:12 +01:00
Jakub Vrana
800fbb9b9e Release 4.6.1 2018-02-09 00:20:58 +01:00
Jakub Vrana
4b1960f498 Round 9.2 to 9.2 2018-02-08 23:58:09 +01:00
Jakub Vrana
e299e9d82d MariaDB: Links to documentation in syntax highlighting 2018-02-08 23:47:16 +01:00
Jakub Vrana
cf7fe88990 Display notification about performing action after relogin 2018-02-08 16:49:56 +01:00
Jakub Vrana
60e5d24116 Reorder changes 2018-02-08 14:34:43 +01:00
Jakub Vrana
a1927d5b71 Allow specifying server name displayed in breadcrumbs 2018-02-08 14:32:21 +01:00
Jakub Vrana
76d7560d27 MariaDB: Links to documentation 2018-02-08 13:56:22 +01:00
Jakub Vrana
f0b7d8ccd0 Reorder changes 2018-02-08 12:10:37 +01:00
Jakub Vrana
d322e0165b Remove .lcZ from timeFormat (bug #593) 2018-02-08 11:52:11 +01:00
Jakub Vrana
4009ede3ee Add todo 2018-02-08 11:26:21 +01:00
Jakub Vrana
cddd61c214 Add more system tables help links 2018-02-08 11:21:33 +01:00
Jakub Vrana
8b8cfd9f04 Respect empty tableName in tablesPrint 2018-02-08 10:35:54 +01:00
Jakub Vrana
99d7b88341 Use tableName() in table.inc.php 2018-02-08 10:34:43 +01:00
Jakub Vrana
2db1c74310 Avoid qsl in a loop 2018-02-08 09:52:23 +01:00
Jakub Vrana
fb2d34f739 Support Shift+click in server export 2018-02-08 09:47:15 +01:00
Jakub Vrana
6e2f681faa Avoid qsl in a loop 2018-02-08 09:30:16 +01:00
Jakub Vrana
686865bc10 Sticky position of table actions 2018-02-08 00:14:32 +01:00
Jakub Vrana
996ebf61d7 Document regression 2018-02-07 21:08:24 +01:00
Jakub Vrana
6a7ee5a2f3 Avoid qsl in check[]
Table with 1000 rows rendered in 1.8 instead of 7.5 seconds.
2018-02-07 18:55:28 +01:00
Jakub Vrana
4b45722fad Avoid qsl in a loop
Table with 500 rows rendered in 1.5 instead of 5.5 seconds.
2018-02-07 18:55:16 +01:00
Jakub Vrana
14998e12b6 Mark optional parameter 2018-02-07 18:14:00 +01:00
Jakub Vrana
718f9d3791 SQLite: Support ` in PRIMARY KEY 2018-02-07 16:43:21 +01:00
Jakub Vrana
964a988fef Avoid Invalid credentials with no credentials 2018-02-07 16:29:57 +01:00
Jakub Vrana
66e7ec56bb SQLite: Allow deleting PRIMARY KEY from tables with auto increment 2018-02-07 14:47:29 +01:00
Jakub Vrana
ca336427f5 Do not wrap alter table thead 2018-02-07 14:22:58 +01:00
Jakub Vrana
8a75cbc630 Add version() to use in plugins 2018-02-07 12:49:53 +01:00
Jakub Vrana
c8bb112a5d Select original if nothing else is selected 2018-02-07 12:46:43 +01:00
Jakub Vrana
06660882b5 Remove nested array 2018-02-07 12:42:46 +01:00
Jakub Vrana
42eec7d728 Support connecting to MySQL via SSL 2018-02-07 12:13:58 +01:00
Jakub Vrana
cac523402a Display Invalid credentials if connection error is empty 2018-02-07 11:37:53 +01:00
Jakub Vrana
02cd416093 Delete unused functions 2018-02-06 16:33:47 +01:00
Jakub Vrana
33f0023d37 Ignore functions in Min_Driver 2018-02-06 16:32:56 +01:00
Jakub Vrana
f09d26a51d Remove unnecessary quotes 2018-02-06 16:25:58 +01:00
Jakub Vrana
b500a46f9a Add truncate_sql to PostgreSQL 2018-02-06 16:24:12 +01:00
Jakub Vrana
19653de764 PostgreSQL: Unescape bytea fields 2018-02-06 16:05:50 +01:00
Jakub Vrana
29c127e94a Save bytes 2018-02-06 15:54:19 +01:00
Jakub Vrana
4417a8b220 Add missing function to compile.php 2018-02-06 15:52:48 +01:00
Jakub Vrana
17b110f0d5 PostgreSQL: Upload binary files to bytea fields 2018-02-06 15:42:14 +01:00
Jakub Vrana
b649fb2f3f Allow using number_type() as pattern 2018-02-06 14:52:12 +01:00
Jakub Vrana
d3914ea58e Translate thousands separator in JS 2018-02-06 14:47:43 +01:00
Jakub Vrana
31d8803db2 Editor: Use type=search for Search tables 2018-02-06 14:13:51 +01:00
Jakub Vrana
d43b773214 Move tableCheck() below </form> 2018-02-06 13:53:15 +01:00
Jakub Vrana
f09a04ed09 Pass operator from db.inc.php 2018-02-06 13:51:56 +01:00
Jakub Vrana
d7f9b6b5de PostgreSQL: Cast to string when searching using LIKE (bug #325) 2018-02-06 13:51:53 +01:00
Jakub Vrana
197abdcb70 MySQL: Support non-utf8 charset in search in column 2018-02-06 13:51:23 +01:00
Jakub Vrana
c2de3b8ec1 Use ST_GeomFromText in MySQL 8 (bug #574) 2018-02-06 13:50:40 +01:00
Jakub Vrana
c52fb951b0 Do not modify $_GET["where"] 2018-02-06 13:00:17 +01:00
Jakub Vrana
14429ff355 Display empty operator as LIKE %% 2018-02-06 12:56:18 +01:00
Jakub Vrana
a7632fd9fd Fix whitespace 2018-02-06 12:50:44 +01:00
Jakub Vrana
967d5c64a3 Avoid deprecated each() 2018-02-06 12:49:39 +01:00
Jakub Vrana
c34ada5368 PostgreSQL: Fix condition for selecting no rows 2018-02-06 12:43:10 +01:00
Jakub Vrana
2d7bda4d1e Fix error display in Search tables 2018-02-06 12:40:28 +01:00
Jakub Vrana
6cfb3676a7 PostgreSQL: Don't treat interval type as number (bug #474) 2018-02-06 12:17:01 +01:00
Jakub Vrana
11a7fc0277 Pass required parameter 2018-02-06 12:00:22 +01:00
Jakub Vrana
de539cf0c7 Use existing variable 2018-02-06 11:57:02 +01:00
Jakub Vrana
880902da17 Add class to use in designs 2018-02-06 08:47:28 +01:00
Jakub Vrana
89ceb06208 Use primary key instead of LIMIT 1 if available 2018-02-05 11:21:19 +01:00
Jakub Vrana
d2ed0f7810 Release 4.6.0 2018-02-05 09:30:33 +01:00
Jakub Vrana
7b0c58af32 Fix affected rows after getting warnings 2018-02-05 09:23:07 +01:00
Jakub Vrana
d3cdfc17de Fix number of affected rows after getting warnings 2018-02-05 09:09:41 +01:00
Jakub Vrana
f097817386 Fix test 2018-02-05 08:43:31 +01:00
Jakub Vrana
3b55c4c0f7 Fix 5.1 being displayed as 5.09999... 2018-02-05 08:42:25 +01:00
Jakub Vrana
6636434378 PRIMARY KEY in SQLite 2018-02-05 08:32:51 +01:00
Jakub Vrana
dd3e57086b Add design Esterka 2018-02-02 09:18:38 +01:00
Jakub Vrana
473b60361b Disable autocompleting password on create user page 2018-02-02 08:52:15 +01:00
Jakub Vrana
f128c2d1ea Use primary key to edit rows even if not selected 2018-02-01 23:09:40 +01:00
Jakub Vrana
c75096f173 Space between DB and Use 2018-02-01 22:22:29 +01:00
Jakub Vrana
c0b2c506bc Translate DB 2018-02-01 22:20:56 +01:00
Jakub Vrana
0ebf710d41 Select converted fields only once 2018-02-01 22:03:48 +01:00
Jakub Vrana
fa41126c37 Don't count rows if we reached the end 2018-02-01 20:59:05 +01:00
Jakub Vrana
09920e0056 Fix count_rows with more than one group by column 2018-02-01 20:45:49 +01:00
Jakub Vrana
685bf29abc Use separator in limit1 2018-02-01 18:53:53 +01:00
Jakub Vrana
0866c79afb SQLite: Limit rows in data manipulation without unique key 2018-02-01 18:47:57 +01:00
Jakub Vrana
e8e3ced948 Document that tests don't work with oninput 2018-02-01 17:04:50 +01:00
Jakub Vrana
52d98e16fa PostgreSQL: Limit rows in data manipulation without unique key 2018-02-01 16:58:01 +01:00
Jakub Vrana
763e66a148 Don't use ctid as it's not stable 2018-02-01 16:45:31 +01:00
Jakub Vrana
8868b48e4c Move variables close to their usage 2018-02-01 16:40:58 +01:00
Jakub Vrana
4961588f7d Limit non-unique where updates 2018-02-01 16:25:30 +01:00
Jakub Vrana
f4625da53d Use Oid as the name of the column 2018-02-01 16:15:36 +01:00
Jakub Vrana
dc94b2ec38 Save bytes 2018-02-01 16:00:40 +01:00
Jakub Vrana
f8af8c9cbf Update rmsoft design 2018-02-01 15:38:15 +01:00
Jakub Vrana
e55f0d7cb2 MySQL: Add FIND_IN_SET search operator 2018-02-01 15:25:38 +01:00
Jakub Vrana
5b7f2d9086 Add rmsoft design 2018-02-01 14:54:18 +01:00
Jakub Vrana
6d55395d9e MySQL: Add floor and ceil functions 2018-02-01 14:32:01 +01:00
Jakub Vrana
2e6190fdf1 Fix links to PostgreSQL 10 documentation 2018-02-01 14:02:25 +01:00
Jakub Vrana
b9ad864b75 Delete unused variable 2018-02-01 13:57:46 +01:00
Jakub Vrana
7296f017fb Display options for timestamp columns when creating a new table (thanks to Robert Vlach) 2018-02-01 13:55:11 +01:00
Jakub Vrana
ae91088cb3 Don't display warnings for failed queries 2018-02-01 13:16:37 +01:00
Jakub Vrana
51a574926d Fix variable name 2018-02-01 13:08:28 +01:00
Jakub Vrana
532a4ee083 Reorder variables 2018-02-01 12:27:22 +01:00
Jakub Vrana
6b9c0dee14 Use pg_last_notice only with pgsql 2018-02-01 12:03:11 +01:00
Jakub Vrana
be75939344 Print warnings in call 2018-02-01 11:58:04 +01:00
Jakub Vrana
d667f585e0 Pass start time to selectQuery 2018-02-01 11:54:56 +01:00
Jakub Vrana
ebb23a7a88 PostgreSQL: Display warnings 2018-02-01 11:50:15 +01:00
Jakub Vrana
e9add6d985 Return string from warnings() 2018-02-01 11:43:44 +01:00
Jakub Vrana
e3346fb0bc Display warnings in messages 2018-02-01 09:21:50 +01:00
Jakub Vrana
ae2ea56681 Show select warnings 2018-02-01 08:59:46 +01:00
Colin Mollenhour
080fd0f374 Support X-Forwarded-Prefix (e.g. Traefik PathPrefixStrip feature) 2018-01-31 20:38:14 +01:00
Jakub Vrana
e32f90f8ff Lowercase EXPLAIN but don't translate it 2018-01-31 20:25:41 +01:00
Jakub Vrana
7ad09d2cb4 Move explain below warnings 2018-01-31 20:25:11 +01:00
Jakub Vrana
40038d4210 Fix return type 2018-01-31 18:29:01 +01:00
Jakub Vrana
2adc174541 MySQL: Display warnings in SQL command 2018-01-31 17:28:12 +01:00
Jakub Vrana
2fb2d208c0 Quote default values not starting with a letter 2018-01-31 16:46:50 +01:00
Jakub Vrana
4de6e3180d Stop redirecting links via adminer.org 2018-01-31 11:11:34 +01:00
Jakub Vrana
8829ccdf93 Fix min_version use 2018-01-30 23:53:04 +01:00
Jakub Vrana
0320bcdda6 Quote dates in default value 2018-01-30 17:00:34 +01:00
Jakub Vrana
851700516d Fully support functions in default values 2018-01-30 16:50:37 +01:00
Jakub Vrana
d542843fdd Fix min_version use 2018-01-30 16:42:13 +01:00
Jakub Vrana
4bb2f806b1 PostgreSQL: Allow now() as default value (bug #525) 2018-01-30 16:24:31 +01:00
Jakub Vrana
cc31a69b65 Fix edit_type after 1f21cd43 2018-01-30 16:21:04 +01:00
Jakub Vrana
78f0a1152e PostgreSQL: Allow editing views with uppercase letters (bug #467) 2018-01-30 16:03:13 +01:00
Jakub Vrana
1f21cd4329 PostgreSQL: Allow creating trigger functions 2018-01-30 15:55:50 +01:00
Jakub Vrana
9f69160797 Add placeholders 2018-01-30 15:24:01 +01:00
Jakub Vrana
e81334ef87 PostgreSQL: Support functions 2018-01-30 15:18:26 +01:00
Jakub Vrana
6c3e1e2768 Add min_version to compile.php 2018-01-30 14:47:22 +01:00
Jakub Vrana
92739f48ce SimpleDB: Document that allow_url_fopen is required (bug #340) 2018-01-30 13:19:21 +01:00
Jakub Vrana
d28d01e76c Focus correct field in selectSearch 2018-01-29 21:19:11 +01:00
Jakub Vrana
75450548b3 Support JSON since MariaDB 10.2 (bug #590) 2018-01-29 21:08:38 +01:00
Jakub Vrana
c3b4208853 Use min_version 2018-01-29 20:54:24 +01:00
Jakub Vrana
d38c673e2a Add min_version 2018-01-29 19:34:26 +01:00
Jakub Vrana
93686eab65 Save bytes 2018-01-29 18:33:26 +01:00
Pisyek
224ddb5a33 add malay translation 2018-01-29 18:25:58 +01:00
Radosław Kowalewski
4db23fd471 Added and translated missing keys in polish translation 2018-01-29 18:13:50 +01:00
Steven Adger
a003866a55 Update compatibility with TinyMCE v4 (#247) 2018-01-29 18:09:35 +01:00
Jakub Vrana
0d90f1f1dd Fix elastic after ef5a7639 2018-01-27 11:08:56 +01:00
helix84
ef5a76392d fix elastic.inc.php to work on PHP 5.2
Without this change, I get the following syntax error on PHP 5.2.6:
PHP Parse error:  syntax error, unexpected ':' in /var/www/adminer/adminer/drivers/elastic.inc.php on line 415

I haven't actually tested the alter_table() method.
2018-01-26 16:48:34 +01:00
Jakub Vrana
8d0cbb6eb4 Fix counting selected rows after going back to select page 2018-01-26 08:52:12 +01:00
Jakub Vrana
536999d4dc Release 4.5.0 2018-01-24 21:55:47 +01:00
Jakub Vrana
827a2b8a54 Fix tests after 95d02bb9 2018-01-24 20:52:44 +01:00
Jakub Vrana
a954f7d4b4 Simplify drop object confirmation questions 2018-01-24 18:36:19 +01:00
Jakub Vrana
a137f248f7 Translate message added in 4.4.0 2018-01-24 18:22:20 +01:00
Jakub Vrana
95d02bb924 Display name of the object in confirmation when dropping it 2018-01-24 18:13:05 +01:00
Jakub Vrana
921e57b9aa Display error when getting row to edit 2018-01-24 17:37:35 +01:00
Jakub Vrana
25f9655a38 Avoid CONVERT() except in MySQL (bug #509) 2018-01-24 17:37:14 +01:00
Jakub Vrana
919204dd38 Bump version 2018-01-24 16:51:53 +01:00
Jakub Vrana
34f25afe90 MySQL: Support routines with comments in parameters (bug #460) 2018-01-24 16:37:38 +01:00
Jakub Vrana
8b29ae910f Verify if adminer.version was created on www.adminer.org 2018-01-24 15:10:44 +01:00
Jakub Vrana
6c96b060e7 Store current Adminer version server-side to avoid excessive requests 2018-01-24 15:09:11 +01:00
Jakub Vrana
f4662d5e27 Send token as last param 2018-01-24 13:44:31 +01:00
Jakub Vrana
b15618fcfd Allow using adminer.invalid by other users in a group 2018-01-24 12:11:26 +01:00
Jakub Vrana
03e3f517a8 Extract file_open_lock and file_write_unlock 2018-01-24 12:04:53 +01:00
Jakub Vrana
f0d2af329a Display boolean values as code (bug #562) 2018-01-24 10:53:25 +01:00
Jakub Vrana
452b9ad7f1 MariaDB: Support fulltext and spatial indexes in InnoDB (bug #583) 2018-01-24 09:18:19 +01:00
Jakub Vrana
fb18e814de PostgreSQL: Display foreign tables (bug #576) 2018-01-23 15:03:53 +01:00
Jakub Vrana
75413c56d2 Add designs.php 2018-01-23 14:36:32 +01:00
Jakub Vrana
c3d83d5412 Fix compiled version after 5cc831c1 2018-01-23 14:10:21 +01:00
Jakub Vrana
b14aa75a98 Hide window.opener from pages opened in a new window (bug #561) 2018-01-23 12:53:22 +01:00
Jakub Vrana
dbc76a2b1e Fix GPL version 2018-01-23 12:21:42 +01:00
Jakub Vrana
6d774794c8 Add plugin for switching designs 2018-01-23 12:15:38 +01:00
Jakub Vrana
81be5edb97 Display bold parts of error (bug #565) 2018-01-23 11:16:28 +01:00
Jakub Vrana
e30e5dd059 Add bottom border to last cells 2018-01-23 11:11:41 +01:00
Jakub Vrana
0cdd8beab1 Editor: Fix displaying of false values in PostgreSQL (bug #568) 2018-01-23 11:02:15 +01:00
Jakub Vrana
7b9d5a29aa Decrease float precision (bug #578) 2018-01-23 10:52:57 +01:00
Andrea Giacobino
5cc831c1e1 Add ability to override file name (path) when loading dump from webserver 2018-01-23 09:24:57 +01:00
Jakub Vrana
72aa3c5127 Support current_timestamp() as default of time fields (bug #572) 2018-01-23 08:36:11 +01:00
Jakub Vrana
43ccfcef8f Display newlines in column comments (bug #573) 2018-01-22 21:05:56 +01:00
Jakub Vrana
c789c147b7 MySQL: Support geometry in MySQL 8 (bug #574) 2018-01-22 20:56:35 +01:00
Uherkovich Péter
a2adb67d2f MSSQL driver fixed for freetds drivers. See bug #167, #291 2018-01-22 18:35:08 +01:00
Jakub Vrana
34e2f47761 Fix search focus (regression from 4.4.0) 2018-01-22 18:34:16 +01:00
Jakub Vrana
0d2b232bd7 Compatibility with PHP < 5.3 2018-01-22 17:30:12 +01:00
Jakub Vrana
83e16e059f Add mongodb as a possible driver 2018-01-22 17:12:48 +01:00
Jakub Vrana
6e4dc3911f Save bytes 2018-01-22 17:05:49 +01:00
Vladimir Goncharov
2a08a11e89 php7 support with minimal changes of original code 2018-01-22 16:59:55 +01:00
Jakub Vrana
993dce398d PostgreSQL: Export DROP SEQUENCE if dropping table 2018-01-22 14:33:21 +01:00
Jakub Vrana
eee9a62c8f PostgreSQL: Do not export triggers if not requested 2018-01-22 14:25:27 +01:00
Jakub Vrana
ce17b6cf46 Ignore removed CREATE+ALTER mode in trigger_sql() 2018-01-22 14:14:42 +01:00
Jakub Vrana
923c0ffc87 Fix whitespace 2018-01-22 13:51:47 +01:00
Jakub Vrana
48ed20323f CSP: Allow any CSS 2018-01-22 12:22:25 +01:00
Troy
9a4cd8936d adminer-theme-mancave2-2.0.alpha 2018-01-22 12:20:33 +01:00
Jáchym Toušek
019ada8da5 Fix NULL value in edit form with Postgres 2018-01-22 12:06:15 +01:00
Jakub Vrana
6a95b71164 Do not warn about MySQL specific functions 2018-01-22 12:00:38 +01:00
Jakub Vrana
3b4ce4a0b4 Fix single driver non-MySQL compiled versions (regression from 150301ed) 2018-01-22 11:42:17 +01:00
Jakub Vrana
a414896885 Hide driver selection in single-driver version (regression from e762a6aa) 2018-01-22 11:34:25 +01:00
Peter Knut
47734d8ff4 Unify HTML for list of tables in Editor according to Adminer 2018-01-22 10:57:20 +01:00
Peter Knut
fef1808288 Encapsulate fulltext part in search box into <div> 2018-01-22 10:53:50 +01:00
Fabio Montefuscolo
d2c82fdeca Enhance ElasticSearch integration 2018-01-19 18:32:41 +01:00
Jakub Vrana
e657cdbc3a Allow PHP 5.6 in Travis 2018-01-19 18:20:02 +01:00
Jakub Vrana
bc14e8432f Select numeric database name in DB list (bug #580) 2018-01-19 17:39:27 +01:00
Jakub Vrana
34b03ef835 SQLite: Enable foreign key checks 2018-01-19 14:57:58 +01:00
Jakub Vrana
329b7de9cc CSP: Allow any images, media and fonts, disallow base-uri 2018-01-19 11:05:26 +01:00
Jakub Vrana
2dcad1f284 Define JS functions in AdminerTablesFilter sooner 2018-01-19 10:55:51 +01:00
Jakub Vrana
1b98a10100 Adminer: Fix Search data in tables 2018-01-19 10:46:35 +01:00
Jakub Vrana
187dd56b1c Release 4.4.0 2018-01-17 12:41:38 +01:00
Jakub Vrana
ba9099f084 Allow sending multiple CSP headers 2018-01-17 11:05:59 +01:00
Jakub Vrana
16e05167a4 Use __construct for constructor 2018-01-16 20:05:07 +01:00
Jakub Vrana
756e304c92 Set session cache limiter only without session.auto_start (bug #586) 2018-01-16 16:56:14 +01:00
Jakub Vrana
e762a6aa95 Add missing newline 2018-01-16 16:44:49 +01:00
Jakub Vrana
b3d5c9affe Require specifying credentials in login-sqlite plugin 2018-01-16 16:37:59 +01:00
Jakub Vrana
0268aba85a Avoid count(null) 2018-01-16 16:22:24 +01:00
Jakub Vrana
9ca92309a1 Disallow PHP 5.3 in Travis 2018-01-16 13:51:02 +01:00
Jakub Vrana
0fae40fb61 Disallow connecting to privileged ports (thanks to hyp3rlinx) 2018-01-16 11:18:32 +01:00
Jakub Vrana
0e5df34ea8 Rate limit password-less login attempts from the same IP address (thanks to hyp3rlinx) 2018-01-16 11:17:25 +01:00
Jakub Vrana
f3938c1a66 Use HTTPS 2018-01-14 11:03:54 +01:00
Jakub Vrana
07aa80048a Use HTTPS in doc_link() 2018-01-14 10:38:01 +01:00
Jakub Vrana
c57e7ac3e3 Do not set '' for empty enum 2018-01-14 10:19:56 +01:00
Jakub Vrana
6d14b47d02 Fix select function onchange 2018-01-14 10:18:38 +01:00
Jakub Vrana
ef3b468626 Clone all event handlers in cloneNode() 2018-01-14 10:04:53 +01:00
Jakub Vrana
4d38c09db5 Use border-collapse to prevent unnecessary wrapping in Chrome 2018-01-14 09:35:13 +01:00
Jakub Vrana
3ba99a1c2a Fix whitespace 2018-01-14 08:52:22 +01:00
Jakub Vrana
9cbdb6262b Fix selectCount() in information_schema 2018-01-14 08:36:10 +01:00
Jakub Vrana
cc268428b8 Fix SQL command toggle 2018-01-14 00:10:42 +01:00
Jakub Vrana
80d030f51a Disallow scripts without nonce 2018-01-13 22:19:16 +01:00
Jakub Vrana
e23da5da0e Fix wrapping in Create table 2018-01-13 17:40:21 +01:00
Jakub Vrana
9d532fc0a1 Use script_src for <script src> 2018-01-13 16:25:11 +01:00
Jakub Vrana
144c7de27f Fix typo in script() 2018-01-13 15:23:47 +01:00
Jakub Vrana
b7fcebfba8 Do not send empty CSP 2018-01-13 14:21:54 +01:00
Jakub Vrana
d39a6e59c7 Move inline event handlers to <script> 2018-01-13 09:34:01 +01:00
Jakub Vrana
fc559a1cf6 Move inline event handlers to <script> 2018-01-13 09:21:21 +01:00
Jakub Vrana
f457053d85 Use the fact that we handle oninput in whisper() 2018-01-13 09:07:35 +01:00
Jakub Vrana
e255ba9aa4 Move inline event handlers to <script> 2018-01-13 08:58:01 +01:00
Jakub Vrana
3fe0d88f98 Editor: Fix Search data in tables 2018-01-12 23:59:04 +01:00
Jakub Vrana
68c6b1c942 Move inline event handlers to <script> 2018-01-12 23:42:20 +01:00
Jakub Vrana
001c37e240 Use <script> instead of inline event handler for skipping original 2018-01-12 23:27:14 +01:00
Jakub Vrana
b6cc584f48 Move inline event handlers to <script> 2018-01-12 22:46:16 +01:00
Jakub Vrana
af1ad47a64 Return false from editingMoveRow() 2018-01-12 22:35:05 +01:00
Jakub Vrana
2eaac2e94e Move inline event handlers to <script> 2018-01-12 22:25:38 +01:00
Jakub Vrana
40abffe8de Use oninput instead of onchange 2018-01-12 22:18:54 +01:00
Jakub Vrana
259a465125 Move inline event handlers to <script> 2018-01-12 21:57:54 +01:00
Jakub Vrana
6c1fbf13c6 Fix fieldChange() after 6353a898 2018-01-12 21:49:45 +01:00
Jakub Vrana
6353a89816 Use oninput instead of onkeyup 2018-01-12 18:46:44 +01:00
Jakub Vrana
38aac7ada2 Move inline event handlers to <script> 2018-01-12 18:34:19 +01:00
Jakub Vrana
24245867d7 Use <script> instead of inline event handler in on_help() 2018-01-12 18:11:00 +01:00
Jakub Vrana
1459df56bc Move inline event handlers to <script> 2018-01-12 17:59:46 +01:00
Jakub Vrana
dc3a0e1a32 Clone onchange in cloneNode() 2018-01-12 17:33:23 +01:00
Jakub Vrana
0411495d20 Move inline event handlers to <script> 2018-01-12 17:19:47 +01:00
Jakub Vrana
3d69fbf5f7 Allow searching data in tables by Ctrl+Enter 2018-01-12 17:11:29 +01:00
Jakub Vrana
5e9df49fd1 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
565a5ca0eb Fix selectors in schema after 58b2904d 2018-01-12 17:11:29 +01:00
Jakub Vrana
9061583538 Rely on event always passed to handlers 2018-01-12 17:11:29 +01:00
Jakub Vrana
35b1db6974 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
068ee71bf7 Return false from editingRemoveRow 2018-01-12 17:11:29 +01:00
Jakub Vrana
efcf37d162 Move inline event handlers to <script> 2018-01-12 17:11:29 +01:00
Jakub Vrana
e645693147 Use script() for <script> 2018-01-12 17:10:33 +01:00
Jakub Vrana
12fbfc9847 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
6b2ba65084 Use <script> instead of inline event handler in print_fieldset() 2018-01-12 17:09:41 +01:00
Jakub Vrana
a5ee3451ac Use <script> instead of inline event handler in confirm() 2018-01-12 17:09:41 +01:00
Jakub Vrana
da671df728 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
650221357d Return false from ajaxSetHtml() 2018-01-12 17:09:41 +01:00
Jakub Vrana
d996b48cfa Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
22b4322710 Revert using @this in formChecked 2018-01-12 17:09:41 +01:00
Jakub Vrana
36edd445a6 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
7305783c21 Return false from toggle() 2018-01-12 17:09:41 +01:00
Jakub Vrana
ee3a88d574 onchange='selectFieldChange 2018-01-12 17:09:41 +01:00
Jakub Vrana
e5c52589ec Use @this in selectFieldChange 2018-01-12 17:09:41 +01:00
Jakub Vrana
3b0e1cf289 Move inline event handlers to <script> 2018-01-12 17:09:41 +01:00
Jakub Vrana
767fc0e47e Fix indexesAddColumn after 14778165 2018-01-12 17:09:41 +01:00
Jakub Vrana
63581af0f6 Move inline event handlers to <script> 2018-01-12 17:09:35 +01:00
Jakub Vrana
813ada6661 Revert using @this in formChecked 2018-01-11 18:58:00 +01:00
Jakub Vrana
4be72a2a0d Allow customizing CSP 2018-01-11 18:39:49 +01:00
Jakub Vrana
541c3c1fed Allow img-src data: common in skins 2018-01-11 18:39:49 +01:00
Jakub Vrana
3408d4ad78 Use JSON.parse if available 2018-01-11 18:39:49 +01:00
Jakub Vrana
e614ae08c4 Add Content Security Policy 2018-01-11 18:39:49 +01:00
Jakub Vrana
552d2a6be4 Always send security headers in customization 2018-01-11 18:39:49 +01:00
Jakub Vrana
415253b1b1 Add nosniff header 2018-01-11 18:39:22 +01:00
Jakub Vrana
d07b7e3773 Use Referrer-Policy instead of <meta name="referrer">
To make securityheaders.io happy.

Also fix a typo in the value (https://lists.w3.org/Archives/Public/public-webappsec/2015May/0059.html).
2018-01-11 18:38:15 +01:00
Jakub Vrana
3de101dff4 Editor: Fix doubleclick on database page 2018-01-11 17:24:57 +01:00
Jakub Vrana
48dacd1e97 Fix a typo from 9cb28186 2018-01-11 17:05:37 +01:00
Jakub Vrana
14778165a8 Use @this in JavaScript (prepares for removing inline event handlers) 2018-01-11 17:01:29 +01:00
Jakub Vrana
72b199378a Prevent PHP 7.1 warning about non-numeric values 2018-01-11 16:22:29 +01:00
Jakub Vrana
329fa55af5 Unindent doc-comments 2018-01-11 15:14:05 +01:00
Jakub Vrana
ecf34769ad Delete type="text/css" from <style> as it is the default in HTML5 2018-01-11 14:14:15 +01:00
Jakub Vrana
dc85ba2d86 Delete type="text/javascript" from <script> as it is the default in HTML5 2018-01-11 14:13:43 +01:00
Jakub Vrana
741b76fbd4 Replace getElementsByTagName by shortcut for querySelectorAll 2018-01-11 14:00:04 +01:00
Jakub Vrana
58b2904d62 Use querySelector 2018-01-11 13:55:48 +01:00
Jakub Vrana
9cb281868f Replace getElementById by shortcut for querySelector (requires IE8) 2018-01-11 13:51:32 +01:00
Jakub Vrana
67f6aea77f Fix skin for Chrome 61 (thanks to Dominik Ulrich) 2017-10-28 15:05:07 +02:00
Jakub Vrana
7bcba262df Editor: Display field comment's text inside [] only in edit form 2017-10-01 08:45:17 -07:00
Itamar Schen
75c0786d2e Fix hebrew typos (#228) 2017-09-29 09:25:32 +02:00
Jakub Vrana
c4f6cbb32e Add new Hebrew translations 2017-09-11 13:25:49 +02:00
Jakub Vrana
b10e9e127e Add Hebrew translation 2017-09-09 12:06:14 +02:00
Lukas Tribus
32f1e856ad Editor: Don't set time zone from PHP
Current implementation checks the delta between the local time and
UTC, and applies the delta as time zone for MySQL.

This assumption is wrong if the current time is DST enabled, but the
time that is converted isn't - and vice versa.

For example, Europe/Prague is "CET-1CEST,M3.5.0,M10.5.0/3", when
the MySQL connections is setup now (September, DST enabled) and
we are reading a TIMESTAMP from November, then MySQL applies +0200
instead of +0100 to that timestamp even though November is supposed
to be DST disabled.

There is no reliable and portable way in PHP to understand the
time zone, especially since PHP >= 5.4.0 ignores environment
variable and OS settings [1].

MySQL needs to be properly setup (TZ data loaded [2] and default
TZ set [3]), then everything will work just fine.

The current implementation however causes wrong data 50% of the
time, even when OS/MySQL/PHP is properly setup. As a MySQL
connection will converte timestamps from both DST enabled and
DST disabled dates, a static UTC offset must never be set at
connection level (set time_zone = ...).

This change removes the current implementation, therefor maintaining
OS/MySQL defaults, fixing the DST issue in properly configured
environments.

[1] http://php.net/manual/en/function.date-default-timezone-get.php
[2] https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html
[3] https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
2017-09-09 11:44:42 +02:00
Jonathan Vollebregt
17e45e9a9c Make sure all sidebar elements are pushed down, not just the form.
This was breaking the #logins block at the log in screen.
2017-09-09 11:39:47 +02:00
Jonathan Vollebregt
e1f43da8df Update AdminerTablesFilter to produce li as per c9801e2e24 2017-05-19 11:23:35 +02:00
Jakub Vrana
70aef8a55a MySQL: Remove dedicated view for replication status 2017-05-19 11:11:44 +02:00
Jakub Vrana
0b824dad29 Sort table names (bug #552) 2017-05-19 10:57:20 +02:00
Alfonso Montero
65fa4b4e31 Update es.inc.php 2017-04-22 10:07:55 +02:00
Jakub Vrana
c0a3f30060 Add a donate link 2017-04-16 10:42:27 +02:00
Jakub Vrana
7af1ee3702 Release 4.3.1 2017-04-14 09:48:11 +02:00
Jakub Vrana
3cbece1ec0 Fix SQL command autofocus 2017-04-09 12:30:34 +02:00
Jakub Vrana
0d73372c50 Add a todo 2017-04-09 12:13:18 +02:00
Jakub Vrana
fb7bd02713 Don't overwrite previous cookies (bug #539) 2017-04-09 11:04:57 +02:00
Jakub Vrana
fb71941daa PostgreSQL: Fix JSONB version support 2017-04-08 20:17:08 +02:00
Jakub Vrana
504c56216c PostgreSQL: Support JSON and JSONB data types (bug #542) 2017-04-08 19:59:13 +02:00
Jakub Vrana
88803c6d0e Update haeckel design (thanks to Klemens Haeckel) 2017-04-08 19:51:13 +02:00
Andre Polykanine A.K.A. Menelion Elensúlë
b585ee8261 Updating Russian translation 2017-04-08 19:41:36 +02:00
Deni
f4817e8568 Fix table dependency on export 2017-04-08 19:38:03 +02:00
Deni
105aca9b04 Fix PostgreSQL nullable fields in export 2017-04-08 19:37:56 +02:00
Jakub Vrana
f556f6acb1 PostgreSQL: Fix index size computation in PostgreSQL < 9.0 (reverts 4c78976c) 2017-04-08 19:33:46 +02:00
Jakub Vrana
22d0cf4171 Release 4.3.0 2017-03-15 18:24:12 +01:00
Jakub Vrana
fa0963f370 Reorder changelog 2017-03-15 16:57:58 +01:00
Jakub Vrana
ba28845651 Update JUSH 2017-03-15 12:53:26 +01:00
Jakub Vrana
8fd7ff0187 Highlight JSON 2017-03-10 08:56:58 +01:00
Jakub Vrana
e040b296c5 Print number of bytes in blob in italics 2017-03-10 08:19:58 +01:00
Jakub Vrana
b616c57352 MySQL: Support JSON data type 2017-03-10 08:15:52 +01:00
Jakub Vrana
50390ea38c Support MySQL 8 2017-03-09 18:52:00 +01:00
Jakub Vrana
9d7d30891e Use SameSite cookies (except session cookie) 2017-03-07 18:12:23 +01:00
Jakub Vrana
4cf73abccd Rely on noreferrer in Firefox too 2017-03-01 11:35:01 +01:00
Jakub Vrana
2d6451b99a Improve SQLite login error message 2017-03-01 11:23:20 +01:00
Jakub Vrana
40d1feec9f Update URL 2017-02-27 13:44:22 +01:00
Jakub Vrana
e40d9692c7 Save bytes 2017-02-22 11:49:25 +01:00
Jakub Vrana
770fc9673c Lint PHP files 2017-02-21 13:47:19 +01:00
Jakub Vrana
56b6590a4f Simplify SQLite development 2017-02-21 13:13:39 +01:00
Jakub Vrana
f8fd4dd6e3 Document new engines 2017-02-21 13:05:43 +01:00
Jakub Vrana
d8c28d1c91 Avoid referencing global variable (doesn't work in PHP 7.1 if Adminer is included inside a function) 2017-02-21 12:07:13 +01:00
Jakub Vrana
46f39f3cdb Bump version 2017-02-21 12:07:13 +01:00
Jakub Vrana
8a9df8ede1 Elasticsearch: allow empty server name 2017-02-21 12:07:13 +01:00
Jakub Vrana
e4d35f9591 Hide materialized views in MySQL 2017-02-20 19:28:16 +01:00
Jakub Vrana
346353153d Unindent 2017-02-20 19:28:16 +01:00
Jakub Vrana
9df33e82e6 Elasticsearch: Support HTTPS by inputting https://server (bug #446) 2017-02-20 18:06:14 +01:00
Jakub Vrana
fa09eba15e Save bytes 2017-02-20 17:25:59 +01:00
Jakub Vrana
d5b329a1a4 MySQL: Support spatial indexes (bug #455) 2017-02-20 17:25:34 +01:00
Jakub Vrana
0cd02bb98a Fix dropping foreign keys linking to other database 2017-02-20 16:59:13 +01:00
Jakub Vrana
a7cbf66347 Move 'Create user' above the list of users 2017-02-20 16:52:10 +01:00
Jakub Vrana
fa6865da6a Use 'Create database' instead of 'Create new database' 2017-02-20 16:47:03 +01:00
Jakub Vrana
63b6b99365 Support high Unicode characters in shorten_utf8 (bug #481) 2017-02-20 16:22:30 +01:00
Jakub Vrana
a0a1476e5b Fix where() escaping in MS SQL (bug #496) 2017-02-20 15:23:22 +01:00
Jakub Vrana
8a9d803137 Add jsonly class to JS checkboxes 2017-02-20 15:11:47 +01:00
Jakub Vrana
4588af77ac Display message about missing master status 2017-02-20 14:06:19 +01:00
Jakub Vrana
91bd2e84f5 Add Czech translation 2017-02-20 12:55:57 +01:00
Matthew Gamble
2a534798fa Add basic support for MySQL replication 2017-02-20 12:54:40 +01:00
Adam Kuśmierz
a062e9cc58 Checkbox for bool in psql 2017-02-20 12:31:36 +01:00
Peter Knut
6c84764334 Fixed all alternative designs after changes in a list of tables made here: https://github.com/vrana/adminer/pull/116 2017-02-20 12:21:50 +01:00
Jakub Vrana
a01ca3ade4 PostgreSQL: Allow changing materialized views 2017-02-20 12:13:09 +01:00
Jakub Vrana
6ee4692afd PostgreSQL: Fix index size computation 2017-02-20 12:06:41 +01:00
Jakub Vrana
b8cd3b317d Verify commit success after import.
Fixes https://sourceforge.net/p/adminer/bugs-and-features/521/.
2017-02-19 14:22:41 +01:00
Jonathan Vollebregt
64a49e95e8 Add javascript move for editing 2017-02-19 13:55:50 +01:00
Jan Kalina
8dd971ca5e foreign key link fix - added missing ns 2017-02-19 13:02:55 +01:00
Peter Knut
c9801e2e24 Tables list implemented as <ul>
Encapsulation of list items is necessery for advanced CSS themes.
2017-02-19 11:39:04 +01:00
newsiram
4578d47409 Changed NULL format
+ <i> was not italics
+ reduce font & showed border
2017-02-19 11:36:20 +01:00
Loren Klingman
12aaf506b8 Fix MS SQL Driver to not show warnings for version fetching on connection and to retrieve the next set of results properly 2017-02-19 11:35:24 +01:00
Mathieu Rochette
4cfe6263d9 fix logger for SQL commands 2017-02-19 11:00:07 +01:00
Felix Geyer
b8bea7fc56 Hide databases the user can't connect to
pg_database lists all databases including the ones the user can't connect to.
There is little point in showing them when we know connecting will fail.
2017-02-19 10:33:22 +01:00
0xACE
cd8ff96a09 Breadcumb no longer blocks the logout button.
Not sure why the top bar is blocking the logout button. This patch allows the user  to see and click the logout button.
2017-02-19 10:15:05 +01:00
Kakysha
4a69059e1b Edit json and jsonb types in textarea 2017-02-19 10:02:51 +01:00
Gargaj
842ea0bd46 Add namespace to routine call
MSSQL is picky about this, shouldn't affect the drivers that don't use namespaces.
2017-02-19 09:53:51 +01:00
K0n24d
1d0607177d Do not set input type as numeric if field is an array 2017-02-19 09:45:05 +01:00
isra00
9e4d9fda65 New skin 'flat' 2017-02-19 09:31:19 +01:00
nafex
47c582acb3 make bytea fields shortable 2017-02-19 09:30:39 +01:00
Lubor Bilek
32334f1106 PostgreSQL export: table structure, columns, sequences, indexes, foreign keys, comments, trigger definition 2017-02-19 09:26:47 +01:00
Matthew Gamble
a10238516c Add plugin for printing table indexes structure in expanded format 2017-02-18 19:22:47 +01:00
Matthew Gamble
4801da091b Add plugin for printing table structure in expanded format
Instead of trying to squeeze everything into three columns, this plugin
uses multiple columns for each part of a column's structure.
2017-02-18 19:21:16 +01:00
Matthew Gamble
76612b1e8a Move rendering of table structure and indexes list into plugin system
This allows the creation of a plugin to extend the display of either or
both of these things.
2017-02-18 19:15:23 +01:00
Matthew Gamble
eb8c9929d3 Handle checkboxes properly in selectAddRow() 2017-02-18 18:59:06 +01:00
Ion Bazan
cf10398104 fixed Elastic table_status() 2017-02-18 18:45:23 +01:00
Jiří Barouš
d00927ce66 Improve limit check in edit-foreign plugin
The limit is enforced in the query to prevent out-of-memory errors for big target tables.
2017-02-18 18:32:32 +01:00
Jonathan Vollebregt
28a84fec18 AdminerTablesFilter: Persist filter value in a tab 2017-02-18 18:13:05 +01:00
Jonathan Vollebregt
2c8eff9b53 Update AdminerTablesFilter
* Removes children request (Should work on IE6, 7, 8 now)
* Uses <strong> instead of <b>
* Doesn't leave said <strong> tags behind after updating the list
* Highlights multiple matches in a single table name
* Works case insensitively
* Improves performance with setTimeout
    With 400 tables, the old implementation locks up the tab (or
    browser if using something without multiprocess) for about
    half a second per keyup. Yes, this includes modifiers that
    don't actually change the filter. The new version handles
    the same event in 0.09 milliseconds.

    That's with all the above improvements.
    Tested in firefox 45.1.1 performance monitor.
2017-02-18 18:12:58 +01:00
Alessandro Frangioni
5f26d3a1b8 Added support for binary foreign keys selection on edit 2017-02-18 18:06:14 +01:00
Adam Kuśmierz
3344fae96e Plugin: Use <select> on custom user types in psql 2017-02-18 18:01:17 +01:00
Janne Cederberg
dedbd01f64 Tabs must also be escaped in JSON strings
If database table data contains tab characters (0x09) then those
must also be escaped along with newlines and carriage returns for
the resulting JSON file to be valid.
2017-02-18 17:51:55 +01:00
PiR-B-
4c78976cba Fix index length with Postgresql 2017-02-18 17:42:34 +01:00
soleuu
1a6186648c postgresql error with index on hidden columns (ctid) 2017-02-18 17:41:45 +01:00
Daniel Berthereau
36f42d0fda Fixed background of the list of the tables. 2017-02-18 17:40:00 +01:00
Jakub Vrana
45712a5d4c Document changes 2017-02-18 17:37:12 +01:00
Charles Wu
73690164b7 Added pdo_dblib as a driver for MSSQL (as native MSSQL driver does not exist for PHP7) 2017-02-18 17:35:36 +01:00
Jakub Vrana
3fa1eadf2c Use null instead of undefined on after parsing JSON 2017-02-18 17:32:40 +01:00
shaununderwood
3a1c251065 Changed 'undefined' to 'null'
'undefined' is not a valid JSON attribute value and should been 'null'
2017-02-18 17:32:40 +01:00
Massimiliano Torromeo
d0268c69da Fixed mssql driver for usage with microsoft's php7 sqlsrv extension 2017-02-18 17:32:40 +01:00
Adam Kusmierz
fd3d1c7e2e Plugin which shows sql structure comments in field names title 2017-02-18 17:32:40 +01:00
Adam Kusmierz
cbd3adc564 PHP Warning hidden and better parsing times (at least for postgresql) 2017-02-18 17:32:40 +01:00
soleuu
86e26846a8 postgresql : ERROR: function connection_id() does not exist 2017-02-18 17:32:40 +01:00
soleuu
6860478950 postgresql : unique partial index musn't be considered as unique. can cause problems on row edition 2017-02-18 17:32:40 +01:00
Jakub Vrana
dc9ae77e2f Fix error found by PHPStan 2017-02-16 19:05:45 +01:00
jose
8f60870d9a mistype correction 2017-02-13 17:17:36 +01:00
Jakub Vrana
d6c3430607 Add accessibility labels to Foreign keys 2017-01-23 15:12:42 -08:00
Jakub Vrana
2cee788ad3 Add accessibility labels to Indexes 2017-01-23 14:29:00 -08:00
Jakub Vrana
647cab7c69 Use class instead inline style 2017-01-23 14:10:50 -08:00
Jakub Vrana
9bb75e1230 Add accessibility labels to databases and tables checkboxes 2017-01-23 14:05:47 -08:00
Jakub Vrana
7099560add Escape quote in field name to make it work in Chrome (thanks to zcepenela pani) 2017-01-23 13:30:05 -08:00
Lucas Sandery
14cb9ca1ef Additional theme with responsive and RTL support
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2017-01-23 12:53:27 -08:00
Lucas Sandery
31057f0ef2 RTL layout fixes
Signed-off-by: Lucas Sandery <lucas-sandery@users.noreply.github.com>
2017-01-23 12:50:23 -08:00
Jakub Vrana
fa09962ab1 Add SQLite auto-login plugin 2016-11-28 10:09:51 -08:00
Jakub Vrana
bad3c6b086 Disallow selecting driver if there's only one 2016-11-28 10:07:03 -08:00
MegaXLR
0922b312d3 Changed 'geraakt' to 'beinvloed' in Dutch translation 2016-10-02 11:27:23 +02:00
Jakub Vrana
949b913d4f Change comment not supported by compile.php 2016-09-27 22:04:44 -07:00
Jakub Vrana
af25827ff4 Add Cache-Control: immutable to static files 2016-09-27 21:53:11 -07:00
Jakub Vrana
9872229e11 Make maxlength in edit fields a soft limit 2016-09-19 10:12:33 -07:00
Jakub Vrana
682e86d236 Add accessibility labels to Create Table fields 2016-09-19 15:33:12 +02:00
Jakub Vrana
f0a5fb56a5 Update Indonesian translation (thanks to Benny) 2016-07-22 17:30:38 +02:00
Jakub Vrana
53dfafd2ea Release 4.2.5 2016-06-01 10:09:29 -07:00
Jakub Vrana
7a33661b72 SQLite: Require credentials to use (thanks to Vincent Waart) 2016-06-01 09:59:20 -07:00
Jakub Vrana
a5b65fba5b Fix remote execution in SQLite query (thanks to Vincent Waart) 2016-06-01 09:56:40 -07:00
Jakub Vrana
63f2a041ed Remove global variable 2016-02-28 12:30:52 -08:00
Bernhard J. M. Gruen
3289eca040 improved kill command support for MySQL and initial support for PgSQL 2016-02-28 12:27:45 -08:00
Petr Sedlacek
c5a7174a2a Fix http:// links in stylesheets to protocol-independent ones (//)
The http links do not load on https pages due to mixed content restriction
of modern browsers
2016-02-28 11:34:10 -08:00
Jakub Vrana
49e2ac4559 Release 4.2.4 2016-02-06 11:10:16 -08:00
Jakub Vrana
e5352cc5ac Fix remote execution in SQLite query (discovered by 庞申杰(千霄)) 2016-02-06 11:00:19 -08:00
Jakub Vrana
0bb5a52dc4 Add Finnish translation 2016-02-06 10:50:57 -08:00
Jakub Vrana
37b9f0ec01 Add Bosnian translation 2016-02-01 09:10:07 -08:00
ekurtovic
73f94e4873 Bosnian language 2016-02-01 09:09:54 -08:00
Jakub Vrana
a2f0806804 Delete unused variable and method 2016-01-24 14:25:17 -08:00
Jakub Vrana
b317fe156a Support PHP 7 2016-01-24 12:02:41 -08:00
Angristan
763d3e9f89 Use HTTPS Google Font URL 2016-01-24 11:23:33 -08:00
Jakub Vrana
f83e3f41d2 Release 4.2.3 2015-11-15 10:49:48 -08:00
Jakub Vrana
aa40e803e2 Add escaping (not fixing any XSS) 2015-11-08 12:15:45 -08:00
Jakub Vrana
4be0b6655e Fix XSS in indexes (non-MySQL only) 2015-11-08 12:12:16 -08:00
Jakub Vrana
6c6bb45d3d Update Bulgarian translation 2015-11-03 08:48:08 -08:00
Jakub Vrana
0a31742ee8 Add Bulgarian translation 2015-11-01 11:33:04 -08:00
David Grudl
1f700ceea0 plugin.php: added missing arguments 2015-11-01 11:09:21 -08:00
David Grudl
a6ebd4a3e0 uses PHP 5 constructors 2015-11-01 11:08:46 -08:00
Jakub Vrana
d1aa3542ae Update xx translation 2015-09-22 08:52:53 -07:00
Jakub Vrana
b1da3995f6 Update Greek translation 2015-09-22 08:47:14 -07:00
Jakub Vrana
79d438ed80 Add Galician translation 2015-09-22 08:29:49 -07:00
Jakub Vrana
35b71f0472 Add Greek translation 2015-09-20 11:09:34 -07:00
Jakub Vrana
a01b2efc22 Change links to HTTPS 2015-09-10 09:26:36 -07:00
Jakub Vrana
a248f8b008 Change protocol to HTTPS 2015-09-08 11:41:29 -07:00
Nabil Kadimi
69ff979ee7 Improve Arabic translation 2015-08-13 09:13:18 -07:00
Nabil Kadimi
1aa7833a90 Improve Arabic translation 2015-08-13 09:10:50 -07:00
Jakub Vrana
40ce23d5ae Add nicu style 2015-08-06 09:01:14 -07:00
Jakub Vrana
060e220806 Add galkaev design 2015-08-05 19:13:29 -07:00
Jakub Vrana
1fcdaedb5f Add release date 2015-08-05 18:29:29 -07:00
Jakub Vrana
596f8df373 Fix XSS in alter table (found by HP Fortify) 2015-08-05 18:12:36 -07:00
Jakub Vrana
ea0c9d9b5e Release 4.2.1 2015-03-10 09:33:44 -07:00
Jakub Vrana
c5ae82ab5b MySQL: Try to set utf8mb4 if possible 2015-03-10 09:21:30 -07:00
Jakub Vrana
0025f2188a MySQL: Fix usage of utf8mb4 if the client library doesn't support it 2015-03-08 13:07:20 -07:00
Jakub Vrana
ea04a7e2c6 Update German translation (thanks to kulmjens) 2015-03-08 13:07:20 -07:00
Jakub Vrana
fc6efa0e12 Update French translation (thanks to vlakoff) 2015-03-08 13:07:20 -07:00
Jakub Vrana
26dafd9320 Use utf8mb4 only if supported 2015-03-06 11:56:04 -08:00
vlakoff
c7f302ca0b Corrections in French translation 2015-03-06 10:38:31 -08:00
kulmjens
b6c7708f32 Update de.inc.php
Added some missing strings, corrected some grammatical errors and did some cosmetics. :-)
2015-03-06 10:36:07 -08:00
Jakub Vrana
ced05d8a44 Fix going back to search result after edit 2015-03-06 10:20:10 -08:00
Jakub Vrana
8dde91b2a1 SQLite: Use EXPLAIN QUERY PLAN in SQL query (bug #443) 2015-03-06 10:02:45 -08:00
Jakub Vrana
8aa420d160 MySQL: Use utf8mb4 in export only if required 2015-03-06 09:36:20 -08:00
Jakub Vrana
6bbc8bc3ea Release 4.2.0 2015-02-07 11:08:21 -08:00
Jakub Vrana
c990de3b3e Fix XSS in login form (bug #436) 2015-02-07 10:40:51 -08:00
beerwine
411d198d0d Added support for ILIKE in pgsql. 2015-02-07 10:25:33 -08:00
Jakub Vrana
060c006875 Add referrer: never meta tag 2015-02-06 09:00:48 -08:00
Jakub Vrana
42fd6dea8b Improve Spanish translation (thanks to Anuncios Google) 2015-01-24 11:43:35 -08:00
Jakub Vrana
5b38a5b6f1 Avoid double escaping in script=db (thanks to trestna smradlavice) 2015-01-12 09:46:53 -08:00
Nima Amini
65f8a87629 Update Persian translation 2015-01-12 09:32:03 -08:00
Jakub Vrana
2e4b8c1d36 Fix version needed for utf8mb4 (thanks to dg) 2015-01-11 10:09:41 -08:00
Jakub Vrana
2a5aca0038 Improve error message for views 2015-01-09 11:38:22 -08:00
Matej Humpal
8cb8a75658 Fix tables list alphabetical order in PostgreSQL driver 2015-01-06 09:47:15 -08:00
Matej Humpal
647e8d5cc1 Order sequences list by name 2015-01-06 09:27:45 -08:00
Jakub Vrana
25329cebf3 Allow limiting number of displayed rows in SQL command (bug #406) 2014-12-06 11:12:51 -08:00
Fot0n
f839d5ac25 Correcting inaccuracies and errors 2014-12-06 09:04:10 -08:00
Jakub Vrana
406889d7c3 Update pappu687 design 2014-12-02 09:17:48 -08:00
Jakub Vrana
8bd53120df Fix handling of 64 bit numbers in auto_increment 2014-11-24 18:17:43 -08:00
Jakub Vrana
4a4e58179f Avoid comma before PARTITION 2014-11-20 09:53:52 -08:00
Jakub Vrana
0b0c0c7e89 Don't alter table comment if not changed (was crashing MySQL Cluster) 2014-11-18 09:50:02 -08:00
Jakub Vrana
594c626665 Relax foreign keys format for NDB engine 2014-11-15 14:06:46 -08:00
Jakub Vrana
001bf042b4 MySQL: Support foreign keys in NDB storage 2014-11-12 10:13:40 -08:00
Rob Loach
fe5a81fd08 Add Composer support 2014-11-11 08:41:58 -08:00
Jakub Vrana
fe76c6b887 Add links to documentation on table status page 2014-11-04 09:48:21 -08:00
Jakub Vrana
3ff5930d18 Improve Romanian translation (thanks to Marian-Nicolae V. Ion) 2014-11-04 09:17:04 -08:00
Radosław Kowalewski
f782af67e2 Update Polish translation 2014-10-30 09:58:12 -07:00
Jakub Vrana
536e9a58ad Improve CSRF message 2014-10-28 09:24:13 -07:00
Jakub Vrana
5dc5bfe7ff SQLite: Support CURRENT_* default values (bug #417) 2014-10-25 16:49:42 -07:00
Zemistr
8fc70327fb Fixed a bug when exporting without selecting a database 2014-10-12 12:10:56 -07:00
Gargaj
0fb7260fd4 MSSQL: avoid warnings if result is invalid 2014-10-06 09:11:59 -07:00
Zemistr
0ed7b6b058 Improved plugin to display JSON values as the table in edit form 2014-09-18 09:38:28 -07:00
Zemistr
00eb35b4f5 Created plugin for dump to PHP format 2014-09-18 09:37:34 -07:00
Zemistr
4f7ff182b1 Fixed column names and bug with data in result 2014-09-18 09:37:31 -07:00
Gargaj
9c534a0a80 Elasticsearch: sort as strings 2014-09-16 09:20:34 -07:00
Jakub Vrana
8871fffb7c Delete duplicate code 2014-09-14 21:47:03 -07:00
Jakub Vrana
d029cadd60 Plugin edit-foreign: Backwards compatible default 2014-09-14 21:46:52 -07:00
Robert Slootjes
45bc098262 Plugin edit-foreign: Add limit where it should stop creating a select 2014-09-14 21:40:57 -07:00
Lubor Bilek
3052952733 PostgreSQL: Fix timestamp(0) (fixes #383) 2014-09-14 21:34:26 -07:00
Jakub Vrana
f9d76cea9a Firebird: Alpha version (thanks to Steve Krämer) 2014-09-14 21:10:23 -07:00
Jonathan Vollebregt
da61118303 Fix missing primary_key in haeckel theme custom SQL execution
Automatically generated queries start with the primary_key field
which is linked to edit a row. The haeckel theme changes this link
into an edit icon, and there's no problem since adminer will
automatically select the primary_key a second time.

In custom SQL queries however this second field selection can't be
inserted and the primary_key is eaten by the icon, making it hard
to find a row by id.
2014-09-14 15:52:29 -07:00
Jakub Vrana
37c8a3a123 Report offline and other AJAX errors (bug #419) 2014-09-14 15:47:09 -07:00
Jakub Vrana
a987a2a4de Fix JS error on Ctrl+click in select 2014-09-14 14:49:39 -07:00
Jakub Vrana
1c56b3b206 Editor: Define help mouse handlers 2014-09-14 14:49:39 -07:00
Jakub Vrana
594085c6f5 Send 403 for auth error 2014-09-14 14:49:33 -07:00
Rossler Jan
7a370e7885 PostgreSQL: Adjusted detection of materialized views support 2014-09-13 11:19:38 -07:00
Rossler Jan
933f041f4d PostgreSQL: Fixed foreign tables not displaying in menu 2014-09-13 11:16:24 -07:00
Rossler Jan
abc8be3317 PostgreSQL: Added support for materialized views 2014-09-13 11:16:17 -07:00
Jakub Vrana
51986426b7 Fix displaying binary data 2014-09-13 11:00:00 -07:00
Jakub Vrana
a3e1cd7bb6 Fix saving NULL value
This reverts commit ed130065.

Conflicts:
	adminer/drivers/mongo.inc.php
	adminer/include/functions.inc.php
2014-09-13 10:59:28 -07:00
JorgeHeredia
3e769815bf Update on Oracle Driver
I added the code to display the foreign keys on the table description! cheers!
2014-09-13 09:32:46 -07:00
Jakub Vrana
9e28e9f7ae Fix a typo in translation 2014-09-12 09:19:27 -07:00
Jakub Vrana
0e78996fdb Specify encoding for PHP 5.6 with invalid default_charset (fixes #421) 2014-09-11 08:48:26 -07:00
Gargaj
8d432beb3d Elasticsearch: adapt select() to use $where 2014-09-11 08:44:05 -07:00
Gargaj
02e574c8e9 Elasticsearch: fix select when fields are explicit
If fields are explicitly said, ES returns each row as an array.
2014-09-11 08:44:05 -07:00
Gargaj
c38f25b5d6 Elasticsearch: sort databases 2014-09-11 08:44:00 -07:00
Gargaj
024d73934f Elasticsearch: fix tables_list
otherwise it only returns "mappings" as the table
2014-09-11 08:32:03 -07:00
Gargaj
9315954f3e Elasticsearch: check for valid mappings 2014-09-11 08:30:23 -07:00
Gargaj
fe57642b6c Elasticsearch: add "engines" virtual function to avoid error 2014-09-11 08:28:31 -07:00
Gargaj
7066325e41 Elasticsearch: only throw error on actual decoding error 2014-09-11 08:27:45 -07:00
Jakub Vrana
b08631dab3 Danish translation 2014-09-08 09:27:15 -07:00
Jarne W. Beutnagel
767af152f9 Fixed spelling error 2014-09-08 09:16:58 -07:00
Jarne W. Beutnagel
4ee84efa3e Added Danish language file 2014-09-08 09:16:58 -07:00
Gargaj
04356ca0b0 Adapt to mapping structure
Mappings return a different structure actually:
http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html#_viewing_the_mapping
2014-07-03 16:36:05 -07:00
Jakub Vrana
f80b296a1a Make adminer.key group-readable 2014-06-27 08:17:33 -07:00
Jakub Vrana
52eee61247 Use chmod() instead of umask() 2014-06-27 08:15:15 -07:00
Jakub Vrana
7e3f2d9b1d Fix edit by long non-utf8 string (thanks Robert Vlach) 2014-06-26 14:36:47 +02:00
Jakub Vrana
8bd3dca2f7 Use utf8mb4 on more places 2014-06-26 13:38:50 +02:00
Jakub Vrana
b87d43fdcd Make master key unreadable to others (bug #410) 2014-06-26 13:30:02 +02:00
Jakub Vrana
06a2d87e55 Add CSS classes to navigation 2014-06-26 12:59:04 +02:00
Jakub Vrana
50b33db7e2 Change Dump to Export 2014-06-24 15:34:15 +02:00
Jakub Vrana
3e4c6d67e5 Unlock session in alter database 2014-06-24 15:26:51 +02:00
Jakub Vrana
4fe6bad829 Display explanation of default value 2014-06-24 15:05:35 +02:00
Jakub Vrana
13f08f7255 Use singular caption 2014-06-24 15:02:08 +02:00
Jakub Vrana
8c985124f2 MySQL: Use utf8mb4 if available 2014-06-24 14:59:19 +02:00
Jakub Vrana
1127082dd2 Centralize setting MySQL charset 2014-06-24 14:53:04 +02:00
Jakub Vrana
9b34f7906f Fix translation (bug #414) 2014-06-22 19:15:08 +02:00
Jakub Vrana
b9bc67d331 Fix reading routine column collations: http://sourceforge.net/p/adminer/discussion/960419/thread/3d0925f5/ 2014-06-15 18:43:45 +02:00
Jakub Vrana
033b967505 Clarify that global import supports only SQL 2014-06-15 18:43:45 +02:00
Jakub Vrana
5308e7171b Fix SQL textarea in skin (thanks to DanG) 2014-06-15 18:43:45 +02:00
Jakub Vrana
cbce3f1395 Improve French translation (thanks to Dominique Saussereau) 2014-06-15 18:43:44 +02:00
Jakub Vrana
e62fc3a07b Preserve null byte in HTML 2014-05-02 10:27:00 -07:00
Jakub Vrana
03e31ed154 Fix cookie name if the DB name contains dot 2014-04-21 09:59:52 -07:00
Jakub Vrana
ad96c516ac Rename variable to reduce confusion 2014-04-21 09:45:15 -07:00
Jakub Vrana
0c8cd8e5f7 Fix doc comment 2014-04-18 09:10:17 -07:00
Jakub Vrana
6aed2f510a Release 4.1.0 2014-04-18 08:51:37 -07:00
Jakub Vrana
c7f444049d Update French translation 2014-04-17 09:04:46 -07:00
Jakub Vrana
2e9ac3ba75 Update French translation 2014-04-15 09:17:42 -07:00
srsbiz
bc466f7f85 Update Polish translation 2014-04-13 10:51:32 -07:00
Jakub Vrana
15ea9bba81 Sort languages 2014-04-13 10:50:27 -07:00
Yuki Hana
c2ae381aaf Add Vietnamese language pack 2014-04-13 10:35:11 -07:00
Jakub Vrana
96c8e6fb71 Use rel=noreferrer in WebKit 2014-03-26 09:00:21 -07:00
Jakub Vrana
ba7af8e31c Revert "Simplify copying of redirected links" - doesn't work with right click + open in new tab
This reverts commit 00da70626d.
2014-03-26 08:38:23 -07:00
Jakub Vrana
794ba74be4 Elasticsearch: Fix table_status() 2014-03-25 09:38:40 -07:00
Tomas Lang
3ac662c755 ElasticSearch: table_statuses() also return count of rows 2014-03-25 09:36:07 -07:00
Jakub Vrana
ee124dadb1 Silence error for unwriteable file 2014-03-25 09:35:49 -07:00
Jakub Vrana
06f4346cfe Prevent against brute force login attempts from the same IP address 2014-03-21 22:47:57 -07:00
Jakub Vrana
619b49c3d4 Allow arrays to be ignored in hidden_fields() 2014-03-21 22:45:38 -07:00
Jakub Vrana
cd64b707bd Use noreferrer in external links 2014-03-21 22:32:31 -07:00
Jakub Vrana
6980d1a1d2 Trim trailing non-breaking spaces in SQL textarea 2014-03-20 20:22:32 -07:00
Jakub Vrana
00da70626d Simplify copying of redirected links 2014-03-20 10:04:48 -07:00
Jakub Vrana
4d491d704e Translate numbers in ar, bn, fa 2014-03-19 21:56:42 -07:00
Jakub Vrana
73629178d8 Add whitespace to query 2014-03-15 14:46:56 -07:00
Jakub Vrana
8670cfc31b Fix enum types in routines (bug #391) 2014-03-15 14:30:07 -07:00
Jakub Vrana
bbcc8f141d MySQL 5.6.5+: Support ON UPDATE on datatime column (bug #393) 2014-03-15 14:08:34 -07:00
Jakub Vrana
2f881b2674 Load UPDATE OF triggers 2014-03-15 13:13:18 -07:00
Jakub Vrana
46bb56cab9 SQLite: Support UPDATE OF triggers 2014-03-15 11:02:14 -07:00
Jakub Vrana
fc668ea326 Simplify format_time() 2014-03-15 11:02:14 -07:00
Jakub Vrana
95b0237061 Display Schema label in navigation 2014-03-12 15:48:29 -07:00
robertopc
fa01efa059 Fixing some typos in the PT-BR translation 2014-03-11 09:26:15 -07:00
Jakub Vrana
6a3ede75f6 Print elapsed time in HTML instead of SQL command comment 2014-03-07 09:33:37 -08:00
Jakub Vrana
d9fe03e1b4 Add space to Load More link 2014-03-06 10:11:11 -08:00
Jakub Vrana
67a29ff495 Move the database refresh link 2014-03-05 12:17:15 -08:00
Jakub Vrana
828a54deba Delete now useless plugin 2014-03-01 12:35:08 -08:00
Vladimír Kriška
fd4344c866 MongoDB: removed iterator to array conversion 2014-03-01 12:03:58 -08:00
Jakub Vrana
c369236333 Provide size of all databases in the overview 2014-03-01 11:38:38 -08:00
Jakub Vrana
a710c28d38 Escape server info 2014-03-01 11:19:27 -08:00
Jakub Vrana
8ea900534f Save memory by not storing HTML to textarea undo 2014-03-01 10:33:03 -08:00
Jakub Vrana
4c5667b93f Apply unconvert_field() in clone and multi-edit 2014-02-25 00:10:34 -08:00
Jakub Vrana
7da82a12a6 Display edit form after error in clone or multi-edit 2014-02-24 23:59:12 -08:00
Jakub Vrana
9567e5cb1a Prepare for using edit form in select 2014-02-24 23:44:24 -08:00
Jakub Vrana
052b019210 Document bug introduction 2014-02-24 16:54:11 -08:00
Jakub Vrana
4d8667db7b MySQL: Fix editing rows by binary values (bug #371) 2014-02-23 18:49:58 -08:00
Jakub Vrana
0fdedcbaa5 Display time of the select command 2014-02-23 18:34:00 -08:00
Jakub Vrana
7639ff8b95 Improve gzip export ratio (bug #387) 2014-02-23 18:02:43 -08:00
Jakub Vrana
990b3b8ccc Add design 2014-02-23 17:24:48 -08:00
Jakub Vrana
2b78d06646 Fix help position after scroll 2014-02-21 09:54:04 -08:00
Jakub Vrana
1088cc5dca Improve whitespace 2014-02-21 09:15:59 -08:00
Jakub Vrana
8e4882b801 Respect time zone in default values 2014-02-21 09:09:46 -08:00
Jakub Vrana
d53ffc2158 MySQL: Respect daylight saving time in dump (bug #384) 2014-02-21 09:09:09 -08:00
Jakub Vrana
ef81b5c1b2 SQLite: Ignore server, username and password 2014-02-21 08:53:58 -08:00
Jakub Vrana
849f9259b8 Update design 2014-02-20 09:07:33 -08:00
Jakub Vrana
1602db304a Document password functions 2014-02-19 09:27:22 -08:00
Jakub Vrana
822f3f2498 Update design 2014-02-12 08:56:40 -08:00
Jakub Vrana
150301ed5f Allow using in ->login() (bug #381) 2014-02-07 19:35:26 -08:00
Jakub Vrana
3e2288eee5 SQLite: Display auto-created unique indexes 2014-02-04 09:50:31 -08:00
Jakub Vrana
f4592e3603 Improve comment 2014-02-01 20:52:06 -08:00
Jakub Vrana
cbb612aaaa Remove modules used only by plugins 2014-02-01 10:28:56 -08:00
Jakub Vrana
38f4735758 Release 4.0.3 2014-02-01 10:18:49 -08:00
Jakub Vrana
6acf188c2f Don't store invalid credentials to session (bug #376) 2014-01-30 10:28:05 -08:00
Jakub Vrana
125b519937 Fix All checkbox in Opera (bug #374) 2014-01-30 10:06:43 -08:00
Jakub Vrana
d5a2afeef7 SQLite: Fix creating table and altering primary key (bug #373) 2014-01-30 09:39:15 -08:00
Jakub Vrana
147957cef7 Activate JUSH before loading databases 2014-01-30 09:06:58 -08:00
Jakub Vrana
adae922f36 Defer loading of JUSH 2014-01-30 08:27:56 -08:00
Jakub Vrana
81037ca4fb Fix zh-tw translation (bug #375) 2014-01-25 11:18:56 -08:00
Jakub Vrana
7e9725782d Norweigan translation 2014-01-25 10:58:54 -08:00
Jakub Vrana
32d542b633 MongoDB, Elasticsearch: Allow removing field in multi-edit 2014-01-15 08:36:38 -08:00
Jakub Vrana
bb7331e6a0 MongoDB, Elasticsearch: Allow downloading binary data 2014-01-15 08:26:47 -08:00
Jakub Vrana
60c8ec61e3 Make select(..., , , ) optional 2014-01-15 08:23:26 -08:00
Jakub Vrana
e9b5616657 MySQLi: Print error for editing invalid row 2014-01-13 21:24:55 -08:00
Tomas Lang
24eb008794 Elasticsearch: rootQuery() method for ES driver 2014-01-12 21:58:06 -08:00
Jakub Vrana
9edfe6d1ff MongoDB: Alter indexes 2014-01-11 21:08:57 -08:00
Jakub Vrana
91bb94eda6 MongoDB: Prepare for alter index 2014-01-11 19:22:44 -08:00
Jakub Vrana
63a04ff753 MongoDB: alter indexes form 2014-01-11 19:15:21 -08:00
Jakub Vrana
c106cf2a34 Use JUSH only with supported drivers 2014-01-11 18:45:05 -08:00
Jakub Vrana
5136b62e84 MongoDB: truncate 2014-01-11 18:29:47 -08:00
Jakub Vrana
ed13006512 MongoDB: Don't store unset values 2014-01-11 17:37:01 -08:00
Jakub Vrana
9824540ed8 MongoDB: auto_increment 2014-01-11 17:27:04 -08:00
Jakub Vrana
48848de529 SimpleDB, MongoDB: insert more fields at once 2014-01-11 15:46:30 -08:00
Jakub Vrana
2a9a50553b MongoDB: insert 2014-01-11 15:44:03 -08:00
Jakub Vrana
4bab88a1a0 MongoDB: Fix insert form with empty table 2014-01-11 15:16:26 -08:00
Jakub Vrana
f301fc2dcd Allow \r after -- comment 2014-01-11 12:22:54 -08:00
Jakub Vrana
b99148daeb Show only errors by default in import 2014-01-11 12:17:25 -08:00
Jakub Vrana
34384b8256 Release Adminer 4.0.2 2014-01-11 11:59:18 -08:00
Jakub Vrana
6ff96b3ec2 Include jush-txt in compiled version 2014-01-11 11:55:22 -08:00
Jakub Vrana
df0564862e Update JUSH 2014-01-11 11:36:19 -08:00
Jakub Vrana
691f319f26 Support paste to SQL textarea in Opera 2014-01-11 09:47:59 -08:00
Jakub Vrana
55ad89b309 Fix handling of long text in SQL textarea 2014-01-11 09:37:34 -08:00
Jakub Vrana
740843446f Release 4.0.1 2014-01-10 22:22:45 -08:00
Jakub Vrana
44ad4e174d Don't print query in edit 2014-01-10 21:32:17 -08:00
Jakub Vrana
2ecff21280 Don't print query in edit 2014-01-10 21:32:07 -08:00
Jakub Vrana
dbf5eede9d Don't print query in edit 2014-01-10 20:51:04 -08:00
Jakub Vrana
4183f73548 Don't link NULL foreign key values 2014-01-10 20:43:35 -08:00
Jakub Vrana
0830f5ce89 Add sefeguard agains null 2014-01-10 11:16:36 -08:00
Jakub Vrana
99c70e9ef6 Update design 2014-01-10 10:50:09 -08:00
Jakub Vrana
09836534ef Update design 2014-01-10 10:43:36 -08:00
Jakub Vrana
e5b5e98a7d Don't autofocus SQL textarea in Firefox 2014-01-10 10:31:51 -08:00
Jakub Vrana
72fa9ff0b5 Disable textarea highlighting with long texts 2014-01-10 10:24:53 -08:00
Jakub Vrana
ad00e5e965 Move JUSH loading to Adminer customization 2014-01-10 10:05:57 -08:00
Jakub Vrana
17a7865153 Update design 2014-01-09 22:37:32 -08:00
Jakub Vrana
1d52a4c1d5 Document changes 2014-01-09 22:28:42 -08:00
Tomas Lang
a8b7951a11 Elasticsearch: fix function table_status() for 2 or more tables 2014-01-09 22:26:39 -08:00
Tomas Lang
b40bfb94f5 Elasticsearch: Implemented function drop_tables() 2014-01-09 22:26:39 -08:00
Tomas Lang
1bb436080b Elasticsearch: Implemented function drop_databases() 2014-01-09 22:26:39 -08:00
Tomas Lang
9ac04aa5b9 Elasticsearch: Implemented function create_database() 2014-01-09 22:26:39 -08:00
Jakub Vrana
be0c1e1b49 Update design 2014-01-09 22:13:54 -08:00
Jakub Vrana
cb4eb8a467 Elasticsearch: Don't minimize $php_errormsg 2014-01-09 12:37:10 -08:00
Jakub Vrana
6103758e68 ElasticDB: Prepare for insert 2014-01-09 00:46:12 -08:00
Jakub Vrana
4b6d02cdf8 Show table links if driver supports indexes 2014-01-09 00:06:59 -08:00
Jakub Vrana
1c0c335d38 MongoDB is schemaless 2014-01-08 23:52:21 -08:00
Jakub Vrana
4f7e5f25a0 Don't overflow column context menu with Chrome default size font 2014-01-08 23:34:00 -08:00
Jakub Vrana
b90a12bfb4 Elasticsearch: Don't use selectQueryBuild() 2014-01-08 23:34:00 -08:00
Jakub Vrana
cff70ad1df Generalize inline edit of long fields 2014-01-08 23:33:14 -08:00
Jakub Vrana
a7d475e3e7 MongoDB: Improve select 2014-01-08 23:14:37 -08:00
Jakub Vrana
39a68b9b14 Don't delete value if there's a problem with inline edit of a long field 2014-01-08 23:06:53 -08:00
Jakub Vrana
c8305c4cf5 Fix inline edit of long uncovert_field() fields 2014-01-08 22:39:49 -08:00
Jakub Vrana
5f3f208bc4 Document changes 2014-01-08 09:17:30 -08:00
Vladimír Kriška
dc4485f0a9 MongoDB: show value of _id field instead of class name 2014-01-08 09:15:23 -08:00
Vladimír Kriška
7d83d0ecb9 MongoDB: implemented function count_tables() 2014-01-08 09:12:57 -08:00
Jakub Vrana
683f6eefc7 Don't use type=number if a SQL function is used 2014-01-08 09:07:58 -08:00
Jakub Vrana
5444647f61 Don't shorten $http_response_header 2014-01-08 08:45:19 -08:00
Jakub Vrana
184273750a Include JUSH textarea in compiled single driver file 2014-01-07 23:58:52 -08:00
Jakub Vrana
1fdfc407d1 Release 2014-01-07 23:20:08 -08:00
Jakub Vrana
2faeccc3ff Fix trailing newline in IE textarea 2014-01-07 21:34:49 -08:00
Jakub Vrana
47fc034746 Mark auto_increment fields in edit 2014-01-07 13:16:03 -08:00
Jakub Vrana
8829a8e808 Use international word for experimental drivers 2014-01-07 13:13:26 -08:00
Jakub Vrana
b9d9f3c7bc Use JsShrink compatible with JUSH 2014-01-07 13:13:26 -08:00
Jakub Vrana
9995e35659 Update JUSH 2014-01-07 13:03:48 -08:00
Peter Dave Hello
f44c8fedf7 Improve & fix Traditional Chinese (Taiwan) translation 2013-12-31 19:04:10 -08:00
Jakub Vrana
2867a3f10d Fix tests 2013-12-22 06:56:13 -08:00
Jakub Vrana
49f4ef5c52 Use the same order in tables list and tables status 2013-12-20 19:18:19 -08:00
Matej Humpal
8f79244220 Do not display SQL icon in PostgreSQL header breadcrumbs 2013-12-20 19:01:24 -08:00
Jakub Vrana
1de6fed32a PostgreSQL: Allow escaped table name in foreign key (bug #333) 2013-12-20 18:43:14 -08:00
Jakub Vrana
e72495e4de Allow editing single value enums (bug #334) 2013-12-20 18:02:56 -08:00
Jakub Vrana
8c8f659028 Don't reset column when searching for an empty value with Enter 2013-12-20 17:42:43 -08:00
Colin Mollenhour
df8fce2bf9 Fix first column values not visible in design/pokorny 2013-12-20 17:13:45 -08:00
Jakub Vrana
650f61cac1 Respect 'whole result' even if some rows are checked (bug #339) 2013-12-20 17:07:46 -08:00
Jakub Vrana
64af68a30b Support triggers on views 2013-12-20 16:30:22 -08:00
Jakub Vrana
7d330a2d4b SQLite: Allow working with INSTEAD OF triggers 2013-12-20 16:12:42 -08:00
Jakub Vrana
f4d2794c9c SQLite: Search trigger name only among triggers 2013-12-20 16:12:26 -08:00
Jakub Vrana
8cd4f6e225 Mark Elastic and Mongo drivers as experimental 2013-12-20 16:07:31 -08:00
Jakub Vrana
0c710f65d4 Add missing doc comment 2013-12-20 15:47:01 -08:00
Jakub Vrana
3d0605a8e7 Handle exception when creating SQLite database 2013-12-20 15:37:39 -08:00
Jannis R
17c8dea525 Improve German translation
`Motor` isn't a very useful translation of `engine` (`Motor`is the engine of a car). `Speicher-Engine`, as written [here](http://dev.mysql.com/doc/refman/5.1/de/storage-engines.html), is a better translation.
2013-12-20 15:18:28 -08:00
Jakub Vrana
3aca451f26 Add Portugal Portuguese translation 2013-12-20 15:06:50 -08:00
Jakub Vrana
da21494a52 Allow spaces between privileges (fixes gh-67) 2013-12-20 14:10:26 -08:00
urn2
7aa1428d71 Fix chinese translation 2013-12-20 14:02:24 -08:00
Jakub Vrana
45540fdae9 Fix processing length without () 2013-12-19 18:35:30 -08:00
Jakub Vrana
a41ee665e9 Move function used in Editor 2013-12-19 12:55:53 -08:00
Jakub Vrana
abbacd4377 Improve message for saving by AJAX 2013-12-19 12:55:02 -08:00
Jakub Vrana
e71e4ccb4c Syntax highlight just the new message 2013-12-19 12:39:03 -08:00
Jakub Vrana
2c8d81c1ae Include JUSH in the compiled version 2013-12-19 12:34:15 -08:00
Jakub Vrana
f41ffd9ee1 Open external links to a new window 2013-12-19 09:31:37 -08:00
Jakub Vrana
61cdde0797 Don't execute external JavaScript when verifying version 2013-12-19 09:29:16 -08:00
Jakub Vrana
372a0e22a7 Fix saving permanent login 2013-10-24 22:40:05 -07:00
Jakub Vrana
9d2f3c8703 Add class name for results count 2013-10-24 22:26:25 -07:00
Jakub Vrana
f503d8130b Abstract schemas() 2013-10-24 22:16:24 -07:00
Jakub Vrana
8d9ef7afd2 Differentiate views in navigation (thanks to Petr Kobelka) 2013-10-24 22:04:57 -07:00
Jakub Vrana
bcbec6871f Remove ellipsis (hiding text in Firefox, showing bubbles in Safari) 2013-10-24 19:31:31 -07:00
Jakub Vrana
cfe76ffaf0 Hide Logout button on login screen 2013-10-24 19:12:53 -07:00
Jakub Vrana
a564bba261 Protect CSRF token against BREACH 2013-10-24 19:10:50 -07:00
Jakub Vrana
31abc08df8 Fix grammar in slogan 2013-09-10 11:40:35 -07:00
Jakub Vrana
dd885e1d3a Fix Thai translation 2013-09-04 08:44:19 -07:00
amdev
f757128dd9 Add Thai language 2013-09-04 08:41:17 -07:00
amdev
f3e7bf849a Thai language for Adminer 2013-09-04 08:35:40 -07:00
passkeykz
b021664203 Correct translation ru.inc.php 2013-08-28 08:56:00 -07:00
Jakub Vrana
3736f2229f SQLite: Read information about collation 2013-08-28 08:54:23 -07:00
Jakub Vrana
c1b9a9a46c SQLite: Don't mark multi-column primary key as auto_increment 2013-08-28 08:40:09 -07:00
Jakub Vrana
994fa4f1ea Save bytes 2013-08-11 09:29:41 -07:00
Jakub Vrana
6160604023 Encrypt passwords stored in session by a key stored in cookie (thanks to Michal Spacek) 2013-08-11 09:26:18 -07:00
Jakub Vrana
1bdb65c4dc Save bytes 2013-08-10 19:21:23 -07:00
Jakub Vrana
c0fe3a6ff7 Prepare for crypting passwords stored in session 2013-08-10 19:21:18 -07:00
Jakub Vrana
37c97a18ca Editor: Support permanent login in other drivers 2013-08-10 18:57:12 -07:00
Jakub Vrana
4f7bffd771 SimpleDB: Allow changing itemName() 2013-08-09 17:16:06 -07:00
Jakub Vrana
fb886bda4c SimpleDB: Allow cloning 2013-08-09 17:07:00 -07:00
Jakub Vrana
657191eed8 Unselect original function on key up 2013-08-09 17:00:05 -07:00
Jakub Vrana
3f47f63c61 SimpleDB: Allow inserting JSON 2013-08-09 16:26:51 -07:00
Jakub Vrana
6317c7737d NoSQL: Allow editing complex values 2013-08-09 15:49:34 -07:00
Jakub Vrana
8a1b8910c1 SQLite: Allow editing foreign keys 2013-08-09 15:16:15 -07:00
Jakub Vrana
62e582456e Save bytes 2013-08-08 19:36:15 -07:00
Jakub Vrana
1dcde25561 SQLite: Don't overwrite first type by unknown type 2013-08-08 19:34:40 -07:00
Jakub Vrana
804fb36faa Save bytes 2013-08-08 19:29:10 -07:00
Jakub Vrana
390d10284d Respect foreign key pseudo type after error 2013-08-08 19:28:05 -07:00
Jakub Vrana
145a8c62ff SQLite: Fix primary key handling 2013-08-08 19:20:27 -07:00
Jakub Vrana
f6e24b1646 SQLite: Detect auto_increment primary key 2013-08-08 19:09:43 -07:00
Jakub Vrana
bc725959e6 SQLite: Fix changing primary key 2013-08-08 19:07:18 -07:00
Jakub Vrana
7aca91a808 Save bytes 2013-08-08 18:18:19 -07:00
Jakub Vrana
28856804a4 Simplify format_time() 2013-08-08 17:20:18 -07:00
Jakub Vrana
85d212c226 Use PHP 5 2013-08-08 17:20:14 -07:00
Jakub Vrana
961ec0b857 Simplify OS detection 2013-08-08 17:09:09 -07:00
Jakub Vrana
facd49a195 Specify quoting charset in PDO_MySQL 2013-08-08 17:06:51 -07:00
Jakub Vrana
faabb9ef38 Simplify exception handling in PHP 5 2013-08-08 16:44:39 -07:00
Jakub Vrana
9fdcff3c1c Elastic: Report number of rows 2013-08-08 16:02:23 -07:00
Jakub Vrana
e411291537 Increase readability 2013-08-08 16:01:49 -07:00
Jakub Vrana
21cc6ceb59 Elastic: Use select() instead of SELECT 2013-08-08 16:01:29 -07:00
Jakub Vrana
6664b0fb7e SQLite: Allow editing primary key 2013-08-08 15:32:36 -07:00
Jakub Vrana
4e22af6de0 Add missing space in query 2013-08-08 14:50:43 -07:00
Jakub Vrana
646fb067ca MongoDB: database list, table list, indexes, basic select 2013-08-08 13:54:06 -07:00
Jakub Vrana
e85aff166f Elastic: Prepare for better selecting 2013-08-08 13:54:06 -07:00
Jakub Vrana
114aaec91e SQLite: Respect column order and DESC in primary key
Also respect DESC indexes in altering table.
2013-08-08 13:52:23 -07:00
Jakub Vrana
33236f7a83 SQLite: Don't treat multi-column primary key as auto_increment 2013-08-08 13:52:23 -07:00
Jakub Vrana
2e245412dc PostgreSQL: Support creating array columns
Also allow () in length and IN.
2013-08-08 13:52:23 -07:00
Jakub Vrana
9ffca2f6e6 SimpleDB: Allow selecting arrays 2013-08-08 13:52:04 -07:00
Jakub Vrana
076a0a2634 Check default value on key press 2013-08-06 13:44:47 -07:00
Jakub Vrana
74f965df88 Link Auto Increment help 2013-08-05 19:23:31 -07:00
Jakub Vrana
e7e5559df5 Generalize doc_link() 2013-08-05 19:22:13 -07:00
Jakub Vrana
3cf3560a20 SQLite: Show primary key when altering indexes 2013-08-05 18:35:20 -07:00
Jakub Vrana
21dc4d939c Use MD5 for editing long keys only in supported drivers 2013-08-05 17:56:04 -07:00
Jakub Vrana
d92531c7fb Hide link to SQL command if not supported 2013-08-02 15:11:00 -07:00
Jakub Vrana
376384d98d Unify Create table label 2013-08-02 13:20:04 -07:00
Jakub Vrana
58bbea56cd Fit <pre> to <textarea> 2013-08-02 12:03:27 -07:00
Jakub Vrana
507b224c95 Split SQL command and import 2013-08-02 11:56:10 -07:00
Jakub Vrana
5e2afaba9f Generalize removeRow() 2013-08-02 10:07:20 -07:00
Jakub Vrana
9043c4b219 Use negative position instead of z-index to hide element 2013-08-01 18:32:02 -07:00
Jakub Vrana
e8c6ef04d2 Replace ereg*() by preg_*()
ereg() triggers deprecated error which is sent to custom error handlers.
It is also faster.
There are no more deprecated functions except mysql_connect().
2013-07-24 16:26:41 -07:00
Jakub Vrana
34349f1482 Revert Displaying SQL edit form on Ctrl+click on the select query 2013-07-24 13:00:37 -07:00
Jakub Vrana
cbd690dd71 Execute query by Tab + Enter 2013-07-24 12:57:12 -07:00
Jakub Vrana
5a0d56e910 Change focus by Tab in <textarea> 2013-07-23 18:41:38 -07:00
Jakub Vrana
e2ef558e5f Generalize JUSH URL rewriting 2013-07-23 18:14:32 -07:00
Jakub Vrana
07ba250939 Highlight submit for syntax highlighted textareas 2013-07-23 16:33:07 -07:00
Jakub Vrana
0d074077bb Don't use deprecated function 2013-07-23 12:55:32 -07:00
Jakub Vrana
e0ef072bd0 Keep form values after refresh in Firefox 2013-07-22 19:40:03 -07:00
Jakub Vrana
877f9cf360 Close help after changing type 2013-07-22 18:03:30 -07:00
Jakub Vrana
8f96e15296 Use specific JUSH version 2013-07-22 15:49:19 -07:00
Jakub Vrana
90b09fc60f Highlight code in <textarea> 2013-07-22 11:45:09 -07:00
Jakub Vrana
aef38b0530 Save bytes 2013-07-19 16:32:53 -07:00
Jakub Vrana
19b4148a37 Link collations help 2013-07-19 16:29:20 -07:00
Jakub Vrana
9a7805c318 Link types help 2013-07-19 16:24:59 -07:00
Jakub Vrana
e8e3c5789b Link foreign key constraints help 2013-07-19 16:01:31 -07:00
Jakub Vrana
39b5bd5fc4 Elastic: Allow only numeric limit 2013-07-19 14:15:46 -07:00
Jakub Vrana
c95be3adae Elastic: Shorten strings 2013-07-19 14:11:54 -07:00
Jakub Vrana
837e6b6b31 Elastic: Hide select functions 2013-07-19 14:11:54 -07:00
Jakub Vrana
6e839eddbb Elastic: Respect limit, page, order, select and first where 2013-07-19 14:11:44 -07:00
Jakub Vrana
9e2592f35f Ignore mousing over border of select 2013-07-19 13:04:14 -07:00
Jakub Vrana
32ff363ee3 Stay on privileges page when changing database 2013-07-19 12:51:34 -07:00
Jakub Vrana
0be7532b70 Link help of partitioning types 2013-07-19 12:37:12 -07:00
Jakub Vrana
3b3d169c72 Display help for functions and MySQL engines 2013-07-19 11:56:45 -07:00
Jakub Vrana
f8453fe65c Introduce getTarget(event) 2013-07-19 10:41:06 -07:00
Jakub Vrana
a338f9bf58 Display help in tooltip
Also rename Analyze to Vacuum outside MySQL
2013-07-19 10:35:31 -07:00
Jakub Vrana
b8ece2fb5d Don't crash when parsing overly long enum type 2013-07-18 13:28:35 -07:00
Jakub Vrana
6f6f69a891 Add links to documentation 2013-07-16 21:17:09 -07:00
Jakub Vrana
ddd5c7586b Update readme 2013-07-16 08:32:03 -07:00
Jakub Vrana
dec121d455 Save by Enter key when altering a routine 2013-07-15 10:13:41 -07:00
Jakub Vrana
10c7c4eb93 Don't change colors of JUSH links on hover 2013-07-15 09:15:10 -07:00
Jakub Vrana
feeda916f7 Don't append newlines to uploaded files 2013-07-13 18:36:27 -07:00
Jakub Vrana
ffb2b5e80c Fix whitespace 2013-07-13 11:23:43 -07:00
Jakub Vrana
9b32d638bb Use isTag() JS function 2013-07-12 14:06:44 -07:00
Jakub Vrana
be6b7c6cac Allow using json_row() in HTML 2013-07-12 11:12:57 -07:00
Jakub Vrana
352f29804e SimpleDB: Disable searching database 2013-07-12 10:39:52 -07:00
Jakub Vrana
127b3f6154 SimpleDB: Display overflown table names 2013-07-12 08:33:13 -07:00
Jakub Vrana
75439423d9 SimpleDB: Disable searching database 2013-07-12 08:17:26 -07:00
Jakub Vrana
af4269f26d Remove number of selected rows from confirmation 2013-07-12 08:17:26 -07:00
Jakub Vrana
e1ad0e4f39 Display number of selected databases 2013-07-12 08:17:26 -07:00
Jakub Vrana
5328619593 Format numbers in JS 2013-07-12 08:17:26 -07:00
Jakub Vrana
36d839cf28 Mark approximate number of selected rows 2013-07-12 08:17:26 -07:00
Jakub Vrana
166a2f67f8 Disable inactive buttons 2013-07-12 08:17:26 -07:00
Jakub Vrana
999215a7e9 Fix duplicate class in partitions 2013-07-11 11:20:04 -07:00
Jakub Vrana
0ec2fbb4d4 Use alterClass() 2013-07-11 11:20:04 -07:00
Jakub Vrana
4d7c675cab Highlight required fields in Chrome and after submit 2013-07-11 11:20:04 -07:00
Jakub Vrana
bbc2c6a9da Fix Enter key on indexes 2013-07-11 11:20:04 -07:00
Jakub Vrana
73225975d7 Display number of tables to search in 2013-07-11 11:20:03 -07:00
Jakub Vrana
491cdefc84 Display number of rows to export 2013-07-11 11:20:03 -07:00
Jakub Vrana
9ab32bdb3c Put SQL command and Dump on a single line 2013-07-11 11:20:03 -07:00
Jakub Vrana
20285c4550 Add editing row after writing first character 2013-07-11 11:20:03 -07:00
Jakub Vrana
07db5e0bfb Style icon in create database 2013-07-11 11:20:03 -07:00
Jakub Vrana
b788a9e69b Prepare Elasticsearch 2013-07-11 11:19:59 -07:00
Jakub Vrana
fc427f4f3a Add more class="links" 2013-07-09 16:44:00 -07:00
Jakub Vrana
e80754a191 Save bytes 2013-07-09 16:37:10 -07:00
Jakub Vrana
89b366bc1b Display number of selected tables in database overview 2013-07-09 12:06:53 -07:00
Jakub Vrana
7a1133a2fd Generalize transactions 2013-07-09 11:43:01 -07:00
Jakub Vrana
56b0917acd Improve speed of CSV import 2013-07-09 11:36:00 -07:00
Jakub Vrana
9de402aaf0 Prepare for multi insertUpdate() 2013-07-09 11:01:21 -07:00
Jakub Vrana
e5dad4ade2 SimpleDB: Implement insertUpdate() 2013-07-09 10:57:07 -07:00
Jakub Vrana
c1b0ecda3e SimpleDB: Handle XML error 2013-07-09 10:54:54 -07:00
Jakub Vrana
c6b4f2e1d3 SimpleDB: Compute number of affected rows 2013-07-09 10:54:54 -07:00
Jakub Vrana
1060a3f9eb Move SimpleDB fields computation 2013-07-09 10:54:54 -07:00
Jakub Vrana
d17b17e515 Driver for SimpleDB 2013-07-09 10:54:43 -07:00
Jakub Vrana
b7739dc0bd Abstract UPDATE 2013-07-09 10:34:52 -07:00
Jakub Vrana
1f7fa44923 Abstract DELETE, INSERT and INSERT+UPDATE 2013-07-09 10:34:52 -07:00
Jakub Vrana
5557adf289 Use colors in icons 2013-07-09 00:40:41 -07:00
Jakub Vrana
ab80a40269 Fix JS error in trCheck() on DB overview 2013-07-09 00:34:34 -07:00
Jakub Vrana
c3b3572d83 Make import link obvious 2013-07-09 00:34:34 -07:00
Jakub Vrana
406bc96cec Merge DB links 2013-07-09 00:34:33 -07:00
Jakub Vrana
340a1c2c2f Disable underlining links 2013-07-09 00:34:33 -07:00
Jakub Vrana
ffc1fa000f Move logout button 2013-07-09 00:34:25 -07:00
Jakub Vrana
c2a3bec036 Display number of selected rows 2013-07-08 15:27:53 -07:00
Jakub Vrana
10f500dfea Split actions for modified and selected rows 2013-07-08 15:12:17 -07:00
Jakub Vrana
19c4890018 Fix JS error with no found rows 2013-07-08 10:55:13 -07:00
Jakub Vrana
219a3c51c8 Require length when changing type from char to varchar 2013-07-08 10:23:49 -07:00
Jakub Vrana
4285d73bbc Don't select FULLTEXT index by default (regression from Adminer 3.7.1) 2013-07-06 23:59:02 -07:00
Jakub Vrana
5f9069cc1b Unhighlight default button after canceling inline edit 2013-07-06 23:53:03 -07:00
Jakub Vrana
22b0a85acf Ignore lengths in adding new index 2013-07-06 23:42:37 -07:00
Jakub Vrana
7c109ba274 Move button for adding an index 2013-07-06 23:42:04 -07:00
Jakub Vrana
1a0ba88f8d Add button for dropping an index 2013-07-06 23:35:26 -07:00
Jakub Vrana
2f1b337d9e Add label to database selection 2013-07-06 23:12:12 -07:00
Jakub Vrana
e7c79f8725 Mark length as required for strings
Uses <input formnovalidate> instead of <form novalidate> to highlight error fields.
2013-07-06 23:06:50 -07:00
Jakub Vrana
04a36e9af9 Add a new column in alter table on key press 2013-07-06 22:49:39 -07:00
Jakub Vrana
6a551c2d73 Update Polish translation (thanks to @srsbiz) 2013-07-06 14:47:36 -07:00
Jakub Vrana
48356d8d4f Rename variable 2013-07-05 08:28:37 -07:00
Jakub Vrana
f4addc5259 Avoid double escaping in second page title 2013-07-05 01:34:15 -07:00
Jakub Vrana
679e818fca Avoid double escaping in breadcrumbs 2013-07-04 21:07:52 -07:00
Jakub Vrana
063ddcced5 Fix counting rows with grouping outside MySQL 2013-07-03 18:40:55 -07:00
Jakub Vrana
4a6b289c8e Respect grouping in computing last page 2013-07-03 18:14:32 -07:00
Jakub Vrana
bc2001a939 Fix comment 2013-07-03 17:28:53 -07:00
Jakub Vrana
273712ad72 Save bytes 2013-07-03 14:52:11 -07:00
Jakub Vrana
6948350552 Use drop_tables() 2013-07-03 12:32:52 -07:00
Jakub Vrana
1aa3144d05 Use stricter regexp in URL 2013-07-03 10:34:19 -07:00
Jakub Vrana
9bfc2a311c Fix comment 2013-07-03 10:32:31 -07:00
Jakub Vrana
877d9ba5ce PostgreSQL: Fix handling of nextval() default values (thanks to @ujovlado) 2013-07-02 09:20:06 -07:00
Jakub Vrana
749f51afe6 Save and continue edit by AJAX 2013-06-29 12:41:35 -07:00
Jakub Vrana
ba1bb263b3 Release 3.7.1 2013-06-29 08:26:37 -07:00
Jakub Vrana
82a63f335b SQLite: Load information about descending indexes 2013-06-25 15:28:57 -07:00
Jakub Vrana
50d2054e36 PostgreSQL: Properly mark ascending index columns 2013-06-25 15:01:38 -07:00
Jakub Vrana
13f34d1ea9 Highlight table being altered in navigation 2013-06-25 10:12:10 -07:00
Jakub Vrana
2cf2021995 Open schema to new tab on Ctrl+click 2013-06-25 09:58:08 -07:00
Jakub Vrana
5f370927f1 Descending indexes 2013-06-25 09:42:47 -07:00
Jakub Vrana
c8248bb19c Allow changing PostgreSQL indexes with same name 2013-06-24 17:54:04 -07:00
Jakub Vrana
3a8191b7ac SQLite: Preselect index type after adding a column 2013-06-24 10:04:59 -07:00
Jakub Vrana
7dd454f0b4 Allow changing SQLite indexes with same name 2013-06-24 10:04:07 -07:00
Jakub Vrana
e51640eb98 Display error on invalid alter table and view pages 2013-06-24 09:08:26 -07:00
Jakub Vrana
2e32bf1f97 Suggest using adminer.sql 2013-06-24 06:12:13 -07:00
Jakub Vrana
27c7a218bd Save bytes 2013-06-24 05:53:48 -07:00
Jakub Vrana
2e4a7121a9 Fix title and links on invalid table pages 2013-06-24 05:53:23 -07:00
Jakub Vrana
81e134f872 Send 404 for invalid database and schema 2013-06-24 05:43:13 -07:00
Jakub Vrana
e680d22023 Avoid fatal in PostgreSQL without implemented database()
https://sourceforge.net/p/adminer/discussion/1095138/thread/5e29e380/
2013-06-13 07:46:12 +02:00
Jakub Vrana
aae2289095 Simplify translation 2013-06-11 14:56:54 +02:00
Jakub Vrana
4660ff852c Suggest that Import is available in SQL command 2013-06-11 11:03:17 +02:00
Jakub Vrana
f29a7cb140 Notify user about expired master password for permanent login 2013-06-11 11:02:17 +02:00
Jakub Vrana
64297aea60 Add design from https://gist.github.com/pappu687/5589922 2013-06-05 18:45:33 -07:00
Jakub Vrana
41cde565d5 Fix tests 2013-06-05 18:44:06 -07:00
Jakub Vrana
e80eb058e9 Support &null[]=F(c) 2013-06-04 19:42:46 -07:00
Jakub Vrana
7dd90f56f1 MySQL: Speed up updating rows without numeric or UTF-8 primary key 2013-06-04 19:40:17 -07:00
Jakub Vrana
8e0ead4678 Verify UTF-8 encoding of CSV import 2013-06-03 14:57:26 -07:00
Jakub Vrana
c05e332ca3 Sort languages 2013-06-03 10:00:16 -07:00
Jakub Vrana
717f4535a9 Fix Korean date format and hint 2013-06-03 09:46:55 -07:00
Jakub Vrana
d100a1ed9a Fix Korean translation identifiers 2013-06-03 09:24:30 -07:00
dalli
21756c492a Add Korean translation 2013-06-03 09:23:58 -07:00
Jakub Vrana
26ad18bab2 Avoid duplicate values of HTML id attributes (bug #3614245)
Unsupports <label> in IE6.
2013-06-03 08:56:18 -07:00
Jakub Vrana
e04be3a996 Handle timestamp PostgreSQL types (bug #3614086) 2013-05-29 17:24:27 -07:00
Jakub Vrana
0869ff02c6 Stricter check 2013-05-28 11:23:48 -07:00
Jakub Vrana
1dc9044ff4 Order table list by name (bug #3613974) 2013-05-28 11:14:15 -07:00
Jakub Vrana
5eb3eaa06e Add Bzip2 export plugin 2013-05-28 10:28:47 -07:00
Jakub Vrana
55c494b767 Don't use LIMIT 1 if inline updating unique row 2013-05-24 13:38:54 -07:00
Jakub Vrana
005c963e2d Fix detecting oid column in PDO_PGSQL 2013-05-23 21:05:45 -07:00
Jakub Vrana
2c381345b4 Use variable instead of literal value 2013-05-23 18:31:48 -07:00
Jakub Vrana
15e698d302 Order PostgreSQL table list by name 2013-05-23 09:22:12 -07:00
Jakub Vrana
7be9d5c7ca Simplify box-shadow 2013-05-20 10:58:06 -07:00
Jakub Vrana
2dfe2640db Don't highlight rows in uncheckable tables 2013-05-20 10:14:04 -07:00
Jakub Vrana
68aba96c72 Increase click target for checkboxes (thanks to Roman) 2013-05-20 10:13:54 -07:00
Jakub Vrana
bf94b88503 Use shadow for highlighting default button (thanks to srigi) 2013-05-20 09:13:06 -07:00
Jakub Vrana
b51d4ab105 Release 3.7.0 2013-05-19 20:37:27 -07:00
Jakub Vrana
fabfb8a0bc Get number of rows on export page asynchronously 2013-05-17 17:40:08 -07:00
Jakub Vrana
5a4d1b3704 Add server placeholder to login form 2013-05-17 14:08:15 -07:00
Jakub Vrana
982974fe27 Use ALTER VIEW and don't use temporary object if changing name 2013-05-13 11:12:28 -07:00
Jakub Vrana
3ed0ce926c Fix table links for existing but invalid views 2013-05-13 10:12:13 -07:00
Jakub Vrana
65fae98558 Don't rely on 't' and 'f' PostgreSQL boolean return values
https://sourceforge.net/projects/adminer/forums/forum/1095138/topic/8119905
2013-05-13 08:40:06 -07:00
Jakub Vrana
af30f59737 Don't use LIMIT 1 if updating unique row (bug #3613109) 2013-05-11 13:05:40 -07:00
Jakub Vrana
2f996ba014 Restrict editing rows without unique identifier to search results 2013-05-11 12:47:04 -07:00
Jakub Vrana
b7e0f1d81c Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4 (thanks to Coudy) 2013-05-11 08:02:28 -07:00
Jakub Vrana
20915b1764 Save bytes 2013-05-08 12:13:04 -07:00
Jakub Vrana
516416e72b Fix tables list in Editor 2013-05-08 11:58:21 -07:00
Jakub Vrana
c38655418b Simplify process_fields() 2013-05-08 11:43:53 -07:00
Jakub Vrana
046da00eb6 Strip trailing spaces 2013-05-08 11:29:19 -07:00
Jakub Vrana
22f0a5ded8 Display navigation bellow main content on mobile browsers 2013-05-08 11:27:20 -07:00
Jakub Vrana
6a41240c42 Move common function 2013-05-08 10:46:16 -07:00
Jakub Vrana
a09916737e Simplify initializing post variables 2013-05-08 08:54:26 -07:00
Jakub Vrana
e99463b295 Don't drop original view and routine before creating the new one 2013-05-08 07:55:08 -07:00
Jakub Vrana
b7021c9c7f Highlight default submit button 2013-05-06 09:27:35 -07:00
Jakub Vrana
94a0cc8de8 Fix resetting search (bug #3612507) 2013-05-03 18:53:13 -07:00
Jakub Vrana
9c78b3bb34 Add empty lines to source code 2013-05-01 18:28:04 -07:00
Jakub Vrana
0e6003e833 Send export headers sooner 2013-05-01 09:44:07 -07:00
Jakub Vrana
601cdd43c1 Constraint memory used in TAR export 2013-05-01 09:33:23 -07:00
Jakub Vrana
17a8495c2e Display logout button in Nette design. 2013-04-30 12:02:02 -07:00
Jakub Vrana
40c61f6cfc Reduce memory used by TAR export 2013-04-29 15:45:15 -07:00
Jakub Vrana
63c400f95d Allow exporting views dependent on each other (bug #3459151) 2013-04-29 15:42:39 -07:00
Jakub Vrana
34adf46293 Export SQLite views 2013-04-29 15:37:50 -07:00
Jakub Vrana
1ecdde0500 Remove bzip2 compression support
It didn't work for exports bigger than 1 MB.
An alternative would be to remove the limit from output buffer which would need memory for the whole export.
Another alternative would be to create a temporary file in output handler and bzwrite() to this file - that would work but it's complicated, especially if we want to output the file progressively - bzopen($tmp, 'w'), fopen($tmp, 'r').
2013-04-29 15:37:33 -07:00
Jakub Vrana
7f05141b89 Save memory in get_file() 2013-04-28 08:17:50 -07:00
Jakub Vrana
d513de4d71 Allow using lang() in plugins 2013-04-28 08:17:40 -07:00
Jakub Vrana
18d51c6b6e Allow using lang() in plugin with single language Adminer version 2013-04-27 23:36:43 -07:00
Jakub Vrana
5eda7e547f Add anchors to database and table sections to allow linking 2013-04-27 23:17:07 -07:00
Jakub Vrana
f7e671448c Select only required routine columns (possible fix for bug #3515776) 2013-04-27 13:04:54 -07:00
Jakub Vrana
d97ae22fb4 Properly unescape apostrophe in column name 2013-04-26 23:25:35 -07:00
Jakub Vrana
49c1484722 Display bit default value same as existing values 2013-04-26 23:21:09 -07:00
Jakub Vrana
7541ceb1ca Improve export of binary data types (bug #3526494) 2013-04-26 22:57:44 -07:00
Jakub Vrana
2afd915f00 Save bytes 2013-04-26 22:22:38 -07:00
Jakub Vrana
5a0be7e7fe Convert fields with selected columns 2013-04-26 22:20:04 -07:00
Jakub Vrana
de2c3968d4 Display bit type as binary number, also fix bit outside MySQLnd 2013-04-26 22:20:03 -07:00
Jakub Vrana
e24d1fcb02 Optimize table_status() 2013-04-26 22:19:54 -07:00
Jakub Vrana
3cae3e2f7f Fix LIKE backslash escaping 2013-04-26 19:34:15 -07:00
Jakub Vrana
fd5e6ef343 Use standard view detection in schema 2013-04-26 19:34:15 -07:00
Jakub Vrana
8ae8507972 Save bytes 2013-04-26 19:34:03 -07:00
Jakub Vrana
b0b4cb1576 Allow more SQL files to be uploaded at the same time (thanks to Frantisek Svoboda) 2013-04-26 13:26:08 -07:00
Jakub Vrana
ada8917e43 Rename = edit operator to SQL 2013-04-26 12:20:47 -07:00
Jakub Vrana
e287642e26 Rename empty select operator to SQL 2013-04-26 12:20:17 -07:00
Jakub Vrana
4858f332c8 Disable SQL export when applying functions in select 2013-04-26 11:57:21 -07:00
Jakub Vrana
91dbaca3c4 Don't export binary and geometry columns twice in select 2013-04-26 11:52:26 -07:00
Jakub Vrana
741cd5b4b6 Fix handling of POINT data type (bug #3582578) 2013-04-26 11:42:18 -07:00
Étienne Deparis
0f47ae8e0f Update Nette design 2013-04-26 10:54:16 -07:00
Jakub Vrana
01a2722c94 Print run time next to executed queries 2013-04-25 23:41:46 -07:00
Jakub Vrana
3bc5c17d03 Develop 2013-04-25 19:00:37 -07:00
Jakub Vrana
a199998f54 Fix documentation comment 2013-04-25 18:19:27 -07:00
Jakub Vrana
c4040f03d9 Release 3.6.4 2013-04-25 17:53:50 -07:00
Jakub Vrana
db7d05b3ec Allow storing empty user password 2013-04-25 09:46:37 -07:00
Jakub Vrana
3d07d8bbd8 Display approx. number of last page in select 2013-04-24 21:22:30 -07:00
Jakub Vrana
bcd1e059f5 Delete Last page link from Editor 2013-04-24 21:16:54 -07:00
Jakub Vrana
0eadfc2b3f Do not store plain text password to history in creating user 2013-04-24 19:04:17 -07:00
Jakub Vrana
c270a06fb1 Fix unsetting permanent login after logout 2013-04-24 18:27:18 -07:00
Jakub Vrana
2b58ebe327 Compensate menuOver() for ellipsis 2013-04-23 17:12:48 -07:00
Jakub Vrana
a72347f3c7 Rename Edit link to Clone in processlist 2013-04-22 13:48:39 -07:00
Étienne Deparis
6f58f5af44 Update Nette admine.css
Fix glitches around #breadcrumb while scrolling.
2013-04-17 21:39:29 -07:00
EauLand
6bdfec0a1a Update fr.inc.php
Replace "sauvegarder" by "enregistrer"
Reduce strings to see all sentence
2013-04-17 21:26:34 -07:00
Jakub Vrana
93f581175f Update test format 2013-04-17 18:02:52 -07:00
Jakub Vrana
971c51783f Fix test 2013-04-17 18:01:40 -07:00
Jakub Vrana
ba5e7a1b53 Link processlist documentation 2013-04-17 17:57:14 -07:00
Jakub Vrana
46a7e7eea0 Selectable ON UPDATE CURRENT_TIMESTAMP field in create table 2013-04-17 09:41:58 -07:00
Jakub Vrana
7af362554a Respect global errors in dump 2013-04-17 08:48:59 -07:00
Jakub Vrana
a8947b62b8 Avoid using same id="" in more messages 2013-04-16 17:53:53 -07:00
Jakub Vrana
37adf537c9 Respect checked tables in export filename (bug #3245464) 2013-04-16 10:37:10 -07:00
Jakub Vrana
e8e95e5fd7 Display SQL history from oldest 2013-04-16 09:50:32 -07:00
Jakub Vrana
285afc202a Increase default select limit to 50 2013-04-15 14:45:49 -07:00
Jakub Vrana
8cce005b70 Increase limit for using MD5 in select 2013-04-12 09:08:44 -07:00
Jakub Vrana
433357f824 Use numeric time zone in export (thanks to Martin Dzubak) 2013-04-11 10:12:53 -07:00
Jakub Vrana
d97300dd5a MSSQL: Don't seek to top (bug #3610309) 2013-04-11 09:37:55 -07:00
Jakub Vrana
99221f3265 Display help cursor over documentation links 2013-04-11 09:37:55 -07:00
Jakub Vrana
fee31e73c1 Display help cursor over documentation links 2013-04-04 18:45:54 -07:00
Jakub Vrana
2c626c7fc7 Explain partitions in SQL query (bug #3600150) 2013-04-04 18:40:49 -07:00
Jakub Vrana
3093f58157 Clear column name after resetting search (bug #3601200) 2013-04-04 18:32:05 -07:00
Jakub Vrana
1a1b800b40 Edit select SQL query on Ctrl+click 2013-04-04 18:15:18 -07:00
Jakub Vrana
e4d5835dab Open database to a new window after selecting it with Ctrl 2013-04-04 10:35:15 -07:00
Jakub Vrana
aba9d23ba2 Move comment 2013-04-04 09:44:48 -07:00
Jakub Vrana
190812456f Move ALTER export to plugin 2013-04-04 09:42:02 -07:00
Jakub Vrana
58a8df7c86 Export SQLite indexes (bug #3609741) 2013-04-03 10:46:51 -07:00
Jakub Vrana
cb57afd0e5 Handle empty integer values in SQLite export 2013-04-03 10:41:14 -07:00
Jakub Vrana
b14a2a5330 Revert "Order by auto_increment column by default"
This reverts commit 79b61855e5.
2013-04-03 10:41:05 -07:00
Jakub Vrana
0cd85c1ce9 Plugin for displaying JSON data 2013-04-02 18:49:32 -07:00
Jakub Vrana
c69d9fcfdf Delete confusing link to the last page 2013-04-02 18:40:07 -07:00
Jakub Vrana
5739e03e97 Display pagination on a fixed position 2013-04-02 18:35:23 -07:00
Jakub Vrana
79b61855e5 Order by auto_increment column by default 2013-04-02 18:15:35 -07:00
Jakub Vrana
7769cab32c Handle max_input_vars and generalize Suhosin compatibility 2013-04-02 18:14:27 -07:00
Jakub Vrana
f3920f381d Use ellipsis in overflowed texts 2013-04-01 18:03:58 -07:00
Jakub Vrana
f697486884 Revert indeterminate checkbox state 2013-04-01 17:57:08 -07:00
Jakub Vrana
5d68a29b3e Open full edit SQL with Ctrl 2013-04-01 11:22:20 -07:00
Jakub Vrana
e531d6ef41 Don't convert columns which are not selected 2013-03-27 21:11:46 -07:00
Jakub Vrana
a38ea926f2 Use class_exists() instead of extension_loaded() for checking SQLite
https://sourceforge.net/projects/adminer/forums/forum/1095138/topic/6780041
2013-03-27 21:11:14 -07:00
Pavel Sedlák
5b36472a45 Remove unused external/CodeMirror2 dir 2013-03-27 10:16:09 -07:00
Jakub Vrana
e139f94561 Refresh database list after dropping database 2013-03-27 09:24:51 -07:00
Jakub Vrana
50528be5cb Jump to first page after deleting all records 2013-03-26 19:08:58 -07:00
Jakub Vrana
2323f433c4 Stay on the same page after deleting rows (bug #3605845) 2013-03-26 18:46:56 -07:00
Jakub Vrana
f43ef7b083 Allow loading more data with inline edit (bug #3605531) 2013-03-26 18:31:03 -07:00
Jakub Vrana
e1545065f0 Display select SQL edit form inline 2013-03-26 10:11:35 -07:00
Jakub Vrana
9a4b30a646 Add master-slave plugin 2013-02-22 04:23:06 -08:00
Jakub Vrana
2b2d6987ef Compatibility with MySQL 5.6 2013-02-20 03:40:20 -08:00
Jakub Vrana
356cadf2b2 Avoid variable collision 2013-02-19 16:46:29 -08:00
Jakub Vrana
8caa889635 Add iOS touch icon 2013-02-19 16:31:51 -08:00
Jakub Vrana
dd9167a101 JSON export plugin (http://forum.zdrojak.cz/?topic=808) 2013-02-07 19:04:36 -08:00
Jakub Vrana
34633a4e60 Separate link for altering event 2013-01-30 23:47:53 -08:00
Jakub Vrana
3d2b869f2e Add typehint to event fields 2013-01-30 23:47:53 -08:00
Jakub Vrana
737c2bdc0e Recover original view, trigger, routine if creating fails (bug #3601088) 2013-01-30 23:47:53 -08:00
Jakub Vrana
1e310977b6 Display information for processing no tables 2013-01-30 23:47:53 -08:00
Jakub Vrana
79fd0238b5 Indeterminate state of select all checkboxes 2013-01-30 23:47:53 -08:00
Jakub Vrana
f86cb5f837 Use autocapitalize="off" 2013-01-30 23:47:53 -08:00
Jakub Vrana
de0d3aca84 Allow editing rows without unique key and long text 2013-01-30 23:47:53 -08:00
Jakub Vrana
51b7104342 Allow editing function results 2013-01-30 23:47:52 -08:00
Jakub Vrana
15e83e9396 Fix displaying length of blob columns 2013-01-30 23:47:52 -08:00
Jakub Vrana
0448bd118c Add Nette design 2013-01-26 21:26:17 -08:00
216 changed files with 24602 additions and 6642 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,4 @@
/adminer/adminer.css
/adminer*.php
/editor*.php
/vendor/

16
.gitmodules vendored
View File

@@ -1,18 +1,6 @@
[submodule "jush"]
path = externals/jush
url = git://jush.git.sourceforge.net/gitroot/jush/jush
[submodule "tinymce"]
path = externals/tinymce
url = git://github.com/tinymce/tinymce.git
[submodule "jquery-ui"]
path = externals/jquery-ui
url = git://github.com/jquery/jquery-ui.git
[submodule "jquery-timepicker"]
path = externals/jquery-timepicker
url = git://github.com/trentrichardson/jQuery-Timepicker-Addon.git
[submodule "wymeditor"]
path = externals/wymeditor
url = git://github.com/wymeditor/wymeditor.git
url = git://github.com/vrana/jush
[submodule "JsShrink"]
path = externals/JsShrink
url = git://github.com/vrana/JsShrink.git
url = git://github.com/vrana/JsShrink

5
.travis.yml Normal file
View File

@@ -0,0 +1,5 @@
language: php
php:
- '5.6'
- '7.1'
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1

View File

@@ -1,8 +1,8 @@
<?php
$PROCEDURE = $_GET["call"];
$PROCEDURE = ($_GET["name"] ? $_GET["name"] : $_GET["call"]);
page_header(lang('Call') . ": " . h($PROCEDURE), $error);
$routine = routine($PROCEDURE, (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
$routine = routine($_GET["call"], (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
$in = array();
$out = array();
foreach ($routine["fields"] as $i => $field) {
@@ -28,23 +28,30 @@ if (!$error && $_POST) {
}
$call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
}
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($PROCEDURE) . "(" . implode(", ", $call) . ")";
echo "<p><code class='jush-$jush'>" . h($query) . "</code> <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>\n";
if (!$connection->multi_query($query)) {
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . table($PROCEDURE) . "(" . implode(", ", $call) . ")";
$start = microtime(true);
$result = $connection->multi_query($query);
$affected = $connection->affected_rows; // getting warnigns overwrites this
echo $adminer->selectQuery($query, $start, !$result);
if (!$result) {
echo "<p class='error'>" . error() . "\n";
} else {
$connection2 = connect();
if (is_object($connection2)) {
$connection2->select_db(DB);
}
do {
$result = $connection->store_result();
if (is_object($result)) {
select($result, $connection2);
} else {
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $affected) . "\n";
}
} while ($connection->next_result());
if ($out) {
select($connection->query("SELECT " . implode(", ", $out)));
}
@@ -55,7 +62,7 @@ if (!$error && $_POST) {
<form action="" method="post">
<?php
if ($in) {
echo "<table cellspacing='0'>\n";
echo "<table cellspacing='0' class='layout'>\n";
foreach ($in as $key) {
$field = $routine["fields"][$key];
$name = $field["field"];

View File

@@ -1,6 +1,9 @@
<?php
$TABLE = $_GET["create"];
$partition_by = array('HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY', 'RANGE', 'LIST');
$partition_by = array();
foreach (array('HASH', 'LINEAR HASH', 'KEY', 'LINEAR KEY', 'RANGE', 'LIST') as $key) {
$partition_by[$key] = $key;
}
$referencable_primary = referencable_primary($TABLE);
$foreign_keys = array();
@@ -9,39 +12,44 @@ foreach ($referencable_primary as $table_name => $field) {
}
$orig_fields = array();
$orig_status = array();
$table_status = array();
if ($TABLE != "") {
$orig_fields = fields($TABLE);
$orig_status = table_status($TABLE);
}
if ($_POST && !$_POST["fields"]) {
$_POST["fields"] = array();
$table_status = table_status($TABLE);
if (!$table_status) {
$error = lang('No tables.');
}
}
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) {
$row = $_POST;
$row["fields"] = (array) $row["fields"];
if ($row["auto_increment_col"]) {
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
}
if ($_POST) {
set_adminer_settings(array("comments" => $_POST["comments"], "defaults" => $_POST["defaults"]));
}
if ($_POST && !process_fields($row["fields"]) && !$error) {
if ($_POST["drop"]) {
query_redirect("DROP TABLE " . table($TABLE), substr(ME, 0, -1), lang('Table has been dropped.'));
queries_redirect(substr(ME, 0, -1), lang('Table has been dropped.'), drop_tables(array($TABLE)));
} else {
$fields = array();
$all_fields = array();
$use_all_fields = false;
$foreign = array();
ksort($_POST["fields"]);
$orig_field = reset($orig_fields);
$after = " FIRST";
foreach ($_POST["fields"] as $key => $field) {
foreach ($row["fields"] as $key => $field) {
$foreign_key = $foreign_keys[$field["type"]];
$type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
if ($field["field"] != "") {
if (!$field["has_default"]) {
$field["default"] = null;
}
$default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]);
if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0
$field["on_update"] = "CURRENT_TIMESTAMP";
$field["default"] = $default;
}
if ($key == $_POST["auto_increment_col"]) {
if ($key == $row["auto_increment_col"]) {
$field["auto_increment"] = true;
}
$process_field = process_field($field, $type_field);
@@ -53,7 +61,12 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
}
}
if ($foreign_key !== null) {
$foreign[idf_escape($field["field"])] = ($TABLE != "" && $jush != "sqlite" ? "ADD" : " ") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . table($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")" . (ereg("^($on_actions)\$", $field["on_delete"]) ? " ON DELETE $field[on_delete]" : "");
$foreign[idf_escape($field["field"])] = ($TABLE != "" && $jush != "sqlite" ? "ADD" : " ") . format_foreign_key(array(
'table' => $foreign_keys[$field["type"]],
'source' => array($field["field"]),
'target' => array($type_field["field"]),
'on_delete' => $field["on_delete"],
));
}
$after = " AFTER " . idf_escape($field["field"]);
} elseif ($field["orig"] != "") {
@@ -67,89 +80,79 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
}
}
}
$partitioning = "";
if (in_array($_POST["partition_by"], $partition_by)) {
if ($partition_by[$row["partition_by"]]) {
$partitions = array();
if ($_POST["partition_by"] == 'RANGE' || $_POST["partition_by"] == 'LIST') {
foreach (array_filter($_POST["partition_names"]) as $key => $val) {
$value = $_POST["partition_values"][$key];
$partitions[] = "\nPARTITION " . idf_escape($val) . " VALUES " . ($_POST["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
if ($row["partition_by"] == 'RANGE' || $row["partition_by"] == 'LIST') {
foreach (array_filter($row["partition_names"]) as $key => $val) {
$value = $row["partition_values"][$key];
$partitions[] = "\n PARTITION " . idf_escape($val) . " VALUES " . ($row["partition_by"] == 'RANGE' ? "LESS THAN" : "IN") . ($value != "" ? " ($value)" : " MAXVALUE"); //! SQL injection
}
}
$partitioning .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column
$partitioning .= "\nPARTITION BY $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
? " (" . implode(",", $partitions) . "\n)"
: ($_POST["partitions"] ? " PARTITIONS " . (+$_POST["partitions"]) : "")
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
);
} elseif (support("partitioning") && ereg("partitioned", $orig_status["Create_options"])) {
} elseif (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
$partitioning .= "\nREMOVE PARTITIONING";
}
$message = lang('Table has been altered.');
if ($TABLE == "") {
cookie("adminer_engine", $_POST["Engine"]);
cookie("adminer_engine", $row["Engine"]);
$message = lang('Table has been created.');
}
$name = trim($_POST["name"]);
queries_redirect(ME . "table=" . urlencode($name), $message, alter_table(
$name = trim($row["name"]);
queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table(
$TABLE,
$name,
($jush == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
$foreign,
$_POST["Comment"],
($_POST["Engine"] && $_POST["Engine"] != $orig_status["Engine"] ? $_POST["Engine"] : ""),
($_POST["Collation"] && $_POST["Collation"] != $orig_status["Collation"] ? $_POST["Collation"] : ""),
($_POST["Auto_increment"] != "" ? +$_POST["Auto_increment"] : ""),
($row["Comment"] != $table_status["Comment"] ? $row["Comment"] : null),
($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""),
($row["Collation"] && $row["Collation"] != $table_status["Collation"] ? $row["Collation"] : ""),
($row["Auto_increment"] != "" ? number($row["Auto_increment"]) : ""),
$partitioning
));
}
}
page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), $TABLE);
page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), h($TABLE));
$row = array(
"Engine" => $_COOKIE["adminer_engine"],
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")))),
"partition_names" => array(""),
);
if ($_POST) {
$row = $_POST;
if ($row["auto_increment_col"]) {
$row["fields"][$row["auto_increment_col"]]["auto_increment"] = true;
}
process_fields($row["fields"]);
} elseif ($TABLE != "") {
$row = $orig_status;
$row["name"] = $TABLE;
$row["fields"] = array();
if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids
$row["Auto_increment"] = "";
}
foreach ($orig_fields as $field) {
$field["has_default"] = isset($field["default"]);
if ($field["on_update"]) {
$field["default"] .= " ON UPDATE $field[on_update]"; // CURRENT_TIMESTAMP
if (!$_POST) {
$row = array(
"Engine" => $_COOKIE["adminer_engine"],
"fields" => array(array("field" => "", "type" => (isset($types["int"]) ? "int" : (isset($types["integer"]) ? "integer" : "")), "on_update" => "")),
"partition_names" => array(""),
);
if ($TABLE != "") {
$row = $table_status;
$row["name"] = $TABLE;
$row["fields"] = array();
if (!$_GET["auto_increment"]) { // don't prefill by original Auto_increment for the sake of performance and not reusing deleted ids
$row["Auto_increment"] = "";
}
$row["fields"][] = $field;
}
if (support("partitioning")) {
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
$row["partition_names"] = array();
$row["partition_values"] = array();
foreach (get_rows("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION") as $row1) {
$row["partition_names"][] = $row1["PARTITION_NAME"];
$row["partition_values"][] = $row1["PARTITION_DESCRIPTION"];
foreach ($orig_fields as $field) {
$field["has_default"] = isset($field["default"]);
$row["fields"][] = $field;
}
if (support("partitioning")) {
$from = "FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = " . q(DB) . " AND TABLE_NAME = " . q($TABLE);
$result = $connection->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $from ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");
list($row["partition_by"], $row["partitions"], $row["partition"]) = $result->fetch_row();
$partitions = get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $from AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");
$partitions[""] = "";
$row["partition_names"] = array_keys($partitions);
$row["partition_values"] = array_values($partitions);
}
$row["partition_names"][] = "";
}
}
$collations = collations();
$suhosin = floor(extension_loaded("suhosin") ? (min(ini_get("suhosin.request.max_vars"), ini_get("suhosin.post.max_vars")) - 13) / 10 : 0); // 10 - number of fields per row, 13 - number of other fields
if ($suhosin && count($row["fields"]) > $suhosin) {
echo "<p class='error'>" . h(lang('Maximum number of allowed fields exceeded. Please increase %s and %s.', 'suhosin.post.max_vars', 'suhosin.request.max_vars')) . "\n";
}
$engines = engines();
// case of engine may differ
foreach ($engines as $engine) {
@@ -162,49 +165,51 @@ foreach ($engines as $engine) {
<form action="" method="post" id="form">
<p>
<?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>">
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>document.getElementById('form')['name'].focus();</script><?php } ?>
<?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?>
<?php echo ($collations && !ereg("sqlite|mssql", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
<?php if (support("columns") || $TABLE == "") { ?>
<?php echo lang('Table name'); ?>: <input name="name" data-maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php if ($TABLE == "" && !$_POST) { echo script("focus(qs('#form')['name']);"); } ?>
<?php echo ($engines ? "<select name='Engine'>" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" . on_help("getTarget(event).value", 1) . script("qsl('select').onchange = helpClose;") : ""); ?>
<?php echo ($collations && !preg_match("~sqlite|mssql~", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php } ?>
<?php if (support("columns")) { ?>
<div class="scrollable">
<table cellspacing="0" id="edit-fields" class="nowrap">
<?php
$comments = ($_POST ? $_POST["comments"] : $row["Comment"] != "");
if (!$_POST && !$comments) {
foreach ($row["fields"] as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
}
}
edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys, $comments);
edit_fields($row["fields"], $collations, "TABLE", $foreign_keys);
?>
</table>
</div>
<p>
<?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<label class="jsonly"><input type="checkbox" id="defaults" name="defaults" value="1" checked onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?></label>
<?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
<?php echo (support("comment") ? checkbox("comments", 1, $comments, lang('Comment'), "columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();", true) . ' <input id="Comment" name="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>' : ''); ?>
<?php echo lang('Auto Increment'); ?>: <input type="number" name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<?php echo checkbox("defaults", 1, ($_POST ? $_POST["defaults"] : adminer_setting("defaults")), lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php echo (support("comment")
? checkbox("comments", 1, ($_POST ? $_POST["comments"] : adminer_setting("comments")), lang('Comment'), "editingCommentsClick(this, true);", "jsonly")
. ' <input name="Comment" value="' . h($row["Comment"]) . '" data-maxlength="' . (min_version(5.5) ? 2048 : 60) . '">'
: '')
; ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($_GET["create"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php } ?>
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $TABLE)); ?><?php } ?>
<?php
if (support("partitioning")) {
$partition_table = ereg('RANGE|LIST', $row["partition_by"]);
$partition_table = preg_match('~RANGE|LIST~', $row["partition_by"]);
print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
?>
<p>
<?php echo html_select("partition_by", array(-1 => "") + $partition_by, $row["partition_by"], "partitionByChange(this);"); ?>
<?php echo "<select name='partition_by'>" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . script("qsl('select').onchange = partitionByChange;"); ?>
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
<?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size" value="<?php echo h($row["partitions"]); ?>"<?php echo ($partition_table || !$row["partition_by"] ? " class='hidden'" : ""); ?>>
<?php echo lang('Partitions'); ?>: <input type="number" name="partitions" class="size<?php echo ($partition_table || !$row["partition_by"] ? " hidden" : ""); ?>" value="<?php echo h($row["partitions"]); ?>">
<table cellspacing="0" id="partition-table"<?php echo ($partition_table ? "" : " class='hidden'"); ?>>
<thead><tr><th><?php echo lang('Partition name'); ?><th><?php echo lang('Values'); ?></thead>
<?php
foreach ($row["partition_names"] as $key => $val) {
echo '<tr>';
echo '<td><input name="partition_names[]" value="' . h($val) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . '>';
echo '<td><input name="partition_names[]" value="' . h($val) . '" autocapitalize="off">';
echo ($key == count($row["partition_names"]) - 1 ? script("qsl('input').oninput = partitionNameChange;") : '');
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
}
?>
@@ -213,4 +218,6 @@ foreach ($row["partition_names"] as $key => $val) {
<?php
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>
<?php echo script("qs('#form')['defaults'].onclick();" . (support("comment") ? " editingCommentsClick(qs('#form')['comments']);" : "")); ?>

View File

@@ -1,7 +1,8 @@
<?php
$row = $_POST;
if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x
restart_session();
$name = trim($_POST["name"]);
$name = trim($row["name"]);
if ($_POST["drop"]) {
$_GET["db"] = ""; // to save in global history
queries_redirect(remove_from_uri("db|database"), lang('Database has been dropped.'), drop_databases(array(DB)));
@@ -9,44 +10,44 @@ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP c
// create or rename database
if (DB != "") {
$_GET["db"] = $name;
queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($name), lang('Database has been renamed.'), rename_database($name, $_POST["collation"]));
queries_redirect(preg_replace('~\bdb=[^&]*&~', '', ME) . "db=" . urlencode($name), lang('Database has been renamed.'), rename_database($name, $row["collation"]));
} else {
$databases = explode("\n", str_replace("\r", "", $name));
$success = true;
$last = "";
foreach ($databases as $db) {
if (count($databases) == 1 || $db != "") { // ignore empty lines but always try to create single database
if (!create_database($db, $_POST["collation"])) {
if (!create_database($db, $row["collation"])) {
$success = false;
}
$last = $db;
}
}
restart_session();
set_session("dbs", null);
queries_redirect(ME . "db=" . urlencode($last), lang('Database has been created.'), $success);
}
} else {
// alter database
if (!$_POST["collation"]) {
if (!$row["collation"]) {
redirect(substr(ME, 0, -1));
}
query_redirect("ALTER DATABASE " . idf_escape($name) . (eregi('^[a-z0-9_]+$', $_POST["collation"]) ? " COLLATE $_POST[collation]" : ""), substr(ME, 0, -1), lang('Database has been altered.'));
query_redirect("ALTER DATABASE " . idf_escape($name) . (preg_match('~^[a-z0-9_]+$~i', $row["collation"]) ? " COLLATE $row[collation]" : ""), substr(ME, 0, -1), lang('Database has been altered.'));
}
}
page_header(DB != "" ? lang('Alter database') : lang('Create database'), $error, array(), DB);
page_header(DB != "" ? lang('Alter database') : lang('Create database'), $error, array(), h(DB));
$collations = collations();
$name = DB;
$collate = null;
if ($_POST) {
$name = $_POST["name"];
$collate = $_POST["collation"];
$name = $row["name"];
} elseif (DB != "") {
$collate = db_collation(DB, $collations);
$row["collation"] = db_collation(DB, $collations);
} elseif ($jush == "sql") {
// propose database name with limited privileges
foreach (get_vals("SHOW GRANTS") as $grant) {
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) {
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\.\*)?~', $grant, $match) && $match[1]) {
$name = stripcslashes(idf_unescape("`$match[2]`"));
break;
}
@@ -59,16 +60,20 @@ if ($_POST) {
<?php
echo ($_POST["add_x"] || strpos($name, "\n")
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input id="name" name="name" value="' . h($name) . '" maxlength="64">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $collate) : "");
: '<input name="name" id="name" value="' . h($name) . '" data-maxlength="64" autocapitalize="off">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
'sql' => "charset-charsets.html",
'mariadb' => "supported-character-sets-and-collations/",
'mssql' => "ms187963.aspx",
)) : "");
echo script("focus(qs('#name'));");
?>
<script type='text/javascript'>document.getElementById('name').focus();</script>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php
if (DB != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm(lang('Drop %s?', DB)) . "\n";
} elseif (!$_POST["add_x"] && $_GET["db"] == "") {
echo "<input type='image' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
echo "<input type='image' class='icon' name='add' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">

View File

@@ -4,9 +4,10 @@ $tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]);
if ($tables_views && !$error && !$_POST["search"]) {
$result = true;
$message = "";
if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
if ($jush == "sql" && $_POST["tables"] && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
queries("SET foreign_key_checks = 0"); // allows to truncate or drop several tables at once
}
if ($_POST["truncate"]) {
if ($_POST["tables"]) {
$result = truncate_tables($_POST["tables"]);
@@ -32,11 +33,14 @@ if ($tables_views && !$error && !$_POST["search"]) {
: apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"])
);
$message = lang('Tables have been optimized.');
} elseif ($_POST["tables"] && ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) {
} elseif (!$_POST["tables"]) {
$message = lang('No tables.');
} elseif ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"])))) {
while ($row = $result->fetch_assoc()) {
$message .= "<b>" . h($row["Table"]) . "</b>: " . h($row["Msg_text"]) . "<br>";
}
}
queries_redirect(substr(ME, 0, -1), $message, $result);
}
@@ -44,34 +48,48 @@ page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema'
if ($adminer->homepage()) {
if ($_GET["ns"] !== "") {
echo "<h3>" . lang('Tables and views') . "</h3>\n";
echo "<h3 id='tables-views'>" . lang('Tables and views') . "</h3>\n";
$tables_list = tables_list();
if (!$tables_list) {
echo "<p class='message'>" . lang('No tables.') . "\n";
} else {
echo "<form action='' method='post'>\n";
echo "<p>" . lang('Search data in tables') . ": <input type='search' name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
if ($_POST["search"] && $_POST["query"] != "") {
search_tables();
if (support("table")) {
echo "<fieldset><legend>" . lang('Search data in tables') . " <span id='selected2'></span></legend><div>";
echo "<input type='search' name='query' value='" . h($_POST["query"]) . "'>";
echo script("qsl('input').onkeydown = partialArg(bodyKeydown, 'search');", "");
echo " <input type='submit' name='search' value='" . lang('Search') . "'>\n";
echo "</div></fieldset>\n";
if ($_POST["search"] && $_POST["query"] != "") {
$_GET["where"][0]["op"] = "LIKE %%";
search_tables();
}
}
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);">';
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap checkable'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo '<thead><tr class="wrap">';
echo '<td><input id="check-all" type="checkbox" class="jsonly">' . script("qs('#check-all').onclick = partial(formCheck, /^(tables|views)\[/);", "");
echo '<th>' . lang('Table');
echo '<td>' . lang('Engine');
echo '<td>' . lang('Collation');
echo '<td>' . lang('Data Length');
echo '<td>' . lang('Index Length');
echo '<td>' . lang('Data Free');
echo '<td>' . lang('Auto Increment');
echo '<td>' . lang('Rows');
echo (support("comment") ? '<td>' . lang('Comment') : '');
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-charsets.html', 'mariadb' => 'supported-character-sets-and-collations/'));
echo '<td>' . lang('Data Length') . $doc_link;
echo '<td>' . lang('Index Length') . $doc_link;
echo '<td>' . lang('Data Free') . $doc_link;
echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html', 'mariadb' => 'auto_increment/'));
echo '<td>' . lang('Rows') . $doc_link;
echo (support("comment") ? '<td>' . lang('Comment') . $doc_link : '');
echo "</thead>\n";
$tables = 0;
foreach ($tables_list as $name => $type) {
$view = ($type !== null && !eregi("table", $type));
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
echo '<th><a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . h($name) . '</a>';
$view = ($type !== null && !preg_match('~table~i', $type));
$id = h("Table-" . $name);
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "", "", $id);
echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name));
if ($view) {
echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '" title="' . lang('Alter view') . '">' . lang('View') . '</a>';
echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '" title="' . lang('Alter view') . '">' . (preg_match('~materialized~i', $type) ? lang('Materialized view') : lang('View')) . '</a>';
echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
} else {
foreach (array(
@@ -83,65 +101,87 @@ if ($adminer->homepage()) {
"Auto_increment" => array("auto_increment=1&create", lang('Alter table')),
"Rows" => array("select", lang('Select data')),
) as $key => $link) {
echo ($link ? "<td align='right'><a href='" . h(ME . "$link[0]=") . urlencode($name) . "' id='$key-" . h($name) . "' title='$link[1]'>?</a>" : "<td id='$key-" . h($name) . "'>&nbsp;");
$id = " id='$key-" . h($name) . "'";
echo ($link ? "<td align='right'>" . (support("table") || $key == "Rows" || (support("indexes") && $key != "Data_length")
? "<a href='" . h(ME . "$link[0]=") . urlencode($name) . "'$id title='$link[1]'>?</a>"
: "<span$id>?</span>"
) : "<td id='$key-" . h($name) . "'>");
}
$tables++;
}
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>" : "");
}
echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
echo "<td>" . nbsp($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
echo "<td>" . nbsp(db_collation(DB, collations()));
echo "<tr><td><th>" . lang('%d in total', count($tables_list));
echo "<td>" . h($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
echo "<td>" . h(db_collation(DB, collations()));
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
echo "<td align='right' id='sum-$key'>&nbsp;";
echo "<td align='right' id='sum-$key'>";
}
echo "</table>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n";
echo "</div>\n";
if (!information_schema(DB)) {
echo "<p>" . (ereg('^(sql|sqlite|pgsql)$', $jush)
? ($jush != "sqlite" ? "<input type='submit' value='" . lang('Analyze') . "'> " : "")
. "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " : ""
) . ($jush == "sql" ? "<input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm("formChecked(this, /tables/)") . "> <input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /tables|views/)") . ">\n";
$databases = (support("scheme") ? schemas() : $adminer->databases());
echo "<div class='footer'><div>\n";
$vacuum = "<input type='submit' value='" . lang('Vacuum') . "'> " . on_help("'VACUUM'");
$optimize = "<input type='submit' name='optimize' value='" . lang('Optimize') . "'> " . on_help($jush == "sql" ? "'OPTIMIZE TABLE'" : "'VACUUM OPTIMIZE'");
echo "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>"
. ($jush == "sqlite" ? $vacuum
: ($jush == "pgsql" ? $vacuum . $optimize
: ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> " . on_help("'ANALYZE TABLE'") . $optimize
. "<input type='submit' name='check' value='" . lang('Check') . "'> " . on_help("'CHECK TABLE'")
. "<input type='submit' name='repair' value='" . lang('Repair') . "'> " . on_help("'REPAIR TABLE'")
: "")))
. "<input type='submit' name='truncate' value='" . lang('Truncate') . "'> " . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . confirm()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . on_help("'DROP TABLE'") . confirm() . "\n";
$databases = (support("scheme") ? $adminer->schemas() : $adminer->databases());
if (count($databases) != 1 && $jush != "sqlite") {
$db = (isset($_POST["target"]) ? $_POST["target"] : (support("scheme") ? $_GET["ns"] : DB));
echo "<p>" . lang('Move to other database') . ": ";
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '">');
echo ($databases ? html_select("target", $databases, $db) : '<input name="target" value="' . h($db) . '" autocapitalize="off">');
echo " <input type='submit' name='move' value='" . lang('Move') . "'>";
echo (support("copy") ? " <input type='submit' name='copy' value='" . lang('Copy') . "'>" : "");
echo "\n";
}
echo "<input type='hidden' name='all' value=''>"; // used by trCheck()
echo script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^(tables|views)\[/));" . (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "") . " }");
echo "<input type='hidden' name='token' value='$token'>\n";
echo "</div></fieldset>\n";
echo "</div></div>\n";
}
echo "</form>\n";
echo script("tableCheck();");
}
echo '<p><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
if (support("view")) {
echo '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n";
}
echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
echo (support("view") ? '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
if (support("routine")) {
echo "<h3>" . lang('Routines') . "</h3>\n";
echo "<h3 id='routines'>" . lang('Routines') . "</h3>\n";
$routines = routines();
if ($routines) {
echo "<table cellspacing='0'>\n";
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td>&nbsp;</thead>\n";
echo '<thead><tr><th>' . lang('Name') . '<td>' . lang('Type') . '<td>' . lang('Return type') . "<td></thead>\n";
odd('');
foreach ($routines as $row) {
$name = ($row["SPECIFIC_NAME"] == $row["ROUTINE_NAME"] ? "" : "&name=" . urlencode($row["ROUTINE_NAME"])); // not computed on the pages to be able to print the header first
echo '<tr' . odd() . '>';
echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_NAME"]) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
echo '<th><a href="' . h(ME . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'callf=' : 'call=') . urlencode($row["SPECIFIC_NAME"]) . $name) . '">' . h($row["ROUTINE_NAME"]) . '</a>';
echo '<td>' . h($row["ROUTINE_TYPE"]);
echo '<td>' . h($row["DTD_IDENTIFIER"]);
echo '<td><a href="' . h(ME) . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
echo '<td><a href="' . h(ME . ($row["ROUTINE_TYPE"] != "PROCEDURE" ? 'function=' : 'procedure=') . urlencode($row["SPECIFIC_NAME"]) . $name) . '">' . lang('Alter') . "</a>";
}
echo "</table>\n";
}
echo '<p>' . (support("procedure") ? '<a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a> ' : '') . '<a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n";
echo '<p class="links">'
. (support("procedure") ? '<a href="' . h(ME) . 'procedure=">' . lang('Create procedure') . '</a>' : '')
. '<a href="' . h(ME) . 'function=">' . lang('Create function') . "</a>\n"
;
}
if (support("sequence")) {
echo "<h3>" . lang('Sequences') . "</h3>\n";
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema()");
echo "<h3 id='sequences'>" . lang('Sequences') . "</h3>\n";
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema() ORDER BY sequence_name");
if ($sequences) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
@@ -151,35 +191,36 @@ if ($adminer->homepage()) {
}
echo "</table>\n";
}
echo "<p><a href='" . h(ME) . "sequence='>" . lang('Create sequence') . "</a>\n";
echo "<p class='links'><a href='" . h(ME) . "sequence='>" . lang('Create sequence') . "</a>\n";
}
if (support("type")) {
echo "<h3>" . lang('User types') . "</h3>\n";
$types = types();
if ($types) {
echo "<h3 id='user-types'>" . lang('User types') . "</h3>\n";
$user_types = types();
if ($user_types) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($types as $val) {
foreach ($user_types as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
}
echo "</table>\n";
}
echo "<p><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
echo "<p class='links'><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
}
if (support("event")) {
echo "<h3>" . lang('Events') . "</h3>\n";
echo "<h3 id='events'>" . lang('Events') . "</h3>\n";
$rows = get_rows("SHOW EVENTS");
if ($rows) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "</thead>\n";
echo "<thead><tr><th>" . lang('Name') . "<td>" . lang('Schedule') . "<td>" . lang('Start') . "<td>" . lang('End') . "<td></thead>\n";
foreach ($rows as $row) {
echo "<tr>";
echo '<th><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . h($row["Name"]) . "</a>";
echo "<th>" . h($row["Name"]);
echo "<td>" . ($row["Execute at"] ? lang('At given time') . "<td>" . $row["Execute at"] : lang('Every') . " " . $row["Interval value"] . " " . $row["Interval field"] . "<td>$row[Starts]");
echo "<td>$row[Ends]";
echo '<td><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . lang('Alter') . '</a>';
}
echo "</table>\n";
$event_scheduler = $connection->result("SELECT @@event_scheduler");
@@ -187,11 +228,11 @@ if ($adminer->homepage()) {
echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\n";
}
}
echo '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
echo '<p class="links"><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
}
if ($tables_list) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
}
}
}

14
adminer/designs.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
function adminer_object() {
include_once "../plugins/plugin.php";
include_once "../plugins/designs.php";
$designs = array();
foreach (glob("../designs/*", GLOB_ONLYDIR) as $filename) {
$designs["$filename/adminer.css"] = basename($filename);
}
return new AdminerPlugin(array(
new AdminerDesigns($designs),
));
}
include "./index.php";

View File

@@ -3,5 +3,8 @@ $TABLE = $_GET["download"];
$fields = fields($TABLE);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . friendly_url("$TABLE-" . implode("_", $_GET["where"])) . "." . friendly_url($_GET["field"]));
echo $connection->result("SELECT" . limit(idf_escape($_GET["field"]) . " FROM " . table($TABLE), " WHERE " . where($_GET, $fields), 1));
$select = array(idf_escape($_GET["field"]));
$result = $driver->select($TABLE, $select, array(where($_GET, $fields)), $select);
$row = ($result ? $result->fetch_row() : array());
echo $driver->value($row[0], $fields[$_GET["field"]]);
exit; // don't output footer

View File

@@ -0,0 +1,354 @@
<?php
$drivers["clickhouse"] = "ClickHouse (alpha)";
if (isset($_GET["clickhouse"])) {
define("DRIVER", "clickhouse");
class Min_DB {
var $extension = "JSON", $server_info, $errno, $_result, $error, $_url;
var $_db = 'default';
function rootQuery($db, $query) {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents("$this->_url/?database=$db", false, stream_context_create(array('http' => array(
'method' => 'POST',
'content' => $this->isQuerySelectLike($query) ? "$query FORMAT JSONCompact" : $query,
'header' => 'Content-type: application/x-www-form-urlencoded',
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if ($file === false) {
$this->error = $php_errormsg;
return $file;
}
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
$this->error = $file;
return false;
}
$return = json_decode($file, true);
if ($return === null) {
$this->errno = json_last_error();
if (function_exists('json_last_error_msg')) {
$this->error = json_last_error_msg();
} else {
$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
$this->error = $name;
break;
}
}
}
}
return new Min_Result($return);
}
function isQuerySelectLike($query) {
return (bool) preg_match('~^(select|show)~i', $query);
}
function query($query) {
return $this->rootQuery($this->_db, $query);
}
function connect($server, $username, $password) {
preg_match('~^(https?://)?(.*)~', $server, $match);
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]";
$return = $this->query('SELECT 1');
return (bool) $return;
}
function select_db($database) {
$this->_db = $database;
return true;
}
function quote($string) {
return "'" . addcslashes($string, "\\'") . "'";
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function result($query, $field = 0) {
$result = $this->query($query);
return $result['data'];
}
}
class Min_Result {
var $num_rows, $_rows, $columns, $meta, $_offset = 0;
function __construct($result) {
$this->num_rows = $result['rows'];
$this->_rows = $result['data'];
$this->meta = $result['meta'];
$this->columns = array_column($this->meta, 'name');
reset($this->_rows);
}
function fetch_assoc() {
$row = current($this->_rows);
next($this->_rows);
return $row === false ? false : array_combine($this->columns, $row);
}
function fetch_row() {
$row = current($this->_rows);
next($this->_rows);
return $row;
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
if ($column < count($this->columns)) {
$return->name = $this->meta[$column]['name'];
$return->orgname = $return->name;
$return->type = $this->meta[$column]['type'];
}
return $return;
}
}
class Min_Driver extends Min_SQL {
function delete($table, $queryWhere, $limit = 0) {
return queries("ALTER TABLE " . table($table) . " DELETE $queryWhere");
}
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
$values = array();
foreach ($set as $key => $val) {
$values[] = "$key = $val";
}
$query = $separator . implode(",$separator", $values);
return queries("ALTER TABLE " . table($table) . " UPDATE $query$queryWhere");
}
}
function idf_escape($idf) {
return "`" . str_replace("`", "``", $idf) . "`";
}
function table($idf) {
return idf_escape($idf);
}
function explain($connection, $query) {
return '';
}
function found_rows($table_status, $where) {
$rows = get_vals("SELECT COUNT(*) FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
return empty($rows) ? false : $rows[0];
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
foreach ($fields as $field) {
if ($field[1][2] === " NULL") {
$field[1][1] = " Nullable({$field[1][1]})";
}
unset($field[1][2]);
}
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
function drop_views($views) {
return drop_tables($views);
}
function drop_tables($tables) {
return apply_queries("DROP TABLE", $tables);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases($flush) {
global $connection;
$result = get_rows('SHOW DATABASES');
$return = array();
foreach ($result as $row) {
$return[] = $row['name'];
}
sort($return);
return $return;
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? ", $offset" : "") : "");
}
function limit1($table, $query, $where, $separator = "\n") {
return limit($query, $where, 1, 0, $separator);
}
function db_collation($db, $collations) {
}
function engines() {
return array('MergeTree');
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function tables_list() {
$result = get_rows('SHOW TABLES');
$return = array();
foreach ($result as $row) {
$return[$row['name']] = 'table';
}
ksort($return);
return $return;
}
function count_tables($databases) {
return array();
}
function table_status($name = "", $fast = false) {
global $connection;
$return = array();
$tables = get_rows("SELECT name, engine FROM system.tables WHERE database = " . q($connection->_db));
foreach ($tables as $table) {
$return[$table['name']] = array(
'Name' => $table['name'],
'Engine' => $table['engine'],
);
if ($name === $table['name']) {
return $return[$table['name']];
}
}
return $return;
}
function is_view($table_status) {
return false;
}
function fk_support($table_status) {
return false;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
if (in_array($field['type'], array("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Float32", "Float64"))) {
return "to$field[type]($return)";
}
return $return;
}
function fields($table) {
$return = array();
$result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
foreach($result as $row) {
$type = trim($row['type']);
$nullable = strpos($type, 'Nullable(') === 0;
$return[trim($row['name'])] = array(
"field" => trim($row['name']),
"full_type" => $type,
"type" => $type,
"default" => trim($row['default_expression']),
"null" => $nullable,
"auto_increment" => '0',
"privileges" => array("insert" => 1, "select" => 1, "update" => 0),
);
}
return $return;
}
function indexes($table, $connection2 = null) {
return array();
}
function foreign_keys($table) {
return array();
}
function collations() {
return array();
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return h($connection->error);
}
function types() {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($schema) {
return true;
}
function auto_increment() {
return '';
}
function last_id() {
return 0; // ClickHouse doesn't have it
}
function support($feature) {
return preg_match("~^(columns|sql|status|table)$~", $feature);
}
$jush = "clickhouse";
$types = array();
$structured_types = array();
foreach (array( //! arrays
lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
lang('Date and time') => array("Date" => 13, "DateTime" => 20),
lang('Strings') => array("String" => 0),
lang('Binary') => array("FixedString" => 0),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
$functions = array();
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array();
}

View File

@@ -0,0 +1,465 @@
<?php
$drivers["elastic"] = "Elasticsearch (beta)";
if (isset($_GET["elastic"])) {
$possible_drivers = array("json + allow_url_fopen");
define("DRIVER", "elastic");
if (function_exists('json_decode') && ini_bool('allow_url_fopen')) {
class Min_DB {
var $extension = "JSON", $server_info, $errno, $error, $_url;
/** Performs query
* @param string
* @param array
* @param string
* @return mixed
*/
function rootQuery($path, $content = array(), $method = 'GET') {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents("$this->_url/" . ltrim($path, '/'), false, stream_context_create(array('http' => array(
'method' => $method,
'content' => $content === null ? $content : json_encode($content),
'header' => 'Content-Type: application/json',
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if (!$file) {
$this->error = $php_errormsg;
return $file;
}
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
$this->error = $file;
return false;
}
$return = json_decode($file, true);
if ($return === null) {
$this->errno = json_last_error();
if (function_exists('json_last_error_msg')) {
$this->error = json_last_error_msg();
} else {
$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
$this->error = $name;
break;
}
}
}
}
return $return;
}
/** Performs query relative to actual selected DB
* @param string
* @param array
* @param string
* @return mixed
*/
function query($path, $content = array(), $method = 'GET') {
return $this->rootQuery(($this->_db != "" ? "$this->_db/" : "/") . ltrim($path, '/'), $content, $method);
}
function connect($server, $username, $password) {
preg_match('~^(https?://)?(.*)~', $server, $match);
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]";
$return = $this->query('');
if ($return) {
$this->server_info = $return['version']['number'];
}
return (bool) $return;
}
function select_db($database) {
$this->_db = $database;
return true;
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows;
function __construct($rows) {
$this->num_rows = count($this->_rows);
$this->_rows = $rows;
reset($this->_rows);
}
function fetch_assoc() {
$return = current($this->_rows);
next($this->_rows);
return $return;
}
function fetch_row() {
return array_values($this->fetch_assoc());
}
}
}
class Min_Driver extends Min_SQL {
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer;
$data = array();
$query = "$table/_search";
if ($select != array("*")) {
$data["fields"] = $select;
}
if ($order) {
$sort = array();
foreach ($order as $col) {
$col = preg_replace('~ DESC$~', '', $col, 1, $count);
$sort[] = ($count ? array($col => "desc") : $col);
}
$data["sort"] = $sort;
}
if ($limit) {
$data["size"] = +$limit;
if ($page) {
$data["from"] = ($page * $limit);
}
}
foreach ($where as $val) {
list($col, $op, $val) = explode(" ", $val, 3);
if ($col == "_id") {
$data["query"]["ids"]["values"][] = $val;
}
elseif ($col . $val != "") {
$term = array("term" => array(($col != "" ? $col : "_all") => $val));
if ($op == "=") {
$data["query"]["filtered"]["filter"]["and"][] = $term;
} else {
$data["query"]["filtered"]["query"]["bool"]["must"][] = $term;
}
}
}
if ($data["query"] && !$data["query"]["filtered"]["query"] && !$data["query"]["ids"]) {
$data["query"]["filtered"]["query"] = array("match_all" => array());
}
$start = microtime(true);
$search = $this->_conn->query($query, $data);
if ($print) {
echo $adminer->selectQuery("$query: " . print_r($data, true), $start, !$search);
}
if (!$search) {
return false;
}
$return = array();
foreach ($search['hits']['hits'] as $hit) {
$row = array();
if ($select == array("*")) {
$row["_id"] = $hit["_id"];
}
$fields = $hit['_source'];
if ($select != array("*")) {
$fields = array();
foreach ($select as $key) {
$fields[$key] = $hit['fields'][$key];
}
}
foreach ($fields as $key => $val) {
if ($data["fields"]) {
$val = $val[0];
}
$row[$key] = (is_array($val) ? json_encode($val) : $val); //! display JSON and others differently
}
$return[] = $row;
}
return new Min_Result($return);
}
function update($type, $record, $queryWhere, $limit = 0, $separator = "\n") {
//! use $limit
$parts = preg_split('~ *= *~', $queryWhere);
if (count($parts) == 2) {
$id = trim($parts[1]);
$query = "$type/$id";
return $this->_conn->query($query, $record, 'POST');
}
return false;
}
function insert($type, $record) {
$id = ""; //! user should be able to inform _id
$query = "$type/$id";
$response = $this->_conn->query($query, $record, 'POST');
$this->_conn->last_id = $response['_id'];
return $response['created'];
}
function delete($type, $queryWhere, $limit = 0) {
//! use $limit
$ids = array();
if (is_array($_GET["where"]) && $_GET["where"]["_id"]) {
$ids[] = $_GET["where"]["_id"];
}
if (is_array($_POST['check'])) {
foreach ($_POST['check'] as $check) {
$parts = preg_split('~ *= *~', $check);
if (count($parts) == 2) {
$ids[] = trim($parts[1]);
}
}
}
$this->_conn->affected_rows = 0;
foreach ($ids as $id) {
$query = "{$type}/{$id}";
$response = $this->_conn->query($query, '{}', 'DELETE');
if (is_array($response) && $response['found'] == true) {
$this->_conn->affected_rows++;
}
}
return $this->_conn->affected_rows;
}
}
function connect() {
global $adminer;
$connection = new Min_DB;
list($server, $username, $password) = $adminer->credentials();
if ($password != "" && $connection->connect($server, $username, "")) {
return lang('Database does not support password.');
}
if ($connection->connect($server, $username, $password)) {
return $connection;
}
return $connection->error;
}
function support($feature) {
return preg_match("~database|table|columns~", $feature);
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function get_databases() {
global $connection;
$return = $connection->rootQuery('_aliases');
if ($return) {
$return = array_keys($return);
sort($return, SORT_STRING);
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function engines() {
return array();
}
function count_tables($databases) {
global $connection;
$return = array();
$result = $connection->query('_stats');
if ($result && $result['indices']) {
$indices = $result['indices'];
foreach ($indices as $indice => $stats) {
$indexing = $stats['total']['indexing'];
$return[$indice] = $indexing['index_total'];
}
}
return $return;
}
function tables_list() {
global $connection;
$return = $connection->query('_mapping');
if ($return) {
$return = array_fill_keys(array_keys($return[$connection->_db]["mappings"]), 'table');
}
return $return;
}
function table_status($name = "", $fast = false) {
global $connection;
$search = $connection->query("_search", array(
"size" => 0,
"aggregations" => array(
"count_by_type" => array(
"terms" => array(
"field" => "_type"
)
)
)
), "POST");
$return = array();
if ($search) {
$tables = $search["aggregations"]["count_by_type"]["buckets"];
foreach ($tables as $table) {
$return[$table["key"]] = array(
"Name" => $table["key"],
"Engine" => "table",
"Rows" => $table["doc_count"],
);
if ($name != "" && $name == $table["key"]) {
return $return[$name];
}
}
}
return $return;
}
function error() {
global $connection;
return h($connection->error);
}
function information_schema() {
}
function is_view($table_status) {
}
function indexes($table, $connection2 = null) {
return array(
array("type" => "PRIMARY", "columns" => array("_id")),
);
}
function fields($table) {
global $connection;
$result = $connection->query("$table/_mapping");
$return = array();
if ($result) {
$mappings = $result[$table]['properties'];
if (!$mappings) {
$mappings = $result[$connection->_db]['mappings'][$table]['properties'];
}
if ($mappings) {
foreach ($mappings as $name => $field) {
$return[$name] = array(
"field" => $name,
"full_type" => $field["type"],
"type" => $field["type"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
);
if ($field["properties"]) { // only leaf fields can be edited
unset($return[$name]["privileges"]["insert"]);
unset($return[$name]["privileges"]["update"]);
}
}
}
}
return $return;
}
function foreign_keys($table) {
return array();
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function fk_support($table_status) {
}
function found_rows($table_status, $where) {
return null;
}
/** Create index
* @param string
* @return mixed
*/
function create_database($db) {
global $connection;
return $connection->rootQuery(urlencode($db), null, 'PUT');
}
/** Remove index
* @param array
* @return mixed
*/
function drop_databases($databases) {
global $connection;
return $connection->rootQuery(urlencode(implode(',', $databases)), array(), 'DELETE');
}
/** Alter type
* @param array
* @return mixed
*/
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
global $connection;
$properties = array();
foreach ($fields as $f) {
$field_name = trim($f[1][0]);
$field_type = trim($f[1][1] ? $f[1][1] : "text");
$properties[$field_name] = array(
'type' => $field_type
);
}
if (!empty($properties)) {
$properties = array('properties' => $properties);
}
return $connection->query("_mapping/{$name}", $properties, 'PUT');
}
/** Drop types
* @param array
* @return bool
*/
function drop_tables($tables) {
global $connection;
$return = true;
foreach ($tables as $table) { //! convert to bulk api
$return = $return && $connection->query(urlencode($table), array(), 'DELETE');
}
return $return;
}
function last_id() {
global $connection;
return $connection->last_id;
}
$jush = "elastic";
$operators = array("=", "query");
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
$types = array(); ///< @var array ($type => $maximum_unsigned_length, ...)
$structured_types = array(); ///< @var array ($description => array($type, ...), ...)
foreach (array(
lang('Numbers') => array("long" => 3, "integer" => 5, "short" => 8, "byte" => 10, "double" => 20, "float" => 66, "half_float" => 12, "scaled_float" => 21),
lang('Date and time') => array("date" => 10),
lang('Strings') => array("string" => 65535, "text" => 65535),
lang('Binary') => array("binary" => 255),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
}

View File

@@ -0,0 +1,320 @@
<?php
/**
* @author Steve Krämer
*/
$drivers['firebird'] = 'Firebird (alpha)';
if (isset($_GET["firebird"])) {
$possible_drivers = array("interbase");
define("DRIVER", "firebird");
if (extension_loaded("interbase") ) {
class Min_DB {
var
$extension = "Firebird",
$server_info,
$affected_rows,
$errno,
$error,
$_link, $_result
;
function connect($server, $username, $password) {
$this->_link = ibase_connect($server, $username, $password);
if ($this->_link) {
$url_parts = explode(':', $server);
$this->service_link = ibase_service_attach($url_parts[0], $username, $password);
$this->server_info = ibase_server_info($this->service_link, IBASE_SVC_SERVER_VERSION);
} else {
$this->errno = ibase_errcode();
$this->error = ibase_errmsg();
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
return ($database == "domain");
}
function query($query, $unbuffered = false) {
$result = ibase_query($query, $this->_link);
if (!$result) {
$this->errno = ibase_errcode();
$this->error = ibase_errmsg();
return false;
}
$this->error = "";
if ($result === true) {
$this->affected_rows = ibase_affected_rows($this->_link);
return true;
}
return new Min_Result($result);
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result || !$result->num_rows) {
return false;
}
$row = $result->fetch_row();
return $row[$field];
}
}
class Min_Result {
var $num_rows, $_result, $_offset = 0;
function __construct($result) {
$this->_result = $result;
// $this->num_rows = ibase_num_rows($result);
}
function fetch_assoc() {
return ibase_fetch_assoc($this->_result);
}
function fetch_row() {
return ibase_fetch_row($this->_result);
}
function fetch_field() {
$field = ibase_field_info($this->_result, $this->_offset++);
return (object) array(
'name' => $field['name'],
'orgname' => $field['name'],
'type' => $field['type'],
'charsetnr' => $field['length'],
);
}
function __destruct() {
ibase_free_result($this->_result);
}
}
}
class Min_Driver extends Min_SQL {
}
function idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
function table($idf) {
return idf_escape($idf);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases($flush) {
return array("domain");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
$return = '';
$return .= ($limit !== null ? $separator . "FIRST $limit" . ($offset ? " SKIP $offset" : "") : "");
$return .= " $query$where";
return $return;
}
function limit1($table, $query, $where, $separator = "\n") {
return limit($query, $where, 1, 0, $separator);
}
function db_collation($db, $collations) {
}
function engines() {
return array();
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function tables_list() {
global $connection;
$query = 'SELECT RDB$RELATION_NAME FROM rdb$relations WHERE rdb$system_flag = 0';
$result = ibase_query($connection->_link, $query);
$return = array();
while ($row = ibase_fetch_assoc($result)) {
$return[$row['RDB$RELATION_NAME']] = 'table';
}
ksort($return);
return $return;
}
function count_tables($databases) {
return array();
}
function table_status($name = "", $fast = false) {
global $connection;
$return = array();
$data = tables_list();
foreach ($data as $index => $val) {
$index = trim($index);
$return[$index] = array(
'Name' => $index,
'Engine' => 'standard',
);
if ($name == $index) {
return $return[$index];
}
}
return $return;
}
function is_view($table_status) {
return false;
}
function fk_support($table_status) {
return preg_match('~InnoDB|IBMDB2I~i', $table_status["Engine"]);
}
function fields($table) {
global $connection;
$return = array();
$query = 'SELECT r.RDB$FIELD_NAME AS field_name,
r.RDB$DESCRIPTION AS field_description,
r.RDB$DEFAULT_VALUE AS field_default_value,
r.RDB$NULL_FLAG AS field_not_null_constraint,
f.RDB$FIELD_LENGTH AS field_length,
f.RDB$FIELD_PRECISION AS field_precision,
f.RDB$FIELD_SCALE AS field_scale,
CASE f.RDB$FIELD_TYPE
WHEN 261 THEN \'BLOB\'
WHEN 14 THEN \'CHAR\'
WHEN 40 THEN \'CSTRING\'
WHEN 11 THEN \'D_FLOAT\'
WHEN 27 THEN \'DOUBLE\'
WHEN 10 THEN \'FLOAT\'
WHEN 16 THEN \'INT64\'
WHEN 8 THEN \'INTEGER\'
WHEN 9 THEN \'QUAD\'
WHEN 7 THEN \'SMALLINT\'
WHEN 12 THEN \'DATE\'
WHEN 13 THEN \'TIME\'
WHEN 35 THEN \'TIMESTAMP\'
WHEN 37 THEN \'VARCHAR\'
ELSE \'UNKNOWN\'
END AS field_type,
f.RDB$FIELD_SUB_TYPE AS field_subtype,
coll.RDB$COLLATION_NAME AS field_collation,
cset.RDB$CHARACTER_SET_NAME AS field_charset
FROM RDB$RELATION_FIELDS r
LEFT JOIN RDB$FIELDS f ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
LEFT JOIN RDB$COLLATIONS coll ON f.RDB$COLLATION_ID = coll.RDB$COLLATION_ID
LEFT JOIN RDB$CHARACTER_SETS cset ON f.RDB$CHARACTER_SET_ID = cset.RDB$CHARACTER_SET_ID
WHERE r.RDB$RELATION_NAME = ' . q($table) . '
ORDER BY r.RDB$FIELD_POSITION';
$result = ibase_query($connection->_link, $query);
while ($row = ibase_fetch_assoc($result)) {
$return[trim($row['FIELD_NAME'])] = array(
"field" => trim($row["FIELD_NAME"]),
"full_type" => trim($row["FIELD_TYPE"]),
"type" => trim($row["FIELD_SUB_TYPE"]),
"default" => trim($row['FIELD_DEFAULT_VALUE']),
"null" => (trim($row["FIELD_NOT_NULL_CONSTRAINT"]) == "YES"),
"auto_increment" => '0',
"collation" => trim($row["FIELD_COLLATION"]),
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
"comment" => trim($row["FIELD_DESCRIPTION"]),
);
}
return $return;
}
function indexes($table, $connection2 = null) {
$return = array();
/*
$query = 'SELECT RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS field_name,
RDB$INDICES.RDB$DESCRIPTION AS description,
(RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION + 1) AS field_position
FROM RDB$INDEX_SEGMENTS
LEFT JOIN RDB$INDICES ON RDB$INDICES.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
LEFT JOIN RDB$RELATION_CONSTRAINTS ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
WHERE UPPER(RDB$INDICES.RDB$RELATION_NAME) = ' . q($table) . '
// AND UPPER(RDB$INDICES.RDB$INDEX_NAME) = \'TEST2_FIELD5_IDX\'
AND RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL
ORDER BY RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION';
*/
return $return;
}
function foreign_keys($table) {
return array();
}
function collations() {
return array();
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return h($connection->error);
}
function types() {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($schema) {
return true;
}
function support($feature) {
return preg_match("~^(columns|sql|status|table)$~", $feature);
}
$jush = "firebird";
$operators = array("=");
$functions = array();
$grouping = array();
$edit_functions = array();
}

View File

@@ -0,0 +1,729 @@
<?php
$drivers["mongo"] = "MongoDB";
if (isset($_GET["mongo"])) {
$possible_drivers = array("mongo", "mongodb");
define("DRIVER", "mongo");
if (class_exists('MongoDB')) {
class Min_DB {
var $extension = "Mongo", $server_info = MongoClient::VERSION, $error, $last_id, $_link, $_db;
function connect($uri, $options) {
return @new MongoClient($uri, $options);
}
function query($query) {
return false;
}
function select_db($database) {
try {
$this->_db = $this->_link->selectDB($database);
return true;
} catch (Exception $ex) {
$this->error = $ex->getMessage();
return false;
}
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows = array(), $_offset = 0, $_charset = array();
function __construct($result) {
foreach ($result as $item) {
$row = array();
foreach ($item as $key => $val) {
if (is_a($val, 'MongoBinData')) {
$this->_charset[$key] = 63;
}
$row[$key] =
(is_a($val, 'MongoId') ? 'ObjectId("' . strval($val) . '")' :
(is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
(is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
(is_a($val, 'MongoRegex') ? strval($val) :
(is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
$val
)))));
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = count($this->_rows);
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
$name = $keys[$this->_offset++];
return (object) array(
'name' => $name,
'charsetnr' => $this->_charset[$name],
);
}
}
class Min_Driver extends Min_SQL {
public $primary = "_id";
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
$select = ($select == array("*")
? array()
: array_fill_keys($select, true)
);
$sort = array();
foreach ($order as $val) {
$val = preg_replace('~ DESC$~', '', $val, 1, $count);
$sort[$val] = ($count ? -1 : 1);
}
return new Min_Result($this->_conn->_db->selectCollection($table)
->find(array(), $select)
->sort($sort)
->limit($limit != "" ? +$limit : 0)
->skip($page * $limit)
);
}
function insert($table, $set) {
try {
$return = $this->_conn->_db->selectCollection($table)->insert($set);
$this->_conn->errno = $return['code'];
$this->_conn->error = $return['err'];
$this->_conn->last_id = $set['_id'];
return !$return['err'];
} catch (Exception $ex) {
$this->_conn->error = $ex->getMessage();
return false;
}
}
}
function get_databases($flush) {
global $connection;
$return = array();
$dbs = $connection->_link->listDBs();
foreach ($dbs['databases'] as $db) {
$return[] = $db['name'];
}
return $return;
}
function count_tables($databases) {
global $connection;
$return = array();
foreach ($databases as $db) {
$return[$db] = count($connection->_link->selectDB($db)->getCollectionNames(true));
}
return $return;
}
function tables_list() {
global $connection;
return array_fill_keys($connection->_db->getCollectionNames(true), 'table');
}
function drop_databases($databases) {
global $connection;
foreach ($databases as $db) {
$response = $connection->_link->selectDB($db)->drop();
if (!$response['ok']) {
return false;
}
}
return true;
}
function indexes($table, $connection2 = null) {
global $connection;
$return = array();
foreach ($connection->_db->selectCollection($table)->getIndexInfo() as $index) {
$descs = array();
foreach ($index["key"] as $column => $type) {
$descs[] = ($type == -1 ? '1' : null);
}
$return[$index["name"]] = array(
"type" => ($index["name"] == "_id_" ? "PRIMARY" : ($index["unique"] ? "UNIQUE" : "INDEX")),
"columns" => array_keys($index["key"]),
"lengths" => array(),
"descs" => $descs,
);
}
return $return;
}
function fields($table) {
return fields_from_edit();
}
function found_rows($table_status, $where) {
global $connection;
//! don't call count_rows()
return $connection->_db->selectCollection($_GET["select"])->count($where);
}
$operators = array("=");
} elseif (class_exists('MongoDB\Driver\Manager')) {
class Min_DB {
var $extension = "MongoDB", $server_info = MONGODB_VERSION, $error, $last_id;
/** @var MongoDB\Driver\Manager */
var $_link;
var $_db, $_db_name;
function connect($uri, $options) {
$class = 'MongoDB\Driver\Manager';
return new $class($uri, $options);
}
function query($query) {
return false;
}
function select_db($database) {
$this->_db_name = $database;
return true;
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows = array(), $_offset = 0, $_charset = array();
function __construct($result) {
foreach ($result as $item) {
$row = array();
foreach ($item as $key => $val) {
if (is_a($val, 'MongoDB\BSON\Binary')) {
$this->_charset[$key] = 63;
}
$row[$key] =
(is_a($val, 'MongoDB\BSON\ObjectID') ? 'MongoDB\BSON\ObjectID("' . strval($val) . '")' :
(is_a($val, 'MongoDB\BSON\UTCDatetime') ? $val->toDateTime()->format('Y-m-d H:i:s') :
(is_a($val, 'MongoDB\BSON\Binary') ? $val->bin : //! allow downloading
(is_a($val, 'MongoDB\BSON\Regex') ? strval($val) :
(is_object($val) ? json_encode($val, 256) : // 256 = JSON_UNESCAPED_UNICODE
$val // MongoMinKey, MongoMaxKey
)))));
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = $result->count;
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
$name = $keys[$this->_offset++];
return (object) array(
'name' => $name,
'charsetnr' => $this->_charset[$name],
);
}
}
class Min_Driver extends Min_SQL {
public $primary = "_id";
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $connection;
$select = ($select == array("*")
? array()
: array_fill_keys($select, 1)
);
if (count($select) && !isset($select['_id'])) {
$select['_id'] = 0;
}
$where = where_to_query($where);
$sort = array();
foreach ($order as $val) {
$val = preg_replace('~ DESC$~', '', $val, 1, $count);
$sort[$val] = ($count ? -1 : 1);
}
if (isset($_GET['limit']) && is_numeric($_GET['limit']) && $_GET['limit'] > 0) {
$limit = $_GET['limit'];
}
$limit = min(200, max(1, (int) $limit));
$skip = $page * $limit;
$class = 'MongoDB\Driver\Query';
$query = new $class($where, array('projection' => $select, 'limit' => $limit, 'skip' => $skip, 'sort' => $sort));
$results = $connection->_link->executeQuery("$connection->_db_name.$table", $query);
return new Min_Result($results);
}
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
global $connection;
$db = $connection->_db_name;
$where = sql_query_where_parser($queryWhere);
$class = 'MongoDB\Driver\BulkWrite';
$bulk = new $class(array());
if (isset($set['_id'])) {
unset($set['_id']);
}
$removeFields = array();
foreach ($set as $key => $value) {
if ($value == 'NULL') {
$removeFields[$key] = 1;
unset($set[$key]);
}
}
$update = array('$set' => $set);
if (count($removeFields)) {
$update['$unset'] = $removeFields;
}
$bulk->update($where, $update, array('upsert' => false));
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
$connection->affected_rows = $results->getModifiedCount();
return true;
}
function delete($table, $queryWhere, $limit = 0) {
global $connection;
$db = $connection->_db_name;
$where = sql_query_where_parser($queryWhere);
$class = 'MongoDB\Driver\BulkWrite';
$bulk = new $class(array());
$bulk->delete($where, array('limit' => $limit));
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
$connection->affected_rows = $results->getDeletedCount();
return true;
}
function insert($table, $set) {
global $connection;
$db = $connection->_db_name;
$class = 'MongoDB\Driver\BulkWrite';
$bulk = new $class(array());
if (isset($set['_id']) && empty($set['_id'])) {
unset($set['_id']);
}
$bulk->insert($set);
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
$connection->affected_rows = $results->getInsertedCount();
return true;
}
}
function get_databases($flush) {
/** @var Min_DB */
global $connection;
$return = array();
$class = 'MongoDB\Driver\Command';
$command = new $class(array('listDatabases' => 1));
$results = $connection->_link->executeCommand('admin', $command);
foreach ($results as $dbs) {
foreach ($dbs->databases as $db) {
$return[] = $db->name;
}
}
return $return;
}
function count_tables($databases) {
$return = array();
return $return;
}
function tables_list() {
global $connection;
$class = 'MongoDB\Driver\Command';
$command = new $class(array('listCollections' => 1));
$results = $connection->_link->executeCommand($connection->_db_name, $command);
$collections = array();
foreach ($results as $result) {
$collections[$result->name] = 'table';
}
return $collections;
}
function drop_databases($databases) {
return false;
}
function indexes($table, $connection2 = null) {
global $connection;
$return = array();
$class = 'MongoDB\Driver\Command';
$command = new $class(array('listIndexes' => $table));
$results = $connection->_link->executeCommand($connection->_db_name, $command);
foreach ($results as $index) {
$descs = array();
$columns = array();
foreach (get_object_vars($index->key) as $column => $type) {
$descs[] = ($type == -1 ? '1' : null);
$columns[] = $column;
}
$return[$index->name] = array(
"type" => ($index->name == "_id_" ? "PRIMARY" : (isset($index->unique) ? "UNIQUE" : "INDEX")),
"columns" => $columns,
"lengths" => array(),
"descs" => $descs,
);
}
return $return;
}
function fields($table) {
$fields = fields_from_edit();
if (!count($fields)) {
global $driver;
$result = $driver->select($table, array("*"), null, null, array(), 10);
while ($row = $result->fetch_assoc()) {
foreach ($row as $key => $val) {
$row[$key] = null;
$fields[$key] = array(
"field" => $key,
"type" => "string",
"null" => ($key != $driver->primary),
"auto_increment" => ($key == $driver->primary),
"privileges" => array(
"insert" => 1,
"select" => 1,
"update" => 1,
),
);
}
}
}
return $fields;
}
function found_rows($table_status, $where) {
global $connection;
$where = where_to_query($where);
$class = 'MongoDB\Driver\Command';
$command = new $class(array('count' => $table_status['Name'], 'query' => $where));
$results = $connection->_link->executeCommand($connection->_db_name, $command);
$toArray = $results->toArray();
return $toArray[0]->n;
}
function sql_query_where_parser($queryWhere) {
$queryWhere = trim(preg_replace('/WHERE[\s]?[(]?\(?/', '', $queryWhere));
$queryWhere = preg_replace('/\)\)\)$/', ')', $queryWhere);
$wheres = explode(' AND ', $queryWhere);
$wheresOr = explode(') OR (', $queryWhere);
$where = array();
foreach ($wheres as $whereStr) {
$where[] = trim($whereStr);
}
if (count($wheresOr) == 1) {
$wheresOr = array();
} elseif (count($wheresOr) > 1) {
$where = array();
}
return where_to_query($where, $wheresOr);
}
function where_to_query($whereAnd = array(), $whereOr = array()) {
global $adminer;
$data = array();
foreach (array('and' => $whereAnd, 'or' => $whereOr) as $type => $where) {
if (is_array($where)) {
foreach ($where as $expression) {
list($col, $op, $val) = explode(" ", $expression, 3);
if ($col == "_id") {
$val = str_replace('MongoDB\BSON\ObjectID("', "", $val);
$val = str_replace('")', "", $val);
$class = 'MongoDB\BSON\ObjectID';
$val = new $class($val);
}
if (!in_array($op, $adminer->operators)) {
continue;
}
if (preg_match('~^\(f\)(.+)~', $op, $match)) {
$val = (float) $val;
$op = $match[1];
} elseif (preg_match('~^\(date\)(.+)~', $op, $match)) {
$dateTime = new DateTime($val);
$class = 'MongoDB\BSON\UTCDatetime';
$val = new $class($dateTime->getTimestamp() * 1000);
$op = $match[1];
}
switch ($op) {
case '=':
$op = '$eq';
break;
case '!=':
$op = '$ne';
break;
case '>':
$op = '$gt';
break;
case '<':
$op = '$lt';
break;
case '>=':
$op = '$gte';
break;
case '<=':
$op = '$lte';
break;
case 'regex':
$op = '$regex';
break;
default:
continue 2;
}
if ($type == 'and') {
$data['$and'][] = array($col => array($op => $val));
} elseif ($type == 'or') {
$data['$or'][] = array($col => array($op => $val));
}
}
}
}
return $data;
}
$operators = array(
"=",
"!=",
">",
"<",
">=",
"<=",
"regex",
"(f)=",
"(f)!=",
"(f)>",
"(f)<",
"(f)>=",
"(f)<=",
"(date)=",
"(date)!=",
"(date)>",
"(date)<",
"(date)>=",
"(date)<=",
);
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function table_status($name = "", $fast = false) {
$return = array();
foreach (tables_list() as $table => $type) {
$return[$table] = array("Name" => $table);
if ($name == $table) {
return $return[$table];
}
}
return $return;
}
function create_database($db, $collation) {
return true;
}
function last_id() {
global $connection;
return $connection->last_id;
}
function error() {
global $connection;
return h($connection->error);
}
function collations() {
return array();
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function connect() {
global $adminer;
$connection = new Min_DB;
list($server, $username, $password) = $adminer->credentials();
$options = array();
if ($username . $password != "") {
$options["username"] = $username;
$options["password"] = $password;
}
$db = $adminer->database();
if ($db != "") {
$options["db"] = $db;
}
try {
$connection->_link = $connection->connect("mongodb://$server", $options);
if ($password != "") {
$options["password"] = "";
try {
$connection->connect("mongodb://$server", $options);
return lang('Database does not support password.');
} catch (Exception $ex) {
// this is what we want
}
}
return $connection;
} catch (Exception $ex) {
return $ex->getMessage();
}
}
function alter_indexes($table, $alter) {
global $connection;
foreach ($alter as $val) {
list($type, $name, $set) = $val;
if ($set == "DROP") {
$return = $connection->_db->command(array("deleteIndexes" => $table, "index" => $name));
} else {
$columns = array();
foreach ($set as $column) {
$column = preg_replace('~ DESC$~', '', $column, 1, $count);
$columns[$column] = ($count ? -1 : 1);
}
$return = $connection->_db->selectCollection($table)->ensureIndex($columns, array(
"unique" => ($type == "UNIQUE"),
"name" => $name,
//! "sparse"
));
}
if ($return['errmsg']) {
$connection->error = $return['errmsg'];
return false;
}
}
return true;
}
function support($feature) {
return preg_match("~database|indexes|descidx~", $feature);
}
function db_collation($db, $collations) {
}
function information_schema() {
}
function is_view($table_status) {
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function foreign_keys($table) {
return array();
}
function fk_support($table_status) {
}
function engines() {
return array();
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
global $connection;
if ($table == "") {
$connection->_db->createCollection($name);
return true;
}
}
function drop_tables($tables) {
global $connection;
foreach ($tables as $table) {
$response = $connection->_db->selectCollection($table)->drop();
if (!$response['ok']) {
return false;
}
}
return true;
}
function truncate_tables($tables) {
global $connection;
foreach ($tables as $table) {
$response = $connection->_db->selectCollection($table)->remove();
if (!$response['ok']) {
return false;
}
}
return true;
}
$jush = "mongo";
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
}

View File

@@ -5,10 +5,10 @@
* @author Jakub Vrana
*/
$drivers["mssql"] = "MS SQL";
$drivers["mssql"] = "MS SQL (beta)";
if (isset($_GET["mssql"])) {
$possible_drivers = array("SQLSRV", "MSSQL");
$possible_drivers = array("SQLSRV", "MSSQL", "PDO_DBLIB");
define("DRIVER", "mssql");
if (extension_loaded("sqlsrv")) {
class Min_DB {
@@ -24,7 +24,13 @@ if (isset($_GET["mssql"])) {
}
function connect($server, $username, $password) {
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
global $adminer;
$db = $adminer->database();
$connection_info = array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8");
if ($db != "") {
$connection_info["Database"] = $db;
}
$this->_link = @sqlsrv_connect(preg_replace('~:~', ',', $server), $connection_info);
if ($this->_link) {
$info = sqlsrv_server_info($this->_link);
$this->server_info = $info['SQLServerVersion'];
@@ -66,6 +72,9 @@ if (isset($_GET["mssql"])) {
if (!$result) {
$result = $this->_result;
}
if (!$result) {
return false;
}
if (sqlsrv_field_metadata($result)) {
return new Min_Result($result);
}
@@ -74,7 +83,7 @@ if (isset($_GET["mssql"])) {
}
function next_result() {
return sqlsrv_next_result($this->_result);
return $this->_result ? sqlsrv_next_result($this->_result) : null;
}
function result($query, $field = 0) {
@@ -90,7 +99,7 @@ if (isset($_GET["mssql"])) {
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
// $this->num_rows = sqlsrv_num_rows($result); // available only in scrollable results
}
@@ -104,13 +113,13 @@ if (isset($_GET["mssql"])) {
}
return $row;
}
function fetch_assoc() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT));
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC));
}
function fetch_row() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC, SQLSRV_SCROLL_NEXT));
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC));
}
function fetch_field() {
@@ -124,7 +133,7 @@ if (isset($_GET["mssql"])) {
$return->type = ($field["Type"] == 1 ? 254 : 0);
return $return;
}
function seek($offset) {
for ($i=0; $i < $offset; $i++) {
sqlsrv_fetch($this->_result); // SQLSRV_SCROLL_ABSOLUTE added in sqlsrv 1.1
@@ -135,7 +144,7 @@ if (isset($_GET["mssql"])) {
sqlsrv_free_stmt($this->_result);
}
}
} elseif (extension_loaded("mssql")) {
class Min_DB {
var $extension = "MSSQL", $_link, $_result, $server_info, $affected_rows, $error;
@@ -144,8 +153,10 @@ if (isset($_GET["mssql"])) {
$this->_link = @mssql_connect($server, $username, $password);
if ($this->_link) {
$result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')");
$row = $result->fetch_row();
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
if ($result) {
$row = $result->fetch_row();
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
}
} else {
$this->error = mssql_get_last_message();
}
@@ -161,7 +172,7 @@ if (isset($_GET["mssql"])) {
}
function query($query, $unbuffered = false) {
$result = mssql_query($query, $this->_link); //! $unbuffered
$result = @mssql_query($query, $this->_link); //! $unbuffered
$this->error = "";
if (!$result) {
$this->error = mssql_get_last_message();
@@ -183,7 +194,7 @@ if (isset($_GET["mssql"])) {
}
function next_result() {
return mssql_next_result($this->_result);
return mssql_next_result($this->_result->_result);
}
function result($query, $field = 0) {
@@ -198,7 +209,7 @@ if (isset($_GET["mssql"])) {
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
$this->num_rows = mssql_num_rows($result);
}
@@ -225,14 +236,60 @@ if (isset($_GET["mssql"])) {
function seek($offset) {
mssql_data_seek($this->_result, $offset);
}
function __destruct() {
mssql_free_result($this->_result);
}
}
} elseif (extension_loaded("pdo_dblib")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_DBLIB";
function connect($server, $username, $password) {
$this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\d)~', ';port=\1', $server)), $username, $password);
return true;
}
function select_db($database) {
// database selection is separated from the connection so dbname in DSN can't be used
return $this->query("USE " . idf_escape($database));
}
}
}
class Min_Driver extends Min_SQL {
function insertUpdate($table, $rows, $primary) {
foreach ($rows as $set) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
}
//! can use only one query for all rows
if (!queries("MERGE " . table($table) . " USING (VALUES(" . implode(", ", $set) . ")) AS source (c" . implode(", c", range(1, count($set))) . ") ON " . implode(" AND ", $where) //! source, c1 - possible conflict
. " WHEN MATCHED THEN UPDATE SET " . implode(", ", $update)
. " WHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ");" // ; is mandatory
)) {
return false;
}
}
return true;
}
function begin() {
return queries("BEGIN TRANSACTION");
}
}
function idf_escape($idf) {
return "[" . str_replace("]", "]]", $idf) . "]";
}
@@ -252,20 +309,20 @@ if (isset($_GET["mssql"])) {
}
function get_databases() {
return get_vals("EXEC sp_databases");
return get_vals("SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
}
function limit1($query, $where) {
return limit($query, $where, 1);
function limit1($table, $query, $where, $separator = "\n") {
return limit($query, $where, 1, 0, $separator);
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
}
function engines() {
@@ -290,10 +347,10 @@ if (isset($_GET["mssql"])) {
}
return $return;
}
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V')" . ($name != "" ? " AND name = " . q($name) : "")) as $row) {
foreach (get_rows("SELECT name AS Name, type_desc AS Engine FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
if ($name != "") {
return $row;
}
@@ -305,14 +362,14 @@ if (isset($_GET["mssql"])) {
function is_view($table_status) {
return $table_status["Engine"] == "VIEW";
}
function fk_support($table_status) {
return true;
}
function fields($table) {
$return = array();
foreach (get_rows("SELECT c.*, t.name type, d.definition [default]
foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
FROM sys.all_columns c
JOIN sys.all_objects o ON c.object_id = o.object_id
JOIN sys.types t ON c.user_type_id = t.user_type_id
@@ -320,7 +377,7 @@ LEFT JOIN sys.default_constraints d ON c.default_object_id = d.parent_column_id
WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U', 'V') AND o.name = " . q($table)
) as $row) {
$type = $row["type"];
$length = (ereg("char|binary", $type) ? $row["max_length"] : ($type == "decimal" ? "$row[precision],$row[scale]" : ""));
$length = (preg_match("~char|binary~", $type) ? $row["max_length"] : ($type == "decimal" ? "$row[precision],$row[scale]" : ""));
$return[$row["name"]] = array(
"field" => $row["name"],
"full_type" => $type . ($length ? "($length)" : ""),
@@ -340,28 +397,30 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
function indexes($table, $connection2 = null) {
$return = array();
// sp_statistics doesn't return information about primary key
foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name
foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name, is_descending_key
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE OBJECT_NAME(i.object_id) = " . q($table)
, $connection2) as $row) {
$return[$row["name"]]["type"] = ($row["is_primary_key"] ? "PRIMARY" : ($row["is_unique"] ? "UNIQUE" : "INDEX"));
$return[$row["name"]]["lengths"] = array();
$return[$row["name"]]["columns"][$row["key_ordinal"]] = $row["column_name"];
$name = $row["name"];
$return[$name]["type"] = ($row["is_primary_key"] ? "PRIMARY" : ($row["is_unique"] ? "UNIQUE" : "INDEX"));
$return[$name]["lengths"] = array();
$return[$name]["columns"][$row["key_ordinal"]] = $row["column_name"];
$return[$name]["descs"][$row["key_ordinal"]] = ($row["is_descending_key"] ? '1' : null);
}
return $return;
}
function view($name) {
global $connection;
return array("select" => preg_replace('~^(?:[^[]|\\[[^]]*])*\\s+AS\\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
return array("select" => preg_replace('~^(?:[^[]|\[[^]]*])*\s+AS\s+~isU', '', $connection->result("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = SCHEMA_NAME() AND TABLE_NAME = " . q($name))));
}
function collations() {
$return = array();
foreach (get_vals("SELECT name FROM fn_helpcollations()") as $collation) {
$return[ereg_replace("_.*", "", $collation)][] = $collation;
$return[preg_replace('~_.*~', '', $collation)][] = $collation;
}
return $return;
}
@@ -372,23 +431,19 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
function error() {
global $connection;
return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
}
function exact_value($val) {
return q($val);
return nl_br(h(preg_replace('~^(\[[^]]*])+~m', '', $connection->error)));
}
function create_database($db, $collation) {
return queries("CREATE DATABASE " . idf_escape($db) . (eregi('^[a-z0-9_]+$', $collation) ? " COLLATE $collation" : ""));
return queries("CREATE DATABASE " . idf_escape($db) . (preg_match('~^[a-z0-9_]+$~i', $collation) ? " COLLATE $collation" : ""));
}
function drop_databases($databases) {
return queries("DROP DATABASE " . implode(", ", array_map('idf_escape', $databases)));
}
function rename_database($name, $collation) {
if (eregi('^[a-z0-9_]+$', $collation)) {
if (preg_match('~^[a-z0-9_]+$~i', $collation)) {
queries("ALTER DATABASE " . idf_escape(DB) . " COLLATE $collation");
}
queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name));
@@ -396,9 +451,9 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
function auto_increment() {
return " IDENTITY" . ($_POST["Auto_increment"] != "" ? "(" . (+$_POST["Auto_increment"]) . ",1)" : "") . " PRIMARY KEY";
return " IDENTITY" . ($_POST["Auto_increment"] != "" ? "(" . number($_POST["Auto_increment"]) . ",1)" : "") . " PRIMARY KEY";
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
foreach ($fields as $field) {
@@ -407,7 +462,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
if (!$val) {
$alter["DROP"][] = " COLUMN $column";
} else {
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", '\1\2', $val[1]);
if ($field[0] == "") {
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
} else {
@@ -435,7 +490,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
}
return true;
}
function alter_indexes($table, $alter) {
$index = array();
$drop = array();
@@ -449,7 +504,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
} elseif (!queries(($val[0] != "PRIMARY"
? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
: "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
) . " $val[2]")) {
) . " (" . implode(", ", $val[2]) . ")")) {
return false;
}
}
@@ -457,46 +512,22 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
&& (!$drop || queries("ALTER TABLE " . table($table) . " DROP " . implode(", ", $drop)))
;
}
function begin() {
return queries("BEGIN TRANSACTION");
}
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . ($set ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")" : "DEFAULT VALUES"));
}
function insert_update($table, $set, $primary) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
}
// can use only one query for all rows with different API
return queries("MERGE " . table($table) . " USING (VALUES(" . implode(", ", $set) . ")) AS source (c" . implode(", c", range(1, count($set))) . ") ON " . implode(" AND ", $where) //! source, c1 - possible conflict
. " WHEN MATCHED THEN UPDATE SET " . implode(", ", $update)
. " WHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ");" // ; is mandatory
);
}
function last_id() {
global $connection;
return $connection->result("SELECT SCOPE_IDENTITY()"); // @@IDENTITY can return trigger INSERT
}
function explain($connection, $query) {
$connection->query("SET SHOWPLAN_ALL ON");
$return = $connection->query($query);
$connection->query("SET SHOWPLAN_ALL OFF"); // connection is used also for indexes
return $return;
}
function found_rows($table_status, $where) {
}
function foreign_keys($table) {
$return = array();
foreach (get_rows("EXEC sp_fkeys @fktable_name = " . q($table)) as $row) {
@@ -523,7 +554,7 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
function move_tables($tables, $views, $target) {
return apply_queries("ALTER SCHEMA " . idf_escape($target) . " TRANSFER", array_merge($tables, $views));
}
function trigger($name) {
if ($name == "") {
return array();
@@ -538,11 +569,11 @@ WHERE s.xtype = 'TR' AND s.name = " . q($name)
); // triggers are not schema-scoped
$return = reset($rows);
if ($return) {
$return["Statement"] = preg_replace('~^.+\\s+AS\\s+~isU', '', $return["text"]); //! identifiers, comments
$return["Statement"] = preg_replace('~^.+\s+AS\s+~isU', '', $return["text"]); //! identifiers, comments
}
return $return;
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT sys1.name,
@@ -556,18 +587,19 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("AFTER", "INSTEAD OF"),
"Event" => array("INSERT", "UPDATE", "DELETE"),
"Type" => array("AS"),
);
}
function schemas() {
return get_vals("SELECT name FROM sys.schemas");
}
function get_schema() {
global $connection;
if ($_GET["ns"] != "") {
@@ -575,34 +607,34 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
return $connection->result("SELECT SCHEMA_NAME()");
}
function set_schema($schema) {
return true; // ALTER USER is permanent
}
function use_sql($database) {
return "USE " . idf_escape($database);
}
function show_variables() {
return array();
}
function show_status() {
return array();
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return ereg('^(scheme|trigger|view|drop_col)$', $feature); //! routine|
return preg_match('~^(columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
}
$jush = "mssql";
$types = array();
$structured_types = array();

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
<?php
$drivers["oracle"] = "Oracle";
$drivers["oracle"] = "Oracle (beta)";
if (isset($_GET["oracle"])) {
$possible_drivers = array("OCI8", "PDO_OCI");
@@ -12,10 +12,10 @@ if (isset($_GET["oracle"])) {
if (ini_bool("html_errors")) {
$error = html_entity_decode(strip_tags($error));
}
$error = ereg_replace('^[^:]*: ', '', $error);
$error = preg_replace('~^[^:]*: ~', '', $error);
$this->error = $error;
}
function connect($server, $username, $password) {
$this->_link = @oci_new_connect($username, $password, $server, "AL32UTF8");
if ($this->_link) {
@@ -59,15 +59,15 @@ if (isset($_GET["oracle"])) {
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function result($query, $field = 1) {
$result = $this->query($query);
if (!is_object($result) || !oci_fetch($result->_result)) {
@@ -80,7 +80,7 @@ if (isset($_GET["oracle"])) {
class Min_Result {
var $_result, $_offset = 1, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
}
@@ -92,7 +92,7 @@ if (isset($_GET["oracle"])) {
}
return $row;
}
function fetch_assoc() {
return $this->_convert(oci_fetch_assoc($this->_result));
}
@@ -107,31 +107,45 @@ if (isset($_GET["oracle"])) {
$return->name = oci_field_name($this->_result, $column);
$return->orgname = $return->name;
$return->type = oci_field_type($this->_result, $column);
$return->charsetnr = (ereg("raw|blob|bfile", $return->type) ? 63 : 0); // 63 - binary
$return->charsetnr = (preg_match("~raw|blob|bfile~", $return->type) ? 63 : 0); // 63 - binary
return $return;
}
function __destruct() {
oci_free_statement($this->_result);
}
}
} elseif (extension_loaded("pdo_oci")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_OCI";
function connect($server, $username, $password) {
$this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
return true;
}
function select_db($database) {
return true;
}
}
}
class Min_Driver extends Min_SQL {
//! support empty $set in insert()
function begin() {
return true; // automatic start
}
}
function idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
@@ -161,8 +175,8 @@ if (isset($_GET["oracle"])) {
));
}
function limit1($query, $where) {
return " $query$where";
function limit1($table, $query, $where, $separator = "\n") {
return " $query$where"; //! limit
}
function db_collation($db, $collations) {
@@ -181,19 +195,21 @@ if (isset($_GET["oracle"])) {
function tables_list() {
return get_key_vals("SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "
UNION SELECT view_name, 'view' FROM user_views"
UNION SELECT view_name, 'view' FROM user_views
ORDER BY 1"
); //! views don't have schema
}
function count_tables($databases) {
return array();
}
function table_status($name = "") {
$return = array();
$search = q($name);
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "")
UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") . "
ORDER BY 1"
) as $row) {
if ($name != "") {
return $row;
@@ -206,7 +222,7 @@ UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE v
function is_view($table_status) {
return $table_status["Engine"] == "view";
}
function fk_support($table_status) {
return true;
}
@@ -243,9 +259,11 @@ FROM user_ind_columns uic
LEFT JOIN user_constraints uc ON uic.index_name = uc.constraint_name AND uic.table_name = uc.table_name
WHERE uic.table_name = " . q($table) . "
ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
$return[$row["INDEX_NAME"]]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
$return[$row["INDEX_NAME"]]["columns"][] = $row["COLUMN_NAME"];
$return[$row["INDEX_NAME"]]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null);
$index_name = $row["INDEX_NAME"];
$return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
$return[$index_name]["columns"][] = $row["COLUMN_NAME"];
$return[$index_name]["lengths"][] = ($row["CHAR_LENGTH"] && $row["CHAR_LENGTH"] != $row["COLUMN_LENGTH"] ? $row["CHAR_LENGTH"] : null);
$return[$index_name]["descs"][] = ($row["DESCEND"] ? '1' : null);
}
return $return;
}
@@ -254,7 +272,7 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
$rows = get_rows('SELECT text "select" FROM user_views WHERE view_name = ' . q($name));
return reset($rows);
}
function collations() {
return array(); //!
}
@@ -267,19 +285,15 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
global $connection;
return h($connection->error); //! highlight sqltext from offset
}
function exact_value($val) {
return q($val);
}
function explain($connection, $query) {
$connection->query("EXPLAIN PLAN FOR $query");
return $connection->query("SELECT * FROM plan_table");
}
function found_rows($table_status, $where) {
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = $drop = array();
foreach ($fields as $field) {
@@ -301,11 +315,33 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
&& ($table == $name || queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name)))
;
}
function foreign_keys($table) {
return array(); //!
$return = array();
$query = "SELECT c_list.CONSTRAINT_NAME as NAME,
c_src.COLUMN_NAME as SRC_COLUMN,
c_dest.OWNER as DEST_DB,
c_dest.TABLE_NAME as DEST_TABLE,
c_dest.COLUMN_NAME as DEST_COLUMN,
c_list.DELETE_RULE as ON_DELETE
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
AND c_list.CONSTRAINT_TYPE = 'R'
AND c_src.TABLE_NAME = " . q($table);
foreach (get_rows($query) as $row) {
$return[$row['NAME']] = array(
"db" => $row['DEST_DB'],
"table" => $row['DEST_TABLE'],
"source" => array($row['SRC_COLUMN']),
"target" => array($row['DEST_COLUMN']),
"on_delete" => $row['ON_DELETE'],
"on_update" => null,
);
}
return $return;
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
@@ -318,36 +354,28 @@ ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
return apply_queries("DROP TABLE", $tables);
}
function begin() {
return true; // automatic start
}
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")"); //! no columns
}
function last_id() {
return 0; //!
}
function schemas() {
return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
}
function get_schema() {
global $connection;
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
}
function set_schema($scheme) {
global $connection;
return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
}
function show_variables() {
return get_key_vals('SELECT name, display_value FROM v$parameter');
}
function process_list() {
return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
FROM v$session sess LEFT OUTER JOIN v$sql sql
@@ -356,23 +384,23 @@ WHERE sess.type = \'USER\'
ORDER BY PROCESS
');
}
function show_status() {
$rows = get_rows('SELECT * FROM v$instance');
return reset($rows);
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return ereg("view|scheme|processlist|drop_col|variables|status", $feature); //!
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
}
$jush = "oracle";
$types = array();
$structured_types = array();
@@ -386,7 +414,7 @@ ORDER BY PROCESS
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "");
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
$functions = array("length", "lower", "round", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(

View File

@@ -6,16 +6,16 @@ if (isset($_GET["pgsql"])) {
define("DRIVER", "pgsql");
if (extension_loaded("pgsql")) {
class Min_DB {
var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error;
var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error, $timeout;
function _error($errno, $error) {
if (ini_bool("html_errors")) {
$error = html_entity_decode(strip_tags($error));
}
$error = ereg_replace('^[^:]*: ', '', $error);
$error = preg_replace('~^[^:]*: ~', '', $error);
$this->error = $error;
}
function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
@@ -35,11 +35,19 @@ if (isset($_GET["pgsql"])) {
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea
return "'" . pg_escape_string($this->_link, $string) . "'";
}
function value($val, $field) {
return ($field["type"] == "bytea" ? pg_unescape_bytea($val) : $val);
}
function quoteBinary($string) {
return "'" . pg_escape_bytea($this->_link, $string) . "'";
}
function select_db($database) {
global $adminer;
if ($database == $adminer->database()) {
@@ -51,37 +59,43 @@ if (isset($_GET["pgsql"])) {
}
return $return;
}
function close() {
$this->_link = @pg_connect("$this->_string dbname='postgres'");
}
function query($query, $unbuffered = false) {
$result = @pg_query($this->_link, $query);
$this->error = "";
if (!$result) {
$this->error = pg_last_error($this->_link);
return false;
$return = false;
} elseif (!pg_num_fields($result)) {
$this->affected_rows = pg_affected_rows($result);
return true;
$return = true;
} else {
$return = new Min_Result($result);
}
return new Min_Result($result);
if ($this->timeout) {
$this->timeout = 0;
$this->query("RESET statement_timeout");
}
return $return;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
// PgSQL extension doesn't support multiple results
return false;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result || !$result->num_rows) {
@@ -89,24 +103,28 @@ if (isset($_GET["pgsql"])) {
}
return pg_fetch_result($result->_result, 0, $field);
}
function warnings() {
return h(pg_last_notice($this->_link)); // second parameter is available since PHP 7.1.0
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
$this->num_rows = pg_num_rows($result);
}
function fetch_assoc() {
return pg_fetch_assoc($this->_result);
}
function fetch_row() {
return pg_fetch_row($this->_result);
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
@@ -119,16 +137,16 @@ if (isset($_GET["pgsql"])) {
$return->charsetnr = ($return->type == "bytea" ? 63 : 0); // 63 - binary
return $return;
}
function __destruct() {
pg_free_result($this->_result);
}
}
} elseif (extension_loaded("pdo_pgsql")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_PgSQL";
var $extension = "PDO_PgSQL", $timeout;
function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
@@ -137,18 +155,97 @@ if (isset($_GET["pgsql"])) {
//! connect without DB in case of an error
return true;
}
function select_db($database) {
global $adminer;
return ($adminer->database() == $database);
}
function quoteBinary($s) {
return q($s);
}
function query($query, $unbuffered = false) {
$return = parent::query($query, $unbuffered);
if ($this->timeout) {
$this->timeout = 0;
parent::query("RESET statement_timeout");
}
return $return;
}
function warnings() {
return ''; // not implemented in PDO_PgSQL as of PHP 7.2.1
}
function close() {
}
}
}
class Min_Driver extends Min_SQL {
function insertUpdate($table, $rows, $primary) {
global $connection;
foreach ($rows as $set) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
}
if (!(($where && queries("UPDATE " . table($table) . " SET " . implode(", ", $update) . " WHERE " . implode(" AND ", $where)) && $connection->affected_rows)
|| queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")")
)) {
return false;
}
}
return true;
}
function slowQuery($query, $timeout) {
$this->_conn->query("SET statement_timeout = " . (1000 * $timeout));
$this->_conn->timeout = 1000 * $timeout;
return $query;
}
function convertSearch($idf, $val, $field) {
return (preg_match('~char|text'
. (!preg_match('~LIKE~', $val["op"]) ? '|date|time(stamp)?|boolean|uuid|' . number_type() : '')
. '~', $field["type"])
? $idf
: "CAST($idf AS text)"
);
}
function quoteBinary($s) {
return $this->_conn->quoteBinary($s);
}
function warnings() {
return $this->_conn->warnings();
}
function tableHelp($name) {
$links = array(
"information_schema" => "infoschema",
"pg_catalog" => "catalog",
);
$link = $links[$_GET["ns"]];
if ($link) {
return "$link-" . str_replace("_", "-", $name) . ".html";
}
}
}
function idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
@@ -158,30 +255,41 @@ if (isset($_GET["pgsql"])) {
}
function connect() {
global $adminer;
global $adminer, $types, $structured_types;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
if ($connection->server_info >= 9) {
if (min_version(9, 0, $connection)) {
$connection->query("SET application_name = 'Adminer'");
if (min_version(9.2, 0, $connection)) {
$structured_types[lang('Strings')][] = "json";
$types["json"] = 4294967295;
if (min_version(9.4, 0, $connection)) {
$structured_types[lang('Strings')][] = "jsonb";
$types["jsonb"] = 4294967295;
}
}
}
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT datname FROM pg_database ORDER BY datname");
return get_vals("SELECT datname FROM pg_database WHERE has_database_privilege(datname, 'CONNECT') ORDER BY datname");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
return " $query$where";
function limit1($table, $query, $where, $separator = "\n") {
return (preg_match('~^INTO~', $query)
? limit($query, $where, 1, 0, $separator)
: " $query" . (is_view(table_status1($table)) ? $where : " WHERE ctid = (SELECT ctid FROM " . table($table) . $where . $separator . "LIMIT 1)")
);
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SHOW LC_COLLATE"); //! respect $db
@@ -190,44 +298,61 @@ if (isset($_GET["pgsql"])) {
function engines() {
return array();
}
function logged_user() {
global $connection;
return $connection->result("SELECT user");
}
function tables_list() {
return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema() ORDER BY table_name");
$query = "SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema()";
if (support('materializedview')) {
$query .= "
UNION ALL
SELECT matviewname, 'MATERIALIZED VIEW'
FROM pg_matviews
WHERE schemaname = current_schema()";
}
$query .= "
ORDER BY 1";
return get_key_vals($query);
}
function count_tables($databases) {
return array(); // would require reconnect
}
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN 'table' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", obj_description(oid, 'pg_class') AS \"Comment\", relhasoids AS \"Oid\", reltuples as \"Rows\"
FROM pg_class
WHERE relkind IN ('r','v')
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())"
. ($name != "" ? " AND relname = " . q($name) : "")
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", CASE WHEN c.relhasoids THEN 'oid' ELSE '' END AS \"Oid\", c.reltuples as \"Rows\", n.nspname
FROM pg_class c
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
WHERE relkind IN ('r', 'm', 'v', 'f')
" . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
) as $row) { //! Index_length, Auto_increment
$return[$row["Name"]] = $row;
}
return ($name != "" ? $return[$name] : $return);
}
function is_view($table_status) {
return $table_status["Engine"] == "view";
return in_array($table_status["Engine"], array("view", "materialized view"));
}
function fk_support($table_status) {
return true;
}
function fields($table) {
$return = array();
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull, col_description(c.oid, a.attnum) AS comment
$aliases = array(
'timestamp without time zone' => 'timestamp',
'timestamp with time zone' => 'timestamptz',
);
$identity_column = min_version(10) ? "(a.attidentity = 'd')::int" : '0';
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
JOIN pg_attribute a ON c.oid = a.attrelid
@@ -239,20 +364,31 @@ AND a.attnum > 0
ORDER BY a.attnum"
) as $row) {
//! collation, primary
ereg('(.*)(\\((.*)\\))?', $row["full_type"], $match);
list(, $row["type"], , $row["length"]) = $match;
$row["full_type"] = $row["type"] . ($row["length"] ? "($row[length])" : "");
$row["null"] = ($row["attnotnull"] == "f");
$row["auto_increment"] = eregi("^nextval\\(", $row["default"]);
preg_match('~([^([]+)(\((.*)\))?([a-z ]+)?((\[[0-9]*])*)$~', $row["full_type"], $match);
list(, $type, $length, $row["length"], $addon, $array) = $match;
$row["length"] .= $array;
$check_type = $type . $addon;
if (isset($aliases[$check_type])) {
$row["type"] = $aliases[$check_type];
$row["full_type"] = $row["type"] . $length . $array;
} else {
$row["type"] = $type;
$row["full_type"] = $row["type"] . $length . $addon . $array;
}
if ($row['identity']) {
$row['default'] = 'GENERATED BY DEFAULT AS IDENTITY';
}
$row["null"] = !$row["attnotnull"];
$row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
if (preg_match('~^(.*)::.+$~', $row["default"], $match)) {
$row["default"] = ($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]);
if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
$row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
}
$return[$row["field"]] = $row;
}
return $return;
}
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
@@ -261,31 +397,35 @@ ORDER BY a.attnum"
$return = array();
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
foreach (get_rows("SELECT relname, indisunique, indisprimary, indkey FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
$return[$row["relname"]]["type"] = ($row["indisprimary"] == "t" ? "PRIMARY" : ($row["indisunique"] == "t" ? "UNIQUE" : "INDEX"));
$return[$row["relname"]]["columns"] = array();
foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption , (indpred IS NOT NULL)::int as indispartial FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
$relname = $row["relname"];
$return[$relname]["type"] = ($row["indispartial"] ? "INDEX" : ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX")));
$return[$relname]["columns"] = array();
foreach (explode(" ", $row["indkey"]) as $indkey) {
$return[$row["relname"]]["columns"][] = $columns[$indkey];
$return[$relname]["columns"][] = $columns[$indkey];
}
$return[$row["relname"]]["lengths"] = array();
$return[$relname]["descs"] = array();
foreach (explode(" ", $row["indoption"]) as $indoption) {
$return[$relname]["descs"][] = ($indoption & 1 ? '1' : null); // 1 - INDOPTION_DESC
}
$return[$relname]["lengths"] = array();
}
return $return;
}
function foreign_keys($table) {
global $on_actions;
$return = array();
foreach (get_rows("SELECT conname, pg_get_constraintdef(oid) AS definition
foreach (get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition
FROM pg_constraint
WHERE conrelid = (SELECT pc.oid FROM pg_class AS pc INNER JOIN pg_namespace AS pn ON (pn.oid = pc.relnamespace) WHERE pc.relname = " . q($table) . " AND pn.nspname = current_schema())
AND contype = 'f'::char
ORDER BY conkey, conname") as $row) {
if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) {
$row['source'] = array_map('trim', explode(',', $match[1]));
$row['table'] = $match[2];
if (preg_match('~(.+)\.(.+)~', $match[2], $match2)) {
$row['ns'] = $match2[1];
$row['table'] = $match2[2];
if (preg_match('~^(("([^"]|"")+"|[^"]+)\.)?"?("([^"]|"")+"|[^"]+)$~', $match[2], $match2)) {
$row['ns'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[2]));
$row['table'] = str_replace('""', '"', preg_replace('~^"(.+)"$~', '\1', $match2[4]));
}
$row['target'] = array_map('trim', explode(',', $match[3]));
$row['on_delete'] = (preg_match("~ON DELETE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION');
@@ -295,53 +435,51 @@ ORDER BY conkey, conname") as $row) {
}
return $return;
}
function view($name) {
global $connection;
return array("select" => $connection->result("SELECT pg_get_viewdef(" . q($name) . ")"));
return array("select" => trim($connection->result("SELECT view_definition
FROM information_schema.views
WHERE table_schema = current_schema() AND table_name = " . q($name))));
}
function collations() {
//! supported in CREATE DATABASE
return array();
}
function information_schema($db) {
return ($db == "information_schema");
}
function error() {
global $connection;
$return = h($connection->error);
if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) {
$return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\\1<b>\\2</b>', $match[2]) . $match[4];
if (preg_match('~^(.*\n)?([^\n]*)\n( *)\^(\n.*)?$~s', $return, $match)) {
$return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\1<b>\2</b>', $match[2]) . $match[4];
}
return nl_br($return);
}
function exact_value($val) {
return q($val);
}
function create_database($db, $collation) {
return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " ENCODING " . idf_escape($collation) : ""));
}
function drop_databases($databases) {
global $connection;
$connection->close();
return apply_queries("DROP DATABASE", $databases, 'idf_escape');
}
function rename_database($name, $collation) {
//! current database cannot be renamed
return queries("ALTER DATABASE " . idf_escape(DB) . " RENAME TO " . idf_escape($name));
}
function auto_increment() {
return "";
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
$queries = array();
@@ -364,7 +502,7 @@ ORDER BY conkey, conname") as $row) {
}
$alter[] = "ALTER $column TYPE$val[1]";
if (!$val[6]) {
$alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT"); //! quoting
$alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT");
$alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2];
}
}
@@ -395,138 +533,138 @@ ORDER BY conkey, conname") as $row) {
}
return true;
}
function alter_indexes($table, $alter) {
$create = array();
$drop = array();
$queries = array();
foreach ($alter as $val) {
if ($val[0] != "INDEX") {
//! descending UNIQUE indexes results in syntax error
$create[] = ($val[2] == "DROP"
? "\nDROP CONSTRAINT " . idf_escape($val[1])
: "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . $val[2]
: "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $val[2]) . ")"
);
} elseif ($val[2] == "DROP") {
$drop[] = idf_escape($val[1]);
} elseif (!queries("CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " $val[2]")) {
} else {
$queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " (" . implode(", ", $val[2]) . ")";
}
}
if ($create) {
array_unshift($queries, "ALTER TABLE " . table($table) . implode(",", $create));
}
if ($drop) {
array_unshift($queries, "DROP INDEX " . implode(", ", $drop));
}
foreach ($queries as $query) {
if (!queries($query)) {
return false;
}
}
return ((!$create || queries("ALTER TABLE " . table($table) . implode(",", $create)))
&& (!$drop || queries("DROP INDEX " . implode(", ", $drop)))
);
return true;
}
function truncate_tables($tables) {
return queries("TRUNCATE " . implode(", ", array_map('table', $tables)));
return true;
}
function drop_views($views) {
return queries("DROP VIEW " . implode(", ", array_map('table', $views)));
return drop_tables($views);
}
function drop_tables($tables) {
return queries("DROP TABLE " . implode(", ", array_map('table', $tables)));
}
function move_tables($tables, $views, $target) {
foreach ($tables as $table) {
if (!queries("ALTER TABLE " . table($table) . " SET SCHEMA " . idf_escape($target))) {
return false;
}
$status = table_status($table);
if (!queries("DROP " . strtoupper($status["Engine"]) . " " . table($table))) {
return false;
}
}
foreach ($views as $table) {
if (!queries("ALTER VIEW " . table($table) . " SET SCHEMA " . idf_escape($target))) {
return true;
}
function move_tables($tables, $views, $target) {
foreach (array_merge($tables, $views) as $table) {
$status = table_status($table);
if (!queries("ALTER " . strtoupper($status["Engine"]) . " " . table($table) . " SET SCHEMA " . idf_escape($target))) {
return false;
}
}
return true;
}
function trigger($name) {
function trigger($name, $table = null) {
if ($name == "") {
return array("Statement" => "EXECUTE PROCEDURE ()");
}
$rows = get_rows('SELECT trigger_name AS "Trigger", condition_timing AS "Timing", event_manipulation AS "Event", \'FOR EACH \' || action_orientation AS "Type", action_statement AS "Statement" FROM information_schema.triggers WHERE event_object_table = ' . q($_GET["trigger"]) . ' AND trigger_name = ' . q($name));
if ($table === null) {
$table = $_GET['trigger'];
}
$rows = get_rows('SELECT t.trigger_name AS "Trigger", t.action_timing AS "Timing", (SELECT STRING_AGG(event_manipulation, \' OR \') FROM information_schema.triggers WHERE event_object_table = t.event_object_table AND trigger_name = t.trigger_name ) AS "Events", t.event_manipulation AS "Event", \'FOR EACH \' || t.action_orientation AS "Type", t.action_statement AS "Statement" FROM information_schema.triggers t WHERE t.event_object_table = ' . q($table) . ' AND t.trigger_name = ' . q($name));
return reset($rows);
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
$return[$row["trigger_name"]] = array($row["condition_timing"], $row["event_manipulation"]);
$return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]);
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER"),
"Event" => array("INSERT", "UPDATE", "DELETE"),
"Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"),
);
}
/*
function routine($name, $type) {
//! there can be more functions with the same name differing only in parameters, it must be also passed to DROP FUNCTION
//! no procedures, only functions
//! different syntax of CREATE FUNCTION
$rows = get_rows('SELECT pg_catalog.format_type(p.prorettype, NULL) AS "returns", p.prosrc AS "definition"
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
WHERE n.nspname = current_schema() AND p.proname = ' . q($name));
$rows[0]["fields"] = array(); //!
return $rows[0];
$rows = get_rows('SELECT routine_definition AS definition, LOWER(external_language) AS language, *
FROM information_schema.routines
WHERE routine_schema = current_schema() AND specific_name = ' . q($name));
$return = $rows[0];
$return["returns"] = array("type" => $return["type_udt_name"]);
$return["fields"] = get_rows('SELECT parameter_name AS field, data_type AS type, character_maximum_length AS length, parameter_mode AS inout
FROM information_schema.parameters
WHERE specific_schema = current_schema() AND specific_name = ' . q($name) . '
ORDER BY ordinal_position');
return $return;
}
*/
function routines() {
return get_rows('SELECT p.proname AS "ROUTINE_NAME", p.proargtypes AS "ROUTINE_TYPE", pg_catalog.format_type(p.prorettype, NULL) AS "DTD_IDENTIFIER"
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
WHERE n.nspname = current_schema()
ORDER BY p.proname');
return get_rows('SELECT specific_name AS "SPECIFIC_NAME", routine_type AS "ROUTINE_TYPE", routine_name AS "ROUTINE_NAME", type_udt_name AS "DTD_IDENTIFIER"
FROM information_schema.routines
WHERE routine_schema = current_schema()
ORDER BY SPECIFIC_NAME');
}
function routine_languages() {
return get_vals("SELECT langname FROM pg_catalog.pg_language");
return get_vals("SELECT LOWER(lanname) FROM pg_catalog.pg_language");
}
function begin() {
return queries("BEGIN");
}
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . ($set ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")" : "DEFAULT VALUES"));
}
function insert_update($table, $set, $primary) {
global $connection;
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
function routine_id($name, $row) {
$return = array();
foreach ($row["fields"] as $field) {
$return[] = $field["type"];
}
return ($where && queries("UPDATE " . table($table) . " SET " . implode(", ", $update) . " WHERE " . implode(" AND ", $where)) && $connection->affected_rows)
|| queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")")
;
return idf_escape($name) . "(" . implode(", ", $return) . ")";
}
function last_id() {
return 0; // there can be several sequences
}
function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
}
function found_rows($table_status, $where) {
global $connection;
if (ereg(
" rows=([0-9]+)",
if (preg_match(
"~ rows=([0-9]+)~",
$connection->result("EXPLAIN SELECT * FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")),
$regs
)) {
@@ -534,7 +672,7 @@ ORDER BY p.proname');
}
return false;
}
function types() {
return get_vals("SELECT typname
FROM pg_type
@@ -543,16 +681,16 @@ AND typtype IN ('b','d','e')
AND typelem = 0"
);
}
function schemas() {
return get_vals("SELECT nspname FROM pg_namespace ORDER BY nspname");
}
function get_schema() {
global $connection;
return $connection->result("SELECT current_schema()");
}
function set_schema($schema) {
global $connection, $types, $structured_types;
$return = $connection->query("SET search_path TO " . idf_escape($schema));
@@ -564,34 +702,144 @@ AND typelem = 0"
}
return $return;
}
function create_sql($table, $auto_increment, $style) {
global $connection;
$return = '';
$return_parts = array();
$sequences = array();
$status = table_status($table);
$fields = fields($table);
$indexes = indexes($table);
ksort($indexes);
$fkeys = foreign_keys($table);
ksort($fkeys);
if (!$status || empty($fields)) {
return false;
}
$return = "CREATE TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " (\n ";
// fields' definitions
foreach ($fields as $field_name => $field) {
$part = idf_escape($field['field']) . ' ' . $field['full_type']
. default_value($field)
. ($field['attnotnull'] ? " NOT NULL" : "");
$return_parts[] = $part;
// sequences for fields
if (preg_match('~nextval\(\'([^\']+)\'\)~', $field['default'], $matches)) {
$sequence_name = $matches[1];
$sq = reset(get_rows(min_version(10)
? "SELECT *, cache_size AS cache_value FROM pg_sequences WHERE schemaname = current_schema() AND sequencename = " . q($sequence_name)
: "SELECT * FROM $sequence_name"
));
$sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "")
. "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value] START " . ($auto_increment ? $sq['last_value'] : 1) . " CACHE $sq[cache_value];";
}
}
// adding sequences before table definition
if (!empty($sequences)) {
$return = implode("\n\n", $sequences) . "\n\n$return";
}
// primary + unique keys
foreach ($indexes as $index_name => $index) {
switch($index['type']) {
case 'UNIQUE': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " UNIQUE (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
case 'PRIMARY': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " PRIMARY KEY (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
}
}
// foreign keys
foreach ($fkeys as $fkey_name => $fkey) {
$return_parts[] = "CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition] " . ($fkey['deferrable'] ? 'DEFERRABLE' : 'NOT DEFERRABLE');
}
$return .= implode(",\n ", $return_parts) . "\n) WITH (oids = " . ($status['Oid'] ? 'true' : 'false') . ");";
// "basic" indexes after table definition
foreach ($indexes as $index_name => $index) {
if ($index['type'] == 'INDEX') {
$columns = array();
foreach ($index['columns'] as $key => $val) {
$columns[] = idf_escape($val) . ($index['descs'][$key] ? " DESC" : "");
}
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', $columns) . ");";
}
}
// coments for table & fields
if ($status['Comment']) {
$return .= "\n\nCOMMENT ON TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " IS " . q($status['Comment']) . ";";
}
foreach ($fields as $field_name => $field) {
if ($field['comment']) {
$return .= "\n\nCOMMENT ON COLUMN " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . "." . idf_escape($field_name) . " IS " . q($field['comment']) . ";";
}
}
return rtrim($return, ';');
}
function truncate_sql($table) {
return "TRUNCATE " . table($table);
}
function trigger_sql($table) {
$status = table_status($table);
$return = "";
foreach (triggers($table) as $trg_id => $trg) {
$trigger = trigger($trg_id, $status['Name']);
$return .= "\nCREATE TRIGGER " . idf_escape($trigger['Trigger']) . " $trigger[Timing] $trigger[Events] ON " . idf_escape($status["nspname"]) . "." . idf_escape($status['Name']) . " $trigger[Type] $trigger[Statement];;\n";
}
return $return;
}
function use_sql($database) {
return "\connect " . idf_escape($database);
}
function show_variables() {
return get_key_vals("SHOW ALL");
}
function process_list() {
global $connection;
return get_rows("SELECT * FROM pg_stat_activity ORDER BY " . ($connection->server_info < 9.2 ? "procpid" : "pid"));
return get_rows("SELECT * FROM pg_stat_activity ORDER BY " . (min_version(9.2) ? "pid" : "procpid"));
}
function show_status() {
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return ereg('^(comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$', $feature); //! routine|
return preg_match('~^(database|table|columns|sql|indexes|descidx|comment|view|' . (min_version(9.3) ? 'materializedview|' : '') . 'scheme|routine|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature);
}
function kill_process($val) {
return queries("SELECT pg_terminate_backend(" . number($val) . ")");
}
function connection_id(){
return "SELECT pg_backend_pid()";
}
function max_connections() {
global $connection;
return $connection->result("SHOW max_connections");
}
$jush = "pgsql";
$types = array();
$structured_types = array();
@@ -607,7 +855,7 @@ AND typelem = 0"
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "" to avoid SQL injection
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
$functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(
@@ -615,7 +863,7 @@ AND typelem = 0"
"char" => "md5",
"date|time" => "now",
), array(
"int|numeric|real|money" => "+/-",
number_type() => "+/-",
"date|time" => "+ interval/- interval", //! escape
"char|text" => "||",
)

View File

@@ -0,0 +1,484 @@
<?php
$drivers["simpledb"] = "SimpleDB";
if (isset($_GET["simpledb"])) {
$possible_drivers = array("SimpleXML + allow_url_fopen");
define("DRIVER", "simpledb");
if (class_exists('SimpleXMLElement') && ini_bool('allow_url_fopen')) {
class Min_DB {
var $extension = "SimpleXML", $server_info = '2009-04-15', $error, $timeout, $next, $affected_rows, $_result;
function select_db($database) {
return ($database == "domain");
}
function query($query, $unbuffered = false) {
$params = array('SelectExpression' => $query, 'ConsistentRead' => 'true');
if ($this->next) {
$params['NextToken'] = $this->next;
}
$result = sdb_request_all('Select', 'Item', $params, $this->timeout); //! respect $unbuffered
$this->timeout = 0;
if ($result === false) {
return $result;
}
if (preg_match('~^\s*SELECT\s+COUNT\(~i', $query)) {
$sum = 0;
foreach ($result as $item) {
$sum += $item->Attribute->Value;
}
$result = array((object) array('Attribute' => array((object) array(
'Name' => 'Count',
'Value' => $sum,
))));
}
return new Min_Result($result);
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return false;
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
}
class Min_Result {
var $num_rows, $_rows = array(), $_offset = 0;
function __construct($result) {
foreach ($result as $item) {
$row = array();
if ($item->Name != '') { // SELECT COUNT(*)
$row['itemName()'] = (string) $item->Name;
}
foreach ($item->Attribute as $attribute) {
$name = $this->_processValue($attribute->Name);
$value = $this->_processValue($attribute->Value);
if (isset($row[$name])) {
$row[$name] = (array) $row[$name];
$row[$name][] = $value;
} else {
$row[$name] = $value;
}
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = count($this->_rows);
}
function _processValue($element) {
return (is_object($element) && $element['encoding'] == 'base64' ? base64_decode($element) : (string) $element);
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
return (object) array('name' => $keys[$this->_offset++]);
}
}
}
class Min_Driver extends Min_SQL {
public $primary = "itemName()";
function _chunkRequest($ids, $action, $params, $expand = array()) {
global $connection;
foreach (array_chunk($ids, 25) as $chunk) {
$params2 = $params;
foreach ($chunk as $i => $id) {
$params2["Item.$i.ItemName"] = $id;
foreach ($expand as $key => $val) {
$params2["Item.$i.$key"] = $val;
}
}
if (!sdb_request($action, $params2)) {
return false;
}
}
$connection->affected_rows = count($ids);
return true;
}
function _extractIds($table, $queryWhere, $limit) {
$return = array();
if (preg_match_all("~itemName\(\) = (('[^']*+')+)~", $queryWhere, $matches)) {
$return = array_map('idf_unescape', $matches[1]);
} else {
foreach (sdb_request_all('Select', 'Item', array('SelectExpression' => 'SELECT itemName() FROM ' . table($table) . $queryWhere . ($limit ? " LIMIT 1" : ""))) as $item) {
$return[] = $item->Name;
}
}
return $return;
}
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $connection;
$connection->next = $_GET["next"];
$return = parent::select($table, $select, $where, $group, $order, $limit, $page, $print);
$connection->next = 0;
return $return;
}
function delete($table, $queryWhere, $limit = 0) {
return $this->_chunkRequest(
$this->_extractIds($table, $queryWhere, $limit),
'BatchDeleteAttributes',
array('DomainName' => $table)
);
}
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
$delete = array();
$insert = array();
$i = 0;
$ids = $this->_extractIds($table, $queryWhere, $limit);
$id = idf_unescape($set["`itemName()`"]);
unset($set["`itemName()`"]);
foreach ($set as $key => $val) {
$key = idf_unescape($key);
if ($val == "NULL" || ($id != "" && array($id) != $ids)) {
$delete["Attribute." . count($delete) . ".Name"] = $key;
}
if ($val != "NULL") {
foreach ((array) $val as $k => $v) {
$insert["Attribute.$i.Name"] = $key;
$insert["Attribute.$i.Value"] = (is_array($val) ? $v : idf_unescape($v));
if (!$k) {
$insert["Attribute.$i.Replace"] = "true";
}
$i++;
}
}
}
$params = array('DomainName' => $table);
return (!$insert || $this->_chunkRequest(($id != "" ? array($id) : $ids), 'BatchPutAttributes', $params, $insert))
&& (!$delete || $this->_chunkRequest($ids, 'BatchDeleteAttributes', $params, $delete))
;
}
function insert($table, $set) {
$params = array("DomainName" => $table);
$i = 0;
foreach ($set as $name => $value) {
if ($value != "NULL") {
$name = idf_unescape($name);
if ($name == "itemName()") {
$params["ItemName"] = idf_unescape($value);
} else {
foreach ((array) $value as $val) {
$params["Attribute.$i.Name"] = $name;
$params["Attribute.$i.Value"] = (is_array($value) ? $val : idf_unescape($value));
$i++;
}
}
}
}
return sdb_request('PutAttributes', $params);
}
function insertUpdate($table, $rows, $primary) {
//! use one batch request
foreach ($rows as $set) {
if (!$this->update($table, $set, "WHERE `itemName()` = " . q($set["`itemName()`"]))) {
return false;
}
}
return true;
}
function begin() {
return false;
}
function commit() {
return false;
}
function rollback() {
return false;
}
function slowQuery($query, $timeout) {
$this->_conn->timeout = $timeout;
return $query;
}
}
function connect() {
global $adminer;
list(, , $password) = $adminer->credentials();
if ($password != "") {
return lang('Database does not support password.');
}
return new Min_DB;
}
function support($feature) {
return preg_match('~sql~', $feature);
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function get_databases() {
return array("domain");
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function tables_list() {
global $connection;
$return = array();
foreach (sdb_request_all('ListDomains', 'DomainName') as $table) {
$return[(string) $table] = 'table';
}
if ($connection->error && defined("PAGE_HEADER")) {
echo "<p class='error'>" . error() . "\n";
}
return $return;
}
function table_status($name = "", $fast = false) {
$return = array();
foreach (($name != "" ? array($name => true) : tables_list()) as $table => $type) {
$row = array("Name" => $table, "Auto_increment" => "");
if (!$fast) {
$meta = sdb_request('DomainMetadata', array('DomainName' => $table));
if ($meta) {
foreach (array(
"Rows" => "ItemCount",
"Data_length" => "ItemNamesSizeBytes",
"Index_length" => "AttributeValuesSizeBytes",
"Data_free" => "AttributeNamesSizeBytes",
) as $key => $val) {
$row[$key] = (string) $meta->$val;
}
}
}
if ($name != "") {
return $row;
}
$return[$table] = $row;
}
return $return;
}
function explain($connection, $query) {
}
function error() {
global $connection;
return h($connection->error);
}
function information_schema() {
}
function is_view($table_status) {
}
function indexes($table, $connection2 = null) {
return array(
array("type" => "PRIMARY", "columns" => array("itemName()")),
);
}
function fields($table) {
return fields_from_edit();
}
function foreign_keys($table) {
return array();
}
function table($idf) {
return idf_escape($idf);
}
function idf_escape($idf) {
return "`" . str_replace("`", "``", $idf) . "`";
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" : "");
}
function unconvert_field($field, $return) {
return $return;
}
function fk_support($table_status) {
}
function engines() {
return array();
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
return ($table == "" && sdb_request('CreateDomain', array('DomainName' => $name)));
}
function drop_tables($tables) {
foreach ($tables as $table) {
if (!sdb_request('DeleteDomain', array('DomainName' => $table))) {
return false;
}
}
return true;
}
function count_tables($databases) {
foreach ($databases as $db) {
return array($db => count(tables_list()));
}
}
function found_rows($table_status, $where) {
return ($where ? null : $table_status["Rows"]);
}
function last_id() {
}
function hmac($algo, $data, $key, $raw_output = false) {
// can use hash_hmac() since PHP 5.1.2
$blocksize = 64;
if (strlen($key) > $blocksize) {
$key = pack("H*", $algo($key));
}
$key = str_pad($key, $blocksize, "\0");
$k_ipad = $key ^ str_repeat("\x36", $blocksize);
$k_opad = $key ^ str_repeat("\x5C", $blocksize);
$return = $algo($k_opad . pack("H*", $algo($k_ipad . $data)));
if ($raw_output) {
$return = pack("H*", $return);
}
return $return;
}
function sdb_request($action, $params = array()) {
global $adminer, $connection;
list($host, $params['AWSAccessKeyId'], $secret) = $adminer->credentials();
$params['Action'] = $action;
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s+00:00');
$params['Version'] = '2009-04-15';
$params['SignatureVersion'] = 2;
$params['SignatureMethod'] = 'HmacSHA1';
ksort($params);
$query = '';
foreach ($params as $key => $val) {
$query .= '&' . rawurlencode($key) . '=' . rawurlencode($val);
}
$query = str_replace('%7E', '~', substr($query, 1));
$query .= "&Signature=" . urlencode(base64_encode(hmac('sha1', "POST\n" . preg_replace('~^https?://~', '', $host) . "\n/\n$query", $secret, true)));
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents((preg_match('~^https?://~', $host) ? $host : "http://$host"), false, stream_context_create(array('http' => array(
'method' => 'POST', // may not fit in URL with GET
'content' => $query,
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if (!$file) {
$connection->error = $php_errormsg;
return false;
}
libxml_use_internal_errors(true);
$xml = simplexml_load_string($file);
if (!$xml) {
$error = libxml_get_last_error();
$connection->error = $error->message;
return false;
}
if ($xml->Errors) {
$error = $xml->Errors->Error;
$connection->error = "$error->Message ($error->Code)";
return false;
}
$connection->error = '';
$tag = $action . "Result";
return ($xml->$tag ? $xml->$tag : true);
}
function sdb_request_all($action, $tag, $params = array(), $timeout = 0) {
$return = array();
$start = ($timeout ? microtime(true) : 0);
$limit = (preg_match('~LIMIT\s+(\d+)\s*$~i', $params['SelectExpression'], $match) ? $match[1] : 0);
do {
$xml = sdb_request($action, $params);
if (!$xml) {
break;
}
foreach ($xml->$tag as $element) {
$return[] = $element;
}
if ($limit && count($return) >= $limit) {
$_GET["next"] = $xml->NextToken;
break;
}
if ($timeout && microtime(true) - $start > $timeout) {
return false;
}
$params['NextToken'] = $xml->NextToken;
if ($limit) {
$params['SelectExpression'] = preg_replace('~\d+\s*$~', $limit - count($return), $params['SelectExpression']);
}
} while ($xml->NextToken);
return $return;
}
$jush = "simpledb";
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL");
$functions = array();
$grouping = array("count");
$edit_functions = array(array("json"));
}

View File

@@ -5,18 +5,18 @@ $drivers["sqlite2"] = "SQLite 2";
if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$possible_drivers = array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite");
define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
if (extension_loaded(isset($_GET["sqlite"]) ? "sqlite3" : "sqlite")) {
if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
if (isset($_GET["sqlite"])) {
class Min_SQLite {
var $extension = "SQLite3", $server_info, $affected_rows, $errno, $error, $_link;
function Min_SQLite($filename) {
function __construct($filename) {
$this->_link = new SQLite3($filename);
$version = $this->_link->version();
$this->server_info = $version["versionString"];
}
function query($query) {
$result = @$this->_link->query($query);
$this->error = "";
@@ -30,18 +30,18 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$this->affected_rows = $this->_link->changes();
return true;
}
function quote($string) {
return (is_utf8($string)
? "'" . $this->_link->escapeString($string) . "'"
: "x'" . reset(unpack('H*', $string)) . "'"
);
}
function store_result() {
return $this->_result;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
@@ -51,22 +51,22 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
}
function fetch_assoc() {
return $this->_result->fetchArray(SQLITE3_ASSOC);
}
function fetch_row() {
return $this->_result->fetchArray(SQLITE3_NUM);
}
function fetch_field() {
$column = $this->_offset++;
$type = $this->_result->columnType($column);
@@ -76,22 +76,22 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
"charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary
);
}
function __desctruct() {
return $this->_result->finalize();
}
}
} else {
class Min_SQLite {
var $extension = "SQLite", $server_info, $affected_rows, $error, $_link;
function Min_SQLite($filename) {
function __construct($filename) {
$this->server_info = sqlite_libversion();
$this->_link = new SQLiteDatabase($filename);
}
function query($query, $unbuffered = false) {
$method = ($unbuffered ? "unbufferedQuery" : "query");
$result = @$this->_link->$method($query, SQLITE_BOTH, $error);
@@ -105,15 +105,15 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return new Min_Result($result);
}
function quote($string) {
return "'" . sqlite_escape_string($string) . "'";
}
function store_result() {
return $this->_result;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
@@ -123,17 +123,17 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($result) {
function __construct($result) {
$this->_result = $result;
if (method_exists($result, 'numRows')) { // not available in unbuffered query
$this->num_rows = $result->numRows();
}
}
function fetch_assoc() {
$row = $this->_result->fetch(SQLITE_ASSOC);
if (!$row) {
@@ -145,14 +145,14 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function fetch_row() {
return $this->_result->fetch(SQLITE_NUM);
}
function fetch_field() {
$name = $this->_result->fieldName($this->_offset++);
$pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
$pattern = '(\[.*]|"(?:[^"]|"")*"|(.+))';
if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) {
$table = ($match[3] != "" ? $match[3] : idf_unescape($match[2]));
$name = ($match[5] != "" ? $match[5] : idf_unescape($match[4]));
@@ -163,47 +163,74 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
"orgtable" => $table,
);
}
}
}
} elseif (extension_loaded("pdo_sqlite")) {
class Min_SQLite extends Min_PDO {
var $extension = "PDO_SQLite";
function Min_SQLite($filename) {
function __construct($filename) {
$this->dsn(DRIVER . ":$filename", "", "");
}
}
}
if (class_exists("Min_SQLite")) {
class Min_DB extends Min_SQLite {
function Min_DB() {
$this->Min_SQLite(":memory:");
function __construct() {
parent::__construct(":memory:");
$this->query("PRAGMA foreign_keys = 1");
}
function select_db($filename) {
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(ereg("(^[/\\\\]|:)", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
$this->Min_SQLite($filename);
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
parent::__construct($filename);
$this->query("PRAGMA foreign_keys = 1");
return true;
}
return false;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function next_result() {
return false;
}
}
}
class Min_Driver extends Min_SQL {
function insertUpdate($table, $rows, $primary) {
$values = array();
foreach ($rows as $set) {
$values[] = "(" . implode(", ", $set) . ")";
}
return queries("REPLACE INTO " . table($table) . " (" . implode(", ", array_keys(reset($rows))) . ") VALUES\n" . implode(",\n", $values));
}
function tableHelp($name) {
if ($name == "sqlite_sequence") {
return "fileformat2.html#seqtab";
}
if ($name == "sqlite_master") {
return "fileformat2.html#$name";
}
}
}
function idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
@@ -213,6 +240,11 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function connect() {
global $adminer;
list(, , $password) = $adminer->credentials();
if ($password != "") {
return lang('Database does not support password.');
}
return new Min_DB;
}
@@ -224,9 +256,12 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
function limit1($table, $query, $where, $separator = "\n") {
global $connection;
return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where");
return (preg_match('~^INTO~', $query) || $connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')")
? limit($query, $where, 1, 0, $separator)
: " $query WHERE rowid = (SELECT rowid FROM " . table($table) . $where . $separator . "LIMIT 1)" //! use primary key in tables with WITHOUT rowid
);
}
function db_collation($db, $collations) {
@@ -243,7 +278,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function tables_list() {
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name", 1);
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name");
}
function count_tables($databases) {
@@ -253,9 +288,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function table_status($name = "") {
global $connection;
$return = array();
foreach (get_rows("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view')" . ($name != "" ? " AND name = " . q($name) : "")) as $row) {
$row["Oid"] = "t";
$row["Auto_increment"] = "";
foreach (get_rows("SELECT name AS Name, type AS Engine, 'rowid' AS Oid, '' AS Auto_increment FROM sqlite_master WHERE type IN ('table', 'view') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
$row["Rows"] = $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["Name"]));
$return[$row["Name"]] = $row;
}
@@ -268,51 +301,93 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function is_view($table_status) {
return $table_status["Engine"] == "view";
}
function fk_support($table_status) {
global $connection;
return !$connection->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");
}
function fields($table) {
global $connection;
$return = array();
$primary = "";
foreach (get_rows("PRAGMA table_info(" . table($table) . ")") as $row) {
$name = $row["name"];
$type = strtolower($row["type"]);
$default = $row["dflt_value"];
$return[$row["name"]] = array(
"field" => $row["name"],
"type" => (eregi("int", $type) ? "integer" : (eregi("char|clob|text", $type) ? "text" : (eregi("blob", $type) ? "blob" : (eregi("real|floa|doub", $type) ? "real" : "numeric")))),
$return[$name] = array(
"field" => $name,
"type" => (preg_match('~int~i', $type) ? "integer" : (preg_match('~char|clob|text~i', $type) ? "text" : (preg_match('~blob~i', $type) ? "blob" : (preg_match('~real|floa|doub~i', $type) ? "real" : "numeric")))),
"full_type" => $type,
"default" => (ereg("'(.*)'", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
"default" => (preg_match("~'(.*)'~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
"null" => !$row["notnull"],
"auto_increment" => eregi('^integer$', $type) && $row["pk"], //! possible false positive
"privileges" => array("select" => 1, "insert" => 1, "update" => 1),
"primary" => $row["pk"],
);
if ($row["pk"]) {
if ($primary != "") {
$return[$primary]["auto_increment"] = false;
} elseif (preg_match('~^integer$~i', $type)) {
$return[$name]["auto_increment"] = true;
}
$primary = $name;
}
}
$sql = $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
preg_match_all('~(("[^"]*+")+|[a-z0-9_]+)\s+text\s+COLLATE\s+(\'[^\']+\'|\S+)~i', $sql, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$name = str_replace('""', '"', preg_replace('~^"|"$~', '', $match[1]));
if ($return[$name]) {
$return[$name]["collation"] = trim($match[3], "'");
}
}
return $return;
}
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
$connection2 = $connection;
}
$return = array();
$primary = array();
foreach (fields($table) as $field) {
if ($field["primary"]) {
$primary[] = $field["field"];
$sql = $connection2->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
if (preg_match('~\bPRIMARY\s+KEY\s*\((([^)"]+|"[^"]*"|`[^`]*`)++)~i', $sql, $match)) {
$return[""] = array("type" => "PRIMARY", "columns" => array(), "lengths" => array(), "descs" => array());
preg_match_all('~((("[^"]*+")+|(?:`[^`]*+`)+)|(\S+))(\s+(ASC|DESC))?(,\s*|$)~i', $match[1], $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$return[""]["columns"][] = idf_unescape($match[2]) . $match[4];
$return[""]["descs"][] = (preg_match('~DESC~i', $match[5]) ? '1' : null);
}
}
if ($primary) {
$return[""] = array("type" => "PRIMARY", "columns" => $primary, "lengths" => array());
}
foreach (get_rows("PRAGMA index_list(" . table($table) . ")") as $row) {
if (!ereg("^sqlite_", $row["name"])) {
$return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX");
$return[$row["name"]]["lengths"] = array();
foreach (get_rows("PRAGMA index_info(" . idf_escape($row["name"]) . ")") as $row1) {
$return[$row["name"]]["columns"][] = $row1["name"];
if (!$return) {
foreach (fields($table) as $name => $field) {
if ($field["primary"]) {
$return[""] = array("type" => "PRIMARY", "columns" => array($name), "lengths" => array(), "descs" => array(null));
}
}
}
$sqls = get_key_vals("SELECT name, sql FROM sqlite_master WHERE type = 'index' AND tbl_name = " . q($table), $connection2);
foreach (get_rows("PRAGMA index_list(" . table($table) . ")", $connection2) as $row) {
$name = $row["name"];
$index = array("type" => ($row["unique"] ? "UNIQUE" : "INDEX"));
$index["lengths"] = array();
$index["descs"] = array();
foreach (get_rows("PRAGMA index_info(" . idf_escape($name) . ")", $connection2) as $row1) {
$index["columns"][] = $row1["name"];
$index["descs"][] = null;
}
if (preg_match('~^CREATE( UNIQUE)? INDEX ' . preg_quote(idf_escape($name) . ' ON ' . idf_escape($table), '~') . ' \((.*)\)$~i', $sqls[$name], $regs)) {
preg_match_all('/("[^"]*+")+( DESC)?/', $regs[2], $matches);
foreach ($matches[2] as $key => $val) {
if ($val) {
$index["descs"][$key] = '1';
}
}
}
if (!$return[""] || $index["type"] != "UNIQUE" || $index["columns"] != $return[""]["columns"] || $index["descs"] != $return[""]["descs"] || !preg_match("~^sqlite_~", $name)) {
$return[$name] = $index;
}
}
return $return;
}
@@ -332,7 +407,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
function view($name) {
global $connection;
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
}
function collations() {
@@ -347,11 +422,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
global $connection;
return h($connection->error);
}
function exact_value($val) {
return q($val);
}
function check_sqlite_name($name) {
// avoid creating PHP files on unsecured servers
global $connection;
@@ -362,7 +433,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return true;
}
function create_database($db, $collation) {
global $connection;
if (file_exists($db)) {
@@ -372,16 +443,21 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
if (!check_sqlite_name($db)) {
return false;
}
$link = new Min_SQLite($db); //! exception handler
try {
$link = new Min_SQLite($db);
} catch (Exception $ex) {
$connection->error = $ex->getMessage();
return false;
}
$link->query('PRAGMA encoding = "UTF-8"');
$link->query('CREATE TABLE adminer (i)'); // otherwise creates empty file
$link->query('DROP TABLE adminer');
return true;
}
function drop_databases($databases) {
global $connection;
$connection->Min_SQLite(":memory:"); // to unlock file, doesn't work in PDO on Windows
$connection->__construct(":memory:"); // to unlock file, doesn't work in PDO on Windows
foreach ($databases as $db) {
if (!@unlink($db)) {
$connection->error = lang('File exists.');
@@ -390,21 +466,21 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return true;
}
function rename_database($name, $collation) {
global $connection;
if (!check_sqlite_name($name)) {
return false;
}
$connection->Min_SQLite(":memory:");
$connection->__construct(":memory:");
$connection->error = lang('File exists.');
return @rename(DB, $name);
}
function auto_increment() {
return " PRIMARY KEY" . (DRIVER == "sqlite" ? " AUTOINCREMENT" : "");
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$use_all_fields = ($table == "" || $foreign);
foreach ($fields as $field) {
@@ -415,81 +491,15 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
$alter = array();
$originals = array();
$primary_key = false;
foreach ($fields as $field) {
if ($field[1]) {
if ($field[1][6]) {
$primary_key = true;
}
$alter[] = ($use_all_fields ? " " : "ADD ") . implode($field[1]);
$alter[] = ($use_all_fields ? $field[1] : "ADD " . implode($field[1]));
if ($field[0] != "") {
$originals[$field[0]] = $field[1][0];
}
}
}
if ($use_all_fields) {
if ($table != "") {
queries("BEGIN");
foreach (foreign_keys($table) as $foreign_key) {
$columns = array();
foreach ($foreign_key["source"] as $column) {
if (!$originals[$column]) {
continue 2;
}
$columns[] = $originals[$column];
}
$foreign[] = " FOREIGN KEY (" . implode(", ", $columns) . ") REFERENCES "
. table($foreign_key["table"])
. " (" . implode(", ", array_map('idf_escape', $foreign_key["target"]))
. ") ON DELETE $foreign_key[on_delete] ON UPDATE $foreign_key[on_update]"
;
}
$indexes = array();
foreach (indexes($table) as $key_name => $index) {
$columns = array();
foreach ($index["columns"] as $column) {
if (!$originals[$column]) {
continue 2;
}
$columns[] = $originals[$column];
}
$columns = "(" . implode(", ", $columns) . ")";
if ($index["type"] != "PRIMARY") {
$indexes[] = array($index["type"], $key_name, $columns);
} elseif (!$primary_key) {
$foreign[] = " PRIMARY KEY $columns";
}
}
}
$alter = array_merge($alter, $foreign);
if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $alter) . "\n)")) {
// implicit ROLLBACK to not overwrite $connection->error
return false;
}
if ($table != "") {
if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
return false;
}
$triggers = array();
foreach (triggers($table) as $trigger_name => $timing_event) {
$trigger = trigger($trigger_name);
$triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
}
if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
return false;
}
queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
if (!alter_indexes($name, $indexes)) {
return false;
}
foreach ($triggers as $trigger) {
if (!queries($trigger)) {
return false;
}
}
queries("COMMIT");
}
} else {
if (!$use_all_fields) {
foreach ($alter as $val) {
if (!queries("ALTER TABLE " . table($table) . " $val")) {
return false;
@@ -498,134 +508,242 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
return false;
}
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
return false;
}
if ($auto_increment) {
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
}
return true;
}
function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
if ($table != "") {
if (!$fields) {
foreach (fields($table) as $key => $field) {
if ($indexes) {
$field["auto_increment"] = 0;
}
$fields[] = process_field($field, $field);
$originals[$key] = idf_escape($key);
}
}
$primary_key = false;
foreach ($fields as $field) {
if ($field[6]) {
$primary_key = true;
}
}
$drop_indexes = array();
foreach ($indexes as $key => $val) {
if ($val[2] == "DROP") {
$drop_indexes[$val[1]] = true;
unset($indexes[$key]);
}
}
foreach (indexes($table) as $key_name => $index) {
$columns = array();
foreach ($index["columns"] as $key => $column) {
if (!$originals[$column]) {
continue 2;
}
$columns[] = $originals[$column] . ($index["descs"][$key] ? " DESC" : "");
}
if (!$drop_indexes[$key_name]) {
if ($index["type"] != "PRIMARY" || !$primary_key) {
$indexes[] = array($index["type"], $key_name, $columns);
}
}
}
foreach ($indexes as $key => $val) {
if ($val[0] == "PRIMARY") {
unset($indexes[$key]);
$foreign[] = " PRIMARY KEY (" . implode(", ", $val[2]) . ")";
}
}
foreach (foreign_keys($table) as $key_name => $foreign_key) {
foreach ($foreign_key["source"] as $key => $column) {
if (!$originals[$column]) {
continue 2;
}
$foreign_key["source"][$key] = idf_unescape($originals[$column]);
}
if (!isset($foreign[" $key_name"])) {
$foreign[] = " " . format_foreign_key($foreign_key);
}
}
queries("BEGIN");
}
foreach ($fields as $key => $field) {
$fields[$key] = " " . implode($field);
}
$fields = array_merge($fields, array_filter($foreign));
if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $fields) . "\n)")) {
// implicit ROLLBACK to not overwrite $connection->error
return false;
}
if ($table != "") {
if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
return false;
}
$triggers = array();
foreach (triggers($table) as $trigger_name => $timing_event) {
$trigger = trigger($trigger_name);
$triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
}
if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
return false;
}
queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
if (!alter_indexes($name, $indexes)) {
return false;
}
foreach ($triggers as $trigger) {
if (!queries($trigger)) {
return false;
}
}
queries("COMMIT");
}
return true;
}
function index_sql($table, $type, $name, $columns) {
return "CREATE $type " . ($type != "INDEX" ? "INDEX " : "")
. idf_escape($name != "" ? $name : uniqid($table . "_"))
. " ON " . table($table)
. " $columns"
;
}
function alter_indexes($table, $alter) {
foreach ($alter as $val) {
foreach ($alter as $primary) {
if ($primary[0] == "PRIMARY") {
return recreate_table($table, $table, array(), array(), array(), $alter);
}
}
foreach (array_reverse($alter) as $val) {
if (!queries($val[2] == "DROP"
? "DROP INDEX " . idf_escape($val[1])
: "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " $val[2]"
: index_sql($table, $val[0], $val[1], "(" . implode(", ", $val[2]) . ")")
)) {
return false;
}
}
return true;
}
function truncate_tables($tables) {
return apply_queries("DELETE FROM", $tables);
}
function drop_views($views) {
return apply_queries("DROP VIEW", $views);
}
function drop_tables($tables) {
return apply_queries("DROP TABLE", $tables);
}
function move_tables($tables, $views, $target) {
return false;
}
function trigger($name) {
global $connection;
if ($name == "") {
return array("Statement" => "BEGIN\n\t;\nEND");
}
preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*([a-z]+)\\s+([a-z]+)\\s+ON\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(?:FOR\\s*EACH\\s*ROW\\s)?(.*)~is', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)), $match);
return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Trigger" => $name, "Statement" => $match[3]);
$idf = '(?:[^`"\s]+|`[^`]*`|"[^"]*")+';
$trigger_options = trigger_options();
preg_match(
"~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",
$connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
$match
);
$of = $match[3];
return array(
"Timing" => strtoupper($match[1]),
"Event" => strtoupper($match[2]) . ($of ? " OF" : ""),
"Of" => ($of[0] == '`' || $of[0] == '"' ? idf_unescape($of) : $of),
"Trigger" => $name,
"Statement" => $match[4],
);
}
function triggers($table) {
$return = array();
$trigger_options = trigger_options();
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*([a-z]+)\\s*([a-z]+)~i', $row["sql"], $match);
preg_match('~^CREATE\s+TRIGGER\s*(?:[^`"\s]+|`[^`]*`|"[^"]*")+\s*(' . implode("|", $trigger_options["Timing"]) . ')\s*(.*)\s+ON\b~iU', $row["sql"], $match);
$return[$row["name"]] = array($match[1], $match[2]);
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER", "INSTEAD OF"),
"Event" => array("INSERT", "UPDATE", "UPDATE OF", "DELETE"),
"Type" => array("FOR EACH ROW"),
);
}
function routine($name, $type) {
// not supported by SQLite
}
function routines() {
// not supported by SQLite
}
function routine_languages() {
// not supported by SQLite
}
function begin() {
return queries("BEGIN");
}
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . ($set ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")" : "DEFAULT VALUES"));
}
function insert_update($table, $set, $primary) {
return queries("REPLACE INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")");
}
function last_id() {
global $connection;
return $connection->result("SELECT LAST_INSERT_ROWID()");
}
function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
return $connection->query("EXPLAIN QUERY PLAN $query");
}
function found_rows($table_status, $where) {
}
function types() {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($scheme) {
return true;
}
function create_sql($table, $auto_increment) {
function create_sql($table, $auto_increment, $style) {
global $connection;
return $connection->result("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = " . q($table));
$return = $connection->result("SELECT sql FROM sqlite_master WHERE type IN ('table', 'view') AND name = " . q($table));
foreach (indexes($table) as $name => $index) {
if ($name == '') {
continue;
}
$return .= ";\n\n" . index_sql($table, $index['type'], $name, "(" . implode(", ", array_map('idf_escape', $index['columns'])) . ")");
}
return $return;
}
function truncate_sql($table) {
return "DELETE FROM " . table($table);
}
function use_sql($database) {
}
function trigger_sql($table, $style) {
function trigger_sql($table) {
return implode(get_vals("SELECT sql || ';;\n' FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)));
}
function show_variables() {
global $connection;
$return = array();
@@ -634,7 +752,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function show_status() {
$return = array();
foreach (get_vals("PRAGMA compile_options") as $option) {
@@ -643,23 +761,23 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return ereg('^(view|trigger|variables|status|dump|move_col|drop_col)$', $feature);
return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
}
$jush = "sqlite";
$types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0);
$structured_types = array_keys($types);
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", ""); // REGEXP can be user defined function
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
$functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
$edit_functions = array(

View File

@@ -1,25 +1,31 @@
<?php
$TABLE = $_GET["dump"];
if ($_POST) {
if ($_POST && !$error) {
$cookie = "";
foreach (array("output", "format", "db_style", "routines", "events", "table_style", "auto_increment", "triggers", "data_style") as $key) {
$cookie .= "&$key=" . urlencode($_POST[$key]);
}
cookie("adminer_export", substr($cookie, 1));
$ext = dump_headers(($TABLE != "" ? $TABLE : DB), (DB == "" || count((array) $_POST["tables"] + (array) $_POST["data"]) > 1));
$is_sql = ($_POST["format"] == "sql");
if ($is_sql) {
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump
$tables = array_flip((array) $_POST["tables"]) + array_flip((array) $_POST["data"]);
$ext = dump_headers(
(count($tables) == 1 ? key($tables) : DB),
(DB == "" || count($tables) > 1));
$is_sql = preg_match('~sql~', $_POST["format"]);
" . ($jush != "sql" ? "" : "SET NAMES utf8;
if ($is_sql) {
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump\n\n";
if ($jush == "sql") {
echo "SET NAMES utf8;
SET time_zone = '+00:00';
" . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
SET time_zone = " . q($connection->result("SELECT @@time_zone")) . ";
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
" : "") . "
");
";
$connection->query("SET time_zone = '+00:00';");
}
}
$style = $_POST["db_style"];
$databases = array(DB);
if (DB == "") {
@@ -28,135 +34,104 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
$databases = explode("\n", rtrim(str_replace("\r", "", $databases), "\n"));
}
}
foreach ((array) $databases as $db) {
$adminer->dumpDatabase($db);
if ($connection->select_db($db)) {
if ($is_sql && ereg('CREATE', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
if ($is_sql && preg_match('~CREATE~', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
set_utf8mb4($create);
if ($style == "DROP+CREATE") {
echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n";
}
echo ($style == "CREATE+ALTER" ? preg_replace('~^CREATE DATABASE ~', '\\0IF NOT EXISTS ', $create) : $create) . ";\n";
echo "$create;\n";
}
if ($is_sql) {
if ($style) {
echo use_sql($db) . ";\n\n";
}
if (in_array("CREATE+ALTER", array($style, $_POST["table_style"]))) {
echo "SET @adminer_alter = '';\n\n";
}
$out = "";
if ($_POST["routines"]) {
foreach (array("FUNCTION", "PROCEDURE") as $routine) {
foreach (get_rows("SHOW $routine STATUS WHERE Db = " . q($db), null, "-- ") as $row) {
$out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "")
. remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2)) . ";;\n\n";
$create = remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
}
}
}
if ($_POST["events"]) {
foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) {
$out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "")
. remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3)) . ";;\n\n";
$create = remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
}
}
if ($out) {
echo "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n";
}
}
if ($_POST["table_style"] || $_POST["data_style"]) {
$views = array();
foreach (table_status() as $table_status) {
$table = (DB == "" || in_array($table_status["Name"], (array) $_POST["tables"]));
$data = (DB == "" || in_array($table_status["Name"], (array) $_POST["data"]));
foreach (table_status('', true) as $name => $table_status) {
$table = (DB == "" || in_array($name, (array) $_POST["tables"]));
$data = (DB == "" || in_array($name, (array) $_POST["data"]));
if ($table || $data) {
if (!is_view($table_status)) {
if ($ext == "tar") {
ob_start();
}
$adminer->dumpTable($table_status["Name"], ($table ? $_POST["table_style"] : ""));
if ($data) {
$adminer->dumpData($table_status["Name"], $_POST["data_style"], "SELECT * FROM " . table($table_status["Name"]));
}
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($table_status["Name"], $_POST["table_style"]))) {
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
}
if ($ext == "tar") {
echo tar_file((DB != "" ? "" : "$db/") . "$table_status[Name].csv", ob_get_clean());
} elseif ($is_sql) {
echo "\n";
}
if ($ext == "tar") {
$tmp_file = new TmpFile;
ob_start(array($tmp_file, 'write'), 1e5);
}
$adminer->dumpTable($name, ($table ? $_POST["table_style"] : ""), (is_view($table_status) ? 2 : 0));
if (is_view($table_status)) {
$views[] = $name;
} elseif ($data) {
$fields = fields($name);
$adminer->dumpData($name, $_POST["data_style"], "SELECT *" . convert_fields($fields, $fields) . " FROM " . table($name));
}
if ($is_sql && $_POST["triggers"] && $table && ($triggers = trigger_sql($name))) {
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
}
if ($ext == "tar") {
ob_end_flush();
tar_file((DB != "" ? "" : "$db/") . "$name.csv", $tmp_file);
} elseif ($is_sql) {
$views[] = $table_status["Name"];
echo "\n";
}
}
}
foreach ($views as $view) {
$adminer->dumpTable($view, $_POST["table_style"], true);
$adminer->dumpTable($view, $_POST["table_style"], 1);
}
if ($ext == "tar") {
echo pack("x512");
}
}
if ($style == "CREATE+ALTER" && $is_sql) {
// drop old tables
$query = "SELECT TABLE_NAME, ENGINE, TABLE_COLLATION, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()";
echo "DELIMITER ;;
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
DECLARE _table_name, _engine, _table_collation varchar(64);
DECLARE _table_comment varchar(64);
DECLARE done bool DEFAULT 0;
DECLARE tables CURSOR FOR $query;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN tables;
REPEAT
FETCH tables INTO _table_name, _engine, _table_collation, _table_comment;
IF NOT done THEN
CASE _table_name";
foreach (get_rows($query) as $row) {
$comment = q($row["ENGINE"] == "InnoDB" ? preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["TABLE_COMMENT"]) : $row["TABLE_COMMENT"]);
echo "
WHEN " . q($row["TABLE_NAME"]) . " THEN
" . (isset($row["ENGINE"]) ? "IF _engine != '$row[ENGINE]' OR _table_collation != '$row[TABLE_COLLATION]' OR _table_comment != $comment THEN
ALTER TABLE " . idf_escape($row["TABLE_NAME"]) . " ENGINE=$row[ENGINE] COLLATE=$row[TABLE_COLLATION] COMMENT=$comment;
END IF" : "BEGIN END") . ";";
}
echo "
ELSE
SET alter_command = CONCAT(alter_command, 'DROP TABLE `', REPLACE(_table_name, '`', '``'), '`;\\n');
END CASE;
END IF;
UNTIL done END REPEAT;
CLOSE tables;
END;;
DELIMITER ;
CALL adminer_alter(@adminer_alter);
DROP PROCEDURE adminer_alter;
";
}
if (in_array("CREATE+ALTER", array($style, $_POST["table_style"])) && $is_sql) {
echo "SELECT @adminer_alter;\n";
}
}
}
if ($is_sql) {
echo "-- " . $connection->result("SELECT NOW()") . "\n";
}
exit;
}
page_header(lang('Export'), "", ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), DB);
page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), h(DB));
?>
<form action="" method="post">
<table cellspacing="0">
<table cellspacing="0" class="layout">
<?php
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
$table_style = array('', 'DROP+CREATE', 'CREATE');
$data_style = array('', 'TRUNCATE+INSERT', 'INSERT');
if ($jush == "sql") {
$db_style[] = 'CREATE+ALTER';
$table_style[] = 'CREATE+ALTER';
if ($jush == "sql") { //! use insertUpdate() in all drivers
$data_style[] = 'INSERT+UPDATE';
}
parse_str($_COOKIE["adminer_export"], $row);
@@ -167,53 +142,68 @@ if (!isset($row["events"])) { // backwards compatibility
$row["routines"] = $row["events"] = ($_GET["dump"] == "");
$row["triggers"] = $row["table_style"];
}
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
. (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
. (support("event") ? checkbox("events", 1, $row["events"], lang('Events')) : "")
);
echo "<tr><th>" . lang('Tables') . "<td>" . html_select('table_style', $table_style, $row["table_style"])
. checkbox("auto_increment", 1, $row["auto_increment"], lang('Auto Increment'))
. (support("trigger") ? checkbox("triggers", 1, $row["triggers"], lang('Triggers')) : "")
;
echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, $row["data_style"]);
?>
</table>
<p><input type="submit" value="<?php echo lang('Export'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<table cellspacing="0">
<?php
echo script("qsl('table').onclick = dumpClick;");
$prefixes = array();
if (DB != "") {
$checked = ($TABLE != "" ? "" : " checked");
echo "<thead><tr>";
echo "<th style='text-align: left;'><label><input type='checkbox' id='check-tables'$checked onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
echo "<th style='text-align: right;'><label>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
echo "<th style='text-align: left;'><label class='block'><input type='checkbox' id='check-tables'$checked>" . lang('Tables') . "</label>" . script("qs('#check-tables').onclick = partial(formCheck, /^tables\\[/);", "");
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked></label>" . script("qs('#check-data').onclick = partial(formCheck, /^data\\[/);", "");
echo "</thead>\n";
$views = "";
//! defer number of rows to JavaScript
foreach (table_status() as $table_status) {
$name = $table_status["Name"];
$prefix = ereg_replace("_.*", "", $name);
$tables_list = tables_list();
foreach ($tables_list as $name => $type) {
$prefix = preg_replace('~_.*~', '', $name);
$checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');");
if (is_view($table_status)) {
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "", "block");
if ($type !== null && !preg_match('~table~i', $type)) {
$views .= "$print\n";
} else {
echo "$print<td align='right'><label>" . ($table_status["Engine"] == "InnoDB" && $table_status["Rows"] ? "~ " : "") . $table_status["Rows"] . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked) . "</label>\n";
}
$prefixes[$prefix]++;
}
echo $views;
if ($tables_list) {
echo script("ajaxSetHtml('" . js_escape(ME) . "script=db');");
}
} else {
echo "<thead><tr><th style='text-align: left;'><label><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></thead>\n";
echo "<thead><tr><th style='text-align: left;'>";
echo "<label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . ">" . lang('Database') . "</label>";
echo script("qs('#check-databases').onclick = partial(formCheck, /^databases\\[/);", "");
echo "</thead>\n";
$databases = $adminer->databases();
if ($databases) {
foreach ($databases as $db) {
if (!information_schema($db)) {
$prefix = ereg_replace("_.*", "", $db);
echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "formUncheck('check-databases');") . "</label>\n";
$prefix = preg_replace('~_.*~', '', $db);
echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "", "block") . "\n";
$prefixes[$prefix]++;
}
}

View File

@@ -1,51 +1,64 @@
<?php
$TABLE = $_GET["edit"];
$fields = fields($TABLE);
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
$where = (isset($_GET["select"]) ? ($_POST["check"] && count($_POST["check"]) == 1 ? where_check($_POST["check"][0], $fields) : "") : where($_GET, $fields));
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
foreach ($fields as $name => $field) {
if (!isset($field["privileges"][$update ? "update" : "insert"]) || $adminer->fieldName($field) == "") {
unset($fields[$name]);
}
}
if ($_POST && !$error && !isset($_GET["select"])) {
$location = $_POST["referer"];
if ($_POST["insert"]) { // continue edit or insert
$location = ($update ? null : $_SERVER["REQUEST_URI"]);
} elseif (!ereg('^.+&select=.+$', $location)) {
} elseif (!preg_match('~^.+&select=.+$~', $location)) {
$location = ME . "select=" . urlencode($TABLE);
}
$indexes = indexes($TABLE);
$unique_array = unique_array($_GET["where"], $indexes);
$query_where = "\nWHERE $where";
if (isset($_POST["delete"])) {
query_redirect("DELETE" . limit1("FROM " . table($TABLE), " WHERE $where"), $location, lang('Item has been deleted.'));
queries_redirect(
$location,
lang('Item has been deleted.'),
$driver->delete($TABLE, $query_where, !$unique_array)
);
} else {
$set = array();
foreach ($fields as $name => $field) {
$val = process_input($field);
if ($val !== false && $val !== null) {
$set[idf_escape($name)] = ($update ? "\n" . idf_escape($name) . " = $val" : $val);
$set[idf_escape($name)] = $val;
}
}
if ($update) {
if (!$set) {
redirect($location);
}
query_redirect("UPDATE" . limit1(table($TABLE) . " SET" . implode(",", $set), "\nWHERE $where"), $location, lang('Item has been updated.'));
queries_redirect(
$location,
lang('Item has been updated.'),
$driver->update($TABLE, $set, $query_where, !$unique_array)
);
if (is_ajax()) {
page_headers();
page_messages($error);
exit;
}
} else {
$result = insert_into($TABLE, $set);
$result = $driver->insert($TABLE, $set);
$last_id = ($result ? last_id() : 0);
queries_redirect($location, lang('Item%s has been inserted.', ($last_id ? " $last_id" : "")), $result); //! link
}
}
}
$table_name = $adminer->tableName(table_status($TABLE));
page_header(
($update ? lang('Edit') : lang('Insert')),
$error,
array("select" => array($TABLE, $table_name)),
$table_name //! two calls of h()
);
$row = null;
if ($_POST["save"]) {
$row = (array) $_POST["fields"];
@@ -57,67 +70,48 @@ if ($_POST["save"]) {
if ($_POST["clone"] && $field["auto_increment"]) {
$as = "''";
}
if ($jush == "sql" && ereg("enum|set", $field["type"])) {
if ($jush == "sql" && preg_match("~enum|set~", $field["type"])) {
$as = "1*" . idf_escape($name);
}
$select[] = ($as ? "$as AS " : "") . idf_escape($name);
}
}
$row = array();
if (!support("table")) {
$select = array("*");
}
if ($select) {
$rows = get_rows("SELECT" . limit(implode(", ", $select) . " FROM " . table($TABLE), " WHERE $where", (isset($_GET["select"]) ? 2 : 1)));
$row = (isset($_GET["select"]) && count($rows) != 1 ? null : reset($rows));
$result = $driver->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1));
if (!$result) {
$error = error();
} else {
$row = $result->fetch_assoc();
if (!$row) { // MySQLi returns null
$row = false;
}
}
if (isset($_GET["select"]) && (!$row || $result->fetch_assoc())) { // $result->num_rows != 1 isn't available in all drivers
$row = null;
}
}
}
if ($row === false) {
echo "<p class='error'>" . lang('No rows.') . "\n";
if (!support("table") && !$fields) {
if (!$where) { // insert
$result = $driver->select($TABLE, array("*"), $where, array("*"));
$row = ($result ? $result->fetch_assoc() : false);
if (!$row) {
$row = array($driver->primary => "");
}
}
if ($row) {
foreach ($row as $key => $val) {
if (!$where) {
$row[$key] = null;
}
$fields[$key] = array("field" => $key, "null" => ($key != $driver->primary), "auto_increment" => ($key == $driver->primary));
}
}
}
?>
<form action="" method="post" enctype="multipart/form-data" id="form">
<?php
if (!$fields) {
echo "<p class='error'>" . lang('You have no privileges to update this table.') . "\n";
} else {
echo "<table cellspacing='0' onkeydown='return editingKeydown(event);'>\n";
foreach ($fields as $name => $field) {
echo "<tr><th>" . $adminer->fieldName($field);
$default = $_GET["set"][bracket_escape($name)];
$value = ($row !== null
? ($row[$name] != "" && $jush == "sql" && ereg("enum|set", $field["type"]) ? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name]) : $row[$name])
: (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : ($default !== null ? $default : $field["default"])))
);
if (!$_POST["save"] && is_string($value)) {
$value = $adminer->editVal($value, $field);
}
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : ($value !== null ? '' : 'NULL'))));
if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") {
$value = "";
$function = "now";
}
input($field, $value, $function);
echo "\n";
}
echo "</table>\n";
}
?>
<p>
<?php
if ($fields) {
echo "<input type='submit' value='" . lang('Save') . "'>\n";
if (!isset($_GET["select"])) {
echo "<input type='submit' name='insert' value='" . ($update ? lang('Save and continue edit') : lang('Save and insert next')) . "' title='Ctrl+Shift+Enter'>\n";
}
}
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\">\n"
: ($_POST || !$fields ? "" : "<script type='text/javascript'>document.getElementById('form').getElementsByTagName('td')[1].firstChild.focus();</script>\n")
);
if (isset($_GET["select"])) {
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
}
?>
<input type="hidden" name="referer" value="<?php echo h(isset($_POST["referer"]) ? $_POST["referer"] : $_SERVER["HTTP_REFERER"]); ?>">
<input type="hidden" name="save" value="1">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>
edit_form($TABLE, $fields, $row, $update);

View File

@@ -2,31 +2,32 @@
$EVENT = $_GET["event"];
$intervals = array("YEAR", "QUARTER", "MONTH", "DAY", "HOUR", "MINUTE", "WEEK", "SECOND", "YEAR_MONTH", "DAY_HOUR", "DAY_MINUTE", "DAY_SECOND", "HOUR_MINUTE", "HOUR_SECOND", "MINUTE_SECOND");
$statuses = array("ENABLED" => "ENABLE", "DISABLED" => "DISABLE", "SLAVESIDE_DISABLED" => "DISABLE ON SLAVE");
$row = $_POST;
if ($_POST && !$error) {
if ($_POST["drop"]) {
query_redirect("DROP EVENT " . idf_escape($EVENT), substr(ME, 0, -1), lang('Event has been dropped.'));
} elseif (in_array($_POST["INTERVAL_FIELD"], $intervals) && isset($statuses[$_POST["STATUS"]])) {
$schedule = "\nON SCHEDULE " . ($_POST["INTERVAL_VALUE"]
? "EVERY " . q($_POST["INTERVAL_VALUE"]) . " $_POST[INTERVAL_FIELD]"
. ($_POST["STARTS"] ? " STARTS " . q($_POST["STARTS"]) : "")
. ($_POST["ENDS"] ? " ENDS " . q($_POST["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
: "AT " . q($_POST["STARTS"])
) . " ON COMPLETION" . ($_POST["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
} elseif (in_array($row["INTERVAL_FIELD"], $intervals) && isset($statuses[$row["STATUS"]])) {
$schedule = "\nON SCHEDULE " . ($row["INTERVAL_VALUE"]
? "EVERY " . q($row["INTERVAL_VALUE"]) . " $row[INTERVAL_FIELD]"
. ($row["STARTS"] ? " STARTS " . q($row["STARTS"]) : "")
. ($row["ENDS"] ? " ENDS " . q($row["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
: "AT " . q($row["STARTS"])
) . " ON COMPLETION" . ($row["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
;
queries_redirect(substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')), queries(($EVENT != ""
? "ALTER EVENT " . idf_escape($EVENT) . $schedule
. ($EVENT != $_POST["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($_POST["EVENT_NAME"]) : "")
: "CREATE EVENT " . idf_escape($_POST["EVENT_NAME"]) . $schedule
) . "\n" . $statuses[$_POST["STATUS"]] . " COMMENT " . q($_POST["EVENT_COMMENT"])
. rtrim(" DO\n$_POST[EVENT_DEFINITION]", ";") . ";"
. ($EVENT != $row["EVENT_NAME"] ? "\nRENAME TO " . idf_escape($row["EVENT_NAME"]) : "")
: "CREATE EVENT " . idf_escape($row["EVENT_NAME"]) . $schedule
) . "\n" . $statuses[$row["STATUS"]] . " COMMENT " . q($row["EVENT_COMMENT"])
. rtrim(" DO\n$row[EVENT_DEFINITION]", ";") . ";"
));
}
}
page_header(($EVENT != "" ? lang('Alter event') . ": " . h($EVENT) : lang('Create event')), $error);
$row = $_POST;
if (!$row && $EVENT != "") {
$rows = get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . q(DB) . " AND EVENT_NAME = " . q($EVENT));
$row = reset($rows);
@@ -34,18 +35,18 @@ if (!$row && $EVENT != "") {
?>
<form action="" method="post">
<table cellspacing="0">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" maxlength="64">
<tr><th><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
<tr><th><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
<table cellspacing="0" class="layout">
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" data-maxlength="64" autocapitalize="off">
<tr><th title="datetime"><?php echo lang('Start'); ?><td><input name="STARTS" value="<?php echo h("$row[EXECUTE_AT]$row[STARTS]"); ?>">
<tr><th title="datetime"><?php echo lang('End'); ?><td><input name="ENDS" value="<?php echo h($row["ENDS"]); ?>">
<tr><th><?php echo lang('Every'); ?><td><input type="number" name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" class="size"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
<tr><th><?php echo lang('Status'); ?><td><?php echo html_select("STATUS", $statuses, $row["STATUS"]); ?>
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" maxlength="64">
<tr><th>&nbsp;<td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
<tr><th><?php echo lang('Comment'); ?><td><input name="EVENT_COMMENT" value="<?php echo h($row["EVENT_COMMENT"]); ?>" data-maxlength="64">
<tr><th><td><?php echo checkbox("ON_COMPLETION", "PRESERVE", $row["ON_COMPLETION"] == "PRESERVE", lang('On completion preserve')); ?>
</table>
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<?php if ($EVENT != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $EVENT)); ?><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,21 +1,18 @@
<?php
if ($_SERVER["HTTP_IF_MODIFIED_SINCE"]) {
header("HTTP/1.1 304 Not Modified");
exit;
}
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// caching headers added in compile.php
if ($_GET["file"] == "favicon.ico") {
header("Content-Type: image/x-icon");
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
} elseif ($_GET["file"] == "default.css") {
header("Content-Type: text/css; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/default.css', 'minify_css'));
echo lzw_decompress(compile_file('../adminer/static/default.css;../externals/jush/jush.css', 'minify_css'));
} elseif ($_GET["file"] == "functions.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
} elseif ($_GET["file"] == "jush.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.js;../externals/jush/modules/jush-js.js;../externals/jush/modules/jush-sql.js;../externals/jush/modules/jush-pgsql.js;../externals/jush/modules/jush-sqlite.js;../externals/jush/modules/jush-mssql.js;../externals/jush/modules/jush-oracle.js;../externals/jush/modules/jush-simpledb.js', 'minify_js'));
} else {
header("Content-Type: image/gif");
switch ($_GET["file"]) {

View File

@@ -1,50 +1,57 @@
<?php
$TABLE = $_GET["foreign"];
$name = $_GET["name"];
$row = $_POST;
if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) {
if ($_POST["drop"]) {
query_redirect("ALTER TABLE " . table($TABLE) . "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($_GET["name"]), ME . "table=" . urlencode($TABLE), lang('Foreign key has been dropped.'));
} else {
$source = array_filter($_POST["source"], 'strlen');
ksort($source); // enforce input order
$message = ($_POST["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
$location = ME . "table=" . urlencode($TABLE);
if (!$_POST["drop"]) {
$row["source"] = array_filter($row["source"], 'strlen');
ksort($row["source"]); // enforce input order
$target = array();
foreach ($source as $key => $val) {
$target[$key] = $_POST["target"][$key];
foreach ($row["source"] as $key => $val) {
$target[$key] = $row["target"][$key];
}
$row["target"] = $target;
}
if ($jush == "sqlite") {
queries_redirect($location, $message, recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($_POST["drop"] ? "" : " " . format_foreign_key($row)))));
} else {
$alter = "ALTER TABLE " . table($TABLE);
$drop = "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name);
if ($_POST["drop"]) {
query_redirect($alter . $drop, $location, $message);
} else {
query_redirect($alter . ($name != "" ? "$drop," : "") . "\nADD" . format_foreign_key($row), $location, $message);
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
}
query_redirect("ALTER TABLE " . table($TABLE)
. ($_GET["name"] != "" ? "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($_GET["name"]) . "," : "")
. "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . table($_POST["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")" //! reuse $_GET["name"] - check in older MySQL versions
. (ereg("^($on_actions)\$", $_POST["on_delete"]) ? " ON DELETE $_POST[on_delete]" : "")
. (ereg("^($on_actions)\$", $_POST["on_update"]) ? " ON UPDATE $_POST[on_update]" : "")
, ME . "table=" . urlencode($TABLE), ($_GET["name"] != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
}
}
page_header(lang('Foreign key'), $error, array("table" => $TABLE), $TABLE);
page_header(lang('Foreign key'), $error, array("table" => $TABLE), h($TABLE));
$row = array("table" => $TABLE, "source" => array(""));
if ($_POST) {
$row = $_POST;
ksort($row["source"]);
if ($_POST["add"]) {
$row["source"][] = "";
} elseif ($_POST["change"] || $_POST["change-js"]) {
$row["target"] = array();
}
} elseif ($_GET["name"] != "") {
} elseif ($name != "") {
$foreign_keys = foreign_keys($TABLE);
$row = $foreign_keys[$_GET["name"]];
$row = $foreign_keys[$name];
$row["source"][] = "";
} else {
$row["table"] = $TABLE;
$row["source"] = array("");
}
$source = array_keys(fields($TABLE)); //! no text and blob
$target = ($TABLE === $row["table"] ? $source : array_keys(fields($row["table"])));
$referencable = array();
foreach (table_status() as $name => $table_status) {
if (fk_support($table_status)) {
$referencable[] = $name;
}
}
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
?>
<form action="" method="post">
@@ -55,13 +62,13 @@ foreach (table_status() as $name => $table_status) {
<input type="hidden" name="change-js" value="">
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0">
<thead><tr><th><?php echo lang('Source'); ?><th><?php echo lang('Target'); ?></thead>
<thead><tr><th id="label-source"><?php echo lang('Source'); ?><th id="label-target"><?php echo lang('Target'); ?></thead>
<?php
$j = 0;
foreach ($row["source"] as $key => $val) {
echo "<tr>";
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1));
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key]);
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow.call(this);" : 1), "label-source");
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key], 1, "label-target");
$j++;
}
?>
@@ -69,10 +76,17 @@ foreach ($row["source"] as $key => $val) {
<p>
<?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", $on_actions), $row["on_delete"]); ?>
<?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", $on_actions), $row["on_update"]); ?>
<?php echo doc_link(array(
'sql' => "innodb-foreign-key-constraints.html",
'mariadb' => "foreign-keys/",
'pgsql' => "sql-createtable.html#SQL-CREATETABLE-REFERENCES",
'mssql' => "ms174979.aspx",
'oracle' => "clauses002.htm#sthref2903",
)); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add column'); ?>"></noscript>
<?php } ?>
<?php if ($_GET["name"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<?php if ($name != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $name)); ?><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,11 @@
<?php
$connection = '';
$token = $_SESSION["token"];
if (!$_SESSION["token"]) {
$has_token = $_SESSION["token"];
if (!$has_token) {
$_SESSION["token"] = rand(1, 1e6); // defense against cross-site request forgery
}
$token = get_token(); ///< @var string CSRF protection
$permanent = array();
if ($_COOKIE["adminer_permanent"]) {
@@ -14,27 +15,66 @@ if ($_COOKIE["adminer_permanent"]) {
}
}
function add_invalid_login() {
global $adminer;
$fp = file_open_lock(get_temp_dir() . "/adminer.invalid");
if (!$fp) {
return;
}
$invalids = unserialize(stream_get_contents($fp));
$time = time();
if ($invalids) {
foreach ($invalids as $ip => $val) {
if ($val[0] < $time) {
unset($invalids[$ip]);
}
}
}
$invalid = &$invalids[$adminer->bruteForceKey()];
if (!$invalid) {
$invalid = array($time + 30*60, 0); // active for 30 minutes
}
$invalid[1]++;
file_write_unlock($fp, serialize($invalids));
}
function check_invalid_login() {
global $adminer;
$invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
$invalid = $invalids[$adminer->bruteForceKey()];
$next_attempt = ($invalid[1] > 29 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
if ($next_attempt > 0) { //! do the same with permanent login
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
}
}
$auth = $_POST["auth"];
if ($auth) {
session_regenerate_id(); // defense against session fixation
$_SESSION["pwds"][$auth["driver"]][$auth["server"]][$auth["username"]] = $auth["password"];
$_SESSION["db"][$auth["driver"]][$auth["server"]][$auth["username"]][$auth["db"]] = true;
$vendor = $auth["driver"];
$server = $auth["server"];
$username = $auth["username"];
$password = (string) $auth["password"];
$db = $auth["db"];
set_password($vendor, $server, $username, $password);
$_SESSION["db"][$vendor][$server][$username][$db] = true;
if ($auth["permanent"]) {
$key = base64_encode($auth["driver"]) . "-" . base64_encode($auth["server"]) . "-" . base64_encode($auth["username"]) . "-" . base64_encode($auth["db"]);
$private = $adminer->permanentLogin();
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($auth["password"], $private) : "");
$key = base64_encode($vendor) . "-" . base64_encode($server) . "-" . base64_encode($username) . "-" . base64_encode($db);
$private = $adminer->permanentLogin(true);
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($password, $private) : "");
cookie("adminer_permanent", implode(" ", $permanent));
}
if (count($_POST) == 1 // 1 - auth
|| DRIVER != $auth["driver"]
|| SERVER != $auth["server"]
|| $_GET["username"] !== $auth["username"] // "0" == "00"
|| DB != $auth["db"]
|| DRIVER != $vendor
|| SERVER != $server
|| $_GET["username"] !== $username // "0" == "00"
|| DB != $db
) {
redirect(auth_url($auth["driver"], $auth["server"], $auth["username"], $auth["db"]));
redirect(auth_url($vendor, $server, $username, $db));
}
} elseif ($_POST["logout"]) {
if ($token && $_POST["token"] != $token) {
if ($has_token && !verify_token()) {
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
page_footer("db");
exit;
@@ -43,78 +83,127 @@ if ($auth) {
set_session($key, null);
}
unset_permanent();
redirect(substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
}
} elseif ($permanent && !$_SESSION["pwds"]) {
session_regenerate_id();
$private = $adminer->permanentLogin(); // try to decode even if not set
$private = $adminer->permanentLogin();
foreach ($permanent as $key => $val) {
list(, $cipher) = explode(":", $val);
list($driver, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
$_SESSION["pwds"][$driver][$server][$username] = decrypt_string(base64_decode($cipher), $private);
$_SESSION["db"][$driver][$server][$username][$db] = true;
list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
set_password($vendor, $server, $username, decrypt_string(base64_decode($cipher), $private));
$_SESSION["db"][$vendor][$server][$username][$db] = true;
}
}
function unset_permanent() {
global $permanent;
foreach ($permanent as $key => $val) {
list($driver, $server, $username) = array_map('base64_decode', explode("-", $key));
if ($driver == DRIVER && $server == SERVER && $db == $_GET["username"]) {
list($vendor, $server, $username, $db) = array_map('base64_decode', explode("-", $key));
if ($vendor == DRIVER && $server == SERVER && $username == $_GET["username"] && $db == DB) {
unset($permanent[$key]);
}
}
cookie("adminer_permanent", implode(" ", $permanent));
}
function auth_error($exception = null) {
global $connection, $adminer, $token;
/** Renders an error message and a login form
* @param string plain text
* @return null exits
*/
function auth_error($error) {
global $adminer, $has_token;
$session_name = session_name();
$error = "";
if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_bool("session.use_only_cookies")) {
$error = lang('Session support must be enabled.');
} elseif (isset($_GET["username"])) {
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$token) {
if (isset($_GET["username"])) {
header("HTTP/1.1 403 Forbidden"); // 401 requires sending WWW-Authenticate header
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
$error = lang('Session expired, please login again.');
} else {
$password = &get_session("pwds");
restart_session();
add_invalid_login();
$password = get_password();
if ($password !== null) {
$error = h($exception ? $exception->getMessage() : (is_string($connection) ? $connection : lang('Invalid credentials.')));
$password = null;
if ($password === false) {
$error .= '<br>' . lang('Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.', target_blank(), '<code>permanentLogin()</code>');
}
set_password(DRIVER, SERVER, $_GET["username"], null);
}
unset_permanent();
}
}
if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_bool("session.use_only_cookies")) {
$error = lang('Session support must be enabled.');
}
$params = session_get_cookie_params();
cookie("adminer_key", ($_COOKIE["adminer_key"] ? $_COOKIE["adminer_key"] : rand_string()), $params["lifetime"]);
page_header(lang('Login'), $error, null);
echo "<form action='' method='post'>\n";
$adminer->loginForm();
echo "<div>";
hidden_fields($_POST, array("auth")); // expired session
if (hidden_fields($_POST, array("auth"))) { // expired session
echo "<p class='message'>" . lang('The action will be performed after successful login with the same credentials.') . "\n";
}
echo "</div>\n";
$adminer->loginForm();
echo "</form>\n";
page_footer("auth");
}
if (isset($_GET["username"])) {
if (!class_exists("Min_DB")) {
unset($_SESSION["pwds"][DRIVER]);
unset_permanent();
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
page_footer("auth");
exit;
}
$connection = connect();
}
if (is_string($connection) || !$adminer->login($_GET["username"], get_session("pwds"))) {
auth_error();
exit;
}
$token = $_SESSION["token"]; ///< @var string CSRF protection
if (isset($_GET["username"]) && !class_exists("Min_DB")) {
unset($_SESSION["pwds"][DRIVER]);
unset_permanent();
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), false);
page_footer("auth");
exit;
}
stop_session(true);
if (isset($_GET["username"])) {
list($host, $port) = explode(":", SERVER, 2);
if (is_numeric($port) && $port < 1024) {
auth_error(lang('Connecting to privileged ports is not allowed.'));
}
check_invalid_login();
$connection = connect();
$driver = new Min_Driver($connection);
}
$login = null;
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
$error = (is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.')));
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
}
if ($auth && $_POST["token"]) {
$_POST["token"] = $token; // reset token after explicit login
}
$error = ($_POST ///< @var string
? ($_POST["token"] == $token ? "" : lang('Invalid CSRF token. Send the form again.'))
: ($_SERVER["REQUEST_METHOD"] != "POST" ? "" : lang('Too big POST data. Reduce the data or increase the %s configuration directive.', '"post_max_size"')) // posted form with no data means that post_max_size exceeded because Adminer always sends token at least
);
$error = ''; ///< @var string
if ($_POST) {
if (!verify_token()) {
$ini = "max_input_vars";
$max_vars = ini_get($ini);
if (extension_loaded("suhosin")) {
foreach (array("suhosin.request.max_vars", "suhosin.post.max_vars") as $key) {
$val = ini_get($key);
if ($val && (!$max_vars || $val < $max_vars)) {
$ini = $key;
$max_vars = $val;
}
}
}
$error = (!$_POST["token"] && $max_vars
? lang('Maximum number of allowed fields exceeded. Please increase %s.', "'$ini'")
: lang('Invalid CSRF token. Send the form again.') . ' ' . lang('If you did not send this request from Adminer then close this page.')
);
}
} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
// posted form with no data means that post_max_size exceeded because Adminer always sends token at least
$error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");
if (isset($_GET["sql"])) {
$error .= ' ' . lang('You can upload a big SQL file via FTP and import it from server.');
}
}

View File

@@ -4,7 +4,7 @@ error_reporting(6135); // errors and warnings
include "../adminer/include/coverage.inc.php";
// disable filter.default
$filter = !ereg('^(unsafe_raw)?$', ini_get("filter.default"));
$filter = !preg_match('~^(unsafe_raw)?$~', ini_get("filter.default"));
if ($filter || ini_get("filter.default_flags")) {
foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $val) {
$unsafe = filter_input_array(constant("INPUT$val"), FILTER_UNSAFE_RAW);
@@ -18,27 +18,39 @@ if (function_exists("mb_internal_encoding")) {
mb_internal_encoding("8bit");
}
include "../adminer/include/functions.inc.php";
// used only in compiled file
if (isset($_GET["file"])) {
include "../adminer/file.inc.php";
}
include "../adminer/include/functions.inc.php";
if ($_GET["script"] == "version") {
$fp = file_open_lock(get_temp_dir() . "/adminer.version");
if ($fp) {
file_write_unlock($fp, serialize(array("signature" => $_POST["signature"], "version" => $_POST["version"])));
}
exit;
}
global $adminer, $connection, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
global $adminer, $connection, $driver, $drivers, $edit_functions, $enum_length, $error, $functions, $grouping, $HTTPS, $inout, $jush, $LANG, $langs, $on_actions, $permanent, $structured_types, $has_token, $token, $translations, $types, $unsigned, $VERSION; // allows including Adminer inside a function
if (!$_SERVER["REQUEST_URI"]) { // IIS 5 compatibility
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"];
}
if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
$_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
}
$HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
if ($_SERVER["HTTP_X_FORWARDED_PREFIX"]) {
$_SERVER["REQUEST_URI"] = $_SERVER["HTTP_X_FORWARDED_PREFIX"] . $_SERVER["REQUEST_URI"];
}
$HTTPS = ($_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off")) || ini_bool("session.cookie_secure"); // session.cookie_secure could be set on HTTP if we are behind a reverse proxy
@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
if (!defined("SID")) {
session_cache_limiter(""); // to allow restarting session
session_name("adminer_sid"); // use specific session name to get own namespace
$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
$params = array(0, preg_replace('~\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
$params[] = true; // HttpOnly
}
@@ -48,25 +60,31 @@ if (!defined("SID")) {
// disable magic quotes to be able to use database escaping function
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
if (function_exists("set_magic_quotes_runtime")) { // removed in PHP 6
if (get_magic_quotes_runtime()) {
set_magic_quotes_runtime(false);
}
@set_time_limit(0); // @ - can be disabled
@ini_set("zend.ze1_compatibility_mode", false); // @ - deprecated
@ini_set("precision", 20); // @ - can be disabled
@ini_set("precision", 15); // @ - can be disabled, 15 - internal PHP precision
include "../adminer/include/lang.inc.php";
include "../adminer/lang/$LANG.inc.php";
include "../adminer/include/pdo.inc.php";
include "../adminer/include/driver.inc.php";
include "../adminer/drivers/sqlite.inc.php";
include "../adminer/drivers/pgsql.inc.php";
include "../adminer/drivers/oracle.inc.php";
include "../adminer/drivers/mssql.inc.php";
include "../adminer/drivers/firebird.inc.php";
include "../adminer/drivers/simpledb.inc.php";
include "../adminer/drivers/mongo.inc.php";
include "../adminer/drivers/elastic.inc.php";
include "../adminer/drivers/clickhouse.inc.php";
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
define("DB", $_GET["db"]); // for the sake of speed and size
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\\1', $_SERVER["REQUEST_URI"]) . '?'
define("ME", preg_replace('~^[^?]*/([^?]*).*~', '\1', $_SERVER["REQUEST_URI"]) . '?'
. (sid() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
@@ -78,13 +96,7 @@ include "./include/adminer.inc.php";
include "../adminer/include/design.inc.php";
include "../adminer/include/xxtea.inc.php";
include "../adminer/include/auth.inc.php";
if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
session_cache_limiter(""); // to allow restarting session
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
}
include "./include/connect.inc.php";
include "./include/editing.inc.php";
include "./include/connect.inc.php";
$on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys()

View File

@@ -1,8 +1,8 @@
<?php
function connect_error() {
global $adminer, $connection, $token, $error, $drivers;
$databases = array();
if (DB != "") {
header("HTTP/1.1 404 Not Found");
page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true);
} else {
if ($_POST["db"] && !$error) {
@@ -10,8 +10,9 @@ function connect_error() {
}
page_header(lang('Select database'), $error, false);
echo "<p><a href='" . h(ME) . "database='>" . lang('Create new database') . "</a>\n";
echo "<p class='links'>\n";
foreach (array(
'database' => lang('Create database'),
'privileges' => lang('Privileges'),
'processlist' => lang('Process list'),
'variables' => lang('Variables'),
@@ -21,43 +22,64 @@ function connect_error() {
echo "<a href='" . h(ME) . "$key='>$val</a>\n";
}
}
echo "<p>" . lang('%s version: %s through PHP extension %s', $drivers[DRIVER], "<b>$connection->server_info</b>", "<b>$connection->extension</b>") . "\n";
echo "<p>" . lang('%s version: %s through PHP extension %s', $drivers[DRIVER], "<b>" . h($connection->server_info) . "</b>", "<b>$connection->extension</b>") . "\n";
echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
$refresh = "<a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>\n";
$databases = $adminer->databases();
if ($databases) {
$scheme = support("scheme");
$collations = collations();
echo "<form action='' method='post'>\n";
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo "<thead><tr><td>&nbsp;<th>" . lang('Database') . "<td>" . lang('Collation') . "<td>" . lang('Tables') . "</thead>\n";
foreach ($databases as $db) {
echo "<table cellspacing='0' class='checkable'>\n";
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
echo "<thead><tr>"
. (support("database") ? "<td>" : "")
. "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
. "<td>" . lang('Collation')
. "<td>" . lang('Tables')
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1'>" . lang('Compute') . "</a>" . script("qsl('a').onclick = partial(ajaxSetHtml, '" . js_escape(ME) . "script=connect');", "")
. "</thead>\n"
;
$databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
foreach ($databases as $db => $tables) {
$root = h(ME) . "db=" . urlencode($db);
echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]));
echo "<th><a href='$root'>" . h($db) . "</a>";
echo "<td><a href='$root" . ($scheme ? "&amp;ns=" : "") . "&amp;database=' title='" . lang('Alter database') . "'>" . nbsp(db_collation($db, $collations)) . "</a>";
echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>?</a>";
$id = h("Db-" . $db);
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]), "", "", "", $id) : "");
echo "<th><a href='$root' id='$id'>" . h($db) . "</a>";
$collation = h(db_collation($db, $collations));
echo "<td>" . (support("database") ? "<a href='$root" . ($scheme ? "&amp;ns=" : "") . "&amp;database=' title='" . lang('Alter database') . "'>$collation</a>" : $collation);
echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "' title='" . lang('Database schema') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
echo "\n";
}
echo "</table>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n";
echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm("formChecked(this, /db/)") . ">\n";
echo (support("database")
? "<div class='footer'><div>\n"
. "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
. "<input type='hidden' name='all' value=''>" . script("qsl('input').onclick = function () { selectCount('selected', formChecked(this, /^db/)); };") // used by trCheck()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm() . "\n"
. "</div></fieldset>\n"
. "</div></div>\n"
: ""
);
echo "<input type='hidden' name='token' value='$token'>\n";
echo $refresh;
echo "</form>\n";
} else {
echo "<p>$refresh";
echo script("tableCheck();");
}
}
page_footer("db");
if ($databases) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=connect');</script>\n";
}
}
if (isset($_GET["status"])) {
$_GET["variables"] = $_GET["status"];
}
if (isset($_GET["import"])) {
$_GET["sql"] = $_GET["import"];
}
if (!(DB != "" ? $connection->select_db(DB) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["variables"]) || $_GET["script"] == "connect" || $_GET["script"] == "kill")) {
if (DB != "" || $_GET["refresh"]) {
restart_session();
@@ -72,6 +94,7 @@ if (support("scheme") && DB != "" && $_GET["ns"] !== "") {
redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema());
}
if (!set_schema($_GET["ns"])) {
header("HTTP/1.1 404 Not Found");
page_header(lang('Schema') . ": " . h($_GET["ns"]), lang('Invalid schema.'), true);
page_footer("ns");
exit;

View File

@@ -2,48 +2,76 @@
/** Print HTML header
* @param string used in title, breadcrumb and heading, should be HTML escaped
* @param string
* @param mixed array("key" => "link=desc", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server
* @param string used after colon in title and heading, will be HTML escaped
* @param mixed array("key" => "link", "key2" => array("link", "desc")), null for nothing, false for driver only, true for driver and server
* @param string used after colon in title and heading, should be HTML escaped
* @return null
*/
function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
global $LANG, $adminer, $connection, $drivers;
header("Content-Type: text/html; charset=utf-8");
if ($adminer->headers()) {
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
global $LANG, $VERSION, $adminer, $drivers, $jush;
page_headers();
if (is_ajax() && $error) {
page_messages($error);
exit;
}
$title_all = $title . ($title2 != "" ? ": " . h($title2) : "");
$title_all = $title . ($title2 != "" ? ": $title2" : "");
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
?>
<!DOCTYPE html>
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="robots" content="noindex">
<title><?php echo $title_page; ?></title>
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css">
<script type="text/javascript" src="../adminer/static/functions.js"></script>
<script type="text/javascript" src="static/editing.js"></script>
<?php echo script_src("../adminer/static/functions.js"); ?>
<?php echo script_src("static/editing.js"); ?>
<?php if ($adminer->head()) { ?>
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico" id="favicon">
<?php if (file_exists("adminer.css")) { ?>
<link rel="stylesheet" type="text/css" href="adminer.css">
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
<?php foreach ($adminer->css() as $css) { ?>
<link rel="stylesheet" type="text/css" href="<?php echo h($css); ?>">
<?php } ?>
<?php } ?>
<body class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onclick="bodyClick(event);" onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion();"); ?>">
<script type="text/javascript">
<body class="<?php echo lang('ltr'); ?> nojs">
<?php
$filename = get_temp_dir() . "/adminer.version";
if (!$_COOKIE["adminer_version"] && function_exists('openssl_verify') && file_exists($filename) && filemtime($filename) + 86400 > time()) { // 86400 - 1 day in seconds
$version = unserialize(file_get_contents($filename));
$public = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWOVuF5uw7/+Z70djoK
RlHIZFZPO0uYRezq90+7Amk+FDNd7KkL5eDve+vHRJBLAszF/7XKXe11xwliIsFs
DFWQlsABVZB3oisKCBEuI71J4kPH8dKGEWR9jDHFw3cWmoH3PmqImX6FISWbG3B8
h7FIx3jEaw5ckVPVTeo5JRm/1DZzJxjyDenXvBQ/6o9DgZKeNDgxwKzH+sw9/YCO
jHnq1cFpOIISzARlrHMa/43YfeNRAm/tsBXjSxembBPo7aQZLAWHmaj5+K19H10B
nCpz9Y++cipkVEiKRGih4ZEvjoFysEOdRLj6WiD/uUNky4xGeA6LaJqh5XpkFkcQ
fQIDAQAB
-----END PUBLIC KEY-----
";
if (openssl_verify($version["version"], base64_decode($version["signature"]), $public) == 1) {
$_COOKIE["adminer_version"] = $version["version"]; // doesn't need to send to the browser
}
}
?>
<script<?php echo nonce(); ?>>
mixin(document.body, {onkeydown: bodyKeydown, onclick: bodyClick<?php
echo (isset($_COOKIE["adminer_version"]) ? "" : ", onload: partial(verifyVersion, '$VERSION', '" . js_escape(ME) . "', '" . get_token() . "')"); // $token may be empty in auth.inc.php
?>});
document.body.className = document.body.className.replace(/ nojs/, ' js');
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
var thousandsSeparator = '<?php echo js_escape(lang(',')); ?>';
</script>
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden"></div>
<?php echo script("mixin(qs('#help'), {onmouseover: function () { helpOpen = 1; }, onmouseout: helpMouseout});"); ?>
<div id="content">
<?php
if ($breadcrumb !== null) {
$link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1);
$link = substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1);
echo '<p id="breadcrumb"><a href="' . h($link ? $link : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
$link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1);
$server = (SERVER != "" ? h(SERVER) : lang('Server'));
$link = substr(preg_replace('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
$server = $adminer->serverName(SERVER);
$server = ($server != "" ? $server : lang('Server'));
if ($breadcrumb === false) {
echo "$server\n";
} else {
@@ -56,9 +84,9 @@ document.body.className = document.body.className.replace(/ nojs/, ' js');
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> &raquo; ';
}
foreach ($breadcrumb as $key => $val) {
$desc = (is_array($val) ? $val[1] : $val);
$desc = (is_array($val) ? $val[1] : h($val));
if ($desc != "") {
echo '<a href="' . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . '">' . h($desc) . '</a> &raquo; ';
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> &raquo; ";
}
}
}
@@ -66,22 +94,79 @@ document.body.className = document.body.className.replace(/ nojs/, ' js');
}
}
echo "<h2>$title_all</h2>\n";
echo "<div id='ajaxstatus' class='jsonly hidden'></div>\n";
restart_session();
$uri = preg_replace('~^[^?]*~', '', $_SERVER["REQUEST_URI"]);
$messages = $_SESSION["messages"][$uri];
if ($messages) {
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>\n";
unset($_SESSION["messages"][$uri]);
}
page_messages($error);
$databases = &get_session("dbs");
if (DB != "" && $databases && !in_array(DB, $databases, true)) {
$databases = null;
}
stop_session();
define("PAGE_HEADER", 1);
}
/** Send HTTP headers
* @return null
*/
function page_headers() {
global $adminer;
header("Content-Type: text/html; charset=utf-8");
header("Cache-Control: no-cache");
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox 3.6.9
header("X-XSS-Protection: 0"); // prevents introducing XSS in IE8 by removing safe parts of the page
header("X-Content-Type-Options: nosniff");
header("Referrer-Policy: origin-when-cross-origin");
foreach ($adminer->csp() as $csp) {
$header = array();
foreach ($csp as $key => $val) {
$header[] = "$key $val";
}
header("Content-Security-Policy: " . implode("; ", $header));
}
$adminer->headers();
}
/** Get Content Security Policy headers
* @return array of arrays with directive name in key, allowed sources in value
*/
function csp() {
return array(
array(
"script-src" => "'self' 'unsafe-inline' 'nonce-" . get_nonce() . "' 'strict-dynamic'", // 'self' is a fallback for browsers not supporting 'strict-dynamic', 'unsafe-inline' is a fallback for browsers not supporting 'nonce-'
"connect-src" => "'self'",
"frame-src" => "https://www.adminer.org",
"object-src" => "'none'",
"base-uri" => "'none'",
"form-action" => "'self'",
),
);
}
/** Get a CSP nonce
* @return string Base64 value
*/
function get_nonce() {
static $nonce;
if (!$nonce) {
$nonce = base64_encode(rand_string());
}
return $nonce;
}
/** Print flash and error messages
* @param string
* @return null
*/
function page_messages($error) {
$uri = preg_replace('~^[^?]*~', '', $_SERVER["REQUEST_URI"]);
$messages = $_SESSION["messages"][$uri];
if ($messages) {
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $messages) . "</div>" . script("messagesPrint();");
unset($_SESSION["messages"][$uri]);
}
if ($error) {
echo "<div class='error'>$error</div>\n";
}
define("PAGE_HEADER", 1);
}
/** Print HTML footer
@@ -89,13 +174,22 @@ document.body.className = document.body.className.replace(/ nojs/, ' js');
* @return null
*/
function page_footer($missing = "") {
global $adminer;
global $adminer, $token;
?>
</div>
<?php switch_lang(); ?>
<?php if ($missing != "auth") { ?>
<form action="" method="post">
<p class="logout">
<input type="submit" name="logout" value="<?php echo lang('Logout'); ?>" id="logout">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</p>
</form>
<?php } ?>
<div id="menu">
<?php $adminer->navigation($missing); ?>
</div>
<?php
echo script("setupSubmitHighlight(document);");
}

View File

@@ -0,0 +1,168 @@
<?php
/*abstract*/ class Min_SQL {
var $_conn;
/** Create object for performing database operations
* @param Min_DB
*/
function __construct($connection) {
$this->_conn = $connection;
}
/** Select data from table
* @param string
* @param array result of $adminer->selectColumnsProcess()[0]
* @param array result of $adminer->selectSearchProcess()
* @param array result of $adminer->selectColumnsProcess()[1]
* @param array result of $adminer->selectOrderProcess()
* @param int result of $adminer->selectLimitProcess()
* @param int index of page starting at zero
* @param bool whether to print the query
* @return Min_Result
*/
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer, $jush;
$is_group = (count($group) < count($select));
$query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
if (!$query) {
$query = "SELECT" . limit(
($_GET["page"] != "last" && $limit != "" && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
($where ? "\nWHERE " . implode(" AND ", $where) : "") . ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""),
($limit != "" ? +$limit : null),
($page ? $limit * $page : 0),
"\n"
);
}
$start = microtime(true);
$return = $this->_conn->query($query);
if ($print) {
echo $adminer->selectQuery($query, $start, !$return);
}
return $return;
}
/** Delete data from table
* @param string
* @param string " WHERE ..."
* @param int 0 or 1
* @return bool
*/
function delete($table, $queryWhere, $limit = 0) {
$query = "FROM " . table($table);
return queries("DELETE" . ($limit ? limit1($table, $query, $queryWhere) : " $query$queryWhere"));
}
/** Update data in table
* @param string
* @param array escaped columns in keys, quoted data in values
* @param string " WHERE ..."
* @param int 0 or 1
* @param string
* @return bool
*/
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
$values = array();
foreach ($set as $key => $val) {
$values[] = "$key = $val";
}
$query = table($table) . " SET$separator" . implode(",$separator", $values);
return queries("UPDATE" . ($limit ? limit1($table, $query, $queryWhere, $separator) : " $query$queryWhere"));
}
/** Insert data into table
* @param string
* @param array escaped columns in keys, quoted data in values
* @return bool
*/
function insert($table, $set) {
return queries("INSERT INTO " . table($table) . ($set
? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")"
: " DEFAULT VALUES"
));
}
/** Insert or update data in table
* @param string
* @param array
* @param array of arrays with escaped columns in keys and quoted data in values
* @return bool
*/
/*abstract*/ function insertUpdate($table, $rows, $primary) {
return false;
}
/** Begin transaction
* @return bool
*/
function begin() {
return queries("BEGIN");
}
/** Commit transaction
* @return bool
*/
function commit() {
return queries("COMMIT");
}
/** Rollback transaction
* @return bool
*/
function rollback() {
return queries("ROLLBACK");
}
/** Return query with a timeout
* @param string
* @param int seconds
* @return string or null if the driver doesn't support query timeouts
*/
function slowQuery($query, $timeout) {
}
/** Convert column to be searchable
* @param string escaped column name
* @param array array("op" => , "val" => )
* @param array
* @return string
*/
function convertSearch($idf, $val, $field) {
return $idf;
}
/** Convert value returned by database to actual value
* @param string
* @param array
* @return string
*/
function value($val, $field) {
return (method_exists($this->_conn, 'value')
? $this->_conn->value($val, $field)
: (is_resource($val) ? stream_get_contents($val) : $val)
);
}
/** Quote binary string
* @param string
* @return string
*/
function quoteBinary($s) {
return q($s);
}
/** Get warnings about the last command
* @return string HTML
*/
function warnings() {
return '';
}
/** Get help link for table
* @param string
* @return string relative URL or null
*/
function tableHelp($name) {
}
}

View File

@@ -2,11 +2,12 @@
/** Print select result
* @param Min_Result
* @param Min_DB connection to examine indexes
* @param string base link for <th> fields
* @param array
* @return null
* @param array
* @param int
* @return array $orgtables
*/
function select($result, $connection2 = null, $href = "", $orgtables = array()) {
function select($result, $connection2 = null, $orgtables = array(), $limit = 0) {
global $jush;
$links = array(); // colno => orgtable - create links from these columns
$indexes = array(); // orgtable => array(column => colno) - primary keys
$columns = array(); // orgtable => array(column => ) - not selected columns in primary key
@@ -14,8 +15,9 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
$types = array(); // colno => type - display char in <code>
$return = array(); // table => orgtable - mapping to use in EXPLAIN
odd(''); // reset odd for each result
for ($i=0; $row = $result->fetch_row(); $i++) {
for ($i=0; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
if (!$i) {
echo "<div class='scrollable'>\n";
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) {
@@ -24,7 +26,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
$orgtable = $field->orgtable;
$orgname = $field->orgname;
$return[$field->table] = $orgtable;
if ($href) { // MySQL EXPLAIN
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
} elseif ($orgtable != "") {
if (!isset($indexes[$orgtable])) {
@@ -48,8 +50,12 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
$blobs[$j] = true;
}
$types[$j] = $field->type;
$name = h($name);
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . ($href ? "<a href='$href" . strtolower($name) . "' target='_blank' rel='noreferrer'>$name</a>" : $name);
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($name)
. ($orgtables ? doc_link(array(
'sql' => "explain-output.html#explain_" . strtolower($name),
'mariadb' => "explain/#the-columns-in-explain-select",
)) : "")
;
}
echo "</thead>\n";
}
@@ -59,8 +65,6 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
$val = "<i>NULL</i>";
} elseif ($blobs[$key] && !is_utf8($val)) {
$val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
} elseif (!strlen($val)) { // strlen - SQLite can return int
$val = "&nbsp;"; // some content to print a border
} else {
$val = h($val);
if ($types[$key] == 254) { // 254 - char
@@ -68,7 +72,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
}
}
if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($href) { // MySQL EXPLAIN
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$table = $row[array_search("table=", $links)];
$link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
} else {
@@ -82,7 +86,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
echo "<td>$val";
}
}
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
echo ($i ? "</table>\n</div>" : "<p class='message'>" . lang('No rows.')) . "\n";
return $return;
}
@@ -92,7 +96,7 @@ function select($result, $connection2 = null, $href = "", $orgtables = array())
*/
function referencable_primary($self) {
$return = array(); // table_name => field
foreach (table_status() as $table_name => $table) {
foreach (table_status('', true) as $table_name => $table) {
if ($table_name != $self && fk_support($table)) {
foreach (fields($table_name) as $field) {
if ($field["primary"]) {
@@ -108,18 +112,44 @@ function referencable_primary($self) {
return $return;
}
/** Get settings stored in a cookie
* @return array
*/
function adminer_settings() {
parse_str($_COOKIE["adminer_settings"], $settings);
return $settings;
}
/** Get setting stored in a cookie
* @param string
* @return array
*/
function adminer_setting($key) {
$settings = adminer_settings();
return $settings[$key];
}
/** Store settings to a cookie
* @param array
* @return bool
*/
function set_adminer_settings($settings) {
return cookie("adminer_settings", http_build_query($settings + adminer_settings()));
}
/** Print SQL <textarea> tag
* @param string
* @param string or array in which case [0] of every element is used
* @param int
* @param int
* @param string
* @return null
*/
function textarea($name, $value, $rows = 10, $cols = 80) {
echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea' spellcheck='false' wrap='off' onkeydown='return textareaKeydown(this, event);'>"; // spellcheck, wrap - not valid before HTML5
global $jush;
echo "<textarea name='$name' rows='$rows' cols='$cols' class='sqlarea jush-$jush' spellcheck='false' wrap='off'>";
if (is_array($value)) {
foreach ($value as $val) { // not implode() to save memory
echo h($val[0]) . "\n\n\n"; // $val == array($query, $time)
echo h($val[0]) . "\n\n\n"; // $val == array($query, $time, $elapsed)
}
} else {
echo h($value);
@@ -127,30 +157,34 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
echo "</textarea>";
}
/** Format time difference
* @param string output of microtime()
* @param string output of microtime()
* @return string HTML code
*/
function format_time($start, $end) {
return " <span class='time'>(" . lang('%.3f s', max(0, array_sum(explode(" ", $end)) - array_sum(explode(" ", $start)))) . ")</span>";
}
/** Print table columns for type edit
* @param string
* @param array
* @param array
* @param array returned by referencable_primary()
* @param array extra types to prepend
* @return null
*/
function edit_type($key, $field, $collations, $foreign_keys = array()) {
function edit_type($key, $field, $collations, $foreign_keys = array(), $extra_types = array()) {
global $structured_types, $types, $unsigned, $on_actions;
$type = $field["type"];
?>
<td><select name="<?php echo $key; ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"><?php echo optionlist((!$field["type"] || isset($types[$field["type"]]) ? array() : array($field["type"])) + $structured_types + ($foreign_keys ? array(lang('Foreign keys') => $foreign_keys) : array()), $field["type"]); ?></select>
<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"><td class="options"><?php //! type="number" with enabled JavaScript
echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo ($foreign_keys ? "<select name='$key" . "[on_delete]'" . (ereg("`", $field["type"]) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
<td><select name="<?php echo h($key); ?>[type]" class="type" aria-labelledby="label-type"><?php
if ($type && !isset($types[$type]) && !isset($foreign_keys[$type]) && !in_array($type, $extra_types)) {
$extra_types[] = $type;
}
if ($foreign_keys) {
$structured_types[lang('Foreign keys')] = $foreign_keys;
}
echo optionlist(array_merge($extra_types, $structured_types), $type);
?></select>
<?php echo on_help("getTarget(event).value", 1); ?>
<?php echo script("mixin(qsl('select'), {onfocus: function () { lastType = selectValue(this); }, onchange: editingTypeChange});", ""); ?>
<td><input name="<?php echo h($key); ?>[length]" value="<?php echo h($field["length"]); ?>" size="3"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); //! type="number" with enabled JavaScript ?> aria-labelledby="label-length"><?php echo script("mixin(qsl('input'), {onfocus: editingLengthFocus, oninput: editingLengthChange});", ""); ?><td class="options"><?php
echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match(number_type(), $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), (preg_match('~^CURRENT_TIMESTAMP~i', $field["on_update"]) ? "CURRENT_TIMESTAMP" : $field["on_update"])) . '</select>' : '');
echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
}
/** Filter length value including enums
@@ -159,7 +193,10 @@ function edit_type($key, $field, $collations, $foreign_keys = array()) {
*/
function process_length($length) {
global $enum_length;
return (preg_match("~^\\s*(?:$enum_length)(?:\\s*,\\s*(?:$enum_length))*\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches) ? implode(",", $matches[0]) : preg_replace('~[^0-9,+-]~', '', $length));
return (preg_match("~^\\s*\\(?\\s*$enum_length(?:\\s*,\\s*$enum_length)*+\\s*\\)?\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches)
? "(" . implode(",", $matches[0]) . ")"
: preg_replace('~^[0-9].*~', '(\0)', preg_replace('~[^-0-9,+()[\]]~', '', $length))
);
}
/** Create SQL string from field type
@@ -170,9 +207,9 @@ function process_length($length) {
function process_type($field, $collate = "COLLATE") {
global $unsigned;
return " $field[type]"
. ($field["length"] != "" ? "(" . process_length($field["length"]) . ")" : "")
. (ereg('int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
. (ereg('char|text|enum|set', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
. process_length($field["length"])
. (preg_match(number_type(), $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
. (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
;
}
@@ -186,13 +223,22 @@ function process_field($field, $type_field) {
idf_escape(trim($field["field"])),
process_type($type_field),
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
(isset($field["default"]) ? " DEFAULT " . (($field["type"] == "timestamp" && eregi('^CURRENT_TIMESTAMP$', $field["default"])) || ($field["type"] == "bit" && ereg("^([0-9]+|b'[0-1]+')\$", $field["default"])) ? $field["default"] : q($field["default"])) : ""),
($field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
default_value($field),
(preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
($field["auto_increment"] ? auto_increment() : null),
);
}
/** Get default value clause
* @param array
* @return string
*/
function default_value($field) {
$default = $field["default"];
return ($default === null ? "" : " DEFAULT " . (preg_match('~char|binary|text|enum|set~', $field["type"]) || preg_match('~^(?![a-z])~i', $default) ? q($default) : $default));
}
/** Get type class to use in CSS
* @param string
* @return string class=''
@@ -204,7 +250,7 @@ function type_class($type) {
'binary' => 'blob',
'enum' => 'set',
) as $key => $val) {
if (ereg("$key|$val", $type)) {
if (preg_match("~$key|$val~", $type)) {
return " class='$key'";
}
}
@@ -214,30 +260,36 @@ function type_class($type) {
* @param array
* @param array
* @param string TABLE or PROCEDURE
* @param int number of fields allowed by Suhosin
* @param array returned by referencable_primary()
* @param bool display comments column
* @return null
*/
function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) {
global $connection, $inout;
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array()) {
global $inout;
$fields = array_values($fields);
?>
<thead><tr class="wrap">
<?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
<th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
<td><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea>
<td><?php echo lang('Length'); ?>
<td><?php echo lang('Options'); ?>
<thead><tr>
<?php if ($type == "PROCEDURE") { ?><td><?php } ?>
<th id="label-name"><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
<td id="label-type"><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;"></textarea><?php echo script("qs('#enum-edit').onblur = editingLengthBlur;"); ?>
<td id="label-length"><?php echo lang('Length'); ?>
<td><?php echo lang('Options'); /* no label required, options have their own label */ ?>
<?php if ($type == "TABLE") { ?>
<td>NULL
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym>
<td><?php echo lang('Default values'); ?>
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<td id="label-null">NULL
<td><input type="radio" name="auto_increment_col" value=""><acronym id="label-ai" title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
'sql' => "example-auto-increment.html",
'mariadb' => "auto_increment/",
'sqlite' => "autoinc.html",
'pgsql' => "datatype.html#DATATYPE-SERIAL",
'mssql' => "ms186775.aspx",
)); ?>
<td id="label-default"><?php echo lang('Default value'); ?>
<?php echo (support("comment") ? "<td id='label-comment'>" . lang('Comment') : ""); ?>
<?php } ?>
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>" . script("row_count = " . count($fields) . ";"); ?>
</thead>
<tbody onkeydown="return editingKeydown(event);">
<tbody>
<?php
echo script("mixin(qsl('tbody'), {onclick: editingClick, onkeydown: editingKeydown, oninput: editingInput});");
foreach ($fields as $i => $field) {
$i++;
$orig = $field[($_POST ? "orig" : "field")];
@@ -245,32 +297,30 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
?>
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", explode("|", $inout), $field["inout"]) : ""); ?>
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="<?php echo ($field["field"] != "" || count($fields) > 1 ? "" : "editingAddRow(this, $allowed); "); ?>editingNameChange(this);" maxlength="64"><?php } ?><input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
<th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" data-maxlength="64" autocapitalize="off" aria-labelledby="label-name"><?php echo script("qsl('input').oninput = function () { editingNameChange.call(this);" . ($field["field"] != "" || count($fields) > 1 ? "" : " editingAddRow.call(this);") . " };", ""); ?><?php } ?>
<input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($orig); ?>">
<?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
<?php if ($type == "TABLE") { ?>
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?>
<td><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }">
<td><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onchange="this.previousSibling.checked = true;">
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . "><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' maxlength='" . ($connection->server_info >= 5.5 ? 1024 : 255) . "'>" : ""); ?>
<?php } ?>
<?php
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block", "label-null"); ?>
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> aria-labelledby="label-ai"></label><td><?php
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" aria-labelledby="label-default"><?php
echo (support("comment") ? "<td><input name='fields[$i][comment]' value='" . h($field["comment"]) . "' data-maxlength='" . (min_version(5.5) ? 1024 : 255) . "' aria-labelledby='label-comment'>" : "");
}
echo "<td>";
echo (support("move_col") ?
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>&nbsp;"
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;"
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>&nbsp;"
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'> "
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='' title='" . lang('Move up') . "'> "
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='' title='" . lang('Move down') . "'> "
: "");
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : "");
echo "\n";
echo ($orig == "" || support("drop_col") ? "<input type='image' class='icon' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" : "");
}
}
/** Move fields up and down or add field
* @param array
* @return null
* @return bool
*/
function process_fields(&$fields) {
ksort($fields);
$offset = 0;
if ($_POST["up"]) {
$last = 0;
@@ -285,8 +335,7 @@ function process_fields(&$fields) {
}
$offset++;
}
}
if ($_POST["down"]) {
} elseif ($_POST["down"]) {
$found = false;
foreach ($fields as $key => $field) {
if (isset($field["field"]) && $found) {
@@ -299,11 +348,13 @@ function process_fields(&$fields) {
}
$offset++;
}
}
$fields = array_values($fields);
if ($_POST["add"]) {
} elseif ($_POST["add"]) {
$fields = array_values($fields);
array_splice($fields, key($_POST["add"]), 0, array(array()));
} elseif (!$_POST["drop_col"]) {
return false;
}
return true;
}
/** Callback used in routine()
@@ -332,52 +383,121 @@ function grant($grant, $privileges, $columns, $on) {
: queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
);
}
return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
return queries("$grant " . preg_replace('~(GRANT OPTION)\([^)]*\)~', '\1', implode("$columns, ", $privileges) . $columns) . $on);
}
/** Drop old object and create a new one
* @param string drop query
* @param string create query
* @param string drop old object query
* @param string create new object query
* @param string drop new object query
* @param string create test object query
* @param string drop test object query
* @param string
* @param string
* @param string
* @param string
* @param string
* @return bool dropped
* @param string
* @return null redirect in success
*/
function drop_create($drop, $create, $location, $message_drop, $message_alter, $message_create, $name) {
function drop_create($drop, $create, $drop_created, $test, $drop_test, $location, $message_drop, $message_alter, $message_create, $old_name, $new_name) {
if ($_POST["drop"]) {
return query_redirect($drop, $location, $message_drop, true, !$_POST["dropped"]);
query_redirect($drop, $location, $message_drop);
} elseif ($old_name == "") {
query_redirect($create, $location, $message_create);
} elseif ($old_name != $new_name) {
$created = queries($create);
queries_redirect($location, $message_alter, $created && queries($drop));
if ($created) {
queries($drop_created);
}
} else {
queries_redirect(
$location,
$message_alter,
queries($test) && queries($drop_test) && queries($drop) && queries($create)
);
}
$dropped = $name != "" && ($_POST["dropped"] || queries($drop));
$created = queries($create);
if (!queries_redirect($location, ($name != "" ? $message_alter : $message_create), $created) && $dropped) {
redirect(null, $message_drop);
}
/** Generate SQL query for creating trigger
* @param string
* @param array result of trigger()
* @return string
*/
function create_trigger($on, $row) {
global $jush;
$timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : "");
return "CREATE TRIGGER "
. idf_escape($row["Trigger"])
. ($jush == "mssql" ? $on . $timing_event : $timing_event . $on)
. rtrim(" $row[Type]\n$row[Statement]", ";")
. ";"
;
}
/** Generate SQL query for creating routine
* @param string "PROCEDURE" or "FUNCTION"
* @param array result of routine()
* @return string
*/
function create_routine($routine, $row) {
global $inout, $jush;
$set = array();
$fields = (array) $row["fields"];
ksort($fields); // enforce fields order
foreach ($fields as $field) {
if ($field["field"] != "") {
$set[] = (preg_match("~^($inout)\$~", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
}
}
return $dropped;
$definition = rtrim("\n$row[definition]", ";");
return "CREATE $routine "
. idf_escape(trim($row["name"]))
. " (" . implode(", ", $set) . ")"
. (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
. ($row["language"] ? " LANGUAGE $row[language]" : "")
. ($jush == "pgsql" ? " AS " . q($definition) : "$definition;")
;
}
/** Remove current user definer from SQL command
* @param string
* @return string
*/
function remove_definer($query) {
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\\1)', logged_user()) . '`~', '\\1', $query); //! proper escaping of user
}
/** Get string to add a file in TAR
* @param string
* @param string
* @return string
*/
function tar_file($filename, $contents) {
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct(strlen($contents)), decoct(time()));
function remove_definer($query) {
return preg_replace('~^([A-Z =]+) DEFINER=`' . preg_replace('~@(.*)~', '`@`(%|\1)', logged_user()) . '`~', '\1', $query); //! proper escaping of user
}
/** Format foreign key to use in SQL query
* @param array ("table" => string, "source" => array, "target" => array, "on_delete" => one of $on_actions, "on_update" => one of $on_actions)
* @return string
*/
function format_foreign_key($foreign_key) {
global $on_actions;
return " FOREIGN KEY (" . implode(", ", array_map('idf_escape', $foreign_key["source"])) . ") REFERENCES " . table($foreign_key["table"])
. " (" . implode(", ", array_map('idf_escape', $foreign_key["target"])) . ")" //! reuse $name - check in older MySQL versions
. (preg_match("~^($on_actions)\$~", $foreign_key["on_delete"]) ? " ON DELETE $foreign_key[on_delete]" : "")
. (preg_match("~^($on_actions)\$~", $foreign_key["on_update"]) ? " ON UPDATE $foreign_key[on_update]" : "")
;
}
/** Add a file to TAR
* @param string
* @param TmpFile
* @return null prints the output
*/
function tar_file($filename, $tmp_file) {
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct($tmp_file->size), decoct(time()));
$checksum = 8*32; // space for checksum itself
for ($i=0; $i < strlen($return); $i++) {
$checksum += ord($return[$i]);
}
$return .= sprintf("%06o", $checksum) . "\0 ";
return $return . str_repeat("\0", 512 - strlen($return)) . $contents . str_repeat("\0", 511 - (strlen($contents) + 511) % 512);
echo $return;
echo str_repeat("\0", 512 - strlen($return));
$tmp_file->send();
echo str_repeat("\0", 511 - ($tmp_file->size + 511) % 512);
}
/** Get INI bytes value
@@ -393,3 +513,64 @@ function ini_bytes($ini) {
}
return $val;
}
/** Create link to database documentation
* @param array $jush => $path
* @param string HTML code
* @return string HTML code
*/
function doc_link($paths, $text = "<sup>?</sup>") {
global $jush, $connection;
$server_info = $connection->server_info;
$version = preg_replace('~^(\d\.?\d).*~s', '\1', $server_info); // two most significant digits
$urls = array(
'sql' => "https://dev.mysql.com/doc/refman/$version/en/",
'sqlite' => "https://www.sqlite.org/",
'pgsql' => "https://www.postgresql.org/docs/$version/static/",
'mssql' => "https://msdn.microsoft.com/library/",
'oracle' => "https://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
);
if (preg_match('~MariaDB~', $server_info)) {
$urls['sql'] = "https://mariadb.com/kb/en/library/";
$paths['sql'] = (isset($paths['mariadb']) ? $paths['mariadb'] : str_replace(".html", "/", $paths['sql']));
}
return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]'" . target_blank() . ">$text</a>" : "");
}
/** Wrap gzencode() for usage in ob_start()
* @param string
* @return string
*/
function ob_gzencode($string) {
// ob_start() callback recieves an optional parameter $phase but gzencode() accepts optional parameter $level
return gzencode($string);
}
/** Compute size of database
* @param string
* @return string formatted
*/
function db_size($db) {
global $connection;
if (!$connection->select_db($db)) {
return "?";
}
$return = 0;
foreach (table_status() as $table_status) {
$return += $table_status["Data_length"] + $table_status["Index_length"];
}
return format_number($return);
}
/** Print SET NAMES if utf8mb4 might be needed
* @param string
* @return null
*/
function set_utf8mb4($create) {
global $connection;
static $set = false;
if (!$set && preg_match('~\butf8mb4~i', $create)) { // possible false positive
$set = true;
echo "SET NAMES " . charset($connection) . ";\n\n";
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,34 +2,48 @@
// not used in a single language version
$langs = array(
'en' => 'English', // Jakub Vrána - http://www.vrana.cz
'cs' => 'Čeština', // Jakub Vrána - http://www.vrana.cz
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'et' => 'Eesti', // Priit Kallas
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
'ca' => 'Català', // Joan Llosas
'pt' => 'Português', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'ru' => 'Русский язык', // Maksim Izmaylov
'uk' => 'Українська', // Valerii Kryzhov
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
'zh' => '简体中文', // Mr. Lodar
'zh-tw' => '繁體中文', // http://tzangms.com
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
'en' => 'English', // Jakub Vrána - https://www.vrana.cz
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com
'bg' => 'Български', // Deyan Delchev
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
'bs' => 'Bosanski', // Emir Kurtovic
'ca' => 'Català', // Joan Llosas
'cs' => 'Čeština', // Jakub Vrána - https://www.vrana.cz
'da' => 'Dansk', // Jarne W. Beutnagel - jarne@beutnagel.dk
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
'el' => 'Ελληνικά', // Dimitrios T. Tanis - jtanis@tanisfood.gr
'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
'et' => 'Eesti', // Priit Kallas
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com, Nima Amini - http://nimlog.com
'fi' => 'Suomi', // Finnish - Kari Eveli - http://www.lexitec.fi/
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'gl' => 'Galego', // Eduardo Penabad Ramos
'he' => 'עברית', // Binyamin Yawitz - https://stuff-group.com/
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'id' => 'Bahasa Indonesia', // Ivan Lanin - http://ivan.lanin.org
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'ja' => '日本語', // Hitoshi Ozawa - http://sourceforge.jp/projects/oss-ja-jpn/releases/
'ka' => 'ქართული', // Saba Khmaladze skhmaladze@uglt.org
'ko' => '한국어', // dalli - skcha67@gmail.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'ms' => 'Bahasa Melayu', // Pisyek
'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
'no' => 'Norsk', // Iver Odin Kvello, mupublishing.com
'pl' => 'Polski', // Radosław Kowalewski - http://srsbiz.pl/
'pt' => 'Português', // André Dias
'pt-br' => 'Português (Brazil)', // Gian Live - gian@live.com, Davi Alexandre davi@davialexandre.com.br, RobertoPC - http://www.robertopc.com.br
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'ru' => 'Русский', // Maksim Izmaylov; Andre Polykanine - https://github.com/Oire/
'sk' => 'Slovenčina', // Ivan Suchy - http://www.ivansuchy.com, Juraj Krivda - http://www.jstudio.cz
'sl' => 'Slovenski', // Matej Ferlan - www.itdinamik.com, matej.ferlan@itdinamik.com
'sr' => 'Српски', // Nikola Radovanović - cobisimo@gmail.com
'ta' => 'த‌மிழ்', // G. Sampath Kumar, Chennai, India, sampathkumar11@gmail.com
'th' => 'ภาษาไทย', // Panya Saraphi, elect.tu@gmail.com - http://www.opencart2u.com/
'tr' => 'Türkçe', // Bilgehan Korkmaz - turktron.com
'uk' => 'Українська', // Valerii Kryzhov
'vi' => 'Tiếng Việt', // Giang Manh @ manhgd google mail
'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com
'zh-tw' => '繁體中文', // http://tzangms.com
);
/** Get current language
@@ -52,11 +66,11 @@ function lang($idf, $number = null) {
$pos = ($number == 1 ? 0
: ($LANG == 'cs' || $LANG == 'sk' ? ($number && $number < 5 ? 1 : 2) // different forms for 1, 2-4, other
: ($LANG == 'fr' ? (!$number ? 0 : 1) // different forms for 0-1, other
: ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4, other
: ($LANG == 'pl' ? ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2) // different forms for 1, 2-4 except 12-14, other
: ($LANG == 'sl' ? ($number % 100 == 1 ? 0 : ($number % 100 == 2 ? 1 : ($number % 100 == 3 || $number % 100 == 4 ? 2 : 3))) // different forms for 1, 2, 3-4, other
: ($LANG == 'lt' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 12-19, other
: ($LANG == 'ru' || $LANG == 'sr' || $LANG == 'uk' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1, 2-4, other
: 1
: ($LANG == 'bs' || $LANG == 'ru' || $LANG == 'sr' || $LANG == 'uk' ? ($number % 10 == 1 && $number % 100 != 11 ? 0 : ($number % 10 > 1 && $number % 10 < 5 && $number / 10 % 10 != 1 ? 1 : 2)) // different forms for 1 except 11, 2-4 except 12-14, other
: 1 // different forms for 1, other
))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos];
}
@@ -64,7 +78,7 @@ function lang($idf, $number = null) {
array_shift($args);
$format = str_replace("%d", "%s", $translation);
if ($format != $translation) {
$args[0] = number_format($number, 0, ".", lang(','));
$args[0] = format_number($number);
}
return vsprintf($format, $args);
}
@@ -74,11 +88,11 @@ function switch_lang() {
echo "<form action='' method='post'>\n<div id='lang'>";
echo lang('Language') . ": " . html_select("lang", $langs, $LANG, "this.form.submit();");
echo " <input type='submit' value='" . lang('Use') . "' class='hidden'>\n";
echo "<input type='hidden' name='token' value='$_SESSION[token]'>\n"; // $token may be empty in auth.inc.php
echo "<input type='hidden' name='token' value='" . get_token() . "'>\n"; // $token may be empty in auth.inc.php
echo "</div>\n</form>\n";
}
if (isset($_POST["lang"]) && $_SESSION["token"] == $_POST["token"]) { // $token and $error not yet available
if (isset($_POST["lang"]) && verify_token()) { // $error not yet available
cookie("adminer_lang", $_POST["lang"]);
$_SESSION["lang"] = $_POST["lang"]; // cookies may be disabled
$_SESSION["translations"] = array(); // used in compiled version

View File

@@ -6,18 +6,20 @@ if (extension_loaded('pdo')) {
function __construct() {
global $adminer;
$pos = array_search("", $adminer->operators);
$pos = array_search("SQL", $adminer->operators);
if ($pos !== false) {
unset($adminer->operators[$pos]);
}
}
function dsn($dsn, $username, $password, $exception_handler = 'auth_error') {
set_exception_handler($exception_handler); // try/catch is not compatible with PHP 4
parent::__construct($dsn, $username, $password);
restore_exception_handler();
function dsn($dsn, $username, $password, $options = array()) {
try {
parent::__construct($dsn, $username, $password, $options);
} catch (Exception $ex) {
auth_error(h($ex->getMessage()));
}
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
$this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
$this->server_info = @$this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
}
/*abstract function select_db($database);*/
@@ -27,6 +29,9 @@ if (extension_loaded('pdo')) {
$this->error = "";
if (!$result) {
list(, $this->errno, $this->error) = $this->errorInfo();
if (!$this->error) {
$this->error = lang('Unknown error.');
}
return false;
}
$this->store_result($result);

View File

@@ -0,0 +1,22 @@
<?php
class TmpFile {
var $handler;
var $size;
function __construct() {
$this->handler = tmpfile();
}
function write($contents) {
$this->size += strlen($contents);
fwrite($this->handler, $contents);
}
function send() {
fseek($this->handler, 0);
fpassthru($this->handler);
fclose($this->handler);
}
}

View File

@@ -1,2 +1,2 @@
<?php
$VERSION = "3.6.3";
$VERSION = "4.7.1";

View File

@@ -79,6 +79,9 @@ function decrypt_string($str, $key) {
if ($str == "") {
return "";
}
if (!$key) {
return false;
}
$key = array_values(unpack("V*", pack("H*", md5($key))));
$v = str2long($str, false);
$n = count($v) - 1;

View File

@@ -1,15 +1,16 @@
<?php
/** Adminer - Compact database management
* @link http://www.adminer.org/
* @author Jakub Vrana, http://www.vrana.cz/
* @link https://www.adminer.org/
* @author Jakub Vrana, https://www.vrana.cz/
* @copyright 2007 Jakub Vrana
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license https://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
include "./include/bootstrap.inc.php";
include "./include/tmpfile.inc.php";
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'";
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*'";
$inout = "IN|OUT|INOUT";
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
@@ -21,6 +22,7 @@ if (isset($_GET["callf"])) {
if (isset($_GET["function"])) {
$_GET["procedure"] = $_GET["function"];
}
if (isset($_GET["download"])) {
include "./download.inc.php";
} elseif (isset($_GET["table"])) {

View File

@@ -1,47 +1,64 @@
<?php
$TABLE = $_GET["indexes"];
$index_types = array("PRIMARY", "UNIQUE", "INDEX");
$table_status = table_status($TABLE);
if (eregi("MyISAM|M?aria", $table_status["Engine"])) {
$table_status = table_status($TABLE, true);
if (preg_match('~MyISAM|M?aria' . (min_version(5.6, '10.0.5') ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "FULLTEXT";
}
$indexes = indexes($TABLE);
if ($jush == "sqlite") { // doesn't support primary key
unset($index_types[0]);
unset($indexes[""]);
if (preg_match('~MyISAM|M?aria' . (min_version(5.7, '10.2.2') ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "SPATIAL";
}
if ($_POST && !$error && !$_POST["add"]) {
$indexes = indexes($TABLE);
$primary = array();
if ($jush == "mongo") { // doesn't support primary key
$primary = $indexes["_id_"];
unset($index_types[0]);
unset($indexes["_id_"]);
}
$row = $_POST;
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
$alter = array();
foreach ($_POST["indexes"] as $index) {
foreach ($row["indexes"] as $index) {
$name = $index["name"];
if (in_array($index["type"], $index_types)) {
$columns = array();
$lengths = array();
$descs = array();
$set = array();
ksort($index["columns"]);
foreach ($index["columns"] as $key => $column) {
if ($column != "") {
$length = $index["lengths"][$key];
$set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "");
$desc = $index["descs"][$key];
$set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
$columns[] = $column;
$lengths[] = ($length ? $length : null);
$descs[] = $desc;
}
}
if ($columns) {
$existing = $indexes[$name];
if ($existing) {
ksort($existing["columns"]);
ksort($existing["lengths"]);
if ($index["type"] == $existing["type"] && array_values($existing["columns"]) === $columns && (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)) {
ksort($existing["descs"]);
if ($index["type"] == $existing["type"]
&& array_values($existing["columns"]) === $columns
&& (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)
&& array_values($existing["descs"]) === $descs
) {
// skip existing index
unset($indexes[$name]);
continue;
}
}
$alter[] = array($index["type"], $name, "(" . implode(", ", $set) . ")");
$alter[] = array($index["type"], $name, $set);
}
}
}
// drop removed indexes
foreach ($indexes as $name => $existing) {
$alter[] = array($existing["type"], $name, "DROP");
@@ -52,53 +69,78 @@ if ($_POST && !$error && !$_POST["add"]) {
queries_redirect(ME . "table=" . urlencode($TABLE), lang('Indexes have been altered.'), alter_indexes($TABLE, $alter));
}
page_header(lang('Indexes'), $error, array("table" => $TABLE), $TABLE);
page_header(lang('Indexes'), $error, array("table" => $TABLE), h($TABLE));
$fields = array_keys(fields($TABLE));
$row = array("indexes" => $indexes);
if ($_POST) {
$row = $_POST;
if ($_POST["add"]) {
foreach ($row["indexes"] as $key => $index) {
if ($index["columns"][count($index["columns"])] != "") {
$row["indexes"][$key]["columns"][] = "";
}
}
$index = end($row["indexes"]);
if ($index["type"] || array_filter($index["columns"], 'strlen') || array_filter($index["lengths"], 'strlen')) {
$row["indexes"][] = array("columns" => array(1 => ""));
}
}
} else {
if ($_POST["add"]) {
foreach ($row["indexes"] as $key => $index) {
$row["indexes"][$key]["name"] = $key;
$row["indexes"][$key]["columns"][] = "";
if ($index["columns"][count($index["columns"])] != "") {
$row["indexes"][$key]["columns"][] = "";
}
}
$row["indexes"][] = array("columns" => array(1 => ""));
$index = end($row["indexes"]);
if ($index["type"] || array_filter($index["columns"], 'strlen')) {
$row["indexes"][] = array("columns" => array(1 => ""));
}
}
if (!$row) {
foreach ($indexes as $key => $index) {
$indexes[$key]["name"] = $key;
$indexes[$key]["columns"][] = "";
}
$indexes[] = array("columns" => array(1 => ""));
$row["indexes"] = $indexes;
}
?>
<form action="" method="post">
<div class="scrollable">
<table cellspacing="0" class="nowrap">
<thead><tr><th><?php echo lang('Index Type'); ?><th><?php echo lang('Column (length)'); ?><th><?php echo lang('Name'); ?></thead>
<thead><tr>
<th id="label-type"><?php echo lang('Index Type'); ?>
<th><input type="submit" class="wayoff"><?php echo lang('Column (length)'); ?>
<th id="label-name"><?php echo lang('Name'); ?>
<th><noscript><?php echo "<input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?></noscript>
</thead>
<?php
if ($primary) {
echo "<tr><td>PRIMARY<td>";
foreach ($primary["columns"] as $key => $column) {
echo select_input(" disabled", $fields, $column);
echo "<label><input disabled type='checkbox'>" . lang('descending') . "</label> ";
}
echo "<td><td>\n";
}
$j = 1;
foreach ($row["indexes"] as $index) {
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow(this);" : 1)) . "<td>";
ksort($index["columns"]);
$i = 1;
foreach ($index["columns"] as $key => $column) {
echo "<span>" . html_select("indexes[$j][columns][$i]", array(-1 => "") + $fields, $column, ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "');");
echo "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'> </span>"; //! hide for non-MySQL drivers, add ASC|DESC
$i++;
if (!$_POST["drop_col"] || $j != key($_POST["drop_col"])) {
echo "<tr><td>" . html_select("indexes[$j][type]", array(-1 => "") + $index_types, $index["type"], ($j == count($row["indexes"]) ? "indexesAddRow.call(this);" : 1), "label-type");
echo "<td>";
ksort($index["columns"]);
$i = 1;
foreach ($index["columns"] as $key => $column) {
echo "<span>" . select_input(
" name='indexes[$j][columns][$i]' title='" . lang('Column') . "'",
($fields ? array_combine($fields, $fields) : $fields),
$column,
"partial(" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . ", '" . js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_") . "')"
);
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
echo (support("descidx") ? checkbox("indexes[$j][descs][$i]", 1, $index["descs"][$key], lang('descending')) : "");
echo " </span>";
$i++;
}
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "' autocapitalize='off' aria-labelledby='label-name'>\n";
echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "'>" . script("qsl('input').onclick = partial(editingRemoveRow, 'indexes\$1[type]');");
}
echo "<td><input name='indexes[$j][name]' value='" . h($index["name"]) . "'>\n";
$j++;
}
?>
</table>
</div>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<noscript><p><input type="submit" name="add" value="<?php echo lang('Add next'); ?>"></noscript>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,23 +1,22 @@
<?php
$translations = array(
'Login' => 'تسجيل الدخول',
'Logout successful.' => 'مع السلامة.',
'Invalid credentials.' => 'فشل في تسجيل الدخول.',
'Logout successful.' => 'تم تسجيل الخروج بنجاح.',
'Invalid credentials.' => 'بيانات الدخول غير صالحة.',
'Server' => 'الخادم',
'Username' => 'المستعمل',
'Username' => 'اسم المستخدم',
'Password' => 'كلمة المرور',
'Select database' => 'إختر قاعدة البيانات',
'Invalid database.' => 'قاعدة بيانات خاطئة.',
'Create new database' => 'أنشئ فاعدة بيانات',
'Select database' => 'اختر قاعدة البيانات',
'Invalid database.' => 'قاعدة البيانات غير صالحة.',
'Table has been dropped.' => 'تم حذف الجدول.',
'Table has been altered.' => 'تم تعديل الجدول.',
'Table has been created.' => 'تم إنشاء الجدول.',
'Alter table' => 'تعديل الجدول',
'Create table' => 'إنشاء جدول',
'Table name' => 'إسم الجدول',
'Table name' => 'اسم الجدول',
'engine' => 'المحرك',
'collation' => 'الترتيب',
'Column name' => 'إسم العمود',
'Column name' => 'اسم العمود',
'Type' => 'النوع',
'Length' => 'الطول',
'Auto Increment' => 'تزايد تلقائي',
@@ -29,14 +28,12 @@ $translations = array(
'Database has been altered.' => 'تم تعديل قاعدة البيانات.',
'Alter database' => 'تعديل قاعدة البيانات',
'Create database' => 'إنشاء قاعدة بيانات',
'SQL command' => 'إستعلام SQL',
'Dump' => 'تصدير',
'SQL command' => 'استعلام SQL',
'Logout' => 'تسجيل الخروج',
'database' => 'قاعدة بيانات',
'Use' => 'المستعمل',
'Use' => 'استعمال',
'No tables.' => 'لا توجد جداول.',
'select' => 'تحديد',
'Create new table' => 'أنشئ جدول جديد',
'Item has been deleted.' => 'تم حذف العنصر.',
'Item has been updated.' => 'تم تعديل العنصر.',
'Edit' => 'تعديل',
@@ -50,48 +47,48 @@ $translations = array(
'Alter indexes' => 'تعديل المؤشرات',
'Add next' => 'إضافة التالي',
'Language' => 'اللغة',
'Select' => 'إختيار',
'Select' => 'اختيار',
'New item' => 'عنصر جديد',
'Search' => 'بحث',
'Sort' => 'ترتيب',
'descending' => 'تنازلي',
'Limit' => 'حد',
'No rows.' => 'لا توجد نتائج.',
'Action' => 'حركة',
'Action' => 'الإجراء',
'edit' => 'تعديل',
'Page' => 'صفحة',
'Query executed OK, %d row(s) affected.' => 'تم تنفسذ الإستعلام, %d عدد الأسطر المعدلة.',
'Error in query' => 'هناك خطأ في الإستعلام',
'Query executed OK, %d row(s) affected.' => 'تم تنفسذ الاستعلام, %d عدد الأسطر المعدلة.',
'Error in query' => 'هناك خطأ في الاستعلام',
'Execute' => 'تنفيذ',
'Table' => 'جدول',
'Foreign keys' => 'مفاتيح أجنبية',
'Triggers' => 'الزنادات',
'View' => 'عرض',
'Unable to select the table' => 'من غير الممكن إختيار الجدول',
'Invalid CSRF token. Send the form again.' => 'CSRF Token خاطئ. من فضلك أعد إرسال الإستمارة.',
'Unable to select the table' => 'يتعذر اختيار الجدول',
'Invalid CSRF token. Send the form again.' => 'رمز CSRF غير صالح. المرجو إرسال الاستمارة مرة أخرى.',
'Comment' => 'تعليق',
'Default values' => 'القيمة الإفتراضية',
'Default values' => 'القيم الافتراضية',
'%d byte(s)' => '%d بايت',
'No commands to execute.' => 'لا توجد أوامر للتنفيذ.',
'Unable to upload a file.' => 'من غير الممكن رفع الملف.',
'Unable to upload a file.' => 'يتعذر رفع ملف ما.',
'File upload' => 'رفع ملف',
'File uploads are disabled.' => 'تم إلغاء رفع الملفات.',
'Routine has been called, %d row(s) affected.' => 'تم إستدعاء الروتين, عدد الأسطر المعدلة %d.',
'Call' => 'إستدعاء',
'No extension' => 'إمتداد غير موجود',
'File uploads are disabled.' => 'رفع الملفات غير مشغل.',
'Routine has been called, %d row(s) affected.' => 'تم استدعاء الروتين, عدد الأسطر المعدلة %d.',
'Call' => 'استدعاء',
'No extension' => 'امتداد غير موجود',
'None of the supported PHP extensions (%s) are available.' => 'إمتدادات php المدعومة غير موجودة.',
'Session support must be enabled.' => 'عليك تفعيل نظام الجلسات.',
'Session expired, please login again.' => 'إنتهت الجلسة، من فضلك أعد تسجيل الدخول.',
'Text length' => 'طول النص',
'Foreign key has been dropped.' => 'المفتاح الأجنبي تم مسحه.',
'Foreign key has been altered.' => 'المفتاح الأجنبي تم تعديله.',
'Foreign key has been created.' => 'المفتاح الأجنبي تم إنشاؤه.',
'Foreign key has been dropped.' => 'تم مسح المفتاح الأجنبي.',
'Foreign key has been altered.' => 'تم تعديل المفتاح الأجنبي.',
'Foreign key has been created.' => 'تم إنشاء المفتاح الأجنبي.',
'Foreign key' => 'مفتاح أجنبي',
'Target table' => 'الجدول المستهدف',
'Change' => 'تعديل',
'Source' => 'المصدر',
'Target' => 'الهدف',
'Add column' => 'أضف عمود',
'Add column' => 'إضافة عمودا',
'Alter' => 'تعديل',
'Add foreign key' => 'إضافة مفتاح أجنبي',
'ON DELETE' => 'ON DELETE',
@@ -103,11 +100,11 @@ $translations = array(
'View has been created.' => 'تم إنشاء العرض.',
'Alter view' => 'تعديل عرض',
'Create view' => 'إنشاء عرض',
'Name' => 'الإسم',
'Name' => 'الاسم',
'Process list' => 'قائمة الإجراءات',
'%d process(es) have been killed.' => 'عدد الإجراءات التي تم إيقافها %d.',
'Kill' => 'إيقاف',
'Parameter name' => 'إسم المتغير',
'Parameter name' => 'اسم المتغير',
'Database schema' => 'مخطط فاعدة البيانات',
'Create procedure' => 'إنشاء إجراء',
'Create function' => 'إنشاء دالة',
@@ -139,7 +136,7 @@ $translations = array(
'Grant' => 'موافق',
'Revoke' => 'إلغاء',
'%s version: %s through PHP extension %s' => 'النسخة %s : %s عن طريق إمتداد ال PHP %s',
'Logged as: %s' => 'تم تسجيل الدخول بإسم %s',
'Logged as: %s' => 'تم تسجيل الدخول باسم %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'معلومات POST كبيرة جدا. قم بتقليص حجم المعلومات أو قم بزيادة قيمة %s في خيارات ال PHP.',
'Move up' => 'نقل للأعلى',
'Move down' => 'نقل للأسفل',
@@ -178,6 +175,7 @@ $translations = array(
'Data Free' => 'المساحة الحرة',
'Rows' => 'الأسطر',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'تحليل',
'Optimize' => 'تحسين',
'Check' => 'فحص',
@@ -186,16 +184,16 @@ $translations = array(
'Move to other database' => 'نقل إلى قاعدة بيانات أخرى',
'Move' => 'نقل',
'%d item(s) have been affected.' => 'عدد العناصر المعدلة هو %d.',
'whole result' => 'نتيجة كاملة',
'Whole result' => 'نتيجة كاملة',
'Clone' => 'نسخ',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s و %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
'Partition by' => 'مقسم بواسطة',
'Partitions' => 'التقسيمات',
'Partition name' => 'إسم التقسيم',
'Partition name' => 'اسم التقسيم',
'Values' => 'القيم',
'%d row(s) have been imported.' => 'عدد الأسطر المستوردة هو %d.',
'%d row(s) have been imported.' => 'تم استيراد %d سطرا',
'anywhere' => 'في اي مكان',
'Import' => 'إستيراد',
'Import' => 'استيراد',
'Stop on error' => 'أوقف في حالة حدوث خطأ',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
@@ -225,7 +223,6 @@ $translations = array(
'Databases have been dropped.' => 'تم حذف قواعد البيانات.',
'Database has been dropped.' => 'تم حذف قاعدة البيانات.',
'Search data in tables' => 'بحث في الجداول',
'schema' => 'المخطط',
'Schema' => 'المخطط',
'Alter schema' => 'تعديل المخطط',
'Create schema' => 'إنشاء مخطط',
@@ -243,7 +240,7 @@ $translations = array(
'Alter type' => 'تعديل نوع',
'Type has been dropped.' => 'تم حذف النوع.',
'Type has been created.' => 'تم إنشاء النوع.',
'Use edit link to modify this value.' => 'إستعمل الرابط "تعديل" لتعديل هذه القيمة.',
'Use edit link to modify this value.' => 'استعمل الرابط "تعديل" لتعديل هذه القيمة.',
'last' => 'الأخيرة',
'From server' => 'من الخادم',
'System' => 'النظام',
@@ -256,16 +253,15 @@ $translations = array(
'Attachments' => 'ملفات مرفقة.',
'Item%s has been inserted.' => 'تم إدراج العنصر.',
'now' => 'الآن',
'%d query(s) executed OK.' => array('تم تنفيذ الإستعلام %d بنجاح.', 'تم تنفيذ الإستعلامات %d بنجاح.'),
'Show only errors' => عرض الأخطاء فقط',
'Last page' => 'الصفحة السابقة',
'%d query(s) executed OK.' => array('تم تنفيذ الاستعلام %d بنجاح.', 'تم تنفيذ الاستعلامات %d بنجاح.'),
'Show only errors' => ظهار الأخطاء فقط',
'Refresh' => 'تحديث',
'Invalid schema.' => 'مخطط خاطئ.',
'Please use one of the extensions %s.' => 'من فضلك إستعمل إحدى الإمتدادات: %s.',
'Invalid schema.' => 'مخطط غير صالح.',
'Please use one of the extensions %s.' => 'المرجو استخدام إحدى الامتدادات %s.',
'ltr' => 'rtl',
'Tables have been copied.' => 'تم نسخ الجداول.',
'Copy' => 'نسخ',
'Permanent link' => 'وصلة دائمة',
'Permanent link' => 'رابط دائم',
'Edit all' => 'تعديل الكل',
'HH:MM:SS' => 'HH:MM:SS',
);

336
adminer/lang/bg.inc.php Normal file
View File

@@ -0,0 +1,336 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Система',
'Server' => 'Сървър',
'Username' => 'Потребител',
'Password' => 'Парола',
'Permanent login' => 'Запаметяване',
'Login' => 'Вход',
'Logout' => 'Изход',
'Logged as: %s' => 'Текущ потребител: %s',
'Logout successful.' => 'Излизането е успешно.',
'Invalid credentials.' => 'Невалидни потребителски данни.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Прекалено много неуспешни опити за вход, опитайте пак след %d минута.', 'Прекалено много неуспешни опити за вход, опитайте пак след %d минути.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Главната парола вече е невалидна. <a href="https://www.adminer.org/en/extension/"%s>Изберете</a> %s метод, за да я направите постоянна.',
'Language' => 'Език',
'Invalid CSRF token. Send the form again.' => 'Невалиден шифроващ ключ. Попълнете и изпратете формуляра отново.',
'If you did not send this request from Adminer then close this page.' => 'Ако не сте изпратили тази заявка през Adminer, затворете тази страница.',
'No extension' => 'Няма разширение',
'None of the supported PHP extensions (%s) are available.' => 'Никое от поддържаните PHP разширения (%s) не е налично.',
'Session support must be enabled.' => 'Поддръжката на сесии трябва да е разрешена.',
'Session expired, please login again.' => 'Сесията е изтекла; моля, влезте отново.',
'%s version: %s through PHP extension %s' => '%s версия: %s през PHP разширение %s',
'Refresh' => 'Обновяване',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Права',
'Create user' => 'Създаване на потребител',
'User has been dropped.' => 'Потребителя беше премахнат.',
'User has been altered.' => 'Потребителя беше променен.',
'User has been created.' => 'Потребителя беше създаден.',
'Hashed' => 'Хеширан',
'Column' => 'Колона',
'Routine' => 'Процедура',
'Grant' => 'Осигуряване',
'Revoke' => 'Отнемане',
'Process list' => 'Списък с процеси',
'%d process(es) have been killed.' => array('%d процес беше прекъснат.', '%d процеса бяха прекъснати.'),
'Kill' => 'Прекъсване',
'Variables' => 'Променливи',
'Status' => 'Състояние',
'SQL command' => 'SQL команда',
'%d query(s) executed OK.' => array('%d заявка е изпълнена.', '%d заявки са изпълнени.'),
'Query executed OK, %d row(s) affected.' => array('Заявката е изпълнена, %d ред е засегнат.', 'Заявката е изпълнена, %d редове са засегнати.'),
'No commands to execute.' => 'Няма команди за изпълнение.',
'Error in query' => 'Грешка в заявката',
'Execute' => 'Изпълнение',
'Stop on error' => 'Спиране при грешка',
'Show only errors' => 'Показване само на грешките',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Хронология',
'Clear' => 'Изчистване',
'Edit all' => 'Редактиране на всички',
'File upload' => 'Прикачване на файл',
'From server' => 'От сървър',
'Webserver file %s' => 'Сървърен файл %s',
'Run file' => 'Изпълнение на файл',
'File does not exist.' => 'Файлът не съществува.',
'File uploads are disabled.' => 'Прикачването на файлове е забранено.',
'Unable to upload a file.' => 'Неуспешно прикачване на файл.',
'Maximum allowed file size is %sB.' => 'Максимално разрешената големина на файл е %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Изпратени са прекалено много данни. Намалете обема на данните или увеличете %s управляващата директива.',
'You can upload a big SQL file via FTP and import it from server.' => 'Можете да прикачите голям SQL файл чрез FTP и да го импортирате от сървъра.',
'You are offline.' => 'Вие сте офлайн.',
'Export' => 'Експорт',
'Output' => 'Резултат',
'open' => 'показване',
'save' => 'запис',
'Format' => 'Формат',
'Data' => 'Данни',
'Database' => 'База данни',
'database' => 'база данни',
'Use' => 'Избор',
'Select database' => 'Избор на база данни',
'Invalid database.' => 'Невалидна база данни.',
'Database has been dropped.' => 'Базата данни беше премахната.',
'Databases have been dropped.' => 'Базите данни бяха премехнати.',
'Database has been created.' => 'Базата данни беше създадена.',
'Database has been renamed.' => 'Базата данни беше преименувана.',
'Database has been altered.' => 'Базата данни беше променена.',
'Alter database' => 'Промяна на база данни',
'Create database' => 'Създаване на база данни',
'Database schema' => 'Схема на базата данни',
// link to current database schema layout
'Permanent link' => 'Постоянна препратка',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Система',
'Collation' => 'Кодировка',
'Data Length' => 'Големина на данните',
'Index Length' => 'Големина на индекса',
'Data Free' => 'Свободно място',
'Rows' => 'Редове',
'%d in total' => '%d всичко',
'Analyze' => 'Анализиране',
'Optimize' => 'Оптимизиране',
'Vacuum' => 'Консолидиране',
'Check' => 'Проверка',
'Repair' => 'Поправка',
'Truncate' => 'Изрязване',
'Tables have been truncated.' => 'Таблиците бяха изрязани.',
'Move to other database' => 'Преместване в друга база данни',
'Move' => 'Преместване',
'Tables have been moved.' => 'Таблиците бяха преместени.',
'Copy' => 'Копиране',
'Tables have been copied.' => 'Таблиците бяха копирани.',
'Routines' => 'Процедури',
'Routine has been called, %d row(s) affected.' => array('Беше приложена процедура, %d ред е засегнат.', 'Беше приложена процедура, %d редове са засегнати.'),
'Call' => 'Прилагане',
'Parameter name' => 'Име на параметъра',
'Create procedure' => 'Създаване на процедура',
'Create function' => 'Създаване на функция',
'Routine has been dropped.' => 'Процедурата беше премахната.',
'Routine has been altered.' => 'Процедурата беше променена.',
'Routine has been created.' => 'Процедурата беше създадена.',
'Alter function' => 'Промяна на функция',
'Alter procedure' => 'Промяна на процедура',
'Return type' => 'Резултат',
'Events' => 'Събития',
'Event has been dropped.' => 'Събитието беше премахнато.',
'Event has been altered.' => 'Събитието беше променено.',
'Event has been created.' => 'Събитието беше създадено.',
'Alter event' => 'Промяна на събитие',
'Create event' => 'Създаване на събитие',
'At given time' => 'В зададено време',
'Every' => 'Всеки',
'Schedule' => 'Насрочване',
'Start' => 'Начало',
'End' => 'Край',
'On completion preserve' => 'Запазване след завършване',
'Tables' => 'Таблици',
'Tables and views' => 'Таблици и изгледи',
'Table' => 'Таблица',
'No tables.' => 'Няма таблици.',
'Alter table' => 'Промяна на таблица',
'Create table' => 'Създаване на таблица',
'Table has been dropped.' => 'Таблицата беше премахната.',
'Tables have been dropped.' => 'Таблиците бяха премахнати.',
'Tables have been optimized.' => 'Таблиците бяха оптимизирани.',
'Table has been altered.' => 'Таблицата беше променена.',
'Table has been created.' => 'Таблицата беше създадена.',
'Table name' => 'Име на таблица',
'Show structure' => 'Структура',
'engine' => 'система',
'collation' => 'кодировка',
'Column name' => 'Име на колоната',
'Type' => 'Вид',
'Length' => 'Големина',
'Auto Increment' => 'Автоматично увеличаване',
'Options' => 'Опции',
'Comment' => 'Коментар',
'Default value' => 'Стойност по подразбиране',
'Default values' => 'Стойности по подразбиране',
'Drop' => 'Премахване',
'Are you sure?' => 'Сигурни ли сте?',
'Size' => 'Големина',
'Compute' => 'Изчисляване',
'Move up' => 'Преместване нагоре',
'Move down' => 'Преместване надолу',
'Remove' => 'Премахване',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Максималния брой полета е превишен. Моля, увеличете %s.',
'Partition by' => 'Разделяне на',
'Partitions' => 'Раздели',
'Partition name' => 'Име на раздела',
'Values' => 'Стойности',
'View' => 'Изглед',
'Materialized view' => 'Запаметен изглед',
'View has been dropped.' => 'Изгледа беше премахнат.',
'View has been altered.' => 'Изгледа беше променен.',
'View has been created.' => 'Изгледа беше създаден.',
'Alter view' => 'Промяна на изглед',
'Create view' => 'Създаване на изглед',
'Indexes' => 'Индекси',
'Indexes have been altered.' => 'Индексите бяха променени.',
'Alter indexes' => 'Промяна на индекси',
'Add next' => 'Добавяне на следващ',
'Index Type' => 'Вид на индекса',
'Column (length)' => 'Колона (дължина)',
'Foreign keys' => 'Препратки',
'Foreign key' => 'Препратка',
'Foreign key has been dropped.' => 'Препратката беше премахната.',
'Foreign key has been altered.' => 'Препратката беше променена.',
'Foreign key has been created.' => 'Препратката беше създадена.',
'Target table' => 'Таблица приемник',
'Change' => 'Промяна',
'Source' => 'Източник',
'Target' => 'Цел',
'Add column' => 'Добавяне на колона',
'Alter' => 'Промяна',
'Add foreign key' => 'Добавяне на препратка',
'ON DELETE' => 'При изтриване',
'ON UPDATE' => 'При промяна',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колоните източник и цел трябва да са от еднакъв вид, трябва да има индекс на колоните приемник и да има въведени данни.',
'Triggers' => 'Тригери',
'Add trigger' => 'Добавяне на тригер',
'Trigger has been dropped.' => 'Тригера беше премахнат.',
'Trigger has been altered.' => 'Тригера беше променен.',
'Trigger has been created.' => 'Тригера беше създаден.',
'Alter trigger' => 'Промяна на тригер',
'Create trigger' => 'Създаване на тригер',
'Time' => 'Време',
'Event' => 'Събитие',
'Name' => 'Име',
'select' => 'показване',
'Select' => 'Показване',
'Select data' => 'Показване на данни',
'Functions' => 'Функции',
'Aggregation' => 'Съвкупност',
'Search' => 'Търсене',
'anywhere' => 'навсякъде',
'Search data in tables' => 'Търсене на данни в таблиците',
'Sort' => 'Сортиране',
'descending' => 'низходящо',
'Limit' => 'Редове',
'Limit rows' => 'Лимит на редовете',
'Text length' => 'Текст',
'Action' => 'Действие',
'Full table scan' => 'Пълно сканиране на таблицата',
'Unable to select the table' => 'Неуспешно показване на таблицата',
'No rows.' => 'Няма редове.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d ред', '%d реда'),
'Page' => 'Страница',
'last' => 'последен',
'Load more data' => 'Зареждане на повече данни',
'Loading' => 'Зареждане',
'Whole result' => 'Пълен резултат',
'%d byte(s)' => array('%d байт', '%d байта'),
'Import' => 'Импорт',
'%d row(s) have been imported.' => array('%d ред беше импортиран.', '%d реда бяха импортирани.'),
'File must be in UTF-8 encoding.' => 'Файла трябва да е с UTF-8 кодировка.',
// in-place editing in select
'Modify' => 'Промяна',
'Ctrl+click on a value to modify it.' => 'Ctrl+щракване в стойността, за да я промените.',
'Use edit link to modify this value.' => 'Използвайте "редакция" за промяна на данните.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Елементи%s бяха вмъкнати.',
'Item has been deleted.' => 'Елемента беше изтрит.',
'Item has been updated.' => 'Елемента беше обновен.',
'%d item(s) have been affected.' => array('%d елемент беше засегнат.', '%d елемента бяха засегнати.'),
'New item' => 'Нов елемент',
'original' => 'оригинал',
// label for value '' in enum data type
'empty' => 'празно',
'edit' => 'редакция',
'Edit' => 'Редактиране',
'Insert' => 'Вмъкване',
'Save' => 'Запис',
'Saving' => 'Записване',
'Save and continue edit' => 'Запис и редакция',
'Save and insert next' => 'Запис и нов',
'Selected' => 'Избран',
'Clone' => 'Клониране',
'Delete' => 'Изтриване',
'You have no privileges to update this table.' => 'Нямате праве за обновяване на таблицата.',
'E-mail' => 'E-mail',
'From' => 'От',
'Subject' => 'Тема',
'Attachments' => 'Прикачени',
'Send' => 'Изпращане',
'%d e-mail(s) have been sent.' => array('%d писмо беше изпратено.', '%d писма бяха изпратени.'),
// data type descriptions
'Numbers' => 'Числа',
'Date and time' => 'Дата и час',
'Strings' => 'Низове',
'Binary' => 'Двоични',
'Lists' => 'Списъци',
'Network' => 'Мрежа',
'Geometry' => 'Геометрия',
'Relations' => 'Зависимости',
'Editor' => 'Редактор',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[гггг]-мм-дд',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'ЧЧ:ММ:СС',
'now' => 'сега',
'yes' => 'да',
'no' => 'не',
// general SQLite error in create, drop or rename database
'File exists.' => 'Файла вече съществува.',
'Please use one of the extensions %s.' => 'Моля, използвайте някое от разширенията %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Промяна на схемата',
'Create schema' => 'Създаване на схема',
'Schema has been dropped.' => 'Схемата беше премахната.',
'Schema has been created.' => 'Схемата беше създадена.',
'Schema has been altered.' => 'Схемата беше променена.',
'Schema' => 'Схема',
'Invalid schema.' => 'Невалидна схема.',
// PostgreSQL sequences support
'Sequences' => 'Последователности',
'Create sequence' => 'Създаване на последователност',
'Sequence has been dropped.' => 'Последователността беше премахната.',
'Sequence has been created.' => 'Последователността беше създадена.',
'Sequence has been altered.' => 'Последователността беше променена.',
'Alter sequence' => 'Промяна на последователност',
// PostgreSQL user types support
'User types' => 'Видове потребители',
'Create type' => 'Създаване на вид',
'Type has been dropped.' => 'Вида беше пермахнат.',
'Type has been created.' => 'Вида беше създаден.',
'Alter type' => 'Промяна на вид',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'পাসওয়ার্ড',
'Select database' => 'ডাটাবেজ নির্বাচন করো',
'Invalid database.' => 'ভুল ডাটাবেজ।',
'Create new database' => 'নতুন ডাটাবেজ তৈরী করো',
'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'ডাটাবেজ সম্পাদনা',
'Create database' => 'ডাটাবেজ তৈরী',
'SQL command' => 'SQL-কোয়্যারী',
'Dump' => 'এক্সপোর্ট',
'Logout' => 'লগআউট',
'database' => 'ডাটাবেজ',
'Use' => 'ব্যবহার',
'No tables.' => 'কোন টেবিল নাই।',
'select' => 'নির্বাচন',
'Create new table' => 'নতুন টেবিল তৈরী করো',
'Item has been deleted.' => 'বিষয়বস্তু মুছে ফেলা হয়েছে।',
'Item has been updated.' => 'বিষয়বস্তু আপডেট করা হয়েছে।',
'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
@@ -180,6 +177,7 @@ $translations = array(
'Tables have been truncated.' => 'টেবিল ছাঁটাই করা হয়েছে',
'Rows' => 'সারি',
',' => ',',
'0123456789' => '০১২৩৪৫৬৭৮৯',
'Tables have been moved.' => 'টেবিল স্থানান্তর করা হয়েছে।',
'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর করো',
'Move' => 'স্থানান্তর করো',
@@ -188,9 +186,9 @@ $translations = array(
'original' => 'প্রকৃত',
'Tables have been dropped.' => 'টেবিলসমূহ মুছে ফেলা হয়েছে।',
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
'whole result' => 'সম্পূর্ণ ফলাফল',
'Whole result' => 'সম্পূর্ণ ফলাফল',
'Clone' => 'ক্লোন',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s এবং %s বৃদ্ধি করুন।',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
'Partition by' => 'পার্টিশন যার মাধ্যমে',
'Partitions' => 'পার্টিশন',
'Partition name' => 'পার্টিশনের নাম',
@@ -226,7 +224,6 @@ $translations = array(
'Permanent login' => 'স্থায়ী লগইন',
'Databases have been dropped.' => 'ডাটাবেজসমূহ মুছে ফেলা হয়েছে।',
'Search data in tables' => 'টেবিলে খোঁজ করো',
'schema' => 'স্কিমা',
'Schema' => 'স্কিমা',
'Alter schema' => 'স্কিমা পরিবর্তন করো',
'Create schema' => 'স্কিমা তৈরী করো',
@@ -257,7 +254,6 @@ $translations = array(
'Attachments' => 'সংযুক্তি',
'%d query(s) executed OK.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
'Show only errors' => 'শুধুমাত্র ত্রুটি দেখাও',
'Last page' => 'শেষ পাতা',
'Refresh' => 'রিফ্রেশ',
'Invalid schema.' => 'অবৈধ স্কিমা।',
'Please use one of the extensions %s.' => 'কোন একটা এক্সটেনশন %s ব্যবহার করো।',

321
adminer/lang/bs.inc.php Normal file
View File

@@ -0,0 +1,321 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Server',
'Username' => 'Korisničko ime',
'Password' => 'Lozinka',
'Permanent login' => 'Trajna prijava',
'Login' => 'Prijava',
'Logout' => 'Odjava',
'Logged as: %s' => 'Prijavi se kao: %s',
'Logout successful.' => 'Uspešna odjava.',
'Invalid credentials.' => 'Nevažeće dozvole.',
'Language' => 'Jezik',
'Invalid CSRF token. Send the form again.' => 'Nevažeći CSRF kod. Proslijedite ponovo formu.',
'No extension' => 'Bez dodataka',
'None of the supported PHP extensions (%s) are available.' => 'Nijedan od podržanih PHP dodataka nije dostupan.',
'Session support must be enabled.' => 'Morate omogućiti podršku za sesije.',
'Session expired, please login again.' => 'Vaša sesija je istekla, prijavite se ponovo.',
'%s version: %s through PHP extension %s' => '%s verzija: %s pomoću PHP dodatka je %s',
'Refresh' => 'Osveži',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Dozvole',
'Create user' => 'Novi korisnik',
'User has been dropped.' => 'Korisnik je izbrisan.',
'User has been altered.' => 'Korisnik je izmijenjen.',
'User has been created.' => 'korisnik je spašen.',
'Hashed' => 'Heširano',
'Column' => 'kolumna',
'Routine' => 'Rutina',
'Grant' => 'Dozvoli',
'Revoke' => 'Opozovi',
'Process list' => 'Spisak procesa',
'%d process(es) have been killed.' => array('%d proces je ukinut.', '%d procesa su ukinuta.', '%d procesa je ukinuto.'),
'Kill' => 'Ubij',
'Variables' => 'Promijenljive',
'Status' => 'Status',
'SQL command' => 'SQL komanda',
'%d query(s) executed OK.' => array('%d upit je uspiješno izvršen.', '%d upita su uspiješno izvršena.', '%d upita je uspiješno izvršeno.'),
'Query executed OK, %d row(s) affected.' => array('Upit je uspiješno izvršen, %d red je ažuriran.', 'Upit je uspiješno izvršen, %d reda su ažurirana.', 'Upit je uspiješno izvršen, %d redova je ažurirano.'),
'No commands to execute.' => 'Bez komandi za izvršavanje.',
'Error in query' => 'Greška u upitu',
'Execute' => 'Izvrši',
'Stop on error' => 'Zaustavi prilikom greške',
'Show only errors' => 'Prikazuj samo greške',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historijat',
'Clear' => 'Očisti',
'Edit all' => 'Izmijeni sve',
'File upload' => 'Slanje datoteka',
'From server' => 'Sa servera',
'Webserver file %s' => 'Datoteka %s sa veb servera',
'Run file' => 'Pokreni datoteku',
'File does not exist.' => 'Datoteka ne postoji.',
'File uploads are disabled.' => 'Onemogućeno je slanje datoteka.',
'Unable to upload a file.' => 'Slanje datoteke nije uspelo.',
'Maximum allowed file size is %sB.' => 'Najveća dozvoljena veličina datoteke je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliki POST podatak. Morate da smanjite podatak ili povećajte vrijednost konfiguracione direktive %s.',
'Export' => 'Izvoz',
'Output' => 'Ispis',
'open' => 'otvori',
'save' => 'spasi',
'Format' => 'Format',
'Data' => 'Podaci',
'Database' => 'Baza podataka',
'database' => 'baza podataka',
'Use' => 'Koristi',
'Select database' => 'Izaberite bazu',
'Invalid database.' => 'Neispravna baza podataka.',
'Database has been dropped.' => 'Baza podataka je izbrisana.',
'Databases have been dropped.' => 'Baze podataka su izbrisane.',
'Database has been created.' => 'Baza podataka je spašena.',
'Database has been renamed.' => 'Baza podataka je preimenovana.',
'Database has been altered.' => 'Baza podataka je izmijenjena.',
'Alter database' => 'Ažuriraj bazu podataka',
'Create database' => 'Formiraj bazu podataka',
'Database schema' => 'Šema baze podataka',
// link to current database schema layout
'Permanent link' => 'Trajna veza',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Stroj',
'Collation' => 'Sravnjivanje',
'Data Length' => 'Dužina podataka',
'Index Length' => 'Dužina indeksa',
'Data Free' => 'Slobodno podataka',
'Rows' => 'Redova',
'%d in total' => 'ukupno %d',
'Analyze' => 'Analiziraj',
'Optimize' => 'Optimizuj',
'Check' => 'Provjeri',
'Repair' => 'Popravi',
'Truncate' => 'Isprazni',
'Tables have been truncated.' => 'Tabele su ispražnjene.',
'Move to other database' => 'Premijesti u drugu bazu podataka',
'Move' => 'Premijesti',
'Tables have been moved.' => 'Tabele su premješćene.',
'Copy' => 'Umnoži',
'Tables have been copied.' => 'Tabele su umnožene.',
'Routines' => 'Rutine',
'Routine has been called, %d row(s) affected.' => array('Pozvana je rutina, %d red je ažuriran.', 'Pozvana je rutina, %d reda su ažurirani.', 'Pozvana je rutina, %d redova je ažurirano.'),
'Call' => 'Pozovi',
'Parameter name' => 'Naziv parametra',
'Create procedure' => 'Formiraj proceduru',
'Create function' => 'Formiraj funkciju',
'Routine has been dropped.' => 'Rutina je izbrisana.',
'Routine has been altered.' => 'Rutina je izmijenjena.',
'Routine has been created.' => 'Rutina je spašena.',
'Alter function' => 'Ažuriraj funkciju',
'Alter procedure' => 'Ažuriraj proceduru',
'Return type' => 'Povratni tip',
'Events' => 'Događaji',
'Event has been dropped.' => 'Događaj je izbrisan.',
'Event has been altered.' => 'Događaj je izmijenjen.',
'Event has been created.' => 'Događaj je spašen.',
'Alter event' => 'Ažuriraj događaj',
'Create event' => 'Napravi događaj',
'At given time' => 'U zadato vrijeme',
'Every' => 'Svaki',
'Schedule' => 'Raspored',
'Start' => 'Početak',
'End' => 'Kraj',
'On completion preserve' => 'Zadrži po završetku',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele i pogledi',
'Table' => 'Tabela',
'No tables.' => 'Bez tabela.',
'Alter table' => 'Ažuriraj tabelu',
'Create table' => 'Napravi tabelu',
'Table has been dropped.' => 'Tabela je izbrisana.',
'Tables have been dropped.' => 'Tabele su izbrisane.',
'Tables have been optimized.' => 'Tabele su optimizovane.',
'Table has been altered.' => 'Tabela je izmijenjena.',
'Table has been created.' => 'Tabela je spašena.',
'Table name' => 'Naziv tabele',
'Show structure' => 'Prikaži strukturu',
'engine' => 'stroj',
'collation' => 'Sravnjivanje',
'Column name' => 'Naziv kolumne',
'Type' => 'Tip',
'Length' => 'Dužina',
'Auto Increment' => 'Auto-priraštaj',
'Options' => 'Opcije',
'Comment' => 'Komentar',
'Default values' => 'Podrazumijevane vrijednosti',
'Drop' => 'Izbriši',
'Are you sure?' => 'Da li ste sigurni?',
'Move up' => 'Pomijeri na gore',
'Move down' => 'Pomijeri na dole',
'Remove' => 'Ukloni',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Premašen je maksimalni broj dozvoljenih polja. Molim uvećajte %s.',
'Partition by' => 'Podijeli po',
'Partitions' => 'Podijele',
'Partition name' => 'Ime podijele',
'Values' => 'Vrijednosti',
'View' => 'Pogled',
'View has been dropped.' => 'Pogled je izbrisan.',
'View has been altered.' => 'Pogled je izmijenjen.',
'View has been created.' => 'Pogled je spašen.',
'Alter view' => 'Ažuriraj pogled',
'Create view' => 'Napravi pogled',
'Indexes' => 'Indeksi',
'Indexes have been altered.' => 'Indeksi su izmijenjeni.',
'Alter indexes' => 'Ažuriraj indekse',
'Add next' => 'Dodaj slijedeći',
'Index Type' => 'Tip indeksa',
'Column (length)' => 'kolumna (dužina)',
'Foreign keys' => 'Strani ključevi',
'Foreign key' => 'Strani ključ',
'Foreign key has been dropped.' => 'Strani ključ je izbrisan.',
'Foreign key has been altered.' => 'Strani ključ je izmijenjen.',
'Foreign key has been created.' => 'Strani ključ je spašen.',
'Target table' => 'Ciljna tabela',
'Change' => 'izmijeni',
'Source' => 'Izvor',
'Target' => 'Cilj',
'Add column' => 'Dodaj kolumnu',
'Alter' => 'Ažuriraj',
'Add foreign key' => 'Dodaj strani ključ',
'ON DELETE' => 'ON DELETE (prilikom brisanja)',
'ON UPDATE' => 'ON UPDATE (prilikom osvežavanja)',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorne i ciljne kolumne moraju biti istog tipa, ciljna kolumna mora biti indeksirana i izvorna tabela mora sadržati podatke iz ciljne.',
'Triggers' => 'Okidači',
'Add trigger' => 'Dodaj okidač',
'Trigger has been dropped.' => 'Okidač je izbrisan.',
'Trigger has been altered.' => 'Okidač je izmijenjen.',
'Trigger has been created.' => 'Okidač je spašen.',
'Alter trigger' => 'Ažuriraj okidač',
'Create trigger' => 'Formiraj okidač',
'Time' => 'Vrijeme',
'Event' => 'Događaj',
'Name' => 'Ime',
'select' => 'izaberi',
'Select' => 'Izaberi',
'Selected' => 'Izabrano',
'Select data' => 'Izaberi podatke',
'Functions' => 'Funkcije',
'Aggregation' => 'Sakupljanje',
'Search' => 'Pretraga',
'anywhere' => 'bilo gdje',
'Search data in tables' => 'Pretraži podatke u tabelama',
'Sort' => 'Poređaj',
'descending' => 'opadajuće',
'Limit' => 'Granica',
'Text length' => 'Dužina teksta',
'Action' => 'Akcija',
'Full table scan' => 'Skreniranje kompletne tabele',
'Unable to select the table' => 'Ne mogu da izaberem tabelu',
'No rows.' => 'Bez redova.',
'%d row(s)' => array('%d red', '%d reda', '%d redova'),
'Page' => 'Strana',
'last' => 'poslijednja',
'Loading' => 'Učitavam',
'Load more data' => 'Učitavam još podataka',
'Whole result' => 'Ceo rezultat',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajtova'),
'Import' => 'Uvoz',
'%d row(s) have been imported.' => array('%d red je uvežen.', '%d reda su uvežena.', '%d redova je uveženo.'),
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrijednost za izmijenu.',
'Use edit link to modify this value.' => 'Koristi vezu za izmijenu ove vrijednosti.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Stavka %s je spašena.',
'Item has been deleted.' => 'Stavka je izbrisana.',
'Item has been updated.' => 'Stavka je izmijenjena.',
'%d item(s) have been affected.' => array('%d stavka je ažurirana.', '%d stavke su ažurirane.', '%d stavki je ažurirano.'),
'New item' => 'Nova stavka',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'prazno',
'edit' => 'izmijeni',
'Edit' => 'Izmijeni',
'Insert' => 'Umetni',
'Save' => 'Sačuvaj',
'Save and continue edit' => 'Sačuvaj i nastavi uređenje',
'Save and insert next' => 'Sačuvaj i umijetni slijedeće',
'Clone' => 'Dupliraj',
'Delete' => 'Izbriši',
'Modify' => 'Izmjene',
'E-mail' => 'El. pošta',
'From' => 'Od',
'Subject' => 'Naslov',
'Attachments' => 'Prilozi',
'Send' => 'Pošalji',
'%d e-mail(s) have been sent.' => array('%d poruka el. pošte je poslata.', '%d poruke el. pošte su poslate.', '%d poruka el. pošte je poslato.'),
// data type descriptions
'Numbers' => 'Broj',
'Date and time' => 'Datum i vrijeme',
'Strings' => 'Tekst',
'Binary' => 'Binarno',
'Lists' => 'Liste',
'Network' => 'Mreža',
'Geometry' => 'Geometrija',
'Relations' => 'Odnosi',
'Editor' => 'Uređivač',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5.$3.$1.',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'dd.mm.[yyyy].',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'sad',
'yes' => 'da',
'no' => 'ne',
// general SQLite error in create, drop or rename database
'File exists.' => 'Datoteka već postoji.',
'Please use one of the extensions %s.' => 'Molim koristite jedan od nastavaka %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ažuriraj šemu',
'Create schema' => 'Formiraj šemu',
'Schema has been dropped.' => 'Šema je izbrisana.',
'Schema has been created.' => 'Šema je spašena.',
'Schema has been altered.' => 'Šema je izmijenjena.',
'Schema' => 'Šema',
'Invalid schema.' => 'Šema nije ispravna.',
// PostgreSQL sequences support
'Sequences' => 'Nizovi',
'Create sequence' => 'Napravi niz',
'Sequence has been dropped.' => 'Niz je izbrisan.',
'Sequence has been created.' => 'Niz je formiran.',
'Sequence has been altered.' => 'Niz je izmijenjen.',
'Alter sequence' => 'Ažuriraj niz',
// PostgreSQL user types support
'User types' => 'Korisnički tipovi',
'Create type' => 'Definiši tip',
'Type has been dropped.' => 'Tip je izbrisan.',
'Type has been created.' => 'tip je spašen.',
'Alter type' => 'Ažuriraj tip',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Contrasenya',
'Select database' => 'Selecciona base de dades',
'Invalid database.' => 'Base de dades invàlida.',
'Create new database' => 'Crea una nova base de dades',
'Table has been dropped.' => 'S\'ha suprimit la taula.',
'Table has been altered.' => 'S\'ha modificat la taula.',
'Table has been created.' => 'S\'ha creat la taula.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'Modifica la base de dades',
'Create database' => 'Crea una base de dades',
'SQL command' => 'Ordre SQL',
'Dump' => 'Exporta',
'Logout' => 'Desconnecta',
'database' => 'base de dades',
'Use' => 'Utilitza',
'No tables.' => 'No hi ha cap taula.',
'select' => 'registres',
'Create new table' => 'Crea una nova taula',
'Item has been deleted.' => 'S\'ha suprmit l\'element.',
'Item has been updated.' => 'S\'ha actualitzat l\'element.',
'Item%s has been inserted.' => 'S\'ha insertat l\'element%s.',
@@ -180,6 +177,7 @@ $translations = array(
'Tables have been truncated.' => 'S\'han escapçat les taules.',
'Rows' => 'Files',
',' => ',',
'0123456789' => '0123456789',
'Tables have been moved.' => 'S\'han desplaçat les taules.',
'Move to other database' => 'Desplaça a una altra base de dades',
'Move' => 'Desplaça',
@@ -187,7 +185,7 @@ $translations = array(
'Save and continue edit' => 'Desa i segueix editant',
'original' => 'original',
'%d item(s) have been affected.' => array('S\'ha modificat %d element.', 'S\'han modificat %d elements.'),
'whole result' => 'tots els resultats',
'Whole result' => 'Tots els resultats',
'Tables have been dropped.' => 'S\'han suprimit les taules.',
'Clone' => 'Clona',
'Partition by' => 'Fes particions segons',
@@ -199,7 +197,7 @@ $translations = array(
'Show structure' => 'Mostra l\'estructura',
'Select data' => 'Selecciona dades',
'Stop on error' => 'Atura en trobar un error',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'S\'ha assolit el nombre màxim de camps. Incrementa %s i %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'S\'ha assolit el nombre màxim de camps. Incrementa %s.',
'anywhere' => 'a qualsevol lloc',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
@@ -240,7 +238,6 @@ $translations = array(
'Schema has been dropped.' => 'S\'ha suprimit l\'esquema.',
'Schema has been created.' => 'S\'ha creat l\'esquema.',
'Schema has been altered.' => 'S\'ha modificat l\'esquema.',
'schema' => 'esquema',
'Schema' => 'Esquema',
'Sequences' => 'Seqüències',
'Create sequence' => 'Crea una seqüència',
@@ -259,7 +256,6 @@ $translations = array(
'now' => 'ara',
'%d query(s) executed OK.' => array('%d consulta executada correctament.', '%d consultes executades correctament.'),
'Show only errors' => 'Mostra només els errors',
'Last page' => 'Darrera plana',
'Refresh' => 'Refresca',
'Invalid schema.' => 'Esquema invàlid.',
'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.',

View File

@@ -10,13 +10,23 @@ $translations = array(
'Logout' => 'Odhlásit',
'Logged as: %s' => 'Přihlášen jako: %s',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Díky za použití Admineru, <a href="https://www.adminer.org/cs/donation/">přispějte</a> na vývoj.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'There is a space in the input password which might be the cause.' => 'Problém může být, že je v zadaném hesle mezera.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer nepodporuje přístup k databázi bez hesla, <a href="https://www.adminer.org/cs/password/"%s>více informací</a>.',
'Database does not support password.' => 'Databáze nepodporuje heslo.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="https://www.adminer.org/cs/extension/"%s>Implementujte</a> metodu %s, aby platilo stále.',
'Language' => 'Jazyk',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
'If you did not send this request from Adminer then close this page.' => 'Pokud jste tento požadavek neposlali z Adminera, tak tuto stránku zavřete.',
'No extension' => 'Žádné rozšíření',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
'Connecting to privileged ports is not allowed.' => 'Připojování k privilegovaným portům není povoleno.',
'Disable %s or enable %s or %s extensions.' => 'Zakažte %s nebo povolte extenze %s nebo %s.',
'Session support must be enabled.' => 'Session proměnné musí být povolené.',
'Session expired, please login again.' => 'Session vypršela, přihlašte se prosím znovu.',
'The action will be performed after successful login with the same credentials.' => 'Akce bude provedena po úspěšném přihlášení se stejnými přihlašovacími údaji.',
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
'Refresh' => 'Obnovit',
@@ -46,6 +56,9 @@ $translations = array(
'Query executed OK, %d row(s) affected.' => array('Příkaz proběhl v pořádku, byl změněn %d záznam.', 'Příkaz proběhl v pořádku, byly změněny %d záznamy.', 'Příkaz proběhl v pořádku, bylo změněno %d záznamů.'),
'No commands to execute.' => 'Žádné příkazy k vykonání.',
'Error in query' => 'Chyba v dotazu',
'Unknown error.' => 'Neznámá chyba.',
'Warnings' => 'Varování',
'ATTACH queries are not supported.' => 'Dotazy ATTACH nejsou podporované.',
'Execute' => 'Provést',
'Stop on error' => 'Zastavit při chybě',
'Show only errors' => 'Zobrazit pouze chyby',
@@ -64,9 +77,10 @@ $translations = array(
'Unable to upload a file.' => 'Nepodařilo se nahrát soubor.',
'Maximum allowed file size is %sB.' => 'Maximální povolená velikost souboru je %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Příliš velká POST data. Zmenšete data nebo zvyšte hodnotu konfigurační direktivy %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Velký SQL soubor můžete nahrát pomocí FTP a importovat ho ze serveru.',
'You are offline.' => 'Jste offline.',
'Export' => 'Export',
'Dump' => 'Export',
'Output' => 'Výstup',
'open' => 'otevřít',
'save' => 'uložit',
@@ -75,10 +89,10 @@ $translations = array(
'Database' => 'Databáze',
'database' => 'databáze',
'DB' => 'DB',
'Use' => 'Vybrat',
'Select database' => 'Vybrat databázi',
'Invalid database.' => 'Nesprávná databáze.',
'Create new database' => 'Vytvořit novou databázi',
'Database has been dropped.' => 'Databáze byla odstraněna.',
'Databases have been dropped.' => 'Databáze byly odstraněny.',
'Database has been created.' => 'Databáze byla vytvořena.',
@@ -93,6 +107,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Úložiště',
'Collation' => 'Porovnávání',
'Data Length' => 'Velikost dat',
@@ -102,6 +117,7 @@ $translations = array(
'%d in total' => '%d celkem',
'Analyze' => 'Analyzovat',
'Optimize' => 'Optimalizovat',
'Vacuum' => 'Vyčistit',
'Check' => 'Zkontrolovat',
'Repair' => 'Opravit',
'Truncate' => 'Vyprázdnit',
@@ -144,7 +160,6 @@ $translations = array(
'No tables.' => 'Žádné tabulky.',
'Alter table' => 'Pozměnit tabulku',
'Create table' => 'Vytvořit tabulku',
'Create new table' => 'Vytvořit novou tabulku',
'Table has been dropped.' => 'Tabulka byla odstraněna.',
'Tables have been dropped.' => 'Tabulky byly odstraněny.',
'Tables have been optimized.' => 'Tabulky byly optimalizovány.',
@@ -160,13 +175,17 @@ $translations = array(
'Auto Increment' => 'Auto Increment',
'Options' => 'Volby',
'Comment' => 'Komentář',
'Default value' => 'Výchozí hodnota',
'Default values' => 'Výchozí hodnoty',
'Drop' => 'Odstranit',
'Drop %s?' => 'Odstranit %s?',
'Are you sure?' => 'Opravdu?',
'Size' => 'Velikost',
'Compute' => 'Spočítat',
'Move up' => 'Přesunout nahoru',
'Move down' => 'Přesunout dolů',
'Remove' => 'Odebrat',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s a %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Byl překročen maximální povolený počet polí. Zvyšte prosím %s.',
'Partition by' => 'Rozdělit podle',
'Partitions' => 'Oddíly',
@@ -174,6 +193,7 @@ $translations = array(
'Values' => 'Hodnoty',
'View' => 'Pohled',
'Materialized view' => 'Materializovaný pohled',
'View has been dropped.' => 'Pohled byl odstraněn.',
'View has been altered.' => 'Pohled byl změněn.',
'View has been created.' => 'Pohled byl vytvořen.',
@@ -225,24 +245,27 @@ $translations = array(
'Sort' => 'Seřadit',
'descending' => 'sestupně',
'Limit' => 'Limit',
'Limit rows' => 'Limit řádek',
'Text length' => 'Délka textů',
'Action' => 'Akce',
'Full table scan' => 'Průchod celé tabulky',
'Unable to select the table' => 'Nepodařilo se vypsat tabulku',
'No rows.' => 'Žádné řádky.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
'Page' => 'Stránka',
'last' => 'poslední',
'Last page' => 'Poslední stránka',
'Load more data' => 'Nahrát další data',
'Loading' => 'Nahrává se',
'whole result' => 'celý výsledek',
'Whole result' => 'Celý výsledek',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtů'),
'Import' => 'Import',
'%d row(s) have been imported.' => array('Byl importován %d záznam.', 'Byly importovány %d záznamy.', 'Bylo importováno %d záznamů.'),
'File must be in UTF-8 encoding.' => 'Soubor musí být v kódování UTF-8.',
// in-place editing in select
'Modify' => 'Změnit',
'Ctrl+click on a value to modify it.' => 'Ctrl+klikněte na políčko, které chcete změnit.',
'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
@@ -259,8 +282,10 @@ $translations = array(
'Edit' => 'Upravit',
'Insert' => 'Vložit',
'Save' => 'Uložit',
'Saving' => 'Ukládá se',
'Save and continue edit' => 'Uložit a pokračovat v editaci',
'Save and insert next' => 'Uložit a vložit další',
'Selected' => 'Označené',
'Clone' => 'Klonovat',
'Delete' => 'Smazat',
'You have no privileges to update this table.' => 'Nemáte oprávnění editovat tuto tabulku.',
@@ -303,7 +328,6 @@ $translations = array(
'Schema has been dropped.' => 'Schéma bylo odstraněno.',
'Schema has been created.' => 'Schéma bylo vytvořeno.',
'Schema has been altered.' => 'Schéma bylo změněno.',
'schema' => 'schéma',
'Schema' => 'Schéma',
'Invalid schema.' => 'Nesprávné schéma.',

282
adminer/lang/da.inc.php Normal file
View File

@@ -0,0 +1,282 @@
<?php
$translations = array(
'System' => 'System',
'Server' => 'Server',
'Username' => 'Brugernavn',
'Password' => 'Kodeord',
'Permanent login' => 'Permanent login',
'Login' => 'Log ind',
'Logout' => 'Log ud',
'Logged as: %s' => 'Logget ind som: %s',
'Logout successful.' => 'Log af vellykket.',
'Invalid credentials.' => 'Ugyldige log ind oplysninger.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-kodeordet er udløbet. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for at gøre det permanent.',
'Language' => 'Sprog',
'Invalid CSRF token. Send the form again.' => 'Ugyldigt CSRF-token - Genindsend formen.',
'No extension' => 'Ingen udvidelse',
'None of the supported PHP extensions (%s) are available.' => 'Ingen af de understøttede PHP-udvidelser (%s) er tilgængelige.',
'Session support must be enabled.' => 'Session support skal være slået til.',
'Session expired, please login again.' => 'Sessionen er udløbet - Log venligst ind igen.',
'%s version: %s through PHP extension %s' => '%s version: %s via PHP-udvidelse %s',
'Refresh' => 'Genindlæs',
'ltr' => 'ltr',
'Privileges' => 'Privilegier',
'Create user' => 'Opret bruger',
'User has been dropped.' => 'Brugeren slettet.',
'User has been altered.' => 'Brugeren ændret.',
'User has been created.' => 'Brugeren oprettet.',
'Hashed' => 'Hashet',
'Column' => 'Kolonne',
'Routine' => 'Rutine',
'Grant' => 'Giv privilegier',
'Revoke' => 'Træk tilbage',
'Process list' => 'Procesliste',
'%d process(es) have been killed.' => array('%d proces afsluttet.', '%d processer afsluttet.'),
'Kill' => 'Afslut',
'Variables' => 'Variabler',
'Status' => 'Status',
'SQL command' => 'SQL-kommando',
'%d query(s) executed OK.' => array('%d kald udført OK.', '%d kald udført OK.'),
'Query executed OK, %d row(s) affected.' => array('Kald udført OK, %d række påvirket.', 'Kald udført OK, %d rækker påvirket.'),
'No commands to execute.' => 'Ingen kommandoer at udføre.',
'Error in query' => 'Fejl i forespørgelse',
'Execute' => 'Kør',
'Stop on error' => 'Stop ved fejl',
'Show only errors' => 'Vis kun fejl',
'%.3f s' => '%.3f s',
'History' => 'Historik',
'Clear' => 'Tøm',
'Edit all' => 'Rediger alle',
'File upload' => 'Fil upload',
'From server' => 'Fra server',
'Webserver file %s' => 'Webserver-fil %s',
'Run file' => 'Kør fil',
'File does not exist.' => 'Filen eksisterer ikke.',
'File uploads are disabled.' => 'Fil upload er slået fra.',
'Unable to upload a file.' => 'Kunne ikke uploade fil.',
'Maximum allowed file size is %sB.' => 'Maksimum tilladte filstørrelse er %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Maks POST data er overskredet. Reducer mængden af data eller øg størrelsen i %s-konfigurationen.',
'You can upload a big SQL file via FTP and import it from server.' => 'Du kan uploade en stor SQL-fil via FTP og importere den fra serveren.',
'Export' => 'Eksport',
'Output' => 'Resultat',
'open' => 'Åben',
'save' => 'Gem',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Database',
'database' => 'database',
'Use' => 'Brug',
'Select database' => 'Vælg database',
'Invalid database.' => 'Ugyldig database.',
'Database has been dropped.' => 'Databasen er blevet slettet.',
'Databases have been dropped.' => 'Databasene er blevet slettet.',
'Database has been created.' => 'Databasen er oprettet.',
'Database has been renamed.' => 'Databasen har fået nyt navn.',
'Database has been altered.' => 'Databasen er ændret.',
'Alter database' => 'Ændre database',
'Create database' => 'Opret database',
'Database schema' => 'Databaseskema',
'Permanent link' => 'Permanent link',
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Tekstsortering',
'Data Length' => 'Datalængde',
'Index Length' => 'Indekslængde',
'Data Free' => 'Fri data',
'Rows' => 'Rader',
'%d in total' => '%d total',
'Analyze' => 'Analyser',
'Optimize' => 'Optimaliser',
'Vacuum' => 'Støvsug',
'Check' => 'Tjek',
'Repair' => 'Reparer',
'Truncate' => 'Afkort',
'Tables have been truncated.' => 'Tabellerne er blevet afkortet.',
'Move to other database' => 'Flyt til anden database',
'Move' => 'Flyt',
'Tables have been moved.' => 'Tabellerne er blevet flyttet.',
'Copy' => 'Kopier',
'Tables have been copied.' => 'Tabellerne er blevet kopiert.',
'Routines' => 'Rutiner',
'Routine has been called, %d row(s) affected.' => array('Rutinen er udført, %d række påvirket.', 'Rutinen er udført, %d rækker påvirket.'),
'Call' => 'Kald',
'Parameter name' => 'Parameternavn',
'Create procedure' => 'Opret procedure',
'Create function' => 'Opret funktion',
'Routine has been dropped.' => 'Rutinen er slettet.',
'Routine has been altered.' => 'Rutinen er ændret.',
'Routine has been created.' => 'Rutinen er oprettet.',
'Alter function' => 'Ændre funktion',
'Alter procedure' => 'Ændre procedure',
'Return type' => 'Returtype',
'Events' => 'Hændelser',
'Event has been dropped.' => 'Hændelsen er slettet.',
'Event has been altered.' => 'Hændelsen er ændret.',
'Event has been created.' => 'Hændelsen er oprettet.',
'Alter event' => 'Ændre hændelse',
'Create event' => 'Opret hændelse',
'At given time' => 'På givne tid',
'Every' => 'Hver',
'Schedule' => 'Tidsplan',
'Start' => 'Start',
'End' => 'Slut',
'On completion preserve' => 'Ved fuldførelse bevar',
'Tables' => 'Tabeller',
'Tables and views' => 'Tabeller og views',
'Table' => 'Tabel',
'No tables.' => 'Ingen tabeller.',
'Alter table' => 'Ændre tabel',
'Create table' => 'Opret tabel',
'Table has been dropped.' => 'Tabellen er slettet.',
'Tables have been dropped.' => 'Tabellerne er slettet.',
'Tables have been optimized.' => 'Tabellerne er blevet optimaliseret.',
'Table has been altered.' => 'Tabellen er ændret.',
'Table has been created.' => 'Tabellen er oprettet.',
'Table name' => 'Tabelnavn',
'Show structure' => 'Vis struktur',
'engine' => 'motor',
'collation' => 'sortering',
'Column name' => 'Kolonnenavn',
'Type' => 'Type',
'Length' => 'Længde',
'Auto Increment' => 'Auto Increment',
'Options' => 'Valg',
'Comment' => 'Kommentarer',
'Default values' => 'Standardværdier',
'Drop' => 'Drop',
'Are you sure?' => 'Er du sikker?',
'Move up' => 'Flyt op',
'Move down' => 'Flyt ned',
'Remove' => 'Fjern',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antal feltnavne overskredet - øg venligst %s.',
'Partition by' => 'Partition ved',
'Partitions' => 'Partitioner',
'Partition name' => 'Partitionsnavn',
'Values' => 'Værdier',
'View' => 'View',
'View has been dropped.' => 'Viewet er slettet.',
'View has been altered.' => 'Viewet er ændret.',
'View has been created.' => 'Viewet er oprettet.',
'Alter view' => 'Ændre view',
'Create view' => 'Nyt view',
'Indexes' => 'Indekser',
'Indexes have been altered.' => 'Indekserne er ændret.',
'Alter indexes' => 'Ændre indekser',
'Add next' => 'Læg til næste',
'Index Type' => 'Indekstype',
'Column (length)' => 'Kolonne (længde)',
'Foreign keys' => 'Fremmednøgler',
'Foreign key' => 'Fremmednøgle',
'Foreign key has been dropped.' => 'Fremmednøglen er slettet.',
'Foreign key has been altered.' => 'Fremmednøglen er ændret.',
'Foreign key has been created.' => 'Fremmednøglen er oprettet.',
'Target table' => 'Måltabel',
'Change' => 'Ændre',
'Source' => 'Kilde',
'Target' => 'Mål',
'Add column' => 'Tilføj kolonne',
'Alter' => 'Ændre',
'Add foreign key' => 'Tilføj fremmednøgle',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kilde- og målkolonner skal have samme datatype, der skal være en indeks på mål-kolonnen, og data som refereres til skal eksistere.',
'Triggers' => 'Triggere',
'Add trigger' => 'Tilføj trigger',
'Trigger has been dropped.' => 'Triggeren er slettet.',
'Trigger has been altered.' => 'Triggeren er ændret.',
'Trigger has been created.' => 'Triggeren er oprettet.',
'Alter trigger' => 'Ændre trigger',
'Create trigger' => 'Opret trigger',
'Time' => 'Tid',
'Event' => 'Hændelse',
'Name' => 'Navn',
'select' => 'Vis',
'Select' => 'Vælg',
'Select data' => 'Vælg data',
'Functions' => 'Funktioner',
'Aggregation' => 'Sammenfatning',
'Search' => 'Søg',
'anywhere' => 'hvorsomhelst',
'Search data in tables' => 'Søg data i tabeller',
'Sort' => 'Sorter',
'descending' => 'faldende',
'Limit' => 'Limit',
'Text length' => 'Tekstlængde',
'Action' => 'Handling',
'Full table scan' => 'Fuld tabel-scan',
'Unable to select the table' => 'Kan ikke vælge tabellen',
'No rows.' => 'Ingen rækker.',
'%d row(s)' => array('%d række', '%d rækker'),
'Page' => 'Side',
'last' => 'sidste',
'Load more data' => 'Indlæs mere data',
'Loading' => 'Indlæser',
'Whole result' => 'Hele resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importer',
'%d row(s) have been imported.' => array('%d række er importeret.', '%d rækker er importeret.'),
'File must be in UTF-8 encoding.' => 'Filen skal være i UTF8-tegnkoding.',
'Modify' => 'Ændre',
'Ctrl+click on a value to modify it.' => 'Ctrl+klik på en værdi for at ændre den.',
'Use edit link to modify this value.' => 'Brug rediger-link for at ændre dennne værdi.',
'Item%s has been inserted.' => 'Emne%s er sat ind.',
'Item has been deleted.' => 'Emnet er slettet.',
'Item has been updated.' => 'Emnet er opdateret.',
'%d item(s) have been affected.' => array('%d emne påvirket.', '%d emner påvirket.'),
'New item' => 'Nyt emne',
'original' => 'original',
'empty' => 'tom',
'edit' => 'rediger',
'Edit' => 'Rediger',
'Insert' => 'Indsæt',
'Save' => 'Gem',
'Save and continue edit' => 'Gem og fortsæt redigering',
'Save and insert next' => 'Gem og indsæt næste',
'Selected' => 'Valgt',
'Clone' => 'Klon',
'Delete' => 'Slet',
'You have no privileges to update this table.' => 'Du mangler rettigheder til at ændre denne tabellen.',
'E-mail' => 'E-mail',
'From' => 'Fra',
'Subject' => 'Titel',
'Attachments' => 'Vedhæft',
'Send' => 'Send',
'%d e-mail(s) have been sent.' => array('%d email sendt.', '%d emails sendt.'),
'Numbers' => 'Nummer',
'Date and time' => 'Dato og tid',
'Strings' => 'Strenge',
'Binary' => 'Binær',
'Lists' => 'Lister',
'Network' => 'Netværk',
'Geometry' => 'Geometri',
'Relations' => 'Relationer',
'Editor' => 'Redigering',
'$1-$3-$5' => '$6/$4 $1',
'[yyyy]-mm-dd' => 'd/m [åååå]',
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nu',
'yes' => 'ja',
'no' => 'nej',
'File exists.' => 'Filen findes.',
'Please use one of the extensions %s.' => 'Brug venligst en af filendelserne %s.',
'Alter schema' => 'Ændre skema',
'Create schema' => 'Opret skema',
'Schema has been dropped.' => 'Skemaet er slettet.',
'Schema has been created.' => 'Skemaet er oprettet.',
'Schema has been altered.' => 'Skemaet er ændret.',
'Schema' => 'Skema',
'Invalid schema.' => 'Ugyldigt skema.',
'Sequences' => 'Sekvenser',
'Create sequence' => 'Opret sekvens',
'Sequence has been dropped.' => 'Sekvensen er slettet.',
'Sequence has been created.' => 'Sekvensen er oprettet.',
'Sequence has been altered.' => 'Sekvensen er ændret.',
'Alter sequence' => 'Ændre sekvens',
'User types' => 'Brugertyper',
'Create type' => 'Opret type',
'Type has been dropped.' => 'Typen er slettet.',
'Type has been created.' => 'Typen er oprettet.',
'Alter type' => 'Ændre type',
'Saving' => 'Gemmer',
);

View File

@@ -8,14 +8,13 @@ $translations = array(
'Password' => 'Passwort',
'Select database' => 'Datenbank auswählen',
'Invalid database.' => 'Datenbank ungültig.',
'Create new database' => 'Neue Datenbank',
'Table has been dropped.' => 'Tabelle entfernt.',
'Table has been altered.' => 'Tabelle geändert.',
'Table has been created.' => 'Tabelle erstellt.',
'Table has been dropped.' => 'Tabelle wurde entfernt.',
'Table has been altered.' => 'Tabelle wurde geändert.',
'Table has been created.' => 'Tabelle wurde erstellt.',
'Alter table' => 'Tabelle ändern',
'Create table' => 'Neue Tabelle erstellen',
'Create table' => 'Tabelle erstellen',
'Table name' => 'Name der Tabelle',
'engine' => 'Motor',
'engine' => 'Speicher-Engine',
'collation' => 'Kollation',
'Column name' => 'Spaltenname',
'Type' => 'Typ',
@@ -24,29 +23,27 @@ $translations = array(
'Options' => 'Optionen',
'Save' => 'Speichern',
'Drop' => 'Entfernen',
'Database has been dropped.' => 'Datenbank entfernt.',
'Database has been created.' => 'Datenbank erstellt.',
'Database has been renamed.' => 'Datenbank umbenannt.',
'Database has been altered.' => 'Datenbank geändert.',
'Database has been dropped.' => 'Datenbank wurde entfernt.',
'Database has been created.' => 'Datenbank wurde erstellt.',
'Database has been renamed.' => 'Datenbank wurde umbenannt.',
'Database has been altered.' => 'Datenbank wurde geändert.',
'Alter database' => 'Datenbank ändern',
'Create database' => 'Neue Datenbank',
'SQL command' => 'SQL-Query',
'Dump' => 'Export',
'Create database' => 'Datenbank erstellen',
'SQL command' => 'SQL-Kommando',
'Logout' => 'Abmelden',
'database' => 'Datenbank',
'Use' => 'Benutzung',
'No tables.' => 'Keine Tabellen.',
'select' => 'zeigen',
'Create new table' => 'Neue Tabelle',
'Item has been deleted.' => 'Datensatz gelöscht.',
'Item has been updated.' => 'Datensatz geändert.',
'Item%s has been inserted.' => 'Datensatz%s hinzugefügt.',
'Edit' => 'Ändern',
'Insert' => 'Hinzufügen',
'Save and insert next' => 'Speichern und nächsten hinzufügen',
'Item has been deleted.' => 'Datensatz wurde gelöscht.',
'Item has been updated.' => 'Datensatz wurde geändert.',
'Item%s has been inserted.' => 'Datensatz%s wurde eingefügt.',
'Edit' => 'Bearbeiten',
'Insert' => 'Einfügen',
'Save and insert next' => 'Speichern und nächsten einfügen',
'Delete' => 'Entfernen',
'Database' => 'Datenbank',
'Routines' => 'Prozeduren',
'Routines' => 'Routinen',
'Indexes have been altered.' => 'Indizes geändert.',
'Indexes' => 'Indizes',
'Alter indexes' => 'Indizes ändern',
@@ -58,9 +55,9 @@ $translations = array(
'Sort' => 'Ordnen',
'descending' => 'absteigend',
'Limit' => 'Begrenzung',
'No rows.' => 'Keine Daten.',
'No rows.' => 'Keine Datensätze.',
'Action' => 'Aktion',
'edit' => 'ändern',
'edit' => 'bearbeiten',
'Page' => 'Seite',
'Query executed OK, %d row(s) affected.' => array('Abfrage ausgeführt, %d Datensatz betroffen.', 'Abfrage ausgeführt, %d Datensätze betroffen.'),
'Error in query' => 'Fehler in der SQL-Abfrage',
@@ -78,16 +75,16 @@ $translations = array(
'Unable to upload a file.' => 'Hochladen von Datei fehlgeschlagen.',
'File upload' => 'Datei importieren',
'File uploads are disabled.' => 'Importieren von Dateien abgeschaltet.',
'Routine has been called, %d row(s) affected.' => array('Kommando SQL ausgeführt, %d Datensatz betroffen.', 'Kommando SQL ausgeführt, %d Datensätze betroffen.'),
'Routine has been called, %d row(s) affected.' => array('Routine wurde ausgeführt, %d Datensatz betroffen.', 'Routine wurde ausgeführt, %d Datensätze betroffen.'),
'Call' => 'Aufrufen',
'No extension' => 'Keine Erweiterungen installiert',
'None of the supported PHP extensions (%s) are available.' => 'Keine der unterstützten PHP-Erweiterungen (%s) ist vorhanden.',
'Session support must be enabled.' => 'Sitzungen müssen aktiviert sein.',
'Session support must be enabled.' => 'Unterstüzung für PHP-Sessions muss aktiviert sein.',
'Session expired, please login again.' => 'Sitzungsdauer abgelaufen, bitte erneut anmelden.',
'Text length' => 'Textlänge',
'Foreign key has been dropped.' => 'Fremdschlüssel entfernt.',
'Foreign key has been altered.' => 'Fremdschlüssel geändert.',
'Foreign key has been created.' => 'Fremdschlüssel erstellt.',
'Foreign key has been dropped.' => 'Fremdschlüssel wurde entfernt.',
'Foreign key has been altered.' => 'Fremdschlüssel wurde geändert.',
'Foreign key has been created.' => 'Fremdschlüssel wurde erstellt.',
'Foreign key' => 'Fremdschlüssel',
'Target table' => 'Zieltabelle',
'Change' => 'Ändern',
@@ -100,53 +97,53 @@ $translations = array(
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Index-Typ',
'Column (length)' => 'Spalte (Länge)',
'View has been dropped.' => 'View entfernt.',
'View has been altered.' => 'View geändert.',
'View has been created.' => 'View erstellt.',
'View has been dropped.' => 'View wurde entfernt.',
'View has been altered.' => 'View wurde geändert.',
'View has been created.' => 'View wurde erstellt.',
'Alter view' => 'View ändern',
'Create view' => 'Neue View erstellen',
'Create view' => 'View erstellen',
'Name' => 'Name',
'Process list' => 'Prozessliste',
'%d process(es) have been killed.' => array('%d Prozess gestoppt.', '%d Prozesse gestoppt.'),
'Kill' => 'Anhalten',
'Parameter name' => 'Name des Parameters',
'Database schema' => 'Datenbankschema',
'Create procedure' => 'Neue Prozedur',
'Create function' => 'Neue Funktion',
'Routine has been dropped.' => 'Prozedur entfernt.',
'Routine has been altered.' => 'Prozedur geändert.',
'Routine has been created.' => 'Prozedur erstellt.',
'Create procedure' => 'Prozedur erstellen',
'Create function' => 'Funktion erstellen',
'Routine has been dropped.' => 'Routine wurde entfernt.',
'Routine has been altered.' => 'Routine wurde geändert.',
'Routine has been created.' => 'Routine wurde erstellt.',
'Alter function' => 'Funktion ändern',
'Alter procedure' => 'Prozedur ändern',
'Return type' => 'Typ des Rückgabewertes',
'Add trigger' => 'Trigger hinzufügen',
'Trigger has been dropped.' => 'Trigger entfernt.',
'Trigger has been altered.' => 'Trigger geändert.',
'Trigger has been created.' => 'Trigger erstellt.',
'Trigger has been dropped.' => 'Trigger wurde entfernt.',
'Trigger has been altered.' => 'Trigger wurde geändert.',
'Trigger has been created.' => 'Trigger wurde erstellt.',
'Alter trigger' => 'Trigger ändern',
'Create trigger' => 'Trigger hinzufügen',
'Create trigger' => 'Trigger erstellen',
'Time' => 'Zeitpunkt',
'Event' => 'Ereignis',
'%s version: %s through PHP extension %s' => 'Version %s: %s, mit PHP-Erweiterung %s',
'%s version: %s through PHP extension %s' => 'Version %s: %s mit PHP-Erweiterung %s',
'%d row(s)' => array('%d Datensatz', '%d Datensätze'),
'Remove' => 'Entfernen',
'Are you sure?' => 'Sind Sie sicher ?',
'Are you sure?' => 'Sind Sie sicher?',
'Privileges' => 'Rechte',
'Create user' => 'Neuer Benutzer',
'User has been dropped.' => 'Benutzer entfernt.',
'User has been altered.' => 'Benutzer geändert.',
'User has been created.' => 'Benutzer erstellt.',
'Create user' => 'Benutzer erstellen',
'User has been dropped.' => 'Benutzer wurde entfernt.',
'User has been altered.' => 'Benutzer wurde geändert.',
'User has been created.' => 'Benutzer wurde erstellt.',
'Hashed' => 'Hashed',
'Column' => 'Spalte',
'Routine' => 'Rutine',
'Routine' => 'Routine',
'Grant' => 'Erlauben',
'Revoke' => 'Verbieten',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data zu gross. Reduzieren Sie die Grösse oder vergrössern Sie den Wert %s in der Konfiguration.',
'Revoke' => 'Widerrufen',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-Daten sind zu groß. Reduzieren Sie die Größe oder vergrößern Sie den Wert %s in der Konfiguration.',
'Logged as: %s' => 'Angemeldet als: %s',
'Move up' => 'Nach oben',
'Move down' => 'Nach unten',
'Functions' => 'Funktionen',
'Aggregation' => 'Agregationen',
'Aggregation' => 'Aggregationen',
'Export' => 'Exportieren',
'Output' => 'Ergebnis',
'open' => 'anzeigen',
@@ -154,9 +151,9 @@ $translations = array(
'Format' => 'Format',
'Tables' => 'Tabellen',
'Data' => 'Daten',
'Event has been dropped.' => 'Ereignis entfernt.',
'Event has been altered.' => 'Ereignis geändert.',
'Event has been created.' => 'Ereignis erstellt.',
'Event has been dropped.' => 'Ereignis wurde entfernt.',
'Event has been altered.' => 'Ereignis wurde geändert.',
'Event has been created.' => 'Ereignis wurde erstellt.',
'Alter event' => 'Ereignis ändern',
'Create event' => 'Ereignis erstellen',
'At given time' => 'Zur angegebenen Zeit',
@@ -168,34 +165,35 @@ $translations = array(
'Status' => 'Status',
'On completion preserve' => 'Nach der Ausführung erhalten',
'Tables and views' => 'Tabellen und Views',
'Data Length' => 'Datengrösse',
'Index Length' => 'Indexgrösse',
'Data Length' => 'Datengröße',
'Index Length' => 'Indexgröße',
'Data Free' => 'Freier Bereich',
'Collation' => 'Collation',
'Collation' => 'Kollation',
'Analyze' => 'Analysieren',
'Optimize' => 'Optimieren',
'Check' => 'Prüfen',
'Repair' => 'Reparieren',
'Truncate' => 'Entleeren (truncate)',
'Tables have been truncated.' => 'Tabellen sind entleert worden (truncate).',
'Truncate' => 'Leeren (truncate)',
'Tables have been truncated.' => 'Tabellen wurden geleert (truncate).',
'Rows' => 'Datensätze',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Tabellen verschoben.',
'Move to other database' => 'In andere Datenbank verschieben',
'Move' => 'Verschieben',
'Engine' => 'Motor',
'Engine' => 'Speicher-Engine',
'Save and continue edit' => 'Speichern und weiter bearbeiten',
'original' => 'Original',
'Tables have been dropped.' => 'Tabellen wurden entfernt (drop).',
'%d item(s) have been affected.' => '%d Artikel betroffen.',
'whole result' => 'Gesamtergebnis',
'Whole result' => 'Gesamtergebnis',
'Clone' => 'Klonen',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s und %s erhöhen.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Die maximal erlaubte Anzahl der Felder ist überschritten. Bitte %s erhöhen.',
'Partition by' => 'Partitionieren um',
'Partitions' => 'Partitionen',
'Partition name' => 'Name der Partition',
'Values' => 'Werte',
'%d row(s) have been imported.' => array('%d Datensatz importiert.', '%d Datensätze wurden importiert.'),
'%d row(s) have been imported.' => array('%d Datensatz wurde importiert.', '%d Datensätze wurden importiert.'),
'anywhere' => 'beliebig',
'Import' => 'Importieren',
'Stop on error' => 'Bei Fehler anhalten',
@@ -204,50 +202,49 @@ $translations = array(
'[yyyy]-mm-dd' => 't.m.[jjjj]',
'History' => 'History',
'Variables' => 'Variablen',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Spalten des Ursprungs und des Zieles müssen vom gleichen Datentyp sein, es muss unter den Zielspalten ein Index existieren und die referenzierten Daten müssen existieren.',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Quell- und Zielspalten müssen vom gleichen Datentyp sein, es muss unter den Zielspalten ein Index existieren und die referenzierten Daten müssen existieren.',
'Relations' => 'Relationen',
'Run file' => 'Datei ausführen',
'Clear' => 'Entleeren',
'Maximum allowed file size is %sB.' => 'Maximal erlaubte Dateigrösse ist %sB.',
'Clear' => 'Löschen',
'Maximum allowed file size is %sB.' => 'Maximal erlaubte Dateigröße ist %sB.',
'Numbers' => 'Zahlen',
'Date and time' => 'Datum oder Zeit',
'Date and time' => 'Datum und Zeit',
'Strings' => 'Zeichenketten',
'Binary' => 'Binär',
'Lists' => 'Listen',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'E-mail' => 'E-Mail',
'From' => 'Von',
'Subject' => 'Betreff',
'Send' => 'Abschicken',
'%d e-mail(s) have been sent.' => array('%d e-mail abgeschickt.', '%d e-mails abgeschickt.'),
'%d e-mail(s) have been sent.' => array('%d E-Mail abgeschickt.', '%d E-Mails abgeschickt.'),
'Webserver file %s' => 'Webserver Datei %s',
'File does not exist.' => 'Datei existiert nicht.',
'%d in total' => '%d insgesamt',
'Permanent login' => 'Passwort speichern',
'Databases have been dropped.' => 'Datenbanken entfernt.',
'Databases have been dropped.' => 'Datenbanken wurden entfernt.',
'Search data in tables' => 'Suche in Tabellen',
'schema' => 'Schema',
'Schema' => 'Schema',
'Alter schema' => 'Schema ändern',
'Create schema' => 'Neues Schema',
'Create schema' => 'Schema erstellen',
'Schema has been dropped.' => 'Schema wurde gelöscht.',
'Schema has been created.' => 'Neues Schema erstellt.',
'Schema has been altered.' => 'Schema geändert.',
'Sequences' => 'Sequenz',
'Create sequence' => 'Neue Sequenz',
'Schema has been created.' => 'Schema wurde erstellt.',
'Schema has been altered.' => 'Schema wurde geändert.',
'Sequences' => 'Sequenzen',
'Create sequence' => 'Sequenz erstellen',
'Alter sequence' => 'Sequenz ändern',
'Sequence has been dropped.' => 'Sequenz gelöscht.',
'Sequence has been created.' => 'Neue Sequenz erstellt.',
'Sequence has been altered.' => 'Sequenz geändert.',
'User types' => 'Benutzer-definierte Typen',
'Sequence has been dropped.' => 'Sequenz wurde gelöscht.',
'Sequence has been created.' => 'Sequenz wurde erstellt.',
'Sequence has been altered.' => 'Sequenz wurde geändert.',
'User types' => 'Benutzerdefinierte Typen',
'Create type' => 'Typ erstellen',
'Alter type' => 'Typ ändern',
'Type has been dropped.' => 'Typ gelöscht.',
'Type has been created.' => 'Typ erstellt.',
'Ctrl+click on a value to modify it.' => 'Ctrl+klick zum Bearbeiten des Wertes.',
'Use edit link to modify this value.' => 'Benutzen Sie den Link zum editieren dieses Wertes.',
'Type has been dropped.' => 'Typ wurde gelöscht.',
'Type has been created.' => 'Typ wurde erstellt.',
'Ctrl+click on a value to modify it.' => 'Ctrl+Klick zum Bearbeiten des Wertes.',
'Use edit link to modify this value.' => 'Benutzen Sie den Link zum Bearbeiten dieses Wertes.',
'last' => 'letzte',
'From server' => 'Im Server',
'From server' => 'Vom Server',
'System' => 'Datenbank System',
'Select data' => 'Daten auswählen',
'Show structure' => 'Struktur anzeigen',
@@ -256,9 +253,8 @@ $translations = array(
'Geometry' => 'Geometrie',
'File exists.' => 'Datei existiert schon.',
'Attachments' => 'Anhänge',
'%d query(s) executed OK.' => array('SQL-Query erfolgreich ausgeführt.', '%d SQL-Queries erfolgreich ausgeführt.'),
'%d query(s) executed OK.' => array('SQL-Abfrage erfolgreich ausgeführt.', '%d SQL-Abfragen erfolgreich ausgeführt.'),
'Show only errors' => 'Nur Fehler anzeigen',
'Last page' => 'Letzte Seite',
'Refresh' => 'Aktualisieren',
'Invalid schema.' => 'Schema nicht gültig.',
'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.',
@@ -267,6 +263,26 @@ $translations = array(
'Tables have been copied.' => 'Tabellen wurden kopiert.',
'Copy' => 'Kopieren',
'Permanent link' => 'Dauerhafter Link',
'Edit all' => 'Alle ändern',
'Edit all' => 'Alle bearbeiten',
'HH:MM:SS' => 'HH:MM:SS',
'Compute' => 'kalkulieren',
'Size' => 'Größe',
'Modify' => 'Ändern',
'Selected' => 'Ausgewählte',
'Default value' => 'Vorgabewert festlegen',
'Limit rows' => 'Datensätze begrenzen',
'Tables have been optimized.' => 'Tabellen wurden optimiert.',
'File must be in UTF-8 encoding.' => 'Die Datei muss UTF-8 kodiert sein.',
'Loading' => 'Lade',
'Load more data' => 'Mehr Daten laden',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minute noch einmal.', 'Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minuten noch einmal.'),
'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
'You are offline.' => 'Sie sind offline.',
'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.' ,
'Saving' => 'Speichere',
'yes' => 'ja',
'no' => 'nein',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Das Master-Passwort ist abgelaufen. <a href="https://www.adminer.org/de/extension/"%s>Implementieren</a> Sie die %s Methode, um es permanent zu machen.',
'%d / ' => '%d / ',
);

336
adminer/lang/el.inc.php Normal file
View File

@@ -0,0 +1,336 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Σύστημα',
'Server' => 'Διακομιστής',
'Username' => 'Όνομα Χρήστη',
'Password' => 'Κωδικός',
'Permanent login' => 'Μόνιμη Σύνδεση',
'Login' => 'Σύνδεση',
'Logout' => 'Αποσύνδεση',
'Logged as: %s' => 'Συνδεθήκατε ως %s',
'Logout successful.' => 'Αποσυνδεθήκατε με επιτυχία.',
'Invalid credentials.' => 'Εσφαλμένα Διαπιστευτήρια.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Επανηλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτό.', 'Επανηλημμένες ανεπιτυχείς προσπάθειες σύνδεσης, δοκιμάστε ξανά σε %s λεπτά.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Έλειξε ο Κύριος Κωδικός. <a href="https://www.adminer.org/en/extension/"%s>Ενεργοποιήστε</a> τη μέθοδο %s για να τον κάνετε μόνιμο.',
'Language' => 'Γλώσσα',
'Invalid CSRF token. Send the form again.' => 'Άκυρο κουπόνι CSRF. Στείλτε τη φόρμα ξανά.',
'If you did not send this request from Adminer then close this page.' => 'Αν δε στείλατε αυτό το αίτημα από το Adminer, τότε κλείστε αυτή τη σελίδα.',
'No extension' => 'Χωρίς Επεκτάσεις',
'None of the supported PHP extensions (%s) are available.' => 'Καμία από τις υποστηριζόμενες επεκτάσεις PHP (%s) δεν είναι διαθέσιμη.',
'Session support must be enabled.' => 'Πρέπει να είναι ενεργοποιημένη η υποστήριξη συνεδριών.',
'Session expired, please login again.' => 'Η συνεδρία έληξε, παρακαλώ συνδεθείτε ξανά.',
'%s version: %s through PHP extension %s' => '%s έκδοση: %s μέσω επέκτασης PHP %s',
'Refresh' => 'Ανανέωση',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Προνόμια',
'Create user' => 'Δημιουργία Χρήστη',
'User has been dropped.' => 'Ο Χρήστης διαγράφηκε.',
'User has been altered.' => 'Ο Χρήστης τροποποιήθηκε.',
'User has been created.' => 'Ο Χρήστης δημιουργήθηκε.',
'Hashed' => 'Κωδικοποιήθηκε',
'Column' => 'Στήλη',
'Routine' => 'Ρουτίνα',
'Grant' => 'Παραχώρηση',
'Revoke' => 'Ανάκληση',
'Process list' => 'Λίστα διεργασιών',
'%d process(es) have been killed.' => array('Τερματίστηκαν %d διεργασία.', 'Τερματίστηκαν %d διεργασίες.'),
'Kill' => 'Τερματισμός',
'Variables' => 'Μεταβλητές',
'Status' => 'Κατάσταση',
'SQL command' => 'Εντολή SQL',
'%d query(s) executed OK.' => array('Το ερώτημα %d εκτελέστηκε ΟΚ.', 'Τα ερώτηματα %d εκτελέστηκαν ΟΚ.'),
'Query executed OK, %d row(s) affected.' => array('Το ερώτημα εκτελέστηκε ΟΚ, επιρρεάστηκε %d σειρά.', 'Το ερώτημα εκτελέστηκε ΟΚ, επιρρεάστηκαν %d σειρές.'),
'No commands to execute.' => 'Δεν υπάρχει εντολή να εκτελεστεί.',
'Error in query' => 'Σφάλμα στο ερώτημα',
'Execute' => 'Εκτέλεση',
'Stop on error' => 'Διακοπή όταν υπάρχει σφάλμα',
'Show only errors' => 'Να εμφανίζονται μόνο τα σφάλματα',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Ιστορικό',
'Clear' => 'Καθαρισμός',
'Edit all' => 'Επεξεργασία όλων',
'File upload' => 'Ανέβασμα αρχείου',
'From server' => 'Από διακομιστή',
'Webserver file %s' => 'Αρχείο %s από διακομιστή web',
'Run file' => 'Εκτέλεση αρχείου',
'File does not exist.' => 'Το αρχείο δεν υπάρχει.',
'File uploads are disabled.' => 'Έχει απενεργοποιηθεί το ανέβασμα αρχείων.',
'Unable to upload a file.' => 'Δεν είναι δυνατόν να ανεβεί το αρχείο.',
'Maximum allowed file size is %sB.' => 'Το μέγιστο επιτρεπόμενο μέγεθος αρχείο για ανέβασμα είναι %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Πολλά δεδομένα POST. Μείωστε τα περιεχόμενα ή αυξήστε την σχετική ρύθμιση %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Μπορείτε να ανεβάσετε ένα μεγάλο αρχείο SQL μέσω FTP και να το εισάγετε από το διακομιστή.',
'You are offline.' => 'Βρίσκεστε εκτός σύνδεσης.',
'Export' => 'Εξαγωγή',
'Output' => 'Αποτέλεσμα',
'open' => 'άνοιγμα',
'save' => 'αποθήκευση',
'Saving' => 'Γίνεται Αποθήκευση',
'Format' => 'Μορφή',
'Data' => 'Δεδομένα',
'Database' => 'Β. Δεδομένων',
'database' => 'β. δεδομένων',
'Use' => 'χρήση',
'Select database' => 'Επιλέξτε Β.Δ.',
'Invalid database.' => 'Άκυρη Β.Δ.',
'Database has been dropped.' => 'Η Β.Δ. διαγράφηκε.',
'Databases have been dropped.' => 'Οι Β.Δ. διαγράφηκαν.',
'Database has been created.' => 'Η Β.Δ. δημιουργήθηκε.',
'Database has been renamed.' => 'Η. Β.Δ. μετονομάστηκε.',
'Database has been altered.' => 'Η Β.Δ. τροποποιήθηκε.',
'Alter database' => 'Τροποποίηση Β.Δ.',
'Create database' => 'Δημιουργία Β.Δ.',
'Database schema' => 'Σχήμα Β.Δ.',
// link to current database schema layout
'Permanent link' => 'Μόνιμος Σύνδεσμος',
// thousands separator - must contain single byte
',' => '.',
'0123456789' => '0123456789',
'Engine' => 'Μηχανή',
'Collation' => 'Collation',
'Data Length' => 'Μήκος Δεδομένων',
'Index Length' => 'Μήκος Δείκτη',
'Data Free' => 'Δεδομένα Ελεύθερα',
'Rows' => 'Σειρές',
'%d in total' => '%d συνολικά',
'Analyze' => 'Ανάλυση',
'Optimize' => 'Βελτιστοποίηση',
'Vacuum' => 'Καθαρισμός',
'Check' => 'Έλεγχος',
'Repair' => 'Επιδιόρθωση',
'Truncate' => 'Περικοπή',
'Tables have been truncated.' => 'Οι πίνακες περικόπτηκαν.',
'Move to other database' => 'Μεταφορά σε άλλη Β.Δ.',
'Move' => 'Μεταφορά',
'Tables have been moved.' => 'Οι πίνακες μεταφέρθηκαν.',
'Copy' => 'Αντιγραφή',
'Tables have been copied.' => 'Οι πίνακες αντιγράφηκαν.',
'Routines' => 'Ρουτίνες',
'Routine has been called, %d row(s) affected.' => array('Η ρουτίνα εκτελέστηκε, επιρρεάστηκε %d σειρά.', 'Η ρουτίνα εκτελέστηκε, επιρρεάστηκαν %d σειρές.'),
'Call' => 'Εκτέλεση',
'Parameter name' => 'Όνομα παραμέτρου',
'Create procedure' => 'Δημιουργία διαδικασίας',
'Create function' => 'Δημιουργία Λειτουργίας',
'Routine has been dropped.' => 'Η ρουτίνα διαγράφηκε.',
'Routine has been altered.' => 'Η ρουτίνα τροποποιήθηκε.',
'Routine has been created.' => 'Η ρουτίνα δημιουργήθηκε.',
'Alter function' => 'Τροποποίηση λειτουργίας',
'Alter procedure' => 'Τροποποίηση διαδικασίας',
'Return type' => 'Επιστρεφόμενος τύπος',
'Events' => 'Γεγονός',
'Event has been dropped.' => 'Το γεγονός διαγράφηκε.',
'Event has been altered.' => 'Το γεγονός τροποποιήθηκε.',
'Event has been created.' => 'Το γεγονός δημιουργήθηκε.',
'Alter event' => 'Τροποποίηση γεγονότος',
'Create event' => 'Δημιουργία γεγονότος',
'At given time' => 'Σε προκαθορισμένο χρόνο',
'Every' => 'Κάθε',
'Schedule' => 'Προγραμματισμός',
'Start' => 'Έναρξη',
'End' => 'Λήξη',
'On completion preserve' => 'Κατά την ολοκλήρωση διατήρησε',
'Tables' => 'Πίνακες',
'Tables and views' => 'Πίνακες και Προβολές',
'Table' => 'Πίνακας',
'No tables.' => 'Χωρίς πίνακες.',
'Alter table' => 'Τροποποίηση πίνακα',
'Create table' => 'Δημιουργία πίνακα',
'Table has been dropped.' => 'Ο πίνακας διαγράφηκε.',
'Tables have been dropped.' => 'Οι πινακες διαγράφηκαν.',
'Tables have been optimized.' => 'Οι πίνακες βελτιστοποιήθηκαν.',
'Table has been altered.' => 'Ο πίνακας τροποποιήθηκε.',
'Table has been created.' => 'Ο πίνακας δημιουργήθηκε.',
'Table name' => 'Όνομα πίνακα',
'Show structure' => 'Προβολή δομής',
'engine' => 'μηχανή',
'collation' => 'collation',
'Column name' => 'Όνομα στήλης',
'Type' => 'Τύπος',
'Length' => 'Μήκος',
'Auto Increment' => 'Αυτόματη αρίθμηση',
'Options' => 'Επιλογές',
'Comment' => 'Σχόλιο',
'Default value' => 'Προεπιλεγμένη τιμή',
'Default values' => 'Προεπιλεγμένες τιμές',
'Drop' => 'Διαγραφή',
'Are you sure?' => 'Είστε σίγουρος;',
'Size' => 'Μέγεθος',
'Compute' => 'Υπολογισμός',
'Move up' => 'Μετακίνηση προς τα επάνω',
'Move down' => 'Μετακίνηση προς τα κάτω',
'Remove' => 'Αφαίρεση',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Υπέρβαση μέγιστου επιτρεπόμενου αριθμού πεδίων. Παρακαλώ αυξήστε %s.',
'Partition by' => 'Τμηματοποίηση ανά',
'Partitions' => 'Τμήματα',
'Partition name' => 'Όνομα Τμήματος',
'Values' => 'Τιμές',
'View' => 'Προβολή',
'Materialized view' => 'Υλοποιημένη προβολή',
'View has been dropped.' => 'Η προβολή διαγράφηκε.',
'View has been altered.' => 'Η προβολή τροποποιήθηκε.',
'View has been created.' => 'Η προβολή δημιουργήθηκε.',
'Alter view' => 'Τροποποίηση προβολής',
'Create view' => 'Δημιουργία προβολής',
'Indexes' => 'Δείκτες',
'Indexes have been altered.' => 'Οι δείκτες τροποποιήθηκαν.',
'Alter indexes' => 'Τροποποίηση δεικτών',
'Add next' => 'Προσθήκη επόμενου',
'Index Type' => 'Τύπος δείκτη',
'Column (length)' => 'Στήλη (μήκος)',
'Foreign keys' => 'Εξαρτημένα κλειδιά',
'Foreign key' => 'Εξαρτημένο κλειδί',
'Foreign key has been dropped.' => 'Το εξαρτημένο κλειδί διαγράφηκε.',
'Foreign key has been altered.' => 'Το εξαρτημένο κλειδί τροποποιήθηκε.',
'Foreign key has been created.' => 'Το εξαρτημένο κλειδί δημιουργήθηκε.',
'Target table' => 'Πίνακας Στόχος',
'Change' => 'Αλλαγή',
'Source' => 'Πηγή',
'Target' => 'Στόχος',
'Add column' => 'Προσθήκη στήλης',
'Alter' => 'Τροποποίηση',
'Add foreign key' => 'Προσθήκη εξαρτημένου κλειδιού',
'ON DELETE' => 'ΚΑΤΑ ΤΗ ΔΙΑΓΡΑΦΗ',
'ON UPDATE' => 'ΚΑΤΑ ΤΗΝ ΑΛΛΑΓΗ',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Οι στήλες στη πηγή και το στόχο πρέπει να έχουν τον ίδιο τύπο, πρέπει να υπάρχει δείκτης στη στήλη στόχο και να υπάρχουν εξαρτημένα δεδομένα.',
'Triggers' => 'Εναύσματα',
'Add trigger' => 'Προσθήκη εναύσματος',
'Trigger has been dropped.' => 'Το έναυσμα διαγράφηκε.',
'Trigger has been altered.' => 'Το έναυσμα τροποποιήθηκε.',
'Trigger has been created.' => 'Το έναυσμα δημιουργήθηκε.',
'Alter trigger' => 'Τροποποίηση εναύσματος',
'Create trigger' => 'Δημιουργία εναύσματος',
'Time' => 'Ώρα',
'Event' => 'Γεγονός',
'Name' => 'Όνομα',
'select' => 'επιλογή',
'Select' => 'Επιλογή',
'Select data' => 'Επιλέξτε δεδομένα',
'Functions' => 'Λειτουργίες',
'Aggregation' => 'Άθροισμα',
'Search' => 'Αναζήτηση',
'anywhere' => 'παντού',
'Search data in tables' => 'Αναζήτηση δεδομένων στους πίνακες',
'Sort' => 'Ταξινόμηση',
'descending' => 'Φθίνουσα',
'Limit' => 'Όριο',
'Limit rows' => 'Περιοριμός σειρών',
'Text length' => 'Μήκος κειμένου',
'Action' => 'Ενέργεια',
'Full table scan' => 'Πλήρης σάρωση πινάκων',
'Unable to select the table' => 'Δεν είναι δυνατή η επιλογή πίνακα',
'No rows.' => 'Χωρίς σειρές.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d σειρά', '%d σειρές'),
'Page' => 'Σελίδα',
'last' => 'τελευταία',
'Load more data' => 'Φόρτωση κι άλλων δεδομένων',
'Loading' => 'Φορτώνει',
'Whole result' => 'Όλο το αποτέλεσμα',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Εισαγωγή',
'%d row(s) have been imported.' => array('$d σειρά εισήχθη.', '%d σειρές εισήχθησαν.'),
'File must be in UTF-8 encoding.' => 'Το αρχείο πρέπει να έχει κωδικοποίηση UTF-8.',
// in-place editing in select
'Modify' => 'Τροποποίηση',
'Ctrl+click on a value to modify it.' => 'Πιέστε Ctrl+click σε μια τιμή για να την τροποποιήσετε.',
'Use edit link to modify this value.' => 'Χρησιμοποιήστε το σύνδεσμο επεξεργασία για να τροποποιήσετε την τιμή.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Η εγγραφή%s εισήχθη.',
'Item has been deleted.' => 'Η εγγραφή διαγράφηκε.',
'Item has been updated.' => 'Η εγγραφή ενημερώθηκε.',
'%d item(s) have been affected.' => array('Επιρρεάστηκε %d εγγραφή.', 'Επιρρεάστηκαν %d εγγραφές.'),
'New item' => 'Νέα εγγραφή',
'original' => 'πρωτότυπο',
// label for value '' in enum data type
'empty' => 'κενό',
'edit' => 'επεξεργασία',
'Edit' => 'Επεξεργασία',
'Insert' => 'Εισαγωγή',
'Save' => 'Αποθήκευση',
'Save and continue edit' => 'Αποθήκευση και συνέχεια επεξεργασίας',
'Save and insert next' => 'Αποθήκευση και εισαγωγή επόμενου',
'Selected' => 'Επιλεγμένα',
'Clone' => 'Κλονοποίηση',
'Delete' => 'Διαγραφή',
'You have no privileges to update this table.' => 'Δεν έχετε δικαίωμα να τροποποιήσετε αυτό τον πίνακα.',
'E-mail' => 'E-mail',
'From' => 'Από',
'Subject' => 'Θέμα',
'Attachments' => 'Συνημμένα',
'Send' => 'Αποστολή',
'%d e-mail(s) have been sent.' => array('%d e-mail απεστάλλει.', '%d e-mail απεστάλλησαν.'),
// data type descriptions
'Numbers' => 'Αριθμοί',
'Date and time' => 'Ημερομηνία και ώρα',
'Strings' => 'Κείμενο',
'Binary' => 'Δυαδικό',
'Lists' => 'Λίστες',
'Network' => 'Δίκτυο',
'Geometry' => 'Γεωμετρία',
'Relations' => 'Συσχετήσεις',
'Editor' => 'Επεξεργαστής',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5/$3/$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'ηη/μμ/[εεεε]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'ΩΩ:ΛΛ:ΔΔ',
'now' => 'τώρα',
'yes' => 'ναι',
'no' => 'όχι',
// general SQLite error in create, drop or rename database
'File exists.' => 'Το αρχείο υπάρχει.',
'Please use one of the extensions %s.' => 'Παρακαλώ χρησιμοποιείστε μια από τις επεκτάσεις %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Τροποποίηση σχήματος',
'Create schema' => 'Δημιουργία σχήματος',
'Schema has been dropped.' => 'Το σχήμα διαγράφηκε.',
'Schema has been created.' => 'Το σχήμα δημιουργήθηκε.',
'Schema has been altered.' => 'Το σχήμα τροποποιήθηκε.',
'Schema' => 'Σχήμα',
'Invalid schema.' => 'Άκυρο σχήμα.',
// PostgreSQL sequences support
'Sequences' => 'Αλληλουχία',
'Create sequence' => 'Δημιουργία αλληλουχίας',
'Sequence has been dropped.' => 'Η αλληλουχία διαγράφηκε.',
'Sequence has been created.' => 'Η αλληλουχία δημιουργήθηκε.',
'Sequence has been altered.' => 'Η αλληλουχία τροποποιήθηκε.',
'Alter sequence' => 'Τροποποίηση αλληλουχίας',
// PostgreSQL user types support
'User types' => 'Τύποι χρήστη',
'Create type' => 'Δημιουργία τύπου',
'Type has been dropped.' => 'Ο τύπος διαγράφηκε.',
'Type has been created.' => 'Ο τύπος δημιουργήθηκε.',
'Alter type' => 'Τροποποίηση τύπου',
);

View File

@@ -1,9 +1,11 @@
<?php
$translations = array(
'Too many unsuccessful logins, try again in %d minute(s).' => array('Too many unsuccessful logins, try again in %d minute.', 'Too many unsuccessful logins, try again in %d minutes.'),
'Query executed OK, %d row(s) affected.' => array('Query executed OK, %d row affected.', 'Query executed OK, %d rows affected.'),
'%d byte(s)' => array('%d byte', '%d bytes'),
'Routine has been called, %d row(s) affected.' => array('Routine has been called, %d row affected.', 'Routine has been called, %d rows affected.'),
'%d process(es) have been killed.' => array('%d process has been killed.', '%d processes have been killed.'),
'%d / ' => '%d / ',
'%d row(s)' => array('%d row', '%d rows'),
'%d item(s) have been affected.' => array('%d item has been affected.', '%d items have been affected.'),
'%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'),

View File

@@ -1,18 +1,17 @@
<?php
$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Salida exitosa.',
'Invalid credentials.' => 'Identificacion inválida.',
'Logout successful.' => 'Sesión finalizada con éxito.',
'Invalid credentials.' => 'Usuario y/o clave de acceso incorrecta.',
'Server' => 'Servidor',
'Username' => 'Usuario',
'Password' => 'Contraseña',
'Select database' => 'Seleccionar Base de datos',
'Invalid database.' => 'Base de datos inválida.',
'Create new database' => 'Ingrese nueva base de datos',
'Invalid database.' => 'Base de datos incorrecta.',
'Table has been dropped.' => 'Tabla eliminada.',
'Table has been altered.' => 'Tabla modificada.',
'Table has been created.' => 'Tabla creada.',
'Alter table' => 'Modifique estructura',
'Alter table' => 'Modificar tabla',
'Create table' => 'Crear tabla',
'Table name' => 'Nombre de la tabla',
'engine' => 'motor',
@@ -31,25 +30,23 @@ $translations = array(
'Alter database' => 'Modificar Base de datos',
'Create database' => 'Crear Base de datos',
'SQL command' => 'Comando SQL',
'Dump' => 'Export',
'Logout' => 'Logout',
'Logout' => 'Cerrar sesión',
'database' => 'base de datos',
'Use' => 'Usar',
'No tables.' => 'No existen tablas.',
'select' => 'registros',
'Create new table' => 'Nueva tabla',
'Item has been deleted.' => 'Registro eliminado.',
'Item has been updated.' => 'Registro modificado.',
'Item%s has been inserted.' => 'Registro%s insertado.',
'Edit' => 'Modificar',
'Insert' => 'Agregar',
'Save and insert next' => 'Guardar e insertar otro',
'Save and insert next' => 'Guardar e insertar siguiente',
'Delete' => 'Eliminar',
'Database' => 'Base de datos',
'Routines' => 'Procedimientos',
'Indexes have been altered.' => 'Indices modificados.',
'Indexes' => 'Indices',
'Alter indexes' => 'Modificar indices',
'Indexes have been altered.' => 'Índices actualizados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar índices',
'Add next' => 'Agregar',
'Language' => 'Idioma',
'Select' => 'Mostrar',
@@ -57,33 +54,33 @@ $translations = array(
'Search' => 'Condición',
'Sort' => 'Ordenar',
'descending' => 'descendiente',
'Limit' => 'Limit',
'Limit' => 'Limite',
'No rows.' => 'No existen registros.',
'Action' => 'Acción',
'edit' => 'modificar',
'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Error in query' => 'Error en consulta',
'Error in query' => 'Error al ejecutar consulta',
'Execute' => 'Ejecutar',
'Table' => 'Tabla',
'Foreign keys' => 'Claves foráneas',
'Triggers' => 'Triggers',
'View' => 'Vistas',
'Foreign keys' => 'Claves externas',
'Triggers' => 'Disparadores',
'View' => 'Vista',
'Unable to select the table' => 'No es posible seleccionar la tabla',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Vuelva a enviar los datos del formulario.',
'Comment' => 'Comentario',
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'No hay comando para ejecutar.',
'Unable to upload a file.' => 'No es posible importar archivo.',
'No commands to execute.' => 'No es posible ejecutar ningún comando.',
'Unable to upload a file.' => 'No es posible importar el archivo.',
'File upload' => 'Importar archivo',
'File uploads are disabled.' => 'Importación de archivos deshablilitado.',
'File uploads are disabled.' => 'Importación de archivos deshablilitada.',
'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Call' => 'Llamar',
'No extension' => 'No hay extension',
'No extension' => 'No hay extensión',
'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.',
'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.',
'Session expired, please login again.' => 'Sesión expirada, por favor ingrese su clave de nuevo.',
'Session expired, please login again.' => 'Sesión caducada, por favor escriba su clave de nuevo.',
'Text length' => 'Longitud de texto',
'Foreign key has been dropped.' => 'Clave externa eliminada.',
'Foreign key has been altered.' => 'Clave externa modificada.',
@@ -95,9 +92,9 @@ $translations = array(
'Target' => 'Destino',
'Add column' => 'Agregar columna',
'Alter' => 'Modificar',
'Add foreign key' => 'Agregar clave foránea',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Add foreign key' => 'Agregar clave externa',
'ON DELETE' => 'AL BORRAR',
'ON UPDATE' => 'AL ACTUALIZAR',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Columna (longitud)',
'View has been dropped.' => 'Vista eliminada.',
@@ -116,21 +113,21 @@ $translations = array(
'Routine has been dropped.' => 'Procedimiento eliminado.',
'Routine has been altered.' => 'Procedimiento modificado.',
'Routine has been created.' => 'Procedimiento creado.',
'Alter function' => 'Modificar Función',
'Alter function' => 'Modificar función',
'Alter procedure' => 'Modificar procedimiento',
'Return type' => 'Tipo de valor de regreso',
'Add trigger' => 'Agregar trigger',
'Trigger has been dropped.' => 'Trigger eliminado.',
'Trigger has been altered.' => 'Trigger modificado.',
'Trigger has been created.' => 'Trigger creado.',
'Alter trigger' => 'Modificar Trigger',
'Create trigger' => 'Agregar Trigger',
'Return type' => 'Tipo de valor de vuelta',
'Add trigger' => 'Agregar disparador',
'Trigger has been dropped.' => 'Disparador eliminado.',
'Trigger has been altered.' => 'Disparador modificado.',
'Trigger has been created.' => 'Disparador creado.',
'Alter trigger' => 'Modificar Disparador',
'Create trigger' => 'Agregar Disparador',
'Time' => 'Tiempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través de extensión PHP %s',
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través de la extensión de PHP %s',
'%d row(s)' => array('%d registro', '%d registros'),
'Remove' => 'Eliminar',
'Are you sure?' => 'Está seguro?',
'Are you sure?' => '¿Está seguro?',
'Privileges' => 'Privilegios',
'Create user' => 'Crear Usuario',
'User has been dropped.' => 'Usuario eliminado.',
@@ -142,11 +139,11 @@ $translations = array(
'Grant' => 'Conceder',
'Revoke' => 'Impedir',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduzca el tamaño o aumente la directiva de configuración %s.',
'Logged as: %s' => 'Logeado como: %s',
'Logged as: %s' => 'Logueado como: %s',
'Move up' => 'Mover arriba',
'Move down' => 'Mover abajo',
'Functions' => 'Funciones',
'Aggregation' => 'Agregaciones',
'Aggregation' => 'Agregados',
'Export' => 'Exportar',
'Output' => 'Salida',
'open' => 'mostrar',
@@ -159,14 +156,14 @@ $translations = array(
'Event has been created.' => 'Evento creado.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Crear Evento',
'At given time' => 'A hora determinada',
'At given time' => 'En el momento indicado',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Agenda',
'Start' => 'Inicio',
'End' => 'Fin',
'Status' => 'Estado',
'On completion preserve' => 'Al completar preservar',
'On completion preserve' => 'Al completar mantener',
'Tables and views' => 'Tablas y vistas',
'Data Length' => 'Longitud de datos',
'Index Length' => 'Longitud de índice',
@@ -177,9 +174,10 @@ $translations = array(
'Check' => 'Comprobar',
'Repair' => 'Reparar',
'Truncate' => 'Vaciar',
'Tables have been truncated.' => 'Tablas vaciadas (truncate).',
'Tables have been truncated.' => 'Las tablas han sido vaciadas.',
'Rows' => 'Registros',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Se movieron las tablas.',
'Move to other database' => 'Mover a otra base de datos',
'Move' => 'Mover',
@@ -187,13 +185,13 @@ $translations = array(
'Save and continue edit' => 'Guardar y continuar editando',
'original' => 'original',
'Tables have been dropped.' => 'Tablas eliminadas.',
'%d item(s) have been affected.' => array('%d ítem afectado.', '%d itemes afectados.'),
'whole result' => 'resultado completo',
'%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Cantida máxima de campos permitidos excedidos. Por favor aumente %s y %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Particiones',
'Partition name' => 'Nombre de Partición',
'Partition name' => 'Nombre de partición',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
'anywhere' => 'donde sea',
@@ -202,13 +200,13 @@ $translations = array(
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'History',
'History' => 'Histórico',
'Variables' => 'Variables',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Las columnas de origen y destino deben ser del mismo tipo, debe existir un índice entre las columnas del destino y el registro referenciado debe existir.',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Las columnas de origen y destino deben ser del mismo tipo, debe existir un índice entre las columnas del destino y el registro referenciado debe existir también.',
'Relations' => 'Relaciones',
'Run file' => 'Ejecutar Archivo',
'Clear' => 'Vaciar',
'Maximum allowed file size is %sB.' => 'Tamaño máximo de archivo es %sB.',
'Maximum allowed file size is %sB.' => 'El tamaño máximo de archivo es %sB.',
'Numbers' => 'Números',
'Date and time' => 'Fecha y hora',
'Strings' => 'Cadena',
@@ -221,12 +219,11 @@ $translations = array(
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Archivo de servidor web %s',
'File does not exist.' => 'Archivo no existe.',
'File does not exist.' => 'Ese archivo no existe.',
'%d in total' => '%d en total',
'Permanent login' => 'Guardar contraseña',
'Databases have been dropped.' => 'Bases de datos eliminadas.',
'Search data in tables' => 'Buscar datos en tablas',
'schema' => 'esquema',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Crear esquema',
@@ -239,29 +236,28 @@ $translations = array(
'Sequence has been dropped.' => 'Secuencia eliminada.',
'Sequence has been created.' => 'Secuencia creada.',
'Sequence has been altered.' => 'Secuencia modificada.',
'User types' => 'Tipos definido por el usuario',
'User types' => 'Tipos definidos por el usuario',
'Create type' => 'Crear tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo creado.',
'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre el valor para editarlo.',
'Use edit link to modify this value.' => 'Utilice el enlace de modificar para realizar los cambios.',
'Use edit link to modify this value.' => 'Utilice el enlace de edición para realizar cambios.',
'last' => 'último',
'From server' => 'Desde servidor',
'System' => 'Motor de base de datos',
'Select data' => 'Visualizar contenido',
'Show structure' => 'Mostrar estructura',
'empty' => 'ningúno',
'empty' => 'ninguno',
'Network' => 'Red',
'Geometry' => 'Geometría',
'File exists.' => 'Archivo ya existe.',
'File exists.' => 'Ese archivo ya existe.',
'Attachments' => 'Adjuntos',
'%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
'%d query(s) executed OK.' => array('%d sentencia SQL ejecutada correctamente.', '%d sentencias SQL ejecutadas correctamente.'),
'Show only errors' => 'Mostrar solamente errores',
'Last page' => 'Ultima página',
'Refresh' => 'Refrescar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use una de las extensiones %s.',
'Please use one of the extensions %s.' => 'Por favor, use una de las extensiones %s.',
'now' => 'ahora',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tablas copiadas.',

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Parool',
'Select database' => 'Vali andmebaas',
'Invalid database.' => 'Tundmatu andmebaas.',
'Create new database' => 'Loo uus andmebaas',
'Table has been dropped.' => 'Tabel on edukalt kustutatud.',
'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.',
'Table has been created.' => 'Tabel on edukalt loodud.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'Muuda andmebaasi',
'Create database' => 'Loo uus andmebaas',
'SQL command' => 'SQL-Päring',
'Dump' => 'Ekspordi',
'Logout' => 'Logi välja',
'database' => 'andmebaas',
'Use' => 'Kasuta',
'No tables.' => 'Tabeleid ei leitud.',
'select' => 'kuva',
'Create new table' => 'Loo uus tabel',
'Item has been deleted.' => 'Kustutamine õnnestus.',
'Item has been updated.' => 'Uuendamine õnnestus.',
'Item%s has been inserted.' => 'Kirje%s on edukalt lisatud.',
@@ -180,6 +177,7 @@ $translations = array(
'Data Free' => 'Vaba ruumi',
'Rows' => 'Ridu',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'Analüüsi',
'Optimize' => 'Optimeeri',
'Check' => 'Kontrolli',
@@ -188,9 +186,9 @@ $translations = array(
'Move to other database' => 'Liiguta teise andmebaasi',
'Move' => 'Liiguta',
'%d item(s) have been affected.' => 'Mõjutatud kirjeid: %d.',
'whole result' => 'Täielikud tulemused',
'Whole result' => 'Täielikud tulemused',
'Clone' => 'Kloon',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s ja %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimaalne väljade arv ületatud. Palun suurendage %s.',
'Partition by' => 'Partitsiooni',
'Partitions' => 'Partitsioonid',
'Partition name' => 'Partitsiooni nimi',
@@ -226,7 +224,6 @@ $translations = array(
'Permanent login' => 'Jäta mind meelde',
'Databases have been dropped.' => 'Andmebaasid on edukalt kustutatud.',
'Search data in tables' => 'Otsi kogu andmebaasist',
'schema' => 'struktuur',
'Schema' => 'Struktuur',
'Alter schema' => 'Muuda struktuuri',
'Create schema' => 'Loo struktuur',
@@ -258,7 +255,6 @@ $translations = array(
'Attachments' => 'Manused',
'%d query(s) executed OK.' => array('%d päring edukalt käivitatud.', '%d päringut edukalt käivitatud.'),
'Show only errors' => 'Kuva vaid veateateid',
'Last page' => 'Viimane lehekülg',
'Refresh' => 'Uuenda',
'Invalid schema.' => 'Sobimatu skeema.',
'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.',

View File

@@ -1,98 +1,101 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => يستم',
'System' => یستم',
'Server' => 'سرور',
'Username' => 'نام كاربري',
'Password' => 'كلمه عبور',
'Permanent login' => '',
'Username' => 'نام کاربری',
'Password' => 'کلمه عبور',
'Permanent login' => 'ورود دائم',
'Login' => 'ورود',
'Logout' => 'خروج',
'Logged as: %s' => 'ورود به عنوان: %s',
'Logout successful.' => 'با موفقيت خارج شديد',
'Invalid credentials.' => 'اعتبار سنجي نامعتبر',
'Logout successful.' => 'با موفقیت خارج شدید.',
'Invalid credentials.' => 'اعتبار سنجی نامعتبر.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.', 'ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="https://www.adminer.org/en/extension/"%s>پیاده سازی</a> کرده تا آن را دائمی سازید.',
'Language' => 'زبان',
'Invalid CSRF token. Send the form again.' => 'نامعتبر است. دوباره سعی کنید Token CSRF',
'Invalid CSRF token. Send the form again.' => 'CSRF token نامعتبر است. دوباره سعی کنید.',
'No extension' => 'پسوند نامعتبر',
'None of the supported PHP extensions (%s) are available.' => ' پسوند پی اچ پی در دسترس نیست (%s) تعداد',
'Session support must be enabled.' => 'پشتيباني از نشست بايستي فعال گردد',
'Session expired, please login again.' => 'نشست پايان يافته، لطفا دوباره وارد شويد',
'None of the supported PHP extensions (%s) are available.' => 'هیچ کدام از افزونه های PHP پشتیبانی شده (%s) موجود نمی باشند.',
'Session support must be enabled.' => 'پشتیبانی از نشست بایستی فعال گردد.',
'Session expired, please login again.' => 'نشست پایان یافته، لطفا دوباره وارد شوید.',
'%s version: %s through PHP extension %s' => 'نسخه %s : %s توسعه پی اچ پی %s',
'Refresh' => 'بازيابي',
'Refresh' => 'بازیابی',
// text direction - 'ltr' or 'rtl'
'ltr' => 'rtl',
'Privileges' => 'امتيازات',
'Create user' => 'ایجاد كاربر',
'User has been dropped.' => 'كاربر حذف شد',
'User has been altered.' => 'كاربر ويرايش گرديد',
'User has been created.' => 'كاربر ايجاد شد',
'Hashed' => 'به هم ريخته',
'Privileges' => 'امتیازات',
'Create user' => 'ایجاد کاربر',
'User has been dropped.' => 'کاربر حذف شد.',
'User has been altered.' => 'کاربر ویرایش گردید.',
'User has been created.' => 'کاربر ایجاد شد.',
'Hashed' => 'به هم ریخته',
'Column' => 'ستون',
'Routine' => 'روتين',
'Routine' => 'روتین',
'Grant' => 'اعطا',
'Revoke' => 'لغو كردن',
'Revoke' => 'لغو کردن',
'Process list' => يست فرآيند',
'%d process(es) have been killed.' => '%d فرآيند متوقف شد',
'Kill' => 'حذف فرآيند',
'Process list' => یست فرآیند',
'%d process(es) have been killed.' => '%d فرآیند متوقف شد.',
'Kill' => 'حذف فرآیند',
'Variables' => 'متغيرها',
'Status' => 'وضعيت',
'Variables' => 'متغیرها',
'Status' => 'وضعیت',
'SQL command' => 'دستور اس كيو ال',
'%d query(s) executed OK.' => '%d كوئري اجرا شد',
'Query executed OK, %d row(s) affected.' => 'كوئري اجرا شد. %d سطر تغيير كرد.',
'No commands to execute.' => 'دستوري براي اجرا وجود ندارد',
'Error in query' => 'خطا در كوئري',
'SQL command' => 'دستور SQL',
'%d query(s) executed OK.' => '%d کوئری اجرا شد.',
'Query executed OK, %d row(s) affected.' => 'کوئری اجرا شد. %d سطر تغیر کرد.',
'No commands to execute.' => 'دستوری برای اجرا وجود ندارد.',
'Error in query' => 'خطا در کوئری',
'Execute' => 'اجرا',
'Stop on error' => 'توقف در خطا',
'Show only errors' => 'فقط نمايش خطاها',
'Stop on error' => 'توقف بر روی خطا',
'Show only errors' => 'فقط نمایش خطاها',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'تاريخ',
'Clear' => 'پاك كردن',
'Edit all' => يرايش همه',
'History' => 'تاریخ',
'Clear' => 'پاک کردن',
'Edit all' => یرایش همه',
'File upload' => 'بارگذاري فايل',
'File upload' => 'بارگذاری فایل',
'From server' => 'از سرور',
'Webserver file %s' => '%s فايل وب سرور',
'Run file' => 'نمايش فايل',
'File does not exist.' => 'فايل وجود ندارد',
'File uploads are disabled.' => 'بارگذاري غير فعال است',
'Unable to upload a file.' => 'قادر به بارگذاري فايل نيستيد',
'Maximum allowed file size is %sB.' => ' %sB حداكثر اندازه فايل',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'حجم داده ارسالي برزگ است. حجم داده كاهش دهيد و يا مقدار %s را در پيكربندي افزايش دهيد.',
'Webserver file %s' => '%s فایل وب سرور',
'Run file' => 'اجرای فایل',
'File does not exist.' => 'فایل وجود ندارد.',
'File uploads are disabled.' => 'بارگذاری غیر فعال است.',
'Unable to upload a file.' => 'قادر به بارگذاری فایل نیستید.',
'Maximum allowed file size is %sB.' => ' %sB حداکثر اندازه فایل.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'حجم داده ارسالی برزگ است. حجم داده کاهش دهید و یا مقدار %s را در پیکربندی افزایش دهید.',
'You can upload a big SQL file via FTP and import it from server.' => 'شما می توانید فایل SQL حجیم را از طریق FTP بارگزاری و از روی سرور وارد نمایید.',
'You are offline.' => 'شما آفلاین می باشید.',
'Export' => 'استخراج',
'Dump' => الي كردن',
'Output' => 'خروجي',
'open' => 'بازكردن',
'save' => 'ذخيره',
'Output' => روجی',
'open' => 'بازکردن',
'save' => 'ذخیره',
'Format' => 'حذف',
'Data' => 'داده',
'Database' => 'پايگاه داده',
'database' => 'پايگاه داده',
'Database' => 'پایگاه داده',
'database' => 'پایگاه داده',
'Use' => 'استفاده',
'Select database' => 'انتخاب پايگاه داده',
'Invalid database.' => 'پايگاه داده نامعتبر',
'Create new database' => 'ایجاد پايگاه داده جديد',
'Database has been dropped.' => 'پايگاه داده حذف شد',
'Databases have been dropped.' => 'پايگاه دادها حذف شدند',
'Database has been created.' => 'پايگاه داده ايجاد شد',
'Database has been renamed.' => 'نام پايگاه داده تغيير كرد',
'Database has been altered.' => 'پايگاه داده ويرايش شد',
'Alter database' => 'ويرايش پايگاه داده',
'Create database' => 'ایجاد پايگاه داده',
'Database schema' => 'ساختار پايگاه داده',
'Select database' => 'انتخاب پایگاه داده',
'Invalid database.' => 'پایگاه داده نامعتبر.',
'Database has been dropped.' => 'پایگاه داده حذف شد.',
'Databases have been dropped.' => 'پایگاه های داده حذف شدند.',
'Database has been created.' => 'پایگاه داده ایجاد شد.',
'Database has been renamed.' => 'نام پایگاه داده تغیر کرد.',
'Database has been altered.' => 'پایگاه داده ویرایش شد.',
'Alter database' => 'ویرایش پایگاه داده',
'Create database' => 'ایجاد پایگاه داده',
'Database schema' => 'ساختار پایگاه داده',
// link to current database schema layout
'Permanent link' => 'ارتباط دائم',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '۰۱۲۳۴۵۶۷۸۹',
'Engine' => 'موتور',
'Collation' => 'تطبیق',
'Data Length' => 'طول داده',
@@ -102,33 +105,34 @@ $translations = array(
'%d in total' => ' به طور کل %d ',
'Analyze' => 'تحلیل',
'Optimize' => 'بهینه سازی',
'Vacuum' => 'پاک سازی',
'Check' => 'بررسی',
'Repair' => 'تعمیر',
'Truncate' => 'کوتاه کردن',
'Tables have been truncated.' => 'جدولها بریده شدند',
'Tables have been truncated.' => 'جدولها بریده شدند.',
'Move to other database' => 'انتقال به یک پایگاه داده دیگر',
'Move' => 'انتقال',
'Tables have been moved.' => 'جدولها انتقال داده شدند',
'Tables have been moved.' => 'جدولها انتقال داده شدند.',
'Copy' => 'کپی کردن',
'Tables have been copied.' => 'جدولها کپی شدند',
'Tables have been copied.' => 'جدولها کپی شدند.',
'Routines' => 'روالها',
'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد', 'روال فراخوانی شد %d سطر متاثر شد'),
'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد.', 'روال فراخوانی شد %d سطر متاثر شد.'),
'Call' => 'صدا زدن',
'Parameter name' => 'نام پارامتر',
'Create procedure' => 'ایجاد زیربرنامه',
'Create function' => 'ایجاد تابع',
'Routine has been dropped.' => 'روال حذف شد',
'Routine has been altered.' => 'روال ویرایش شد',
'Routine has been created.' => 'روال ایجاد شد',
'Routine has been dropped.' => 'روال حذف شد.',
'Routine has been altered.' => 'روال ویرایش شد.',
'Routine has been created.' => 'روال ایجاد شد.',
'Alter function' => 'ویرایش تابع',
'Alter procedure' => 'ویرایش زیربرنامه',
'Return type' => 'برگرداندن نوع',
'Events' => 'رویدادها',
'Event has been dropped.' => 'رویداد حذف شد',
'Event has been altered.' => 'رویداد ویرایش شد',
'Event has been created.' => 'رویداد ایجاد شد',
'Event has been dropped.' => 'رویداد حذف شد.',
'Event has been altered.' => 'رویداد ویرایش شد.',
'Event has been created.' => 'رویداد ایجاد شد.',
'Alter event' => 'ویرایش رویداد',
'Create event' => 'ایجاد رویداد',
'At given time' => 'زمان معین',
@@ -144,11 +148,11 @@ $translations = array(
'No tables.' => 'جدولی وجود ندارد',
'Alter table' => 'ویرایش جدول',
'Create table' => 'ایجاد جدول',
'Create new table' => 'ایجاد جدول جدید',
'Table has been dropped.' => 'جدول حذف شد',
'Tables have been dropped.' => 'جدولها حذف شدند',
'Table has been altered.' => 'جدول ویرایش شد',
'Table has been created.' => 'جدول ایجاد شد',
'Table has been dropped.' => 'جدول حذف شد.',
'Tables have been dropped.' => 'جدولها حذف شدند.',
'Tables have been optimized.' => 'جدولها بهینه شدند.',
'Table has been altered.' => 'جدول ویرایش شد.',
'Table has been created.' => 'جدول ایجاد شد.',
'Table name' => 'نام جدول',
'Show structure' => 'نمایش ساختار',
'engine' => 'موتور',
@@ -159,13 +163,16 @@ $translations = array(
'Auto Increment' => 'افزایش خودکار',
'Options' => 'اختیارات',
'Comment' => 'توضیح',
'Default value' => 'مقدار پیش فرض',
'Default values' => 'مقادیر پیش فرض',
'Drop' => 'حذف',
'Are you sure?' => 'مطمئن هستید؟',
'Size' => 'حجم',
'Compute' => 'محاسبه',
'Move up' => 'انتقال به بالا',
'Move down' => 'انتقال به پایین',
'Remove' => 'حذف',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'حداکثر مجاز فیلدهای مجاز اشباع شد. لطفا %s و %s را کاهش دهید',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر تعداد فیلدهای مجاز اشباع شد. لطفا %s را افزایش دهید.',
'Partition by' => 'بخشبندی توسط',
'Partitions' => 'بخشبندیها',
@@ -173,14 +180,15 @@ $translations = array(
'Values' => 'مقادیر',
'View' => 'نمایش',
'View has been dropped.' => 'نمایش حذف شد',
'View has been altered.' => 'نمایش ویرایش شد',
'View has been created.' => 'نمایش ایجاد شد',
'Materialized view' => 'نمایه مادی',
'View has been dropped.' => 'نمایش حذف شد.',
'View has been altered.' => 'نمایش ویرایش شد.',
'View has been created.' => 'نمایش ایجاد شد.',
'Alter view' => 'حذف نمایش',
'Create view' => 'ایجاد نمایش',
'Indexes' => 'ایندکسها',
'Indexes have been altered.' => 'ایندکسها ویرایش شد',
'Indexes have been altered.' => 'ایندکسها ویرایش شدند.',
'Alter indexes' => 'ویرایش ایندکسها',
'Add next' => 'افرودن بعدی',
'Index Type' => 'نوع ایندکس',
@@ -188,9 +196,9 @@ $translations = array(
'Foreign keys' => 'کلیدهای خارجی',
'Foreign key' => 'کلید خارجی',
'Foreign key has been dropped.' => 'کلید خارجی حذف شد',
'Foreign key has been altered.' => 'کلید خارجی ویرایش شد',
'Foreign key has been created.' => 'کلید خارجی ایجاد شد',
'Foreign key has been dropped.' => 'کلید خارجی حذف شد.',
'Foreign key has been altered.' => 'کلید خارجی ویرایش شد.',
'Foreign key has been created.' => 'کلید خارجی ایجاد شد.',
'Target table' => 'جدول هدف',
'Change' => 'تغییر',
'Source' => 'منبع',
@@ -200,13 +208,13 @@ $translations = array(
'Add foreign key' => 'افزودن کلید خارجی',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'داده مبدا و مقصد ستونها بایستی شبیه هم باشند',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'داده مبدا و مقصد ستونها بایستی شبیه هم باشند.',
'Triggers' => 'تریگرها',
'Add trigger' => 'افزودن تریگر',
'Trigger has been dropped.' => 'تریگر حذف شد',
'Trigger has been altered.' => 'تریگر ویرایش شد',
'Trigger has been created.' => 'تریگر ایجاد شد',
'Trigger has been dropped.' => 'تریگر حذف شد.',
'Trigger has been altered.' => 'تریگر ویرایش شد.',
'Trigger has been created.' => 'تریگر ایجاد شد.',
'Alter trigger' => 'ویرایش تریگر',
'Create trigger' => 'ایجاد تریگر',
'Time' => 'زمان',
@@ -224,28 +232,35 @@ $translations = array(
'Sort' => 'مرتب کردن',
'descending' => 'نزولی',
'Limit' => 'محدودیت',
'Limit rows' => 'محدودیت سطرها',
'Text length' => 'طول متن',
'Action' => 'عملیات',
'Full table scan' => 'اسکن کامل جدول',
'Unable to select the table' => 'قادر به انتخاب جدول نیستید',
'No rows.' => 'سطری وجود ندارد',
'%d / ' => '%d / ',
'%d row(s)' => array('%d سطر', '%d سطر'),
'Page' => 'صفحه',
'last' => 'آخری',
'Last page' => 'صفحه آخر',
'whole result' => 'همه نتایج',
'Load more data' => 'بارگزاری اطلاعات بیشتر',
'Loading' => 'در حال بارگزاری',
'Whole result' => 'همه نتایج',
'%d byte(s)' => array('%d بایت', '%d بایت'),
'Import' => 'وارد کردن',
'%d row(s) have been imported.' => array('%d سطر وارد شد', '%d سطر وارد شد'),
'%d row(s) have been imported.' => array('%d سطر وارد شد.', '%d سطر وارد شد.'),
'File must be in UTF-8 encoding.' => 'فرمت فایل باید UTF-8 باشید.',
// in-place editing in select
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید',
'Modify' => 'ویرایش',
'Ctrl+click on a value to modify it.' => 'برای ویرایش بر روی مقدار ctrl+click کنید.',
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید.',
// %s can contain auto-increment value
'Item%s has been inserted.' => '%s آیتم درج شد',
'Item has been deleted.' => 'آیتم حذف شد',
'Item has been updated.' => 'آیتم بروز رسانی شد',
'%d item(s) have been affected.' => array('%d آیتم متاثر شد', '%d آیتم متاثر شد'),
'Item%s has been inserted.' => '%s آیتم درج شد.',
'Item has been deleted.' => 'آیتم حذف شد.',
'Item has been updated.' => 'آیتم بروز رسانی شد.',
'%d item(s) have been affected.' => array('%d آیتم متاثر شد.', '%d آیتم متاثر شد.'),
'New item' => 'آیتم جدید',
'original' => 'اصلی',
// label for value '' in enum data type
@@ -256,15 +271,17 @@ $translations = array(
'Save' => 'ذخیره',
'Save and continue edit' => 'ذخیره و ادامه ویرایش',
'Save and insert next' => 'ذخیره و درج بعدی',
'Selected' => 'انتخاب شده',
'Clone' => 'تکثیر',
'Delete' => 'حذف',
'You have no privileges to update this table.' => 'شما اختیار ویرایش این جدول را ندارید.',
'E-mail' => 'پست الکترونیک',
'From' => 'فرستنده',
'Subject' => 'موضوع',
'Attachments' => 'پیوست ها',
'Send' => 'ارسال',
'%d e-mail(s) have been sent.' => array('%d ایمیل ارسال شد', '%d ایمیل ارسال شد'),
'%d e-mail(s) have been sent.' => array('%d ایمیل ارسال شد.', '%d ایمیل ارسال شد.'),
// data type descriptions
'Numbers' => 'اعداد',
@@ -284,33 +301,34 @@ $translations = array(
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'اکنون',
'yes' => 'بله',
'no' => 'خیر',
// general SQLite error in create, drop or rename database
'File exists.' => 'فایل موجود است',
'Please use one of the extensions %s.' => 'لطفا یکی از پسوندهای زیر را انتخاب نمائید %s ',
'File exists.' => 'فایل موجود است.',
'Please use one of the extensions %s.' => 'لطفا یکی از پسوندها را انتخاب نمائید %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'ویرایش ساختار',
'Create schema' => 'ایجاد ساختار',
'Schema has been dropped.' => 'ساختار حذف شد',
'Schema has been created.' => 'ساختار ایجاد شد',
'Schema has been altered.' => 'ساختار ویرایش شد',
'schema' => 'ساختار',
'Schema has been dropped.' => 'ساختار حذف شد.',
'Schema has been created.' => 'ساختار ایجاد شد.',
'Schema has been altered.' => 'ساختار ویرایش شد.',
'Schema' => 'ساختار',
'Invalid schema.' => 'ساختار نامعتبر',
'Invalid schema.' => 'ساختار نامعتبر.',
// PostgreSQL sequences support
'Sequences' => 'صف ها',
'Create sequence' => 'ایجاد صف',
'Sequence has been dropped.' => 'صف حذف شد',
'Sequence has been created.' => 'صف ایجاد شد',
'Sequence has been altered.' => 'صف ویرایش شد',
'Sequence has been dropped.' => 'صف حذف شد.',
'Sequence has been created.' => 'صف ایجاد شد.',
'Sequence has been altered.' => 'صف ویرایش شد.',
'Alter sequence' => 'ویرایش صف',
// PostgreSQL user types support
'User types' => 'انواع کاربر',
'Create type' => 'ایجاد نوع',
'Type has been dropped.' => 'نوع حذف شد',
'Type has been created.' => 'نوع ایجاد شد',
'Type has been dropped.' => 'نوع حذف شد.',
'Type has been created.' => 'نوع ایجاد شد.',
'Alter type' => 'ویرایش نوع',
);

336
adminer/lang/fi.inc.php Normal file
View File

@@ -0,0 +1,336 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Järjestelmä',
'Server' => 'Palvelin',
'Username' => 'Käyttäjänimi',
'Password' => 'Salasana',
'Permanent login' => 'Haluan pysyä kirjautuneena',
'Login' => 'Kirjaudu',
'Logout' => 'Kirjaudu ulos',
'Logged as: %s' => 'Olet kirjautunut käyttäjänä: %s',
'Logout successful.' => 'Uloskirjautuminen onnistui.',
'Invalid credentials.' => 'Virheelliset kirjautumistiedot.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.', 'Liian monta epäonnistunutta sisäänkirjautumisyritystä, kokeile uudestaan %d minuutin kuluttua.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-salasana ei ole enää voimassa. <a href="https://www.adminer.org/en/extension/"%s>Toteuta</a> %s-metodi sen tekemiseksi pysyväksi.',
'Language' => 'Kieli',
'Invalid CSRF token. Send the form again.' => 'Virheellinen CSRF-vastamerkki. Lähetä lomake uudelleen.',
'If you did not send this request from Adminer then close this page.' => 'Jollet lähettänyt tämä pyyntö Adminerista, sulje tämä sivu.',
'No extension' => 'Ei laajennusta',
'None of the supported PHP extensions (%s) are available.' => 'Mitään tuetuista PHP-laajennuksista (%s) ei ole käytettävissä.',
'Session support must be enabled.' => 'Istuntotuki on oltava päällä.',
'Session expired, please login again.' => 'Istunto vanhentunut, kirjaudu uudelleen.',
'%s version: %s through PHP extension %s' => '%s versio: %s PHP-laajennuksella %s',
'Refresh' => 'Virkistä',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Oikeudet',
'Create user' => 'Luo käyttäjä',
'User has been dropped.' => 'Käyttäjä poistettiin.',
'User has been altered.' => 'Käyttäjää muutettiin.',
'User has been created.' => 'Käyttäjä luotiin.',
'Hashed' => 'Hashed',
'Column' => 'Sarake',
'Routine' => 'Rutiini',
'Grant' => 'Myönnä',
'Revoke' => 'Kiellä',
'Process list' => 'Prosessilista',
'%d process(es) have been killed.' => array('%d prosessi lopetettu.', '%d prosessia lopetettu..'),
'Kill' => 'Lopeta',
'Variables' => 'Muuttujat',
'Status' => 'Tila',
'SQL command' => 'SQL-komento',
'%d query(s) executed OK.' => array('%d kysely onnistui.', '%d kyselyä onnistui.'),
'Query executed OK, %d row(s) affected.' => array('Kysely onnistui, kohdistui %d riviin.', 'Kysely onnistui, kohdistui %d riviin.'),
'No commands to execute.' => 'Ei komentoja suoritettavana.',
'Error in query' => 'Virhe kyselyssä',
'Execute' => 'Suorita',
'Stop on error' => 'Pysähdy virheeseen',
'Show only errors' => 'Näytä vain virheet',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historia',
'Clear' => 'Tyhjennä',
'Edit all' => 'Muokkaa kaikkia',
'File upload' => 'Tiedoston lataus palvelimelle',
'From server' => 'Verkkopalvelimella Adminer-kansiossa oleva tiedosto',
'Webserver file %s' => 'Verkkopalvelintiedosto %s',
'Run file' => 'Suorita tämä',
'File does not exist.' => 'Tiedostoa ei ole.',
'File uploads are disabled.' => 'Tiedostojen lataaminen palvelimelle on estetty.',
'Unable to upload a file.' => 'Tiedostoa ei voida ladata palvelimelle.',
'Maximum allowed file size is %sB.' => 'Suurin sallittu tiedostokoko on %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Liian suuri POST-datamäärä. Pienennä dataa tai kasvata arvoa %s konfigurointitiedostossa.',
'You can upload a big SQL file via FTP and import it from server.' => 'Voit ladata suuren SQL-tiedoston FTP:n kautta ja tuoda sen sitten palvelimelta.',
'You are offline.' => 'Olet offline-tilassa.',
'Export' => 'Vienti',
'Output' => 'Tulos',
'open' => 'avaa',
'save' => 'tallenna',
'Saving' => 'Tallennetaan',
'Format' => 'Muoto',
'Data' => 'Data',
'Database' => 'Tietokanta',
'database' => 'tietokanta',
'Use' => 'Käytä',
'Select database' => 'Valitse tietokanta',
'Invalid database.' => 'Tietokanta ei kelpaa.',
'Database has been dropped.' => 'Tietokanta on poistettu.',
'Databases have been dropped.' => 'Tietokannat on poistettu.',
'Database has been created.' => 'Tietokanta on luotu.',
'Database has been renamed.' => 'Tietokanta on nimetty uudelleen.',
'Database has been altered.' => 'Tietokantaa on muutettu.',
'Alter database' => 'Muuta tietokantaa',
'Create database' => 'Luo tietokanta',
'Database schema' => 'Tietokantakaava',
// link to current database schema layout
'Permanent link' => 'Pysyvä linkki',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Moottori',
'Collation' => 'Kollaatio',
'Data Length' => 'Datan pituus',
'Index Length' => 'Indeksin pituus',
'Data Free' => 'Vapaa tila',
'Rows' => 'Riviä',
'%d in total' => '%d kaikkiaan',
'Analyze' => 'Analysoi',
'Optimize' => 'Optimoi',
'Vacuum' => 'Siivoa',
'Check' => 'Tarkista',
'Repair' => 'Korjaa',
'Truncate' => 'Tyhjennä',
'Tables have been truncated.' => 'Taulujen sisältö on tyhjennetty.',
'Move to other database' => 'Siirrä toiseen tietokantaan',
'Move' => 'Siirrä',
'Tables have been moved.' => 'Taulut on siirretty.',
'Copy' => 'Kopioi',
'Tables have been copied.' => 'Taulut on kopioitu.',
'Routines' => 'Rutiinit',
'Routine has been called, %d row(s) affected.' => array('Rutiini kutsuttu, kohdistui %d riviin.', 'Rutiini kutsuttu, kohdistui %d riviin.'),
'Call' => 'Kutsua',
'Parameter name' => 'Parametrin nimi',
'Create procedure' => 'Luo proseduuri',
'Create function' => 'Luo funktio',
'Routine has been dropped.' => 'Rutiini on poistettu.',
'Routine has been altered.' => 'Rutiinia on muutettu.',
'Routine has been created.' => 'Rutiini on luotu.',
'Alter function' => 'Muuta funktiota',
'Alter procedure' => 'Muuta proseduuria',
'Return type' => 'Palautustyyppi',
'Events' => 'Tapahtumat',
'Event has been dropped.' => 'Tapahtuma on poistettu.',
'Event has been altered.' => 'Tapahtumaa on muutettu.',
'Event has been created.' => 'Tapahtuma on luotu.',
'Alter event' => 'Muuta tapahtumaa',
'Create event' => 'Luo tapahtuma',
'At given time' => 'Tiettynä aikana',
'Every' => 'Joka',
'Schedule' => 'Aikataulu',
'Start' => 'Aloitus',
'End' => 'Lopetus',
'On completion preserve' => 'Säilytä, kun valmis',
'Tables' => 'Taulut',
'Tables and views' => 'Taulut ja näkymät',
'Table' => 'Taulu',
'No tables.' => 'Ei tauluja.',
'Alter table' => 'Muuta taulua',
'Create table' => 'Luo taulu',
'Table has been dropped.' => 'Taulu on poistettu.',
'Tables have been dropped.' => 'Tauluja on poistettu.',
'Tables have been optimized.' => 'Taulut on optimoitu.',
'Table has been altered.' => 'Taulua on muutettu.',
'Table has been created.' => 'Taulu on luotu.',
'Table name' => 'Taulun nimi',
'Show structure' => 'Näytä rakenne',
'engine' => 'moottori',
'collation' => 'kollaatio',
'Column name' => 'Sarakkeen nimi',
'Type' => 'Tyyppi',
'Length' => 'Pituus',
'Auto Increment' => 'Automaattinen lisäys',
'Options' => 'Asetukset',
'Comment' => 'Kommentit',
'Default value' => 'Oletusarvo',
'Default values' => 'Oletusarvot',
'Drop' => 'Poista',
'Are you sure?' => 'Oletko varma?',
'Size' => 'Koko',
'Compute' => 'Laske',
'Move up' => 'Siirrä ylös',
'Move down' => 'Siirrä alas',
'Remove' => 'Poista',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Kenttien sallittu enimmäismäärä ylitetty. Kasvata arvoa %s.',
'Partition by' => 'Osioi arvolla',
'Partitions' => 'Osiot',
'Partition name' => 'Osion nimi',
'Values' => 'Arvot',
'View' => 'Näkymä',
'Materialized view' => 'Materialisoitunut näkymä',
'View has been dropped.' => 'Näkymä on poistettu.',
'View has been altered.' => 'Näkymää on muutettu.',
'View has been created.' => 'Näkymä on luotu.',
'Alter view' => 'Muuta näkymää',
'Create view' => 'Luo näkymä',
'Indexes' => 'Indeksit',
'Indexes have been altered.' => 'Indeksejä on muutettu.',
'Alter indexes' => 'Muuta indeksejä',
'Add next' => 'Lisää seuraava',
'Index Type' => 'Indeksityyppi',
'Column (length)' => 'Sarake (pituus)',
'Foreign keys' => 'Vieraat avaimet',
'Foreign key' => 'Vieras avain',
'Foreign key has been dropped.' => 'Vieras avain on poistettu.',
'Foreign key has been altered.' => 'Vierasta avainta on muutettu.',
'Foreign key has been created.' => 'Vieras avain on luotu.',
'Target table' => 'Kohdetaulu',
'Change' => 'Muuta',
'Source' => 'Lähde',
'Target' => 'Kohde',
'Add column' => 'Lisää sarake',
'Alter' => 'Muuta',
'Add foreign key' => 'Lisää vieras avain',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Lähde- ja kohdesarakkeiden tulee olla samaa tietotyyppiä, kohdesarakkeisiin tulee olla indeksi ja dataa, johon viitataan, täytyy olla.',
'Triggers' => 'Liipaisimet',
'Add trigger' => 'Lisää liipaisin',
'Trigger has been dropped.' => 'Liipaisin on poistettu.',
'Trigger has been altered.' => 'Liipaisinta on muutettu.',
'Trigger has been created.' => 'Liipaisin on luotu.',
'Alter trigger' => 'Muuta liipaisinta',
'Create trigger' => 'Luo liipaisin',
'Time' => 'Aika',
'Event' => 'Tapahtuma',
'Name' => 'Nimi',
'select' => 'valitse',
'Select' => 'Valitse',
'Select data' => 'Valitse data',
'Functions' => 'Funktiot',
'Aggregation' => 'Aggregaatiot',
'Search' => 'Hae',
'anywhere' => 'kaikkialta',
'Search data in tables' => 'Hae dataa tauluista',
'Sort' => 'Lajittele',
'descending' => 'alenevasti',
'Limit' => 'Raja',
'Limit rows' => 'Rajoita rivimäärää',
'Text length' => 'Tekstin pituus',
'Action' => 'Toimenpide',
'Full table scan' => 'Koko taulun läpikäynti',
'Unable to select the table' => 'Taulua ei voitu valita',
'No rows.' => 'Ei rivejä.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rivi', '%d riviä'),
'Page' => 'Sivu',
'last' => 'viimeinen',
'Load more data' => 'Lataa lisää dataa',
'Loading' => 'Ladataan',
'Whole result' => 'Koko tulos',
'%d byte(s)' => array('%d tavu', '%d tavua'),
'Import' => 'Tuonti',
'%d row(s) have been imported.' => array('%d rivi tuotiin.', '%d riviä tuotiin.'),
'File must be in UTF-8 encoding.' => 'Tiedoston täytyy olla UTF-8-muodossa.',
// in-place editing in select
'Modify' => 'Muuta',
'Ctrl+click on a value to modify it.' => 'Ctrl+napsauta arvoa muuttaaksesi.',
'Use edit link to modify this value.' => 'Käytä muokkaa-linkkiä muuttaaksesi tätä arvoa.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Tietue%s lisättiin.',
'Item has been deleted.' => 'Tietue poistettiin.',
'Item has been updated.' => 'Tietue päivitettiin.',
'%d item(s) have been affected.' => array('Kohdistui %d tietueeseen.', 'Kohdistui %d tietueeseen.'),
'New item' => 'Uusi tietue',
'original' => 'alkuperäinen',
// label for value '' in enum data type
'empty' => 'tyhjä',
'edit' => 'muokkaa',
'Edit' => 'Muokkaa',
'Insert' => 'Lisää',
'Save' => 'Tallenna',
'Save and continue edit' => 'Tallenna ja jatka muokkaamista',
'Save and insert next' => 'Tallenna ja lisää seuraava',
'Selected' => 'Valitut',
'Clone' => 'Kloonaa',
'Delete' => 'Poista',
'You have no privileges to update this table.' => 'Sinulla ei ole oikeutta päivittää tätä taulua.',
'E-mail' => 'S-posti',
'From' => 'Lähettäjä',
'Subject' => 'Aihe',
'Attachments' => 'Liitteet',
'Send' => 'Lähetä',
'%d e-mail(s) have been sent.' => array('% sähköpostiviestiä lähetetty.', '% sähköpostiviestiä lähetetty.'),
// data type descriptions
'Numbers' => 'Numerot',
'Date and time' => 'Päiväys ja aika',
'Strings' => 'Merkkijonot',
'Binary' => 'Binäärinen',
'Lists' => 'Luettelot',
'Network' => 'Verkko',
'Geometry' => 'Geometria',
'Relations' => 'Suhteet',
'Editor' => 'Editori',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$5.$3.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'pp.kk.[vvvv]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nyt',
'yes' => 'kyllä',
'no' => 'ei',
// general SQLite error in create, drop or rename database
'File exists.' => 'Tiedosto on olemassa.',
'Please use one of the extensions %s.' => 'Käytä jotain %s-laajennuksista.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Muuta kaavaa',
'Create schema' => 'Luo kaava',
'Schema has been dropped.' => 'Kaava poistettiin.',
'Schema has been created.' => 'Kaava luotiin.',
'Schema has been altered.' => 'Kaavaa muutettiin.',
'Schema' => 'Kaava',
'Invalid schema.' => 'Kaava ei kelpaa.',
// PostgreSQL sequences support
'Sequences' => 'Sekvenssit',
'Create sequence' => 'Luo sekvenssi',
'Sequence has been dropped.' => 'Sekvenssi on poistettu.',
'Sequence has been created.' => 'Sekvenssi on luotu.',
'Sequence has been altered.' => 'Sekvenssiä on muutettu.',
'Alter sequence' => 'Muuta sekvenssiä',
// PostgreSQL user types support
'User types' => 'Käyttäjän tyypit',
'Create type' => 'Luo tyyppi',
'Type has been dropped.' => 'Tyyppi poistettiin.',
'Type has been created.' => 'Tyyppi luotiin.',
'Alter type' => 'Muuta tyyppiä',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Mot de passe',
'Select database' => 'Sélectionner la base de données',
'Invalid database.' => 'Base de données invalide.',
'Create new database' => 'Créer une base de données',
'Table has been dropped.' => 'La table a été effacée.',
'Table has been altered.' => 'La table a été modifiée.',
'Table has been created.' => 'La table a été créée.',
@@ -20,9 +19,9 @@ $translations = array(
'Column name' => 'Nom de la colonne',
'Type' => 'Type',
'Length' => 'Longueur',
'Auto Increment' => 'Auto increment',
'Auto Increment' => 'Incrément automatique',
'Options' => 'Options',
'Save' => 'Sauvegarder',
'Save' => 'Enregistrer',
'Drop' => 'Supprimer',
'Database has been created.' => 'La base de données a été créée.',
'Database has been renamed.' => 'La base de données a été renommée.',
@@ -30,18 +29,16 @@ $translations = array(
'Alter database' => 'Modifier la base de données',
'Create database' => 'Créer une base de données',
'SQL command' => 'Requête SQL',
'Dump' => 'Exporter',
'Logout' => 'Déconnexion',
'database' => 'base de données',
'Use' => 'Utiliser',
'No tables.' => 'Aucune table.',
'select' => 'select',
'Create new table' => 'Créer une nouvelle table',
'Item has been deleted.' => 'L\'élément a été supprimé.',
'Item has been updated.' => 'L\'élément a été modifié.',
'Edit' => 'Modifier',
'Insert' => 'Insérer',
'Save and insert next' => 'Sauvegarder et insérer le prochain',
'Save and insert next' => 'Enr. et insérer prochain',
'Delete' => 'Effacer',
'Database' => 'Base de données',
'Routines' => 'Routines',
@@ -50,7 +47,7 @@ $translations = array(
'Alter indexes' => 'Modifier les index',
'Add next' => 'Ajouter le prochain',
'Language' => 'Langue',
'Select' => 'Select',
'Select' => 'Sélectionner',
'New item' => 'Nouvel élément',
'Search' => 'Rechercher',
'Sort' => 'Trier',
@@ -65,10 +62,10 @@ $translations = array(
'Execute' => 'Exécuter',
'Table' => 'Table',
'Foreign keys' => 'Clés étrangères',
'Triggers' => 'Triggers',
'Triggers' => 'Déclencheurs',
'View' => 'Vue',
'Unable to select the table' => 'Impossible de sélectionner la table',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalide. Veuillez réenvoyer le formulaire.',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalide. Veuillez renvoyer le formulaire.',
'Comment' => 'Commentaire',
'Default values' => 'Valeurs par défaut',
'%d byte(s)' => array('%d octet', '%d octets'),
@@ -117,17 +114,17 @@ $translations = array(
'Alter function' => 'Modifier la fonction',
'Alter procedure' => 'Modifier la procédure',
'Return type' => 'Type de retour',
'Add trigger' => 'Ajouter un trigger',
'Trigger has been dropped.' => 'Le trigger a été supprimé.',
'Trigger has been altered.' => 'Le trigger a été modifié.',
'Trigger has been created.' => 'Le trigger a été créé.',
'Alter trigger' => 'Modifier un trigger',
'Create trigger' => 'Ajouter un trigger',
'Add trigger' => 'Ajouter un déclencheur',
'Trigger has been dropped.' => 'Le déclencheur a été supprimé.',
'Trigger has been altered.' => 'Le déclencheur a été modifié.',
'Trigger has been created.' => 'Le déclencheur a été créé.',
'Alter trigger' => 'Modifier un déclencheur',
'Create trigger' => 'Ajouter un déclencheur',
'Time' => 'Temps',
'Event' => 'Évènement',
'%d row(s)' => array('%d ligne', '%d lignes'),
'Remove' => 'Effacer',
'Are you sure?' => 'Êtes-vous certain ?',
'Are you sure?' => 'Êtes-vous certain(e) ?',
'Privileges' => 'Privilèges',
'Create user' => 'Créer un utilisateur',
'User has been dropped.' => 'L\'utilisateur a été effacé.',
@@ -148,7 +145,7 @@ $translations = array(
'Data' => 'Données',
'Output' => 'Sortie',
'open' => 'ouvrir',
'save' => 'sauvegarder',
'save' => 'enregistrer',
'Format' => 'Format',
'Functions' => 'Fonctions',
'Aggregation' => 'Agrégation',
@@ -165,7 +162,7 @@ $translations = array(
'Events' => 'Évènements',
'Schedule' => 'Horaire',
'At given time' => 'À un moment précis',
'Save and continue edit' => 'Sauvegarder et continuer l\'édition',
'Save and continue edit' => 'Enr. et continuer édition',
'original' => 'original',
'Tables have been truncated.' => 'Les tables ont été tronquées.',
'Tables have been moved.' => 'Les tables ont été déplacées.',
@@ -178,6 +175,7 @@ $translations = array(
'Data Free' => 'Espace inutilisé',
'Rows' => 'Lignes',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'Analyser',
'Optimize' => 'Optimiser',
'Check' => 'Vérifier',
@@ -186,14 +184,14 @@ $translations = array(
'Move to other database' => 'Déplacer vers une autre base de données',
'Move' => 'Déplacer',
'%d item(s) have been affected.' => array('%d élément a été modifié.', '%d éléments ont été modifiés.'),
'whole result' => 'résultat entier',
'Whole result' => 'Résultat entier',
'Clone' => 'Cloner',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s et %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Le nombre maximum de champs est dépassé. Veuillez augmenter %s.',
'Partition by' => 'Partitionner par',
'Partitions' => 'Partitions',
'Partition name' => 'Nom de la partition',
'Values' => 'Valeurs',
'%d row(s) have been imported.' => array('%d ligne a été importée.','%d lignes ont été importées.'),
'%d row(s) have been imported.' => array('%d ligne a été importée.', '%d lignes ont été importées.'),
'anywhere' => 'n\'importe où',
'Import' => 'Importer',
'Stop on error' => 'Arrêter en cas d\'erreur',
@@ -225,7 +223,6 @@ $translations = array(
'Databases have been dropped.' => 'Les bases de données ont été supprimées.',
'Database has been dropped.' => 'La base de données a été supprimée.',
'Search data in tables' => 'Rechercher dans les tables',
'schema' => 'schéma',
'Schema' => 'Schéma',
'Alter schema' => 'Modifier le schéma',
'Create schema' => 'Créer un schéma',
@@ -259,7 +256,6 @@ $translations = array(
'now' => 'maintenant',
'%d query(s) executed OK.' => array('%d requête exécutée avec succès.', '%d requêtes exécutées avec succès.'),
'Show only errors' => 'Montrer seulement les erreurs',
'Last page' => 'Dernière page',
'Refresh' => 'Rafraîchir',
'Invalid schema.' => 'Schéma invalide.',
'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.',
@@ -269,4 +265,27 @@ $translations = array(
'Permanent link' => 'Lien permanent',
'Edit all' => 'Tout modifier',
'HH:MM:SS' => 'HH:MM:SS',
'Selected' => 'Sélectionnée(s)',
'Modify' => 'Modification',
'Load more data' => 'Charger plus de données',
'Loading' => 'Chargement',
'Tables have been optimized.' => 'Les tables ont bien été optimisées.',
'Vacuum' => 'Vide',
'File must be in UTF-8 encoding.' => 'Les fichiers doivent être encodés en UTF-8.',
'Full table scan' => 'Scan de toute la table',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Trop de connexions échouées, essayez à nouveau dans %d minute.', 'Trop de connexions échouées, essayez à nouveau dans %d minutes.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Le mot de passe a expiré. <a href="https://www.adminer.org/en/extension/"%s>Implémentez</a> la méthode %s afin de le rendre permanent.',
'You can upload a big SQL file via FTP and import it from server.' => 'Vous pouvez uploader un gros fichier SQL par FTP et ensuite l\'importer depuis le serveur.',
'Size' => 'Taille',
'Compute' => 'Calcul',
'You have no privileges to update this table.' => 'Vous n\'avez pas les droits pour mettre à jour cette table.',
'Saving' => 'Enregistrement',
'yes' => 'oui',
'no' => 'non',
'Materialized view' => 'Vue matérialisée',
'%d / ' => '%d / ',
'Limit rows' => 'Limiter les lignes',
'Default value' => 'Valeur par défaut',
'If you did not send this request from Adminer then close this page.' => 'Si vous n\'avez pas envoyé cette requête depuis Adminer, alors fermez cette page.',
'You are offline.' => 'Vous êtes hors ligne.',
);

291
adminer/lang/gl.inc.php Normal file
View File

@@ -0,0 +1,291 @@
<?php
$translations = array(
'Login' => 'Conectar',
'Logout successful.' => 'Pechouse a sesión con éxito.',
'Invalid credentials.' => 'Credenciais (usuario e/ou contrasinal) inválidos.',
'Server' => 'Servidor',
'Username' => 'Usuario',
'Password' => 'Contrasinal',
'Select database' => 'Seleccionar Base de datos',
'Invalid database.' => 'Base de datos incorrecta.',
'Table has been dropped.' => 'Eliminouse a táboa.',
'Table has been altered.' => 'Modificouse a táboa.',
'Table has been created.' => 'Creouse a táboa.',
'Alter table' => 'Modificar táboa',
'Create table' => 'Crear táboa',
'Table name' => 'Nome da táboa',
'engine' => 'motor',
'collation' => 'xogo de caracteres (collation)',
'Column name' => 'Nome da columna',
'Type' => 'Tipo',
'Length' => 'Lonxitude',
'Auto Increment' => 'Incremento automático',
'Options' => 'Opcións',
'Save' => 'Gardar',
'Drop' => 'Eliminar',
'Database has been dropped.' => 'Eliminouse a base de datos.',
'Database has been created.' => 'Creouse a base de datos.',
'Database has been renamed.' => 'Renomeouse a base de datos.',
'Database has been altered.' => 'Modificouse a base de datos.',
'Alter database' => 'Modificar Base de datos',
'Create database' => 'Crear Base de datos',
'SQL command' => 'Comando SQL',
'Logout' => 'Pechar sesión',
'database' => 'base de datos',
'Use' => 'Usar',
'No tables.' => 'Nengunha táboa.',
'select' => 'selecciona',
'Item has been deleted.' => 'Eliminouse o elemento.',
'Item has been updated.' => 'Modificouse o elemento.',
'Item%s has been inserted.' => 'Inseríuse o elemento%s.',
'Edit' => 'Editar',
'Insert' => 'Inserir',
'Save and insert next' => 'Guardar e inserir seguinte',
'Delete' => 'Borrar',
'Database' => 'Base de datos',
'Routines' => 'Rutinas',
'Indexes have been altered.' => 'Alteráronse os índices.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar índices',
'Add next' => 'Engadir seguinte',
'Language' => 'Lingua',
'Select' => 'Seleccionar',
'New item' => 'Novo elemento',
'Search' => 'Buscar',
'Sort' => 'Ordenar',
'descending' => 'descendente',
'Limit' => 'Límite',
'No rows.' => 'Nengún resultado.',
'Action' => 'Acción',
'edit' => 'editar',
'Page' => 'Páxina',
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d fila afectada.', 'Consulta executada, %d filas afectadas.'),
'Error in query' => 'Erro na consulta',
'Execute' => 'Executar',
'Table' => 'Táboa',
'Foreign keys' => 'Chaves externas',
'Triggers' => 'Disparadores',
'View' => 'Vista',
'Unable to select the table' => 'No é posible seleccionar a táboa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Envíe de novo os datos do formulario.',
'Comment' => 'Comentario',
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Non hai comandos para executar.',
'Unable to upload a file.' => 'Non é posible importar o ficheiro.',
'File upload' => 'Importar ficheiro',
'File uploads are disabled.' => 'Importación de ficheiros deshablilitada.',
'Routine has been called, %d row(s) affected.' => array('Chamouse á rutina, %d fila afectada.', 'Chamouse á rutina, %d filas afectadas.'),
'Call' => 'Chamar',
'No extension' => 'Non ten extensión',
'None of the supported PHP extensions (%s) are available.' => 'Ningunha das extensións PHP soportadas (%s) está dispoñible.',
'Session support must be enabled.' => 'As sesións deben estar habilitadas.',
'Session expired, please login again.' => 'Caducou a sesión, por favor acceda de novo.',
'Text length' => 'Lonxitud do texto',
'Foreign key has been dropped.' => 'Eliminouse a chave externa.',
'Foreign key has been altered.' => 'Modificouse a chave externa.',
'Foreign key has been created.' => 'Creouse a chave externa.',
'Foreign key' => 'Chave externa',
'Target table' => 'táboa de destino',
'Change' => 'Cambiar',
'Source' => 'Orixe',
'Target' => 'Destino',
'Add column' => 'Engadir columna',
'Alter' => 'Modificar',
'Add foreign key' => 'Engadir chave externa',
'ON DELETE' => 'AO BORRAR (ON DELETE)',
'ON UPDATE' => 'AO ACTUALIZAR (ON UPDATE)',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Columna (lonxitude)',
'View has been dropped.' => 'Eliminouse a vista.',
'View has been altered.' => 'Modificouse a vista.',
'View has been created.' => 'Creouse a vista.',
'Alter view' => 'Modificar vista',
'Create view' => 'Crear vista',
'Name' => 'Nome',
'Process list' => 'Lista de procesos',
'%d process(es) have been killed.' => array('%d proceso foi detido.', '%d procesos foron detidos.'),
'Kill' => 'Deter',
'Parameter name' => 'Nome de Parámetro',
'Database schema' => 'Esquema de base de datos',
'Create procedure' => 'Crear procedemento',
'Create function' => 'Crear función',
'Routine has been dropped.' => 'Eliminouse o procedemento.',
'Routine has been altered.' => 'Alterouse o procedemento.',
'Routine has been created.' => 'Creouse o procedemento.',
'Alter function' => 'Modificar Función',
'Alter procedure' => 'Modificar procedemento',
'Return type' => 'Tipo de valor devolto',
'Add trigger' => 'Engadir disparador',
'Trigger has been dropped.' => 'Eliminouse o disparador.',
'Trigger has been altered.' => 'Modificouse o disparador.',
'Trigger has been created.' => 'Creouse o disparador.',
'Alter trigger' => 'Modificar Disparador',
'Create trigger' => 'Crear Disparador',
'Time' => 'Tempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través da extensión de PHP %s',
'%d row(s)' => array('%d fila', '%d filas'),
'Remove' => 'Eliminar',
'Are you sure?' => 'Está seguro?',
'Privileges' => 'Privilexios',
'Create user' => 'Crear Usuario',
'User has been dropped.' => 'Eliminouse o usuario.',
'User has been altered.' => 'Modificouse o usuario.',
'User has been created.' => 'Creouse o usuario.',
'Hashed' => 'Hashed',
'Column' => 'Columna',
'Routine' => 'Rutina',
'Grant' => 'Conceder',
'Revoke' => 'Revocar',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Datos POST demasiado grandes. Reduza os datos ou aumente a directiva de configuración %s.',
'Logged as: %s' => 'Conectado como: %s',
'Move up' => 'Mover arriba',
'Move down' => 'Mover abaixo',
'Functions' => 'Funcións',
'Aggregation' => 'Agregados',
'Export' => 'Exportar',
'Output' => 'Salida',
'open' => 'abrir',
'save' => 'gardar',
'Format' => 'Formato',
'Tables' => 'Táboas',
'Data' => 'Datos',
'Event has been dropped.' => 'Eliminouse o evento.',
'Event has been altered.' => 'Modificouse o evento.',
'Event has been created.' => 'Creouse o evento.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Crear Evento',
'At given time' => 'No tempo indicado',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Axenda',
'Start' => 'Inicio',
'End' => 'Fin',
'Status' => 'Estado',
'On completion preserve' => 'Ao completar manter',
'Tables and views' => 'táboas e vistas',
'Data Length' => 'Lonxitude de datos',
'Index Length' => 'Lonxitude de índice',
'Data Free' => 'Espazo dispoñible',
'Collation' => 'Xogo de caracteres (collation)',
'Analyze' => 'Analizar',
'Optimize' => 'Optimizar',
'Check' => 'Comprobar',
'Repair' => 'Reparar',
'Truncate' => 'Baleirar',
'Tables have been truncated.' => 'Baleiráronse as táboas.',
'Rows' => 'Filas',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Movéronse as táboas.',
'Move to other database' => 'Mover a outra base de datos',
'Move' => 'Mover',
'Engine' => 'Motor',
'Save and continue edit' => 'Gardar se seguir editando',
'original' => 'orixinal',
'Tables have been dropped.' => 'Elimináronse as táboas.',
'%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida o número máximo de campos permitidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Particións',
'Partition name' => 'Nome da Partición',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d fila importada.', '%d filas importadas.'),
'anywhere' => 'onde sexa',
'Import' => 'Importar',
'Stop on error' => 'Parar en caso de erro',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Histórico',
'Variables' => 'Variables',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As columnas de orixe e destino deben ser do mesmo tipo, debe existir un índice nas columnas de destino e os datos referenciados deben existir.',
'Relations' => 'Relacins',
'Run file' => 'Executar ficheiro',
'Clear' => 'Baleirar',
'Maximum allowed file size is %sB.' => 'O tamaño máximo de ficheiro permitido é de %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadea',
'Binary' => 'Binario',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'Email',
'From' => 'De',
'Subject' => 'Asunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Ficheiro de servidor web %s',
'File does not exist.' => 'O ficheiro non existe.',
'%d in total' => '%d en total',
'Permanent login' => 'Permanecer conectado',
'Databases have been dropped.' => 'Elimináronse as bases de datos.',
'Search data in tables' => 'Buscar datos en táboas',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Crear esquema',
'Schema has been dropped.' => 'Eliminouse o esquema.',
'Schema has been created.' => 'Creouse o esquema.',
'Schema has been altered.' => 'Modificouse o esquema.',
'Sequences' => 'Secuencias',
'Create sequence' => 'Crear secuencias',
'Alter sequence' => 'Modificar secuencia',
'Sequence has been dropped.' => 'Eliminouse a secuencia.',
'Sequence has been created.' => 'Creouse a secuencia.',
'Sequence has been altered.' => 'Modificaouse a secuencia.',
'User types' => 'Tipos definidos polo usuario',
'Create type' => 'Crear tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Eliminouse o tipo.',
'Type has been created.' => 'Creouse o tipo.',
'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre o valor para editalo.',
'Use edit link to modify this value.' => 'Use a ligazón de edición para modificar este valor.',
'last' => 'último',
'From server' => 'Desde o servidor',
'System' => 'Sistema',
'Select data' => 'Seleccionar datos',
'Show structure' => 'Amosar estructura',
'empty' => 'baleiro',
'Network' => 'Rede',
'Geometry' => 'Xeometría',
'File exists.' => 'O ficheiro xa existe.',
'Attachments' => 'Adxuntos',
'%d query(s) executed OK.' => array('%d consulta executada correctamente.', '%d consultas executadas correctamente.'),
'Show only errors' => 'Amosar só erros',
'Refresh' => 'Refrescar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use unha das extensións %s.',
'now' => 'agora',
'ltr' => 'ltr',
'Tables have been copied.' => 'Copiáronse as táboas.',
'Copy' => 'Copiar',
'Permanent link' => 'Ligazón permanente',
'Edit all' => 'Editar todo',
'HH:MM:SS' => 'HH:MM:SS',
'Tables have been optimized.' => 'Optimizáronse as táboas',
'Materialized view' => 'Vista materializada',
'Vacuum' => 'Baleirar',
'Selected' => 'Selección',
'File must be in UTF-8 encoding.' => 'O ficheiro ten que estar codificado con UTF-8',
'Modify' => 'Modificar',
'Loading' => 'Cargando',
'Load more data' => 'Cargar máis datos',
'%d / ' => array('%d / ','%d / '),
'Limit rows' => 'Limitar filas',
'Default value' => 'Valor por defecto',
'Full table scan' => 'Escaneo completo da táboa',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Demasiados intentos de conexión, intentao de novo en %d minuto', 'Demasiados intentos de conexión, intentao de novo en %d minutos'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'O contrasinal principal caducou. <a href="https://www.adminer.org/en/extension/"%s>Implementa</a> o método %s para facelo permanente.',
'If you did not send this request from Adminer then close this page.' => 'Se non enviaches esta petición dende o Adminer entón pecha esta páxina',
'You can upload a big SQL file via FTP and import it from server.' => 'Podes subir un ficheiro SQL de gran tamaño vía FTP e importalo dende o servidor',
'Size' => 'Tamaño',
'Compute' => 'Calcular',
'You are offline.' => 'Non tes conexión',
'You have no privileges to update this table.' => 'Non tes privilexios para actualizar esta táboa',
'Saving' => 'Gardando',
'yes' => 'si',
'no' => 'non',
);

293
adminer/lang/he.inc.php Normal file
View File

@@ -0,0 +1,293 @@
<?php
$translations = array(
'Login' => 'התחברות',
'Logout successful.' => 'ההתחברות הצליחה',
'Invalid credentials.' => 'פרטי התחברות שגויים',
'Server' => 'שרת',
'Username' => 'שם משתמש',
'Password' => 'סיסמה',
'Select database' => 'בחר מסד נתונים',
'Invalid database.' => 'מסד נתונים שגוי',
'Table has been dropped.' => 'הטבלה הושלכה',
'Table has been altered.' => 'הטבלה שונתה',
'Table has been created.' => 'הטבלה נוצרה',
'Alter table' => 'שנה טבלה',
'Create table' => 'צור טבלה',
'Table name' => 'שם הטבלה',
'engine' => 'מנוע',
'collation' => 'קולקציה',
'Column name' => 'שם עמודה',
'Type' => 'סוג',
'Length' => 'אורך',
'Auto Increment' => 'הגדלה אוטומטית',
'Options' => 'אפשרויות',
'Save' => 'שמור',
'Drop' => 'השלך',
'Database has been created.' => 'מסד הנתונים נוצר',
'Database has been renamed.' => 'שם מסד הנתונים שונה',
'Database has been altered.' => 'מסד הנתונים שונה',
'Alter database' => 'שנה מסד נתונים',
'Create database' => 'צור מסד נתונים',
'SQL command' => 'שאילתת SQL',
'Logout' => 'התנתק',
'database' => 'מסד נתונים',
'Use' => 'השתמש',
'No tables.' => 'אין טבלאות',
'select' => 'בחר',
'Item has been deleted.' => 'הפריט נמחק',
'Item has been updated.' => 'הפריט עודכן',
'Edit' => 'ערוך',
'Insert' => 'הכנס',
'Save and insert next' => 'שמור והמשך להכניס',
'Delete' => 'מחק',
'Database' => 'מסד נתונים',
'Routines' => 'רוטינות',
'Indexes have been altered.' => 'האינדקסים שונו',
'Indexes' => 'אינדקסים',
'Alter indexes' => 'שנה אינדקסים',
'Add next' => 'הוסף הבא',
'Language' => 'שפה',
'Select' => 'בחר',
'New item' => 'פריט חדש',
'Search' => 'חפש',
'Sort' => 'מיין',
'descending' => 'סדר הפוך',
'Limit' => 'הגבל',
'No rows.' => 'אין שורות',
'Action' => 'פעולות',
'edit' => 'ערוך',
'Page' => 'עמוד',
'Query executed OK, %d row(s) affected.' => 'השאילתה בוצעה כהלכה, %d שורות הושפעו',
'Error in query' => 'שגיאה בשאילתה',
'Execute' => 'הרץ',
'Table' => 'טבלה',
'Foreign keys' => 'מפתחות זרים',
'Triggers' => 'מפעילים',
'View' => 'הצג',
'Unable to select the table' => 'בחירת הטבלה נכשלה',
'Invalid CSRF token. Send the form again.' => 'כשל באבטחת נתונים, שלח טופס שוב',
'Comment' => 'הערה',
'Default values' => 'ערכי ברירת מחדל',
'%d byte(s)' => '%d בתים',
'No commands to execute.' => 'לא נמצאו פקודות להרצה',
'Unable to upload a file.' => 'העלאת הקובץ נכשלה',
'File upload' => 'העלה קובץ',
'File uploads are disabled.' => 'העלאת קבצים מבוטלת',
'Routine has been called, %d row(s) affected.' => 'הרוטינה נקראה, %d שורות הושפעו',
'Call' => 'קרא',
'No extension' => 'אין תוסף',
'None of the supported PHP extensions (%s) are available.' => 'שום תוסף PHP (%s) זמין',
'Session support must be enabled.' => 'חובה להפעיל תמיכה בסשן',
'Session expired, please login again.' => 'תם זמן ההפעלה, אנא התחבר שוב',
'Text length' => 'אורך הטקסט',
'Foreign key has been dropped.' => 'המפתח הזר הושלך',
'Foreign key has been altered.' => 'המפתח הזר שונה',
'Foreign key has been created.' => 'המפתח הזר נוצר',
'Foreign key' => 'מפתח זר',
'Target table' => 'טבלת יעד',
'Change' => 'שנה',
'Source' => 'מקור',
'Target' => 'יעד',
'Add column' => 'הוסף עמודה',
'Alter' => 'שנה',
'Add foreign key' => 'הוסף מפתח זר',
'ON DELETE' => 'בעת מחיקה',
'ON UPDATE' => 'בעת עידכון',
'Index Type' => 'סוג אינדקס',
'Column (length)' => 'עמודה (אורך)',
'View has been dropped.' => 'התצוגה הושלכה',
'View has been altered.' => 'התצוגה שונתה',
'View has been created.' => 'התצוגה נוצרה',
'Alter view' => 'שנה תצוגה',
'Create view' => 'צור תצוגה',
'Name' => 'שם',
'Process list' => 'רשימת תהליכים',
'%d process(es) have been killed.' => '%d תהליכים חוסלו',
'Kill' => 'חסל',
'Parameter name' => 'שם הפרמטר',
'Database schema' => 'סכמת מסד נתונים',
'Create procedure' => 'צור פרוצדורה',
'Create function' => 'צור פונקציה',
'Routine has been dropped.' => 'הרוטינה הושלכה',
'Routine has been altered.' => 'הרוטינה שונתה',
'Routine has been created.' => 'הרוטינה נוצרה',
'Alter function' => 'שנה פונקציה',
'Alter procedure' => 'שנה פרוצדורה',
'Return type' => 'סוג ערך מוחזר',
'Add trigger' => 'הוסף טריגר',
'Trigger has been dropped.' => 'הטריגר הושלך',
'Trigger has been altered.' => 'הטריגר שונה',
'Trigger has been created.' => 'הטריגר נוצר',
'Alter trigger' => 'שנה טריגר',
'Create trigger' => 'צור טריגר',
'Time' => 'זמן',
'Event' => 'אירוע',
'%d row(s)' => '%d שורות',
'Remove' => 'הסר',
'Are you sure?' => 'האם אתה בטוח?',
'Privileges' => 'פריווילגיות',
'Create user' => 'צור משתמש',
'User has been dropped.' => 'המשתמש הושלך',
'User has been altered.' => 'המשתמש שונה',
'User has been created.' => 'המשתמש נוצר',
'Hashed' => 'הצפנה',
'Column' => 'עמודה',
'Routine' => 'רוטינה',
'Grant' => 'הענק',
'Revoke' => 'שלול',
'%s version: %s through PHP extension %s' => '%s גרסה: %s דרך תוסף PHP %s',
'Logged as: %s' => 'מחובר כ: %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'מידע גדול מידי נשלח ב-POST. הקטן את את המידע הוא הגדלת את הגדרות ה-%s',
'Move up' => 'הזז למעלה',
'Move down' => 'הזז למטה',
'Export' => 'יצא',
'Tables' => 'טבלאות',
'Data' => 'נתונים',
'Output' => 'פלט',
'open' => 'פתח',
'save' => 'שמור',
'Format' => 'פורמט',
'Functions' => 'פונקציות',
'Aggregation' => 'צבירה',
'Event has been dropped.' => 'האירוע הושלך',
'Event has been altered.' => 'האירוע שונה',
'Event has been created.' => 'האירוע נוצר',
'Alter event' => 'שנה אירוע',
'Create event' => 'צור אירוע',
'Start' => 'התחלה',
'End' => 'סיום',
'Every' => 'כל',
'Status' => 'סטטוס',
'On completion preserve' => 'בעת סיום שמור',
'Events' => 'אירועים',
'Schedule' => 'תזמן',
'At given time' => 'לפי זמן נתון',
'Save and continue edit' => 'שמור והמשך לערוך',
'original' => 'מקורי',
'Tables have been truncated.' => 'הטבלה קוצרה',
'Tables have been moved.' => 'הטבלה הועברה',
'Tables have been dropped.' => 'הטבלה הושלכה',
'Tables and views' => 'טבלאות ותצוגות',
'Engine' => 'מנוע',
'Collation' => 'קולקציה',
'Data Length' => 'אורך נתונים',
'Index Length' => 'אורך אינדקס',
'Data Free' => 'נתונים משוחררים',
'Rows' => 'שורות',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'נתח',
'Optimize' => 'יעל',
'Check' => 'בדוק',
'Repair' => 'תקן',
'Truncate' => 'קצר',
'Move to other database' => 'העבר למסד נתונים אחר',
'Move' => 'העבר',
'%d item(s) have been affected.' => '%d פריטים הושפעו',
'Whole result' => 'כל התוצאות',
'Clone' => 'שכפל',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'הגעת למספר השדות המרבי. בבקשה הגדל את %s',
'Partition by' => 'מחיצות ע"י',
'Partitions' => 'מחיצות',
'Partition name' => 'שם מחיצה',
'Values' => 'ערכים',
'%d row(s) have been imported.' => '%d שורות יובאו',
'anywhere' => 'בכל מקום',
'Import' => 'יבא',
'Stop on error' => 'עצור בעת שגיאה',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$1-$3-$5',
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
'History' => 'היסטוריה',
'Variables' => 'משתנים',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'על עמודות המקור והיעד להיות מאותו טיפוס נתונים, חובה שיהיה אינדקס בעמודת היעד ושהמידע המתאים יהיה קיים',
'Relations' => 'הקשרים',
'Run file' => 'הרץ קובץ',
'Clear' => 'נקה',
'Maximum allowed file size is %sB.' => 'גודל מקסימלאי להעלאה: %sB',
'Numbers' => 'מספרים',
'Date and time' => 'תאריך ושעה',
'Strings' => 'מחרוזות',
'Binary' => 'בינארי',
'Lists' => 'רשימות',
'Editor' => 'עורך',
'E-mail' => 'דוא"ל',
'From' => 'מ:',
'Subject' => 'נושא',
'Send' => 'שלח',
'%d e-mail(s) have been sent.' => '%d הודעות דוא"ל נשלחו',
'Webserver file %s' => 'קובץ השרת %s',
'File does not exist.' => 'הקובץ אינו קיים',
'%d in total' => '%d בסך הכל',
'Permanent login' => 'התחבר לצמיתות',
'Databases have been dropped.' => 'מסד הנתונים הושלך',
'Database has been dropped.' => 'מסד הנתונים הושלך',
'Search data in tables' => 'חפש מידע בטבלאות',
'Schema' => 'סכמה',
'Alter schema' => 'שנה סכמה',
'Create schema' => 'צור סכמה',
'Schema has been dropped.' => 'הסכמה הושלכה',
'Schema has been created.' => 'הסכמה נוצרה',
'Schema has been altered.' => 'הסכמה שונתה',
'Sequences' => 'סדרות',
'Create sequence' => 'צור סדרה',
'Alter sequence' => 'שנה סדרה',
'Sequence has been dropped.' => 'הסדרה הושלכה',
'Sequence has been created.' => 'הסדרה נוצרה',
'Sequence has been altered.' => 'הסדרה שונתה',
'User types' => 'סוגי משתמשים',
'Create type' => 'צור סוג',
'Alter type' => 'שנה סוג',
'Type has been dropped.' => 'הסוג הושלך',
'Type has been created.' => 'הסוג נוצר',
'Use edit link to modify this value.' => 'השתמש בקישור העריכה בשביל לשנות את הערך',
'last' => 'אחרון',
'From server' => 'משרת',
'System' => 'מערכת',
'Select data' => 'בחר נתונים',
'Show structure' => 'הראה מבנה',
'empty' => 'ריק',
'Network' => 'רשת',
'Geometry' => 'גיאומטריה',
'File exists.' => 'קובץ קיים',
'Attachments' => 'קבצים מצורפים',
'Item%s has been inserted.' => 'הפריט %s הוזן בהצלחה',
'now' => 'כעת',
'%d query(s) executed OK.' => '%d שאילתות בוצעו בהצלחה',
'Show only errors' => 'הראה שגיאות בלבד',
'Refresh' => 'רענן',
'Invalid schema.' => 'סכמה שגויה',
'Please use one of the extensions %s.' => 'בבקשה השתמש באחד מהתוספים %s',
'ltr' => 'rtl',
'Tables have been copied.' => 'הטבלה הועתקה',
'Copy' => 'העתק',
'Permanent link' => 'קישור סופי',
'Edit all' => 'ערוך הכל',
'HH:MM:SS' => 'HH:MM:SS',
'Tables have been optimized.' => 'הטבלאות עברו אופטימיזציה',
'Materialized view' => 'תצוגת מימוש ',
'Vacuum' => 'וואקום',
'Selected' => 'נבחרים',
'Ctrl+click on a value to modify it.' => 'לחץ ctrl + לחיצת עכבר לערוך ערך זה',
'File must be in UTF-8 encoding.' => 'על הקובץ להיות בקידוד utf-8',
'Modify' => 'ערוך',
'Loading' => 'טוען',
'Load more data' => 'טען נתונים נוספים',
'ATTACH queries are not supported.' => 'שאילתת ATTACH אינה נתמכת',
'%d / ' => '%d / ',
'Limit rows' => 'הגבל שורות',
'Default value' => 'ערך ברירת מחדל',
'Full table scan' => 'סריקה טבלה מלאה',
'Too many unsuccessful logins, try again in %d minute(s).' => 'יותר מידי נסיונות כניסה נכשלו, אנא נסה עוד %d דקות',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'תודה שהשתמש ב-adminer אנא שקול <a href="https://www.adminer.org/en/donation/">לתרום</a>.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'סיסמת המאסטר פגה <a href="https://www.adminer.org/en/extension/"%s>התקן תוסף</a> על מנת להפוך את זה לתמידי',
'If you did not send this request from Adminer then close this page.' => 'אם לא אתה שלחת בקשה ל-Adminer הינך יכול לסגור חלון זה',
'You can upload a big SQL file via FTP and import it from server.' => 'ניתן לעלות קבצים ב-FTP ואז למשוך אותם מהשרת',
'Size' => 'גודל',
'Compute' => 'חישוב',
'You are offline.' => 'הינך לא מקוון',
'You have no privileges to update this table.' => 'אין לך ההרשאות המתאימות לעדכן טבלה זו',
'Saving' => 'שומר',
'yes' => 'כן',
'no' => 'לא',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Jelszó',
'Select database' => 'Adatbázis kiválasztása',
'Invalid database.' => 'Érvénytelen adatbázis.',
'Create new database' => 'Új adatbázis',
'Table has been dropped.' => 'A tábla eldobva.',
'Table has been altered.' => 'A tábla módosult.',
'Table has been created.' => 'A tábla létrejött.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'Adatbázis módosítása',
'Create database' => 'Adatbázis létrehozása',
'SQL command' => 'SQL parancs',
'Dump' => 'Exportálás',
'Logout' => 'Kilépés',
'database' => 'adatbázis',
'Use' => 'Használ',
'No tables.' => 'Nincs tábla.',
'select' => 'kiválasztás',
'Create new table' => 'Új tábla',
'Item has been deleted.' => 'A tétel törölve.',
'Item has been updated.' => 'A tétel frissítve.',
'Item%s has been inserted.' => '%s tétel beszúrva.',
@@ -180,6 +177,7 @@ $translations = array(
'Tables have been truncated.' => 'A tábla felszabadítva.',
'Rows' => 'Oszlop',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Táblák áthelyezve.',
'Move to other database' => 'Áthelyezés másik adatbázisba',
'Move' => 'Áthelyez',
@@ -187,7 +185,7 @@ $translations = array(
'Save and continue edit' => 'Mentés és szerkesztés folytatása',
'original' => 'eredeti',
'%d item(s) have been affected.' => array('%d tétel érintett.', '%d tétel érintett.', '%d tétel érintett.'),
'whole result' => 'összes eredményt mutatása',
'Whole result' => 'Összes eredményt mutatása',
'Tables have been dropped.' => 'Táblák eldobva.',
'Clone' => 'Klónoz',
'Partition by' => 'Particionálás ezzel',
@@ -199,7 +197,7 @@ $translations = array(
'Show structure' => 'Struktúra',
'Select data' => 'Tartalom',
'Stop on error' => 'Hiba esetén megáll',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'A maximális mezőszámot elérted. Növeld meg ezeket: %s, %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'A maximális mezőszámot elérted. Növeld meg ezeket: %s.',
'anywhere' => 'bárhol',
'%.3f s' => '%.3f másodperc',
'$1-$3-$5' => '$6.$4.$1',
@@ -239,7 +237,6 @@ $translations = array(
'Schema has been dropped.' => 'Séma eldobva.',
'Schema has been created.' => 'Séma létrejött.',
'Schema has been altered.' => 'Séma módosult.',
'schema' => 'séma',
'Schema' => 'Séma',
'Sequences' => 'Sorozatok',
'Create sequence' => 'Sorozat létrehozása',
@@ -258,7 +255,6 @@ $translations = array(
'now' => 'most',
'%d query(s) executed OK.' => '%d sikeres lekérdezés.',
'Show only errors' => 'Csak a hibák mutatása',
'Last page' => 'Utolsó oldal',
'Refresh' => 'Frissítés',
'Invalid schema.' => 'Érvénytelen séma.',
'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.',

View File

@@ -10,11 +10,11 @@ $translations = array(
'Logout' => 'Keluar',
'Logged as: %s' => 'Masuk sebagai: %s',
'Logout successful.' => 'Berhasil keluar.',
'Invalid credentials.' => 'Akses invalid.',
'Invalid credentials.' => 'Akses tidak sah.',
'Language' => 'Bahasa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invalid. Kirim ulang formulir.',
'No extension' => 'Ekstensi tidak tersedia',
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak tersedia.',
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Kirim ulang formulir.',
'No extension' => 'Ekstensi tidak ada',
'None of the supported PHP extensions (%s) are available.' => 'Ekstensi PHP yang didukung (%s) tidak ada.',
'Session support must be enabled.' => 'Dukungan sesi harus aktif.',
'Session expired, please login again.' => 'Sesi habis, silakan masuk lagi.',
'%s version: %s through PHP extension %s' => 'Versi %s: %s dengan ekstensi PHP %s',
@@ -44,29 +44,28 @@ $translations = array(
'SQL command' => 'Perintah SQL',
'%d query(s) executed OK.' => '%d kueri berhasil dijalankan.',
'Query executed OK, %d row(s) affected.' => 'Kueri berhasil, %d baris terpengaruh.',
'No commands to execute.' => 'Tiada perintah untuk dijalankan.',
'Error in query' => 'Kesalahan dalam kueri',
'No commands to execute.' => 'Tidak ada perintah untuk dijalankan.',
'Error in query' => 'Galat dalam kueri',
'Execute' => 'Jalankan',
'Stop on error' => 'Hentikan pada kesalahan',
'Show only errors' => 'Hanya tampilkan kesalahan',
'Stop on error' => 'Hentikan jika galat',
'Show only errors' => 'Hanya tampilkan galat',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Riwayat',
'Clear' => 'Bersihkan',
'Edit all' => 'Edit semua',
'Edit all' => 'Sunting semua',
'File upload' => 'Unggah berkas',
'From server' => 'Dari server',
'Webserver file %s' => 'Berkas server web %s',
'Run file' => 'Jalankan berkas',
'File does not exist.' => 'Berkas tidak ditemukan.',
'File does not exist.' => 'Berkas tidak ada.',
'File uploads are disabled.' => 'Pengunggahan berkas dimatikan.',
'Unable to upload a file.' => 'Tidak dapat mengunggah berkas.',
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %s bita.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar pengarah konfigurasi %s.',
'Maximum allowed file size is %sB.' => 'Besar berkas yang diizinkan adalah %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kurangi data atau perbesar direktif konfigurasi %s.',
'Export' => 'Ekspor',
'Dump' => 'Ekspor',
'Output' => 'Hasil',
'open' => 'buka',
'save' => 'simpan',
@@ -77,22 +76,22 @@ $translations = array(
'database' => 'basis data',
'Use' => 'Gunakan',
'Select database' => 'Pilih basis data',
'Invalid database.' => 'Basis data invalid.',
'Create new database' => 'Buat basis data baru',
'Invalid database.' => 'Basis data tidak sah.',
'Database has been dropped.' => 'Basis data berhasil dihapus.',
'Databases have been dropped.' => 'Basis data berhasil dihapus.',
'Database has been created.' => 'Basis data berhasil dibuat.',
'Database has been renamed.' => 'Basis data berhasil diganti nama.',
'Database has been renamed.' => 'Basis data berhasil diganti namanya.',
'Database has been altered.' => 'Basis data berhasil diubah.',
'Alter database' => 'Ubah basis data',
'Create database' => 'Buat basis data',
'Database schema' => 'Skema basis data',
// link to current database schema layout
'Permanent link' => 'Tautan permanen',
'Permanent link' => 'Pranala permanen',
// thousands separator - must contain single byte
',' => '.',
'0123456789' => '0123456789',
'Engine' => 'Mesin',
'Collation' => 'Kolasi',
'Data Length' => 'Panjang Data',
@@ -113,9 +112,9 @@ $translations = array(
'Tables have been copied.' => 'Tabel berhasil disalin.',
'Routines' => 'Rutin',
'Routine has been called, %d row(s) affected.' => array('Rutin telah dipanggil, %d baris terpengaruh.', 'Rutin telah dipanggil, %d baris terpengaruh'),
'Routine has been called, %d row(s) affected.' => 'Rutin telah dipanggil, %d baris terpengaruh.',
'Call' => 'Panggilan',
'Parameter name' => 'Nama paramater',
'Parameter name' => 'Nama parameter',
'Create procedure' => 'Buat prosedur',
'Create function' => 'Buat fungsi',
'Routine has been dropped.' => 'Rutin berhasil dihapus.',
@@ -123,14 +122,14 @@ $translations = array(
'Routine has been created.' => 'Rutin berhasil dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis balikan',
'Return type' => 'Jenis pengembalian',
'Events' => 'Peristiwa',
'Event has been dropped.' => 'Peristiwa berhasil dihapus.',
'Event has been altered.' => 'Peristiwa berhasil diubah.',
'Event has been created.' => 'Peristiwa berhasil dibuat.',
'Alter event' => 'Ubah peristiwa',
'Create event' => 'Buat peristiwa',
'Events' => 'Even',
'Event has been dropped.' => 'Even berhasil dihapus.',
'Event has been altered.' => 'Even berhasil diubah.',
'Event has been created.' => 'Even berhasil dibuat.',
'Alter event' => 'Ubah even',
'Create event' => 'Buat even',
'At given time' => 'Pada waktu tertentu',
'Every' => 'Setiap',
'Schedule' => 'Jadwal',
@@ -141,10 +140,9 @@ $translations = array(
'Tables' => 'Tabel',
'Tables and views' => 'Tabel dan tampilan',
'Table' => 'Tabel',
'No tables.' => 'Tiada tabel.',
'No tables.' => 'Tidak ada tabel.',
'Alter table' => 'Ubah tabel',
'Create table' => 'Buat tabel',
'Create new table' => 'Buat tabel baru',
'Table has been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been optimized.' => 'Tabel berhasil dioptimalkan.',
@@ -157,16 +155,16 @@ $translations = array(
'Column name' => 'Nama kolom',
'Type' => 'Jenis',
'Length' => 'Panjang',
'Auto Increment' => 'Kenaikan Otomatis',
'Auto Increment' => 'Inkrementasi Otomatis',
'Options' => 'Opsi',
'Comment' => 'Komentar',
'Default values' => 'Nilai bawaan',
'Drop' => 'Hapus',
'Are you sure?' => 'Anda yakin',
'Are you sure?' => 'Anda yakin?',
'Move up' => 'Naik',
'Move down' => 'Turun',
'Remove' => 'Hapus',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s dan %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Sudah lebih dumlah ruas maksimum yang diizinkan. Harap naikkan %s.',
'Partition by' => 'Partisi menurut',
'Partitions' => 'Partisi',
@@ -203,15 +201,15 @@ $translations = array(
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kolom sumber dan sasaran harus memiliki jenis data yang sama. Kolom sasaran harus memiliki indeks dan data rujukan harus ada.',
'Triggers' => 'Picu',
'Add trigger' => 'Tambah picu',
'Trigger has been dropped.' => 'Picu berhasil dihapus.',
'Trigger has been altered.' => 'Picu berhasil diubah.',
'Trigger has been created.' => 'Picu berhasil dibuat.',
'Alter trigger' => 'Ubah picu',
'Create trigger' => 'Buat picu',
'Triggers' => 'Pemicu',
'Add trigger' => 'Tambah pemicu',
'Trigger has been dropped.' => 'Pemicu berhasil dihapus.',
'Trigger has been altered.' => 'Pemicu berhasil diubah.',
'Trigger has been created.' => 'Pemicu berhasil dibuat.',
'Alter trigger' => 'Ubah pemicu',
'Create trigger' => 'Buat pemicu',
'Time' => 'Waktu',
'Event' => 'Peristiwa',
'Event' => 'Even',
'Name' => 'Nama',
'select' => 'pilih',
@@ -222,26 +220,25 @@ $translations = array(
'Search' => 'Cari',
'anywhere' => 'di mana pun',
'Search data in tables' => 'Cari data dalam tabel',
'Sort' => 'Urutan',
'Sort' => 'Urutkan',
'descending' => 'menurun',
'Limit' => 'Limit',
'Limit' => 'Batas',
'Text length' => 'Panjang teks',
'Action' => 'Tindakan',
'Full table scan' => 'Pindai tabel lengkap',
'Unable to select the table' => 'Gagal memilih tabel',
'No rows.' => 'Tiada baris.',
'No rows.' => 'Tidak ada baris.',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'terakhir',
'Last page' => 'Halaman terakhir',
'whole result' => 'Seluruh hasil',
'Whole result' => 'Seluruh hasil',
'%d byte(s)' => '%d bita',
'Import' => 'Impor',
'%d row(s) have been imported.' => '%d baris berhasil diimpor.',
// in-place editing in select
'Use edit link to modify this value.' => 'Gunakan tautan edit untuk mengubah nilai ini.',
'Use edit link to modify this value.' => 'Gunakan pranala suntingan untuk mengubah nilai ini.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
@@ -249,30 +246,30 @@ $translations = array(
'Item has been updated.' => 'Entri berhasil diperbarui.',
'%d item(s) have been affected.' => '%d entri terpengaruh.',
'New item' => 'Entri baru',
'original' => 'orisinal',
'original' => 'asli',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'edit',
'Edit' => 'Edit',
'edit' => 'sunting',
'Edit' => 'Sunting',
'Insert' => 'Sisipkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan terus mengedit',
'Save and insert next' => 'Simpan dan sisipkan yang lain',
'Save and continue edit' => 'Simpan dan lanjut menyunting',
'Save and insert next' => 'Simpan dan sisipkan berikutnya',
'Clone' => 'Gandakan',
'Delete' => 'Hapus',
'E-mail' => 'Surel',
'From' => 'Dari',
'Subject' => 'Subjek',
'Subject' => 'Judul',
'Attachments' => 'Lampiran',
'Send' => 'Kirim',
'%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
'%d e-mail(s) have been sent.' => '%d surel berhasil dikirim.',
// data type descriptions
'Numbers' => 'Angka',
'Date and time' => 'Tanggal dan waktu',
'Strings' => 'String',
'Binary' => 'Biner',
'Binary' => 'Binari',
'Lists' => 'Daftar',
'Network' => 'Jaringan',
'Geometry' => 'Geometri',
@@ -299,9 +296,8 @@ $translations = array(
'Schema has been dropped.' => 'Skema berhasil dihapus.',
'Schema has been created.' => 'Skema berhasil dibuat.',
'Schema has been altered.' => 'Skema berhasil diubah.',
'schema' => 'skema',
'Schema' => 'Skema',
'Invalid schema.' => 'Skema invalid.',
'Invalid schema.' => 'Skema tidak sah.',
// PostgreSQL sequences support
'Sequences' => 'Deret',

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Password',
'Select database' => 'Seleziona database',
'Invalid database.' => 'Database non valido.',
'Create new database' => 'Crea nuovo database',
'Table has been dropped.' => 'Tabella eliminata.',
'Table has been altered.' => 'Tabella modificata.',
'Table has been created.' => 'Tabella creata.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'Modifica database',
'Create database' => 'Crea database',
'SQL command' => 'Comando SQL',
'Dump' => 'Dump',
'Logout' => 'Esci',
'database' => 'database',
'Use' => 'Usa',
'No tables.' => 'No tabelle.',
'select' => 'seleziona',
'Create new table' => 'Crea nuova tabella',
'Item has been deleted.' => 'Elemento eliminato.',
'Item has been updated.' => 'Elemento aggiornato.',
'Item%s has been inserted.' => 'Elemento%s inserito.',
@@ -180,6 +177,7 @@ $translations = array(
'Data Free' => 'Dati liberi',
'Rows' => 'Righe',
',' => '.',
'0123456789' => '0123456789',
'Analyze' => 'Analizza',
'Optimize' => 'Ottimizza',
'Check' => 'Controlla',
@@ -188,9 +186,9 @@ $translations = array(
'Move to other database' => 'Sposta in altro database',
'Move' => 'Sposta',
'%d item(s) have been affected.' => array('Il risultato consiste in %d elemento.', 'Il risultato consiste in %d elementi.'),
'whole result' => 'intero risultato',
'Whole result' => 'Intero risultato',
'Clone' => 'Clona',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Troppi campi. Per favore aumentare %s e %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Troppi campi. Per favore aumentare %s.',
'Partition by' => 'Partiziona per',
'Partitions' => 'Partizioni',
'Partition name' => 'Nome partizione',
@@ -226,7 +224,6 @@ $translations = array(
'Permanent login' => 'Login permanente',
'Databases have been dropped.' => 'Database eliminati.',
'Search data in tables' => 'Cerca nelle tabelle',
'schema' => 'schema',
'Schema' => 'Schema',
'Alter schema' => 'Modifica schema',
'Create schema' => 'Crea schema',
@@ -258,7 +255,6 @@ $translations = array(
'Attachments' => 'Allegati',
'%d query(s) executed OK.' => array('%d query eseguita con successo.', '%d query eseguite con successo.'),
'Show only errors' => 'Mostra solo gli errori',
'Last page' => 'Ultima pagina',
'Refresh' => 'Aggiorna',
'Invalid schema.' => 'Schema non valido.',
'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.',

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'パスワード',
'Select database' => 'データベースを選択してください',
'Invalid database.' => '不正なデータベース',
'Create new database' => '新規にデータベースを作成',
'Table has been dropped.' => 'テーブルを削除しました',
'Table has been altered.' => 'テーブルを変更しました',
'Table has been created.' => 'テーブルを作成しました',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'データベースを変更',
'Create database' => 'データベースを作成',
'SQL command' => 'SQLコマンド',
'Dump' => 'ダンプ',
'Logout' => 'ログアウト',
'database' => 'データベース',
'Use' => '使用',
'No tables.' => 'テーブルがありません。',
'select' => '選択',
'Create new table' => 'テーブルを作成',
'Item has been deleted.' => '項目を削除しました',
'Item has been updated.' => '項目を更新しました',
'Edit' => '編集',
@@ -176,20 +173,21 @@ $translations = array(
'Data Free' => '空き',
'Rows' => '行数',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '分析',
'Optimize' => '最適化',
'Check' => 'チェック',
'Repair' => '修復',
'Truncate' => 'Truncate',
'Truncate' => '空にする',
'Move to other database' => '別のデータベースへ移動',
'Move' => '移動',
'Save and continue edit' => '保存して継続',
'original' => '元',
'%d item(s) have been affected.' => '%d を更新しました',
'whole result' => '全結果',
'Whole result' => '全結果',
'Tables have been dropped.' => 'テーブルを削除しました',
'Clone' => 'クローン',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '定義可能な最大フィールド数を越えました。%s と %s を増やしてください。',
'Maximum number of allowed fields exceeded. Please increase %s.' => '定義可能な最大フィールド数を越えました。%s を増やしてください。',
'Partition by' => 'パーティション',
'Partitions' => 'パーティション',
'Partition name' => 'パーティション名',
@@ -227,7 +225,6 @@ $translations = array(
'Permanent login' => '永続的にログイン',
'Databases have been dropped.' => 'データベースを削除しました',
'Search data in tables' => 'データを検索する',
'schema' => 'スキーマ',
'Schema' => 'スキーマ',
'Alter schema' => 'スキーマ変更',
'Create schema' => 'スキーマ追加',
@@ -258,7 +255,6 @@ $translations = array(
'now' => '現在の日時',
'%d query(s) executed OK.' => '%d クエリーを実行しました',
'Show only errors' => 'エラーのみ表示',
'Last page' => '最後のページ',
'Refresh' => 'リフレッシュ',
'Invalid schema.' => '無効なスキーマ',
'Please use one of the extensions %s.' => 'いずれかの拡張機能を使ってください %s',
@@ -268,4 +264,14 @@ $translations = array(
'Permanent link' => 'パーマネントリンク',
'Edit all' => 'すべて編集',
'HH:MM:SS' => '時:分:秒',
'Selected' => '選択済',
'Modify' => '修正',
'Load more data' => '続きを読み込み',
'Loading' => '読み込み中',
'Size' => 'サイズ',
'Compute' => '算出',
'Saving' => '保存中',
'yes' => 'はい',
'no' => 'いいえ',
'Default value' => '既定値',
);

303
adminer/lang/ka.inc.php Normal file
View File

@@ -0,0 +1,303 @@
<?php
$translations = array(
'Login' => 'შესვლა',
'Logout successful.' => 'გამოხვედით სისტემიდან.',
'Invalid credentials.' => 'არასწორი მომხმარებელი ან პაროლი.',
'Server' => 'სერვერი',
'Username' => 'მომხმარებელი',
'Password' => 'პაროლი',
'Select database' => 'ბაზა',
'Invalid database.' => 'არასწორი ბაზა.',
'Table has been dropped.' => 'ცხრილი წაიშალა.',
'Table has been altered.' => 'ცხრილი შეიცვალა.',
'Table has been created.' => 'ცხრილი შეიქმნა.',
'Alter table' => 'ცხრილის შეცვლა',
'Create table' => 'ცხრილის შექმნა',
'Table name' => 'სახელი',
'engine' => 'სახეობა',
'collation' => 'კოდირება',
'Column name' => 'ველი',
'Type' => 'სახეობა',
'Length' => 'სიგრძე',
'Auto Increment' => 'ავტომატურად გაზრდა',
'Options' => 'მოქმედება',
'Save' => 'შენახვა',
'Drop' => 'წაშლა',
'Database has been dropped.' => 'ბაზა წაიშალა.',
'Database has been created.' => 'ბაზა შეიქმნა.',
'Database has been renamed.' => 'ბაზას გადაერქვა.',
'Database has been altered.' => 'ბაზა შეიცვალა.',
'Alter database' => 'ბაზის შეცვლა',
'Create database' => 'ბაზის შექმნა',
'SQL command' => 'SQL-ბრძანება',
'Logout' => 'გასვლა',
'database' => 'ბაზა',
'Use' => 'არჩევა',
'No tables.' => 'ბაზაში ცხრილი არაა.',
'select' => 'არჩევა',
'Item has been deleted.' => 'ჩანაწერი წაიშალა.',
'Item has been updated.' => 'ჩანაწერი განახლდა.',
'Item%s has been inserted.' => 'ჩანაწერი%s ჩაჯდა.',
'Edit' => 'შეცვლა',
'Insert' => 'ჩასმა',
'Save and insert next' => 'შენახვა და სხვის ჩასმა',
'Delete' => 'წაშლა',
'Database' => 'ბაზა',
'Indexes have been altered.' => 'შეიცვალა ინდექსები.',
'Indexes' => 'ინდექსები',
'Alter indexes' => 'ინდექსის შეცვლა',
'Add next' => 'კიდევ დამატება',
'Language' => 'ენა',
'Select' => 'არჩევა',
'New item' => 'ახალი ჩანაწერი',
'Search' => 'ძებნა',
'Sort' => 'დალაგება',
'descending' => 'კლებადობით',
'Limit' => 'ზღვარი',
'No rows.' => 'ჩანაწერი არაა.',
'Action' => 'მოქმედება',
'edit' => 'რედაქტირება',
'Page' => 'გვერდი',
'Query executed OK, %d row(s) affected.' => 'მოთხოვდა შესრულდა, შეიცვალა %d ჩანაწერი.',
'Error in query' => 'შეცდომა მოთხოვნაში',
'Execute' => 'შესრულება',
'Table' => 'ცხრილი',
'Foreign keys' => 'გარე გასაღები',
'Triggers' => 'ტრიგერები',
'View' => 'ნახვა',
'Unable to select the table' => 'ცხრილიდან ინფორმაცია ვერ მოვიპოვე',
'Invalid CSRF token. Send the form again.' => 'უმოქმედო CSRF-ტოკენი. ფორმის კიდევ ერთხელ გაგზავნა.',
'Comment' => 'კომენტარები',
'Default values' => 'სტანდარტული მნიშვნელობა',
'%d byte(s)' => '%d ბაიტი',
'No commands to execute.' => 'შესასრულებელი ბრძანება არაა.',
'Unable to upload a file.' => 'ფაილი არ აიტვირთა სერვერზე.',
'File upload' => 'ფაილის ატვირთვა სერვერზე',
'File uploads are disabled.' => 'ფაილის სერვერზე ატვირთვა გათიშულია.',
'Routine has been called, %d row(s) affected.' => 'გამოძახებულია პროცედურა, შეიცვალა %d ჩანაწერი.',
'Call' => 'გამოძახეება',
'No extension' => 'გაფართოება არაა',
'None of the supported PHP extensions (%s) are available.' => 'არც ერთი მხარდაჭერილი გაფართოება არ მოიძებნა (%s).',
'Session support must be enabled.' => 'ჩართული უნდა იყოს სესია.',
'Session expired, please login again.' => 'სესიის მოქმედების დრო ამოიწურა, გაიარეთ ხელახალი ავტორიზაცია.',
'Text length' => 'ტექსტის სიგრძე',
'Foreign key has been dropped.' => 'გარე გასაღები წაიშალა.',
'Foreign key has been altered.' => 'გარე გასაღები შეიცვალა.',
'Foreign key has been created.' => 'გარე გასაღები შეიქმნა.',
'Foreign key' => 'გარე გასაღები',
'Change' => 'შეცვლა',
'Source' => 'წყარო',
'Target' => 'სამიზნე',
'Add column' => 'ველის დამატება',
'Alter' => 'შეცვლა',
'Add foreign key' => 'გარე გასაღები დამატება',
'ON DELETE' => 'წაშლისას',
'ON UPDATE' => 'განახლებისას',
'Index Type' => 'ინდექსის სახეობა',
'Column (length)' => 'ველი (სიგრძე)',
'View has been dropped.' => 'წარმოდგენა წაიშალა.',
'View has been altered.' => 'წარმოდგენა შეიცვალა.',
'View has been created.' => 'წარმოდგენა შეიქმნა.',
'Alter view' => 'წარმოდგენის შეცვლა',
'Create view' => 'წარმოდგენის შექმნა',
'Name' => 'სახელი',
'Process list' => 'პროცესების სია',
'%d process(es) have been killed.' => 'გაითიშა %d პროცესი.',
'Kill' => 'დასრულება',
'Parameter name' => 'პარამეტრი',
'Database schema' => 'ბაზის სქემა',
'Create procedure' => 'პროცედურის შექმნა',
'Create function' => 'ფუნქციის შექმნა',
'Routine has been dropped.' => 'პროცედურა წაიშალა.',
'Routine has been altered.' => 'პროცედურა შეიცვალა.',
'Routine has been created.' => 'პროცედურა შეიქმნა.',
'Alter function' => 'ფუნქციის შეცვლა',
'Alter procedure' => 'პროცედურის შეცვლა',
'Return type' => 'დაბრუნების სახეობა',
'Add trigger' => 'ტრიგერის დამატება',
'Trigger has been dropped.' => 'ტრიგერი წაიშალა.',
'Trigger has been altered.' => 'ტრიგერი შეიცვალა.',
'Trigger has been created.' => 'ტრიგერი შეიქმნა.',
'Alter trigger' => 'ტრიგერის შეცვლა',
'Create trigger' => 'ტრიგერის შექმნა',
'Time' => 'დრო',
'Event' => 'ღონისძიება',
'%s version: %s through PHP extension %s' => 'ვერსია %s: %s PHP-გაფართოება %s',
'%d row(s)' => '%d რიგი',
'Remove' => 'წაშლა',
'Are you sure?' => 'ნამდვილად?',
'Privileges' => 'უფლებამოსილება',
'Create user' => 'მომხმარებლის შექმან',
'User has been dropped.' => 'მომხმარებელი წაიშალა.',
'User has been altered.' => 'მომხმარებელი შეიცვალა.',
'User has been created.' => 'მომხმარებელი შეიქმნა.',
'Hashed' => 'ჰეშირებული',
'Column' => 'ველი',
'Routine' => 'პროცედურა',
'Grant' => 'დაშვება',
'Revoke' => 'შეზღუდვა',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST ინფორმაცია ძალიან დიდია. შეამცირეთ ზომა ან გაზარდეს POST ინფორმაციის ზომა პარამეტრებიდან %s.',
'Logged as: %s' => 'შესული ხართ როგორც: %s',
'Move up' => 'ზემოთ ატანა',
'Move down' => 'ქვემოთ ჩატანა',
'Functions' => 'ფუნქციები',
'Aggregation' => 'აგრეგაცია',
'Export' => 'ექსპორტი',
'Output' => 'გამომავალი ინფორმაცია',
'open' => 'გახსნა',
'save' => 'შენახვა',
'Format' => 'ფორმატი',
'Tables' => 'ცხრილები',
'Data' => 'ინფორმაცია',
'Event has been dropped.' => 'ღონისძიება წაიშალა.',
'Event has been altered.' => 'ღონისძიება შეიცვალა.',
'Event has been created.' => 'ღონისძიება შეიქმნა.',
'Alter event' => 'ღონისძიების შეცვლა',
'Create event' => 'ღონისძიების შექმნა',
'At given time' => 'მოცემულ დროში',
'Every' => 'ყოველ',
'Events' => 'ღონისძიება',
'Schedule' => 'განრიგი',
'Start' => 'დასაწყისი',
'End' => 'დასასრული',
'Status' => 'მდგომარეობა',
'On completion preserve' => 'შენახვა დასრულებისას',
'Tables and views' => 'ცხრილები და წარმოდგენები',
'Data Length' => 'ინფორმაციის მოცულობა',
'Index Length' => 'ინდექსების მოცულობა',
'Data Free' => 'თავისუფალი სივრცე',
'Collation' => 'კოდირება',
'Analyze' => 'ანალიზი',
'Optimize' => 'ოპტიმიზაცია',
'Check' => 'შემოწმება',
'Repair' => 'გასწორება',
'Truncate' => 'გასუფთავება',
'Tables have been truncated.' => 'ცხრილი გასუფთავდა.',
'Rows' => 'რიგი',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'ცხრილი გადაადგილდა.',
'Move to other database' => 'გადატანა სხვა ბაზაში',
'Move' => 'გადატანა',
'Engine' => 'ძრავი',
'Save and continue edit' => 'შენახვა და ცვლილების გაგრძელება',
'original' => 'საწყისი',
'%d item(s) have been affected.' => 'შეიცვალა %d ჩანაწერი.',
'Whole result' => 'სრული შედეგი',
'Tables have been dropped.' => 'ცხრილები წაიშალა.',
'Clone' => 'კლონირება',
'Partition by' => 'დაყოფა',
'Partitions' => 'დანაყოფები',
'Partition name' => 'დანაყოფის სახელი',
'Values' => 'პარამეტრები',
'%d row(s) have been imported.' => 'დაიმპორტდა %d რიგი.',
'Import' => 'იმპორტი',
'Stop on error' => 'გაჩერება შეცდომისას',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'მიღწეულია დაშვებული ველების მაქსიმალური რაოდენობა, გაზარდეთ %s.',
'anywhere' => 'ნებისმიერ ადგილას',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'დდ.თთ.[წწწწ]',
'History' => 'ისტორია',
'Variables' => 'ცვლადები',
'Relations' => 'ურთიერთობა',
'Run file' => 'ფაილის გაშვება',
'Clear' => 'გასუფთავება',
'Maximum allowed file size is %sB.' => 'ფაილის მაქსიმალური ზომა - %sB.',
'Numbers' => 'ციფრები',
'Date and time' => 'დრო და თარიღი',
'Binary' => 'ორობითი',
'Lists' => 'სია',
'Editor' => 'რედაქტორი',
'E-mail' => 'ელ. ფოსტა',
'From' => 'ავტორი:',
'Subject' => 'თემა',
'Send' => 'გაგზავნა',
'%d e-mail(s) have been sent.' => 'გაიგზავნა %d წერილი.',
'Webserver file %s' => 'ფაილი %s ვებსერვერზე',
'File does not exist.' => 'ასეთი ფაილი არ არსებობს.',
'%d in total' => 'სულ %d',
'Permanent login' => 'სისტემაში დარჩენა',
'Databases have been dropped.' => 'ბაზა წაიშალა.',
'Search data in tables' => 'ცხრილებში ძებნა',
'Schema' => 'სქემა',
'Alter schema' => 'სქემის შეცვლა',
'Create schema' => 'ახალი სქემა',
'Schema has been dropped.' => 'სქემა წაიშალა.',
'Schema has been created.' => 'შეიქმნა ახალი სქემა.',
'Schema has been altered.' => 'სქემა შეიცვალა.',
'Sequences' => 'მიმდევრობა',
'Create sequence' => 'მიმდევრობის შექმნა',
'Alter sequence' => 'მიმდევრობის შეცვლა',
'Sequence has been dropped.' => 'მიმდევრობა წაიშალა.',
'Sequence has been created.' => 'მიმდევრობა შეიქმნა.',
'Sequence has been altered.' => 'მიმდევრობა შეიცვალა.',
'User types' => 'მომხმარებლის სახეობა',
'Create type' => 'სახეობის შექმნა',
'Alter type' => 'სახეობის შეცვლა',
'Type has been dropped.' => 'სახეობა წაიშალა.',
'Type has been created.' => 'სახეობა შეიქმნა.',
'Ctrl+click on a value to modify it.' => 'შესაცვლელად გამოიყენეთ Ctrl+თაგვის ღილაკი.',
'Use edit link to modify this value.' => 'ამ მნიშვნელობის შესაცვლელად გამოიყენეთ ბმული «შეცვლა».',
'last' => 'ბოლო',
'From server' => 'სერვერიდან',
'System' => 'სისტემა',
'Select data' => 'არჩევა',
'Show structure' => 'სტრუქტურის ჩვენება',
'empty' => 'ცარიელი',
'Network' => 'ქსელი',
'Geometry' => 'გეომეტრია',
'File exists.' => 'ფაილი უკვე არსებობს.',
'Attachments' => 'მიმაგრებული ფაილები',
'%d query(s) executed OK.' => '%d მოთხოვნა შესრულდა.',
'Show only errors' => 'მხოლოდ შეცდომები',
'Refresh' => 'განახლება',
'Invalid schema.' => 'არასწორი სქემა.',
'Please use one of the extensions %s.' => 'გამოიყენეთ ერთ-ერთი გაფართოება %s.',
'now' => 'ახლა',
'ltr' => 'ltr',
'Tables have been copied.' => 'ცხრილი დაკოპირდა.',
'Copy' => 'კოპირება',
'Permanent link' => 'მუდმივი ბმული',
'Edit all' => 'ყველას შეცვლა',
'HH:MM:SS' => 'სთ:წთ:წმ',
'Tables have been optimized.' => 'ცხრილებს გაუკეთდა ოპტიმიზაცია.',
'Materialized view' => 'მატერიალური ხედი',
'Vacuum' => 'ვაკუუმი',
'Selected' => 'არჩეული',
'File must be in UTF-8 encoding.' => 'ფაილი უნდა იყოს კოდირებაში UTF-8.',
'Modify' => 'შეცვლა',
'Loading' => 'ჩატვირთვა',
'Load more data' => 'მეტი ინფორმაციის ჩატვირთვა',
'ATTACH queries are not supported.' => 'ATTACH-მოთხოვნები არაა მხარდაჭერილი.',
'%d / ' => '%d / ',
'Limit rows' => 'რიგების შეზღუდვა',
'Default value' => 'სტანდარტული მნიშვნელობა',
'Full table scan' => 'სრული ცხრილის ანალიზი',
'Too many unsuccessful logins, try again in %d minute(s).' => 'ძალიან ბევრჯერ შეგეშალათ მომხმარებელი და პაროლი. სცადეთ %d წუთში.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'ძირითად პაროლს ვადა გაუვიდა. <a href="https://www.adminer.org/en/extension/"%s>გამოიყენეთ</a> მეთოდი %s, რათა ის მუდმივი გახადოთ.',
'If you did not send this request from Adminer then close this page.' => 'ეს მოთხოვნა თქვენ თუ არ გაგიგზავნაით Adminer-იდან, დახურეთ ეს ფანჯარა..',
'You can upload a big SQL file via FTP and import it from server.' => 'დიდი ფაილი უნდა ატვირტოთ FTP-თი და შემდეგ გაუკეთოთ იმპორტი სერვერიდან.',
'Size' => 'ზომა',
'Compute' => 'გამოთვლა',
'You are offline.' => 'არ გაგივლიათ ავტორიზაცია.',
'You have no privileges to update this table.' => 'ამ ცხრილის განახლების უფლება არ გაქვთ.',
'Saving' => 'შენახვა',
'yes' => 'კი',
'no' => 'არა',
'Routines' => 'რუტინები',
'Target table' => 'მიზნობრივი ცხრილი',
'Strings' => 'ველები',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'საწყისი და მიზნობრივი ველები უნდა იყოს ერთიდაიგივე სახეობის, მიზნობრივ ველზე უნდა იყოს ინდექსი და უნდა არსებობდეს შესაბამისი ინფორმაცია.',
'Drop %s?' => 'წაიშალოს %s?',
'Warnings' => 'გაფრთხილება',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'უპაროლო წვდომა ბაზასთან არაა დაშვებული Adminer-ში, მეტი ინფორმაციისთვის ეწვიეთ <a href="https://www.adminer.org/en/password/"%s>ბმულს</a>.',
'DB' => 'ბაზა',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'მადლობას გიხდით Adminer-ით სარგებლობისთვის, გადახედეთ ბმულს <a href="https://www.adminer.org/en/donation/">შემოწირულობა</a>.',
'The action will be performed after successful login with the same credentials.' => 'მოქმედება შესრულდება იგივე მომხმარებლით წარმატებული ავტორიზაციის შემდეგ.',
'Connecting to privileged ports is not allowed.' => 'პრივილეგირებულ პორტთან წვდომა დაუშვებელია.',
'There is a space in the input password which might be the cause.' => 'პაროლში არის გამოტოვება, შეიძლება ეს ქმნის პრობლემას.',
'Unknown error.' => 'უცნობი შეცდომა.',
'Database does not support password.' => 'ბაზაში არაა მხარდაჭერილი პაროლი.',
'Disable %s or enable %s or %s extensions.' => 'გათიშეთ %s ან ჩართეთ %s ან %s გაფართოება.',
);

267
adminer/lang/ko.inc.php Normal file
View File

@@ -0,0 +1,267 @@
<?php
$translations = array(
'Login' => '로그인',
'Logout successful.' => '로그아웃',
'Invalid credentials.' => '잘못된 로그인',
'Server' => '서버',
'Username' => '사용자이름',
'Password' => '비밀번호',
'Select database' => '데이터베이스를 선택하십시오.',
'Invalid database.' => '잘못된 데이터베이스입니다.',
'Table has been dropped.' => '테이블을 삭제했습니다.',
'Table has been altered.' => '테이블을 변경했습니다.',
'Table has been created.' => '테이블을 만들었습니다.',
'Alter table' => '테이블 변경',
'Create table' => '테이블 만들기',
'Table name' => '테이블 이름',
'engine' => '엔진',
'collation' => '정렬',
'Column name' => '열 이름',
'Type' => '형',
'Length' => '길이',
'Auto Increment' => '자동증가',
'Options' => '설정',
'Save' => '저장',
'Drop' => '삭제',
'Database has been dropped.' => '데이터베이스를 삭제했습니다.',
'Database has been created.' => '데이터베이스를 만들었습니다.',
'Database has been renamed.' => '데이터베이스의 이름을 바꾸었습니다.',
'Database has been altered.' => '데이터베이스를 변경했습니다.',
'Alter database' => '데이터베이스 변경',
'Create database' => '데이터베이스 만들기',
'SQL command' => 'SQL 명령',
'Logout' => '로그아웃',
'database' => '데이터베이스',
'Use' => '사용',
'No tables.' => '테이블이 없습니다.',
'select' => '선택',
'Item has been deleted.' => '항목을 삭제했습니다.',
'Item has been updated.' => '항목을 갱신했습니다.',
'Edit' => '편집',
'Insert' => '삽입',
'Save and insert next' => '저장하고 다음에 추가',
'Delete' => '삭제',
'Database' => '데이터베이스',
'Routines' => '루틴',
'Indexes have been altered.' => '인덱스를 변경했습니다.',
'Indexes' => '색인',
'Alter indexes' => '인덱스 변경',
'Add next' => '추가',
'Language' => '언어',
'Select' => '선택',
'New item' => '항목 만들기',
'Search' => '검색',
'Sort' => '정렬',
'descending' => '역순',
'Limit' => '제약',
'No rows.' => '행이 없습니다.',
'Action' => '실행',
'edit' => '편집',
'Page' => '페이지',
'Query executed OK, %d row(s) affected.' => '쿼리를 실행했습니다. %d 행을 변경했습니다.',
'Error in query' => '쿼리의 오류',
'Execute' => '실행',
'Table' => '테이블',
'Foreign keys' => '외부 키',
'Triggers' => '트리거',
'View' => '보기',
'Unable to select the table' => '테이블을 선택할 수 없습니다.',
'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰. 다시 보내주십시오.',
'Comment' => '코멘트',
'Default values' => '기본값',
'%d byte(s)' => '%d 바이트',
'No commands to execute.' => '실행할 수 있는 명령이 없습니다.',
'Unable to upload a file.' => '파일을 업로드 할 수 없습니다.',
'File upload' => '파일 올리기',
'File uploads are disabled.' => '파일 업로드가 잘못되었습니다.',
'Routine has been called, %d row(s) affected.' => '루틴을 호출했습니다. %d 행을 변경했습니다.',
'Call' => '외침',
'No extension' => '확장 기능이 없습니다.',
'None of the supported PHP extensions (%s) are available.' => 'PHP 확장 (%s)가 설치되어 있지 않습니다.',
'Session support must be enabled.' => '세션을 사용하십시오.',
'Session expired, please login again.' => '세션 만료. 다시 로그인하십시오.',
'Text length' => '문자열의 길이',
'Foreign key has been dropped.' => '외부 키를 제거했습니다.',
'Foreign key has been altered.' => '외부 키를 변경했습니다.',
'Foreign key has been created.' => '외부 키를 만들었습니다.',
'Foreign key' => '외부 키',
'Target table' => '테이블',
'Change' => '변경',
'Source' => '소스',
'Target' => '타겟',
'Add column' => '열 추가',
'Alter' => '변경',
'Add foreign key' => '외부 키를 추가',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '인덱스 형',
'Column (length)' => '열 (길이)',
'View has been dropped.' => '보기를 삭제했습니다.',
'View has been altered.' => '보기를 변경했습니다.',
'View has been created.' => '보기를 만들었습니다.',
'Alter view' => '보기 변경',
'Create view' => '뷰 만들기',
'Name' => '이름',
'Process list' => '프로세스 목록',
'%d process(es) have been killed.' => '%d 프로세스를 강제 종료되었습니다.',
'Kill' => '강제 종료',
'Parameter name' => '참조 여명',
'Database schema' => '구조',
'Create procedure' => '시저 만들기',
'Create function' => '함수 만들기',
'Routine has been dropped.' => '루틴 만들기',
'Routine has been altered.' => '루틴 변경',
'Routine has been created.' => '루틴 만들기',
'Alter function' => '함수의 변경',
'Alter procedure' => '시저 변경',
'Return type' => '반환 형식',
'Add trigger' => '트리거 추가',
'Trigger has been dropped.' => '트리거를 제거했습니다.',
'Trigger has been altered.' => '트리거를 변경했습니다.',
'Trigger has been created.' => '트리거를 추가했습니다.',
'Alter trigger' => '트리거 변경',
'Create trigger' => '트리거 만들기',
'Time' => '시간',
'Event' => '이벤트',
'%s version: %s through PHP extension %s' => '%s 버전 %s, PHP 확장 %s',
'%d row(s)' => '%d 행',
'Remove' => '제외',
'Are you sure?' => '실행 하시겠습니까?',
'Privileges' => '권한',
'Create user' => '사용자 만들기',
'User has been dropped.' => '사용자 삭제',
'User has been altered.' => '사용자 변경',
'User has been created.' => '사용자 만들기',
'Hashed' => 'Hashed',
'Column' => '열',
'Routine' => '루틴',
'Grant' => '권한 부여',
'Revoke' => '권한 취소',
'Logged as: %s' => '로그 : %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
'Move up' => '상',
'Move down' => '아래',
'Export' => '내보내기',
'Tables' => '테이블',
'Data' => '데이터',
'Output' => '출력',
'open' => '열',
'save' => '저장',
'Format' => '형식',
'Functions' => '함수',
'Aggregation' => '집합',
'Event has been dropped.' => '삭제했습니다.',
'Event has been altered.' => '변경했습니다.',
'Event has been created.' => '만들었습니다.',
'Alter event' => '변경',
'Create event' => '만들기',
'Start' => '시작',
'End' => '종료',
'Every' => '매번',
'Status' => '상태',
'On completion preserve' => '완성 후 저장',
'Events' => '이벤트',
'Schedule' => '일정',
'At given time' => '지정 시간',
'Tables have been truncated.' => '테이블을 truncate했습니다.',
'Tables have been moved.' => '테이블을 옮겼습니다.',
'Tables and views' => '테이블과 뷰',
'Engine' => '엔진',
'Collation' => '정렬',
'Data Length' => '데이터 길이',
'Index Length' => '인덱스 길이',
'Data Free' => '여유',
'Rows' => '행',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => '분석',
'Optimize' => '최적화',
'Check' => '확인',
'Repair' => '복구',
'Truncate' => 'Truncate',
'Move to other database' => '다른 데이터베이스로 이동',
'Move' => '이동',
'Save and continue edit' => '저장하고 계속',
'original' => '원래',
'%d item(s) have been affected.' => '%d를 갱신했습니다.',
'Whole result' => '모든 결과',
'Tables have been dropped.' => '테이블을 삭제했습니다.',
'Clone' => '복제',
'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s를 늘리십시오.',
'Partition by' => '파티션',
'Partitions' => '파티션',
'Partition name' => '파티션 이름',
'Values' => '값',
'%d row(s) have been imported.' => '%d 행을 가져 왔습니다.',
'Show structure' => '구조',
'anywhere' => '모든',
'Import' => '가져 오기',
'Stop on error' => '오류의 경우 중지',
'Select data' => '데이터',
'%.3f s' => '%.3f 초',
'$1-$3-$5' => '$1-$3-$5',
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
'History' => '역사',
'Variables' => '변수',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '원본 및 대상 열은 동일한 데이터 형식이어야합니다. 목표 컬럼에 인덱스와 데이터가 존재해야합니다.',
'Relations' => '관계',
'Run file' => '파일을 실행',
'Clear' => '삭제',
'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB',
'Numbers' => '숫자',
'Date and time' => '시간',
'Strings' => '문자열',
'Binary' => '이진',
'Lists' => '목록',
'Editor' => '에디터',
'E-mail' => '메일',
'From' => '보낸 사람',
'Subject' => '제목',
'Send' => '보내기',
'%d e-mail(s) have been sent.' => '%d 메일을 보냈습니다.',
'Webserver file %s' => 'Web 서버 파일 %s',
'File does not exist.' => '파일이 존재하지 않습니다.',
'%d in total' => '총 %d',
'Permanent login' => '영구적으로 로그인',
'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
'Search data in tables' => '데이터 검색',
'Schema' => '스키마',
'Alter schema' => '스키마 변경',
'Create schema' => '스키마 추가',
'Schema has been dropped.' => '스키마를 삭제했습니다.',
'Schema has been created.' => '스키마를 추가했습니다.',
'Schema has been altered.' => '스키마를 변경했습니다.',
'Sequences' => '시퀀스',
'Create sequence' => '시퀀스 만들기',
'Alter sequence' => '순서 변경',
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
'Sequence has been created.' => '시퀀스를 추가했습니다.',
'Sequence has been altered.' => '순서를 변경했습니다.',
'User types' => '사용자 정의 형',
'Create type' => '사용자 정의 형식 만들기',
'Alter type' => '사용자 정의 형식 변경',
'Type has been dropped.' => '사용자 정의 형식을 삭제했습니다.',
'Type has been created.' => '사용자 정의 형식을 추가했습니다.',
'Use edit link to modify this value.' => '링크 편집',
'last' => '마지막',
'From server' => '서버에서 실행',
'System' => '데이터베이스 형식',
'empty' => '하늘',
'Network' => '네트워크 형',
'Geometry' => '기하 형',
'File exists.' => '파일이 이미 있습니다.',
'Attachments' => '첨부 파일',
'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
'now' => '현재 시간',
'%d query(s) executed OK.' => '%d 쿼리를 실행했습니다.',
'Show only errors' => '오류 만 표시',
'Refresh' => '새로 고침',
'Invalid schema.' => '잘못된 스키마',
'Please use one of the extensions %s.' => '하나의 확장 기능을 사용하십시오 %s',
'ltr' => 'ltr',
'Tables have been copied.' => '테이블을 복사했습니다',
'Copy' => '복사',
'Permanent link' => '영구 링크',
'Edit all' => '모든 편집',
'HH:MM:SS' => '시:분:초',
);

View File

@@ -66,7 +66,6 @@ $translations = array(
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Per daug POST duomenų. Sumažinkite duomenų kiekį arba padidinkite konfigūracijos nustatymą %s.',
'Export' => 'Eksportas',
'Dump' => 'Eksportuoti',
'Output' => 'Išvestis',
'open' => 'atidaryti',
'save' => 'išsaugoti',
@@ -78,7 +77,6 @@ $translations = array(
'Use' => 'Naudoti',
'Select database' => 'Pasirinkti duomenų bazę',
'Invalid database.' => 'Neteisinga duomenų bazė.',
'Create new database' => 'Sukurti naują duomenų bazę',
'Database has been dropped.' => 'Duomenų bazė panaikinta.',
'Databases have been dropped.' => 'Duomenų bazės panaikintos.',
'Database has been created.' => 'Duomenų bazė sukurta.',
@@ -93,6 +91,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Variklis',
'Collation' => 'Lyginimas',
'Data Length' => 'Duomenų ilgis',
@@ -144,7 +143,6 @@ $translations = array(
'No tables.' => 'Nėra lentelių.',
'Alter table' => 'Redaguoti lentelę',
'Create table' => 'Sukurti lentelę',
'Create new table' => 'Sukurti naują lentelę',
'Table has been dropped.' => 'Lentelė pašalinta.',
'Tables have been dropped.' => 'Lentelės pašalintos.',
'Table has been altered.' => 'Lentelė pakeista.',
@@ -165,7 +163,7 @@ $translations = array(
'Move up' => 'Perkelti į viršų',
'Move down' => 'Perkelti žemyn',
'Remove' => 'Pašalinti',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s ir %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
'Partition by' => 'Skirstyti pagal',
'Partitions' => 'Skirsniai',
@@ -231,8 +229,7 @@ $translations = array(
'%d row(s)' => array('%d įrašas', '%d įrašai', '%d įrašų'),
'Page' => 'Puslapis',
'last' => 'paskutinis',
'Last page' => 'Paskutinis puslapis',
'whole result' => 'visas rezultatas',
'Whole result' => 'Visas rezultatas',
'%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
'Import' => 'Importas',
@@ -295,7 +292,6 @@ $translations = array(
'Schema has been dropped.' => 'Schema pašalinta.',
'Schema has been created.' => 'Schema sukurta.',
'Schema has been altered.' => 'Schema pakeista.',
'schema' => 'schema',
'Schema' => 'Schema',
'Invalid schema.' => 'Neteisinga schema.',

340
adminer/lang/ms.inc.php Normal file
View File

@@ -0,0 +1,340 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Pelayan',
'Username' => 'Nama pengguna',
'Password' => 'Kata laluan',
'Permanent login' => 'Log masuk kekal',
'Login' => 'Log masuk',
'Logout' => 'Log keluar',
'Logged as: %s' => 'Log masuk sebagai: %s',
'Logout successful.' => 'Log keluar berjaya.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Terima kasih kerana menggunakan Adminer, pertimbangkan untuk <a href="https://www.adminer.org/en/donation/">menderma</a>.',
'Invalid credentials.' => 'Akses tidak sah.',
'Too many unsuccessful logins, try again in %d minute(s).' => 'Terlalu banyak percubaan log masuk yang gagal, sila cuba lagi dalam masa %d minit.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Kata laluan utama telah luput. <a href="https://www.adminer.org/en/extension/"%s>Gunakan</a> cara %s untuk mengekalkannya.',
'Language' => 'Bahasa',
'Invalid CSRF token. Send the form again.' => 'Token CSRF tidak sah. Sila hantar borang sekali lagi.',
'If you did not send this request from Adminer then close this page.' => 'Jika anda tidak menghantar permintaan ini dari Adminer sila tutup halaman ini.',
'No extension' => 'Tiada sambungan',
'None of the supported PHP extensions (%s) are available.' => 'Sambungan PHP yang (%s) disokong tidak wujud.',
'Connecting to privileged ports is not allowed.' => 'Penyambungan ke port yang istimewa tidak dibenarkan.',
'Session support must be enabled.' => 'Sokongan sesi perlu diaktifkan.',
'Session expired, please login again.' => 'Sesi telah luput, sila log masuk kembali.',
'%s version: %s through PHP extension %s' => 'Versi %s: %s melalui sambungan PHP %s',
'Refresh' => 'Segar kembali',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Keistimewaan',
'Create user' => 'Bina pengguna',
'User has been dropped.' => 'Pengguna telah dijatuhkan.',
'User has been altered.' => 'Pengguna telah diubah.',
'User has been created.' => 'Pengguna telah dibuat.',
'Hashed' => 'Hashed',
'Column' => 'Kolum',
'Routine' => 'Rutin',
'Grant' => 'Beri',
'Revoke' => 'Batal',
'Process list' => 'Senarai proses',
'%d process(es) have been killed.' => '%d proses telah dihentikan.',
'Kill' => 'Henti',
'Variables' => 'Pembolehubah',
'Status' => 'Status',
'SQL command' => 'Arahan SQL',
'%d query(s) executed OK.' => '%d query berjaya dilaksanakan.',
'Query executed OK, %d row(s) affected.' => 'Query berjaya dilaksanakan, %d baris terjejas.',
'No commands to execute.' => 'Tiada arahan untuk dilaksanakan.',
'Error in query' => 'Ralat pada query',
'ATTACH queries are not supported.' => 'Query berikut tidak disokong.',
'Execute' => 'Laksana',
'Stop on error' => 'Berhenti jika ralat',
'Show only errors' => 'Paparkan jika ralat',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Sejarah',
'Clear' => 'Bersih',
'Edit all' => 'Ubah semua',
'File upload' => 'Muat naik fail',
'From server' => 'Dari pelayan',
'Webserver file %s' => 'Fail pelayan sesawang %s',
'Run file' => 'Jalankan fail',
'File does not exist.' => 'Fail tidak wujud.',
'File uploads are disabled.' => 'Muat naik fail dihalang.',
'Unable to upload a file.' => 'Muat naik fail gagal.',
'Maximum allowed file size is %sB.' => 'Saiz fail maksimum yang dibenarkan adalah %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Data POST terlalu besar. Kecilkan data atau tingkatkan tetapan %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Anda boleh muat naik fail SQL yang besar melalui FTP dan import melalui pelayan.',
'You are offline.' => 'Anda sedang offline.',
'Export' => 'Eksport',
'Output' => 'Pengeluaran',
'open' => 'buka',
'save' => 'simpan',
'Saving' => 'Menyimpan',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Pangkalan data',
'database' => 'pangkalan data',
'Use' => 'Guna',
'Select database' => 'Pilih pangkalan data',
'Invalid database.' => 'Pangkalan data tidak sah.',
'Database has been dropped.' => 'Pangkalan data telah dijatuhkan.',
'Databases have been dropped.' => 'Pangkalan data telah dijatuhkan.',
'Database has been created.' => 'Pangkalan data telah dibuat.',
'Database has been renamed.' => 'Pangkalan data telah ditukar nama.',
'Database has been altered.' => 'Pangkalan data telah diubah.',
'Alter database' => 'Ubah pangkalan data',
'Create database' => 'Bina pangkalan data',
'Database schema' => 'Skema pangkalan data',
// link to current database schema layout
'Permanent link' => 'Pautan kekal',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Enjin',
'Collation' => 'Collation',
'Data Length' => 'Panjang Data',
'Index Length' => 'Panjang Indeks',
'Data Free' => 'Data Free',
'Rows' => 'Baris',
'%d in total' => '%d secara keseluruhan',
'Analyze' => 'Menganalisis',
'Optimize' => 'Mengoptimum',
'Vacuum' => 'Vacuum',
'Check' => 'Periksa',
'Repair' => 'Baiki',
'Truncate' => 'Memangkas',
'Tables have been truncated.' => 'Jadual telah dimangkaskan.',
'Move to other database' => 'Pindahkan ke pangkalan data yang lain',
'Move' => 'Pindah',
'Tables have been moved.' => 'Jadual telah dipindahkan.',
'Copy' => 'Salin',
'Tables have been copied.' => 'Jadual telah disalin.',
'Routines' => 'Rutin',
'Routine has been called, %d row(s) affected.' => 'Rutin telah dipanggil, %d baris terjejas.',
'Call' => 'Panggil',
'Parameter name' => 'Nama pembolehubah',
'Create procedure' => 'Bina prosedur',
'Create function' => 'Bina fungsi',
'Routine has been dropped.' => 'Rutin telah dijatuhkan.',
'Routine has been altered.' => 'Rutin telah diubah.',
'Routine has been created.' => 'Rutin telah dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis Return',
'Events' => 'Peristiwa',
'Event has been dropped.' => 'Peristiwa telah dijatuhkan.',
'Event has been altered.' => 'Peristiwa telah diubah.',
'Event has been created.' => 'Peristiwa telah dibuat.',
'Alter event' => 'Ubah peristiwa',
'Create event' => 'Bina peristiwa',
'At given time' => 'Pada masa tersebut',
'Every' => 'Setiap',
'Schedule' => 'Jadual',
'Start' => 'Mula',
'End' => 'Habis',
'On completion preserve' => 'Dalam melestarikan penyelesaian',
'Tables' => 'Jadual',
'Tables and views' => 'Jadual dan pandangan',
'Table' => 'Jadual',
'No tables.' => 'Tiada jadual.',
'Alter table' => 'Ubah jadual',
'Create table' => 'Bina jadual',
'Table has been dropped.' => 'Jadual telah dijatuhkan.',
'Tables have been dropped.' => 'Jadual telah dijatuhkan.',
'Tables have been optimized.' => 'Jadual telah dioptimumkan.',
'Table has been altered.' => 'Jadual telah diubah.',
'Table has been created.' => 'Jadual telah dibuat.',
'Table name' => 'Nama jadual',
'Show structure' => 'Paparkan struktur',
'engine' => 'enjin',
'collation' => 'collation',
'Column name' => 'Nama kolum',
'Type' => 'Jenis',
'Length' => 'Kepanjangan',
'Auto Increment' => 'Kenaikan Auto',
'Options' => 'Pilihan',
'Comment' => 'Komen',
'Default value' => 'Nilai lalai',
'Default values' => 'Nilai lalai',
'Drop' => 'Jatuh',
'Drop %s?' => 'Jatuhkan %s?',
'Are you sure?' => 'Anda pasti?',
'Size' => 'Saiz',
'Compute' => 'Kira',
'Move up' => 'Gerak ke atas',
'Move down' => 'Gerak ke bawah',
'Remove' => 'Buang',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bilangan medan telah melebihi had yang dibenarkan. Sila tingkatkan %s.',
'Partition by' => 'Partition mengikut',
'Partitions' => 'Partition',
'Partition name' => 'Nama partition',
'Values' => 'Nilai',
'View' => 'Papar',
'Materialized view' => 'Paparan yang menjadi kenyataan',
'View has been dropped.' => 'Paparan telah dijatuhkan.',
'View has been altered.' => 'Paparan telah diubah.',
'View has been created.' => 'Paparan telah dibuat.',
'Alter view' => 'Ubah paparan',
'Create view' => 'Bina paparan',
'Indexes' => 'Indeks',
'Indexes have been altered.' => 'Indeks telah diubah.',
'Alter indexes' => 'Ubah indeks',
'Add next' => 'Tambah yang seterusnya',
'Index Type' => 'Jenis Indeks',
'Column (length)' => 'Kolum (kepanjangan)',
'Foreign keys' => 'Kunci asing',
'Foreign key' => 'Kunci asing',
'Foreign key has been dropped.' => 'Kunci asing telah dijatuhkan.',
'Foreign key has been altered.' => 'Kunci asing telah diubah.',
'Foreign key has been created.' => 'Kunci asing telah dibuat.',
'Target table' => 'Jadual sasaran',
'Change' => 'Tukar',
'Source' => 'Sumber',
'Target' => 'Sasaran',
'Add column' => 'Tambah kolum',
'Alter' => 'Ubah',
'Add foreign key' => 'Tambah kunci asing',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kolum sumber dan sasaran perlu mempunyai jenis data yang sama, indeks diperlukan pada kolum sasaran dan data yang dirujuk wujud.',
'Triggers' => ' Pencetus',
'Add trigger' => 'Tambah pencetus',
'Trigger has been dropped.' => 'Pencetus telah dijatuhkan.',
'Trigger has been altered.' => 'Pencetus telah diubah.',
'Trigger has been created.' => 'Pencetus telah dibuat.',
'Alter trigger' => 'Ubah pencetus',
'Create trigger' => 'Buat pencetus',
'Time' => 'Masa',
'Event' => 'Peristiwa',
'Name' => 'Nama',
'select' => 'pilih',
'Select' => 'Pilih',
'Select data' => 'Pilih data',
'Functions' => 'Fungsi',
'Aggregation' => 'Pengagregatan',
'Search' => 'Cari',
'anywhere' => 'di mana-mana',
'Search data in tables' => 'Cari data dalam jadual',
'Sort' => 'Susun',
'descending' => 'menurun',
'Limit' => 'Had',
'Limit rows' => 'Had baris',
'Text length' => 'Kepanjangan teks',
'Action' => 'Aksi',
'Full table scan' => 'Imbasan penuh jadual',
'Unable to select the table' => 'Pemilihan jadual tidak berjaya',
'No rows.' => 'Tiada baris.',
'%d / ' => '%d / ',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'akhir',
'Load more data' => 'Load lebih data',
'Loading' => 'Loading',
'Whole result' => 'Keputusan keseluruhan',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Import',
'%d row(s) have been imported.' => '%d baris telah diimport.',
'File must be in UTF-8 encoding.' => 'Fail mesti dalam pengekodan UTF-8.',
// in-place editing in select
'Modify' => 'Pinda',
'Ctrl+click on a value to modify it.' => 'Ctrl+click pada nilai untuk meminda.',
'Use edit link to modify this value.' => 'Guna pautan ubah untuk meminda nilai ini.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Item%s telah dimasukkan.',
'Item has been deleted.' => 'Item telah dipadamkan.',
'Item has been updated.' => 'Item telah dikemaskini.',
'%d item(s) have been affected.' => '%d item telah terjejas.',
'New item' => 'Item baru',
'original' => 'asli',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'ubah',
'Edit' => 'Ubah',
'Insert' => 'Masukkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan sambung ubah',
'Save and insert next' => 'Simpan dan masukkan seterusnya',
'Selected' => 'Terpilih',
'Clone' => 'Klon',
'Delete' => 'Padam',
'You have no privileges to update this table.' => 'Anda tidak mempunyai keistimewaan untuk mengemaskini jadual ini.',
'E-mail' => 'Emel',
'From' => 'Dari',
'Subject' => 'Subjek',
'Attachments' => 'Lampiran',
'Send' => 'Hantar',
'%d e-mail(s) have been sent.' => '%d emel telah dihantar.',
// data type descriptions
'Numbers' => 'Nombor',
'Date and time' => 'Tarikh dan masa',
'Strings' => 'String',
'Binary' => 'Binari',
'Lists' => 'Senarai',
'Network' => 'Rangkaian',
'Geometry' => 'Geometri',
'Relations' => 'Hubungan',
'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'sekarang',
'yes' => 'ya',
'no' => 'tidak',
// general SQLite error in create, drop or rename database
'File exists.' => 'Fail wujud.',
'Please use one of the extensions %s.' => 'Sila guna salah satu sambungan %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ubah skema',
'Create schema' => 'Buat skema',
'Schema has been dropped.' => 'Skema telah dijatuhkan.',
'Schema has been created.' => 'Skema telah dibuat.',
'Schema has been altered.' => 'Skema telah diubah.',
'Schema' => 'Skema',
'Invalid schema.' => 'Skema tidak sah.',
// PostgreSQL sequences support
'Sequences' => 'Turutan',
'Create sequence' => 'Buat turutan',
'Sequence has been dropped.' => 'Turutan telah dijatuhkan.',
'Sequence has been created.' => 'Turutan telah dibuat.',
'Sequence has been altered.' => 'Turutan telah diubah.',
'Alter sequence' => 'Ubah turutan',
// PostgreSQL user types support
'User types' => 'Jenis pengguna',
'Create type' => 'Buat jenis',
'Type has been dropped.' => 'Jenis telah dijatuhkan.',
'Type has been created.' => 'Jenis telah dibuat.',
'Alter type' => 'Ubah jenis',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Wachtwoord',
'Select database' => 'Database selecteren',
'Invalid database.' => 'Ongeldige database.',
'Create new database' => 'Nieuwe database',
'Table has been dropped.' => 'Tabel verwijderd.',
'Table has been altered.' => 'Tabel aangepast.',
'Table has been created.' => 'Tabel aangemaakt.',
@@ -32,13 +31,11 @@ $translations = array(
'Alter database' => 'Database aanpassen',
'Create database' => 'Database aanmaken',
'SQL command' => 'SQL opdracht',
'Dump' => 'Exporteer',
'Logout' => 'Uitloggen',
'database' => 'database',
'Use' => 'Gebruik',
'No tables.' => 'Geen tabellen.',
'select' => 'kies',
'Create new table' => 'Nieuwe tabel',
'Item has been deleted.' => 'Item verwijderd.',
'Item has been updated.' => 'Item aangepast.',
'Item%s has been inserted.' => 'Item%s toegevoegd.',
@@ -63,7 +60,7 @@ $translations = array(
'Action' => 'Acties',
'edit' => 'bewerk',
'Page' => 'Pagina',
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen geraakt.'),
'Query executed OK, %d row(s) affected.' => array('Query uitgevoerd, %d rij geraakt.', 'Query uitgevoerd, %d rijen beïnvloed.'),
'Error in query' => 'Fout in query',
'Execute' => 'Uitvoeren',
'Table' => 'Tabel',
@@ -181,6 +178,7 @@ $translations = array(
'Data Free' => 'Data Vrij',
'Rows' => 'Rijen',
',' => '.',
'0123456789' => '0123456789',
'Analyze' => 'Analyseer',
'Optimize' => 'Optimaliseer',
'Check' => 'Controleer',
@@ -189,9 +187,9 @@ $translations = array(
'Move to other database' => 'Verplaats naar andere database',
'Move' => 'Verplaats',
'%d item(s) have been affected.' => array('%d item aangepast.', '%d items aangepast.'),
'whole result' => 'volledig resultaat',
'Whole result' => 'Volledig resultaat',
'Clone' => 'Dupliceer',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Maximum aantal velden bereikt. Verhoog %s en %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maximum aantal velden bereikt. Verhoog %s.',
'Partition by' => 'Partitioneren op',
'Partitions' => 'Partities',
'Partition name' => 'Partitie naam',
@@ -226,7 +224,6 @@ $translations = array(
'%d in total' => '%d in totaal',
'Permanent login' => 'Blijf aangemeld',
'Search data in tables' => 'Zoeken in database',
'schema' => 'schema',
'Schema' => 'Schema',
'Alter schema' => 'Schema wijzigen',
'Create schema' => 'Schema maken',
@@ -258,7 +255,6 @@ $translations = array(
'Attachments' => 'Bijlagen',
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd'),
'Show only errors' => 'Enkel fouten tonen',
'Last page' => 'Laatste pagina',
'Refresh' => 'Vernieuwen',
'Invalid schema.' => 'Ongeldig schema.',
'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.',

282
adminer/lang/no.inc.php Normal file
View File

@@ -0,0 +1,282 @@
<?php
$translations = array(
'System' => 'System',
'Server' => 'Server',
'Username' => 'Brukernavn',
'Password' => 'Passord',
'Permanent login' => 'Permanent login',
'Login' => 'Logg inn',
'Logout' => 'Logg ut',
'Logged as: %s' => 'Logget inn som: %s',
'Logout successful.' => 'Utlogging vellykket.',
'Invalid credentials.' => 'Ugylding innloggingsinformasjon.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Master-passord er utløpt. <a href="https://www.adminer.org/en/extension/"%s>Implementer</a> en metode for %s for å gjøre det permanent.',
'Language' => 'Språk',
'Invalid CSRF token. Send the form again.' => 'Ugylding CSRF-token - Send inn skjemaet igjen.',
'No extension' => 'Ingen utvidelse',
'None of the supported PHP extensions (%s) are available.' => 'Ingen av de støttede PHP-utvidelsene (%s) er tilgjengelige.',
'Session support must be enabled.' => 'Økt-støtte må være skrudd på.',
'Session expired, please login again.' => 'Økt utløpt - vennligst logg inn på nytt.',
'%s version: %s through PHP extension %s' => '%s versjon: %s via PHP-utvidelse %s',
'Refresh' => 'Gjenoppfrisk',
'ltr' => 'venstre-til-høyre',
'Privileges' => 'Privilegier',
'Create user' => 'Lag bruker',
'User has been dropped.' => 'Bruker slettet.',
'User has been altered.' => 'Bruker endret.',
'User has been created.' => 'Bruker opprettet.',
'Hashed' => 'Hashet',
'Column' => 'Kolonne',
'Routine' => 'Rutine',
'Grant' => 'Gi privilegier',
'Revoke' => 'Trekk tilbake',
'Process list' => 'Prosessliste',
'%d process(es) have been killed.' => array('%d prosess avsluttet.', '%d prosesser avsluttet.'),
'Kill' => 'Avslutt',
'Variables' => 'Variabler',
'Status' => 'Status',
'SQL command' => 'SQL-kommando',
'%d query(s) executed OK.' => array('%d kall utført OK.', '%d kall utført OK.'),
'Query executed OK, %d row(s) affected.' => array('Kall utført OK, %d rad påvirket.', 'Kall utført OK, %d rader påvirket.'),
'No commands to execute.' => 'Ingen kommandoer å utføre.',
'Error in query' => 'Feil i forespørsel',
'Execute' => 'Kjør',
'Stop on error' => 'Stopp ved feil',
'Show only errors' => 'Vis bare feil',
'%.3f s' => '%.3f s',
'History' => 'Historie',
'Clear' => 'Tøm skjema',
'Edit all' => 'Rediger alle',
'File upload' => 'Filopplasting',
'From server' => 'Fra server',
'Webserver file %s' => 'Webserver-fil %s',
'Run file' => 'Kjør fil',
'File does not exist.' => 'Filen eksisterer ikke.',
'File uploads are disabled.' => 'Filopplastinger ikke tillatt.',
'Unable to upload a file.' => 'Kunne ikke laste opp fil.',
'Maximum allowed file size is %sB.' => 'Maksimum tillatte filstørrelse er %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'For stor datamengde i skjemaet. Reduser datamengden, eller øk størrelsen på %s-konfigurasjonsdirektivet.',
'You can upload a big SQL file via FTP and import it from server.' => 'Du kan laste opp en stor SQL-fil via FTP og importere den fra serveren.',
'Export' => 'Eksport',
'Output' => 'Resultat',
'open' => 'åpne',
'save' => 'lagre',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Database',
'database' => 'database',
'Use' => 'Bruk',
'Select database' => 'Velg database',
'Invalid database.' => 'Ugyldig database.',
'Database has been dropped.' => 'Databasen har blitt slettet.',
'Databases have been dropped.' => 'Databasene har blitt slettet.',
'Database has been created.' => 'Databasen er opprettet.',
'Database has been renamed.' => 'Databasen har fått nytt navn.',
'Database has been altered.' => 'Databasen er endret.',
'Alter database' => 'Endre database',
'Create database' => 'Opprett database',
'Database schema' => 'Databaseskjema',
'Permanent link' => 'Permanent lenke',
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Tekstsortering',
'Data Length' => 'Datalengde',
'Index Length' => 'Indekslengde',
'Data Free' => 'Frie data',
'Rows' => 'Rader',
'%d in total' => '%d totalt',
'Analyze' => 'Analyser',
'Optimize' => 'Optimaliser',
'Vacuum' => 'Støvsug',
'Check' => 'Sjekk',
'Repair' => 'Reparer',
'Truncate' => 'Avkort',
'Tables have been truncated.' => 'Tabellene har blitt avkortet.',
'Move to other database' => 'Flytt til annen database',
'Move' => 'Flytt',
'Tables have been moved.' => 'Tabellene har blitt flyttet.',
'Copy' => 'Kopier',
'Tables have been copied.' => 'Tabellene har blitt kopiert.',
'Routines' => 'Rutiner',
'Routine has been called, %d row(s) affected.' => array('Rutinen er utført, %d rad påvirket.', 'Rutinen er utført, %d rader påvirket.'),
'Call' => 'Kall',
'Parameter name' => 'Parameternavn',
'Create procedure' => 'Opprett prosedyre',
'Create function' => 'Opprett funksjon',
'Routine has been dropped.' => 'Rutinen er slettet.',
'Routine has been altered.' => 'Rutinen er endret.',
'Routine has been created.' => 'Rutinen er opprettet.',
'Alter function' => 'Endre funksjon',
'Alter procedure' => 'Endre prosedyre',
'Return type' => 'Returtype',
'Events' => 'Eventer',
'Event has been dropped.' => 'Eventen er slettet.',
'Event has been altered.' => 'Eventen er endret.',
'Event has been created.' => 'Eventen er opprettet.',
'Alter event' => 'Endre event',
'Create event' => 'Opprett event',
'At given time' => 'På gitte tid',
'Every' => 'Hver',
'Schedule' => 'Tidsplan',
'Start' => 'Start',
'End' => 'Slutt',
'On completion preserve' => 'Ved fullførelse bevar',
'Tables' => 'Tabeller',
'Tables and views' => 'Tabeller og views',
'Table' => 'Tabell',
'No tables.' => 'Ingen tabeller.',
'Alter table' => 'Endre tabell',
'Create table' => 'Opprett tabell',
'Table has been dropped.' => 'Tabellen er slettet.',
'Tables have been dropped.' => 'Tabellene er slettet.',
'Tables have been optimized.' => 'Tabellene er blitt optimalisert.',
'Table has been altered.' => 'Tabellen er endret.',
'Table has been created.' => 'Tabellen er opprettet.',
'Table name' => 'Tabellnavn',
'Show structure' => 'Vis struktur',
'engine' => 'mottor',
'collation' => 'sortering',
'Column name' => 'Kolonnenavn',
'Type' => 'Type',
'Length' => 'Lengde',
'Auto Increment' => 'Autoinkrement',
'Options' => 'Valg',
'Comment' => 'Kommentarer',
'Default values' => 'Standardverdier',
'Drop' => 'Dropp',
'Are you sure?' => 'Er du sikker?',
'Move up' => 'Flytt opp',
'Move down' => 'Flytt ned',
'Remove' => 'Fjern',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Maksimum antall feltnavn overskredet - venligst øk %s.',
'Partition by' => 'Partisjoner ved',
'Partitions' => 'Partisjoner',
'Partition name' => 'Partisjonsnavn',
'Values' => 'Verdier',
'View' => 'View',
'View has been dropped.' => 'Viewet er slettet.',
'View has been altered.' => 'Viewet er endret.',
'View has been created.' => 'Viewet er opprettet.',
'Alter view' => 'Endre view',
'Create view' => 'Lag nytt view',
'Indexes' => 'Indekser',
'Indexes have been altered.' => 'Indeksene er endret.',
'Alter indexes' => 'Endre indekser',
'Add next' => 'Legg til neste',
'Index Type' => 'Indekstype',
'Column (length)' => 'Kolonne (lengde)',
'Foreign keys' => 'Fremmednøkler',
'Foreign key' => 'Fremmednøkkel',
'Foreign key has been dropped.' => 'Fremmednøkkelen er slettet.',
'Foreign key has been altered.' => 'Fremmednøkkelen er endret.',
'Foreign key has been created.' => 'Fremmednøkkelen er opprettet.',
'Target table' => 'Måltabell',
'Change' => 'Endre',
'Source' => 'Kilde',
'Target' => 'Mål',
'Add column' => 'Legg til kolonne',
'Alter' => 'Endre',
'Add foreign key' => 'Legg til fremmednøkkel',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kilde- og mål-kolonner må ha samme datatype, det må være en indeks på mål-kolonnen, og dataene som refereres til må eksistere.',
'Triggers' => 'Triggere',
'Add trigger' => 'Legg til trigger',
'Trigger has been dropped.' => 'Triggeren er slettet.',
'Trigger has been altered.' => 'Triggeren er endret.',
'Trigger has been created.' => 'Triggeren er opprettet.',
'Alter trigger' => 'Endre trigger',
'Create trigger' => 'Opprett trigger',
'Time' => 'Tid',
'Event' => 'Hendelse',
'Name' => 'Navn',
'select' => 'Vis',
'Select' => 'Velg',
'Select data' => 'Velg data',
'Functions' => 'Funksjoner',
'Aggregation' => 'Sammenfatning',
'Search' => 'Søk',
'anywhere' => 'hvorsomhelst',
'Search data in tables' => 'Søk data i tabeller',
'Sort' => 'Sorter',
'descending' => 'minkende',
'Limit' => 'Skranke',
'Text length' => 'Tekstlengde',
'Action' => 'Handling',
'Full table scan' => 'Full tabell-scan',
'Unable to select the table' => 'Kan ikke velge tabellen',
'No rows.' => 'Ingen rader.',
'%d row(s)' => array('%d rad', '%d rader'),
'Page' => 'Side',
'last' => 'siste',
'Load more data' => 'Last mer data',
'Loading' => 'Laster',
'Whole result' => 'Hele resultatet',
'%d byte(s)' => array('%d byte', '%d bytes'),
'Import' => 'Importer',
'%d row(s) have been imported.' => array('%d rad er importert.', '%d rader er importert.'),
'File must be in UTF-8 encoding.' => 'Filen må være i UTF8-tegnkoding.',
'Modify' => 'Endre',
'Ctrl+click on a value to modify it.' => 'Ctrl+klikk på en verdi for å endre den.',
'Use edit link to modify this value.' => 'Bruk rediger-lengde for å endre dennne verdien.',
'Item%s has been inserted.' => 'Rad%s er satt inn.',
'Item has been deleted.' => 'Raden er slettet.',
'Item has been updated.' => 'Raden er oppdatert.',
'%d item(s) have been affected.' => array('%d rad påvirket.', '%d rader påvirket.'),
'New item' => 'Ny rad',
'original' => 'original',
'empty' => 'tom',
'edit' => 'rediger',
'Edit' => 'Rediger',
'Insert' => 'Sett inn',
'Save' => 'Lagre',
'Save and continue edit' => 'Lagre og fortsett å redigere',
'Save and insert next' => 'Lagre og sett inn neste',
'Selected' => 'Valgt',
'Clone' => 'Klon',
'Delete' => 'Slett',
'You have no privileges to update this table.' => 'Du mangler rettighetene som trengs for å endre denne tabellen.',
'E-mail' => 'E-post',
'From' => 'Fra',
'Subject' => 'Tittel',
'Attachments' => 'Vedlegg',
'Send' => 'Send',
'%d e-mail(s) have been sent.' => array('%d epost sendt.', '%d eposter sendt.'),
'Numbers' => 'Nummer',
'Date and time' => 'Dato og tid',
'Strings' => 'Strenger',
'Binary' => 'Binære',
'Lists' => 'Lister',
'Network' => 'Nettverk',
'Geometry' => 'Geometri',
'Relations' => 'Relasjoner',
'Editor' => 'Redigering',
'$1-$3-$5' => '$6/$4 $1',
'[yyyy]-mm-dd' => 'd/m [åååå]',
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'nå',
'yes' => 'ja',
'no' => 'nei',
'File exists.' => 'Filen finnes.',
'Please use one of the extensions %s.' => 'Vennligst bruk en av filendelsene %s.',
'Alter schema' => 'Endre skjema',
'Create schema' => 'Opprett skjema',
'Schema has been dropped.' => 'Skjemaet er slettet.',
'Schema has been created.' => 'Skjemaet er opprettet.',
'Schema has been altered.' => 'Skjemaet er endret.',
'Schema' => 'Skjema',
'Invalid schema.' => 'Ugylding skjema.',
'Sequences' => 'Sekvenser',
'Create sequence' => 'Opprett sekvens',
'Sequence has been dropped.' => 'Sekvensen er slettet.',
'Sequence has been created.' => 'Sekvensen er opprettet.',
'Sequence has been altered.' => 'Sekvensen er endret.',
'Alter sequence' => 'Endre sekvens',
'User types' => 'Brukertyper',
'Create type' => 'Opprett type',
'Type has been dropped.' => 'Type er slettet.',
'Type has been created.' => 'Type er opprettet.',
'Alter type' => 'Endre type',
'Saving' => 'Lagrer',
);

View File

@@ -10,11 +10,16 @@ $translations = array(
'Logout' => 'Wyloguj',
'Logged as: %s' => 'Zalogowany jako: %s',
'Logout successful.' => 'Wylogowano pomyślnie.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Dziękujemy za używanie Adminera, rozważ proszę <a href="https://www.adminer.org/pl/donation/">dotację</a>.',
'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Za dużo nieudanych prób logowania, spróbuj ponownie za %d minutę.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minuty.', 'Za dużo nieudanych prób logowania, spróbuj ponownie za %d minut.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="https://www.adminer.org/pl/extension/"%s>Zaimplementuj</a> własną metodę %s, aby ustawić je na stałe.',
'Language' => 'Język',
'Invalid CSRF token. Send the form again.' => 'Nieprawidłowy token CSRF. Spróbuj wysłać formularz ponownie.',
'If you did not send this request from Adminer then close this page.' => 'Jeżeli nie wywołałeś tej strony z Adminera, zamknij to okno.',
'No extension' => 'Brak rozszerzenia',
'None of the supported PHP extensions (%s) are available.' => 'Żadne z rozszerzeń PHP umożliwiających połączenie się z bazą danych (%s) nie jest dostępne.',
'Connecting to privileged ports is not allowed.' => 'Łączenie do portów uprzywilejowanych jest niedozwolone.',
'Session support must be enabled.' => 'Wymagana jest obsługa sesji w PHP.',
'Session expired, please login again.' => 'Sesja wygasła, zaloguj się ponownie.',
'%s version: %s through PHP extension %s' => 'Wersja %s: %s za pomocą %s',
@@ -46,6 +51,7 @@ $translations = array(
'Query executed OK, %d row(s) affected.' => array('Zapytanie wykonane pomyślnie, zmieniono %d rekord.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordy.', 'Zapytanie wykonane pomyślnie, zmieniono %d rekordów.'),
'No commands to execute.' => 'Nic do wykonania.',
'Error in query' => 'Błąd w zapytaniu',
'ATTACH queries are not supported.' => 'Zapytania ATTACH są niewspierane.',
'Execute' => 'Wykonaj',
'Stop on error' => 'Zatrzymaj w przypadku błędu',
'Show only errors' => 'Pokaż tylko błędy',
@@ -64,9 +70,10 @@ $translations = array(
'Unable to upload a file.' => 'Wgranie pliku było niemożliwe.',
'Maximum allowed file size is %sB.' => 'Maksymalna wielkość pliku to %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Przesłano zbyt dużo danych. Zmniejsz objętość danych lub zwiększ zmienną konfiguracyjną %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Większe pliki SQL możesz wgrać na serwer poprzez FTP przed zaimportowaniem.',
'You are offline.' => 'Jesteś offline.',
'Export' => 'Eksport',
'Dump' => 'Eksport',
'Output' => 'Rezultat',
'open' => 'otwórz',
'save' => 'zapisz',
@@ -78,7 +85,6 @@ $translations = array(
'Use' => 'Wybierz',
'Select database' => 'Wybierz bazę danych',
'Invalid database.' => 'Nie znaleziono bazy danych.',
'Create new database' => 'Utwórz nową bazę danych',
'Database has been dropped.' => 'Baza danych została usunięta.',
'Databases have been dropped.' => 'Bazy danych zostały usunięte.',
'Database has been created.' => 'Baza danych została utworzona.',
@@ -93,6 +99,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Składowanie',
'Collation' => 'Porównywanie znaków',
'Data Length' => 'Rozmiar danych',
@@ -102,6 +109,7 @@ $translations = array(
'%d in total' => '%d w sumie',
'Analyze' => 'Analizuj',
'Optimize' => 'Optymalizuj',
'Vacuum' => 'Wyczyść',
'Check' => 'Sprawdź',
'Repair' => 'Napraw',
'Truncate' => 'Opróżnij',
@@ -144,7 +152,6 @@ $translations = array(
'No tables.' => 'Brak tabel.',
'Alter table' => 'Zmień tabelę',
'Create table' => 'Utwórz tabelę',
'Create new table' => 'Utwórz nową tabelę',
'Table has been dropped.' => 'Tabela została usunięta.',
'Tables have been dropped.' => 'Tabele zostały usunięte.',
'Tables have been optimized.' => 'Tabele zostały zoptymalizowane.',
@@ -160,13 +167,17 @@ $translations = array(
'Auto Increment' => 'Auto Increment',
'Options' => 'Opcje',
'Comment' => 'Komentarz',
'Default value' => 'Wartość domyślna',
'Default values' => 'Wartości domyślne',
'Drop' => 'Usuń',
'Drop %s?' => 'Usunąć %s?',
'Are you sure?' => 'Czy jesteś pewien?',
'Size' => 'Wielkość',
'Compute' => 'Oblicz',
'Move up' => 'Przesuń w górę',
'Move down' => 'Przesuń w dół',
'Remove' => 'Usuń',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s i %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
'Partition by' => 'Partycjonowanie',
'Partitions' => 'Partycje',
@@ -174,6 +185,7 @@ $translations = array(
'Values' => 'Wartości',
'View' => 'Perspektywa',
'Materialized view' => 'Zmaterializowana perspektywa',
'View has been dropped.' => 'Perspektywa została usunięta.',
'View has been altered.' => 'Perspektywa została zmieniona.',
'View has been created.' => 'Perspektywa została utworzona.',
@@ -225,24 +237,27 @@ $translations = array(
'Sort' => 'Sortuj',
'descending' => 'malejąco',
'Limit' => 'Limit',
'Limit rows' => 'Limit rekordów',
'Text length' => 'Długość tekstu',
'Action' => 'Czynność',
'Full table scan' => 'Wymaga pełnego przeskanowania tabeli',
'Unable to select the table' => 'Nie udało się pobrać danych z tabeli',
'No rows.' => 'Brak rekordów.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d rekord', '%d rekordy', '%d rekordów'),
'Page' => 'Strona',
'last' => 'ostatni',
'Last page' => 'Ostatnia strona',
'Load more data' => 'Wczytaj więcej danych',
'Loading' => 'Wczytywanie',
'whole result' => 'wybierz wszystkie',
'Whole result' => 'Wybierz wszystkie',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtów'),
'Import' => 'Import',
'%d row(s) have been imported.' => array('%d rekord został zaimportowany.', '%d rekordy zostały zaimportowane.', '%d rekordów zostało zaimportowanych.'),
'File must be in UTF-8 encoding.' => 'Kodowanie pliku musi być ustawione na UTF-8.',
// in-place editing in select
'Modify' => 'Zmień',
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknij wartość, aby ją edytować.',
'Use edit link to modify this value.' => 'Użyj linku edycji aby zmienić tę wartość.',
@@ -259,8 +274,10 @@ $translations = array(
'Edit' => 'Edytuj',
'Insert' => 'Dodaj',
'Save' => 'Zapisz zmiany',
'Saving' => 'Zapisywanie',
'Save and continue edit' => 'Zapisz i kontynuuj edycję',
'Save and insert next' => 'Zapisz i dodaj następny',
'Selected' => 'Zaznaczone',
'Clone' => 'Duplikuj',
'Delete' => 'Usuń',
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
@@ -303,7 +320,6 @@ $translations = array(
'Schema has been dropped.' => 'Schemat został usunięty.',
'Schema has been created.' => 'Schemat został utworzony.',
'Schema has been altered.' => 'Schemat został zmieniony.',
'schema' => 'schemat',
'Schema' => 'Schemat',
'Invalid schema.' => 'Nieprawidłowy schemat.',

263
adminer/lang/pt-br.inc.php Normal file
View File

@@ -0,0 +1,263 @@
<?php
$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Saída bem sucedida.',
'Invalid credentials.' => 'Identificação inválida.',
'Server' => 'Servidor',
'Username' => 'Usuário',
'Password' => 'Senha',
'Select database' => 'Selecionar Base de dados',
'Invalid database.' => 'Base de dados inválida.',
'Table has been dropped.' => 'A Tabela foi eliminada.',
'Table has been altered.' => 'A Tabela foi alterada.',
'Table has been created.' => 'A Tabela foi criada.',
'Alter table' => 'Alterar estrutura',
'Create table' => 'Criar tabela',
'Table name' => 'Nome da tabela',
'engine' => 'motor',
'collation' => 'collation',
'Column name' => 'Nome da coluna',
'Type' => 'Tipo',
'Length' => 'Tamanho',
'Auto Increment' => 'Incremento Automático',
'Options' => 'Opções',
'Save' => 'Salvar',
'Drop' => 'Apagar',
'Database has been dropped.' => 'A Base de dados foi apagada.',
'Database has been created.' => 'A Base de dados foi criada.',
'Database has been renamed.' => 'A Base de dados foi renomeada.',
'Database has been altered.' => 'A Base de dados foi alterada.',
'Alter database' => 'Alterar Base de dados',
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Logout' => 'Sair',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'select' => 'selecionar',
'Item has been deleted.' => 'O Registro foi deletado.',
'Item has been updated.' => 'O Registro foi atualizado.',
'Item%s has been inserted.' => 'O Registro%s foi inserido.',
'Edit' => 'Editar',
'Insert' => 'Inserir',
'Save and insert next' => 'Salvar e inserir outro',
'Delete' => 'Deletar',
'Database' => 'Base de dados',
'Routines' => 'Rotinas',
'Indexes have been altered.' => 'Os Índices foram alterados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Alterar índices',
'Add next' => 'Adicionar proximo',
'Language' => 'Idioma',
'Select' => 'Selecionar',
'New item' => 'Novo Registro',
'Search' => 'Procurar',
'Sort' => 'Ordenar',
'descending' => 'decrescente',
'Limit' => 'Limite',
'No rows.' => 'Não existem registros.',
'Action' => 'Ação',
'edit' => 'editar',
'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
'Error in query' => 'Erro na consulta',
'Execute' => 'Executar',
'Table' => 'Tabela',
'Foreign keys' => 'Chaves estrangeiras',
'Triggers' => 'Triggers',
'View' => 'Visão',
'Unable to select the table' => 'Não é possivel selecionar a Tabela',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Enviar o formulario novamente.',
'Comment' => 'Comentário',
'Default values' => 'Valores padrões',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Nenhum comando para executar.',
'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
'File upload' => 'Importar arquivo',
'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
'Routine has been called, %d row(s) affected.' => array('Rotina executada, %d registro afetado.', 'Rotina executada, %d registros afetados.'),
'Call' => 'Chamar',
'No extension' => 'Não há extension',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
'Session support must be enabled.' => 'Suporte a sessões deve estar habilitado.',
'Session expired, please login again.' => 'Sessão expirada, por favor logue-se novamente.',
'Text length' => 'Tamanho de texto',
'Foreign key has been dropped.' => 'A Chave Estrangeira foi apagada.',
'Foreign key has been altered.' => 'A Chave Estrangeira foi alterada.',
'Foreign key has been created.' => 'A Chave Estrangeira foi criada.',
'Foreign key' => 'Chave Estrangeira',
'Target table' => 'Tabela de destino',
'Change' => 'Modificar',
'Source' => 'Origem',
'Target' => 'Destino',
'Add column' => 'Adicionar coluna',
'Alter' => 'Alterar',
'Add foreign key' => 'Adicionar Chave Estrangeira',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Coluna (tamanho)',
'View has been dropped.' => 'A Visão foi apagada.',
'View has been altered.' => 'A Visão foi alterada.',
'View has been created.' => 'A Visão foi criada.',
'Alter view' => 'Alterar visão',
'Create view' => 'Criar visão',
'Name' => 'Nome',
'Process list' => 'Lista de processos',
'%d process(es) have been killed.' => array('%d processo foi terminado.', '%d processos foram terminados.'),
'Kill' => 'Parar',
'Parameter name' => 'Nome de Parâmetro',
'Database schema' => 'Esquema de Base de dados',
'Create procedure' => 'Criar procedimento',
'Create function' => 'Criar função',
'Routine has been dropped.' => 'A Rotina foi apagada.',
'Routine has been altered.' => 'A Rotina foi alterada.',
'Routine has been created.' => 'A Rotina foi criada.',
'Alter function' => 'Alterar função',
'Alter procedure' => 'Alterar procedimento',
'Return type' => 'Tipo de valor de retorno',
'Add trigger' => 'Adicionar trigger',
'Trigger has been dropped.' => 'O Trigger foi apagado.',
'Trigger has been altered.' => 'O Trigger foi alterado.',
'Trigger has been created.' => 'O Trigger foi criado.',
'Alter trigger' => 'Alterar Trigger',
'Create trigger' => 'Adicionar Trigger',
'Time' => 'Tempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versão %s: %s através da extensão PHP %s',
'%d row(s)' => array('%d registro', '%d registros'),
'Remove' => 'Remover',
'Are you sure?' => 'Você tem certeza?',
'Privileges' => 'Privilégios',
'Create user' => 'Criar Usuário',
'User has been dropped.' => 'O Usuário foi apagado.',
'User has been altered.' => 'O Usuário foi alterado.',
'User has been created.' => 'O Usuário foi criado.',
'Hashed' => 'Hash',
'Column' => 'Coluna',
'Routine' => 'Rotina',
'Grant' => 'Conceder',
'Revoke' => 'Impedir',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduza o tamanho ou aumente a diretiva de configuração %s.',
'Logged as: %s' => 'Logado como: %s',
'Move up' => 'Mover acima',
'Move down' => 'Mover abaixo',
'Functions' => 'Funções',
'Aggregation' => 'Adições',
'Export' => 'Exportar',
'Output' => 'Saída',
'open' => 'abrir',
'save' => 'salvar',
'Format' => 'Formato',
'Tables' => 'Tabelas',
'Data' => 'Dados',
'Event has been dropped.' => 'O Evento foi apagado.',
'Event has been altered.' => 'O Evento foi alterado.',
'Event has been created.' => 'O Evento foi criado.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Criar Evento',
'At given time' => 'A hora determinada',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Agenda',
'Start' => 'Início',
'End' => 'Fim',
'Status' => 'Estado',
'On completion preserve' => 'Ao completar preservar',
'Tables and views' => 'Tabelas e Visões',
'Data Length' => 'Tamanho de dados',
'Index Length' => 'Tamanho de índice',
'Data Free' => 'Espaço Livre',
'Collation' => 'Colação',
'Analyze' => 'Analizar',
'Optimize' => 'Otimizar',
'Check' => 'Verificar',
'Repair' => 'Reparar',
'Truncate' => 'Truncar',
'Tables have been truncated.' => 'As Tabelas foram truncadas.',
'Rows' => 'Registros',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'As Tabelas foram movidas.',
'Move to other database' => 'Mover para outra Base de dados',
'Move' => 'Mover',
'Engine' => 'Motor',
'Save and continue edit' => 'Salvar e continuar editando',
'original' => 'original',
'Tables have been dropped.' => 'As Tabelas foram eliminadas.',
'%d item(s) have been affected.' => array('%d item foi afetado.', '%d itens foram afetados.'),
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Partições',
'Partition name' => 'Nome da Partição',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d registro foi importado.', '%d registros foram importados.'),
'anywhere' => 'qualquer local',
'Import' => 'Importar',
'Stop on error' => 'Parar em caso de erro',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Histórico',
'Variables' => 'Variáveis',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registro referenciado deve existir.',
'Relations' => 'Relações',
'Run file' => 'Executar Arquivo',
'Clear' => 'Limpar',
'Maximum allowed file size is %sB.' => 'Tamanho máximo do arquivo permitido é %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadena',
'Binary' => 'Binário',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'E-mail',
'From' => 'De',
'Subject' => 'Assunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email foi enviado.', '%d emails foram enviados.'),
'Webserver file %s' => 'Arquivo do servidor web %s',
'File does not exist.' => 'Arquivo não existe.',
'%d in total' => '%d no total',
'Permanent login' => 'Login permanente',
'Databases have been dropped.' => 'A Base de dados foi apagada.',
'Search data in tables' => 'Buscar dados nas Tabelas',
'Schema' => 'Esquema',
'Alter schema' => 'Alterar esquema',
'Create schema' => 'Criar esquema',
'Schema has been dropped.' => 'O Esquema foi apagado.',
'Schema has been created.' => 'O Esquema foi criado.',
'Schema has been altered.' => 'O Esquema foi alterado.',
'Sequences' => 'Sequências',
'Create sequence' => 'Criar sequência',
'Alter sequence' => 'Alterar sequência',
'Sequence has been dropped.' => 'A Sequência foi apagada.',
'Sequence has been created.' => 'A Sequência foi criada.',
'Sequence has been altered.' => 'A Sequência foi alterada.',
'User types' => 'Tipos definidos pelo usuário',
'Create type' => 'Criar tipo',
'Alter type' => 'Alterar tipo',
'Type has been dropped.' => 'O Tipo foi apagado.',
'Type has been created.' => 'O Tipo foi criado.',
'Ctrl+click on a value to modify it.' => 'Ctrl+clique sobre o valor para edita-lo.',
'Use edit link to modify this value.' => 'Utilize o link editar para modificar este valor.',
'last' => 'último',
'From server' => 'A partir do servidor',
'System' => 'Sistema',
'Select data' => 'Selecionar dados',
'Show structure' => 'Mostrar estrutura',
'empty' => 'vazio',
'Network' => 'Rede',
'Geometry' => 'Geometria',
'File exists.' => 'Arquivo já existe.',
'Attachments' => 'Anexos',
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
'Show only errors' => 'Mostrar somente erros',
'Refresh' => 'Atualizar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',
'now' => 'agora',
'ltr' => 'ltr',
);

View File

@@ -1,14 +1,13 @@
<?php
$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Saida bem sucedida.',
'Logout successful.' => 'Sessão terminada com sucesso.',
'Invalid credentials.' => 'Identificação inválida.',
'Server' => 'Servidor',
'Username' => 'Usuário',
'Username' => 'Nome de utilizador',
'Password' => 'Senha',
'Select database' => 'Selecionar Base de dados',
'Invalid database.' => 'Base de dados inválida.',
'Create new database' => 'Criar nova base de dados',
'Table has been dropped.' => 'Tabela eliminada.',
'Table has been altered.' => 'Tabela modificada.',
'Table has been created.' => 'Tabela criada.',
@@ -22,7 +21,7 @@ $translations = array(
'Length' => 'Tamanho',
'Auto Increment' => 'Incremento Automático',
'Options' => 'Opções',
'Save' => 'Salvar',
'Save' => 'Guardar',
'Drop' => 'Remover',
'Database has been dropped.' => 'Base de dados eliminada.',
'Database has been created.' => 'Base de dados criada.',
@@ -31,42 +30,40 @@ $translations = array(
'Alter database' => 'Modificar Base de dados',
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Dump' => 'Exportar',
'Logout' => 'Sair',
'Logout' => 'Terminar sessão',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'select' => 'registros',
'Create new table' => 'Nova tabela',
'Item has been deleted.' => 'Registro eliminado.',
'Item has been updated.' => 'Registro modificado.',
'Item%s has been inserted.' => 'Registro%s inserido.',
'select' => 'registos',
'Item has been deleted.' => 'Registo eliminado.',
'Item has been updated.' => 'Registo modificado.',
'Item%s has been inserted.' => 'Registo%s inserido.',
'Edit' => 'Modificar',
'Insert' => 'Inserir',
'Save and insert next' => 'Salvar e inserir outro',
'Delete' => 'Apagar',
'Save and insert next' => 'Guardar e inserir outro',
'Delete' => 'Eliminar',
'Database' => 'Base de dados',
'Routines' => 'Procedimentos',
'Indexes have been altered.' => 'Índices modificados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar índices',
'Add next' => 'Adicionar proximo',
'Add next' => 'Adicionar próximo',
'Language' => 'Idioma',
'Select' => 'Selecionar',
'New item' => 'Novo Registro',
'New item' => 'Novo Registo',
'Search' => 'Procurar',
'Sort' => 'Ordenar',
'descending' => 'decrescente',
'Limit' => 'Limite',
'No rows.' => 'Não existem registros.',
'No rows.' => 'Não existem registos.',
'Action' => 'Ação',
'edit' => 'modificar',
'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
'Query executed OK, %d row(s) affected.' => array('Consulta executada, %d registo afetado.', 'Consulta executada, %d registos afetados.'),
'Error in query' => 'Erro na consulta',
'Execute' => 'Executar',
'Table' => 'Tabela',
'Foreign keys' => 'Chaves foráneas',
'Foreign keys' => 'Chaves estrangeiras',
'Triggers' => 'Triggers',
'View' => 'Visualizar',
'Unable to select the table' => 'Não é possivel selecionar a Tabela',
@@ -75,27 +72,27 @@ $translations = array(
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Nenhum comando para executar.',
'Unable to upload a file.' => 'Não é possível enviar o arquivo.',
'File upload' => 'Importar arquivo',
'File uploads are disabled.' => 'Importação de arquivos desablilitada.',
'Routine has been called, %d row(s) affected.' => array('Consulta executada, %d registro afetado.', 'Consulta executada, %d registros afetados.'),
'Unable to upload a file.' => 'Não é possível enviar o ficheiro.',
'File upload' => 'Importar ficheiro',
'File uploads are disabled.' => 'Importação de ficheiros desativada.',
'Routine has been called, %d row(s) affected.' => array('Consulta executada, %d registo afetado.', 'Consulta executada, %d registos afetados.'),
'Call' => 'Chamar',
'No extension' => 'Não há extension',
'No extension' => 'Não há extensão',
'None of the supported PHP extensions (%s) are available.' => 'Nenhuma das extensões PHP suportadas (%s) está disponivel.',
'Session support must be enabled.' => 'Devem estar habilitadas as sessões.',
'Session expired, please login again.' => 'Sessão expirada, por favor entre sua Chave de novo.',
'Text length' => 'Tamanho de texto',
'Foreign key has been dropped.' => 'Chave externa eliminada.',
'Foreign key has been altered.' => 'Chave externa modificada.',
'Foreign key has been created.' => 'Chave externa criada.',
'Foreign key' => 'Chave externa',
'Session support must be enabled.' => 'As sessões devem estar ativas.',
'Session expired, please login again.' => 'Sessão expirada, por favor entre de novo.',
'Text length' => 'Tamanho do texto',
'Foreign key has been dropped.' => 'Chave estrangeira eliminada.',
'Foreign key has been altered.' => 'Chave estrangeira modificada.',
'Foreign key has been created.' => 'Chave estrangeira criada.',
'Foreign key' => 'Chave estrangeira',
'Target table' => 'Tabela de destino',
'Change' => 'Modificar',
'Source' => 'Origem',
'Target' => 'Destino',
'Add column' => 'Adicionar coluna',
'Alter' => 'Modificar',
'Add foreign key' => 'Adicionar Chave foránea',
'Add foreign key' => 'Adicionar Chave estrangeira',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
@@ -118,7 +115,7 @@ $translations = array(
'Routine has been created.' => 'Procedimento criado.',
'Alter function' => 'Modificar Função',
'Alter procedure' => 'Modificar procedimento',
'Return type' => 'Tipo de valor de regreso',
'Return type' => 'Tipo de valor de regresso',
'Add trigger' => 'Adicionar trigger',
'Trigger has been dropped.' => 'Trigger eliminado.',
'Trigger has been altered.' => 'Trigger modificado.',
@@ -128,29 +125,29 @@ $translations = array(
'Time' => 'Tempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versão %s: %s através da extensão PHP %s',
'%d row(s)' => array('%d registro', '%d registros'),
'%d row(s)' => array('%d registo', '%d registos'),
'Remove' => 'Remover',
'Are you sure?' => 'Está seguro?',
'Are you sure?' => 'Tem a certeza?',
'Privileges' => 'Privilégios',
'Create user' => 'Criar Usuário',
'User has been dropped.' => 'Usuário eliminado.',
'User has been altered.' => 'Usuário modificado.',
'User has been created.' => 'Usuário criado.',
'Create user' => 'Criar utilizador',
'User has been dropped.' => 'Utilizador eliminado.',
'User has been altered.' => 'Utilizador modificado.',
'User has been created.' => 'Utilizador criado.',
'Hashed' => 'Hash',
'Column' => 'Coluna',
'Routine' => 'Rotina',
'Grant' => 'Conceder',
'Revoke' => 'Impedir',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduza o tamanho ou aumente a diretiva de configuração %s.',
'Logged as: %s' => 'Logado como: %s',
'Move up' => 'Mover acima',
'Move down' => 'Mover abaixo',
'Logged as: %s' => 'Ligado como: %s',
'Move up' => 'Mover para cima',
'Move down' => 'Mover para baixo',
'Functions' => 'Funções',
'Aggregation' => 'Adições',
'Export' => 'Exportar',
'Output' => 'Saída',
'open' => 'mostrar',
'save' => 'salvas',
'open' => 'abrir',
'save' => 'guardar',
'Format' => 'Formato',
'Tables' => 'Tabelas',
'Data' => 'Dados',
@@ -159,14 +156,14 @@ $translations = array(
'Event has been created.' => 'Evento criado.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Criar Evento',
'At given time' => 'A hora determinada',
'At given time' => 'À hora determinada',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Agenda',
'Start' => 'Início',
'End' => 'Fim',
'Status' => 'Estado',
'On completion preserve' => 'Ao completar preservar',
'On completion preserve' => 'Preservar ao completar',
'Tables and views' => 'Tabelas e vistas',
'Data Length' => 'Tamanho de dados',
'Index Length' => 'Tamanho de índice',
@@ -178,24 +175,25 @@ $translations = array(
'Repair' => 'Reparar',
'Truncate' => 'Truncar',
'Tables have been truncated.' => 'Tabelas truncadas (truncate).',
'Rows' => 'Registros',
'Rows' => 'Registos',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'As Tabelas foram movidas.',
'Move to other database' => 'Mover outra Base de dados',
'Move' => 'Mover',
'Engine' => 'Motor',
'Save and continue edit' => 'Salvar e continuar editando',
'Save and continue edit' => 'Guardar e continuar a edição',
'original' => 'original',
'Tables have been dropped.' => 'Tabelas eliminadas.',
'Tables have been dropped.' => 'As tabelas foram eliminadas.',
'%d item(s) have been affected.' => array('%d item afetado.', '%d itens afetados.'),
'whole result' => 'resultado completo',
'Whole result' => 'Resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s e %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Quantidade máxima de campos permitidos excedidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Partições',
'Partition name' => 'Nome da Partição',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
'%d row(s) have been imported.' => array('%d registo importado.', '%d registos importados.'),
'anywhere' => 'qualquer local',
'Import' => 'Importar',
'Stop on error' => 'Parar em caso de erro',
@@ -204,14 +202,14 @@ $translations = array(
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Histórico',
'Variables' => 'Variáveis',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registro referenciado deve existir.',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'As colunas de origen e destino devem ser do mesmo tipo, deve existir um índice entre as colunas de destino e o registo referenciado deve existir.',
'Relations' => 'Relações',
'Run file' => 'Executar Arquivo',
'Run file' => 'Executar ficheiro',
'Clear' => 'Limpar',
'Maximum allowed file size is %sB.' => 'Tamanho máximo do arquivo é %sB.',
'Maximum allowed file size is %sB.' => 'Tamanho máximo do ficheiro é %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadena',
'Strings' => 'Cadeia',
'Binary' => 'Binário',
'Lists' => 'Listas',
'Editor' => 'Editor',
@@ -220,13 +218,12 @@ $translations = array(
'Subject' => 'Assunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Arquivo do servidor web %s',
'File does not exist.' => 'Arquivo não existe.',
'Webserver file %s' => 'Ficheiro do servidor web %s',
'File does not exist.' => 'Ficheiro não existe.',
'%d in total' => '%d no total',
'Permanent login' => 'Salvar Senha',
'Permanent login' => 'Memorizar a senha',
'Databases have been dropped.' => 'Bases de dados eliminadas.',
'Search data in tables' => 'Buscar dados nas Tabelas',
'schema' => 'esquema',
'Search data in tables' => 'Pesquisar dados nas Tabelas',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Criar esquema',
@@ -239,7 +236,7 @@ $translations = array(
'Sequence has been dropped.' => 'Sequência eliminada.',
'Sequence has been created.' => 'Sequência criada.',
'Sequence has been altered.' => 'Sequência modificada.',
'User types' => 'Tipos definido pelo usuário',
'User types' => 'Tipos definidos pelo utilizador',
'Create type' => 'Criar tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
@@ -247,18 +244,17 @@ $translations = array(
'Ctrl+click on a value to modify it.' => 'Ctrl+clique vezes sobre o valor para edita-lo.',
'Use edit link to modify this value.' => 'Utilize o link modificar para alterar.',
'last' => 'último',
'From server' => 'Desde servidor',
'From server' => 'Do servidor',
'System' => 'Motor de Base de dados',
'Select data' => 'Selecionar dados',
'Show structure' => 'Mostrar estrutura',
'empty' => 'vazio',
'Network' => 'Rede',
'Geometry' => 'Geometria',
'File exists.' => 'Arquivo já existe.',
'File exists.' => 'Ficheiro já existe.',
'Attachments' => 'Anexos',
'%d query(s) executed OK.' => array('%d consulta sql executada corretamente.', '%d consultas sql executadas corretamente.'),
'Show only errors' => 'Mostrar somente erros',
'Last page' => 'Última página',
'Refresh' => 'Atualizar',
'Invalid schema.' => 'Esquema inválido.',
'Please use one of the extensions %s.' => 'Por favor use uma das extensões %s.',

View File

@@ -1,14 +1,13 @@
<?php
$translations = array(
'Login' => 'Intră',
'Logout successful.' => 'Ați eșit cu succes.',
'Logout successful.' => 'Ați ieșit cu succes.',
'Invalid credentials.' => 'Numele de utilizator sau parola este greșită.',
'Server' => 'Server',
'Username' => 'Nume de utilizator',
'Password' => 'Parola',
'Select database' => 'Alege baza de date',
'Invalid database.' => 'Bază de deate invalidă.',
'Create new database' => 'Crează o bază de date nouă',
'Table has been dropped.' => 'Tabelul a fost șters.',
'Table has been altered.' => 'Tabelul a fost modificat.',
'Table has been created.' => 'Tabelul a fost creat.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'Modifică baza de date',
'Create database' => 'Crează baza de date',
'SQL command' => 'SQL query',
'Dump' => 'Dump',
'Logout' => 'Eșire',
'Logout' => 'Ieșire',
'database' => 'baza de date',
'Use' => 'Alege',
'No tables.' => 'În baza de date nu sunt tabele.',
'select' => 'selectează',
'Create new table' => 'Crează tabel nou',
'Item has been deleted.' => 'Înregistrare a fost ștearsă.',
'Item has been updated.' => 'Înregistrare a fost înnoită.',
'Item%s has been inserted.' => 'Înregistrarea%s a fost inserată.',
@@ -47,9 +44,9 @@ $translations = array(
'Delete' => 'Șterge',
'Database' => 'Baza de date',
'Routines' => 'Proceduri și funcții salvate',
'Indexes have been altered.' => 'Indexele au fost modificate.',
'Indexes' => 'Indexe',
'Alter indexes' => 'Modifică indexe',
'Indexes have been altered.' => 'Indexurile au fost modificate.',
'Indexes' => 'Indexuri',
'Alter indexes' => 'Modifică indexuri',
'Add next' => 'Adaugă încă',
'Language' => 'Limba',
'Select' => 'Selectează',
@@ -63,11 +60,11 @@ $translations = array(
'edit' => 'editare',
'Page' => 'Pagina',
'Query executed OK, %d row(s) affected.' => array('Query executat, %d înscriere modificată.', 'Query executat, %d înscrieri modificate.'),
'Error in query' => 'Eroare în query',
'Error in query' => 'Greșeală în query',
'Execute' => 'Execută',
'Table' => 'Tabel',
'Foreign keys' => 'Cheiuri externe',
'Triggers' => 'Triggere',
'Foreign keys' => 'Chei externe',
'Triggers' => 'Declanșatoare',
'View' => 'Reprezentare',
'Unable to select the table' => 'Nu am putut selecta date din tabel',
'Invalid CSRF token. Send the form again.' => 'CSRF token imposibil. Retrimite forma.',
@@ -78,24 +75,24 @@ $translations = array(
'Unable to upload a file.' => 'Nu am putut încărca fișierul pe server.',
'File upload' => 'Încarcă fișierul',
'File uploads are disabled.' => 'Încărcarea fișierelor este interzisă.',
'Routine has been called, %d row(s) affected.' => array('A fost executată procedură, %d înscriere a fost modificată.', 'A fost executată procedură, %d înscrieri au fost modificate.'),
'Routine has been called, %d row(s) affected.' => array('A fost executată procedura, %d înscriere a fost modificată.', 'A fost executată procedura, %d înscrieri au fost modificate.'),
'Call' => 'Apelează',
'No extension' => 'Nu este extensie',
'None of the supported PHP extensions (%s) are available.' => 'Nu este aviabilă nici o extensie suportată (%s).',
'Session support must be enabled.' => 'Sesiunile trebuie să fie pornite.',
'Session expired, please login again.' => 'Timpul sesiunii a expirat, rog să te loghezi din nou.',
'Session expired, please login again.' => 'Timpul sesiunii a expirat, rog să vă conectați din nou.',
'Text length' => 'Lungimea textului',
'Foreign key has been dropped.' => 'Chei extern a fost șters.',
'Foreign key has been altered.' => 'Chei extern a fost modificat.',
'Foreign key has been created.' => 'Chei extern a fost creat.',
'Foreign key' => 'Chei extern',
'Foreign key has been dropped.' => 'Cheia externă a fost ștearsă.',
'Foreign key has been altered.' => 'Cheia externă a fost modificată.',
'Foreign key has been created.' => 'Cheia externă a fost creată.',
'Foreign key' => 'Cheie externă',
'Target table' => 'Tabela scop',
'Change' => 'Modifică',
'Source' => 'Sursă',
'Target' => 'Scop',
'Add column' => 'Adaugă coloană',
'Alter' => 'Modifică',
'Add foreign key' => 'Adaugă chei extern',
'Add foreign key' => 'Adaugă cheie externă',
'ON DELETE' => 'La ștergere',
'ON UPDATE' => 'La modificare',
'Index Type' => 'Tipul indexului',
@@ -103,11 +100,11 @@ $translations = array(
'View has been dropped.' => 'Reprezentarea a fost ștearsă.',
'View has been altered.' => 'Reprezentarea a fost modificată.',
'View has been created.' => 'Reprezentarea a fost creată.',
'Alter view' => 'Modifică reprezentare',
'Alter view' => 'Modifică reprezentarea',
'Create view' => 'Crează reprezentare',
'Name' => 'Titlu',
'Process list' => 'Lista proceselor',
'%d process(es) have been killed.' => array('A fost finisat %d proces.', 'Au fost finisate %d procese.'),
'%d process(es) have been killed.' => array('A fost terminat %d proces.', 'Au fost terminate %d procese.'),
'Kill' => 'Termină',
'Parameter name' => 'Numele parametrului',
'Database schema' => 'Schema bazei de date',
@@ -119,7 +116,7 @@ $translations = array(
'Alter function' => 'Modifică funcția',
'Alter procedure' => 'Modifică procedura',
'Return type' => 'Tipul returnării',
'Add trigger' => 'Adaugă trigger',
'Add trigger' => 'Adaugă trigger (declanșator)',
'Trigger has been dropped.' => 'Triggerul a fost șters.',
'Trigger has been altered.' => 'Triggerul a fost modificat.',
'Trigger has been created.' => 'Triggerul a fost creat.',
@@ -130,8 +127,8 @@ $translations = array(
'%s version: %s through PHP extension %s' => 'Versiunea %s: %s cu extensia PHP %s',
'%d row(s)' => array('%d înscriere', '%d înscrieri'),
'Remove' => 'Șterge',
'Are you sure?' => 'Ești precis?',
'Privileges' => 'Privelegii',
'Are you sure?' => 'Sunteți sigur(ă)?',
'Privileges' => 'Privilegii',
'Create user' => 'Crează utilizator',
'User has been dropped.' => 'Utilizatorul a fost șters.',
'User has been altered.' => 'Utilizatorul a fost modificat.',
@@ -148,7 +145,7 @@ $translations = array(
'Functions' => 'Funcții',
'Aggregation' => 'Agregare',
'Export' => 'Export',
'Output' => 'Date de eșire',
'Output' => 'Date de ieșire',
'open' => 'deschide',
'save' => 'salvează',
'Format' => 'Format',
@@ -164,12 +161,12 @@ $translations = array(
'Events' => 'Evenimente',
'Schedule' => 'Program',
'Start' => 'Început',
'End' => 'Svârșit',
'End' => 'Sfârșit',
'Status' => 'Stare',
'On completion preserve' => 'Salvează după finisare',
'Tables and views' => 'Tabele și reprezentări',
'Data Length' => 'Cantitatea de date',
'Index Length' => 'Cantitatea de indexe',
'Index Length' => 'Cantitatea de indecși',
'Data Free' => 'Spațiu liber',
'Collation' => 'Colaționare',
'Analyze' => 'Analizează',
@@ -180,6 +177,7 @@ $translations = array(
'Tables have been truncated.' => 'Tabelele au fost curățate.',
'Rows' => 'Înscrieri',
',' => ',',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Tabelele au fost mutate.',
'Move to other database' => 'Mută în altă bază de date',
'Move' => 'Mută',
@@ -187,7 +185,7 @@ $translations = array(
'Save and continue edit' => 'Salvează și continuă editarea',
'original' => 'original',
'%d item(s) have been affected.' => array('A fost modificată %d înscriere.', 'Au fost modificate %d înscrieri.'),
'whole result' => 'tot rezultatul',
'Whole result' => 'Tot rezultatul',
'Tables have been dropped.' => 'Tabelele au fost șterse.',
'Clone' => 'Clonează',
'Partition by' => 'Împarte',
@@ -196,8 +194,8 @@ $translations = array(
'Values' => 'Parametru',
'%d row(s) have been imported.' => array('%d rînd importat.', '%d rînduri importate.'),
'Import' => 'Importă',
'Stop on error' => 'Opreștete la eroare',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s și %s.',
'Stop on error' => 'Se oprește la greșeală',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s.',
'anywhere' => 'oriunde',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
@@ -207,11 +205,11 @@ $translations = array(
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Coloanele ar trebui să aibă aceleaşi tipuri de date, trebuie să existe date de referinţă și un index pe coloanela-ţintă.',
'Relations' => 'Relații',
'Run file' => 'Execută fișier',
'Clear' => 'Curățp',
'Clear' => 'Curăță',
'Maximum allowed file size is %sB.' => 'Fișierul maxim admis - %sO.',
'Numbers' => 'Număr',
'Date and time' => 'Data și timpul',
'Strings' => 'Șire de caractere',
'Strings' => 'Șiruri de caractere',
'Binary' => 'Tip binar',
'Lists' => 'Liste',
'Editor' => 'Editor',
@@ -219,14 +217,13 @@ $translations = array(
'From' => 'De la',
'Subject' => 'Pentru',
'Send' => 'Trimite',
'%d e-mail(s) have been sent.' => array('A fost trimisă %d scrisoare.', 'Au fost trimise %d scrisori.'),
'%d e-mail(s) have been sent.' => array('A fost trimis %d mail.', 'Au fost trimise %d mail-uri.'),
'Webserver file %s' => 'Fișierul %s pe server',
'File does not exist.' => 'Așa fișier nu există.',
'File does not exist.' => 'Acest fișier nu există.',
'%d in total' => 'În total %d',
'Permanent login' => 'Logare permanentă',
'Databases have been dropped.' => 'Baze de date au fost șterse.',
'Databases have been dropped.' => 'Bazele de date au fost șterse.',
'Search data in tables' => 'Caută în tabele',
'schema' => 'schema',
'Schema' => 'Schema',
'Alter schema' => 'Modifică schema',
'Create schema' => 'Crează o schemă',
@@ -248,17 +245,16 @@ $translations = array(
'Use edit link to modify this value.' => 'Valoare poate fi modificată cu ajutorul butonului «modifică».',
'last' => 'ultima',
'From server' => 'De pe server',
'System' => 'Sistema',
'System' => 'Sistem',
'Select data' => 'Selectează',
'Show structure' => 'Arată structura',
'empty' => 'gol',
'Network' => 'Rețea',
'Geometry' => 'Geometrie',
'File exists.' => 'Fișierul deja există.',
'File exists.' => 'Fișierul există deja.',
'Attachments' => 'Fișiere atașate',
'%d query(s) executed OK.' => array('%d query executat.', '%d query-uri executate cu succes.'),
'Show only errors' => 'Arată doar greșeli',
'Last page' => 'Ultima pagină',
'Refresh' => 'Împrospătează',
'Invalid schema.' => 'Schemă incorectă.',
'Please use one of the extensions %s.' => 'Folosiți una din următoarele extensii %s.',

View File

@@ -7,15 +7,14 @@ $translations = array(
'Username' => 'Имя пользователя',
'Password' => 'Пароль',
'Select database' => 'Выбрать базу данных',
'Invalid database.' => 'Плохая база данных.',
'Create new database' => 'Создать новую базу данных',
'Invalid database.' => 'Неверная база данных.',
'Table has been dropped.' => 'Таблица была удалена.',
'Table has been altered.' => 'Таблица была изменена.',
'Table has been created.' => 'Таблица была создана.',
'Alter table' => 'Изменить таблицу',
'Create table' => 'Создать таблицу',
'Table name' => 'Название таблицы',
'engine' => 'тип',
'engine' => 'Тип таблицы',
'collation' => 'режим сопоставления',
'Column name' => 'Название поля',
'Type' => 'Тип',
@@ -30,27 +29,25 @@ $translations = array(
'Database has been altered.' => 'База данных была изменена.',
'Alter database' => 'Изменить базу данных',
'Create database' => 'Создать базу данных',
'SQL command' => 'SQL запрос',
'Dump' => 'Дамп',
'SQL command' => 'SQL-запрос',
'Logout' => 'Выйти',
'database' => 'база данных',
'Use' => 'Выбрать',
'No tables.' => 'В базе данных нет таблиц.',
'select' => 'выбрать',
'Create new table' => 'Создать новую таблицу',
'Item has been deleted.' => 'Запись удалена.',
'Item has been updated.' => 'Запись обновлена.',
'Item%s has been inserted.' => 'Запись%s была вставлена.',
'Edit' => 'Редактировать',
'Insert' => 'Вставить',
'Save and insert next' => 'Сохранить и вставить еще',
'Save and insert next' => 'Сохранить и вставить ещё',
'Delete' => 'Стереть',
'Database' => 'База данных',
'Routines' => 'Хранимые процедуры и функции',
'Indexes have been altered.' => 'Индексы изменены.',
'Indexes' => 'Индексы',
'Alter indexes' => 'Изменить индексы',
'Add next' => 'Добавить еще',
'Add next' => 'Добавить ещё',
'Language' => 'Язык',
'Select' => 'Выбрать',
'New item' => 'Новая запись',
@@ -62,7 +59,7 @@ $translations = array(
'Action' => 'Действие',
'edit' => 'редактировать',
'Page' => 'Страница',
'Query executed OK, %d row(s) affected.' => array('Запрос завершен, изменена %d запись.', 'Запрос завершен, изменены %d записи.', 'Запрос завершен, изменено %d записей.'),
'Query executed OK, %d row(s) affected.' => array('Запрос завершён, изменена %d запись.', 'Запрос завершён, изменены %d записи.', 'Запрос завершён, изменено %d записей.'),
'Error in query' => 'Ошибка в запросe',
'Execute' => 'Выполнить',
'Table' => 'Таблица',
@@ -70,7 +67,7 @@ $translations = array(
'Triggers' => 'Триггеры',
'View' => 'Представление',
'Unable to select the table' => 'Не удалось получить данные из таблицы',
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF токен. Отправите форму ещё раз.',
'Invalid CSRF token. Send the form again.' => 'Недействительный CSRF-токен. Отправите форму ещё раз.',
'Comment' => 'Комментарий',
'Default values' => 'Значения по умолчанию',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтов'),
@@ -81,25 +78,25 @@ $translations = array(
'Routine has been called, %d row(s) affected.' => array('Была вызвана процедура, %d запись была изменена.', 'Была вызвана процедура, %d записи было изменено.', 'Была вызвана процедура, %d записей было изменено.'),
'Call' => 'Вызвать',
'No extension' => 'Нет расширений',
'None of the supported PHP extensions (%s) are available.' => 'Не доступно ни одного расширения из поддерживаемых (%s).',
'None of the supported PHP extensions (%s) are available.' => 'Недоступно ни одного расширения из поддерживаемых (%s).',
'Session support must be enabled.' => 'Сессии должны быть включены.',
'Session expired, please login again.' => 'Срок действия сесси истек, нужно снова войти в систему.',
'Session expired, please login again.' => 'Срок действия сессии истёк, нужно снова войти в систему.',
'Text length' => 'Длина текста',
'Foreign key has been dropped.' => 'Внешний ключ был удален.',
'Foreign key has been altered.' => 'Внешний ключ был изменен.',
'Foreign key has been dropped.' => 'Внешний ключ был удалён.',
'Foreign key has been altered.' => 'Внешний ключ был изменён.',
'Foreign key has been created.' => 'Внешний ключ был создан.',
'Foreign key' => 'Внешний ключ',
'Target table' => 'Результирующая таблица',
'Change' => 'Изменить',
'Source' => 'Источник',
'Target' => 'Цель',
'Add column' => 'Добавить колонку',
'Add column' => 'Добавить поле',
'Alter' => 'Изменить',
'Add foreign key' => 'Добавить внешний ключ',
'ON DELETE' => 'При стирании',
'ON UPDATE' => 'При обновлении',
'Index Type' => 'Тип индекса',
'Column (length)' => 'Колонка (длина)',
'Column (length)' => 'Поле (длина)',
'View has been dropped.' => 'Представление было удалено.',
'View has been altered.' => 'Представление было изменено.',
'View has been created.' => 'Представление было создано.',
@@ -107,7 +104,7 @@ $translations = array(
'Create view' => 'Создать представление',
'Name' => 'Название',
'Process list' => 'Список процессов',
'%d process(es) have been killed.' => array('Был завершен %d процесс.', 'Было завершено %d процесса.', 'Было завершёно %d процессов.'),
'%d process(es) have been killed.' => array('Был завершён %d процесс.', 'Было завершено %d процесса.', 'Было завершено %d процессов.'),
'Kill' => 'Завершить',
'Parameter name' => 'Название параметра',
'Database schema' => 'Схема базы данных',
@@ -120,8 +117,8 @@ $translations = array(
'Alter procedure' => 'Изменить процедуру',
'Return type' => 'Возвращаемый тип',
'Add trigger' => 'Добавить триггер',
'Trigger has been dropped.' => 'Триггер был удален.',
'Trigger has been altered.' => 'Триггер был изменен.',
'Trigger has been dropped.' => 'Триггер был удалён.',
'Trigger has been altered.' => 'Триггер был изменён.',
'Trigger has been created.' => 'Триггер был создан.',
'Alter trigger' => 'Изменить триггер',
'Create trigger' => 'Создать триггер',
@@ -133,15 +130,15 @@ $translations = array(
'Are you sure?' => 'Вы уверены?',
'Privileges' => 'Полномочия',
'Create user' => 'Создать пользователя',
'User has been dropped.' => 'Пользователь был удален.',
'User has been altered.' => 'Пользователь был изменен.',
'User has been dropped.' => 'Пользователь был удалён.',
'User has been altered.' => 'Пользователь был изменён.',
'User has been created.' => 'Пользователь был создан.',
'Hashed' => 'Хешировано',
'Column' => 'Колонка',
'Column' => 'поле',
'Routine' => 'Процедура',
'Grant' => 'Позволить',
'Revoke' => 'Запретить',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объем данных или увеличьте параметр конфигурационной директивы %s.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Слишком большой объем POST-данных. Пошлите меньший объём данных или увеличьте параметр конфигурационной директивы %s.',
'Logged as: %s' => 'Вы вошли как: %s',
'Move up' => 'Переместить вверх',
'Move down' => 'Переместить вниз',
@@ -180,14 +177,15 @@ $translations = array(
'Tables have been truncated.' => 'Таблицы были очищены.',
'Rows' => 'Строк',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Таблицы были перемещены.',
'Move to other database' => 'Переместить в другою базу данных',
'Move to other database' => 'Переместить в другую базу данных',
'Move' => 'Переместить',
'Engine' => 'Тип',
'Engine' => 'Тип таблиц',
'Save and continue edit' => 'Сохранить и продолжить редактирование',
'original' => 'исходный',
'%d item(s) have been affected.' => array('Была изменена %d запись.', 'Были изменены %d записи.', 'Было изменено %d записей.'),
'whole result' => 'весь результат',
'Whole result' => 'Весь результат',
'Tables have been dropped.' => 'Таблицы были удалены.',
'Clone' => 'Клонировать',
'Partition by' => 'Разделить по',
@@ -197,27 +195,27 @@ $translations = array(
'%d row(s) have been imported.' => array('Импортирована %d строка.', 'Импортировано %d строки.', 'Импортировано %d строк.'),
'Import' => 'Импорт',
'Stop on error' => 'Остановить при ошибке',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s и %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Достигнуто максимальное значение количества доступных полей. Увеличьте %s.',
'anywhere' => 'в любом месте',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'дд.мм.[гггг]',
'History' => 'История',
'Variables' => 'Переменные',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Колонки должны иметь одинаковые типы данных, в результирующей колонке должен быть индекс, данные для импорта должны существовать.',
'Relations' => 'Реляции',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Поля должны иметь одинаковые типы данных, в результирующем поле должен быть индекс, данные для импорта должны существовать.',
'Relations' => 'Отношения',
'Run file' => 'Запустить файл',
'Clear' => 'Очистить',
'Maximum allowed file size is %sB.' => 'Максимальный разрешенный размер файла - %sB.',
'Numbers' => 'Число',
'Maximum allowed file size is %sB.' => 'Максимальный разрешённый размер файла %sB.',
'Numbers' => 'Числа',
'Date and time' => 'Дата и время',
'Strings' => 'Строки',
'Binary' => 'Двоичный тип',
'Lists' => 'Списки',
'Editor' => 'Редактор',
'E-mail' => 'Электропочта',
'E-mail' => 'Эл. почта',
'From' => 'От',
'Subject' => 'Кому',
'Subject' => 'Тема',
'Send' => 'Послать',
'%d e-mail(s) have been sent.' => array('Было отправлено %d письмо.', 'Было отправлено %d письма.', 'Было отправлено %d писем.'),
'Webserver file %s' => 'Файл %s на вебсервере',
@@ -226,7 +224,6 @@ $translations = array(
'Permanent login' => 'Оставаться в системе',
'Databases have been dropped.' => 'Базы данных удалены.',
'Search data in tables' => 'Поиск в таблицах',
'schema' => 'схема',
'Schema' => 'Схема',
'Alter schema' => 'Изменить схему',
'Create schema' => 'Новая схема',
@@ -244,7 +241,7 @@ $translations = array(
'Alter type' => 'Изменить тип',
'Type has been dropped.' => 'Тип удален.',
'Type has been created.' => 'Создан новый тип.',
'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
'Ctrl+click on a value to modify it.' => 'Выполните Ctrl+Щелчок мышью по значению, чтобы его изменить.',
'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
'last' => 'последняя',
'From server' => 'С сервера',
@@ -255,10 +252,9 @@ $translations = array(
'Network' => 'Сеть',
'Geometry' => 'Геометрия',
'File exists.' => 'Файл уже существует.',
'Attachments' => 'Прикрепленные файлы',
'Attachments' => 'Прикреплённые файлы',
'%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%d запросов выполнено успешно.'),
'Show only errors' => 'Только ошибки',
'Last page' => 'Последняя страница',
'Refresh' => 'Обновить',
'Invalid schema.' => 'Неправильная схема.',
'Please use one of the extensions %s.' => 'Используйте одно из этих расширений %s.',
@@ -269,4 +265,28 @@ $translations = array(
'Permanent link' => 'Постоянная ссылка',
'Edit all' => 'Редактировать всё',
'HH:MM:SS' => 'ЧЧ:ММ:СС',
'Tables have been optimized.' => 'Таблицы оптимизированы.',
'Materialized view' => 'Материализованное представление',
'Vacuum' => 'Вакуум',
'Selected' => 'Выбранные',
'File must be in UTF-8 encoding.' => 'Файл должен быть в кодировке UTF-8.',
'Modify' => 'Изменить',
'Loading' => 'Загрузка',
'Load more data' => 'Загрузить ещё данные',
'ATTACH queries are not supported.' => 'ATTACH-запросы не поддерживаются.',
'%d / ' => '%d / ',
'Limit rows' => 'Лимит строк',
'Default value' => 'Значение по умолчанию',
'Full table scan' => 'Анализ полной таблицы',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Слишком много неудачных попыток входа. Попробуйте снова через %d минуту.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минуты.', 'Слишком много неудачных попыток входа. Попробуйте снова через %d минут.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Мастер-пароль истёк. <a href="https://www.adminer.org/en/extension/"%s>Реализуйте</a> метод %s, чтобы сделать его постоянным.',
'If you did not send this request from Adminer then close this page.' => 'Если вы не посылали этот запрос из Adminer, закройте эту страницу.',
'You can upload a big SQL file via FTP and import it from server.' => 'Вы можете закачать большой SQL-файл по FTP и затем импортировать его с сервера.',
'Size' => 'Размер',
'Compute' => 'Вычислить',
'You are offline.' => 'Вы не выполнили вход.',
'You have no privileges to update this table.' => 'У вас нет прав на обновление этой таблицы.',
'Saving' => 'Сохранение',
'yes' => 'Да',
'no' => 'Нет',
);

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'Heslo',
'Select database' => 'Vybrať databázu',
'Invalid database.' => 'Nesprávna databáza.',
'Create new database' => 'Vytvoriť novú databázu',
'Table has been dropped.' => 'Tabuľka bola odstránená.',
'Table has been altered.' => 'Tabuľka bola zmenená.',
'Table has been created.' => 'Tabuľka bola vytvorená.',
@@ -32,13 +31,11 @@ $translations = array(
'Alter database' => 'Zmeniť databázu',
'Create database' => 'Vytvoriť databázu',
'SQL command' => 'SQL príkaz',
'Dump' => 'Export',
'Logout' => 'Odhlásiť',
'database' => 'databáza',
'Use' => 'Vybrať',
'No tables.' => 'Žiadne tabuľky.',
'select' => 'vypísať',
'Create new table' => 'Vytvoriť novú tabuľku',
'Item has been deleted.' => 'Položka bola vymazaná.',
'Item has been updated.' => 'Položka bola aktualizovaná.',
'Item%s has been inserted.' => 'Položka%s bola vložená.',
@@ -181,6 +178,7 @@ $translations = array(
'Data Free' => 'Voľné miesto',
'Rows' => 'Riadky',
',' => ' ',
'0123456789' => '0123456789',
'Analyze' => 'Analyzovať',
'Optimize' => 'Optimalizovať',
'Check' => 'Skontrolovať',
@@ -189,7 +187,7 @@ $translations = array(
'Move to other database' => 'Presunúť do inej databázy',
'Move' => 'Presunúť',
'%d item(s) have been affected.' => '%d položiek bolo ovplyvnených.',
'whole result' => 'celý výsledok',
'Whole result' => 'Celý výsledok',
'Clone' => 'Klonovať',
'Partition by' => 'Rozdeliť podľa',
'Partitions' => 'Oddiely',
@@ -198,7 +196,7 @@ $translations = array(
'%d row(s) have been imported.' => array('Bol importovaný %d záznam.', 'Boli importované %d záznamy.', 'Bolo importovaných %d záznamov.'),
'Import' => 'Import',
'Stop on error' => 'Zastaviť pri chybe',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s a %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Bol prekročený maximálny počet povolených polí. Zvýšte prosím %s.',
'anywhere' => 'kdekoľvek',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
@@ -231,7 +229,6 @@ $translations = array(
'Schema has been dropped.' => 'Schéma bola odstránená.',
'Schema has been created.' => 'Schéma bola vytvorená.',
'Schema has been altered.' => 'Schéma bola zmenená.',
'schema' => 'schéma',
'Schema' => 'Schéma',
'Sequences' => 'Sekvencia',
'Create sequence' => 'Vytvoriť sekvenciu',
@@ -258,7 +255,6 @@ $translations = array(
'Attachments' => 'Prílohy',
'%d query(s) executed OK.' => array('Bol vykonaný %d dotaz.', 'Boli vykonané %d dotazy.', 'Bolo vykonaných %d dotazov.'),
'Show only errors' => 'Zobraziť iba chyby',
'Last page' => 'Posledná stránka',
'Refresh' => 'Obnoviť',
'Invalid schema.' => 'Neplatné schéma.',
'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.',

View File

@@ -65,7 +65,6 @@ $translations = array(
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Preveliko podatkov za POST. Zmanjšajte število podatkov ali povečajte nastavitev za %s.',
'Export' => 'Izvozi',
'Dump' => 'Izvozi',
'Output' => 'Izhod rezultata',
'open' => 'odpri',
'save' => 'shrani',
@@ -77,7 +76,6 @@ $translations = array(
'Use' => 'Uporabi',
'Select database' => 'Izberi bazo',
'Invalid database.' => 'Neveljavna baza.',
'Create new database' => 'Ustvari novo bazo',
'Database has been dropped.' => 'Baza je zavržena.',
'Databases have been dropped.' => 'Baze so zavržene.',
'Database has been created.' => 'Baza je ustvarjena.',
@@ -89,6 +87,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Pogon',
'Collation' => 'Zbiranje',
'Data Length' => 'Velikost podatkov',
@@ -140,7 +139,6 @@ $translations = array(
'No tables.' => 'Ni tabel.',
'Alter table' => 'Spremeni tabelo',
'Create table' => 'Ustvari tabelo',
'Create new table' => 'Ustvari novo tabelo',
'Table has been dropped.' => 'Tabela je zavržena.',
'Tables have been dropped.' => 'Tabele so zavržene.',
'Table has been altered.' => 'Tabela je spremenjena.',
@@ -161,7 +159,7 @@ $translations = array(
'Move up' => 'Premakni gor',
'Move down' => 'Premakni dol',
'Remove' => 'Odstrani',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s in %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Največje število dovoljenih polje je preseženo. Prosimo, povečajte %s.',
'Partition by' => 'Porazdeli po',
'Partitions' => 'Porazdelitve',
@@ -227,8 +225,7 @@ $translations = array(
'%d row(s)' => array('%d vrstica', '%d vrstici', '%d vrstice', '%d vrstic'),
'Page' => 'Stran',
'last' => 'Zadnja',
'Last page' => 'Zadnja stran',
'whole result' => 'cel razultat',
'Whole result' => 'Cel razultat',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
'Import' => 'Uvozi',
@@ -290,7 +287,6 @@ $translations = array(
'Schema has been dropped.' => 'Shema je zavržena.',
'Schema has been created.' => 'Shema je ustvarjena.',
'Schema has been altered.' => 'Shema je spremenjena.',
'schema' => 'shema',
'Schema' => 'Shema',
'Invalid schema.' => 'Neveljavna shema.',

View File

@@ -66,7 +66,6 @@ $translations = array(
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Превелики POST податак. Морате да смањите податак или повећајте вредност конфигурационе директиве %s.',
'Export' => 'Извоз',
'Dump' => 'Истовар',
'Output' => 'Испис',
'open' => 'отвори',
'save' => 'сачувај',
@@ -78,7 +77,6 @@ $translations = array(
'Use' => 'Користи',
'Select database' => 'Изаберите базу',
'Invalid database.' => 'Неисправна база података.',
'Create new database' => 'Направи нову базу података',
'Database has been dropped.' => 'База података је избрисана.',
'Databases have been dropped.' => 'Базњ података су избрисане.',
'Database has been created.' => 'База података је креирана.',
@@ -93,6 +91,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Механизам',
'Collation' => 'Сравњивање',
'Data Length' => 'Дужина података',
@@ -144,7 +143,6 @@ $translations = array(
'No tables.' => 'Без табела.',
'Alter table' => 'Уреди табелу',
'Create table' => 'Направи табелу',
'Create new table' => 'направи нову табелу',
'Table has been dropped.' => 'Табела је избрисана.',
'Tables have been dropped.' => 'Табеле су избрисане.',
'Tables have been optimized.' => 'Табеле су оптимизоване.',
@@ -166,7 +164,7 @@ $translations = array(
'Move up' => 'Помери на горе',
'Move down' => 'Помери на доле',
'Remove' => 'Уклони',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s и %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s.',
'Partition by' => 'Подели по',
'Partitions' => 'Поделе',
@@ -233,10 +231,9 @@ $translations = array(
'%d row(s)' => array('%d ред', '%d реда', '%d редова'),
'Page' => 'Страна',
'last' => 'последња',
'Last page' => 'Последња страна',
'Loading' => 'Учитавам',
'Load more data' => 'Учитавам још података',
'whole result' => 'цео резултат',
'Loading' => 'Учитавам',
'Load more data' => 'Учитавам још података',
'Whole result' => 'Цео резултат',
'%d byte(s)' => array('%d бајт', '%d бајта', '%d бајтова'),
'Import' => 'Увоз',
@@ -302,7 +299,6 @@ $translations = array(
'Schema has been dropped.' => 'Шема је избрисана.',
'Schema has been created.' => 'Шема је креирана.',
'Schema has been altered.' => 'Шема је измењена.',
'schema' => 'шема',
'Schema' => 'Шема',
'Invalid schema.' => 'Шема није исправна.',

View File

@@ -8,7 +8,6 @@ $translations = array(
'Password' => 'க‌ட‌வுச்சொல்',
'Select database' => 'த‌க‌வ‌ல்த‌ள‌த்தை தேர்வு செய்',
'Invalid database.' => 'த‌க‌வ‌ல்த‌ள‌ம் ச‌ரியானதல்ல‌.',
'Create new database' => 'புதிய‌ த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
'Table has been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
'Table has been altered.' => 'அட்ட‌வணை மாற்ற‌ப்ப‌ட்ட‌து.',
'Table has been created.' => 'அட்ட‌வ‌ணை உருவாக்க‌ப்ப‌ட்ட‌து.',
@@ -31,13 +30,11 @@ $translations = array(
'Alter database' => 'த‌க‌வ‌ல்த‌ள‌த்தை மாற்று',
'Create database' => 'த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
'SQL command' => 'SQL க‌ட்ட‌ளை',
'Dump' => 'Dump',
'Logout' => 'வெளியேறு',
'database' => 'த‌க‌வ‌ல்த‌ள‌ம்',
'Use' => 'உப‌யோகி',
'No tables.' => 'அட்ட‌வ‌ணை இல்லை.',
'select' => 'தேர்வு செய்',
'Create new table' => 'புதிய‌ அட்ட‌வ‌ணையை உருவாக்கு',
'Item has been deleted.' => 'உருப்படி நீக்க‌ப்ப‌ட்ட‌து.',
'Item has been updated.' => 'உருப்ப‌டி புதுப்பிக்க‌ப்ப‌ட்ட‌து.',
'Edit' => 'தொகு',
@@ -177,6 +174,7 @@ $translations = array(
'Tables have been truncated.' => 'அட்ட‌வ‌ணை குறைக்க‌ப்ப‌ட்ட‌து (truncated).',
'Rows' => 'வ‌ரிசைக‌ள்',
',' => ',',
'0123456789' => '0123456789',
'Tables have been moved.' => 'அட்ட‌வ‌ணை ந‌க‌ர்த்த‌ப்ப‌ட்ட‌து.',
'Move to other database' => 'ம‌ற்ற‌ த‌க‌வ‌ல் தள‌த்திற்க்கு ந‌க‌ர்த்து',
'Move' => 'ந‌க‌ர்த்து',
@@ -185,9 +183,9 @@ $translations = array(
'original' => 'அச‌ல்',
'Tables have been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
'%d item(s) have been affected.' => array('%d உருப்ப‌டி மாற்ற‌ம‌டைந்தது.', '%d உருப்ப‌டிக‌ள் மாற்ற‌ம‌டைந்த‌ன‌.'),
'whole result' => 'முழுமையான‌ முடிவு',
'Whole result' => 'முழுமையான‌ முடிவு',
'Clone' => 'ந‌க‌லி (Clone)',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'அனும‌திக்க‌ப்ப‌ட்ட‌ அதிக‌ப‌ட்ச‌ கோப்புக‌ளின் எண்ணிக்கை மீற‌ப்ப‌ட்ட‌து. த‌ய‌வு செய்து %s ம‌ற்றும் %s யை அதிக‌ரிக்க‌வும்.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'அனும‌திக்க‌ப்ப‌ட்ட‌ அதிக‌ப‌ட்ச‌ கோப்புக‌ளின் எண்ணிக்கை மீற‌ப்ப‌ட்ட‌து. த‌ய‌வு செய்து %s ம‌ற்றும் %s யை அதிக‌ரிக்க‌வும்.',
'Partition by' => 'பிரித்த‌து',
'Partitions' => 'பிரிவுக‌ள்',
'Partition name' => 'பிரிவின் பெய‌ர்',
@@ -247,7 +245,6 @@ $translations = array(
'System' => 'சிஸ்ட‌ம் (System)',
'anywhere' => 'எங்காயினும்',
'empty' => 'வெறுமை (empty)',
'schema' => 'அமைப்புமுறை',
'No extension' => 'விரிவு (extensஇஒன்) இல்லை ',
'Databases have been dropped.' => 'த‌க‌வ‌ல் த‌ள‌ங்க‌ள் நீக்க‌ப்ப‌ட்டன‌.',
'%s version: %s through PHP extension %s' => '%s ப‌திப்பு: %s through PHP extension %s',
@@ -258,7 +255,6 @@ $translations = array(
'now' => 'இப்பொழுது',
'%d query(s) executed OK.' => array('%d வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து.', '%d வின‌வ‌ல்க‌ள் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌ன‌.'),
'Show only errors' => 'பிழைக‌ளை ம‌ட்டும் காண்பிக்க‌வும்',
'Last page' => 'க‌டைசி ப‌க்க‌ம்',
'Refresh' => 'புதுப்பி (Refresh)',
'Invalid schema.' => 'அமைப்புமுறை ச‌ரியான‌த‌ல்ல‌ (Invalid Schema).',
'Please use one of the extensions %s.' => 'த‌ய‌வு செய்து ஒரு விரிவினை %s (extension) உப‌யோகிக்க‌வும்.',

268
adminer/lang/th.inc.php Normal file
View File

@@ -0,0 +1,268 @@
<?php
$translations = array(
'Login' => 'เข้าสู่ระบบ',
'Logout successful.' => 'ออกจากระบบเรียบร้อยแล้ว.',
'Invalid credentials.' => 'ข้อมูลไม่ถูกต้อง.',
'Server' => 'เซอเวอร์',
'Username' => 'ชื่อผู้ใช้งาน',
'Password' => 'รหัสผ่าน',
'Select database' => 'เลือกฐานข้อมูล',
'Invalid database.' => 'ฐานข้อมูลไม่ถูกต้อง.',
'Table has been dropped.' => 'ลบตารางแล้ว.',
'Table has been altered.' => 'แก้ไขตารางแล้ว.',
'Table has been created.' => 'สร้างตารางใหม่แล้ว.',
'Alter table' => 'เปลี่ยนแปลงตารางแล้ว',
'Create table' => 'สร้างตารางใหม่',
'Table name' => 'ชื่อตาราง',
'engine' => 'ชนิดของฐานข้อมูล',
'collation' => 'การตรวจทาน',
'Column name' => 'ชื่อคอลัมน์',
'Type' => 'ชนิด',
'Length' => 'ความยาว',
'Auto Increment' => 'เพิ่มลำดับโดยอัตโนมัติ',
'Options' => 'ตัวเลือก',
'Save' => 'บันทึก',
'Drop' => 'ลบ',
'Database has been dropped.' => 'ฐานข้อมูลถูกลบแล้ว.',
'Database has been created.' => 'สร้างฐานข้อมูลใหม่แล้ว.',
'Database has been renamed.' => 'เปลี่ยนชื่อฐานข้อมูลแล้ว.',
'Database has been altered.' => 'เปลี่ยนแปลงฐานข้อมูลแล้ว.',
'Alter database' => 'เปลี่ยนแปลงฐานข้อมูล',
'Create database' => 'สร้างฐานข้อมูล',
'SQL command' => 'คำสั่ง SQL',
'Logout' => 'ออกจากระบบ',
'database' => 'ฐานข้อมูล',
'Use' => 'ใช้งาน',
'No tables.' => 'ไม่พบตาราง.',
'select' => 'เลือก',
'Item has been deleted.' => 'รายการถูกลบแล้ว.',
'Item has been updated.' => 'ปรับปรุงรายการแล้ว.',
'Item%s has been inserted.' => 'มี%s รายการ ถูกเพิ่มแล้ว.',
'Edit' => 'แก้ไข',
'Insert' => 'เพิ่ม',
'Save and insert next' => 'บันทึกแล้วเพิ่มรายการถัดไป',
'Delete' => 'ลบ',
'Database' => 'ฐานข้อมูล',
'Routines' => 'รูทีน',
'Indexes have been altered.' => 'เปลี่ยนแปลงดัชนีแล้ว.',
'Indexes' => 'ดัชนี',
'Alter indexes' => 'เปลี่ยนแปลงดัชนี',
'Add next' => 'เพิ่มรายการถัดไป',
'Language' => 'ภาษา',
'Select' => 'เลือก',
'New item' => 'รายการใหม่',
'Search' => 'ค้นหา',
'Sort' => 'เรียงลำดับ',
'descending' => 'มากไปน้อย',
'Limit' => 'จำกัด',
'No rows.' => 'ไม่มีแถวของตาราง.',
'Action' => 'ดำเนินการ',
'edit' => 'แก้ไข',
'Page' => 'หน้า',
'Query executed OK, %d row(s) affected.' => 'ประมวลผลคำสั่งแล้ว มี %d ถูกดำเนินการ.',
'Error in query' => 'คำสั่งไม่ถูกต้อง',
'Execute' => 'ประมวลผล',
'Table' => 'ตาราง',
'Foreign keys' => 'คีย์คู่แข่ง',
'Triggers' => 'ทริกเกอร์',
'View' => 'วิว',
'Unable to select the table' => 'ไม่สามารถเลือกตารางได้',
'Invalid CSRF token. Send the form again.' => 'เครื่องหมาย CSRF ไม่ถูกต้อง ส่งข้อมูลใหม่อีกครั้ง.',
'Comment' => 'หมายเหตุ',
'Default values' => 'ค่าเริ่มต้น',
'%d byte(s)' => '%d ไบท์',
'No commands to execute.' => 'ไม่มีคำสั่งที่จะประมวลผล.',
'Unable to upload a file.' => 'ไม่สามารถอัปโหลดไฟล์ได้.',
'File upload' => 'อัปโหลดไฟล์',
'File uploads are disabled.' => 'การอัปโหลดไฟล์ถูกปิดการใช้งาน.',
'Routine has been called, %d row(s) affected.' => 'รูทีนถูกเรียกใช้งาน มี %d แถวถูกดำเนินการ.',
'Call' => 'เรียกใช้งาน',
'No extension' => 'ไม่พบส่วนเสริม',
'None of the supported PHP extensions (%s) are available.' => 'ไม่มีส่วนเสริมของ PHP (%s) ที่สามารถใช้งานได้.',
'Session support must be enabled.' => 'ต้องเปิดใช้งาน Session.',
'Session expired, please login again.' => 'Session หมดอายุแล้ว กรุณาเข้าสู่ระบบใหม่อีกครั้ง.',
'Text length' => 'ความยาวของอักษร',
'Foreign key has been dropped.' => 'คีย์คู่แข่งถูกลบแล้ว.',
'Foreign key has been altered.' => 'คีย์คู่แข่งถูกเปลี่ยนแปลงแล้ว.',
'Foreign key has been created.' => 'คีย์คู่แข่งถูกสร้างแล้ว.',
'Foreign key' => 'คีย์คู่แข่ง',
'Target table' => 'คารางเป้าหมาย',
'Change' => 'แก้ไข',
'Source' => 'แหล่งข้อมูล',
'Target' => 'เป้าหมาย',
'Add column' => 'เพิ่มคอลัมน์',
'Alter' => 'เปลี่ยนแปลง',
'Add foreign key' => 'เพิ่มคีย์คู่แข่ง',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'ชนิดของดัชนี',
'Column (length)' => 'คอลัมน์ (ความยาว)',
'View has been dropped.' => 'วิวถูกลบแล้ว.',
'View has been altered.' => 'วิวถูกเปลี่ยนแปลงแล้ว.',
'View has been created.' => 'วิวถูกสร้างแล้ว.',
'Alter view' => 'เปลี่ยนแปลงวิว',
'Create view' => 'เพิ่มวิว',
'Name' => 'ชื่อ',
'Process list' => 'รายการของกระบวนการ',
'%d process(es) have been killed.' => 'มี %d กระบวนการถูกทำลายแล้ว.',
'Kill' => 'ทำลาย',
'Parameter name' => 'ชื่อพารามิเตอร์',
'Database schema' => 'Schema ของฐานข้อมูล',
'Create procedure' => 'สร้าง procedure',
'Create function' => 'สร้าง Function',
'Routine has been dropped.' => 'Routine ถูกลบแล้ว.',
'Routine has been altered.' => 'Routine ถูกเปลี่ยนแปลงแล้ว.',
'Routine has been created.' => 'Routine ถูกสร้างแล้ว.',
'Alter function' => 'เปลี่ยนแปลง Function',
'Alter procedure' => 'เปลี่ยนแปลง procedure',
'Return type' => 'ประเภทของค่าที่คืนกลับ',
'Add trigger' => 'เพิ่ม trigger',
'Trigger has been dropped.' => 'Trigger ถูกลบแล้ว.',
'Trigger has been altered.' => 'Trigger ถูกเปลี่ยนแปลงแล้ว.',
'Trigger has been created.' => 'Trigger ถูกสร้างแล้ว.',
'Alter trigger' => 'เปลี่ยนแปลง Trigger',
'Create trigger' => 'สร้าง Trigger',
'Time' => 'เวลา',
'Event' => 'เหตุการณ์',
'%s version: %s through PHP extension %s' => '%s รุ่น: %s ผ่านส่วนขยาย PHP %s',
'%d row(s)' => '%d แถว',
'Remove' => 'ลบ',
'Are you sure?' => 'คุณแน่ใจแล้วหรือ',
'Privileges' => 'สิทธิ์',
'Create user' => 'สร้างผู้ใช้งาน',
'User has been dropped.' => 'ลบผู้ใช้งานแล้ว.',
'User has been altered.' => 'เปลี่ยนแปลงผู้ใช้งานแล้ว.',
'User has been created.' => 'สร้างผู้ใช้งานแล้ว.',
'Hashed' => 'Hash',
'Column' => 'คอลัมน์',
'Routine' => 'รูทีน',
'Grant' => 'การอนุญาต',
'Revoke' => 'ยกเลิก',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'ข้อมูลที่ส่งเข้ามีขนาดใหญ่เกิน คุณสามารถ เพิ่ม-ลดขนาดได้ที่ %s คำสั่งการตั้งค่า.',
'Logged as: %s' => 'สวัสดีคุณ: %s',
'Move up' => 'ย้ายไปข้างบน',
'Move down' => 'ย้ายลงล่าง',
'Functions' => 'ฟังก์ชั่น',
'Aggregation' => 'รวบรวม',
'Export' => 'ส่งออก',
'Output' => 'ข้อมูลที่ส่งออก',
'open' => 'เปิด',
'save' => 'บันทึก',
'Format' => 'รูปแบบ',
'Tables' => 'ตาราง',
'Data' => 'ข้อมูล',
'Event has been dropped.' => 'เหตุการณ์ถูกลบแล้ว.',
'Event has been altered.' => 'เหตุการณ์ถูกเปลี่ยนแปลงแล้ว.',
'Event has been created.' => 'เหตุการณ์ถูกสร้างแล้ว.',
'Alter event' => 'เปลี่ยนแปลงเหตุการณ์',
'Create event' => 'สร้างเหตุการณ์',
'At given time' => 'ในเวลาที่กำหนด',
'Every' => 'ทุกๆ',
'Events' => 'เหตุการณ์',
'Schedule' => 'กำหนดการณ์',
'Start' => 'เริ่มต้น',
'End' => 'สิ้นสุด',
'Status' => 'สถานะ',
'On completion preserve' => 'เมื่อเสร็จสิ้นการสงวน',
'Tables and views' => 'ตารางและวิว',
'Data Length' => 'ความยาวของข้อมูล',
'Index Length' => 'ความยาวของดัชนี',
'Data Free' => 'พื้นที่ว่าง',
'Collation' => 'การตรวจทาน',
'Analyze' => 'วิเคราะห์',
'Optimize' => 'เพิ่มประสิทธิภาพ',
'Check' => 'ตรวจสอบ',
'Repair' => 'ซ่อมแซม',
'Truncate' => 'ตัดทิ้ง',
'Tables have been truncated.' => 'เคลียร์ตารางแล้ว (truncate).',
'Rows' => 'แถว',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'ตารางถูกย้ายแล้ว.',
'Move to other database' => 'ย้ายไปยังฐานข้อมูลอื่น',
'Move' => 'ย้าย',
'Engine' => 'ชนิดของฐานข้อมูล',
'Save and continue edit' => 'บันทึกและแก้ไขข้อมูลอื่นๆต่อ',
'original' => 'ต้นฉบับ',
'Tables have been dropped.' => 'ตารางถูกลบแล้ว.',
'%d item(s) have been affected.' => 'มี %d รายการถูกดำเนินการแล้ว.',
'Whole result' => 'รวมผล',
'Clone' => 'ทำซ้ำ',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'จำนวนสูงสุดของฟิลด์อนุญาตให้เกิน กรุณาเพิ่มอีก %s.',
'Partition by' => 'พาร์ทิชันโดย',
'Partitions' => 'พาร์ทิชัน',
'Partition name' => 'ชื่อของพาร์ทิชัน',
'Values' => 'ค่า',
'%d row(s) have been imported.' => '%d แถวถูกนำเข้าแล้ว.',
'anywhere' => 'ทุกแห่ง',
'Import' => 'นำเข้า',
'Stop on error' => 'หยุดการทำงานเมื่อเออเรอ',
'%.3f s' => '%.3f วินาที',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'วันที่/เดือน/[ปี]',
'History' => 'ประวัติ',
'Variables' => 'ตัวแปร',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'แหล่งที่มาและเป้าหมายของคอลมัน์ต้องมีชนิดข้อมูลเดียวกัน คือต้องมีดัชนีและข้อมูลอ้างอิงของคอลัมน์เป้าหมาย.',
'Relations' => 'ความสำพันธ์',
'Run file' => 'ทำงานจากไฟล์',
'Clear' => 'เคลียร์',
'Maximum allowed file size is %sB.' => 'ขนาดไฟล์สูงสุดที่อนุญาตให้ใช้งานคือ %sB.',
'Numbers' => 'ตัวเลข',
'Date and time' => 'วันและเวลา',
'Strings' => 'ตัวอักษร',
'Binary' => 'เลขฐานสอง',
'Lists' => 'รายการ',
'Editor' => 'ผู้แก้ไข',
'E-mail' => 'อีเมล์',
'From' => 'จาก',
'Subject' => 'หัวข้อ',
'Send' => 'ส่ง',
'%d e-mail(s) have been sent.' => 'มี %d อีเมล์ ถูกส่งออกแล้ว.',
'Webserver file %s' => 'Webserver file %s',
'File does not exist.' => 'ไม่มีไฟล์.',
'%d in total' => '%d ของทั้งหมด',
'Permanent login' => 'จดจำการเข้าสู่ระบบตลอดไป',
'Databases have been dropped.' => 'ฐานข้อมูลถูกลบแล้ว.',
'Search data in tables' => 'ค้นหาในตาราง',
'Schema' => 'Schema',
'Alter schema' => 'เปลี่ยนแปลง schema',
'Create schema' => 'สร้าง schema',
'Schema has been dropped.' => 'Schema ถูกลบแล้ว.',
'Schema has been created.' => 'Schema ถูกสร้างแล้ว.',
'Schema has been altered.' => 'Schema ถูกเปลี่ยนแปลงแล้ว.',
'Sequences' => 'Sequences',
'Create sequence' => 'Sequence ถูกสร้างแล้ว',
'Alter sequence' => 'Sequence ถูกเปลี่ยนแปลงแล้ว',
'Sequence has been dropped.' => 'Sequence ถูกลบแล้ว.',
'Sequence has been created.' => 'Sequence ถูกสร้างแล้ว.',
'Sequence has been altered.' => 'Sequence ถูกเปลี่ยนแปลงแล้ว.',
'User types' => 'ประเภทผู้ใช้งาน',
'Create type' => 'สร้างประเภทผู้ใช้งาน',
'Alter type' => 'แก้ไขประเภท',
'Type has been dropped.' => 'ประเภทถูกลบแล้ว.',
'Type has been created.' => 'ประเภทถูกสร้างแล้ว.',
'Ctrl+click on a value to modify it.' => 'กด Ctrl+click เพื่อแก้ไขค่า.',
'Use edit link to modify this value.' => 'ใช้ลิงค์ แก้ไข เพื่อปรับเปลี่ยนค่านี้.',
'last' => 'ล่าสุด',
'From server' => 'จากเซเวอร์',
'System' => 'ระบบ',
'Select data' => 'เลือกข้อมูล',
'Show structure' => 'แสดงโครงสร้าง',
'empty' => 'ว่างเปล่า',
'Network' => 'เครื่องข่าย',
'Geometry' => 'เรขาคณิต',
'File exists.' => 'มีไฟล์นี้อยู่แล้ว.',
'Attachments' => 'ไฟล์แนบ',
'%d query(s) executed OK.' => '%d คำสั่งถูกดำเนินการแล้ว.',
'Show only errors' => 'แสดงเฉพาะเออเรอ',
'Refresh' => 'โหลดใหม่',
'Invalid schema.' => 'schema ไม่ถูกต้อง.',
'Please use one of the extensions %s.' => 'กรุณาใช้ส่วนเสริมอย่างน้อย 1 ส่วนเสริมจากทั้งหมด %s.',
'now' => 'ตอนนี้',
'ltr' => 'ltr',
'Tables have been copied.' => 'ทำซ้ำตารางฐานข้อมูลแล้ว.',
'Copy' => 'ทำซ้ำ',
'Permanent link' => 'ลิงค์ถาวร',
'Edit all' => 'แก้ไขทั้งหมด',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -9,14 +9,20 @@ $translations = array(
'Login' => 'Giriş',
'Logout' => ıkış',
'Logged as: %s' => '%s olarak giriş yapıldı.',
'Logout successful.' => 'Başarıyla çıkış yapıldı.',
'Invalid credentials.' => 'Geçersiz kimlik.',
'Logout successful.' => 'Oturum başarıyla sonlandı.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Adminer kullandığınız için teşekkür ederiz <a href="https://www.adminer.org/en/donation/">bağış yapmayı düşünün</a>.',
'Invalid credentials.' => 'Geçersiz kimlik bilgileri.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Çok fazla oturum açma denemesi yapıldı.', '%d Dakika sonra tekrar deneyiniz.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Ana şifrenin süresi doldu. Kalıcı olması için <a href="https://www.adminer.org/en/extension/"%s>%s medodunu</a> kullanın.',
'Language' => 'Dil',
'Invalid CSRF token. Send the form again.' => 'Geçersiz (CSRF) jetonu. Formu tekrar yolla.',
'If you did not send this request from Adminer then close this page.' => 'Bu isteği Adminer\'den göndermediyseniz bu sayfayı kapatın.',
'No extension' => 'Uzantı yok',
'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP eklentilerinden (%s) hiçbiri mevcut değil.',
'Connecting to privileged ports is not allowed.' => 'Ayrıcalıklı bağlantı noktalarına bağlanmaya izin verilmiyor.',
'Session support must be enabled.' => 'Oturum desteği etkin olmalıdır.',
'Session expired, please login again.' => 'Oturum süresi doldu, lütfen tekrar giriş yapın.',
'The action will be performed after successful login with the same credentials.' => 'İşlem, aynı kimlik bilgileriyle başarıyla oturum açıldıktan sonra gerçekleştirilecektir.',
'%s version: %s through PHP extension %s' => '%s sürüm: %s, %s PHP eklentisi ile',
'Refresh' => 'Tazele',
@@ -46,6 +52,8 @@ $translations = array(
'Query executed OK, %d row(s) affected.' => array('Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.', 'Sorgu başarıyla çalıştırıldı, %d adet kayıt etkilendi.'),
'No commands to execute.' => 'Çalıştırılacak komut yok.',
'Error in query' => 'Sorguda hata',
'Warnings' => 'Uyarılar',
'ATTACH queries are not supported.' => 'ATTACH sorguları desteklenmiyor.',
'Execute' => 'Çalıştır',
'Stop on error' => 'Hata oluşursa dur',
'Show only errors' => 'Sadece hataları göster.',
@@ -64,21 +72,23 @@ $translations = array(
'Unable to upload a file.' => 'Dosya gönderilemiyor.',
'Maximum allowed file size is %sB.' => 'İzin verilen dosya boyutu sınırı %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Çok büyük POST verisi, veriyi azaltın ya da %s ayar yönergesini uygun olarak yapılandırın.',
'You can upload a big SQL file via FTP and import it from server.' => 'FTP yoluyla büyük bir SQL dosyası yükleyebilir ve sunucudan içe aktarabilirsiniz.',
'You are offline.' => 'Çevrimdışısınız.',
'Export' => 'Dışarı Aktar',
'Dump' => 'Döküm',
'Output' => ıktı',
'open' => 'aç',
'save' => 'kaydet',
'Saving' => 'Saydediliyor',
'Format' => 'Biçim',
'Data' => 'Veri',
'Database' => 'Veri Tabanı',
'database' => 'veri tabanı',
'DB' => 'DB',
'Use' => 'Kullan',
'Select database' => 'Veri tabanı seç',
'Invalid database.' => 'Geçersiz veri tabanı.',
'Create new database' => 'Yeni veri tabanı oluştur',
'Database has been dropped.' => 'Veri tabanı silindi.',
'Databases have been dropped.' => 'Veritabanları silindi.',
'Database has been created.' => 'Veri tabanı oluşturuldu.',
@@ -93,15 +103,17 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Motor',
'Collation' => 'Karşılaştırma',
'Data Length' => 'Veri Uzunluğu',
'Index Length' => 'Dizin Uzunluğu',
'Index Length' => 'İndex Uzunluğu',
'Data Free' => 'Boş Veri',
'Rows' => 'Kayıtlar',
'%d in total' => 'toplam %d',
'Analyze' => 'Çözümle',
'Optimize' => 'En uygun hale getir',
'Optimize' => 'Optimize Et',
'Vacuum' => 'Vakumla',
'Check' => 'Denetle',
'Repair' => 'Tamir Et',
'Truncate' => 'Boşalt',
@@ -144,7 +156,6 @@ $translations = array(
'No tables.' => 'Tablo yok.',
'Alter table' => 'Tabloyu değiştir',
'Create table' => 'Tablo oluştur',
'Create new table' => 'Yeni tablo oluştur',
'Table has been dropped.' => 'Tablo silindi.',
'Tables have been dropped.' => 'Tablolar silindi.',
'Tables have been optimized.' => 'Tablolar en uygun hale getirildi.',
@@ -160,13 +171,17 @@ $translations = array(
'Auto Increment' => 'Otomatik Artır',
'Options' => 'Seçenekler',
'Comment' => 'Yorum',
'Default value' => 'Varsayılan değer',
'Default values' => 'Varsayılan değerler',
'Drop' => 'Sil',
'Drop %s?' => 'Sil %s?',
'Are you sure?' => 'Emin misiniz?',
'Size' => 'Boyut',
'Compute' => 'Hesapla',
'Move up' => 'Yukarı taşı',
'Move down' => 'Aşağı taşı',
'Remove' => 'Sil',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'İzin verilen en fazla alan sayısııldı. Lütfen %s ve %s değerlerini artırın.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'İzin verilen en fazla alan sayısııldı. Lütfen %s değerlerini artırın.',
'Partition by' => 'Bununla bölümle',
'Partitions' => 'Bölümler',
@@ -174,17 +189,18 @@ $translations = array(
'Values' => 'Değerler',
'View' => 'Görünüm',
'Materialized view' => 'Materialized Görünüm',
'View has been dropped.' => 'Görünüm silindi.',
'View has been altered.' => 'Görünüm değiştirildi.',
'View has been created.' => 'Görünüm oluşturuldu.',
'Alter view' => 'Görünümü değiştir',
'Create view' => 'Görünüm oluştur',
'Indexes' => 'Dizinler',
'Indexes have been altered.' => 'Dizinler değiştirildi.',
'Alter indexes' => 'Dizinleri değiştir',
'Indexes' => 'İndeksler',
'Indexes have been altered.' => 'İndeksler değiştirildi.',
'Alter indexes' => 'İndeksleri değiştir',
'Add next' => 'Bundan sonra ekle',
'Index Type' => 'Dizin Türü',
'Index Type' => 'İndex Türü',
'Column (length)' => 'Kolon (uzunluğu)',
'Foreign keys' => 'Dış anahtarlar',
@@ -223,26 +239,29 @@ $translations = array(
'anywhere' => 'hiçbir yerde',
'Search data in tables' => 'Tablolarda veri ara',
'Sort' => 'Sırala',
'descending' => 'azalan',
'Limit' => 'sınır',
'Text length' => 'Yazı uzunluğu',
'Action' => 'Eylem',
'Full table scan' => 'Tam tablo tarama',
'descending' => 'Azalan',
'Limit' => 'Limit',
'Limit rows' => 'Satır Limiti',
'Text length' => 'Metin Boyutu',
'Action' => 'İşlem',
'Full table scan' => 'Tam tablo taraması',
'Unable to select the table' => 'Tablo seçilemedi',
'No rows.' => 'Kayıt yok.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d kayıt', '%d adet kayıt'),
'Page' => 'Sayfa',
'last' => 'son',
'Last page' => 'Son sayfa',
'Load more data' => 'Daha fazla veri yükle',
'Loading' => 'Yükleniyor',
'whole result' => 'tüm sonuç',
'Whole result' => 'Tüm sonuç',
'%d byte(s)' => array('%d bayt', '%d bayt'),
'Import' => 'İçeri Aktar',
'%d row(s) have been imported.' => array('%d kayıt içeri aktarıldı.', '%d adet kayıt içeri aktarıldı.'),
'File must be in UTF-8 encoding.' => 'Dosya UTF-8 kodlamasında olmalıdır.',
// in-place editing in select
'Modify' => 'Düzenle',
'Ctrl+click on a value to modify it.' => 'Bir değeri değiştirmek için üzerine Ctrl+tıklayın.',
'Use edit link to modify this value.' => 'Değeri değiştirmek için düzenleme bağlantısını kullanın.',
@@ -261,8 +280,10 @@ $translations = array(
'Save' => 'Kaydet',
'Save and continue edit' => 'Kaydet ve düzenlemeye devam et',
'Save and insert next' => 'Kaydet ve sonrakini ekle',
'Selected' => 'Seçildi',
'Clone' => 'Kopyala',
'Delete' => 'Sil',
'You have no privileges to update this table.' => 'Bu tabloyu güncellemek için yetkiniz yok.',
'E-mail' => 'E-posta',
'From' => 'Gönderen',
@@ -302,7 +323,6 @@ $translations = array(
'Schema has been dropped.' => 'Şema silindi.',
'Schema has been created.' => 'Şema oluşturuldu.',
'Schema has been altered.' => 'Şema değiştirildi.',
'schema' => 'şema',
'Schema' => 'Şema',
'Invalid schema.' => 'Geçersiz şema.',

View File

@@ -66,7 +66,6 @@ $translations = array(
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
'Export' => 'Експорт',
'Dump' => 'Дамп',
'Output' => 'Вихідні дані',
'open' => 'відкрити',
'save' => 'зберегти',
@@ -78,7 +77,6 @@ $translations = array(
'Use' => 'Обрати',
'Select database' => 'Обрати базу даних',
'Invalid database.' => 'Погана база даних.',
'Create new database' => 'Створити нову базу даних',
'Database has been dropped.' => 'Базу даних було видалено.',
'Databases have been dropped.' => 'Бази даних були видалені.',
'Database has been created.' => 'Базу даних було створено.',
@@ -93,6 +91,7 @@ $translations = array(
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '0123456789',
'Engine' => 'Рушій',
'Collation' => 'Співставлення',
'Data Length' => 'Об\'єм даних',
@@ -144,7 +143,6 @@ $translations = array(
'No tables.' => 'Нема таблиць.',
'Alter table' => 'Змінити таблицю',
'Create table' => 'Створити таблицю',
'Create new table' => 'Створити нову таблицю',
'Table has been dropped.' => 'Таблицю було видалено.',
'Tables have been dropped.' => 'Таблиці були видалені.',
'Tables have been optimized.' => 'Таблиці були оптимізовані.',
@@ -166,7 +164,7 @@ $translations = array(
'Move up' => 'Пересунути вгору',
'Move down' => 'Пересунути вниз',
'Remove' => 'Видалити',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s і %s.',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
'Partition by' => 'Розділити по',
'Partitions' => 'Розділи',
@@ -232,8 +230,7 @@ $translations = array(
'%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
'Page' => 'Сторінка',
'last' => 'остання',
'Last page' => 'Остання сторінка',
'whole result' => 'весь результат',
'Whole result' => 'Весь результат',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
'Import' => 'Імпортувати',
@@ -299,7 +296,6 @@ $translations = array(
'Schema has been dropped.' => 'Схему було видалено.',
'Schema has been created.' => 'Схему було створено.',
'Schema has been altered.' => 'Схему було змінено.',
'schema' => 'схема',
'Schema' => 'Схема',
'Invalid schema.' => 'Невірна схема.',

328
adminer/lang/vi.inc.php Normal file
View File

@@ -0,0 +1,328 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Hệ thống',
'Server' => 'Máy chủ',
'Username' => 'Tên người dùng',
'Password' => 'Mật khẩu',
'Permanent login' => 'Giữ đăng nhập một thời gian',
'Login' => 'Đăng nhập',
'Logout' => 'Thoát',
'Logged as: %s' => 'Vào dưới tên: %s',
'Logout successful.' => 'Đã thoát xong.',
'Invalid credentials.' => 'Tài khoản sai.',
'Too many unsuccessful logins, try again in %d minute(s).' => 'Bạn gõ sai tài khoản quá nhiều lần, hãy thử lại sau %d phút nữa.',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Mật khẩu đã hết hạn. <a href="https://www.adminer.org/en/extension/"%s>Thử cách làm</a> để giữ cố định.',
'Language' => 'Ngôn ngữ',
'Invalid CSRF token. Send the form again.' => 'Mã kiểm tra CSRF sai, hãy nhập lại biểu mẫu.',
'No extension' => 'Không có phần mở rộng',
'None of the supported PHP extensions (%s) are available.' => 'Bản cài đặt PHP thiếu hỗ trợ cho %s.',
'Session support must be enabled.' => 'Cần phải bật session.',
'Session expired, please login again.' => 'Phiên làm việc đã hết, hãy đăng nhập lại.',
'%s version: %s through PHP extension %s' => 'Phiên bản %s: %s (PHP extension: %s)',
'Refresh' => 'Làm mới',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Quyền truy cập',
'Create user' => 'Tạo người dùng',
'User has been dropped.' => 'Đã xoá người dùng.',
'User has been altered.' => 'Đã sửa người dùng.',
'User has been created.' => 'Đã tạo người dùng.',
'Hashed' => 'Mã hoá',
'Column' => 'Cột',
'Routine' => 'Hàm tích hợp',
'Grant' => 'Cấp quyền',
'Revoke' => 'Tước quyền',
'Process list' => 'Danh sách tiến trình',
'%d process(es) have been killed.' => '%d tiến trình đã dừng.',
'Kill' => 'Dừng',
'Variables' => 'Biến',
'Status' => 'Trạng thái',
'SQL command' => 'Câu lệnh SQL',
'%d query(s) executed OK.' => '%d câu lệnh đã chạy thành công.',
'Query executed OK, %d row(s) affected.' => 'Đã thực hiện xong, ảnh hưởng đến %d dòng.',
'No commands to execute.' => 'Chẳng có gì để thực hiện!.',
'Error in query' => 'Có lỗi trong câu lệnh',
'Execute' => 'Thực hiện',
'Stop on error' => 'Dừng khi có lỗi',
'Show only errors' => 'Chỉ hiện lỗi',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Lịch sử',
'Clear' => 'Xoá',
'Edit all' => 'Sửa tất cả',
'File upload' => 'Tải tệp lên',
'From server' => 'Dùng tệp trên máy chủ',
'Webserver file %s' => 'Tệp trên máy chủ',
'Run file' => 'Chạy tệp',
'File does not exist.' => 'Tệp không tồn tại.',
'File uploads are disabled.' => 'Chức năng tải tệp lên đã bị cấm.',
'Unable to upload a file.' => 'Không thể tải tệp lên.',
'Maximum allowed file size is %sB.' => 'Kích thước tệp tối đa là %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Dữ liệu tải lên/POST quá lớn. Hãy giảm kích thước tệp hoặc tăng cấu hình (hiện tại %s).',
'You can upload a big SQL file via FTP and import it from server.' => 'Bạn có thể tải tệp lên dùng FTP và nhập vào cơ sở dữ liệu.',
'Export' => 'Xuất',
'Output' => 'Kết quả',
'open' => 'xem',
'save' => 'lưu',
'Format' => 'Định dạng',
'Data' => 'Dữ liệu',
'Database' => 'Cơ sở dữ liệu',
'database' => 'cơ sở dữ liệu',
'Use' => 'Sử dụng',
'Select database' => 'Chọn CSDL',
'Invalid database.' => 'CSDL sai.',
'Database has been dropped.' => 'CSDL đã bị xoá.',
'Databases have been dropped.' => 'Các CSDL đã bị xoá.',
'Database has been created.' => 'Đã tạo CSDL.',
'Database has been renamed.' => 'Đã đổi tên CSDL.',
'Database has been altered.' => 'Đã thay đổi CSDL.',
'Alter database' => 'Thay đổi CSDL',
'Create database' => 'Tạo CSDL',
'Database schema' => 'Cấu trúc CSDL',
// link to current database schema layout
'Permanent link' => 'Liên kết cố định',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => 'Cơ chế lưu trữ',
'Collation' => 'Bộ mã',
'Data Length' => 'Kích thước dữ liệu',
'Index Length' => 'Kích thước chỉ mục',
'Data Free' => 'Dữ liệu trống',
'Rows' => 'Số dòng',
'%d in total' => '%s',
'Analyze' => 'Phân tích',
'Optimize' => 'Tối ưu',
'Vacuum' => 'Dọn dẹp',
'Check' => 'Kiểm tra',
'Repair' => 'Sửa chữa',
'Truncate' => 'Làm rỗng',
'Tables have been truncated.' => 'Bảng đã bị làm rỗng.',
'Move to other database' => 'Chuyển tới cơ sở dữ liệu khác',
'Move' => 'Chuyển đi',
'Tables have been moved.' => 'Bảng.',
'Copy' => 'Sao chép',
'Tables have been copied.' => 'Bảng đã được sao chép.',
'Routines' => 'Routines',
'Routine has been called, %d row(s) affected.' => 'Đã chạy routine, thay đổi %d dòng.',
'Call' => 'Gọi',
'Parameter name' => 'Tham số',
'Create procedure' => 'Tạo lệnh',
'Create function' => 'Tạo hàm',
'Routine has been dropped.' => 'Đã xoá routine.',
'Routine has been altered.' => 'Đã thay đổi routine.',
'Routine has been created.' => 'Đã tạo routine.',
'Alter function' => 'Thay đổi hàm',
'Alter procedure' => 'Thay đổi thủ tục',
'Return type' => 'Giá trị trả về',
'Events' => 'Sự kiện',
'Event has been dropped.' => 'Đã xoá sự kiện.',
'Event has been altered.' => 'Đã thay đổi sự kiện.',
'Event has been created.' => 'Đã tạo sự kiện.',
'Alter event' => 'Sửa sự kiện',
'Create event' => 'Tạo sự kiện',
'At given time' => 'Vào thời gian xác định',
'Every' => 'Mỗi',
'Schedule' => 'Đặt lịch',
'Start' => 'Bắt đầu',
'End' => 'Kết thúc',
'On completion preserve' => 'Khi kết thúc, duy trì',
'Tables' => 'Các bảng',
'Tables and views' => 'Bảng và khung nhìn',
'Table' => 'Bảng',
'No tables.' => 'Không có bảng nào.',
'Alter table' => 'Sửa bảng',
'Create table' => 'Tạo bảng',
'Table has been dropped.' => 'Bảng đã bị xoá.',
'Tables have been dropped.' => 'Các bảng đã bị xoá.',
'Tables have been optimized.' => 'Bảng đã được tối ưu.',
'Table has been altered.' => 'Bảng đã thay đổi.',
'Table has been created.' => 'Bảng đã được tạo.',
'Table name' => 'Tên bảng',
'Show structure' => 'Hiện cấu trúc',
'engine' => 'cơ chế lưu trữ',
'collation' => 'bảng mã',
'Column name' => 'Tên cột',
'Type' => 'Loại',
'Length' => 'Độ dài',
'Auto Increment' => 'Tăng tự động',
'Options' => 'Tuỳ chọn',
'Comment' => 'Chú thích',
'Default values' => 'Giá trị mặc định',
'Drop' => 'Xoá',
'Are you sure?' => 'Bạn có chắc',
'Size' => 'Kích thước',
'Compute' => 'Tính',
'Move up' => 'Chuyển lên trên',
'Move down' => 'Chuyển xuống dưới',
'Remove' => 'Xoá',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Thiết lập %s cần tăng thêm. (Đã vượt giới hạnố trường tối đa cho phép trong một biểu mẫu).',
'Partition by' => 'Phân chia bằng',
'Partitions' => 'Phân hoạch',
'Partition name' => 'Tên phân hoạch',
'Values' => 'Giá trị',
'View' => 'Khung nhìn',
'View has been dropped.' => 'Khung nhìn đã bị xoá.',
'View has been altered.' => 'Khung nhìn đã được sửa.',
'View has been created.' => 'Khung nhìn đã được tạo.',
'Alter view' => 'Sửa khung nhìn',
'Create view' => 'Tạo khung nhìn',
'Indexes' => 'Chỉ mục',
'Indexes have been altered.' => 'Chỉ mục đã được sửa.',
'Alter indexes' => 'Sửa chỉ mục',
'Add next' => 'Thêm tiếp',
'Index Type' => 'Loại chỉ mục',
'Column (length)' => 'Cột (độ dài)',
'Foreign keys' => 'Các khoá ngoại',
'Foreign key' => 'Khoá ngoại',
'Foreign key has been dropped.' => 'Khoá ngoại đã bị xoá.',
'Foreign key has been altered.' => 'Khoá ngoại đã được sửa.',
'Foreign key has been created.' => 'Khoá ngoại đã được tạo.',
'Target table' => 'Bảng đích',
'Change' => 'Thay đổi',
'Source' => 'Nguồn',
'Target' => 'Đích',
'Add column' => 'Thêm cột',
'Alter' => 'Sửa',
'Add foreign key' => 'Thêm khoá ngoại',
'ON DELETE' => 'Khi xoá',
'ON UPDATE' => 'Khi cập nhật',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Cột gốc và cột đích phải cùng kiểu, phải đặt chỉ mục trong cột đích và dữ liệu tham chiếu phải tồn tại.',
'Triggers' => 'Phản xạ',
'Add trigger' => 'Thêm phản xạ',
'Trigger has been dropped.' => 'Đã xoá phản xạ.',
'Trigger has been altered.' => 'Đã sửa phản xạ.',
'Trigger has been created.' => 'Đã tạo phản xạ.',
'Alter trigger' => 'Sửa phản xạ',
'Create trigger' => 'Tạo phản xạ',
'Time' => 'Thời gian',
'Event' => 'Sự kiện',
'Name' => 'Tên',
'select' => 'xem',
'Select' => 'Xem',
'Select data' => 'Xem dữ liệu',
'Functions' => 'Các chức năng',
'Aggregation' => 'Tổng hợp',
'Search' => 'Tìm kiếm',
'anywhere' => 'bất cứ đâu',
'Search data in tables' => 'Tìm kiếm dữ liệu trong các bảng',
'Sort' => 'Sắp xếp',
'descending' => 'giảm dần',
'Limit' => 'Giới hạn',
'Text length' => 'Chiều dài văn bản',
'Action' => 'Hành động',
'Full table scan' => 'Quét toàn bộ bảng',
'Unable to select the table' => 'Không thể xem dữ liệu',
'No rows.' => 'Không có dòng dữ liệu nào.',
'%d row(s)' => '%s dòng',
'Page' => 'trang',
'last' => 'cuối',
'Load more data' => 'Xem thêm dữ liệu',
'Loading' => 'Đang nạp',
'Whole result' => 'Toàn bộ kết quả',
'%d byte(s)' => '%d byte(s)',
'Import' => 'Nhập khẩu',
'%d row(s) have been imported.' => 'Đã nhập % dòng dữ liệu.',
'File must be in UTF-8 encoding.' => 'Tệp phải mã hoá bằng chuẩn UTF-8.',
// in-place editing in select
'Modify' => 'Sửa',
'Ctrl+click on a value to modify it.' => 'Nhấn Ctrl và bấm vào giá trị để sửa.',
'Use edit link to modify this value.' => 'Dùng nút sửa để thay đổi giá trị này.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Đã thêm%s.',
'Item has been deleted.' => 'Đã xoá.',
'Item has been updated.' => 'Đã cập nhật.',
'%d item(s) have been affected.' => '%d phần đã thay đổi.',
'New item' => 'Thêm',
'original' => 'bản gốc',
// label for value '' in enum data type
'empty' => 'trống',
'edit' => 'sửa',
'Edit' => 'Sửa',
'Insert' => 'Thêm',
'Save' => 'Lưu',
'Save and continue edit' => 'Lưu và tiếp tục sửa',
'Save and insert next' => 'Lưu và thêm tiếp',
'Selected' => 'Chọn',
'Clone' => 'Sao chép',
'Delete' => 'Xoá',
'You have no privileges to update this table.' => 'Bạn không có quyền sửa bảng này.',
'E-mail' => 'Địa chỉ email',
'From' => 'Người gửi',
'Subject' => 'Chủ đề',
'Attachments' => 'Đính kèm',
'Send' => 'Gửi',
'%d e-mail(s) have been sent.' => '%d thư đã gửi.',
// data type descriptions
'Numbers' => 'Số',
'Date and time' => 'Ngày giờ',
'Strings' => 'Chuỗi',
'Binary' => 'Mã máy',
'Lists' => 'Danh sách',
'Network' => 'Mạng',
'Geometry' => 'Toạ độ',
'Relations' => 'Quan hệ',
'Editor' => 'Biên tập',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1-$3-$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'hiện tại',
'yes' => 'có',
'no' => 'không',
// general SQLite error in create, drop or rename database
'File exists.' => 'Tệp đã có rồi.',
'Please use one of the extensions %s.' => 'Cần phải dùng một trong các phần mở rộng sau: %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Thay đổi schema',
'Create schema' => 'Tạo schema',
'Schema has been dropped.' => 'Đã xoá schema.',
'Schema has been created.' => 'Đã tạo schema.',
'Schema has been altered.' => 'Đã thay đổi schema.',
'Schema' => 'Schema',
'Invalid schema.' => 'Schema không hợp lệ.',
// PostgreSQL sequences support
'Sequences' => 'Dãy số',
'Create sequence' => 'Tạo dãy số',
'Sequence has been dropped.' => 'Dãy số đã bị xoá.',
'Sequence has been created.' => 'Đã tạo dãy số.',
'Sequence has been altered.' => 'Đã sửa dãy số.',
'Alter sequence' => 'Thay đổi dãy số',
// PostgreSQL user types support
'User types' => 'Kiểu tự định nghĩa',
'Create type' => 'Tạo kiểu',
'Type has been dropped.' => 'Đã xoá kiểu.',
'Type has been created.' => 'Đã tạo kiểu.',
'Alter type' => 'Sửa kiểu dữ liệu',
);

View File

@@ -1,324 +1,348 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'xx',
'Server' => 'xx',
'Username' => 'xx',
'Password' => 'xx',
'Permanent login' => 'xx',
'Login' => 'xx',
'Logout' => 'xx',
'Logged as: %s' => 'xx',
'Logout successful.' => 'xx',
'Invalid credentials.' => 'xx',
'Language' => 'xx',
'Invalid CSRF token. Send the form again.' => 'xx',
'No extension' => 'xx',
'None of the supported PHP extensions (%s) are available.' => 'xx',
'Session support must be enabled.' => 'xx',
'Session expired, please login again.' => 'xx',
'%s version: %s through PHP extension %s' => 'xx',
'Refresh' => 'xx',
'System' => 'Xx',
'Server' => 'Xx',
'Username' => 'Xx',
'Password' => 'Xx',
'Permanent login' => 'Xx',
'Login' => 'Xx',
'Logout' => 'Xx',
'Logged as: %s' => 'Xx: %s',
'Logout successful.' => 'Xx.',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Xx <a href="https://www.adminer.org/en/donation/">xx</a>.',
'Invalid credentials.' => 'Xx.',
'There is a space in the input password which might be the cause.' => 'Xx.',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Xx, <a href="https://www.adminer.org/en/password/"%s>xx</a>.',
'Database does not support password.' => 'Xx.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Xx %d.', 'Xx %d.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '<a href="https://www.adminer.org/en/extension/"%s>Xx</a> %s xx.',
'Language' => 'Xx',
'Invalid CSRF token. Send the form again.' => 'Xx.',
'If you did not send this request from Adminer then close this page.' => 'Xx.',
'No extension' => 'Xx',
'None of the supported PHP extensions (%s) are available.' => 'Xx (%s).',
'Connecting to privileged ports is not allowed.' => 'Xx.',
'Disable %s or enable %s or %s extensions.' => 'Xx %s xx %s xx %s xx.',
'Session support must be enabled.' => 'Xx.',
'Session expired, please login again.' => 'Xx.',
'The action will be performed after successful login with the same credentials.' => 'Xx.',
'%s version: %s through PHP extension %s' => '%s xx: %s xx %s',
'Refresh' => 'Xx',
// text direction - 'ltr' or 'rtl'
'ltr' => 'xx',
'Privileges' => 'xx',
'Create user' => 'xx',
'User has been dropped.' => 'xx',
'User has been altered.' => 'xx',
'User has been created.' => 'xx',
'Hashed' => 'xx',
'Column' => 'xx',
'Routine' => 'xx',
'Grant' => 'xx',
'Revoke' => 'xx',
'Privileges' => 'Xx',
'Create user' => 'Xx',
'User has been dropped.' => 'Xx.',
'User has been altered.' => 'Xx.',
'User has been created.' => 'Xx.',
'Hashed' => 'Xx',
'Column' => 'Xx',
'Routine' => 'Xx',
'Grant' => 'Xx',
'Revoke' => 'Xx',
'Process list' => 'xx',
'%d process(es) have been killed.' => array('xx', 'xx'),
'Kill' => 'xx',
'Process list' => 'Xx',
'%d process(es) have been killed.' => array('%d xx.', '%d xx.'),
'Kill' => 'Xx',
'Variables' => 'xx',
'Status' => 'xx',
'Variables' => 'Xx',
'Status' => 'Xx',
'SQL command' => 'xx',
'%d query(s) executed OK.' => array('xx', 'xx'),
'Query executed OK, %d row(s) affected.' => array('xx', 'xx'),
'No commands to execute.' => 'xx',
'Error in query' => 'xx',
'Execute' => 'xx',
'Stop on error' => 'xx',
'Show only errors' => 'xx',
'SQL command' => 'Xx',
'%d query(s) executed OK.' => array('%d xx.', '%d xx.'),
'Query executed OK, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
'No commands to execute.' => 'Xx.',
'Error in query' => 'Xx',
'Unknown error.' => 'Xx.',
'Warnings' => 'Xx',
'ATTACH queries are not supported.' => 'Xx.',
'Execute' => 'Xx',
'Stop on error' => 'Xx',
'Show only errors' => 'Xx',
// sprintf() format for time of the command
'%.3f s' => 'xx',
'History' => 'xx',
'Clear' => 'xx',
'Edit all' => 'xx',
'%.3f s' => '%.3f xx',
'History' => 'Xx',
'Clear' => 'Xx',
'Edit all' => 'Xx',
'File upload' => 'xx',
'From server' => 'xx',
'Webserver file %s' => 'xx',
'Run file' => 'xx',
'File does not exist.' => 'xx',
'File uploads are disabled.' => 'xx',
'Unable to upload a file.' => 'xx',
'Maximum allowed file size is %sB.' => 'xx',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'xx',
'File upload' => 'Xx',
'From server' => 'Xx',
'Webserver file %s' => 'Xx %s',
'Run file' => 'Xx',
'File does not exist.' => 'Xx.',
'File uploads are disabled.' => 'Xx.',
'Unable to upload a file.' => 'Xx.',
'Maximum allowed file size is %sB.' => 'Xx %sB.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Xx %s.',
'You can upload a big SQL file via FTP and import it from server.' => 'Xx.',
'You are offline.' => 'Xx.',
'Export' => 'xx',
'Dump' => 'xx',
'Output' => 'xx',
'Export' => 'Xx',
'Output' => 'Xx',
'open' => 'xx',
'save' => 'xx',
'Format' => 'xx',
'Data' => 'xx',
'Saving' => 'Xx',
'Format' => 'Xx',
'Data' => 'Xx',
'Database' => 'xx',
'Database' => 'Xx',
'database' => 'xx',
'Use' => 'xx',
'Select database' => 'xx',
'Invalid database.' => 'xx',
'Create new database' => 'xx',
'Database has been dropped.' => 'xx',
'Databases have been dropped.' => 'xx',
'Database has been created.' => 'xx',
'Database has been renamed.' => 'xx',
'Database has been altered.' => 'xx',
'Alter database' => 'xx',
'Create database' => 'xx',
'Database schema' => 'xx',
'DB' => 'XX',
'Use' => 'Xx',
'Select database' => 'Xx',
'Invalid database.' => 'Xx.',
'Database has been dropped.' => 'Xx.',
'Databases have been dropped.' => 'Xx.',
'Database has been created.' => 'Xx.',
'Database has been renamed.' => 'Xx.',
'Database has been altered.' => 'Xx.',
'Alter database' => 'Xx',
'Create database' => 'Xx',
'Database schema' => 'Xx',
// link to current database schema layout
'Permanent link' => 'xx',
'Permanent link' => 'Xx',
// thousands separator - must contain single byte
',' => 'xx',
'Engine' => 'xx',
'Collation' => 'xx',
'Data Length' => 'xx',
'Index Length' => 'xx',
'Data Free' => 'xx',
'Rows' => 'xx',
'%d in total' => 'xx',
'Analyze' => 'xx',
'Optimize' => 'xx',
'Check' => 'xx',
'Repair' => 'xx',
'Truncate' => 'xx',
'Tables have been truncated.' => 'xx',
'Move to other database' => 'xx',
'Move' => 'xx',
'Tables have been moved.' => 'xx',
'Copy' => 'xx',
'Tables have been copied.' => 'xx',
',' => 'x',
'0123456789' => 'xxxxxxxxxx',
'Engine' => 'Xx',
'Collation' => 'Xx',
'Data Length' => 'Xx',
'Index Length' => 'Xx',
'Data Free' => 'Xx',
'Rows' => 'Xx',
'%d in total' => '%d xx',
'Analyze' => 'Xx',
'Optimize' => 'Xx',
'Vacuum' => 'Xx',
'Check' => 'Xx',
'Repair' => 'Xx',
'Truncate' => 'Xx',
'Tables have been truncated.' => 'Xx.',
'Move to other database' => 'Xx',
'Move' => 'Xx',
'Tables have been moved.' => 'Xx.',
'Copy' => 'Xx',
'Tables have been copied.' => 'Xx.',
'Routines' => 'xx',
'Routine has been called, %d row(s) affected.' => array('xx', 'xx'),
'Call' => 'xx',
'Parameter name' => 'xx',
'Create procedure' => 'xx',
'Create function' => 'xx',
'Routine has been dropped.' => 'xx',
'Routine has been altered.' => 'xx',
'Routine has been created.' => 'xx',
'Alter function' => 'xx',
'Alter procedure' => 'xx',
'Return type' => 'xx',
'Routines' => 'Xx',
'Routine has been called, %d row(s) affected.' => array('Xx, %d.', 'Xx, %d.'),
'Call' => 'Xx',
'Parameter name' => 'Xx',
'Create procedure' => 'Xx',
'Create function' => 'Xx',
'Routine has been dropped.' => 'Xx.',
'Routine has been altered.' => 'Xx.',
'Routine has been created.' => 'Xx.',
'Alter function' => 'Xx',
'Alter procedure' => 'Xx',
'Return type' => 'Xx',
'Events' => 'xx',
'Event has been dropped.' => 'xx',
'Event has been altered.' => 'xx',
'Event has been created.' => 'xx',
'Alter event' => 'xx',
'Create event' => 'xx',
'At given time' => 'xx',
'Every' => 'xx',
'Schedule' => 'xx',
'Start' => 'xx',
'End' => 'xx',
'On completion preserve' => 'xx',
'Events' => 'Xx',
'Event has been dropped.' => 'Xx.',
'Event has been altered.' => 'Xx.',
'Event has been created.' => 'Xx.',
'Alter event' => 'Xx',
'Create event' => 'Xx',
'At given time' => 'Xx',
'Every' => 'Xx',
'Schedule' => 'Xx',
'Start' => 'Xx',
'End' => 'Xx',
'On completion preserve' => 'Xx',
'Tables' => 'xx',
'Tables and views' => 'xx',
'Table' => 'xx',
'No tables.' => 'xx',
'Alter table' => 'xx',
'Create table' => 'xx',
'Create new table' => 'xx',
'Table has been dropped.' => 'xx',
'Tables have been dropped.' => 'xx',
'Tables have been optimized.' => 'xx',
'Table has been altered.' => 'xx',
'Table has been created.' => 'xx',
'Table name' => 'xx',
'Show structure' => 'xx',
'Tables' => 'Xx',
'Tables and views' => 'Xx',
'Table' => 'Xx',
'No tables.' => 'Xx.',
'Alter table' => 'Xx',
'Create table' => 'Xx',
'Table has been dropped.' => 'Xx.',
'Tables have been dropped.' => 'Xx.',
'Tables have been optimized.' => 'Xx.',
'Table has been altered.' => 'Xx.',
'Table has been created.' => 'Xx.',
'Table name' => 'Xx',
'Show structure' => 'Xx',
'engine' => 'xx',
'collation' => 'xx',
'Column name' => 'xx',
'Type' => 'xx',
'Length' => 'xx',
'Auto Increment' => 'xx',
'Options' => 'xx',
'Comment' => 'xx',
'Default values' => 'xx',
'Drop' => 'xx',
'Are you sure?' => 'xx',
'Move up' => 'xx',
'Move down' => 'xx',
'Remove' => 'xx',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => 'xx',
'Column name' => 'Xx',
'Type' => 'Xx',
'Length' => 'Xx',
'Auto Increment' => 'Xx',
'Options' => 'Xx',
'Comment' => 'Xx',
'Default value' => 'Xx',
'Default values' => 'Xx',
'Drop' => 'Xx',
'Drop %s?' => 'Xx %s?',
'Are you sure?' => 'Xx?',
'Size' => 'Xx',
'Compute' => 'Xx',
'Move up' => 'Xx',
'Move down' => 'Xx',
'Remove' => 'Xx',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Xx %s.',
'Partition by' => 'xx',
'Partitions' => 'xx',
'Partition name' => 'xx',
'Values' => 'xx',
'Partition by' => 'Xx',
'Partitions' => 'Xx',
'Partition name' => 'Xx',
'Values' => 'Xx',
'View' => 'xx',
'View has been dropped.' => 'xx',
'View has been altered.' => 'xx',
'View has been created.' => 'xx',
'Alter view' => 'xx',
'Create view' => 'xx',
'View' => 'Xx',
'Materialized view' => 'Xx',
'View has been dropped.' => 'Xx.',
'View has been altered.' => 'Xx.',
'View has been created.' => 'Xx.',
'Alter view' => 'Xx',
'Create view' => 'Xx',
'Indexes' => 'xx',
'Indexes have been altered.' => 'xx',
'Alter indexes' => 'xx',
'Add next' => 'xx',
'Index Type' => 'xx',
'Column (length)' => 'xx',
'Indexes' => 'Xx',
'Indexes have been altered.' => 'Xx.',
'Alter indexes' => 'Xx',
'Add next' => 'Xx',
'Index Type' => 'Xx',
'Column (length)' => 'Xx',
'Foreign keys' => 'xx',
'Foreign key' => 'xx',
'Foreign key has been dropped.' => 'xx',
'Foreign key has been altered.' => 'xx',
'Foreign key has been created.' => 'xx',
'Target table' => 'xx',
'Change' => 'xx',
'Source' => 'xx',
'Target' => 'xx',
'Add column' => 'xx',
'Alter' => 'xx',
'Add foreign key' => 'xx',
'ON DELETE' => 'xx',
'ON UPDATE' => 'xx',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'xx',
'Foreign keys' => 'Xx',
'Foreign key' => 'Xx',
'Foreign key has been dropped.' => 'Xx.',
'Foreign key has been altered.' => 'Xx.',
'Foreign key has been created.' => 'Xx.',
'Target table' => 'Xx',
'Change' => 'Xx',
'Source' => 'Xx',
'Target' => 'Xx',
'Add column' => 'Xx',
'Alter' => 'Xx',
'Add foreign key' => 'Xx',
'ON DELETE' => 'Xx',
'ON UPDATE' => 'Xx',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Xx.',
'Triggers' => 'xx',
'Add trigger' => 'xx',
'Trigger has been dropped.' => 'xx',
'Trigger has been altered.' => 'xx',
'Trigger has been created.' => 'xx',
'Alter trigger' => 'xx',
'Create trigger' => 'xx',
'Time' => 'xx',
'Event' => 'xx',
'Name' => 'xx',
'Triggers' => 'Xx',
'Add trigger' => 'Xx',
'Trigger has been dropped.' => 'Xx.',
'Trigger has been altered.' => 'Xx.',
'Trigger has been created.' => 'Xx.',
'Alter trigger' => 'Xx',
'Create trigger' => 'Xx',
'Time' => 'Xx',
'Event' => 'Xx',
'Name' => 'Xx',
'select' => 'xx',
'Select' => 'xx',
'Select data' => 'xx',
'Functions' => 'xx',
'Aggregation' => 'xx',
'Search' => 'xx',
'Select' => 'Xx',
'Select data' => 'Xx',
'Functions' => 'Xx',
'Aggregation' => 'Xx',
'Search' => 'Xx',
'anywhere' => 'xx',
'Search data in tables' => 'xx',
'Sort' => 'xx',
'Search data in tables' => 'Xx',
'Sort' => 'Xx',
'descending' => 'xx',
'Limit' => 'xx',
'Text length' => 'xx',
'Action' => 'xx',
'Full table scan' => 'xx',
'Unable to select the table' => 'xx',
'No rows.' => 'xx',
'%d row(s)' => array('xx', 'xx'),
'Page' => 'xx',
'Limit' => 'Xx',
'Limit rows' => 'Xx',
'Text length' => 'Xx',
'Action' => 'Xx',
'Full table scan' => 'Xx',
'Unable to select the table' => 'Xx',
'No rows.' => 'Xx.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d xx', '%d xx'),
'Page' => 'Xx',
'last' => 'xx',
'Last page' => 'xx',
'Load more data' => 'xx',
'Loading' => 'xx',
'whole result' => 'xx',
'%d byte(s)' => array('xx', 'xx'),
'Load more data' => 'Xx',
'Loading' => 'Xx',
'Whole result' => 'Xx',
'%d byte(s)' => array('%d xx', '%d xx'),
'Import' => 'xx',
'%d row(s) have been imported.' => array('xx', 'xx'),
'Import' => 'Xx',
'%d row(s) have been imported.' => array('%d xx.', '%d xx.'),
'File must be in UTF-8 encoding.' => 'Xx.',
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'xx',
'Use edit link to modify this value.' => 'xx',
'Modify' => 'Xx',
'Ctrl+click on a value to modify it.' => 'Xx.',
'Use edit link to modify this value.' => 'Xx.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'xx',
'Item has been deleted.' => 'xx',
'Item has been updated.' => 'xx',
'%d item(s) have been affected.' => array('xx', 'xx'),
'New item' => 'xx',
'Item%s has been inserted.' => 'Xx%s.',
'Item has been deleted.' => 'Xx.',
'Item has been updated.' => 'Xx.',
'%d item(s) have been affected.' => array('%d xx.', '%d xx.'),
'New item' => 'Xx',
'original' => 'xx',
// label for value '' in enum data type
'empty' => 'xx',
'edit' => 'xx',
'Edit' => 'xx',
'Insert' => 'xx',
'Save' => 'xx',
'Save and continue edit' => 'xx',
'Save and insert next' => 'xx',
'Clone' => 'xx',
'Delete' => 'xx',
'You have no privileges to update this table.' => 'xx',
'Edit' => 'Xx',
'Insert' => 'Xx',
'Save' => 'Xx',
'Save and continue edit' => 'Xx',
'Save and insert next' => 'Xx',
'Selected' => 'Xx',
'Clone' => 'Xx',
'Delete' => 'Xx',
'You have no privileges to update this table.' => 'Xx.',
'E-mail' => 'xx',
'From' => 'xx',
'Subject' => 'xx',
'Attachments' => 'xx',
'Send' => 'xx',
'%d e-mail(s) have been sent.' => array('xx', 'xx'),
'E-mail' => 'Xx',
'From' => 'Xx',
'Subject' => 'Xx',
'Attachments' => 'Xx',
'Send' => 'Xx',
'%d e-mail(s) have been sent.' => array('%d xx.', '%d xx.'),
// data type descriptions
'Numbers' => 'xx',
'Date and time' => 'xx',
'Strings' => 'xx',
'Binary' => 'xx',
'Lists' => 'xx',
'Network' => 'xx',
'Geometry' => 'xx',
'Relations' => 'xx',
'Numbers' => 'Xx',
'Date and time' => 'Xx',
'Strings' => 'Xx',
'Binary' => 'Xx',
'Lists' => 'Xx',
'Network' => 'Xx',
'Geometry' => 'Xx',
'Relations' => 'Xx',
'Editor' => 'xx',
'Editor' => 'Xx',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => 'xx',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'xx',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'xx',
'HH:MM:SS' => 'Xx',
'now' => 'xx',
'yes' => 'xx',
'no' => 'xx',
// general SQLite error in create, drop or rename database
'File exists.' => 'xx',
'Please use one of the extensions %s.' => 'xx',
'File exists.' => 'Xx.',
'Please use one of the extensions %s.' => 'Xx %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'xx',
'Create schema' => 'xx',
'Schema has been dropped.' => 'xx',
'Schema has been created.' => 'xx',
'Schema has been altered.' => 'xx',
'schema' => 'xx',
'Schema' => 'xx',
'Invalid schema.' => 'xx',
'Alter schema' => 'Xx',
'Create schema' => 'Xx',
'Schema has been dropped.' => 'Xx.',
'Schema has been created.' => 'Xx.',
'Schema has been altered.' => 'Xx.',
'Schema' => 'Xx',
'Invalid schema.' => 'Xx.',
// PostgreSQL sequences support
'Sequences' => 'xx',
'Create sequence' => 'xx',
'Sequence has been dropped.' => 'xx',
'Sequence has been created.' => 'xx',
'Sequence has been altered.' => 'xx',
'Alter sequence' => 'xx',
'Sequences' => 'Xx',
'Create sequence' => 'Xx',
'Sequence has been dropped.' => 'Xx.',
'Sequence has been created.' => 'Xx.',
'Sequence has been altered.' => 'Xx.',
'Alter sequence' => 'Xx',
// PostgreSQL user types support
'User types' => 'xx',
'Create type' => 'xx',
'Type has been dropped.' => 'xx',
'Type has been created.' => 'xx',
'Alter type' => 'xx',
'User types' => 'Xx',
'Create type' => 'Xx',
'Type has been dropped.' => 'Xx.',
'Type has been created.' => 'Xx.',
'Alter type' => 'Xx',
);

View File

@@ -1,271 +1,348 @@
<?php
$translations = array(
'Login' => '登入',
'Logout successful.' => '登出成功。',
'Invalid credentials.' => '無效的憑證。',
// label for database system selection (MySQL, SQLite, ...)
'System' => '資料庫系統',
'Server' => '伺服器',
'Username' => '帳號',
'Password' => '密碼',
'Select database' => '選擇資料庫',
'Invalid database.' => '無效的資料庫。',
'Create new database' => '建立新資料庫',
'Table has been altered.' => '資料表已更改。',
'Table has been created.' => '資料表已更改。',
'Alter table' => '更改資料表',
'Create table' => '建立資料表表',
'Table name' => '資料表名稱',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '列名',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動增加',
'Options' => '選項',
'Save' => '儲存',
'Drop' => '丟棄',
'Database has been dropped.' => '資料庫已刪除。',
'Database has been created.' => '已建立資料庫。',
'Database has been renamed.' => '已重新命名資料庫。',
'Database has been altered.' => '已更改資料庫。',
'Alter database' => '更改資料庫',
'Create database' => '建立資料庫',
'SQL command' => 'SQL命令',
'Dump' => '導入/導出',
'Permanent login' => '永久登入',
'Login' => '登入',
'Logout' => '登出',
'database' => '資料庫',
'Use' => '使用',
'No tables.' => '沒有資料表。',
'select' => '選擇',
'Create new table' => '建立新資料表',
'Item has been updated.' => '已更新項目。',
'Item%s has been inserted.' => '已插入項目%s。',
'Edit' => '編輯',
'Insert' => '插入',
'Save and insert next' => '儲存並插入下一個',
'Delete' => '刪除',
'Database' => '資料庫',
'Routines' => '程序',
'Indexes have been altered.' => '已更改索引。',
'Indexes' => '索引',
'Alter indexes' => '更改索引',
'Add next' => '新增下一個',
'Logged as: %s' => '登錄為: %s',
'Logout successful.' => '成功登出。',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感謝使用Adminer請考慮為我們<a href="https://www.adminer.org/en/donation/">捐款(英文網頁)</a>.',
'Invalid credentials.' => '無效的憑證。',
'There is a space in the input password which might be the cause.' => '您輸入的密碼中有一個空格,這可能是導致問題的原因。',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer預設不支援訪問沒有密碼的資料庫<a href="https://www.adminer.org/en/password/"%s>詳情見這裡</a>.',
'Database does not support password.' => '資料庫不支援密碼。',
'Too many unsuccessful logins, try again in %d minute(s).' => '登錄失敗次數過多,請 %d 分鐘後重試。',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密碼已過期。<a href="https://www.adminer.org/en/extension/"%s>請擴展</a> %s 方法讓它永久化。',
'Language' => '語言',
'Select' => '選擇',
'New item' => '新建項',
'Search' => '搜尋',
'Sort' => '排序',
'descending' => '降冪',
'Limit' => '限定',
'No rows.' => '沒有行。',
'Action' => '動作',
'edit' => '編輯',
'Page' => '頁',
'Query executed OK, %d row(s) affected.' => '執行查詢OK%d行受影響',
'Error in query' => '查詢出錯',
'Execute' => '執行',
'Table' => '資料表',
'Foreign keys' => '外鍵',
'Triggers' => '觸發器',
'View' => '檢視表',
'Unable to select the table' => '無法選擇該資料表',
'Invalid CSRF token. Send the form again.' => '無效的 CSRF token。請重新發送表單。',
'Comment' => '註解',
'Default values' => '預設值',
'%d byte(s)' => '%d byte(s)',
'No commands to execute.' => '沒有命令可執行。',
'Unable to upload a file.' => '無法上傳檔案。',
'File upload' => '檔案上傳',
'File uploads are disabled.' => '檔案上傳被禁用。',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響',
'Call' => '呼叫',
'No extension' => '沒有 擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的PHP擴充模組%s。',
'If you did not send this request from Adminer then close this page.' => '如果您並沒有從Adminer發送請求請關閉此頁面。',
'No extension' => '無擴充模組',
'None of the supported PHP extensions (%s) are available.' => '沒有任何支援的 PHP 擴充模組(%s',
'Connecting to privileged ports is not allowed.' => '不允許連接到特權埠。',
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或啟用 %s 或 %s 擴充模組。',
'Session support must be enabled.' => 'Session 必須被啟用。',
'Session expired, please login again.' => 'Session 已過期,請重新登入。',
'Text length' => 'Text 長度',
'Foreign key has been dropped.' => '已刪除外鍵。',
'Foreign key has been altered.' => '已更改外鍵。',
'Foreign key has been created.' => '已建立外鍵。',
'Foreign key' => '外鍵',
'Target table' => '目標資料表',
'Change' => '更改',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增資料列',
'Alter' => '更改',
'Add foreign key' => '新增外鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引類型',
'Column (length)' => '列(長度)',
'View has been dropped.' => '已丟棄檢視表。',
'View has been altered.' => '已更改檢視表。',
'View has been created.' => '已建立檢視表。',
'Alter view' => '更改檢視表',
'Create view' => '建立檢視表',
'Name' => '名稱',
'Process list' => '進程列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Parameter name' => '參數名稱',
'Database schema' => '資料庫架構',
'Create procedure' => '建立預存程序',
'Create function' => '建立函數',
'Routine has been dropped.' => '已丟棄程序。',
'Routine has been altered.' => '已更改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '更改函數',
'Alter procedure' => '更改過程',
'Return type' => '返回類型',
'Add trigger' => '建立觸發器',
'Trigger has been dropped.' => '已丟棄觸發器。',
'Trigger has been altered.' => '已更改觸發器。',
'Trigger has been created.' => '已建立觸發器。',
'Alter trigger' => '更改觸發器',
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s版本%s 透過PHP擴充模組 %s',
'%d row(s)' => '%d行',
'Remove' => '移除',
'Are you sure?' => '你確定嗎?',
'The action will be performed after successful login with the same credentials.' => '此操作將在成功使用相同的憑據登錄後執行。',
'%s version: %s through PHP extension %s' => '%s 版本:%s 透過 PHP 擴充模組 %s',
'Refresh' => '重新載入',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '權限',
'Create user' => '建立使用者',
'User has been dropped.' => '已丟棄使用者。',
'User has been altered.' => '已改使用者。',
'User has been dropped.' => '已刪除使用者。',
'User has been altered.' => '已改使用者。',
'User has been created.' => '已建立使用者。',
'Hashed' => 'Hashed',
'Column' => '',
'Column' => '欄位',
'Routine' => '程序',
'Grant' => '授權',
'Revoke' => '廢除',
'Logged as: %s' => '登錄為:%s',
'Process list' => '處理程序列表',
'%d process(es) have been killed.' => '%d 個 Process(es) 被終止',
'Kill' => '終止',
'Variables' => '變數',
'Status' => '狀態',
'SQL command' => 'SQL 命令',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Query executed OK, %d row(s) affected.' => '執行查詢 OK%d 行受影響。',
'No commands to execute.' => '沒有命令可執行。',
'Error in query' => '查詢發生錯誤',
'Unknown error.' => '未知錯誤。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支援ATTACH查詢。',
'Execute' => '執行',
'Stop on error' => '出錯時停止',
'Show only errors' => '僅顯示錯誤訊息',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '紀錄',
'Clear' => '清除',
'Edit all' => '編輯全部',
'File upload' => '檔案上傳',
'From server' => '從伺服器',
'Webserver file %s' => '網頁伺服器檔案 %s',
'Run file' => '執行檔案',
'File does not exist.' => '檔案不存在',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Unable to upload a file.' => '無法上傳檔案。',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為 %sB',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 資料太大。減少資料或者增加 %s 的設定值。',
'Move up' => '上移',
'Move down' => '下移',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通過FTP上傳大型SQL檔並從伺服器導入。',
'You are offline.' => '您離線了。',
'Export' => '匯出',
'Tables' => '資料表',
'Data' => '資料',
'Output' => '輸出',
'open' => '打開',
'save' => '儲存',
'Saving' => '保存中',
'Format' => '格式',
'Functions' => '函數',
'Aggregation' => '集合',
'Event has been dropped.' => '已丟棄事件。',
'Event has been altered.' => '已更改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '更改事件',
'Create event' => '建立事件',
'Start' => '開始',
'End' => '結束',
'Every' => '',
'Status' => '狀態',
'On completion preserve' => '在完成後保存',
'Events' => '事件',
'Schedule' => '調度',
'At given time' => '在指定時間',
'Tables have been truncated.' => '已清空資料表。',
'Tables have been moved.' => '已轉移資料表。',
'Tables and views' => '資料表和檢視表',
'Data' => '資料',
'Database' => '資料庫',
'database' => '資料庫',
'DB' => '資料庫',
'Use' => '使用',
'Select database' => '選擇資料庫',
'Invalid database.' => '無效的資料庫。',
'Database has been dropped.' => '資料庫已刪除。',
'Databases have been dropped.' => '資料庫已刪除。',
'Database has been created.' => '已建立資料庫。',
'Database has been renamed.' => '已重新命名資料庫。',
'Database has been altered.' => '已修改資料庫。',
'Alter database' => '修改資料庫',
'Create database' => '建立資料庫',
'Database schema' => '資料庫結構',
// link to current database schema layout
'Permanent link' => '永久連結',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎',
'Collation' => '校對',
'Data Length' => '資料長度',
'Index Length' => '索引長度',
'Data Free' => '資料空閒',
'Rows' => '行數',
',' => ',',
'%d in total' => '總共 %d 個',
'Analyze' => '分析',
'Optimize' => '化',
'Optimize' => '最佳化',
'Vacuum' => '整理Vacuum',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Tables have been truncated.' => '已清空資料表。',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Save and continue edit' => '保存並繼續編輯',
'original' => '原始',
'%d item(s) have been affected.' => '%d個項目受到影響。',
'whole result' => '所有結果',
'Tables have been dropped.' => '已丟棄表。',
'Clone' => '複製',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '超過最多允許的字段數量。請增加%s和%s 。',
'Tables have been moved.' => '已轉移資料表。',
'Copy' => '複製',
'Tables have been copied.' => '資料表已經複製',
'Routines' => '程序',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d 行被影響',
'Call' => '呼叫',
'Parameter name' => '參數名稱',
'Create procedure' => '建立預存程序',
'Create function' => '建立函式',
'Routine has been dropped.' => '已刪除程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '修改函式',
'Alter procedure' => '修改預存程序',
'Return type' => '回傳類型',
'Events' => '事件',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '修改事件',
'Create event' => '建立事件',
'At given time' => '在指定時間',
'Every' => '每',
'Schedule' => '排程',
'Start' => '開始',
'End' => '結束',
'On completion preserve' => '在完成後儲存',
'Tables' => '資料表',
'Tables and views' => '資料表和檢視表',
'Table' => '資料表',
'No tables.' => '沒有資料表。',
'Alter table' => '修改資料表',
'Create table' => '建立資料表',
'Table has been dropped.' => '已經刪除資料表。',
'Tables have been dropped.' => '已經將資料表刪除。',
'Tables have been optimized.' => '已優化資料表。',
'Table has been altered.' => '資料表已修改。',
'Table has been created.' => '資料表已建立。',
'Table name' => '資料表名稱',
'Show structure' => '顯示結構',
'engine' => '引擎',
'collation' => '校對',
'Column name' => '欄位名稱',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動遞增',
'Options' => '選項',
'Comment' => '註解',
'Default value' => '預設值',
'Default values' => '預設值',
'Drop' => '刪除',
'Drop %s?' => '刪除 %s?',
'Are you sure?' => '你確定嗎?',
'Size' => '大小',
'Compute' => '計算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超過允許的字段數量的最大值。請增加 %s。',
'Partition by' => '分區類型',
'Partitions' => '分區',
'Partition name' => '分區名',
'Partition name' => '分區名',
'Values' => '值',
'%d row(s) have been imported.' => '%d行已導入。',
'View' => '檢視表',
'Materialized view' => '物化視圖',
'View has been dropped.' => '已刪除檢視表。',
'View has been altered.' => '已修改檢視表。',
'View has been created.' => '已建立檢視表。',
'Alter view' => '修改檢視表',
'Create view' => '建立檢視表',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '新增下一筆',
'Index Type' => '索引類型',
'Column (length)' => '欄位(長度)',
'Foreign keys' => '外來鍵',
'Foreign key' => '外來鍵',
'Foreign key has been dropped.' => '已刪除外來鍵。',
'Foreign key has been altered.' => '已修改外來鍵。',
'Foreign key has been created.' => '已建立外來鍵。',
'Target table' => '目標資料表',
'Change' => '變更',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增欄位',
'Alter' => '修改',
'Add foreign key' => '新增外來鍵',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '來源列和目標列必須具有相同的資料類型,在目標列上必須有一個索引並且引用的資料必須存在。',
'Triggers' => '觸發器',
'Add trigger' => '建立觸發器',
'Trigger has been dropped.' => '已刪除觸發器。',
'Trigger has been altered.' => '已修改觸發器。',
'Trigger has been created.' => '已建立觸發器。',
'Alter trigger' => '修改觸發器',
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
'Name' => '名稱',
'select' => '選擇',
'Select' => '選擇',
'Select data' => '選擇資料',
'Functions' => '函式',
'Aggregation' => '集合',
'Search' => '搜尋',
'anywhere' => '任意位置',
'Search data in tables' => '在資料庫搜尋',
'Sort' => '排序',
'descending' => '降冪 (遞減)',
'Limit' => '限定',
'Limit rows' => '限制行數',
'Text length' => 'Text 長度',
'Action' => '動作',
'Full table scan' => '全資料表掃描',
'Unable to select the table' => '無法選擇該資料表',
'No rows.' => '沒有資料行。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '頁',
'last' => '最後一頁',
'Load more data' => '載入更多資料',
'Loading' => '載入中',
'Whole result' => '所有結果',
'%d byte(s)' => '%d byte(s)',
'Import' => '匯入',
'Stop on error' => '出錯時停止',
'%.3f s' => '%.3f秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '歷史',
'Variables' => '變數',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目標列必須具有相同的數據類型,在目標列上必須有一個索引並且引用的數據必須存在。',
'Relations' => '關聯',
'Run file' => '執行檔案',
'Clear' => '清除',
'Maximum allowed file size is %sB.' => '允許的檔案上限大小為%sB',
'Numbers' => '數字',
'Date and time' => '日期時間',
'Strings' => '字符串',
'Binary' => '二進制',
'Lists' => '列表',
'Editor' => '編輯器',
'%d row(s) have been imported.' => '已匯入 %d 行。',
'File must be in UTF-8 encoding.' => '檔必須使用UTF-8編碼。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl並按一下某個值進行修改。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已新增項目 %s。',
'Item has been deleted.' => '該項目已被刪除',
'Item has been updated.' => '已更新項目。',
'%d item(s) have been affected.' => '%d 個項目受到影響。',
'New item' => '新增項目',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空值',
'edit' => '編輯',
'Edit' => '編輯',
'Insert' => '新增',
'Save' => '儲存',
'Save and continue edit' => '儲存並繼續編輯',
'Save and insert next' => '儲存並新增下一筆',
'Selected' => '已選中',
'Clone' => '複製',
'Delete' => '刪除',
'You have no privileges to update this table.' => '您沒有許可權更新這個資料表。',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主',
'Send' => '發送',
'%d e-mail(s) have been sent.' => '已發送 %d 封郵件。',
'Webserver file %s' => '網頁伺服器檔案 %s',
'File does not exist.' => '檔案不存在',
'Item has been deleted.' => '該項目已被刪除',
'%d in total' => '總共 %d 個',
'Permanent login' => '永久登入',
'Table has been dropped.' => '已經刪除資料表。',
'Databases have been dropped.' => '資料庫已刪除。',
'Search data in tables' => '在資料庫搜尋',
'schema' => '資料表結構',
'Schema' => '資料表結構',
'Alter schema' => '更改資料表結構',
'Subject' => '主',
'Attachments' => '附件',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
// data type descriptions
'Numbers' => '數字',
'Date and time' => '日期時間',
'Strings' => '字串',
'Binary' => '二進位',
'Lists' => '列表',
'Network' => '網路',
'Geometry' => '幾何',
'Relations' => '關聯',
'Editor' => '編輯器',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1.$3.$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => '現在',
'yes' => '是',
'no' => '否',
// general SQLite error in create, drop or rename database
'File exists.' => '檔案已存在。',
'Please use one of the extensions %s.' => '請使用下列其中一個擴充模組 %s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改資料表結構',
'Create schema' => '建立資料表結構',
'Schema has been dropped.' => '已刪除資料表結構。',
'Schema has been created.' => '已建立資料表結構。',
'Schema has been altered.' => '已改資料表結構。',
'Sequences' => 'Sequences',
'Create sequence' => '建立 sequence',
'Alter sequence' => '更改 sequence',
'Sequence has been dropped.' => '已刪除 sequence。',
'Sequence has been created.' => '已建立 sequence。',
'Sequence has been altered.' => '已更改 sequence。',
'Schema has been altered.' => '已改資料表結構。',
'Schema' => '資料表結構',
'Invalid schema.' => '無效的資料表結構。',
// PostgreSQL sequences support
'Sequences' => '序列',
'Create sequence' => '建立序列',
'Sequence has been dropped.' => '已刪除序列。',
'Sequence has been created.' => '已建立序列。',
'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '使用者類型',
'Create type' => '建立類型',
'Alter type' => '更改類型',
'Type has been dropped.' => '已刪除類型。',
'Type has been created.' => '已建立類型。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
'last' => '最後一頁',
'From server' => '從伺服器',
'System' => '資料庫系統',
'Select data' => '選擇資料',
'Show structure' => '秀出結構',
'empty' => '空值',
'Network' => '網路',
'Geometry' => '幾何',
'File exists.' => '檔案已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '已順利執行 %d 個查詢。',
'Show only errors' => '僅顯示錯誤訊息',
'Last page' => '最後一頁',
'Refresh' => '重新載入',
'Invalid schema.' => '無效的資料表結構。',
'Please use one of the extensions %s.' => '請使用下列其中一個 extension %s。',
'now' => '現在',
'ltr' => 'ltr',
'Tables have been copied.' => '表格已經複製',
'Copy' => '複製',
'Permanent link' => '永久鏈接',
'Edit all' => '編輯全部',
'HH:MM:SS' => 'HH:MM:SS',
'Alter type' => '修改類型',
);

View File

@@ -1,271 +1,348 @@
<?php
$translations = array(
'Login' => '登录',
'Logout successful.' => '注销成功。',
'Invalid credentials.' => '无效凭据。',
// label for database system selection (MySQL, SQLite, ...)
'System' => '系统',
'Server' => '服务器',
'Username' => '用户名',
'Password' => '密码',
'Select database' => '选择数据库',
'Invalid database.' => '无效数据库。',
'Create new database' => '创建新数据库',
'Table has been dropped.' => '已丢弃表。',
'Table has been altered.' => '已更改表。',
'Table has been created.' => '已创建表。',
'Alter table' => '更改表',
'Create table' => '创建表',
'Table name' => '表名',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '列名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Save' => '保存',
'Drop' => '丢弃',
'Database has been dropped.' => '已丢弃数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已更改数据库。',
'Alter database' => '更改数据库',
'Create database' => '创建数据库',
'SQL command' => 'SQL命令',
'Dump' => '导出',
'Logout' => '注销',
'database' => '数据库',
'Use' => '使用',
'No tables.' => '没有表。',
'select' => '选择',
'Create new table' => '创建新表',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'Item%s has been inserted.' => '已插入项目%s。',
'Edit' => '编辑',
'Insert' => '插入',
'Save and insert next' => '保存并插入下一个',
'Delete' => '删除',
'Database' => '数据库',
'Routines' => '子程序',
'Indexes have been altered.' => '已更改索引。',
'Indexes' => '索引',
'Alter indexes' => '更改索引',
'Add next' => '添加下一个',
'Permanent login' => '保持登录',
'Login' => '登录',
'Logout' => '登出',
'Logged as: %s' => '登录用户:%s',
'Logout successful.' => '成功登出。',
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => '感谢使用Adminer请考虑为我们<a href="https://www.adminer.org/en/donation/">捐款(英文页面)</a>.',
'Invalid credentials.' => '无效凭据。',
'There is a space in the input password which might be the cause.' => '您输入的密码中有一个空格,这可能是导致问题的原因。',
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer默认不支持访问没有密码的数据库<a href="https://www.adminer.org/en/password/"%s>详情见这里</a>.',
'Database does not support password.' => '数据库不支持密码。',
'Too many unsuccessful logins, try again in %d minute(s).' => '登录失败次数过多,请 %d 分钟后重试。',
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => '主密码已过期。<a href="https://www.adminer.org/en/extension/"%s>请扩展</a> %s 方法让它永久化。',
'Language' => '语言',
'Select' => '选择',
'New item' => '新建项',
'Search' => '搜索',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '限定',
'No rows.' => '没有行。',
'Action' => '动作',
'edit' => '编辑',
'Page' => '页面',
'Query executed OK, %d row(s) affected.' => '执行查询OK%d 行受影响。',
'Error in query' => '查询出错',
'Execute' => '执行',
'Table' => '表',
'Foreign keys' => '外键',
'Triggers' => '触发器',
'View' => '视图',
'Unable to select the table' => '不能选择该表',
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。重新发送表单。',
'Comment' => '注释',
'Default values' => '默认值',
'%d byte(s)' => '%d 字节',
'No commands to execute.' => '没有命令执行。',
'Unable to upload a file.' => '不能上传文件。',
'File upload' => '文件上传',
'File uploads are disabled.' => '文件上传被禁用。',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'Invalid CSRF token. Send the form again.' => '无效 CSRF 令牌。请重新发送表单。',
'If you did not send this request from Adminer then close this page.' => '如果您并没有从Adminer发送请求请关闭此页面。',
'No extension' => '没有扩展',
'None of the supported PHP extensions (%s) are available.' => '没有支持的 PHP 扩展可用(%s。',
'Session support must be enabled.' => '会话必须被启用。',
'Connecting to privileged ports is not allowed.' => '不允许连接到特权端口。',
'Disable %s or enable %s or %s extensions.' => '禁用 %s 或启用 %s 或 %s 扩展。',
'Session support must be enabled.' => '必须启用会话支持。',
'Session expired, please login again.' => '会话已过期,请重新登录。',
'Text length' => '文本长度',
'Foreign key has been dropped.' => '已删除外键。',
'Foreign key has been altered.' => '已更改外键。',
'Foreign key has been created.' => '已创建外键。',
'Foreign key' => '外键',
'Target table' => '目标表',
'Change' => '更改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '更改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'View has been dropped.' => '已丢弃视图。',
'View has been altered.' => '已更改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '更改视图',
'Create view' => '创建视图',
'Name' => '名称',
'Process list' => '进程列表',
'%d process(es) have been killed.' => '%d 个进程被终止',
'Kill' => '终止',
'Parameter name' => '参数名',
'Database schema' => '数据库概要',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已丢弃子程序。',
'Routine has been altered.' => '已更改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '更改函数',
'Alter procedure' => '更改过程',
'Return type' => '返回类型',
'Add trigger' => '创建触发器',
'Trigger has been dropped.' => '已丢弃触发器。',
'Trigger has been altered.' => '已更改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '更改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s 版本:%s 通过 PHP 扩展 %s',
'%d row(s)' => '%d 行',
'Remove' => '移除',
'Are you sure?' => '你确定吗?',
'The action will be performed after successful login with the same credentials.' => '此操作将在成功使用相同的凭据登录后执行。',
'%s version: %s through PHP extension %s' => '%s 版本:%s 使用PHP扩展 %s',
'Refresh' => '刷新',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => '权限',
'Create user' => '创建用户',
'User has been dropped.' => '已丢弃用户。',
'User has been altered.' => '已改用户。',
'User has been dropped.' => '已删除用户。',
'User has been altered.' => '已改用户。',
'User has been created.' => '已创建用户。',
'Hashed' => 'Hashed',
'Column' => '列',
'Routine' => '子程序',
'Grant' => '授权',
'Revoke' => '废除',
'Logged as: %s' => '登录为:%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
'Move up' => '上移',
'Move down' => '下移',
'Process list' => '进程列表',
'%d process(es) have been killed.' => '%d 个进程被终止',
'Kill' => '终止',
'Variables' => '变量',
'Status' => '状态',
'SQL command' => 'SQL命令',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Query executed OK, %d row(s) affected.' => '查询执行完毕,%d 行受影响。',
'No commands to execute.' => '没有命令被执行。',
'Error in query' => '查询出错',
'Unknown error.' => '未知错误。',
'Warnings' => '警告',
'ATTACH queries are not supported.' => '不支持ATTACH查询。',
'Execute' => '执行',
'Stop on error' => '出错时停止',
'Show only errors' => '仅显示错误',
// sprintf() format for time of the command
'%.3f s' => '%.3f 秒',
'History' => '历史',
'Clear' => '清除',
'Edit all' => '编辑全部',
'File upload' => '文件上传',
'From server' => '来自服务器',
'Webserver file %s' => 'Web服务器文件 %s',
'Run file' => '运行文件',
'File does not exist.' => '文件不存在。',
'File uploads are disabled.' => '文件上传被禁用。',
'Unable to upload a file.' => '不能上传文件。',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB。',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 数据太大。请减少数据或者增加 %s 配置命令。',
'You can upload a big SQL file via FTP and import it from server.' => '您可以通过FTP上传大型SQL文件并从服务器导入。',
'You are offline.' => '您离线了。',
'Export' => '导出',
'Tables' => '表',
'Data' => '数据',
'Output' => '输出',
'open' => '打开',
'save' => '保存',
'Saving' => '保存中',
'Format' => '格式',
'Functions' => '数',
'Aggregation' => '集合',
'Event has been dropped.' => '已丢弃事件。',
'Event has been altered.' => '已更改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '更改事件',
'Create event' => '创建事件',
'Start' => '开始',
'End' => '结束',
'Every' => '',
'Status' => '状态',
'On completion preserve' => '完成后保存',
'Events' => '事件',
'Schedule' => '调度',
'At given time' => '在指定时间',
'Tables have been truncated.' => '已清空表。',
'Tables have been moved.' => '已转移表。',
'Tables and views' => '表和视图',
'Data' => '数',
'Database' => '数据库',
'database' => '数据库',
'DB' => '数据库',
'Use' => '使用',
'Select database' => '选择数据库',
'Invalid database.' => '无效数据库。',
'Database has been dropped.' => '已删除数据库。',
'Databases have been dropped.' => '已删除数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已修改数据库。',
'Alter database' => '修改数据库',
'Create database' => '创建数据库',
'Database schema' => '数据库概要',
// link to current database schema layout
'Permanent link' => '固定链接',
// thousands separator - must contain single byte
',' => ',',
'0123456789' => '0123456789',
'Engine' => '引擎',
'Collation' => '校对',
'Data Length' => '数据长度',
'Index Length' => '索引长度',
'Data Free' => '数据空闲',
'Rows' => '行数',
',' => ',',
'%d in total' => '共计 %d',
'Analyze' => '分析',
'Optimize' => '优化',
'Vacuum' => '整理Vacuum',
'Check' => '检查',
'Repair' => '修复',
'Truncate' => '清空',
'Tables have been truncated.' => '已清空表。',
'Move to other database' => '转移到其它数据库',
'Move' => '转移',
'Save and continue edit' => '保存并继续编辑',
'original' => '原始',
'%d item(s) have been affected.' => '%d 个项目受到影响。',
'whole result' => '所有结果',
'Tables have been dropped.' => '已丢弃表。',
'Clone' => '克隆',
'Maximum number of allowed fields exceeded. Please increase %s and %s.' => '超过最多允许的字段数量。请增加 %s 和 %s 。',
'Tables have been moved.' => '已转移表。',
'Copy' => '复制',
'Tables have been copied.' => '已复制表。',
'Routines' => '子程序',
'Routine has been called, %d row(s) affected.' => '子程序被调用,%d 行被影响。',
'Call' => '调用',
'Parameter name' => '参数名',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已修改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '修改函数',
'Alter procedure' => '修改过程',
'Return type' => '返回类型',
'Events' => '事件',
'Event has been dropped.' => '已删除事件。',
'Event has been altered.' => '已修改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '修改事件',
'Create event' => '创建事件',
'At given time' => '在指定时间',
'Every' => '每',
'Schedule' => '调度',
'Start' => '开始',
'End' => '结束',
'On completion preserve' => '完成后仍保留',
'Tables' => '表',
'Tables and views' => '表和视图',
'Table' => '表',
'No tables.' => '没有表。',
'Alter table' => '修改表',
'Create table' => '创建表',
'Table has been dropped.' => '已删除表。',
'Tables have been dropped.' => '已删除表。',
'Tables have been optimized.' => '已优化表。',
'Table has been altered.' => '已修改表。',
'Table has been created.' => '已创建表。',
'Table name' => '表名',
'Show structure' => '显示结构',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '字段名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Comment' => '注释',
'Default value' => '默认值',
'Default values' => '默认值',
'Drop' => '删除',
'Drop %s?' => '删除 %s?',
'Are you sure?' => '您确定吗?',
'Size' => '大小',
'Compute' => '计算',
'Move up' => '上移',
'Move down' => '下移',
'Remove' => '移除',
'Maximum number of allowed fields exceeded. Please increase %s.' => '超过最多允许的字段数量。请增加 %s。',
'Partition by' => '分区类型',
'Partitions' => '分区',
'Partition name' => '分区名',
'Values' => '值',
'%d row(s) have been imported.' => '%d 行已导入。',
'anywhere' => '任意位置',
'Import' => '导入',
'Stop on error' => '出错时停止',
'%.3f s' => '%.3f 秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '历史',
'Variables' => '变量',
'View' => '视图',
'Materialized view' => '物化视图',
'View has been dropped.' => '已删除视图。',
'View has been altered.' => '已修改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '修改视图',
'Create view' => '创建视图',
'Indexes' => '索引',
'Indexes have been altered.' => '已修改索引。',
'Alter indexes' => '修改索引',
'Add next' => '下一行插入',
'Index Type' => '索引类型',
'Column (length)' => '列(长度)',
'Foreign keys' => '外键',
'Foreign key' => '外键',
'Foreign key has been dropped.' => '已删除外键。',
'Foreign key has been altered.' => '已修改外键。',
'Foreign key has been created.' => '已创建外键。',
'Target table' => '目标表',
'Change' => '修改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '修改',
'Add foreign key' => '添加外键',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '源列和目标列必须具有相同的数据类型,在目标列上必须有一个索引并且引用的数据必须存在。',
'Relations' => '关联信息',
'Run file' => '运行文件',
'Clear' => '清除',
'Maximum allowed file size is %sB.' => '最多允许的文件大小为 %sB',
'Triggers' => '触发器',
'Add trigger' => '创建触发器',
'Trigger has been dropped.' => '已删除触发器。',
'Trigger has been altered.' => '已修改触发器。',
'Trigger has been created.' => '已创建触发器。',
'Alter trigger' => '修改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'Name' => '名称',
'select' => '选择',
'Select' => '选择',
'Select data' => '选择数据',
'Functions' => '函数',
'Aggregation' => '集合',
'Search' => '搜索',
'anywhere' => '任意位置',
'Search data in tables' => '在表中搜索数据',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '范围',
'Limit rows' => '限制行数',
'Text length' => '文本显示限制',
'Action' => '动作',
'Full table scan' => '全表扫描',
'Unable to select the table' => '不能选择该表',
'No rows.' => '无数据。',
'%d / ' => '%d / ',
'%d row(s)' => '%d 行',
'Page' => '页面',
'last' => '最后',
'Load more data' => '加载更多数据',
'Loading' => '加载中',
'Whole result' => '所有结果',
'%d byte(s)' => '%d 字节',
'Import' => '导入',
'%d row(s) have been imported.' => '%d 行已导入。',
'File must be in UTF-8 encoding.' => '文件必须使用UTF-8编码。',
// in-place editing in select
'Modify' => '修改',
'Ctrl+click on a value to modify it.' => '按住Ctrl并单击某个值进行修改。',
'Use edit link to modify this value.' => '使用编辑链接修改该值。',
// %s can contain auto-increment value
'Item%s has been inserted.' => '已插入项目%s。',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'%d item(s) have been affected.' => '%d 个项目受到影响。',
'New item' => '新建数据',
'original' => '原始',
// label for value '' in enum data type
'empty' => '空',
'edit' => '编辑',
'Edit' => '编辑',
'Insert' => '插入',
'Save' => '保存',
'Save and continue edit' => '保存并继续编辑',
'Save and insert next' => '保存并插入下一个',
'Selected' => '已选中',
'Clone' => '复制',
'Delete' => '删除',
'You have no privileges to update this table.' => '您没有权限更新这个表。',
'E-mail' => '电子邮件',
'From' => '来自',
'Subject' => '主题',
'Attachments' => '附件',
'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
// data type descriptions
'Numbers' => '数字',
'Date and time' => '日期时间',
'Strings' => '字符串',
'Binary' => '二进制',
'Lists' => '列表',
'Editor' => '编辑器',
'E-mail' => '电子邮件',
'From' => '来自',
'Subject' => '主题',
'Send' => '发送',
'%d e-mail(s) have been sent.' => '%d 封邮件已发送。',
'Webserver file %s' => 'Web服务器文件 %s',
'File does not exist.' => '文件不存在。',
'%d in total' => '共计 %d',
'Permanent login' => '保持登录',
'Databases have been dropped.' => '已丢弃数据库。',
'Search data in tables' => '在表中搜索数据',
'schema' => '模式',
'Schema' => '模式',
'Alter schema' => '更改模式',
'Create schema' => '创建模式',
'Schema has been dropped.' => '已丢弃模式。',
'Schema has been created.' => '已创建模式。',
'Schema has been altered.' => '已更改模式。',
'Sequences' => '序列',
'Create sequence' => '创建序列',
'Alter sequence' => '更改序列',
'Sequence has been dropped.' => '已丢弃序列。',
'Sequence has been created.' => '已创建序列。',
'Sequence has been altered.' => '已更改序列。',
'User types' => '用户类型',
'Create type' => '创建类型',
'Alter type' => '更改类型',
'Type has been dropped.' => '已丢弃类型。',
'Type has been created.' => '已创建类型。',
'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
'last' => '最后',
'From server' => '来自服务器',
'System' => '系统',
'Select data' => '选择数据',
'Show structure' => '显示结构',
'empty' => '空',
'Network' => '网络',
'Geometry' => '几何图形',
'File exists.' => '文件已存在。',
'Attachments' => '附件',
'%d query(s) executed OK.' => '%d 条查询已成功执行。',
'Show only errors' => '仅显示错误',
'Last page' => '末页',
'Refresh' => '刷新',
'Invalid schema.' => '非法模式。',
'Please use one of the extensions %s.' => '请使用这些扩展中的一个:%s。',
'now' => '现在',
'ltr' => 'ltr',
'Tables have been copied.' => '表已复制。',
'Copy' => '复制',
'Permanent link' => '固定链接',
'Edit all' => '编辑全部',
'Relations' => '关联信息',
'Editor' => '编辑器',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$1.$3.$5',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => '现在',
'yes' => '是',
'no' => '否',
// general SQLite error in create, drop or rename database
'File exists.' => '文件已存在。',
'Please use one of the extensions %s.' => '请使用其中一个扩展:%s。',
// PostgreSQL and MS SQL schema support
'Alter schema' => '修改模式',
'Create schema' => '创建模式',
'Schema has been dropped.' => '已删除模式。',
'Schema has been created.' => '已创建模式。',
'Schema has been altered.' => '已修改模式。',
'Schema' => '模式',
'Invalid schema.' => '非法模式。',
// PostgreSQL sequences support
'Sequences' => '序列',
'Create sequence' => '创建序列',
'Sequence has been dropped.' => '已删除序列。',
'Sequence has been created.' => '已创建序列。',
'Sequence has been altered.' => '已修改序列。',
'Alter sequence' => '修改序列',
// PostgreSQL user types support
'User types' => '用户类型',
'Create type' => '创建类型',
'Type has been dropped.' => '已删除类型。',
'Type has been created.' => '已创建类型。',
'Alter type' => '修改类型',
);

View File

@@ -11,13 +11,17 @@ function adminer_object() {
$plugins = array(
// specify enabled plugins here
new AdminerDatabaseHide(array('information_schema')),
new AdminerDumpJson,
new AdminerDumpBz2,
new AdminerDumpZip,
new AdminerDumpXml,
new AdminerDumpAlter,
//~ new AdminerSqlLog("past-" . rtrim(`git describe --tags --abbrev=0`) . ".sql"),
//~ new AdminerEditCalendar("<script type='text/javascript' src='../externals/jquery-ui/jquery-1.4.4.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.core.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.widget.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.datepicker.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.mouse.js'></script>\n<script type='text/javascript' src='../externals/jquery-ui/ui/jquery.ui.slider.js'></script>\n<script type='text/javascript' src='../externals/jquery-timepicker/jquery-ui-timepicker-addon.js'></script>\n<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style type='text/css'>\n.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\n.ui-timepicker-div dl { text-align: left; }\n.ui-timepicker-div dl dt { height: 25px; }\n.ui-timepicker-div dl dd { margin: -25px 0 10px 65px; }\n.ui-timepicker-div td { font-size: 90%; }\n</style>\n", "../externals/jquery-ui/ui/i18n/jquery.ui.datepicker-%s.js"),
//~ new AdminerEditCalendar(script_src("../externals/jquery-ui/jquery-1.4.4.js") . script_src("../externals/jquery-ui/ui/jquery.ui.core.js") . script_src("../externals/jquery-ui/ui/jquery.ui.widget.js") . script_src("../externals/jquery-ui/ui/jquery.ui.datepicker.js") . script_src("../externals/jquery-ui/ui/jquery.ui.mouse.js") . script_src("../externals/jquery-ui/ui/jquery.ui.slider.js") . script_src("../externals/jquery-timepicker/jquery-ui-timepicker-addon.js") . "<link rel='stylesheet' href='../externals/jquery-ui/themes/base/jquery.ui.all.css'>\n<style>\n.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\n.ui-timepicker-div dl { text-align: left; }\n.ui-timepicker-div dl dt { height: 25px; }\n.ui-timepicker-div dl dd { margin: -25px 0 10px 65px; }\n.ui-timepicker-div td { font-size: 90%; }\n</style>\n", "../externals/jquery-ui/ui/i18n/jquery.ui.datepicker-%s.js"),
//~ new AdminerTinymce("../externals/tinymce/jscripts/tiny_mce/tiny_mce_dev.js"),
//~ new AdminerWymeditor(array("../externals/wymeditor/src/jquery/jquery.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.explorer.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.mozilla.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.opera.js", "../externals/wymeditor/src/wymeditor/jquery.wymeditor.safari.js")),
new AdminerFileUpload(""),
new AdminerJsonColumn,
new AdminerSlugify,
new AdminerTranslation,
new AdminerForeignSystem,

View File

@@ -1,25 +1,29 @@
<?php
page_header(lang('Privileges'));
echo '<p class="links"><a href="' . h(ME) . 'user=">' . lang('Create user') . "</a>";
$result = $connection->query("SELECT User, Host FROM mysql." . (DB == "" ? "user" : "db WHERE " . q(DB) . " LIKE Db") . " ORDER BY Host, User");
$grant = $result;
if (!$result) {
// list logged user, information_schema.USER_PRIVILEGES lists just the current user too
$result = $connection->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");
}
echo "<form action=''><p>\n";
hidden_fields_get();
echo "<input type='hidden' name='db' value='" . h(DB) . "'>\n";
echo ($grant ? "" : "<input type='hidden' name='grant' value=''>\n");
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th>&nbsp;</thead>\n";
echo "<thead><tr><th>" . lang('Username') . "<th>" . lang('Server') . "<th></thead>\n";
while ($row = $result->fetch_assoc()) {
echo '<tr' . odd() . '><td>' . h($row["User"]) . "<td>" . h($row["Host"]) . '<td><a href="' . h(ME . 'user=' . urlencode($row["User"]) . '&host=' . urlencode($row["Host"])) . '">' . lang('Edit') . "</a>\n";
}
if (!$grant || DB != "") {
echo "<tr" . odd() . "><td><input name='user'><td><input name='host' value='localhost'><td><input type='submit' value='" . lang('Edit') . "'>\n";
echo "<tr" . odd() . "><td><input name='user' autocapitalize='off'><td><input name='host' value='localhost' autocapitalize='off'><td><input type='submit' value='" . lang('Edit') . "'>\n";
}
echo "</table>\n";
echo "</form>\n";
echo '<p><a href="' . h(ME) . 'user=">' . lang('Create user') . "</a>";

View File

@@ -1,60 +1,57 @@
<?php
$PROCEDURE = $_GET["procedure"];
$PROCEDURE = ($_GET["name"] ? $_GET["name"] : $_GET["procedure"]);
$routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE");
$routine_languages = routine_languages();
$row = $_POST;
$row["fields"] = (array) $row["fields"];
$dropped = false;
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"] && !$_POST["down"]) {
$set = array();
$fields = (array) $_POST["fields"];
ksort($fields); // enforce fields order
foreach ($fields as $field) {
if ($field["field"] != "") {
$set[] = (ereg("^($inout)\$", $field["inout"]) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
}
}
$dropped = drop_create(
"DROP $routine " . idf_escape($PROCEDURE),
"CREATE $routine " . idf_escape(trim($_POST["name"])) . " (" . implode(", ", $set) . ")" . (isset($_GET["function"]) ? " RETURNS" . process_type($_POST["returns"], "CHARACTER SET") : "") . (in_array($_POST["language"], $routine_languages) ? " LANGUAGE $_POST[language]" : "") . rtrim("\n$_POST[definition]", ";") . ";",
if ($_POST && !process_fields($row["fields"]) && !$error) {
$orig = routine($_GET["procedure"], $routine);
$temp_name = "$row[name]_adminer_" . uniqid();
drop_create(
"DROP $routine " . routine_id($PROCEDURE, $orig),
create_routine($routine, $row),
"DROP $routine " . routine_id($row["name"], $row),
create_routine($routine, array("name" => $temp_name) + $row),
"DROP $routine " . routine_id($temp_name, $row),
substr(ME, 0, -1),
lang('Routine has been dropped.'),
lang('Routine has been altered.'),
lang('Routine has been created.'),
$PROCEDURE
$PROCEDURE,
$row["name"]
);
}
page_header(($PROCEDURE != "" ? (isset($_GET["function"]) ? lang('Alter function') : lang('Alter procedure')) . ": " . h($PROCEDURE) : (isset($_GET["function"]) ? lang('Create function') : lang('Create procedure'))), $error);
$collations = get_vals("SHOW CHARACTER SET");
sort($collations);
$row = array("fields" => array());
if ($_POST) {
$row = $_POST;
$row["fields"] = (array) $row["fields"];
process_fields($row["fields"]);
} elseif ($PROCEDURE != "") {
$row = routine($PROCEDURE, $routine);
if (!$_POST && $PROCEDURE != "") {
$row = routine($_GET["procedure"], $routine);
$row["name"] = $PROCEDURE;
}
$collations = get_vals("SHOW CHARACTER SET");
sort($collations);
$routine_languages = routine_languages();
?>
<form action="" method="post" id="form">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64">
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) : ""); ?>
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" data-maxlength="64" autocapitalize="off">
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) . "\n" : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<div class="scrollable">
<table cellspacing="0" class="nowrap">
<?php
edit_fields($row["fields"], $collations, $routine);
if (isset($_GET["function"])) {
echo "<tr><td>" . lang('Return type');
edit_type("returns", $row["returns"], $collations);
edit_type("returns", $row["returns"], $collations, array(), ($jush == "pgsql" ? array("void", "trigger") : array()));
}
?>
</table>
</div>
<p><?php textarea("definition", $row["definition"]); ?>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<?php if ($dropped) { ?><input type="hidden" name="dropped" value="1"><?php } ?>
<?php if ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"><?php echo confirm(lang('Drop %s?', $PROCEDURE)); ?><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -2,7 +2,7 @@
if (support("kill") && $_POST && !$error) {
$killed = 0;
foreach ((array) $_POST["kill"] as $val) {
if (queries("KILL " . (+$val))) {
if (kill_process($val)) {
$killed++;
}
}
@@ -13,35 +13,47 @@ page_header(lang('Process list'), $error);
?>
<form action="" method="post">
<table cellspacing="0" onclick="tableClick(event);" ondblclick="tableClick(event, true);" class="nowrap checkable">
<div class="scrollable">
<table cellspacing="0" class="nowrap checkable">
<?php
echo script("mixin(qsl('table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true)});");
// HTML valid because there is always at least one process
$i = -1;
foreach (process_list() as $i => $row) {
if (!$i) {
echo "<thead><tr lang='en'>" . (support("kill") ? "<th>&nbsp;" : "") . "<th>" . implode("<th>", array_keys($row)) . "</thead>\n";
echo "<thead><tr lang='en'>" . (support("kill") ? "<th>" : "");
foreach ($row as $key => $val) {
echo "<th>$key" . doc_link(array(
'sql' => "show-processlist.html#processlist_" . strtolower($key),
'pgsql' => "monitoring-stats.html#PG-STAT-ACTIVITY-VIEW",
'oracle' => "../b14237/dynviews_2088.htm",
));
}
echo "</thead>\n";
}
echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : "");
echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row[$jush == "sql" ? "Id" : "pid"], 0) : "");
foreach ($row as $key => $val) {
echo "<td>" . (
($jush == "sql" && $key == "Info" && ereg("Query|Killed", $row["Command"]) && $val != "") ||
($jush == "sql" && $key == "Info" && preg_match("~Query|Killed~", $row["Command"]) && $val != "") ||
($jush == "pgsql" && $key == "current_query" && $val != "<IDLE>") ||
($jush == "oracle" && $key == "sql_text" && $val != "")
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Edit') . '</a>'
: nbsp($val)
? "<code class='jush-$jush'>" . shorten_utf8($val, 100, "</code>") . ' <a href="' . h(ME . ($row["db"] != "" ? "db=" . urlencode($row["db"]) . "&" : "") . "sql=" . urlencode($val)) . '">' . lang('Clone') . '</a>'
: h($val)
);
}
echo "\n";
}
?>
</table>
<script type='text/javascript'>tableCheck();</script>
</div>
<p>
<?php
if (support("kill")) {
echo ($i + 1) . "/" . lang('%d in total', $connection->result("SELECT @@max_connections"));
echo ($i + 1) . "/" . lang('%d in total', max_connections());
echo "<p><input type='submit' value='" . lang('Kill') . "'>\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>
<?php echo script("tableCheck();"); ?>

View File

@@ -1,10 +1,9 @@
<?php
page_header(lang('Database schema'), "", array(), DB . ($_GET["ns"] ? ".$_GET[ns]" : ""));
page_header(lang('Database schema'), "", array(), h(DB . ($_GET["ns"] ? ".$_GET[ns]" : "")));
$table_pos = array();
$table_pos_js = array();
$name = "adminer_schema";
$SCHEMA = ($_GET["schema"] ? $_GET["schema"] : $_COOKIE[($_COOKIE["$name-" . DB] ? "$name-" . DB : $name)]); // $_COOKIE["adminer_schema"] was used before 3.2.0 //! ':' in table name
$SCHEMA = ($_GET["schema"] ? $_GET["schema"] : $_COOKIE["adminer_schema-" . str_replace(".", "_", DB)]); // $_COOKIE["adminer_schema"] was used before 3.2.0 //! ':' in table name
preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $SCHEMA, $matches, PREG_SET_ORDER);
foreach ($matches as $i => $match) {
$table_pos[$match[1]] = array($match[2], $match[3]);
@@ -16,23 +15,23 @@ $base_left = -1;
$schema = array(); // table => array("fields" => array(name => field), "pos" => array(top, left), "references" => array(table => array(left => array(source, target))))
$referenced = array(); // target_table => array(table => array(left => target_column))
$lefts = array(); // float => bool
foreach (table_status() as $table_status) {
if (!isset($table_status["Engine"])) { // view
foreach (table_status('', true) as $table => $table_status) {
if (is_view($table_status)) {
continue;
}
$pos = 0;
$schema[$table_status["Name"]]["fields"] = array();
foreach (fields($table_status["Name"]) as $name => $field) {
$schema[$table]["fields"] = array();
foreach (fields($table) as $name => $field) {
$pos += 1.25;
$field["pos"] = $pos;
$schema[$table_status["Name"]]["fields"][$name] = $field;
$schema[$table]["fields"][$name] = $field;
}
$schema[$table_status["Name"]]["pos"] = ($table_pos[$table_status["Name"]] ? $table_pos[$table_status["Name"]] : array($top, 0));
foreach ($adminer->foreignKeys($table_status["Name"]) as $val) {
$schema[$table]["pos"] = ($table_pos[$table] ? $table_pos[$table] : array($top, 0));
foreach ($adminer->foreignKeys($table) as $val) {
if (!$val["db"]) {
$left = $base_left;
if ($table_pos[$table_status["Name"]][1] || $table_pos[$val["table"]][1]) {
$left = min(floatval($table_pos[$table_status["Name"]][1]), floatval($table_pos[$val["table"]][1])) - 1;
if ($table_pos[$table][1] || $table_pos[$val["table"]][1]) {
$left = min(floatval($table_pos[$table][1]), floatval($table_pos[$val["table"]][1])) - 1;
} else {
$base_left -= .1;
}
@@ -40,32 +39,34 @@ foreach (table_status() as $table_status) {
// find free $left
$left -= .0001;
}
$schema[$table_status["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
$referenced[$val["table"]][$table_status["Name"]][(string) $left] = $val["target"];
$schema[$table]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
$referenced[$val["table"]][$table][(string) $left] = $val["target"];
$lefts[(string) $left] = true;
}
}
$top = max($top, $schema[$table_status["Name"]]["pos"][0] + 2.5 + $pos);
$top = max($top, $schema[$table]["pos"][0] + 2.5 + $pos);
}
?>
<div id="schema" style="height: <?php echo $top; ?>em;" onselectstart="return false;">
<script type="text/javascript">
<div id="schema" style="height: <?php echo $top; ?>em;">
<script<?php echo nonce(); ?>>
qs('#schema').onselectstart = function () { return false; };
var tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
var em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
var em = qs('#schema').offsetHeight / <?php echo $top; ?>;
document.onmousemove = schemaMousemove;
document.onmouseup = function (ev) {
schemaMouseup(ev, '<?php echo js_escape(DB); ?>');
};
document.onmouseup = partialArg(schemaMouseup, '<?php echo js_escape(DB); ?>');
</script>
<?php
foreach ($schema as $name => $table) {
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;' onmousedown='schemaMousedown(this, event);'>";
echo "<div class='table' style='top: " . $table["pos"][0] . "em; left: " . $table["pos"][1] . "em;'>";
echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
echo script("qsl('div').onmousedown = schemaMousedown;");
foreach ($table["fields"] as $field) {
$val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
echo "<br>" . ($field["primary"] ? "<i>$val</i>" : $val);
}
foreach ((array) $table["references"] as $target_name => $refs) {
foreach ($refs as $left => $ref) {
$left1 = $left - $table_pos[$name][1];
@@ -75,6 +76,7 @@ foreach ($schema as $name => $table) {
}
}
}
foreach ((array) $referenced[$name] as $target_name => $refs) {
foreach ($refs as $left => $columns) {
$left1 = $left - $table_pos[$name][1];
@@ -84,8 +86,10 @@ foreach ($schema as $name => $table) {
}
}
}
echo "\n</div>\n";
}
foreach ($schema as $name => $table) {
foreach ((array) $table["references"] as $target_name => $refs) {
foreach ($refs as $left => $ref) {
@@ -103,4 +107,4 @@ foreach ($schema as $name => $table) {
}
?>
</div>
<p><a href="<?php echo h(ME . "schema=" . urlencode($SCHEMA)); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a>
<p class="links"><a href="<?php echo h(ME . "schema=" . urlencode($SCHEMA)); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a>

View File

@@ -1,10 +1,12 @@
<?php
$row = $_POST;
if ($_POST && !$error) {
$link = preg_replace('~ns=[^&]*&~', '', ME) . "ns=";
if ($_POST["drop"]) {
query_redirect("DROP SCHEMA " . idf_escape($_GET["ns"]), $link, lang('Schema has been dropped.'));
} else {
$name = trim($_POST["name"]);
$name = trim($row["name"]);
$link .= urlencode($name);
if ($_GET["ns"] == "") {
query_redirect("CREATE SCHEMA " . idf_escape($name), $link, lang('Schema has been created.'));
@@ -18,19 +20,18 @@ if ($_POST && !$error) {
page_header($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema'), $error);
$row = $_POST;
if (!$row) {
$row = array("name" => $_GET["ns"]);
$row["name"] = $_GET["ns"];
}
?>
<form action="" method="post">
<p><input id="name" name="name" value="<?php echo h($row["name"]); ?>">
<script type='text/javascript'>document.getElementById('name').focus();</script>
<p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php echo script("focus(qs('#name'));"); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php
if ($_GET["ns"] != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm(lang('Drop %s?', $_GET["ns"])) . "\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">

View File

@@ -3,17 +3,16 @@ header("Content-Type: text/javascript; charset=utf-8");
if ($_GET["script"] == "db") {
$sums = array("Data_length" => 0, "Index_length" => 0, "Data_free" => 0);
foreach (table_status() as $table_status) {
$id = js_escape($table_status["Name"]);
json_row("Comment-$id", nbsp($table_status["Comment"]));
foreach (table_status() as $name => $table_status) {
json_row("Comment-$name", h($table_status["Comment"]));
if (!is_view($table_status)) {
foreach (array("Engine", "Collation") as $key) {
json_row("$key-$id", nbsp($table_status[$key]));
json_row("$key-$name", h($table_status[$key]));
}
foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
if ($table_status[$key] != "") {
$val = number_format($table_status[$key], 0, '.', lang(','));
json_row("$key-$id", ($key == "Rows" && $val && $table_status["Engine"] == ($sql == "pgsql" ? "table" : "InnoDB")
$val = format_number($table_status[$key]);
json_row("$key-$name", ($key == "Rows" && $val && $table_status["Engine"] == ($sql == "pgsql" ? "table" : "InnoDB")
? "~ $val"
: $val
));
@@ -22,22 +21,23 @@ if ($_GET["script"] == "db") {
$sums[$key] += ($table_status["Engine"] != "InnoDB" || $key != "Data_free" ? $table_status[$key] : 0);
}
} elseif (array_key_exists($key, $table_status)) {
json_row("$key-$id");
json_row("$key-$name");
}
}
}
}
foreach ($sums as $key => $val) {
json_row("sum-$key", number_format($val, 0, '.', lang(',')));
json_row("sum-$key", format_number($val));
}
json_row("");
} elseif ($_GET["script"] == "kill") {
$connection->query("KILL " . (+$_POST["kill"]));
$connection->query("KILL " . number($_POST["kill"]));
} else { // connect
foreach (count_tables($adminer->databases()) as $db => $val) {
json_row("tables-" . js_escape($db), $val);
json_row("tables-$db", $val);
json_row("size-$db", db_size($db));
}
json_row("");
}

View File

@@ -1,14 +1,10 @@
<?php
$TABLE = $_GET["select"];
$table_status = table_status($TABLE);
$table_status = table_status1($TABLE);
$indexes = indexes($TABLE);
$fields = fields($TABLE);
$foreign_keys = column_foreign_keys($TABLE);
$oid = "";
if ($table_status["Oid"] == "t") {
$oid = ($jush == "sqlite" ? "rowid" : "oid");
$indexes[] = array("type" => "PRIMARY", "columns" => array($oid));
}
$oid = $table_status["Oid"];
parse_str($_COOKIE["adminer_import"], $adminer_import);
$rights = array(); // privilege => 0
@@ -17,7 +13,7 @@ $text_length = null;
foreach ($fields as $key => $field) {
$name = $adminer->fieldName($field);
if (isset($field["privileges"]["select"]) && $name != "") {
$columns[$key] = html_entity_decode(strip_tags($name));
$columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
if (is_shortable($field)) {
$text_length = $adminer->selectLengthProcess();
}
@@ -30,52 +26,59 @@ $is_group = count($group) < count($select);
$where = $adminer->selectSearchProcess($fields, $indexes);
$order = $adminer->selectOrderProcess($fields, $indexes);
$limit = $adminer->selectLimitProcess();
$from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : ""));
if ($jush == "sql") {
foreach ($columns as $key => $val) {
$as = convert_field($fields[$key]);
if ($as) {
$from .= ", $as AS " . idf_escape($key);
}
}
}
$from .= "\nFROM " . table($TABLE);
$group_by = ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
if ($_GET["val"] && is_ajax()) {
header("Content-Type: text/plain; charset=utf-8");
foreach ($_GET["val"] as $unique_idf => $row) {
$as = convert_field($fields[key($row)]);
echo $connection->result("SELECT" . limit(($as ? $as : idf_escape(key($row))) . " FROM " . table($TABLE), " WHERE " . where_check($unique_idf, $fields) . ($where ? " AND " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : ""), 1));
$select = array($as ? $as : idf_escape(key($row)));
$where[] = where_check($unique_idf, $fields);
$return = $driver->select($TABLE, $select, $where, $select);
if ($return) {
echo reset($return->fetch_row());
}
}
exit;
}
$primary = $unselected = null;
foreach ($indexes as $index) {
if ($index["type"] == "PRIMARY") {
$primary = array_flip($index["columns"]);
$unselected = ($select ? $primary : array());
foreach ($unselected as $key => $val) {
if (in_array(idf_escape($key), $select)) {
unset($unselected[$key]);
}
}
break;
}
}
if ($oid && !$primary) {
$primary = $unselected = array($oid => 0);
$indexes[] = array("type" => "PRIMARY", "columns" => array($oid));
}
if ($_POST && !$error) {
$where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")";
$primary = $unselected = null;
foreach ($indexes as $index) {
if ($index["type"] == "PRIMARY") {
$primary = array_flip($index["columns"]);
$unselected = ($select ? $primary : array());
break;
}
}
foreach ((array) $unselected as $key => $val) {
if (in_array(idf_escape($key), $select)) {
unset($unselected[$key]);
$where_check = $where;
if (!$_POST["all"] && is_array($_POST["check"])) {
$checks = array();
foreach ($_POST["check"] as $check) {
$checks[] = where_check($check, $fields);
}
$where_check[] = "((" . implode(") OR (", $checks) . "))";
}
$where_check = ($where_check ? "\nWHERE " . implode(" AND ", $where_check) : "");
if ($_POST["export"]) {
cookie("adminer_import", "output=" . urlencode($_POST["output"]) . "&format=" . urlencode($_POST["format"]));
dump_headers($TABLE);
$adminer->dumpTable($TABLE, "");
if (!is_array($_POST["check"]) || $unselected === array()) {
$where2 = $where;
if (is_array($_POST["check"])) {
$where2[] = "($where_check)";
}
$query = "SELECT $from" . ($where2 ? "\nWHERE " . implode(" AND ", $where2) : "") . $group_by;
$from = ($select ? implode(", ", $select) : "*")
. convert_fields($columns, $fields, $select)
. "\nFROM " . table($TABLE);
$group_by = ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
if (!is_array($_POST["check"]) || $primary) {
$query = "SELECT $from$where_check$group_by";
} else {
$union = array();
foreach ($_POST["check"] as $val) {
@@ -87,42 +90,44 @@ if ($_POST && !$error) {
$adminer->dumpData($TABLE, "table", $query);
exit;
}
if (!$adminer->selectEmailProcess($where, $foreign_keys)) {
if ($_POST["save"] || $_POST["delete"]) { // edit
$result = true;
$affected = 0;
$query = table($TABLE);
$set = array();
if (!$_POST["delete"]) {
foreach ($columns as $name => $val) { //! should check also for edit or insert privileges
$val = process_input($fields[$name]);
if ($val !== null) {
if ($_POST["clone"]) {
$set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name));
} elseif ($val !== false) {
$set[] = idf_escape($name) . " = $val";
}
if ($val !== null && ($_POST["clone"] || $val !== false)) {
$set[idf_escape($name)] = ($val !== false ? $val : idf_escape($name));
}
}
$query .= ($_POST["clone"] ? " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . table($TABLE) : " SET\n" . implode(",\n", $set));
}
if ($_POST["delete"] || $set) {
$command = "UPDATE";
if ($_POST["delete"]) {
$command = "DELETE";
$query = "FROM $query";
}
if ($_POST["clone"]) {
$command = "INSERT";
$query = "INTO $query";
$query = "INTO " . table($TABLE) . " (" . implode(", ", array_keys($set)) . ")\nSELECT " . implode(", ", $set) . "\nFROM " . table($TABLE);
}
if ($_POST["all"] || ($unselected === array() && $_POST["check"]) || $is_group) {
$result = queries("$command $query" . ($_POST["all"] ? ($where ? "\nWHERE " . implode(" AND ", $where) : "") : "\nWHERE $where_check"));
if ($_POST["all"] || ($primary && is_array($_POST["check"])) || $is_group) {
$result = ($_POST["delete"]
? $driver->delete($TABLE, $where_check)
: ($_POST["clone"]
? queries("INSERT $query$where_check")
: $driver->update($TABLE, $set, $where_check)
)
);
$affected = $connection->affected_rows;
} else {
foreach ((array) $_POST["check"] as $val) {
// where is not unique so OR can't be used
$result = queries($command . limit1($query, "\nWHERE " . where_check($val, $fields)));
$where2 = "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields);
$result = ($_POST["delete"]
? $driver->delete($TABLE, $where2, 1)
: ($_POST["clone"]
? queries("INSERT" . limit1($TABLE, $query, $where2))
: $driver->update($TABLE, $set, $where2, 1)
)
);
if (!$result) {
break;
}
@@ -137,8 +142,13 @@ if ($_POST && !$error) {
$message = lang('Item%s has been inserted.', " $last_id");
}
}
queries_redirect(remove_from_uri("page"), $message, $result);
//! display edit page in case of an error
queries_redirect(remove_from_uri($_POST["all"] && $_POST["delete"] ? "page" : ""), $message, $result);
if (!$_POST["delete"]) {
edit_form($TABLE, $fields, (array) $_POST["fields"], !$_POST["clone"]);
page_footer();
exit;
}
} elseif (!$_POST["import"]) { // modify
if (!$_POST["val"]) {
$error = lang('Ctrl+click on a value to modify it.');
@@ -149,11 +159,15 @@ if ($_POST && !$error) {
$set = array();
foreach ($row as $key => $val) {
$key = bracket_escape($key, 1); // 1 - back
$set[] = idf_escape($key) . " = " . (ereg('char|text', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
$set[idf_escape($key)] = (preg_match('~char|text~', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
}
$query = table($TABLE) . " SET " . implode(", ", $set);
$where2 = " WHERE " . where_check($unique_idf, $fields) . ($where ? " AND " . implode(" AND ", $where) : "");
$result = queries("UPDATE" . ($is_group ? " $query$where2" : limit1($query, $where2))); // can change row on a different page without unique key
$result = $driver->update(
$TABLE,
$set,
" WHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($unique_idf, $fields),
!$is_group && !$primary,
" "
);
if (!$result) {
break;
}
@@ -161,15 +175,20 @@ if ($_POST && !$error) {
}
queries_redirect(remove_from_uri(), lang('%d item(s) have been affected.', $affected), $result);
}
} elseif (is_string($file = get_file("csv_file", true))) {
//! character set
} elseif (!is_string($file = get_file("csv_file", true))) {
$error = upload_error($file);
} elseif (!preg_match('~~u', $file)) {
$error = lang('File must be in UTF-8 encoding.');
} else {
cookie("adminer_import", "output=" . urlencode($adminer_import["output"]) . "&format=" . urlencode($_POST["separator"]));
$result = true;
$cols = array_keys($fields);
preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~', $file, $matches);
preg_match_all('~(?>"[^"]*"|[^"\r\n]+)+~', $file, $matches);
$affected = count($matches[0]);
begin();
$driver->begin();
$separator = ($_POST["separator"] == "csv" ? "," : ($_POST["separator"] == "tsv" ? "\t" : ";"));
$rows = array();
foreach ($matches[0] as $key => $val) {
preg_match_all("~((?>\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
@@ -181,36 +200,34 @@ if ($_POST && !$error) {
foreach ($matches2[1] as $i => $col) {
$set[idf_escape($cols[$i])] = ($col == "" && $fields[$cols[$i]]["null"] ? "NULL" : q(str_replace('""', '"', preg_replace('~^"|"$~', '', $col))));
}
$result = insert_update($TABLE, $set, $primary);
if (!$result) {
break;
}
$rows[] = $set;
}
}
$result = (!$rows || $driver->insertUpdate($TABLE, $rows, $primary));
if ($result) {
queries("COMMIT");
$result = $driver->commit();
}
queries_redirect(remove_from_uri("page"), lang('%d row(s) have been imported.', $affected), $result);
queries("ROLLBACK"); // after queries_redirect() to not overwrite error
} else {
$error = upload_error($file);
$driver->rollback(); // after queries_redirect() to not overwrite error
}
}
}
$table_name = $adminer->tableName($table_status);
if (is_ajax()) {
// needs to send headers
page_headers();
ob_start();
} else {
page_header(lang('Select') . ": $table_name", $error);
}
page_header(lang('Select') . ": $table_name", $error);
$set = null;
if (isset($rights["insert"])) {
if (isset($rights["insert"]) || !support("table")) {
$set = "";
foreach ((array) $_GET["where"] as $val) {
if (count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
|| (!$val["op"] && !ereg('[_%]', $val["val"])) // LIKE in Editor
if ($foreign_keys[$val["col"]] && count($foreign_keys[$val["col"]]) == 1 && ($val["op"] == "="
|| (!$val["op"] && !preg_match('~[_%]~', $val["val"])) // LIKE in Editor
)) {
$set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
}
@@ -218,7 +235,7 @@ if (isset($rights["insert"])) {
}
$adminer->selectLinks($table_status, $set);
if (!$columns) {
if (!$columns && support("table")) {
echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "." : ": " . error()) . "\n";
} else {
echo "<form action='' id='form'>\n";
@@ -234,30 +251,42 @@ if (!$columns) {
$adminer->selectLengthPrint($text_length);
$adminer->selectActionPrint($indexes);
echo "</form>\n";
$page = $_GET["page"];
if ($page == "last") {
$found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
$found_rows = $connection->result(count_rows($TABLE, $where, $is_group, $group));
$page = floor(max(0, $found_rows - 1) / $limit);
}
$query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
if (!$query) {
$query = "SELECT" . limit(
(+$limit && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . $from,
($where ? "\nWHERE " . implode(" AND ", $where) : "") . $group_by,
($limit != "" ? +$limit : null),
($page ? $limit * $page : 0),
"\n"
);
$select2 = $select;
$group2 = $group;
if (!$select2) {
$select2[] = "*";
$convert_fields = convert_fields($columns, $fields, $select);
if ($convert_fields) {
$select2[] = substr($convert_fields, 2);
}
}
echo $adminer->selectQuery($query);
$result = $connection->query($query);
foreach ($select as $key => $val) {
$field = $fields[idf_unescape($val)];
if ($field && ($as = convert_field($field))) {
$select2[$key] = "$as AS $val";
}
}
if (!$is_group && $unselected) {
foreach ($unselected as $key => $val) {
$select2[] = idf_escape($key);
if ($group2) {
$group2[] = idf_escape($key);
}
}
}
$result = $driver->select($TABLE, $select2, $where, $group2, $order, $limit, $page, true);
if (!$result) {
echo "<p class='error'>" . error() . "\n";
} else {
if ($jush == "mssql") {
if ($jush == "mssql" && $page) {
$result->seek($limit * $page);
}
$email_fields = array();
@@ -269,43 +298,47 @@ if (!$columns) {
}
$rows[] = $row;
}
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
if ($_GET["page"] != "last") {
$found_rows = (+$limit && $group && $is_group
? ($jush == "sql" ? $connection->result(" SELECT FOUND_ROWS()") : $connection->result("SELECT COUNT(*) FROM ($query) x")) // space to allow mysql.trace_mode
: count($rows)
);
if ($_GET["page"] != "last" && $limit != "" && $group && $is_group && $jush == "sql") {
$found_rows = $connection->result(" SELECT FOUND_ROWS()"); // space to allow mysql.trace_mode
}
if (!$rows) {
echo "<p class='message'>" . lang('No rows.') . "\n";
} else {
$backward_keys = $adminer->backwardKeys($TABLE, $table_name);
echo "<table id='table' cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);' onkeydown='return editingKeydown(event);'>\n";
echo "<thead><tr>" . (!$group && $select ? "" : "<td><input type='checkbox' id='all-page' onclick='formCheck(this, /check/);'> <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('edit') . "</a>");
echo "<div class='scrollable'>";
echo "<table id='table' cellspacing='0' class='nowrap checkable'>";
echo script("mixin(qs('#table'), {onclick: tableClick, ondblclick: partialArg(tableClick, true), onkeydown: editingKeydown});");
echo "<thead><tr>" . (!$group && $select
? ""
: "<td><input type='checkbox' id='all-page' class='jsonly'>" . script("qs('#all-page').onclick = partial(formCheck, /check/);", "")
. " <a href='" . h($_GET["modify"] ? remove_from_uri("modify") : $_SERVER["REQUEST_URI"] . "&modify=1") . "'>" . lang('Modify') . "</a>");
$names = array();
$functions = array();
reset($select);
$rank = 1;
foreach ($rows[0] as $key => $val) {
if ($key != $oid) {
if (!isset($unselected[$key])) {
$val = $_GET["columns"][key($select)];
$field = $fields[$select ? ($val ? $val["col"] : current($select)) : $key];
$name = ($field ? $adminer->fieldName($field, $rank) : "*");
$name = ($field ? $adminer->fieldName($field, $rank) : ($val["fun"] ? "*" : $key));
if ($name != "") {
$rank++;
$names[$key] = $name;
$column = idf_escape($key);
$href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
$desc = "&desc%5B0%5D=1";
echo '<th onmouseover="columnMouse(this);" onmouseout="columnMouse(this, \' hidden\');">';
echo "<th>" . script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});", "");
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
echo (!$select || $val ? apply_sql_function($val["fun"], $name) : h(current($select))) . "</a>"; //! columns looking like functions
echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
echo "<span class='column hidden'>";
echo "<a href='" . h($href . $desc) . "' title='" . lang('descending') . "' class='text'> ↓</a>";
if (!$val["fun"]) {
echo '<a href="#fieldset-search" onclick="selectSearch(\'' . h(js_escape($key)) . '\'); return false;" title="' . lang('Search') . '" class="text jsonly"> =</a>';
echo '<a href="#fieldset-search" title="' . lang('Search') . '" class="text jsonly"> =</a>';
echo script("qsl('a').onclick = partial(selectSearch, '" . js_escape($key) . "');");
}
echo "</span>";
}
@@ -313,6 +346,7 @@ if (!$columns) {
next($select);
}
}
$lengths = array();
if ($_GET["modify"]) {
foreach ($rows as $row) {
@@ -321,164 +355,230 @@ if (!$columns) {
}
}
}
echo ($backward_keys ? "<th>" . lang('Relations') : "") . "</thead>\n";
if (is_ajax()) {
if ($limit % 2 == 1 && $page % 2 == 1) {
odd();
}
ob_end_clean();
}
foreach ($adminer->rowDescriptions($rows, $foreign_keys) as $n => $row) {
$unique_array = unique_array($rows[$n], $indexes);
if (!$unique_array) {
$unique_array = array();
foreach ($rows[$n] as $key => $val) {
if (!preg_match('~^(COUNT\((\*|(DISTINCT )?`(?:[^`]|``)+`)\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\(`(?:[^`]|``)+`\))$~', $key)) { //! columns looking like functions
$unique_array[$key] = $val;
}
}
}
$unique_idf = "";
foreach ($unique_array as $key => $val) {
if (($jush == "sql" || $jush == "pgsql") && preg_match('~char|text|enum|set~', $fields[$key]["type"]) && strlen($val) > 64) {
$key = (strpos($key, '(') ? $key : idf_escape($key)); //! columns looking like functions
$key = "MD5(" . ($jush != 'sql' || preg_match("~^utf8~", $fields[$key]["collation"]) ? $key : "CONVERT($key USING " . charset($connection) . ")") . ")";
$val = md5($val);
}
$unique_idf .= "&" . ($val !== null ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
}
echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>" . checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]), "", "this.form['all'].checked = false; formUncheck('all-page');") . ($is_group || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "'>" . lang('edit') . "</a>"));
echo "<tr" . odd() . ">" . (!$group && $select ? "" : "<td>"
. checkbox("check[]", substr($unique_idf, 1), in_array(substr($unique_idf, 1), (array) $_POST["check"]))
. ($is_group || information_schema(DB) ? "" : " <a href='" . h(ME . "edit=" . urlencode($TABLE) . $unique_idf) . "' class='edit'>" . lang('edit') . "</a>")
);
foreach ($row as $key => $val) {
if (isset($names[$key])) {
$field = $fields[$key];
$val = $driver->value($val, $field);
if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
$email_fields[$key] = (is_mail($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
}
$link = "";
$val = $adminer->editVal($val, $field);
if ($val !== null) {
if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") {
$link = ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf;
}
if ($val === "") { // === - may be int
$val = "&nbsp;";
} elseif ($text_length != "" && is_shortable($field)) {
$val = shorten_utf8($val, max(0, +$text_length)); // usage of LEFT() would reduce traffic but complicate query - expected average speedup: .001 s VS .01 s on local network
} else {
$val = h($val);
}
if (!$link) { // link related items
foreach ((array) $foreign_keys[$key] as $foreign_key) {
if (count($foreign_keys[$key]) == 1 || end($foreign_key["source"]) == $key) {
$link = "";
foreach ($foreign_key["source"] as $i => $source) {
$link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
}
$link = ($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link; // InnoDB supports non-UNIQUE keys
if (count($foreign_key["source"]) == 1) {
break;
}
if (preg_match('~blob|bytea|raw|file~', $field["type"]) && $val != "") {
$link = ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf;
}
if (!$link && $val !== null) { // link related items
foreach ((array) $foreign_keys[$key] as $foreign_key) {
if (count($foreign_keys[$key]) == 1 || end($foreign_key["source"]) == $key) {
$link = "";
foreach ($foreign_key["source"] as $i => $source) {
$link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
}
$link = ($foreign_key["db"] != "" ? preg_replace('~([?&]db=)[^&]+~', '\1' . urlencode($foreign_key["db"]), ME) : ME) . 'select=' . urlencode($foreign_key["table"]) . $link; // InnoDB supports non-UNIQUE keys
if ($foreign_key["ns"]) {
$link = preg_replace('~([?&]ns=)[^&]+~', '\1' . urlencode($foreign_key["ns"]), $link);
}
if (count($foreign_key["source"]) == 1) {
break;
}
}
}
if ($key == "COUNT(*)") { //! columns looking like functions
$link = ME . "select=" . urlencode($TABLE);
$i = 0;
foreach ((array) $_GET["where"] as $v) {
if (!array_key_exists($v["col"], $unique_array)) {
$link .= where_link($i++, $v["col"], $v["val"], $v["op"]);
}
}
foreach ($unique_array as $k => $v) {
$link .= where_link($i++, $k, $v);
}
if ($key == "COUNT(*)") { //! columns looking like functions
$link = ME . "select=" . urlencode($TABLE);
$i = 0;
foreach ((array) $_GET["where"] as $v) {
if (!array_key_exists($v["col"], $unique_array)) {
$link .= where_link($i++, $v["col"], $v["val"], $v["op"]);
}
}
}
if (!$link && ($link = $adminer->selectLink($row[$key], $field)) === null) {
if (is_mail($row[$key])) {
$link = "mailto:$row[$key]";
}
if ($protocol = is_url($row[$key])) {
$link = ($protocol == "http" && $HTTPS
? $row[$key] // HTTP links from HTTPS pages don't receive Referer automatically
: "$protocol://www.adminer.org/redirect/?url=" . urlencode($row[$key]) // intermediate page to hide Referer, may be changed to rel="noreferrer" in HTML5
);
foreach ($unique_array as $k => $v) {
$link .= where_link($i++, $k, $v);
}
}
$val = select_value($val, $link, $field, $text_length);
$id = h("val[$unique_idf][" . bracket_escape($key) . "]");
$value = $_POST["val"][$unique_idf][bracket_escape($key)];
$h_value = h($value !== null ? $value : $row[$key]);
$long = strpos($val, "<i>...</i>");
$editable = is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
$text = ereg('text|lob', $field["type"]);
echo (($_GET["modify"] && $editable) || $value !== null
? "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>")
: "<td id='$id' onclick=\"selectClick(this, event, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");\">" . $adminer->selectVal($val, $link, $field)
);
$editable = !is_array($row[$key]) && is_utf8($val) && $rows[$n][$key] == $row[$key] && !$functions[$key];
$text = preg_match('~text|lob~', $field["type"]);
if (($_GET["modify"] && $editable) || $value !== null) {
$h_value = h($value !== null ? $value : $row[$key]);
echo "<td>" . ($text ? "<textarea name='$id' cols='30' rows='" . (substr_count($row[$key], "\n") + 1) . "'>$h_value</textarea>" : "<input name='$id' value='$h_value' size='$lengths[$key]'>");
} else {
$long = strpos($val, "<i>…</i>");
echo "<td id='$id' data-text='" . ($long ? 2 : ($text ? 1 : 0)) . "'"
. ($editable ? "" : " data-warning='" . h(lang('Use edit link to modify this value.')) . "'")
. ">$val</td>"
;
}
}
}
if ($backward_keys) {
echo "<td>";
}
$adminer->backwardKeysPrint($backward_keys, $rows[$n]);
echo "</tr>\n"; // close to allow white-space: pre
}
if (is_ajax()) {
exit;
}
echo "</table>\n";
echo (!$group && $select ? "" : "<script type='text/javascript'>tableCheck();</script>\n");
echo "</div>\n";
}
if (($rows || $page) && !is_ajax()) {
$exact_count = true;
if ($_GET["page"] != "last" && +$limit && !$is_group && ($found_rows >= $limit || $page)) {
$found_rows = found_rows($table_status, $where);
if ($found_rows < max(1e4, 2 * ($page + 1) * $limit)) {
// slow with big tables
$found_rows = reset(slow_query("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : "")));
} else {
$exact_count = false;
if (!is_ajax()) {
if ($rows || $page) {
$exact_count = true;
if ($_GET["page"] != "last") {
if ($limit == "" || (count($rows) < $limit && ($rows || !$page))) {
$found_rows = ($page ? $page * $limit : 0) + count($rows);
} elseif ($jush != "sql" || !$is_group) {
$found_rows = ($is_group ? false : found_rows($table_status, $where));
if ($found_rows < max(1e4, 2 * ($page + 1) * $limit)) {
// slow with big tables
$found_rows = reset(slow_query(count_rows($TABLE, $where, $is_group, $group)));
} else {
$exact_count = false;
}
}
}
$pagination = ($limit != "" && ($found_rows === false || $found_rows > $limit || $page));
if ($pagination) {
echo (($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit
? '<p><a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" class="loadmore">' . lang('Load more data') . '</a>'
. script("qsl('a').onclick = partial(selectLoadMore, " . (+$limit) . ", '" . lang('Loading') . "…');", "")
: ''
);
echo "\n";
}
}
echo "<p class='pages'>";
if (+$limit && ($found_rows === false || $found_rows > $limit)) {
// display first, previous 4, next 4 and last page
$max_page = ($found_rows === false
? $page + (count($rows) >= $limit ? 2 : 1)
: floor(($found_rows - 1) / $limit)
);
echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "'), event); return false;\">" . lang('Page') . "</a>:";
echo pagination(0, $page) . ($page > 5 ? " ..." : "");
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
echo pagination($i, $page);
}
echo ($page + 5 < $max_page ? " ..." : "") . ($exact_count && $found_rows !== false ? pagination($max_page, $page) : ' <a href="' . h(remove_from_uri("page") . "&page=last") . '">' . lang('last') . "</a>");
}
echo ($found_rows !== false ? " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ")" : "");
echo (+$limit && ($found_rows === false ? count($rows) + 1 : $found_rows - $page * $limit) > $limit ? ' <a href="' . h(remove_from_uri("page") . "&page=" . ($page + 1)) . '" onclick="return !selectLoadMore(this, ' . (+$limit) . ', \'' . lang('Loading') . '\');">' . lang('Load more data') . '</a>' : '');
echo " " . checkbox("all", 1, 0, lang('whole result')) . "\n";
if ($adminer->selectCommandPrint()) {
?>
<fieldset><legend><?php echo lang('Edit'); ?></legend><div>
<input type="submit" value="<?php echo lang('Save'); ?>"<?php echo ($_GET["modify"] ? '' : ' title="' . lang('Ctrl+click on a value to modify it.') . '" class="jsonly"'); ?>>
echo "<div class='footer'><div>\n";
if ($rows || $page) {
if ($pagination) {
// display first, previous 4, next 4 and last page
$max_page = ($found_rows === false
? $page + (count($rows) >= $limit ? 2 : 1)
: floor(($found_rows - 1) / $limit)
);
echo "<fieldset>";
if ($jush != "simpledb") {
echo "<legend><a href='" . h(remove_from_uri("page")) . "'>" . lang('Page') . "</a></legend>";
echo script("qsl('a').onclick = function () { pageClick(this.href, +prompt('" . lang('Page') . "', '" . ($page + 1) . "')); return false; };");
echo pagination(0, $page) . ($page > 5 ? "" : "");
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
echo pagination($i, $page);
}
if ($max_page > 0) {
echo ($page + 5 < $max_page ? "" : "");
echo ($exact_count && $found_rows !== false
? pagination($max_page, $page)
: " <a href='" . h(remove_from_uri("page") . "&page=last") . "' title='~$max_page'>" . lang('last') . "</a>"
);
}
} else {
echo "<legend>" . lang('Page') . "</legend>";
echo pagination(0, $page) . ($page > 1 ? "" : "");
echo ($page ? pagination($page, $page) : "");
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? "" : "") : "");
}
echo "</fieldset>\n";
}
echo "<fieldset>";
echo "<legend>" . lang('Whole result') . "</legend>";
$display_rows = ($exact_count ? "" : "~ ") . $found_rows;
echo checkbox("all", 1, 0, ($found_rows !== false ? ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) : ""), "var checked = formChecked(this, /check/); selectCount('selected', this.checked ? '$display_rows' : checked); selectCount('selected2', this.checked || !checked ? '$display_rows' : checked);") . "\n";
echo "</fieldset>\n";
if ($adminer->selectCommandPrint()) {
?>
<fieldset<?php echo ($_GET["modify"] ? '' : ' class="jsonly"'); ?>><legend><?php echo lang('Modify'); ?></legend><div>
<input type="submit" value="<?php echo lang('Save'); ?>"<?php echo ($_GET["modify"] ? '' : ' title="' . lang('Ctrl+click on a value to modify it.') . '"'); ?>>
</div></fieldset>
<fieldset><legend><?php echo lang('Selected'); ?> <span id="selected"></span></legend><div>
<input type="submit" name="edit" value="<?php echo lang('Edit'); ?>">
<input type="submit" name="clone" value="<?php echo lang('Clone'); ?>">
<input type="submit" name="delete" value="<?php echo lang('Delete'); ?>" onclick="return confirm('<?php echo lang('Are you sure?'); ?> (' + (this.form['all'].checked ? <?php echo $found_rows; ?> : formChecked(this, /check/)) + ')');">
<input type="submit" name="delete" value="<?php echo lang('Delete'); ?>"><?php echo confirm(); ?>
</div></fieldset>
<?php
}
$format = $adminer->dumpFormat();
foreach ((array) $_GET["columns"] as $column) {
if ($column["fun"]) {
unset($format['sql']);
break;
}
}
if ($format) {
print_fieldset("export", lang('Export') . " <span id='selected2'></span>");
$output = $adminer->dumpOutput();
echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
echo html_select("format", $format, $adminer_import["format"]);
echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
echo "</div></fieldset>\n";
}
$adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
}
$format = $adminer->dumpFormat();
if ($format) {
print_fieldset("export", lang('Export'));
$output = $adminer->dumpOutput();
echo ($output ? html_select("output", $output, $adminer_import["output"]) . " " : "");
echo html_select("format", $format, $adminer_import["format"]);
echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
echo "</div></fieldset>\n";
echo "</div></div>\n";
if ($adminer->selectImportPrint()) {
echo "<div>";
echo "<a href='#import'>" . lang('Import') . "</a>";
echo script("qsl('a').onclick = partial(toggle, 'import');", "");
echo "<span id='import' class='hidden'>: ";
echo "<input type='file' name='csv_file'> ";
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
echo "</span>";
echo "</div>";
}
echo "<input type='hidden' name='token' value='$token'>\n";
echo "</form>\n";
echo (!$group && $select ? "" : script("tableCheck();"));
}
if ($adminer->selectImportPrint()) {
print_fieldset("import", lang('Import'), !$rows);
echo "<input type='file' name='csv_file'> ";
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;", "tsv" => "TSV"), $adminer_import["format"], 1); // 1 - select
echo " <input type='submit' name='import' value='" . lang('Import') . "'>";
echo "</div></fieldset>\n";
}
$adminer->selectEmailPrint(array_filter($email_fields, 'strlen'), $columns);
echo "<p><input type='hidden' name='token' value='$token'></p>\n";
echo "</form>\n";
}
}

View File

@@ -1,9 +1,10 @@
<?php
$SEQUENCE = $_GET["sequence"];
$row = $_POST;
if ($_POST && !$error) {
$link = substr(ME, 0, -1);
$name = trim($_POST["name"]);
$name = trim($row["name"]);
if ($_POST["drop"]) {
query_redirect("DROP SEQUENCE " . idf_escape($SEQUENCE), $link, lang('Sequence has been dropped.'));
} elseif ($SEQUENCE == "") {
@@ -17,18 +18,17 @@ if ($_POST && !$error) {
page_header($SEQUENCE != "" ? lang('Alter sequence') . ": " . h($SEQUENCE) : lang('Create sequence'), $error);
$row = $_POST;
if (!$row) {
$row = array("name" => $SEQUENCE);
$row["name"] = $SEQUENCE;
}
?>
<form action="" method="post">
<p><input name="name" value="<?php echo h($row["name"]); ?>">
<p><input name="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php
if ($SEQUENCE != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'>" . confirm(lang('Drop %s?', $SEQUENCE)) . "\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">

View File

@@ -14,34 +14,39 @@ if (!$error && $_POST["clear"]) {
redirect(remove_from_uri("history"));
}
page_header(lang('SQL command'), $error);
page_header((isset($_GET["import"]) ? lang('Import') : lang('SQL command')), $error);
if (!$error && $_POST) {
$fp = false;
$query = $_POST["query"];
if ($_POST["webfile"]) {
$fp = @fopen((file_exists("adminer.sql") ? "adminer.sql"
: (file_exists("adminer.sql.gz") ? "compress.zlib://adminer.sql.gz"
: "compress.bzip2://adminer.sql.bz2"
)), "rb");
if (!isset($_GET["import"])) {
$query = $_POST["query"];
} elseif ($_POST["webfile"]) {
$sql_file_path = $adminer->importServerPath();
$fp = @fopen((file_exists($sql_file_path)
? $sql_file_path
: "compress.zlib://$sql_file_path.gz"
), "rb");
$query = ($fp ? fread($fp, 1e6) : false);
} elseif ($_FILES && $_FILES["sql_file"]["error"] != UPLOAD_ERR_NO_FILE) {
} else {
$query = get_file("sql_file", true);
}
if (is_string($query)) { // get_file() returns error as number, fread() as false
if (function_exists('memory_get_usage')) {
@ini_set("memory_limit", max(ini_bytes("memory_limit"), 2 * strlen($query) + memory_get_usage() + 8e6)); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
}
if ($query != "" && strlen($query) < 1e6) { // don't add big queries
$q = $query . (ereg(";[ \t\r\n]*\$", $query) ? "" : ";"); //! doesn't work with DELIMITER |
$q = $query . (preg_match("~;[ \t\r\n]*\$~", $query) ? "" : ";"); //! doesn't work with DELIMITER |
if (!$history || reset(end($history)) != $q) { // no repeated queries
restart_session();
$history[] = array($q, time());
$history[] = array($q, time()); //! add elapsed time
set_session("queries", $history_all); // required because reference is unlinked by stop_session()
stop_session();
}
}
$space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";
$space = "(?:\\s|/\\*[\s\S]*?\\*/|(?:#|-- )[^\n]*\n?|--\r?\n)";
$delimiter = ";";
$offset = 0;
$empty = true;
@@ -51,14 +56,14 @@ if (!$error && $_POST) {
}
$commands = 0;
$errors = array();
$line = 0;
$parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\\*|-- |$' . ($jush == "pgsql" ? '|\\$[^$]*\\$' : '');
$total_start = microtime();
$parse = '[\'"' . ($jush == "sql" ? '`#' : ($jush == "sqlite" ? '`[' : ($jush == "mssql" ? '[' : ''))) . ']|/\*|-- |$' . ($jush == "pgsql" ? '|\$[^$]*\$' : '');
$total_start = microtime(true);
parse_str($_COOKIE["adminer_export"], $adminer_export);
$dump_format = $adminer->dumpFormat();
unset($dump_format["sql"]);
while ($query != "") {
if (!$offset && preg_match("~^$space*DELIMITER\\s+(\\S+)~i", $query, $match)) {
if (!$offset && preg_match("~^$space*+DELIMITER\\s+(\\S+)~i", $query, $match)) {
$delimiter = $match[1];
$query = substr($query, strlen($match[0]));
} else {
@@ -71,8 +76,9 @@ if (!$error && $_POST) {
break;
}
$offset = $pos + strlen($found);
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
while (preg_match('(' . ($found == '/*' ? '\\*/' : ($found == '[' ? ']' : (ereg('^-- |^#', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
while (preg_match('(' . ($found == '/*' ? '\*/' : ($found == '[' ? ']' : (preg_match('~^-- |^#~', $found) ? "\n" : preg_quote($found) . "|\\\\."))) . '|$)s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
$s = $match[0][0];
if (!$s && $fp && !feof($fp)) {
$query .= fread($fp, 1e5);
@@ -83,82 +89,116 @@ if (!$error && $_POST) {
}
}
}
} else { // end of a query
$empty = false;
$q = substr($query, 0, $pos);
$commands++;
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n";
if (!$_POST["only_errors"]) {
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . $adminer->sqlCommandQuery($q) . "</code></pre>\n";
if ($jush == "sqlite" && preg_match("~^$space*+ATTACH\\b~i", $q, $match)) {
// PHP doesn't support setting SQLITE_LIMIT_ATTACHED
echo $print;
ob_flush();
flush(); // can take a long time - show the running query
}
$start = microtime(); // microtime(true) is available since PHP 5
//! don't allow changing of character_set_results, convert encoding of displayed query
if ($connection->multi_query($q) && is_object($connection2) && preg_match("~^$space*USE\\b~isU", $q)) {
$connection2->query($q);
}
do {
$result = $connection->store_result();
$end = microtime();
$time = format_time($start, $end) . (strlen($q) < 1000 ? " <a href='" . h(ME) . "sql=" . urlencode(trim($q)) . "'>" . lang('Edit') . "</a>" : ""); // 1000 - maximum length of encoded URL in IE is 2083 characters
if ($connection->error) {
echo ($_POST["only_errors"] ? $print : "");
echo "<p class='error'>" . lang('Error in query') . ($connection->errno ? " ($connection->errno)" : "") . ": " . error() . "\n";
$errors[] = " <a href='#sql-$commands'>$commands</a>";
if ($_POST["error_stops"]) {
break 2;
}
} elseif (is_object($result)) {
$orgtables = select($result, $connection2);
if (!$_POST["only_errors"]) {
echo "<form action='' method='post'>\n";
echo "<p>" . ($result->num_rows ? lang('%d row(s)', $result->num_rows) : "") . $time;
$id = "export-$commands";
$export = ", <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('Export') . "</a><span id='$id' class='hidden'>: "
. html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
. html_select("format", $dump_format, $adminer_export["format"])
. "<input type='hidden' name='query' value='" . h($q) . "'>"
. " <input type='submit' name='export' value='" . lang('Export') . "'><input type='hidden' name='token' value='$token'></span>\n"
;
if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q) && ($explain = explain($connection2, $q))) {
$id = "explain-$commands";
echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
echo "<div id='$id' class='hidden'>\n";
select($explain, $connection2, ($jush == "sql" ? "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/explain-output.html#explain_" : ""), $orgtables);
echo "</div>\n";
} else {
echo $export;
}
echo "</form>\n";
}
} else {
if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) {
restart_session();
set_session("dbs", null); // clear cache
stop_session();
}
if (!$_POST["only_errors"]) {
echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $connection->affected_rows) . "$time\n";
}
echo "<p class='error'>" . lang('ATTACH queries are not supported.') . "\n";
$errors[] = " <a href='#sql-$commands'>$commands</a>";
if ($_POST["error_stops"]) {
break;
}
$start = $end;
} while ($connection->next_result());
$line += substr_count($q.$found, "\n");
} else {
if (!$_POST["only_errors"]) {
echo $print;
ob_flush();
flush(); // can take a long time - show the running query
}
$start = microtime(true);
//! don't allow changing of character_set_results, convert encoding of displayed query
if ($connection->multi_query($q) && is_object($connection2) && preg_match("~^$space*+USE\\b~i", $q)) {
$connection2->query($q);
}
do {
$result = $connection->store_result();
if ($connection->error) {
echo ($_POST["only_errors"] ? $print : "");
echo "<p class='error'>" . lang('Error in query') . ($connection->errno ? " ($connection->errno)" : "") . ": " . error() . "\n";
$errors[] = " <a href='#sql-$commands'>$commands</a>";
if ($_POST["error_stops"]) {
break 2;
}
} else {
$time = " <span class='time'>(" . format_time($start) . ")</span>"
. (strlen($q) < 1000 ? " <a href='" . h(ME) . "sql=" . urlencode(trim($q)) . "'>" . lang('Edit') . "</a>" : "") // 1000 - maximum length of encoded URL in IE is 2083 characters
;
$affected = $connection->affected_rows; // getting warnigns overwrites this
$warnings = ($_POST["only_errors"] ? "" : $driver->warnings());
$warnings_id = "warnings-$commands";
if ($warnings) {
$time .= ", <a href='#$warnings_id'>" . lang('Warnings') . "</a>" . script("qsl('a').onclick = partial(toggle, '$warnings_id');", "");
}
$explain = null;
$explain_id = "explain-$commands";
if (is_object($result)) {
$limit = $_POST["limit"];
$orgtables = select($result, $connection2, array(), $limit);
if (!$_POST["only_errors"]) {
echo "<form action='' method='post'>\n";
$num_rows = $result->num_rows;
echo "<p>" . ($num_rows ? ($limit && $num_rows > $limit ? lang('%d / ', $limit) : "") . lang('%d row(s)', $num_rows) : "");
echo $time;
if ($connection2 && preg_match("~^($space|\\()*+SELECT\\b~i", $q) && ($explain = explain($connection2, $q))) {
echo ", <a href='#$explain_id'>Explain</a>" . script("qsl('a').onclick = partial(toggle, '$explain_id');", "");
}
$id = "export-$commands";
echo ", <a href='#$id'>" . lang('Export') . "</a>" . script("qsl('a').onclick = partial(toggle, '$id');", "") . "<span id='$id' class='hidden'>: "
. html_select("output", $adminer->dumpOutput(), $adminer_export["output"]) . " "
. html_select("format", $dump_format, $adminer_export["format"])
. "<input type='hidden' name='query' value='" . h($q) . "'>"
. " <input type='submit' name='export' value='" . lang('Export') . "'><input type='hidden' name='token' value='$token'></span>\n"
. "</form>\n"
;
}
} else {
if (preg_match("~^$space*+(CREATE|DROP|ALTER)$space++(DATABASE|SCHEMA)\\b~i", $q)) {
restart_session();
set_session("dbs", null); // clear cache
stop_session();
}
if (!$_POST["only_errors"]) {
echo "<p class='message' title='" . h($connection->info) . "'>" . lang('Query executed OK, %d row(s) affected.', $affected) . "$time\n";
}
}
echo ($warnings ? "<div id='$warnings_id' class='hidden'>\n$warnings</div>\n" : "");
if ($explain) {
echo "<div id='$explain_id' class='hidden'>\n";
select($explain, $connection2, $orgtables);
echo "</div>\n";
}
}
$start = microtime(true);
} while ($connection->next_result());
}
$query = substr($query, $offset);
$offset = 0;
}
}
}
}
if ($empty) {
echo "<p class='message'>" . lang('No commands to execute.') . "\n";
} elseif ($_POST["only_errors"]) {
echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors)) . format_time($total_start, microtime()) . "\n";
echo "<p class='message'>" . lang('%d query(s) executed OK.', $commands - count($errors));
echo " <span class='time'>(" . format_time($total_start) . ")</span>\n";
} elseif ($errors && $commands > 1) {
echo "<p class='error'>" . lang('Error in query') . ": " . implode("", $errors) . "\n";
}
//! MS SQL - SET SHOWPLAN_ALL OFF
} else {
echo "<p class='error'>" . upload_error($query) . "\n";
}
@@ -166,51 +206,60 @@ if (!$error && $_POST) {
?>
<form action="" method="post" enctype="multipart/form-data" id="form">
<p><?php
$q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory
if ($_POST) {
$q = $_POST["query"];
} elseif ($_GET["history"] == "all") {
$q = $history;
} elseif ($_GET["history"] != "") {
$q = $history[$_GET["history"]][0];
}
textarea("query", $q, 20);
echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
echo "<p>" . (ini_bool("file_uploads")
? lang('File upload') . ': <input type="file" name="sql_file"' . ($_FILES && $_FILES["sql_file"]["error"] != 4 ? '' : ' onchange="this.form[\'only_errors\'].checked = true;"') . '> (&lt; ' . ini_get("upload_max_filesize") . 'B)' // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
: lang('File uploads are disabled.')
);
?>
<p>
<input type="submit" value="<?php echo lang('Execute'); ?>" title="Ctrl+Enter">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php
echo checkbox("error_stops", 1, $_POST["error_stops"], lang('Stop on error')) . "\n";
echo checkbox("only_errors", 1, $_POST["only_errors"], lang('Show only errors')) . "\n";
print_fieldset("webfile", lang('From server'), $_POST["webfile"], "document.getElementById('form')['only_errors'].checked = true; ");
$compress = array();
foreach (array("gz" => "zlib", "bz2" => "bz2") as $key => $val) {
if (extension_loaded($val)) {
$compress[] = ".$key";
$execute = "<input type='submit' value='" . lang('Execute') . "' title='Ctrl+Enter'>";
if (!isset($_GET["import"])) {
$q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory
if ($_POST) {
$q = $_POST["query"];
} elseif ($_GET["history"] == "all") {
$q = $history;
} elseif ($_GET["history"] != "") {
$q = $history[$_GET["history"]][0];
}
echo "<p>";
textarea("query", $q, 20);
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . remove_from_uri("sql|limit|error_stops|only_errors") . "');");
echo "<p>$execute\n";
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
} else {
echo "<fieldset><legend>" . lang('File upload') . "</legend><div>";
$gz = (extension_loaded("zlib") ? "[.gz]" : "");
echo (ini_bool("file_uploads")
? "SQL$gz (&lt; " . ini_get("upload_max_filesize") . "B): <input type='file' name='sql_file[]' multiple>\n$execute" // ignore post_max_size because it is for all form fields together and bytes computing would be necessary
: lang('File uploads are disabled.')
);
echo "</div></fieldset>\n";
$importServerPath = $adminer->importServerPath();
if ($importServerPath) {
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
echo lang('Webserver file %s', "<code>" . h($importServerPath) . "$gz</code>");
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
echo "</div></fieldset>\n";
}
echo "<p>";
}
echo lang('Webserver file %s', "<code>adminer.sql" . ($compress ? "[" . implode("|", $compress) . "]" : "") . "</code>");
echo ' <input type="submit" name="webfile" value="' . lang('Run file') . '">';
echo "</div></fieldset>\n";
if ($history) {
echo checkbox("error_stops", 1, ($_POST ? $_POST["error_stops"] : isset($_GET["import"])), lang('Stop on error')) . "\n";
echo checkbox("only_errors", 1, ($_POST ? $_POST["only_errors"] : isset($_GET["import"])), lang('Show only errors')) . "\n";
echo "<input type='hidden' name='token' value='$token'>\n";
if (!isset($_GET["import"]) && $history) {
print_fieldset("history", lang('History'), $_GET["history"] != "");
foreach ($history as $key => $val) {
list($q, $time) = $val;
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <span class='time' title='" . @date('Y-m-d', $time) . "'>" . @date("H:i:s", $time) . "</span> <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>") . "<br>\n"; // @ - time zone may be not set
for ($val = end($history); $val; $val = prev($history)) { // not array_reverse() to save memory
$key = key($history);
list($q, $time, $elapsed) = $val;
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a>"
. " <span class='time' title='" . @date('Y-m-d', $time) . "'>" . @date("H:i:s", $time) . "</span>" // @ - time zone may be not set
. " <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $q)))), 80, "</code>")
. ($elapsed ? " <span class='time'>($elapsed)</span>" : "")
. "<br>\n"
;
}
echo "<input type='submit' name='clear' value='" . lang('Clear') . "'>\n";
echo "<a href='" . h(ME . "sql=&history=all") . "'>" . lang('Edit all') . "</a>\n";
echo "</div></fieldset>\n";
}
?>
</form>

11
adminer/sqlite.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
function adminer_object() {
include_once "../plugins/plugin.php";
include_once "../plugins/login-password-less.php";
return new AdminerPlugin(array(
// TODO: inline the result of password_hash() so that the password is not visible in source codes
new AdminerLoginPasswordLess(password_hash("YOUR_PASSWORD_HERE", PASSWORD_DEFAULT)),
));
}
include "./index.php";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 B

After

Width:  |  Height:  |  Size: 82 B

View File

@@ -1,18 +1,20 @@
/** @author Ondrej Valka, http://valka.info */
body { color: #000; background: #fff; font: 90%/1.25 Verdana, Arial, Helvetica, sans-serif; margin: 0; }
a { color: blue; }
a { color: blue; text-decoration: none; }
a:visited { color: navy; }
a:hover { color: red; }
a.text { text-decoration: none; }
a:link:hover, a:visited:hover { color: red; text-decoration: underline; }
a.text:hover { text-decoration: none; }
a.jush-help:hover { color: inherit; }
h1 { font-size: 150%; margin: 0; padding: .8em 1em; border-bottom: 1px solid #999; font-weight: normal; color: #777; background: #eee; }
h2 { font-size: 150%; margin: 0 0 20px -18px; padding: .8em 1em; border-bottom: 1px solid #000; color: #000; font-weight: normal; background: #ddf; }
h3 { font-weight: normal; font-size: 130%; margin: 1em 0 0; }
form { margin: 0; }
table { margin: 1em 20px 0 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
td, th { border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
td table { width: 100%; margin: 0; }
table { margin: 1em 20px 0 0; border-collapse: collapse; font-size: 90%; }
td, th { border: 1px solid #999; padding: .2em .3em; }
th { background: #eee; text-align: left; }
thead th { text-align: center; padding: .2em .5em; }
thead td, thead th { background: #ddf; }
thead td, thead th { background: #ddf; } /* position: sticky; causes Firefox to lose borders */
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: .8em .5em 0 0; border: 1px solid #999; }
p { margin: .8em 20px 0 0; }
img { vertical-align: middle; border: 0; }
@@ -20,39 +22,55 @@ td img { max-width: 200px; max-height: 200px; }
code { background: #eee; }
tbody tr:hover td, tbody tr:hover th { background: #eee; }
pre { margin: 1em 0 0; }
input[type=image] { vertical-align: middle; }
pre, textarea { font: 100%/1.25 monospace; }
input { vertical-align: middle; }
input.default { box-shadow: 1px 1px 1px #777; }
input.required { box-shadow: 1px 1px 1px red; }
input.maxlength { box-shadow: 1px 1px 1px red; }
input.wayoff { left: -1000px; position: absolute; }
.block { display: block; }
.version { color: #777; font-size: 67%; }
.js .hidden, .nojs .jsonly { display: none; }
.js .column { position: absolute; background: #ddf; padding: .3em 1ex .3em 0; margin-top: -.3em; }
.nowrap td, .nowrap th, td.nowrap { white-space: pre; }
.js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
.nowrap td, .nowrap th, td.nowrap, p.nowrap { white-space: pre; }
.wrap td { white-space: normal; }
.error { color: red; background: #fee; }
.error b { background: #fff; font-weight: normal; }
.message { color: green; background: #efe; }
.message table { color: #000; background: #fff; }
.error, .message { padding: .5em .8em; margin: 1em 20px 0 0; }
.char { color: #007F00; }
.date { color: #7F007F; }
.enum { color: #007F7F; }
.binary { color: red; }
.odd td { background: #F5F5F5; }
.js .checked td, .js .checked th { background: #ddf; }
.js .checkable .checked td, .js .checkable .checked th { background: #ddf; }
.time { color: silver; font-size: 70%; }
.function { text-align: right; }
.number { text-align: right; }
.datetime { text-align: right; }
.type { width: 15ex; width: auto\9; }
.options select { width: 20ex; width: auto\9; }
.view { font-style: italic; }
.active { font-weight: bold; }
.sqlarea { width: 98%; }
.icon { width: 18px; height: 18px; }
.icon { width: 18px; height: 18px; background-color: navy; }
.icon:hover { background-color: red; }
.size { width: 6ex; }
.help { cursor: help; }
.footer { position: sticky; bottom: 0; margin-right: -20px; border-top: 20px solid rgba(255, 255, 255, .7); border-image: linear-gradient(rgba(255, 255, 255, .2), #fff) 100% 0; }
.footer > div { background: #fff; padding: 0 0 .5em; }
.footer fieldset { margin-top: 0; }
.links a { white-space: nowrap; margin-right: 20px; }
.logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
.loadmore { margin-left: 1ex; }
/* .edit used in designs */
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; }
#menu p { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#menu p, #logins, #tables { padding: .8em 1em; margin: 0; border-bottom: 1px solid #ccc; }
#logins li, #tables li { list-style: none; }
#dbs { overflow: hidden; }
#logins, #tables { white-space: nowrap; overflow: auto; }
#logins a, #tables a { background: #fff; }
#logout { background: none; border: none; color: blue; font: inherit; padding: 0; text-decoration: underline; cursor: pointer; }
#logout:hover { color: red; }
#logins a, #tables a, #tables span { background: #fff; }
#content { margin: 2em 0 0 21em; padding: 10px 20px 20px 0; }
#lang { position: absolute; top: 0; left: 0; line-height: 1.8em; padding: .3em 1em; }
#breadcrumb { white-space: nowrap; position: absolute; top: 0; left: 21em; background: #eee; height: 2em; line-height: 1.8em; padding: 0 1em; margin: 0 0 0 -18px; }
@@ -61,13 +79,28 @@ input[type=image] { vertical-align: middle; }
#schema { margin-left: 60px; position: relative; -moz-user-select: none; -webkit-user-select: none; }
#schema .table { border: 1px solid silver; padding: 0 2px; cursor: move; position: absolute; }
#schema .references { position: absolute; }
#help { position: absolute; border: 1px solid #999; background: #eee; padding: 5px; font-family: monospace; z-index: 1; }
.rtl h2 { margin: 0 -18px 20px 0; }
.rtl p, .rtl table, .rtl .error, .rtl .message { margin: 1em 0 0 20px; }
.rtl .logout { left: 0; right: auto; }
.rtl #content { margin: 2em 21em 0 0; padding: 10px 0 20px 20px; }
.rtl #breadcrumb { left: auto; right: 21em; margin: 0 -18px 0 0; }
.rtl .pages { left: auto; right: 21em; }
.rtl input.wayoff { left: auto; right: -1000px; }
.rtl #lang, .rtl #menu { left: auto; right: 0; }
@media all and (max-device-width: 880px) {
.pages { left: auto; }
#menu { position: static; width: auto; }
#content { margin-left: 10px; }
#lang { position: static; border-top: 1px solid #999; }
#breadcrumb { left: auto; }
.rtl .pages { right: auto; }
.rtl #content { margin-right: 10px; }
.rtl #breadcrumb { right: auto; }
}
@media print {
#lang, #menu { display: none; }
#content { margin-left: 1em; }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

After

Width:  |  Height:  |  Size: 79 B

View File

@@ -1,40 +1,48 @@
// Adminer specific functions
var jushRoot = '../externals/jush/'; // global variable to allow simple customization
/** Load syntax highlighting
* @param string first three characters of database system version
* @param [boolean]
*/
function bodyLoad(version) {
if (jushRoot) {
// copy of jush.style to load JS and CSS at once
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = jushRoot + 'jush.css';
document.getElementsByTagName('head')[0].appendChild(link);
var script = document.createElement('script');
script.src = jushRoot + 'jush.js';
script.onload = function () {
if (window.jush) { // IE runs in case of an error too
jush.create_links = ' target="_blank" rel="noreferrer"';
jush.urls.sql_sqlset = jush.urls.sql[0] = jush.urls.sqlset[0] = jush.urls.sqlstatus[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key';
var pgsql = 'http://www.postgresql.org/docs/' + version + '/static/';
jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0] = pgsql + '$key';
jush.urls.pgsqlset[0] = pgsql + 'runtime-config-$key.html#GUC-$1';
if (window.jushLinks) {
jush.custom_links = jushLinks;
function bodyLoad(version, maria) {
if (window.jush) {
jush.create_links = ' target="_blank" rel="noreferrer noopener"';
if (version) {
for (var key in jush.urls) {
var obj = jush.urls;
if (typeof obj[key] != 'string') {
obj = obj[key];
key = 0;
if (maria) {
for (var i = 1; i < obj.length; i++) {
obj[i] = obj[i]
.replace(/\.html/, '/')
.replace(/(numeric)(-type-overview)/, '$1-data$2')
.replace(/#statvar_.*/, '#$$1')
;
}
}
}
jush.highlight_tag('code', 0);
obj[key] = obj[key]
.replace(/dev\.mysql\.com\/doc\/mysql\/en\//, (maria ? 'mariadb.com/kb/en/library/' : '$&')) // MariaDB
.replace(/\/doc\/mysql/, '/doc/refman/' + version) // MySQL
.replace(/\/docs\/current/, '/docs/' + version) // PostgreSQL
;
}
};
script.onreadystatechange = function () {
if (/^(loaded|complete)$/.test(script.readyState)) {
script.onload();
}
if (window.jushLinks) {
jush.custom_links = jushLinks;
}
jush.highlight_tag('code', 0);
var tags = qsa('textarea', document);
for (var i = 0; i < tags.length; i++) {
if (/(^|\s)jush-/.test(tags[i].className)) {
var pre = jush.textarea(tags[i]);
if (pre) {
setupSubmitHighlightInput(pre);
}
}
};
document.body.appendChild(script);
}
}
}
@@ -63,68 +71,74 @@ function typePassword(el, disable) {
}
}
/** Hide or show some login rows for selected driver
* @param HTMLSelectElement
/** Install toggle handler
*/
function loginDriver(driver) {
var trs = parentTag(driver, 'table').rows;
for (var i=1; i < trs.length - 1; i++) {
trs[i].className = (/sqlite/.test(driver.value) ? 'hidden' : '');
function messagesPrint() {
var els = qsa('.toggle', document);
for (var i = 0; i < els.length; i++) {
els[i].onclick = partial(toggle, els[i].getAttribute('href').substr(1));
}
}
/** Handle Tab and Esc in textarea
* @param HTMLTextAreaElement
* @param KeyboardEvent
* @return boolean
/** Hide or show some login rows for selected driver
* @param HTMLSelectElement
*/
function loginDriver(driver) {
var trs = parentTag(driver, 'table').rows;
var disabled = /sqlite/.test(selectValue(driver));
alterClass(trs[1], 'hidden', disabled); // 1 - row with server
trs[1].getElementsByTagName('input')[0].disabled = disabled;
}
var dbCtrl;
var dbPrevious = {};
/** Check if database should be opened to a new window
* @param MouseEvent
* @this HTMLSelectElement
*/
function textareaKeydown(target, event) {
if (!event.shiftKey && !event.altKey && !isCtrl(event)) {
if (event.keyCode == 9) { // 9 - Tab
// inspired by http://pallieter.org/Projects/insertTab/
if (target.setSelectionRange) {
var start = target.selectionStart;
var scrolled = target.scrollTop;
target.value = target.value.substr(0, start) + '\t' + target.value.substr(target.selectionEnd);
target.setSelectionRange(start + 1, start + 1);
target.scrollTop = scrolled;
return false; //! still loses focus in Opera, can be solved by handling onblur
} else if (target.createTextRange) {
document.selection.createRange().text = '\t';
return false;
}
}
if (event.keyCode == 27) { // 27 - Esc
var els = target.form.elements;
for (var i=1; i < els.length; i++) {
if (els[i-1] == target) {
els[i].focus();
break;
}
}
return false;
}
function dbMouseDown(event) {
dbCtrl = isCtrl(event);
if (dbPrevious[this.name] == undefined) {
dbPrevious[this.name] = this.value;
}
}
/** Load database after selecting it
* @this HTMLSelectElement
*/
function dbChange() {
if (dbCtrl) {
this.form.target = '_blank';
}
this.form.submit();
this.form.target = '';
if (dbCtrl && dbPrevious[this.name] != undefined) {
this.value = dbPrevious[this.name];
dbPrevious[this.name] = undefined;
}
return true;
}
/** Check whether the query will be executed with index
* @param HTMLFormElement
* @this HTMLElement
*/
function selectFieldChange(form) {
function selectFieldChange() {
var form = this.form;
var ok = (function () {
var inputs = form.getElementsByTagName('input');
var inputs = qsa('input', form);
for (var i=0; i < inputs.length; i++) {
if (inputs[i].value && /^fulltext/.test(inputs[i].name)) {
return true;
}
}
var ok = form.limit.value;
var selects = form.getElementsByTagName('select');
var selects = qsa('select', form);
var group = false;
var columns = {};
for (var i=0; i < selects.length; i++) {
@@ -151,7 +165,7 @@ function selectFieldChange(form) {
}
if (col && /^order/.test(select.name)) {
if (!(col in indexColumns)) {
ok = false;
ok = false;
}
break;
}
@@ -190,15 +204,61 @@ function idfEscape(s) {
return s.replace(/`/, '``');
}
/** Detect foreign key
* @param HTMLInputElement
/** Handle clicks on fields editing
* @param MouseEvent
* @return boolean false to cancel action
*/
function editingNameChange(field) {
var name = field.name.substr(0, field.name.length - 7);
var type = formField(field.form, name + '[type]');
function editingClick(event) {
var el = getTarget(event);
if (!isTag(el, 'input')) {
el = parentTag(target, 'label');
el = el && qs('input', el);
}
if (el) {
var name = el.name;
if (/^add\[/.test(name)) {
editingAddRow.call(el, 1);
} else if (/^up\[/.test(name)) {
editingMoveRow.call(el, 1);
} else if (/^down\[/.test(name)) {
editingMoveRow.call(el);
} else if (/^drop_col\[/.test(name)) {
editingRemoveRow.call(el, 'fields\$1[field]');
} else {
if (name == 'auto_increment_col') {
var field = el.form['fields[' + el.value + '][field]'];
if (!field.value) {
field.value = 'id';
field.oninput();
}
}
return;
}
return false;
}
}
/** Handle input on fields editing
* @param InputEvent
*/
function editingInput(event) {
var el = getTarget(event);
if (/\[default\]$/.test(el.name)) {
el.previousSibling.checked = true;
}
}
/** Detect foreign key
* @this HTMLInputElement
*/
function editingNameChange() {
var name = this.name.substr(0, this.name.length - 7);
var type = formField(this.form, name + '[type]');
var opts = type.options;
var candidate; // don't select anything with ambiguous match (like column `id`)
var val = field.value;
var val = this.value;
for (var i = opts.length; i--; ) {
var match = /(.+)`(.+)/.exec(opts[i].value);
if (!match) { // common type
@@ -228,27 +288,23 @@ function editingNameChange(field) {
}
/** Add table row for next field
* @param HTMLInputElement
* @param boolean
* @param boolean
* @return boolean
* @return boolean false
* @this HTMLInputElement
*/
function editingAddRow(button, allowed, focus) {
if (allowed && rowCount >= allowed) {
return false;
}
var match = /(\d+)(\.\d+)?/.exec(button.name);
function editingAddRow(focus) {
var match = /(\d+)(\.\d+)?/.exec(this.name);
var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
var row = parentTag(button, 'tr');
var row2 = row.cloneNode(true);
var tags = row.getElementsByTagName('select');
var tags2 = row2.getElementsByTagName('select');
var row = parentTag(this, 'tr');
var row2 = cloneNode(row);
var tags = qsa('select', row);
var tags2 = qsa('select', row2);
for (var i=0; i < tags.length; i++) {
tags2[i].name = tags[i].name.replace(/([0-9.]+)/, x);
tags2[i].name = tags[i].name.replace(/[0-9.]+/, x);
tags2[i].selectedIndex = tags[i].selectedIndex;
}
tags = row.getElementsByTagName('input');
tags2 = row2.getElementsByTagName('input');
tags = qsa('input', row);
tags2 = qsa('input', row2);
var input = tags2[0]; // IE loose tags2 after insertBefore()
for (var i=0; i < tags.length; i++) {
if (tags[i].name == 'auto_increment_col') {
@@ -263,88 +319,134 @@ function editingAddRow(button, allowed, focus) {
tags2[i].checked = false;
}
}
tags[0].onchange = function () {
editingNameChange(tags[0]);
};
tags[0].oninput = editingNameChange;
row.parentNode.insertBefore(row2, row.nextSibling);
if (focus) {
input.onchange = function () {
editingNameChange(input);
};
input.oninput = editingNameChange;
input.focus();
}
added += '0';
rowCount++;
return true;
return false;
}
/** Remove table row for field
* @param HTMLInputElement
* @return boolean
* @param string regular expression replacement
* @return boolean false
* @this HTMLInputElement
*/
function editingRemoveRow(button) {
var field = formField(button.form, button.name.replace(/drop_col(.+)/, 'fields$1[field]'));
function editingRemoveRow(name) {
var field = formField(this.form, this.name.replace(/[^\[]+(.+)/, name));
field.parentNode.removeChild(field);
parentTag(button, 'tr').style.display = 'none';
return true;
parentTag(this, 'tr').style.display = 'none';
return false;
}
/** Move table row for field
* @param [boolean]
* @return boolean false for success
* @this HTMLInputElement
*/
function editingMoveRow(up){
var row = parentTag(this, 'tr');
if (!('nextElementSibling' in row)) {
return true;
}
row.parentNode.insertBefore(row, up
? row.previousElementSibling
: row.nextElementSibling ? row.nextElementSibling.nextElementSibling : row.parentNode.firstChild);
return false;
}
var lastType = '';
/** Clear length and hide collation or unsigned
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function editingTypeChange(type) {
function editingTypeChange() {
var type = this;
var name = type.name.substr(0, type.name.length - 6);
var text = selectValue(type);
for (var i=0; i < type.form.elements.length; i++) {
var el = type.form.elements[i];
if (el.name == name + '[length]' && !(
(/(char|binary)$/.test(lastType) && /(char|binary)$/.test(text))
|| (/(enum|set)$/.test(lastType) && /(enum|set)$/.test(text))
)) {
el.value = '';
if (el.name == name + '[length]') {
if (!(
(/(char|binary)$/.test(lastType) && /(char|binary)$/.test(text))
|| (/(enum|set)$/.test(lastType) && /(enum|set)$/.test(text))
)) {
el.value = '';
}
el.oninput.apply(el);
}
if (lastType == 'timestamp' && el.name == name + '[has_default]' && /timestamp/i.test(formField(type.form, name + '[default]').value)) {
el.checked = false;
}
if (el.name == name + '[collation]') {
el.className = (/(char|text|enum|set)$/.test(text) ? '' : 'hidden');
alterClass(el, 'hidden', !/(char|text|enum|set)$/.test(text));
}
if (el.name == name + '[unsigned]') {
el.className = (/(int|float|double|decimal)$/.test(text) ? '' : 'hidden');
alterClass(el, 'hidden', !/(^|[^o])int(?!er)|numeric|real|float|double|decimal|money/.test(text));
}
if (el.name == name + '[on_update]') {
alterClass(el, 'hidden', !/timestamp|datetime/.test(text)); // MySQL supports datetime since 5.6.5
}
if (el.name == name + '[on_delete]') {
el.className = (/`/.test(text) ? '' : 'hidden');
alterClass(el, 'hidden', !/`/.test(text));
}
}
helpClose();
}
/** Mark length as required
* @this HTMLInputElement
*/
function editingLengthChange() {
alterClass(this, 'required', !this.value.length && /var(char|binary)$/.test(selectValue(this.parentNode.previousSibling.firstChild)));
}
/** Edit enum or set
* @param HTMLInputElement
* @this HTMLInputElement
*/
function editingLengthFocus(field) {
var td = field.parentNode;
function editingLengthFocus() {
var td = this.parentNode;
if (/(enum|set)$/.test(selectValue(td.previousSibling.firstChild))) {
var edit = document.getElementById('enum-edit');
var val = field.value;
edit.value = (/^'.+','.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val);
var edit = qs('#enum-edit');
edit.value = enumValues(this.value);
td.appendChild(edit);
field.style.display = 'none';
this.style.display = 'none';
edit.style.display = 'inline';
edit.focus();
}
}
/** Finish editing of enum or set
* @param HTMLTextAreaElement
/** Get enum values
* @param string
* @return string values separated by newlines
*/
function editingLengthBlur(edit) {
var field = edit.parentNode.firstChild;
var val = edit.value;
field.value = (/\n/.test(val) ? "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'" : val);
function enumValues(s) {
var re = /(^|,)\s*'(([^\\']|\\.|'')*)'\s*/g;
var result = [];
var offset = 0;
var match;
while (match = re.exec(s)) {
if (offset != match.index) {
break;
}
result.push(match[2].replace(/'(')|\\(.)/g, '$1$2'));
offset += match[0].length;
}
return (offset == s.length ? result.join('\n') : s);
}
/** Finish editing of enum or set
* @this HTMLTextAreaElement
*/
function editingLengthBlur() {
var field = this.parentNode.firstChild;
var val = this.value;
field.value = (/^'[^\n]+'$/.test(val) ? val : val && "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\\/g, '\\\\').replace(/\n/g, "','") + "'");
field.style.display = 'inline';
edit.style.display = 'none';
this.style.display = 'none';
}
/** Show or hide selected table column
@@ -352,164 +454,231 @@ function editingLengthBlur(edit) {
* @param number
*/
function columnShow(checked, column) {
var trs = document.getElementById('edit-fields').getElementsByTagName('tr');
var trs = qsa('tr', qs('#edit-fields'));
for (var i=0; i < trs.length; i++) {
trs[i].getElementsByTagName('td')[column].className = (checked ? '' : 'hidden');
}
}
/** Hide column with default values in narrow window
*/
function editingHideDefaults() {
if (innerWidth < document.documentElement.scrollWidth) {
document.getElementById('defaults').checked = false;
columnShow(false, 5);
alterClass(qsa('td', trs[i])[column], 'hidden', !checked);
}
}
/** Display partition options
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function partitionByChange(el) {
var partitionTable = /RANGE|LIST/.test(selectValue(el));
el.form['partitions'].className = (partitionTable || !el.selectedIndex ? 'hidden' : '');
document.getElementById('partition-table').className = (partitionTable ? '' : 'hidden');
function partitionByChange() {
var partitionTable = /RANGE|LIST/.test(selectValue(this));
alterClass(this.form['partitions'], 'hidden', partitionTable || !this.selectedIndex);
alterClass(qs('#partition-table'), 'hidden', !partitionTable);
helpClose();
}
/** Add next partition row
* @param HTMLInputElement
* @this HTMLInputElement
*/
function partitionNameChange(el) {
var row = parentTag(el, 'tr').cloneNode(true);
function partitionNameChange() {
var row = cloneNode(parentTag(this, 'tr'));
row.firstChild.firstChild.value = '';
parentTag(el, 'table').appendChild(row);
el.onchange = function () {};
parentTag(this, 'table').appendChild(row);
this.oninput = function () {};
}
/** Show or hide comment fields
* @param HTMLInputElement
* @param [boolean] whether to focus Comment if checked
*/
function editingCommentsClick(el, focus) {
var comment = el.form['Comment'];
columnShow(el.checked, 6);
alterClass(comment, 'hidden', !el.checked);
if (focus && el.checked) {
comment.focus();
}
}
/** Uncheck 'all' checkbox
* @param MouseEvent
* @this HTMLTableElement
*/
function dumpClick(event) {
var el = parentTag(getTarget(event), 'label');
if (el) {
el = qs('input', el);
var match = /(.+)\[\]$/.exec(el.name);
if (match) {
checkboxClick.call(el, event);
formUncheck('check-' + match[1]);
}
}
}
/** Add row for foreign key
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function foreignAddRow(field) {
field.onchange = function () { };
var row = parentTag(field, 'tr').cloneNode(true);
var selects = row.getElementsByTagName('select');
function foreignAddRow() {
var row = cloneNode(parentTag(this, 'tr'));
this.onchange = function () { };
var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/\]/, '1$&');
selects[i].selectedIndex = 0;
}
parentTag(field, 'table').appendChild(row);
parentTag(this, 'table').appendChild(row);
}
/** Add row for indexes
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function indexesAddRow(field) {
field.onchange = function () { };
var row = parentTag(field, 'tr').cloneNode(true);
var selects = row.getElementsByTagName('select');
function indexesAddRow() {
var row = cloneNode(parentTag(this, 'tr'));
this.onchange = function () { };
var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
selects[i].selectedIndex = 0;
}
var inputs = row.getElementsByTagName('input');
var inputs = qsa('input', row);
for (var i=0; i < inputs.length; i++) {
inputs[i].name = inputs[i].name.replace(/indexes\[\d+/, '$&1');
inputs[i].value = '';
}
parentTag(field, 'table').appendChild(row);
parentTag(this, 'table').appendChild(row);
}
/** Change column in index
* @param HTMLSelectElement
* @param string name prefix
* @this HTMLSelectElement
*/
function indexesChangeColumn(field, prefix) {
var columns = parentTag(field, 'td').getElementsByTagName('select');
function indexesChangeColumn(prefix) {
var names = [];
for (var i=0; i < columns.length; i++) {
var value = selectValue(columns[i]);
if (value) {
names.push(value);
for (var tag in { 'select': 1, 'input': 1 }) {
var columns = qsa(tag, parentTag(this, 'td'));
for (var i=0; i < columns.length; i++) {
if (/\[columns\]/.test(columns[i].name)) {
var value = selectValue(columns[i]);
if (value) {
names.push(value);
}
}
}
}
field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
this.form[this.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
}
/** Add column for index
* @param HTMLSelectElement
* @param string name prefix
* @this HTMLSelectElement
*/
function indexesAddColumn(field, prefix) {
field.onchange = function () {
indexesChangeColumn(field, prefix);
};
function indexesAddColumn(prefix) {
var field = this;
var select = field.form[field.name.replace(/\].*/, '][type]')];
if (!select.selectedIndex) {
select.selectedIndex = 3;
while (selectValue(select) != "INDEX" && select.selectedIndex < select.options.length) {
select.selectedIndex++;
}
select.onchange();
}
var column = field.parentNode.cloneNode(true);
select = column.getElementsByTagName('select')[0];
select.name = select.name.replace(/\]\[\d+/, '$&1');
select.selectedIndex = 0;
var input = column.getElementsByTagName('input')[0];
input.name = input.name.replace(/\]\[\d+/, '$&1');
input.value = '';
var column = cloneNode(field.parentNode);
var selects = qsa('select', column);
for (var i = 0; i < selects.length; i++) {
select = selects[i];
select.name = select.name.replace(/\]\[\d+/, '$&1');
select.selectedIndex = 0;
}
field.onchange = partial(indexesChangeColumn, prefix);
var inputs = qsa('input', column);
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
input.name = input.name.replace(/\]\[\d+/, '$&1');
if (input.type != 'checkbox') {
input.value = '';
}
}
parentTag(field, 'td').appendChild(column);
field.onchange();
}
/** Updates the form action
* @param HTMLFormElement
* @param string
*/
function sqlSubmit(form, root) {
if (encodeURIComponent(form['query'].value).length < 2e3) {
form.action = root
+ '&sql=' + encodeURIComponent(form['query'].value)
+ (form['limit'].value ? '&limit=' + +form['limit'].value : '')
+ (form['error_stops'].checked ? '&error_stops=1' : '')
+ (form['only_errors'].checked ? '&only_errors=1' : '')
;
}
}
/** Handle changing trigger time or event
* @param RegExp
* @param string
* @param HTMLFormElement
*/
function triggerChange(tableRe, table, form) {
var formEvent = selectValue(form['Event']);
if (tableRe.test(form['Trigger'].value)) {
form['Trigger'].value = table + '_' + (selectValue(form['Timing']).charAt(0) + formEvent.charAt(0)).toLowerCase();
}
alterClass(form['Of'], 'hidden', formEvent != 'UPDATE OF');
}
var that, x, y; // em and tablePos defined in schema.inc.php
/** Get mouse position
* @param HTMLElement
* @param MouseEvent
* @this HTMLElement
*/
function schemaMousedown(el, event) {
function schemaMousedown(event) {
if ((event.which ? event.which : event.button) == 1) {
that = el;
x = event.clientX - el.offsetLeft;
y = event.clientY - el.offsetTop;
that = this;
x = event.clientX - this.offsetLeft;
y = event.clientY - this.offsetTop;
}
}
/** Move object
* @param MouseEvent
*/
function schemaMousemove(ev) {
function schemaMousemove(event) {
if (that !== undefined) {
ev = ev || event;
var left = (ev.clientX - x) / em;
var top = (ev.clientY - y) / em;
var divs = that.getElementsByTagName('div');
var left = (event.clientX - x) / em;
var top = (event.clientY - y) / em;
var divs = qsa('div', that);
var lineSet = { };
for (var i=0; i < divs.length; i++) {
if (divs[i].className == 'references') {
var div2 = document.getElementById((/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4));
var div2 = qs('[id="' + (/^refs/.test(divs[i].id) ? 'refd' : 'refs') + divs[i].id.substr(4) + '"]');
var ref = (tablePos[divs[i].title] ? tablePos[divs[i].title] : [ div2.parentNode.offsetTop / em, 0 ]);
var left1 = -1;
var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
if (divs[i].parentNode != div2.parentNode) {
left1 = Math.min(0, ref[1] - left) - 1;
divs[i].style.left = left1 + 'em';
divs[i].getElementsByTagName('div')[0].style.width = -left1 + 'em';
divs[i].querySelector('div').style.width = -left1 + 'em';
var left2 = Math.min(0, left - ref[1]) - 1;
div2.style.left = left2 + 'em';
div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
div2.querySelector('div').style.width = -left2 + 'em';
}
if (!lineSet[id]) {
var line = document.getElementById(divs[i].id.replace(/^....(.+)-.+$/, 'refl$1'));
var line = qs('[id="' + divs[i].id.replace(/^....(.+)-.+$/, 'refl$1') + '"]');
var top1 = top + divs[i].offsetTop / em;
var top2 = top + div2.offsetTop / em;
if (divs[i].parentNode != div2.parentNode) {
top2 += ref[0] - top;
line.getElementsByTagName('div')[0].style.height = Math.abs(top1 - top2) + 'em';
line.querySelector('div').style.height = Math.abs(top1 - top2) + 'em';
}
line.style.left = (left + left1) + 'em';
line.style.top = Math.min(top1, top2) + 'em';
@@ -526,18 +695,64 @@ function schemaMousemove(ev) {
* @param MouseEvent
* @param string
*/
function schemaMouseup(ev, db) {
function schemaMouseup(event, db) {
if (that !== undefined) {
ev = ev || event;
tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
tablePos[that.firstChild.firstChild.firstChild.data] = [ (event.clientY - y) / em, (event.clientX - x) / em ];
that = undefined;
var s = '';
for (var key in tablePos) {
s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
}
s = encodeURIComponent(s.substr(1));
var link = document.getElementById('schema-link');
var link = qs('#schema-link');
link.href = link.href.replace(/[^=]+$/, '') + s;
cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
}
}
var helpOpen, helpIgnore; // when mouse outs <option> then it mouse overs border of <select> - ignore it
/** Display help
* @param MouseEvent
* @param string
* @param bool display on left side (otherwise on top)
* @this HTMLElement
*/
function helpMouseover(event, text, side) {
var target = getTarget(event);
if (!text) {
helpClose();
} else if (window.jush && (!helpIgnore || this != target)) {
helpOpen = 1;
var help = qs('#help');
help.innerHTML = text;
jush.highlight_tag([ help ]);
alterClass(help, 'hidden');
var rect = target.getBoundingClientRect();
var body = document.documentElement;
help.style.top = (body.scrollTop + rect.top - (side ? (help.offsetHeight - target.offsetHeight) / 2 : help.offsetHeight)) + 'px';
help.style.left = (body.scrollLeft + rect.left - (side ? help.offsetWidth : (help.offsetWidth - target.offsetWidth) / 2)) + 'px';
}
}
/** Close help after timeout
* @param MouseEvent
* @this HTMLElement
*/
function helpMouseout(event) {
helpOpen = 0;
helpIgnore = (this != getTarget(event));
setTimeout(function () {
if (!helpOpen) {
helpClose();
}
}, 200);
}
/** Close help
*/
function helpClose() {
alterClass(qs('#help'), 'hidden', true);
}

View File

@@ -1,12 +1,86 @@
/** Get first element by selector
* @param string
* @param [HTMLElement] defaults to document
* @return HTMLElement
*/
function qs(selector, context) {
return (context || document).querySelector(selector);
}
/** Get last element by selector
* @param string
* @param [HTMLElement] defaults to document
* @return HTMLElement
*/
function qsl(selector, context) {
var els = qsa(selector, context || document);
return els[els.length - 1];
}
/** Get all elements by selector
* @param string
* @param HTMLElement
* @return NodeList
*/
function qsa(selector, context) {
return context.querySelectorAll(selector);
}
/** Return a function calling fn with the next arguments
* @param function
* @param ...
* @return function with preserved this
*/
function partial(fn) {
var args = Array.apply(null, arguments).slice(1);
return function () {
return fn.apply(this, args);
};
}
/** Return a function calling fn with the first parameter and then the next arguments
* @param function
* @param ...
* @return function with preserved this
*/
function partialArg(fn) {
var args = Array.apply(null, arguments);
return function (arg) {
args[0] = arg;
return fn.apply(this, args);
};
}
/** Assign values from source to target
* @param Object
* @param Object
*/
function mixin(target, source) {
for (var key in source) {
target[key] = source[key];
}
}
/** Add or remove CSS class
* @param HTMLElement
* @param string
* @param [bool]
*/
function alterClass(el, className, enable) {
if (el) {
el.className = el.className.replace(RegExp('(^|\\s)' + className + '(\\s|$)'), '$2') + (enable ? ' ' + className : '');
}
}
/** Toggle visibility
* @param string
* @return boolean
* @return boolean false
*/
function toggle(id) {
var el = document.getElementById(id);
var el = qs('#' + id);
el.className = (el.className == 'hidden' ? '' : 'hidden');
return true;
return false;
}
/** Set permanent cookie
@@ -21,31 +95,64 @@ function cookie(assign, days) {
}
/** Verify current Adminer version
* @param string
* @param string own URL base
* @param string
*/
function verifyVersion() {
function verifyVersion(current, url, token) {
cookie('adminer_version=0', 1);
var script = document.createElement('script');
script.src = location.protocol + '//www.adminer.org/version.php';
document.body.appendChild(script);
var iframe = document.createElement('iframe');
iframe.src = 'https://www.adminer.org/version/?current=' + current;
iframe.frameBorder = 0;
iframe.marginHeight = 0;
iframe.scrolling = 'no';
iframe.style.width = '7ex';
iframe.style.height = '1.25em';
if (window.postMessage && window.addEventListener) {
iframe.style.display = 'none';
addEventListener('message', function (event) {
if (event.origin == 'https://www.adminer.org') {
var match = /version=(.+)/.exec(event.data);
if (match) {
cookie('adminer_version=' + match[1], 1);
ajax(url + 'script=version', function () {
}, event.data + '&token=' + token);
}
}
}, false);
}
qs('#version').appendChild(iframe);
}
/** Get value of select
* @param HTMLSelectElement
* @param HTMLElement <select> or <input>
* @return string
*/
function selectValue(select) {
if (!select.selectedIndex) {
return select.value;
}
var selected = select.options[select.selectedIndex];
return ((selected.attributes.value || {}).specified ? selected.value : selected.text);
}
/** Get parent node with specified tag name.
* @param HTMLElement
* @param string
* @return HTMLElement
*/
/** Verify if element has a specified tag name
* @param HTMLElement
* @param string regular expression
* @return bool
*/
function isTag(el, tag) {
var re = new RegExp('^(' + tag + ')$', 'i');
return el && re.test(el.tagName);
}
/** Get parent node with specified tag name
* @param HTMLElement
* @param string regular expression
* @return HTMLElement
*/
function parentTag(el, tag) {
var re = new RegExp('^' + tag + '$', 'i');
while (!re.test(el.tagName)) {
while (el && !isTag(el, tag)) {
el = el.parentNode;
}
return el;
@@ -56,18 +163,40 @@ function parentTag(el, tag) {
*/
function trCheck(el) {
var tr = parentTag(el, 'tr');
tr.className = tr.className.replace(/(^|\s)checked(\s|$)/, '$2') + (el.checked ? ' checked' : '');
alterClass(tr, 'checked', el.checked);
if (el.form && el.form['all'] && el.form['all'].onclick) { // Opera treats form.all as document.all
el.form['all'].onclick();
}
}
/** Fill number of selected items
* @param string
* @param string
* @uses thousandsSeparator
*/
function selectCount(id, count) {
setHtml(id, (count === '' ? '' : '(' + (count + '').replace(/\B(?=(\d{3})+$)/g, thousandsSeparator) + ')'));
var el = qs('#' + id);
if (el) {
var inputs = qsa('input', el.parentNode.parentNode);
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type == 'submit') {
input.disabled = (count == '0');
}
}
}
}
/** Check all elements matching given name
* @param HTMLInputElement
* @param RegExp
* @this HTMLInputElement
*/
function formCheck(el, name) {
var elems = el.form.elements;
function formCheck(name) {
var elems = this.form.elements;
for (var i=0; i < elems.length; i++) {
if (name.test(elems[i].name)) {
elems[i].checked = el.checked;
elems[i].checked = this.checked;
trCheck(elems[i]);
}
}
@@ -76,14 +205,9 @@ function formCheck(el, name) {
/** Check all rows in <table class="checkable">
*/
function tableCheck() {
var tables = document.getElementsByTagName('table');
for (var i=0; i < tables.length; i++) {
if (/(^|\s)checkable(\s|$)/.test(tables[i].className)) {
var trs = tables[i].getElementsByTagName('tr');
for (var j=0; j < trs.length; j++) {
trCheck(trs[j].firstChild.firstChild);
}
}
var inputs = qsa('table.checkable td:first-child input', document);
for (var i=0; i < inputs.length; i++) {
trCheck(inputs[i]);
}
}
@@ -91,7 +215,7 @@ function tableCheck() {
* @param string
*/
function formUncheck(id) {
var el = document.getElementById(id);
var el = qs('#' + id);
el.checked = false;
trCheck(el);
}
@@ -117,48 +241,65 @@ function formChecked(el, name) {
* @param [boolean] force click
*/
function tableClick(event, click) {
var td = parentTag(getTarget(event), 'td');
var text;
if (td && (text = td.getAttribute('data-text'))) {
if (selectClick.call(td, event, +text, td.getAttribute('data-warning'))) {
return;
}
}
click = (click || !window.getSelection || getSelection().isCollapsed);
var el = event.target || event.srcElement;
while (!/^tr$/i.test(el.tagName)) {
if (/^(table|a|input|textarea)$/i.test(el.tagName)) {
var el = getTarget(event);
while (!isTag(el, 'tr')) {
if (isTag(el, 'table|a|input|textarea')) {
if (el.type != 'checkbox') {
return;
}
checkboxClick(event, el);
checkboxClick.call(el, event);
click = false;
}
el = el.parentNode;
if (!el) { // Ctrl+click on text fields hides the element
return;
}
}
el = el.firstChild.firstChild;
if (click) {
el.checked = !el.checked;
el.onclick && el.onclick();
}
if (el.name == 'check[]') {
el.form['all'].checked = false;
formUncheck('all-page');
}
if (/^(tables|views)\[\]$/.test(el.name)) {
formUncheck('check-all');
}
trCheck(el);
}
var lastChecked;
/** Shift-click on checkbox for multiple selection.
* @param MouseEvent
* @param HTMLInputElement
*/
function checkboxClick(event, el) {
if (!el.name) {
* @param MouseEvent
* @this HTMLInputElement
*/
function checkboxClick(event) {
if (!this.name) {
return;
}
if (event.shiftKey && (!lastChecked || lastChecked.name == el.name)) {
if (event.shiftKey && (!lastChecked || lastChecked.name == this.name)) {
var checked = (lastChecked ? lastChecked.checked : true);
var inputs = parentTag(el, 'table').getElementsByTagName('input');
var inputs = qsa('input', parentTag(this, 'table'));
var checking = !lastChecked;
for (var i=0; i < inputs.length; i++) {
var input = inputs[i];
if (input.name === el.name) {
if (input.name === this.name) {
if (checking) {
input.checked = checked;
trCheck(input);
}
if (input === el || input === lastChecked) {
if (input === this || input === lastChecked) {
if (checking) {
break;
}
@@ -167,19 +308,19 @@ function checkboxClick(event, el) {
}
}
} else {
lastChecked = el;
lastChecked = this;
}
}
/** Set HTML code of an element
* @param string
* @param string undefined to set parentNode to &nbsp;
* @param string undefined to set parentNode to empty string
*/
function setHtml(id, html) {
var el = document.getElementById(id);
var el = qs('[id="' + id.replace(/[\\"]/g, '\\$&') + '"]'); // database name is used as ID
if (el) {
if (html == undefined) {
el.parentNode.innerHTML = '&nbsp;';
if (html == null) {
el.parentNode.innerHTML = '';
} else {
el.innerHTML = html;
}
@@ -201,68 +342,89 @@ function nodePosition(el) {
/** Go to the specified page
* @param string
* @param string
* @param [MouseEvent]
*/
function pageClick(href, page, event) {
function pageClick(href, page) {
if (!isNaN(page) && page) {
href += (page != 1 ? '&page=' + (page - 1) : '');
location.href = href;
location.href = href + (page != 1 ? '&page=' + (page - 1) : '');
}
}
/** Display items in menu
* @param HTMLElement
* @param MouseEvent
* @this HTMLElement
*/
function menuOver(el, event) {
var a = event.target;
if (/^a$/i.test(a.tagName) && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth) {
el.style.overflow = 'visible';
function menuOver(event) {
var a = getTarget(event);
if (isTag(a, 'a|span') && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
this.style.overflow = 'visible';
}
}
/** Hide items in menu
* @param HTMLElement
* @this HTMLElement
*/
function menuOut(el) {
el.style.overflow = 'auto';
function menuOut() {
this.style.overflow = 'auto';
}
/** Add row in select fieldset
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function selectAddRow(field) {
field.onchange = function () {
selectFieldChange(field.form);
};
function selectAddRow() {
var field = this;
var row = cloneNode(field.parentNode);
field.onchange = selectFieldChange;
field.onchange();
var row = field.parentNode.cloneNode(true);
var selects = row.getElementsByTagName('select');
var selects = qsa('select', row);
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
selects[i].selectedIndex = 0;
}
var inputs = row.getElementsByTagName('input');
if (inputs.length) {
inputs[0].name = inputs[0].name.replace(/[a-z]\[\d+/, '$&1');
inputs[0].value = '';
inputs[0].className = '';
var inputs = qsa('input', row);
for (var i=0; i < inputs.length; i++) {
inputs[i].name = inputs[i].name.replace(/[a-z]\[\d+/, '$&1');
inputs[i].className = '';
if (inputs[i].type == 'checkbox') {
inputs[i].checked = false;
} else {
inputs[i].value = '';
}
}
field.parentNode.parentNode.appendChild(row);
}
/** Prevent onsearch handler on Enter
* @param KeyboardEvent
* @this HTMLInputElement
*/
function selectSearchKeydown(event) {
if (event.keyCode == 13 || event.keyCode == 10) {
this.onsearch = function () {
};
}
}
/** Clear column name after resetting search
* @this HTMLInputElement
*/
function selectSearchSearch() {
if (!this.value) {
this.parentNode.firstChild.selectedIndex = 0;
}
}
/** Toggles column context menu
* @param HTMLElement
* @param [string] extra class name
*/
function columnMouse(el, className) {
var spans = el.getElementsByTagName('span');
* @param [string] extra class name
* @this HTMLElement
*/
function columnMouse(className) {
var spans = qsa('span', this);
for (var i=0; i < spans.length; i++) {
if (/column/.test(spans[i].className)) {
spans[i].className = 'column' + (className || '');
@@ -273,15 +435,16 @@ function columnMouse(el, className) {
/** Fill column in search field
* @param string
*/
* @param string
* @return boolean false
*/
function selectSearch(name) {
var el = document.getElementById('fieldset-search');
var el = qs('#fieldset-search');
el.className = '';
var divs = el.getElementsByTagName('div');
var divs = qsa('div', el);
for (var i=0; i < divs.length; i++) {
var div = divs[i];
if (/select/i.test(div.firstChild.tagName) && selectValue(div.firstChild) == name) {
if (isTag(div.firstChild, 'select') && selectValue(div.firstChild) == name) {
break;
}
}
@@ -289,7 +452,8 @@ function selectSearch(name) {
div.firstChild.value = name;
div.firstChild.onchange();
}
div.lastChild.focus();
qs('[name$="[val]"]', div).focus();
return false;
}
@@ -301,6 +465,14 @@ function isCtrl(event) {
return (event.ctrlKey || event.metaKey) && !event.altKey; // shiftKey allowed
}
/** Return event target
* @param Event
* @return HTMLElement
*/
function getTarget(event) {
return event.target || event.srcElement;
}
/** Send form by Ctrl+Enter on <select> and <textarea>
@@ -309,14 +481,22 @@ function isCtrl(event) {
* @return boolean
*/
function bodyKeydown(event, button) {
var target = event.target || event.srcElement;
if (isCtrl(event) && (event.keyCode == 13 || event.keyCode == 10) && /select|textarea|input/i.test(target.tagName)) { // 13|10 - Enter
eventStop(event);
var target = getTarget(event);
if (target.jushTextarea) {
target = target.jushTextarea;
}
if (isCtrl(event) && (event.keyCode == 13 || event.keyCode == 10) && isTag(target, 'select|textarea|input')) { // 13|10 - Enter
target.blur();
if (button) {
target.form[button].click();
} else {
if (target.form.onsubmit) {
target.form.onsubmit();
}
target.form.submit();
}
target.focus();
return false;
}
return true;
@@ -326,8 +506,8 @@ function bodyKeydown(event, button) {
* @param MouseEvent
*/
function bodyClick(event) {
var target = event.target || event.srcElement;
if ((isCtrl(event) || event.shiftKey) && target.type == 'submit' && /input/i.test(target.tagName)) {
var target = getTarget(event);
if ((isCtrl(event) || event.shiftKey) && target.type == 'submit' && isTag(target, 'input')) {
target.form.target = '_blank';
setTimeout(function () {
// if (isCtrl(event)) { focus(); } doesn't work
@@ -344,34 +524,67 @@ function bodyClick(event) {
*/
function editingKeydown(event) {
if ((event.keyCode == 40 || event.keyCode == 38) && isCtrl(event)) { // 40 - Down, 38 - Up
var target = event.target || event.srcElement;
var target = getTarget(event);
var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
var el = target.parentNode.parentNode[sibling];
if (el && (/^tr$/i.test(el.tagName) || (el = el[sibling])) && /^tr$/i.test(el.tagName) && (el = el.childNodes[nodePosition(target.parentNode)]) && (el = el.childNodes[nodePosition(target)])) {
if (el && (isTag(el, 'tr') || (el = el[sibling])) && isTag(el, 'tr') && (el = el.childNodes[nodePosition(target.parentNode)]) && (el = el.childNodes[nodePosition(target)])) {
el.focus();
}
return false;
}
if (event.shiftKey && !bodyKeydown(event, 'insert')) {
eventStop(event);
return false;
}
return true;
}
/** Disable maxlength for functions
* @param HTMLSelectElement
* @this HTMLSelectElement
*/
function functionChange(select) {
var input = select.form[select.name.replace(/^function/, 'fields')];
if (selectValue(select)) {
if (input.origMaxLength === undefined) {
input.origMaxLength = input.maxLength;
function functionChange() {
var input = this.form[this.name.replace(/^function/, 'fields')];
if (input) { // undefined with the set data type
if (selectValue(this)) {
if (input.origType === undefined) {
input.origType = input.type;
input.origMaxLength = input.getAttribute('data-maxlength');
}
input.removeAttribute('data-maxlength');
input.type = 'text';
} else if (input.origType) {
input.type = input.origType;
if (input.origMaxLength >= 0) {
input.setAttribute('data-maxlength', input.origMaxLength);
}
}
input.removeAttribute('maxlength');
} else if (input.origMaxLength >= 0) {
input.maxLength = input.origMaxLength;
oninput({target: input});
}
helpClose();
}
/** Skip 'original' when typing
* @param number
* @this HTMLTableCellElement
*/
function skipOriginal(first) {
var fnSelect = this.previousSibling.firstChild;
if (fnSelect.selectedIndex < first) {
fnSelect.selectedIndex = first;
}
}
/** Add new field in schema-less edit
* @this HTMLInputElement
*/
function fieldChange() {
var row = cloneNode(parentTag(this, 'tr'));
var inputs = qsa('input', row);
for (var i = 0; i < inputs.length; i++) {
inputs[i].value = '';
}
// keep value in <select> (function)
parentTag(this, 'table').appendChild(row);
this.oninput = function () { };
}
@@ -380,11 +593,20 @@ function functionChange(select) {
* @param string
* @param function (XMLHttpRequest)
* @param [string]
* @param [string]
* @return XMLHttpRequest or false in case of an error
* @uses offlineMessage
*/
function ajax(url, callback, data) {
function ajax(url, callback, data, message) {
var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
if (request) {
var ajaxStatus = qs('#ajaxstatus');
if (message) {
ajaxStatus.innerHTML = '<div class="message">' + message + '</div>';
ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
} else {
ajaxStatus.className += ' hidden';
}
request.open((data ? 'POST' : 'GET'), url);
if (data) {
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
@@ -392,7 +614,12 @@ function ajax(url, callback, data) {
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
request.onreadystatechange = function () {
if (request.readyState == 4) {
callback(request);
if (/^2/.test(request.status)) {
callback(request);
} else {
ajaxStatus.innerHTML = (request.status ? request.responseText : '<div class="error">' + offlineMessage + '</div>');
ajaxStatus.className = ajaxStatus.className.replace(/ hidden/g, '');
}
}
};
request.send(data);
@@ -402,34 +629,70 @@ function ajax(url, callback, data) {
/** Use setHtml(key, value) for JSON response
* @param string
* @return XMLHttpRequest or false in case of an error
* @return boolean false for success
*/
function ajaxSetHtml(url) {
return ajax(url, function (request) {
if (request.status) {
var data = eval('(' + request.responseText + ')');
for (var key in data) {
setHtml(key, data[key]);
}
return !ajax(url, function (request) {
var data = window.JSON ? JSON.parse(request.responseText) : eval('(' + request.responseText + ')');
for (var key in data) {
setHtml(key, data[key]);
}
});
}
/** Save form contents through AJAX
* @param HTMLFormElement
* @param string
* @param [HTMLInputElement]
* @return boolean
*/
function ajaxForm(form, message, button) {
var data = [];
var els = form.elements;
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (el.name && !el.disabled) {
if (/^file$/i.test(el.type) && el.value) {
return false;
}
if (!/^(checkbox|radio|submit|file)$/i.test(el.type) || el.checked || el == button) {
data.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(isTag(el, 'select') ? selectValue(el) : el.value));
}
}
}
data = data.join('&');
var url = form.action;
if (!/post/i.test(form.method)) {
url = url.replace(/\?.*/, '') + '?' + data;
data = '';
}
return ajax(url, function (request) {
setHtml('ajaxstatus', request.responseText);
if (window.jush) {
jush.highlight_tag(qsa('code', qs('#ajaxstatus')), 0);
}
}, data, message);
}
/** Display edit field
* @param HTMLElement
* @param MouseEvent
* @param number display textarea instead of input, 2 - load long text
* @param string warning to display
* @param [string] warning to display
* @return boolean
* @this HTMLElement
*/
function selectClick(td, event, text, warning) {
var target = event.target || event.srcElement;
if (!isCtrl(event) || /input|textarea/i.test(td.firstChild.tagName) || /^a$/i.test(target.tagName)) {
function selectClick(event, text, warning) {
var td = this;
var target = getTarget(event);
if (!isCtrl(event) || isTag(td.firstChild, 'input|textarea') || isTag(target, 'a')) {
return;
}
if (warning) {
return alert(warning);
alert(warning);
return true;
}
var original = td.innerHTML;
text = text || /\n/.test(original);
@@ -439,11 +702,12 @@ function selectClick(td, event, text, warning) {
event = window.event;
}
if (event.keyCode == 27 && !event.shiftKey && !event.altKey && !isCtrl(event)) { // 27 - Esc
inputBlur.apply(input);
td.innerHTML = original;
}
};
var pos = event.rangeOffset;
var value = td.firstChild.alt || td.textContent || td.innerText;
var value = (td.firstChild && td.firstChild.alt) || td.textContent || td.innerText;
input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
if (text) {
var rows = 1;
@@ -452,7 +716,7 @@ function selectClick(td, event, text, warning) {
});
input.rows = rows;
}
if (value == '\u00A0' || td.getElementsByTagName('i').length) { // &nbsp; or i - NULL
if (qsa('i', td).length) { // <i> - NULL
value = '';
}
if (document.selection) {
@@ -465,10 +729,11 @@ function selectClick(td, event, text, warning) {
}
td.innerHTML = '';
td.appendChild(input);
setupSubmitHighlight(td);
input.focus();
if (text == 2) { // long text
return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
if (request.status) {
if (request.responseText) {
input.value = request.responseText;
input.name = td.id;
}
@@ -483,29 +748,29 @@ function selectClick(td, event, text, warning) {
range.moveEnd('character', -input.value.length + pos);
range.select();
}
return true;
}
/** Load and display next page in select
* @param HTMLLinkElement
* @param string
* @param number
* @return boolean
* @param string
* @return boolean false for success
* @this HTMLLinkElement
*/
function selectLoadMore(a, limit, loading) {
function selectLoadMore(limit, loading) {
var a = this;
var title = a.innerHTML;
var href = a.href;
a.innerHTML = loading;
if (href) {
a.removeAttribute('href');
return ajax(href, function (request) {
document.getElementById('table').innerHTML += request.responseText;
var rows = 0;
request.responseText.replace(/(^|\n)<tr/g, function () {
rows++;
});
if (rows < limit) {
return !ajax(href, function (request) {
var tbody = document.createElement('tbody');
tbody.innerHTML = request.responseText;
qs('#table').appendChild(tbody);
if (tbody.children.length < limit) {
a.parentNode.removeChild(a);
} else {
a.href = href.replace(/\d+$/, function (page) {
@@ -529,3 +794,118 @@ function eventStop(event) {
event.cancelBubble = true;
}
}
/** Setup highlighting of default submit button on form field focus
* @param HTMLElement
*/
function setupSubmitHighlight(parent) {
for (var key in { input: 1, select: 1, textarea: 1 }) {
var inputs = qsa(key, parent);
for (var i = 0; i < inputs.length; i++) {
setupSubmitHighlightInput(inputs[i])
}
}
}
/** Setup submit highlighting for single element
* @param HTMLElement
*/
function setupSubmitHighlightInput(input) {
if (!/submit|image|file/.test(input.type)) {
addEvent(input, 'focus', inputFocus);
addEvent(input, 'blur', inputBlur);
}
}
/** Highlight default submit button
* @this HTMLInputElement
*/
function inputFocus() {
var submit = findDefaultSubmit(this);
if (submit) {
alterClass(submit, 'default', true);
}
}
/** Unhighlight default submit button
* @this HTMLInputElement
*/
function inputBlur() {
var submit = findDefaultSubmit(this);
if (submit) {
alterClass(submit, 'default');
}
}
/** Find submit button used by Enter
* @param HTMLElement
* @return HTMLInputElement
*/
function findDefaultSubmit(el) {
if (el.jushTextarea) {
el = el.jushTextarea;
}
if (!el.form) {
return null;
}
var inputs = qsa('input', el.form);
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
if (input.type == 'submit' && !input.style.zIndex) {
return input;
}
}
}
/** Add event listener
* @param HTMLElement
* @param string without 'on'
* @param function
*/
function addEvent(el, action, handler) {
if (el.addEventListener) {
el.addEventListener(action, handler, false);
} else {
el.attachEvent('on' + action, handler);
}
}
/** Defer focusing element
* @param HTMLElement
*/
function focus(el) {
setTimeout(function () { // this has to be an anonymous function because Firefox passes some arguments to setTimeout callback
el.focus();
}, 0);
}
/** Clone node and setup submit highlighting
* @param HTMLElement
* @return HTMLElement
*/
function cloneNode(el) {
var el2 = el.cloneNode(true);
var selector = 'input, select';
var origEls = qsa(selector, el);
var cloneEls = qsa(selector, el2);
for (var i=0; i < origEls.length; i++) {
var origEl = origEls[i];
for (var key in origEl) {
if (/^on/.test(key) && origEl[key]) {
cloneEls[i][key] = origEl[key];
}
}
}
setupSubmitHighlight(el2);
return el2;
}
oninput = function (event) {
var target = event.target;
var maxLength = target.getAttribute('data-maxlength');
alterClass(target, 'maxlength', target.value && maxLength != null && target.value.length > maxLength); // maxLength could be 0
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 B

After

Width:  |  Height:  |  Size: 80 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

After

Width:  |  Height:  |  Size: 79 B

Some files were not shown because too many files have changed in this diff Show More