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

Compare commits

...

1215 Commits

Author SHA1 Message Date
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
Jakub Vrana
632cc7c014 Release 3.6.3 2013-01-23 01:23:45 -08:00
Jakub Vrana
7a62838510 Fix XSS in displaying non-UTF-8 strings 2013-01-18 14:23:45 -08:00
srsbiz
da2a0190a4 Update Polish translation 2013-01-12 12:26:19 -08:00
Jakub Vrana
8eaad7475c Add a new design 2013-01-12 11:20:52 -08:00
Jakub Vrana
f6e1c589f9 Allow specifying external links (bug #3392685) 2013-01-11 12:46:44 -08:00
Jakub Vrana
61dc40a512 Fix PDO error handling 2013-01-10 13:01:48 -08:00
Jakub Vrana
35b6491a3c Respect empty default value of type set 2013-01-09 22:57:13 -08:00
Jakub Vrana
0cd81fddb0 Use function instead of INI for multibyte encoding 2013-01-09 22:41:46 -08:00
Jakub Vrana
a9262d8752 Display error code in SQL query 2013-01-09 22:19:38 -08:00
Jakub Vrana
588cb7c0c3 Don't use type="number" for decimal numbers
Google Chrome formats decimal point according to locale, treats it as invalid character and trims full stop
2013-01-09 18:42:46 -08:00
Jakub Vrana
b5ad37ff2b Treat Meta key same as Ctrl (bug #3599405) 2013-01-09 17:38:53 -08:00
Jakub Vrana
8bf02f2ce1 Release 3.6.2 2012-12-20 21:16:39 -08:00
Jakub Vrana
00b9e2c010 Fix switching language in test 2012-12-20 21:13:47 -08:00
Jakub Vrana
cdec2c9292 Avoid double escaping of links 2012-12-20 21:09:12 -08:00
Jakub Vrana
ce83605174 Display warning for missing UPDATE privilege (bug #3466883) 2012-12-15 23:14:11 -08:00
Jakub Vrana
0069d9f13e Use database name in creating new users 2012-12-15 22:33:18 -08:00
Jakub Vrana
ab20c18c2e Fix hitting backtrack limit in import (thanks to Tomas Votruba) 2012-12-15 22:07:42 -08:00
Jakub Vrana
0ac5a666b4 Support NULL in routine calls (bug #3541326) 2012-12-12 10:58:13 -08:00
Jakub Vrana
ed71d4a1f5 Update design 2012-12-12 10:56:01 -08:00
Jakub Vrana
2703eb960a Allow editing values with significant binary column (bug #3572781) 2012-12-11 21:25:56 -08:00
Halil Ozgur
8c91fd5966 Turkish translation - fixed translations and added missing ones, according to TDK (Turkish authority for language), community common sense and ease of use. 2012-12-11 21:00:20 -08:00
Jakub Vrana
f7f553a947 Escape links 2012-12-05 15:29:57 -08:00
Jakub Vrana
2fb1ebc7f1 HTML5 input fields 2012-12-05 13:17:42 -08:00
Jakub Vrana
ef723fb348 Update changes.txt 2012-12-01 16:00:38 -08:00
Jakub Vrana
ebdecd288b Work with mbstring.func_overload (#3572361) 2012-12-01 15:57:04 -08:00
Jakub Vrana
998ef45b08 Update design 2012-12-01 15:14:14 -08:00
Jakub Vrana
d5d8a6c8bc Quote MS SQL database name (bug #3576248) 2012-12-01 15:11:01 -08:00
Jakub Vrana
ee8ffa575f Prolong comment length (thanks to Martin Dzubak) 2012-12-01 15:00:37 -08:00
Jakub Vrana
d2ee9d85b1 Print CSRF token without import (bug #3582462) 2012-12-01 12:13:55 -08:00
Jakub Vrana
a5548ce823 Display date in SQL history (thanks to trestna smradlavice) 2012-12-01 10:01:09 -08:00
Jakub Vrana
697034f329 Don't edit for Ctrl+click on link 2012-11-01 13:42:08 -07:00
Jakub Vrana
cb1d7d459b Don't display edit warning without Ctrl 2012-11-01 13:33:13 -07:00
Jan Dolecek
fa4026bdbd removed CodeMirror dependancy
It's not used anyway.
And also, URL of the repo has changed so it only breaks stuff.
2012-10-20 10:37:39 -07:00
Jakub Vrana
0408c21d07 Fix process list in PostgreSQL 9.2 2012-10-20 09:58:56 -07:00
Jakub Vrana
7015fd9706 Don't select row on double click 2012-10-04 00:42:56 -07:00
Jakub Vrana
7865695a86 Support xx in lang.php 2012-10-04 00:25:22 -07:00
Jakub Vrana
dad8996c01 Add missing translations to xx 2012-10-04 00:24:37 -07:00
Jakub Vrana
0614260544 Edit values by Ctrl+click instead of double click 2012-10-04 00:24:25 -07:00
Jakub Vrana
da08af5eb9 Changes 2012-09-26 21:45:54 -07:00
Jakub Vrana
75c430a986 Revert "Unuse binary characters"
This reverts commit f3c59bb3a5.
2012-09-26 21:45:04 -07:00
Jakub Vrana
7ce485bc78 Comment 2012-09-22 12:26:08 -07:00
Jakub Vrana
8ec3e5fcda Display table default values on wide screens 2012-09-22 12:24:16 -07:00
Nik Nyby
6705fb2993 Add timestamptz to PostgreSQL 2012-09-22 11:07:15 -07:00
Jakub Vrana
29e65523d3 Compile only one project at a time 2012-09-22 07:59:40 -07:00
Jakub Vrana
b684569f7c Shorten varchar fields 2012-09-22 07:34:51 -07:00
Jakub Vrana
996bfc396b Fix switching language on first load 2012-09-22 06:22:44 -07:00
Jakub Vrana
f3c59bb3a5 Unuse binary characters 2012-09-22 06:12:56 -07:00
Jakub Vrana
906345ad81 Compress favicon 2012-09-22 05:32:06 -07:00
Jakub Vrana
4024f34d79 Increase <th> padding to simplify selecting text 2012-09-19 16:28:58 -07:00
Jakub Vrana
2264e09021 Shorten NUL byte 2012-09-19 15:43:02 -07:00
Jakub Vrana
9a30f14797 Update design 2012-09-17 21:12:32 -07:00
Jakub Vrana
189895ad0f Develop 2012-09-17 15:45:33 -07:00
Jakub Vrana
86b0fbf529 Release 3.6.1 2012-09-17 15:33:09 -07:00
Jakub Vrana
a89ab34a8e Fix compiled version on PHP with multibyte support 2012-09-17 15:32:28 -07:00
Jakub Vrana
534f4ee5cc Fix doc comments 2012-09-16 06:43:55 -07:00
Jakub Vrana
55c757a59a Develop 2012-09-16 06:43:16 -07:00
Jakub Vrana
63872de0f9 Release 3.6.0 2012-09-16 06:22:20 -07:00
Jakub Vrana
360218be0c Print compile errors to STDERR 2012-09-16 06:13:48 -07:00
Jakub Vrana
57d0c4c6f5 Fix switching language in compiled version 2012-09-16 06:09:36 -07:00
Jakub Vrana
ebbb35a0c3 Cache static files more 2012-09-11 09:16:51 -07:00
Jakub Vrana
9bfab6a3e3 Convert fields in inline edit 2012-09-09 16:25:25 -07:00
Jakub Vrana
312075d01f Search non-ASCII data only in text columns (bug #3564415) 2012-09-09 11:03:02 -07:00
Jakub Vrana
66d537c150 Apply text length on geometry data 2012-09-09 10:19:07 -07:00
Jakub Vrana
944f141bf4 MySQL: Don't remove partitioning on non-partitioned tables 2012-09-09 00:00:59 -07:00
Jakub Vrana
d5400234f0 MySQL: Support geometry data types 2012-09-08 23:43:22 -07:00
Jakub Vrana
31a608e398 MySQL: Unsupport hex function 2012-09-08 22:39:52 -07:00
Jakub Vrana
aff4d7de91 SQLite: Select primary key column on correct position 2012-09-08 22:13:28 -07:00
Jakub Vrana
dd49dfb4cd Save bytes 2012-09-08 21:54:35 -07:00
Jakub Vrana
d2d104b3b9 Update translation 2012-09-08 21:30:39 -07:00
Jakub Vrana
a0d00cf732 Store database to permanent login 2012-09-08 21:30:30 -07:00
Jakub Vrana
741c073c95 Unset wrong login from permanent logins 2012-09-08 20:54:02 -07:00
Jakub Vrana
de451010b1 Fix SQL query history 2012-09-07 11:54:02 -07:00
Jakub Vrana
8d3afc0eb5 Fix test 2012-09-07 11:36:46 -07:00
Jakub Vrana
63c9873c30 Fix JUSH compilation 2012-09-07 08:38:11 -07:00
Jakub Vrana
dd86e1892d Simplify compile_file() 2012-09-07 08:38:11 -07:00
Jakub Vrana
e767663f65 Compress JS 2012-09-07 08:38:11 -07:00
Jakub Vrana
caa9f490af Compress CSS 2012-09-07 08:38:10 -07:00
Jakub Vrana
415f500f10 Don't use \r\n in compiled strings 2012-09-07 08:37:52 -07:00
Jakub Vrana
0317638e80 Compress each translation separately 2012-09-07 08:31:25 -07:00
Jakub Vrana
ccd1246666 Save translations version 2012-09-07 08:30:32 -07:00
Jakub Vrana
85d985a319 Don't encode binary files 2012-09-07 08:30:31 -07:00
Jakub Vrana
5d257861e1 Compress translations 2012-09-07 08:30:31 -07:00
Jakub Vrana
09d81ffee9 Simplify load more data buffering 2012-09-07 08:21:35 -07:00
Jakub Vrana
b7f1d56fe0 Switch language by POST 2012-09-07 08:21:21 -07:00
Jakub Vrana
195a811466 Simplify switch lang form 2012-09-06 23:15:02 -07:00
Jakub Vrana
4cb14deac1 Open form to a new window on Ctrl+click or Shift+click 2012-09-04 15:40:57 -07:00
Jakub Vrana
541561be4d Minimize space around % 2012-09-03 15:03:55 -07:00
Jakub Vrana
8db73ad7ea Fix typo in translation 2012-09-01 08:47:29 -07:00
Jakub Vrana
d8006df483 Add new methods to plugin 2012-09-01 08:47:16 -07:00
Jakub Vrana
b9eb811e66 Hide import in information_schema 2012-08-29 10:08:18 -07:00
Nikola Radovanović
eb9bd30621 Serbian translation 2012-08-29 10:07:55 -07:00
Jakub Vrana
47e52b6761 Treat performance_schema as information_schema 2012-08-23 22:21:53 -07:00
Jakub Vrana
700a78b377 selectQueryBuild() method 2012-08-23 22:17:44 -07:00
Jakub Vrana
5d337fe04c Reveal menu items only if mouse is over wide links 2012-08-20 22:20:22 -07:00
Jakub Vrana
beafccb8c3 Separate printing databases in customization 2012-08-20 22:03:39 -07:00
Jakub Vrana
364dcfe632 Comment 2012-08-20 20:53:19 -07:00
Jakub Vrana
68211ac42b Don't display Load more data on last page 2012-08-20 08:25:20 -07:00
Jakub Vrana
ef0cb38aa1 Support Editor 2012-08-19 23:31:46 -07:00
Jakub Vrana
ea6d6e0d44 Simplify slow queries 2012-08-19 21:55:00 -07:00
Jakub Vrana
72b801513b Load more data in select 2012-08-19 20:32:53 -07:00
Jakub Vrana
fc689f5953 Fix last page link 2012-08-19 19:55:57 -07:00
Jakub Vrana
6a7021db28 Time out long running select count 2012-08-19 19:42:37 -07:00
Jakub Vrana
1f53cd3386 Time out long running database list 2012-08-19 19:35:11 -07:00
Jakub Vrana
5e0038b62d Improve session management 2012-08-19 13:42:13 -07:00
Jakub Vrana
c9da3ccb51 Display navigation links prior to waiting on DB list 2012-08-19 12:40:49 -07:00
Jakub Vrana
37013522a1 Save bytes 2012-08-19 09:43:31 -07:00
Jakub Vrana
b7af79e745 Display link to refresh with no databases 2012-08-19 09:37:29 -07:00
Jakub Vrana
0da02c5505 Backwards compatible designs 2012-08-15 09:04:08 -07:00
Jakub Vrana
7674576dcb Indicate NULL values in XML export (thanks to Karel Seidl) 2012-08-14 09:12:43 -07:00
Jakub Vrana
2a97e02cdd Update designs 2012-08-12 16:35:53 -07:00
Jan Kosco
bcf7e7e04b Fix haeckel theme for 3.5 adminer 2012-08-12 15:45:51 -07:00
Jakub Vrana
65a8c7dde4 Style logout button as link in Editor 2012-08-11 23:02:56 -07:00
Jakub Vrana
3a381564e5 Use VALUES() in INSERT+UPDATE export 2012-08-11 22:59:20 -07:00
Jakub Vrana
f9cbf50bd7 Export data settings only with data 2012-08-11 22:37:30 -07:00
Jakub Vrana
f0d97a7c7f Edit strings with \n in textarea 2012-08-11 21:45:09 -07:00
Jakub Vrana
98bc4fc4d2 Style logout button as link 2012-08-10 07:06:01 -07:00
Jakub Vrana
2d18afaf7f Release 3.5.1 2012-08-09 22:47:12 -07:00
Jakub Vrana
9a3b3db4f6 Comment 2012-08-09 12:18:31 -07:00
Jakub Vrana
a4e38a266d Remove definer from routine and event 2012-08-09 09:39:12 -07:00
Jakub Vrana
ca32e71e42 Ignore bit type when searching strings 2012-08-09 09:37:51 -07:00
Jakub Vrana
4b4fa16a37 Autodisplay long table names in tables filter plugin 2012-08-09 09:11:55 -07:00
Jakub Vrana
69d49e30c5 Support same name fields in CSV export 2012-08-09 08:57:45 -07:00
Jakub Vrana
7fcfb0d16a Don't include trailing space to delimiter 2012-08-09 08:39:54 -07:00
Jakub Vrana
1501d60f14 Descending order after second click on column caption 2012-08-08 22:40:38 -07:00
Jakub Vrana
e5b1c99d87 Support Shift+click in export 2012-08-08 09:23:46 -07:00
Jakub Vrana
b49061b863 Add JS function for getting parent tag 2012-08-08 09:22:23 -07:00
Jakub Vrana
5fd21e122a Set source checkbox only in click without Shift 2012-08-08 08:54:15 -07:00
Jakub Vrana
b783b9487d Don't display tables list on server pages 2012-08-08 08:41:52 -07:00
Jakub Vrana
99343701ab Autodisplay long logins in saved logins list 2012-08-08 08:27:50 -07:00
Jakub Vrana
c09a147b2e Develop 2012-08-05 09:15:05 -07:00
Jakub Vrana
a0af3eec5c Release 3.5.0 2012-08-04 22:53:20 -07:00
Jakub Vrana
1dd6dbcce2 Support one click search in Editor 2012-08-04 22:52:50 -07:00
Jakub Vrana
95f0a5f0f0 Fix test 2012-08-04 22:34:38 -07:00
Jakub Vrana
335ab7eab2 Done 2012-07-30 00:57:24 -07:00
Jakub Vrana
6a486181dd Autodisplay long table names in tables list 2012-07-29 16:05:37 -07:00
Jakub Vrana
57e5896b55 Autohide column context menu in select 2012-07-29 13:55:39 -07:00
Jakub Vrana
ac668d1331 Treat queries with no limit as full table scans 2012-07-29 13:28:04 -07:00
Jakub Vrana
55831095b6 Warn about grouping data without index 2012-07-29 13:25:59 -07:00
Jakub Vrana
07e2c3b2a4 Save bytes 2012-07-29 11:29:21 -07:00
Jakub Vrana
e2dbb9c7bd Links for column search in select 2012-07-29 11:29:00 -07:00
Jakub Vrana
e8b95f127f SQLite: Display number of rows in database overview 2012-07-29 10:45:38 -07:00
Jakub Vrana
f1153aa35a Display assigned auto_increment after clone 2012-07-27 17:37:20 -07:00
Jakub Vrana
5e4b815893 Highlight also killed queries 2012-07-27 16:08:09 -07:00
Jakub Vrana
a227ec1c97 Don't treat enum in PostgreSQL as special (bug #3545899) 2012-07-21 09:50:50 -07:00
Jakub Vrana
98483e101d SQLite: Better editing in tables without a primary key 2012-07-15 14:55:46 -07:00
Jakub Vrana
c2f95e0054 SQLite: Full alter table 2012-07-15 14:38:45 -07:00
Jakub Vrana
5fb2368b66 Ignore SQLite autoindexes 2012-07-15 12:24:20 -07:00
Jakub Vrana
385fdd45b8 Document trigger type 2012-07-15 12:04:04 -07:00
Jakub Vrana
56cd77f0d1 Save bytes 2012-07-15 10:05:13 -07:00
Jakub Vrana
7291ae608d Reset error before using in SQL query 2012-07-15 09:21:22 -07:00
Jakub Vrana
6a3cf71db5 Develop 2012-06-30 05:26:22 -07:00
Jakub Vrana
514ff41c7c Release 3.4.0 2012-06-30 05:04:37 -07:00
Jakub Vrana
dafd2deef2 Avoid flicker before the image is loaded 2012-06-30 05:02:43 -07:00
Jakub Vrana
6a96c14948 Tests compatible with strict mode 2012-06-30 03:50:23 -07:00
Jakub Vrana
091a4d04f4 Link to documentation 2012-06-30 03:17:16 -07:00
Jakub Vrana
a71b99096c Remove CodeMirror
- uses other colors than JUSH
- not used everywhere (triggers, routines, ...)
- Ctrl+Left and similar works bad
- missing autocomplete
- blocking loader
2012-06-30 01:51:35 -07:00
Jakub Vrana
a833468c0a Fix datetime type parsing (bug #3418043) 2012-06-29 16:41:12 -07:00
Jakub Vrana
54f464a893 Set character set in SQLSRV (bug #3479986) 2012-06-29 15:23:35 -07:00
Jakub Vrana
7de0b21e16 Fix indexes with duplicate tables in different schemas 2012-06-29 14:59:04 -07:00
Jakub Vrana
b78b0cd109 Plugin for including date in export filename 2012-06-29 14:41:47 -07:00
Jakub Vrana
f158d5e392 Zip dump only if requested 2012-06-29 14:09:44 -07:00
Jakub Vrana
5b57706890 Customizable export filename 2012-06-29 12:25:05 -07:00
Jakub Vrana
0d5543c9ac Use better Bengali translation 2012-06-29 12:13:03 -07:00
Jakub Vrana
7363429b52 Load jush.css earlier 2012-06-29 11:38:20 -07:00
Jakub Vrana
6ca4082e6c Unhighlight Binlog Dump in process list 2012-06-29 10:29:46 -07:00
Jakub Vrana
8daf581c21 Indonesian translation 2012-06-19 10:21:40 -07:00
Jakub Vrana
eb05475337 Bengali placeholders 2012-06-19 10:12:17 -07:00
Josef Šimánek
b2f5f5689d čeština v českém překladu 2012-06-19 19:51:01 +03:00
Jordi Rivero
a1e4e87b82 Typo error fixes 2012-06-18 11:29:12 -07:00
Jakub Vrana
97566acd75 Shift+click on checkbox to select consecutive rows (thanks to Alexander Loonar) 2012-06-13 12:21:21 -07:00
Jakub Vrana
4a6c72cd1c Comment 2012-06-13 11:19:50 -07:00
Jakub Vrana
7f1fcc2286 Format numbers in translations 2012-06-04 17:44:04 -07:00
Jakub Vrana
a2378af008 Display Indian languages together 2012-06-04 17:13:55 -07:00
Jakub Vrana
56ac3d1817 Mark scripts as executable 2012-05-25 23:21:31 -07:00
Jakub Vrana
739bcb0979 Warn about selecting data without index 2012-05-17 00:13:13 -07:00
Jakub Vrana
b0666e537d Remove unnecessary { } in compile 2012-05-16 16:42:45 -07:00
Jakub Vrana
8339b14da3 Comment 2012-05-16 16:42:16 -07:00
Jakub Vrana
5dc90731eb Update ng9 design 2012-05-14 09:27:16 -07:00
Jakub Vrana
f498219f29 Remove eventStop() used by AJAXification in past 2012-05-14 02:22:44 -07:00
Jakub Vrana
2db14e4bc2 Update TODO 2012-05-14 01:17:43 -07:00
Jakub Vrana
8be29afb9b Allow specifying database in login form (bug #3499359) 2012-05-14 01:11:09 -07:00
Jakub Vrana
f595f9313e Use namespace in login form 2012-05-14 01:11:08 -07:00
Jakub Vrana
6591d485e9 Replace isset($var) by $var !== null 2012-05-14 01:11:08 -07:00
Jakub Vrana
40ad846d20 Improve PDO_PgSQL support 2012-05-14 00:54:28 -07:00
Jakub Vrana
c4a57246ac Simplify work with NULL values in select 2012-05-13 23:24:39 -07:00
Jakub Vrana
20cf6d29c5 Support binary data in SQLite (http://forum.zdrojak.cz/?topic=619, https://sourceforge.net/projects/adminer/forums/forum/960418/topic/5274204) 2012-05-13 23:23:57 -07:00
Jakub Vrana
17ef1f0dfc Highlight keywords in PL/SQL CodeMirror 2012-05-13 22:56:56 -07:00
Jakub Vrana
5ac72dd739 Add design like Nette documentation 2012-05-13 17:58:45 -07:00
Jakub Vrana
06595f90e4 Inform about disabled event_scheduler (http://forum.zdrojak.cz/?topic=637) 2012-05-13 17:40:36 -07:00
Jakub Vrana
4f3fddc870 Fix parsing of functions returning datetime (bug #3518425) 2012-05-13 17:19:53 -07:00
Jakub Vrana
336a32c144 Update Bengali translation 2012-05-13 16:30:37 -07:00
Ivan Masár
0e31b09543 Add approximate row count for PostgreSQL driver 2012-05-13 16:07:58 -07:00
Jakub Vrana
20e11be093 Initialize variable used in textarea highlighting 2012-05-13 15:26:42 -07:00
Ivan Masár
d6c5f85a24 Add Oracle processlist support 2012-05-13 15:08:06 -07:00
Ivan Masár
a280179bd5 Add row count and table size for Oracle tables 2012-05-13 14:48:00 -07:00
Ivan Masár
7f1afde592 Add schema support to the Oracle driver 2012-05-13 14:46:46 -07:00
Jakub Vrana
70fb696fbd Link to descending order 2012-04-30 18:16:13 -07:00
Jakub Vrana
b16bb54219 Save assignment if not necessary 2012-04-29 17:54:18 -07:00
Davi Alexandre
9188d21ea3 Fixing some typos in the Portuguese translation 2012-04-29 17:45:04 -07:00
Jakub Vrana
3ada73d5ed Bengali translation 2012-04-29 17:35:42 -07:00
Jakub Vrana
047ce184f5 Highlight line with error in SQL command 2012-04-17 13:51:20 -07:00
Jakub Vrana
4815c7d020 Don't use AJAX links and forms 2012-04-15 22:22:47 -07:00
Jakub Vrana
bf54c13dfe Highlight code in textarea by CodeMirror 2012-04-15 22:00:33 -07:00
Jakub Vrana
48df7aa1c9 Link to original table in EXPLAIN of SELECT * FROM table t 2012-04-15 10:53:40 -07:00
Jakub Vrana
77ec05d50b Better support for multi results in PDO 2012-04-08 21:59:49 -07:00
Jakub Vrana
4dc3ec6a0d Ukrainian plural 2012-03-26 23:24:58 -07:00
Jakub Vrana
24c51fe11f Print current time next to executed SQL queries 2012-03-26 23:21:38 -07:00
Jakub Vrana
b254503fb2 Add progress cursor also to buttons 2012-03-26 23:21:02 -07:00
srsbiz
ea0a6a5a01 Update Polish translation 2012-03-21 22:53:23 -07:00
Jakub Vrana
e36afcc127 Ukrainian translation 2012-03-21 22:36:07 -07:00
Jakub Vrana
bf4f0a1f9e Replace JSMin by JsShrink 2012-03-10 21:41:00 -08:00
Jakub Vrana
a6f10787bb Add template for translations 2012-03-09 17:19:21 -08:00
Jakub Vrana
cc1398e5a4 Don't document parameters in readme 2012-03-08 15:30:15 -08:00
Jakub Vrana
00b3bc3f2c Develop 2012-03-06 23:31:44 -08:00
Jakub Vrana
a186460648 Release 3.3.4 2012-03-06 22:43:13 -08:00
Jakub Vrana
2d942e692d Fix test 2012-03-06 20:52:40 -08:00
Jakub Vrana
2dcfb70d08 Ignore right and middle mouse buttons 2012-03-06 08:24:33 -08:00
Jakub Vrana
405ad5f07e Fix invalid references line position on Database schema 2012-03-06 00:48:28 -08:00
Jakub Vrana
b959ba41c6 Save bytes 2012-03-06 00:47:33 -08:00
Jakub Vrana
22125790b3 Improve readability of HTML 2012-03-06 00:46:54 -08:00
Jakub Vrana
f539836fd5 Disable selecting text on Database schema 2012-03-05 22:23:36 -08:00
Jakub Vrana
2ca26386c2 Don't check row while selecting text 2012-03-05 22:12:47 -08:00
Jakub Vrana
4cc29e0137 Vacuum for PostgreSQL 2012-03-01 01:14:55 -08:00
Jakub Vrana
a25fa67e06 Save bytes 2012-03-01 01:05:06 -08:00
Jakub Vrana
99a75c3c44 Simplify aborting AJAX request 2012-02-29 14:31:35 -08:00
Jakub Vrana
83113cbe67 Use function for common code 2012-02-29 11:24:01 -08:00
Jakub Vrana
d35f83fb8d Rename variable 2012-02-29 11:08:13 -08:00
Jakub Vrana
7f2e97f0d2 Fix AJAX loading indicator in Chrome 2012-02-29 11:02:34 -08:00
Jakub Vrana
c6c48553b8 SQLite: vacuum 2012-02-29 10:49:17 -08:00
Jakub Vrana
27c046f753 New design 2012-02-24 07:48:15 -08:00
Jakub Vrana
9e7fcdf32c Plugin to hide databases 2012-02-23 22:58:41 -08:00
Jakub Vrana
c7f1a6322e Extensible list of databases 2012-02-23 22:58:41 -08:00
Jakub Vrana
640afc74d7 Use postgres instead of template1 as default database (bug #3491125) 2012-02-23 22:58:40 -08:00
Jakub Vrana
6bcbb0f1d8 Don't report previous error on primary connection 2012-02-23 22:58:40 -08:00
ladislav@marek.su
41e197ac06 Don't quote bit type in export 2012-02-23 22:58:40 -08:00
Jakub Vrana
9fd2880968 Support AJAX for database names with special characters 2012-02-17 15:49:58 -08:00
Jakub Vrana
70994abcbd Move loading indicator to the right, add CSS cursor: progress 2012-02-17 15:48:33 -08:00
Jakub Vrana
7e97fcd0b9 Compile usage 2012-02-17 12:10:37 -08:00
Jakub Vrana
bbbf4eeb79 mb_ereg compatibility 2012-01-09 11:46:43 -08:00
Jakub Vrana
3c5c08e793 Don't use LIKE for numbers in SQLite (bug #3420408) 2011-12-22 00:32:42 -08:00
Jakub Vrana
27b5e46a45 Autofocus in create schema 2011-12-22 00:04:44 -08:00
Jakub Vrana
af3b762067 Don't use LIKE for numbers (http://forum.zdrojak.root.cz/index.php?topic=567) 2011-12-21 23:35:50 -08:00
Jakub Vrana
1e70b74f4c Ability to disable export 2011-12-21 22:08:18 -08:00
Jakub Vrana
543e172513 Respect namespace in foreign keys (thanks to Kleps Ota) 2011-12-21 21:59:24 -08:00
Jakub Vrana
841cbbb7d2 Prefill .* when creating a new user 2011-12-21 08:52:45 -08:00
Jakub Vrana
fd7e8cbaae Esc to cancel AJAX request 2011-10-10 00:13:05 -07:00
Jakub Vrana
468644e2d8 Allowed extensions 2011-10-09 23:28:18 -07:00
Jakub Vrana
319abbaf2f Set autocommit 2011-09-27 02:24:20 +02:00
Jakub Vrana
b848764299 Remove search by expression in PDO 2011-09-18 09:07:12 +02:00
Jakub Vrana
ed25431f3c Error message with no response from server in AJAX 2011-09-17 15:24:18 +02:00
Jakub Vrana
6b3e3c2532 Remove unnecessary onload event 2011-09-13 02:24:22 +02:00
Jakub Vrana
0e0b79b815 Update JUSH 2011-09-12 23:22:41 +02:00
Jakub Vrana
998e2f5027 Ignore whitespace after semicolon 2011-09-12 21:14:22 +02:00
Jakub Vrana
ef867e6bd1 Trim identifiers (bug #3405309) 2011-09-10 13:06:59 +02:00
Jakub Vrana
bed3856f2d IIS 7 compatibility 2011-09-08 23:48:34 +02:00
Jakub Vrana
3ed7f453bc Ctrl+click on button opens form to blank window 2011-08-29 17:08:20 +02:00
Jakub Vrana
dd85aa5d6a Error in case of found string at end of chunk (thanks to simonik) 2011-08-29 15:58:53 +02:00
Jakub Vrana
c456f52d9f SET DEFAULT foreign key action 2011-08-29 13:32:06 +02:00
Jakub Vrana
9d34071eb9 Foreign keys default actions (bug #3397606) 2011-08-29 13:21:02 +02:00
Jakub Vrana
db3ae281bb PostgreSQL: fix alter foreign key 2011-08-29 13:07:47 +02:00
Jakub Vrana
de056d41c2 Add search condition after inputting value 2011-08-26 13:04:29 +02:00
Jakub Vrana
0f1c2c217b Beware sql.safe_mode 2011-08-25 17:46:25 +02:00
Jakub Vrana
ce0d001e8b Boolean search 2011-08-24 16:50:44 +02:00
Jakub Vrana
3a333e92ff Display search fields in order 2011-08-24 16:49:54 +02:00
Jakub Vrana
9d944c8fc1 Respect original memory_limit 2011-08-24 14:16:11 +02:00
Jakub Vrana
2348c4cd4c Update translation 2011-08-24 11:39:26 +02:00
Jakub Vrana
e6843dfbc1 Set application_name (thanks to juzna) 2011-08-23 14:23:48 +02:00
Jakub Vrana
2dd39c6df5 Persian translation 2011-08-23 14:08:37 +02:00
Jakub Vrana
a4c2b4a7cb Whitespace 2011-08-23 13:52:58 +02:00
Jakub Vrana
daf60b29f8 Connect if the eponymous database does not exist (bug #3391619) 2011-08-22 16:28:15 +02:00
Jakub Vrana
a88dccb961 Develop 2011-08-12 18:17:35 +02:00
Jakub Vrana
43e646eb54 Release 2011-08-12 18:09:19 +02:00
Jakub Vrana
8a06b35c44 Fix AJAX favicon 2011-08-12 18:06:45 +02:00
Jakub Vrana
2b472a5c10 Drop user only if successfully created 2011-08-12 17:45:14 +02:00
Jakub Vrana
112c9b3d87 New skin 2011-08-12 16:10:35 +02:00
Jakub Vrana
5d1a84d390 New plugin: Password SHA1 2011-08-12 13:44:25 +02:00
Jakub Vrana
2830ecd2e1 Edit existing user with db 2011-08-12 11:02:48 +02:00
Jakub Vrana
e854a04117 Save bytes 2011-08-12 10:31:16 +02:00
Jakub Vrana
75783421f1 Comment 2011-08-11 17:06:42 +02:00
Jakub Vrana
5a58d35405 Comment 2011-08-11 13:48:47 +02:00
Jakub Vrana
023b62a39c Highlight checked rows 2011-08-11 13:48:27 +02:00
Jakub Vrana
bf8b620560 No foreign keys in alter table 2011-08-11 13:00:55 +02:00
Jakub Vrana
1370d29d27 Comment 2011-08-11 11:43:37 +02:00
Jakub Vrana
93e835aea8 Titles of links 2011-08-10 18:33:50 +02:00
Jakub Vrana
9c6a5cd542 Comment 2011-08-10 18:18:02 +02:00
Jakub Vrana
afa70c94e5 Whitespace 2011-08-10 18:14:27 +02:00
Jakub Vrana
74e199e488 DELIMITER is used internally by Adminer 2011-08-10 18:13:35 +02:00
Jakub Vrana
71e0db4106 Log to "$database.sql" by default 2011-08-10 18:10:23 +02:00
Jakub Vrana
db2ac19b80 Save is available without JS 2011-08-10 17:43:28 +02:00
Jakub Vrana
b92fe58553 Titles of links in navigation 2011-08-09 13:25:20 +02:00
Jakub Vrana
b358a2dd62 Link titles (http://forum.zdrojak.root.cz/index.php?topic=185.msg1540#msg1540) 2011-08-09 13:14:24 +02:00
Jakub Vrana
c75ee44387 Decode Windows error message 2011-08-09 11:51:18 +02:00
Jakub Vrana
734f0881f0 Remove search by expression 2011-08-09 11:32:11 +02:00
Jakub Vrana
0ced6d33ce Preserve short variable names between versions if possible 2011-08-09 10:22:14 +02:00
Jakub Vrana
b7e1cb09c1 Save bytes 2011-08-08 18:23:32 +02:00
Jakub Vrana
1a30f25311 Default trigger statement 2011-08-08 18:18:16 +02:00
Jakub Vrana
5275ed870b Rename variable 2011-08-08 18:00:26 +02:00
Jakub Vrana
a30f149376 Fix trigger export 2011-08-08 17:56:20 +02:00
Jakub Vrana
b96facf0af New plugin: SQL log 2011-08-08 17:19:56 +02:00
Jakub Vrana
e011b87670 Develop 2011-08-08 16:38:04 +02:00
Jakub Vrana
9ef9b8646e Release 2011-08-08 16:26:10 +02:00
Jakub Vrana
709ef12a88 Improve test 2011-08-08 16:19:23 +02:00
Jakub Vrana
593e071dbf Credits only in commit log 2011-08-08 10:38:41 +02:00
Jakub Vrana
0e2438c98e Comment 2011-08-05 17:53:40 +02:00
Jakub Vrana
52c15bf251 Fix Stop on error
Broken since commit 5576d84980
2011-08-05 17:47:33 +02:00
Jakub Vrana
388c21a0f9 Database name is LIKE pattern 2011-08-05 10:42:11 +02:00
Jakub Vrana
55223eb10c Avoid infinite loop 2011-08-05 09:01:36 +02:00
Jakub Vrana
f0d0bdbf39 Parse 'a\';' on webserver file separation 2011-08-04 23:49:38 +02:00
Jakub Vrana
323f4ab34c MySQL specific characters 2011-08-04 23:18:50 +02:00
Jakub Vrana
ad45a666cc Adminer 3.3.0 compatibility (bug #3383184) 2011-08-03 16:03:42 +02:00
Jakub Vrana
c99c11648d Display schema in title 2011-08-03 10:54:31 +02:00
Jakub Vrana
3efcd4d5b7 Comment 2011-08-03 10:54:29 +02:00
Jakub Vrana
fd65b4c9b9 Comment 2011-08-02 23:30:52 +02:00
Jakub Vrana
8e75d54e44 Save bytes 2011-08-02 17:46:13 +02:00
Jakub Vrana
c91185c435 Fix foreign key schema 2011-08-02 17:36:12 +02:00
Jakub Vrana
bbe46b7c0d Utilize variable 2011-08-02 17:34:21 +02:00
Jan Dolecek
a80c1d1632 Faster foreign keys 2011-08-02 17:33:00 +02:00
Jakub Vrana
2d721016d9 Display error with non-existent row 2011-08-01 21:50:57 +02:00
Jakub Vrana
0ecf84f987 Comment (bug #3380103) 2011-07-29 20:21:13 +02:00
Jakub Vrana
9dda217d55 Sort schemas in PostgreSQL 2011-07-29 17:59:14 +02:00
Jan Dolecek
21e88515c1 Sort databases in PostgreSQL 2011-07-29 17:57:30 +02:00
Jakub Vrana
b01d0cec22 Function found_rows should return null 2011-07-29 17:27:26 +02:00
Jakub Vrana
c82829942c Fast number of rows with big tables in PostgreSQL (thanks to juzna) 2011-07-29 17:08:06 +02:00
Jakub Vrana
2e1d38a920 Rename variable 2011-07-29 16:42:44 +02:00
Jakub Vrana
b1f1b03424 Comment 2011-07-29 16:41:52 +02:00
Jakub Vrana
aeae30ffb7 Don't scroll with AJAX select order and alter move column 2011-07-28 14:25:16 +02:00
Jakub Vrana
5046f71f9a Update design 2011-07-28 13:47:36 +02:00
Jakub Vrana
503034d010 Develop 2011-07-27 10:25:51 +02:00
Jakub Vrana
f4204386c7 Release 2011-07-27 10:16:57 +02:00
Jakub Vrana
f80e15f987 Typo 2011-07-27 09:08:53 +02:00
Jakub Vrana
4b4055432d Reorganize functions 2011-07-27 09:04:43 +02:00
Jakub Vrana
be4f2ef76c More thorough escaping 2011-07-27 08:58:07 +02:00
Jakub Vrana
037c547365 Fix XSS (thanks to Jigal van Hemert) 2011-07-27 08:01:51 +02:00
Jakub Vrana
71efbc545a Remove CodeMirror 2011-07-26 22:20:26 +02:00
Jakub Vrana
1c415dbcf8 WYMeditor 2011-07-26 22:10:45 +02:00
Jakub Vrana
903a0377af Lithuanian translation 2011-07-26 19:42:51 +02:00
Jakub Vrana
628a43156d Hide search for hidden enums (thanks to hever) 2011-07-25 17:20:32 +02:00
Jakub Vrana
6c1598ebaf Save bytes 2011-07-22 16:27:06 +02:00
Jan Dolecek
cde1d43e89 Fix altering of default values in PostgreSQL 2011-07-22 15:34:35 +02:00
Jan Dolecek
06aa0f842b Process list for PostgreSQL 2011-07-22 14:32:16 +02:00
Jakub Vrana
7f05e73689 Missing variable (thanks to juzna) 2011-07-22 13:41:05 +02:00
Jakub Vrana
83d82d6eee Pass $filter to remove_slashes (thanks to juzna) 2011-07-22 13:37:01 +02:00
Jakub Vrana
a3663066b0 Use $adminer->database() instead of DB (thanks to Lubor Bilek) 2011-07-19 17:58:44 +02:00
Jakub Vrana
dc4851dacd Develop 2011-07-19 15:06:16 +02:00
Jakub Vrana
492f78f6fe Fix original favicon 2011-07-19 14:44:43 +02:00
Jakub Vrana
3e3928ea05 Release 2011-07-19 14:28:57 +02:00
Jakub Vrana
3a8395d18e Update externals 2011-07-19 14:11:43 +02:00
Jakub Vrana
ad937f8665 Opera way of prevent default (bug #3367851) 2011-07-18 17:38:16 +02:00
Jakub Vrana
1c768e87fa Typo (bug #3366317) 2011-07-14 10:35:56 +02:00
Jakub Vrana
8a9642b217 Link tables and indexes from SQL command EXPLAIN 2011-07-13 16:31:47 +02:00
Jakub Vrana
ac8a64e88a Editable index names 2011-07-13 15:13:00 +02:00
Jakub Vrana
ead05e6839 Remember export and import options 2011-07-13 13:08:20 +02:00
Jakub Vrana
9e0e161253 Display foreign keys from other schemas in PostgreSQL (thanks to Ondrej Letocha) 2011-07-12 16:03:39 +02:00
Jakub Vrana
33c4623345 Hide schema link in homepage with no schema 2011-07-12 15:45:55 +02:00
Jakub Vrana
67e5cbdb6e Port hint in login form 2011-07-12 15:30:09 +02:00
Jakub Vrana
6027d181a4 Disable auto increment in copy table (bug #3363142) 2011-07-12 15:14:15 +02:00
Jakub Vrana
5fa9f84de0 Empty translation means identifier 2011-07-11 17:33:55 +02:00
Jakub Vrana
9a4cabe898 Simplify single language version 2011-07-11 17:32:52 +02:00
Jakub Vrana
55e2b7597e Save bytes 2011-07-11 16:35:17 +02:00
Jakub Vrana
0474c21108 Hide null byte in HTML (bug #3358372) 2011-07-11 11:32:44 +02:00
Jakub Vrana
7fa8263629 Explain links 2011-07-11 09:55:47 +02:00
Jakub Vrana
a9b2ac915d Display searched columns 2011-07-01 17:15:45 +02:00
Jakub Vrana
d26fb6276e Backslash is special with LIKE (bug #3344307) 2011-06-29 17:37:57 +02:00
Jakub Vrana
87137e55c9 Update translations 2011-06-29 11:16:33 +02:00
Jakub Vrana
46c99c9a0c Comment 2011-06-28 15:52:39 +02:00
Jakub Vrana
ddfe924a38 Update translations 2011-06-27 10:24:05 +02:00
Jakub Vrana
50a2823d36 New design 2011-06-24 09:47:18 +02:00
Jakub Vrana
d938efb1a8 Update translations 2011-06-24 09:47:18 +02:00
Jakub Vrana
7ff2a67ae8 textareaKeydown is Adminer specific 2011-06-24 09:47:17 +02:00
Jakub Vrana
0060c608d6 Save bytes 2011-06-24 09:47:17 +02:00
Jakub Vrana
0d427ad5a8 Save bytes 2011-06-24 09:47:17 +02:00
Jakub Vrana
3ab609188b Comment 2011-06-24 09:47:16 +02:00
Jakub Vrana
c101a1f8bd Comment 2011-06-23 22:11:49 +02:00
Jakub Vrana
08e70e6309 Edit foreign plugin 2011-06-23 22:11:08 +02:00
Jakub Vrana
f8ae1d6360 Prefer NULL to empty string in foreign keys (bug #3323800) 2011-06-23 22:11:08 +02:00
Jakub Vrana
d9c2e80100 Show only errors with Webserver file 2011-06-15 17:16:13 +02:00
Jakub Vrana
aa29b01724 Ctrl+Shift+Enter for Save and continue edit 2011-06-15 17:16:13 +02:00
Jakub Vrana
5576d84980 Display "EXPLAIN SELECT invalid_column" error (thanks to Michal Vrabel) 2011-06-14 10:46:06 +02:00
Jakub Vrana
e0773c0072 Ctrl+Shift+Enter for Save and continue edit 2011-06-14 10:34:04 +02:00
Jakub Vrana
c2965bc88d Save TinyMCE under AJAX 2011-06-13 18:02:16 +02:00
Jakub Vrana
9c370ad504 Check form.onsubmit in ajaxForm 2011-06-13 16:23:51 +02:00
Jakub Vrana
98a00bacc5 Move init to head 2011-06-10 13:36:17 +02:00
Jakub Vrana
e6b520212b Properties @access 2011-06-10 13:32:46 +02:00
Jakub Vrana
2eee7a75aa Get e-mail subject and message from database (Adminer Editor) 2011-06-10 13:25:01 +02:00
Jakub Vrana
3c066debf3 Update translation 2011-06-09 13:50:19 +02:00
Jakub Vrana
c561d70486 Keyboard shortcuts (thanks to Konrad Cerny) 2011-06-08 14:09:20 +02:00
Jakub Vrana
c0c21d4d12 Preserve original timestamp value in multiple update (bug #3312614) 2011-06-08 12:48:39 +02:00
Jakub Vrana
2140f09b68 Don't scroll with AJAX image buttons 2011-06-08 11:23:08 +02:00
Jakub Vrana
56a1bdd7fc Support for other drivers 2011-06-07 15:47:11 +02:00
Jakub Vrana
3a148454c1 Respect defaults and comments checkbox after post (bug #3311791) 2011-06-07 15:00:18 +02:00
Jakub Vrana
05ad2268fa Romanian translation (thanks to .nick .messing) 2011-06-07 14:18:17 +02:00
Jakub Vrana
4bcc0ca27c Display default column value in table overview (thanks to bene) 2011-06-05 08:35:15 +02:00
Jakub Vrana
8372913ab5 Save bytes 2011-06-04 04:28:17 +02:00
Jakub Vrana
955e6b44b3 PostgreSQL supports only functions 2011-06-04 04:19:14 +02:00
Jakub Vrana
bf0c626224 Hide routine language if not required 2011-06-04 03:37:43 +02:00
Jakub Vrana
04127bcbf5 Prepare PostgreSQL routines (thanks to Martin Major) 2011-06-03 15:52:55 +02:00
Jakub Vrana
ce3d18e538 Allow specifying routine language 2011-06-03 15:45:33 +02:00
Jakub Vrana
4787b57d30 Revert "Highlight SQL code in textarea"
This reverts commit 2a1c409681.
2011-06-03 14:55:09 +02:00
Jakub Vrana
42a422e623 Valign image buttons 2011-06-03 14:33:52 +02:00
Jakub Vrana
ae50ef7594 Don't overwrite privileges for existing users 2011-06-03 14:02:19 +02:00
Jakub Vrana
16a72b4521 Shortcut for database privileges 2011-06-03 13:50:20 +02:00
Jakub Vrana
98e410f42d Move schema link to Adminer::homepage method 2011-06-03 13:49:47 +02:00
Jakub Vrana
d09f05b01b Display column collation in tooltip (thanks to bene) 2011-06-01 17:05:09 +02:00
Jakub Vrana
ea4eba4761 Display default column value in tooltip (thanks to bene) 2011-06-01 10:48:07 +02:00
Jakub Vrana
00342a1532 Init TinyMCE in head 2011-05-31 08:01:49 +02:00
Jakub Vrana
0f00277b82 Easier sending of default headers (customization) 2011-05-31 08:01:48 +02:00
Jakub Vrana
2b9bd6f05d Documentation 2011-05-31 08:01:48 +02:00
Jakub Vrana
e8aad6a580 Display foreign key name (thanks to Vladimir Kriska) 2011-05-31 08:01:48 +02:00
Jakub Vrana
5bc419ef32 Plugin tables filter 2011-05-24 17:35:57 +02:00
Jakub Vrana
e641e5ceba Limit commands and import in customization (bug #3194432) 2011-05-24 17:16:13 +02:00
Jakub Vrana
d2c513d1c2 Column names customization (bug #3194500) 2011-05-24 17:03:48 +02:00
Jakub Vrana
6a491373c2 Pagination support in Oracle (bug #3306828) 2011-05-24 15:20:13 +02:00
Jakub Vrana
baf21724cf MySQL allows only (max_allow_packet - 3)-bytes queries (thanks to kluvi) 2011-05-20 18:26:27 +02:00
Jakub Vrana
20a65465c6 PostgreSQL uses 'character varying' (thanks to Lubor Bilek) 2011-05-20 17:52:32 +02:00
Jakub Vrana
e3c4324e49 IBMDB2I engine supports foreign keys 2011-05-17 17:20:32 +02:00
Jakub Vrana
c1c598db1e Save bytes 2011-05-16 16:43:02 +02:00
Jakub Vrana
48981e9acb No manual <noscript> removal required anymore 2011-05-16 16:26:24 +02:00
Jakub Vrana
4ff2f03a0f Alter bit type default value 2011-05-16 16:14:11 +02:00
Jakub Vrana
cbdf09d868 Show version in comment (thanks to David Grudl) 2011-05-12 16:21:40 +02:00
Jakub Vrana
dd39e3aa3f Save bytes 2011-05-10 14:54:10 +02:00
Jakub Vrana
fcc773660e Use Esc to disable in-place edit (bug #3299578) 2011-05-10 11:07:39 +02:00
Jakub Vrana
9bb764162d Save and continue edit of set data type (bug #3298804) 2011-05-08 08:59:26 +02:00
Jakub Vrana
1b47195a7e Prefer speed 2011-05-06 23:08:11 +02:00
Jakub Vrana
b48d6cf42b Version alternative designs 2011-05-06 21:13:55 +02:00
Jakub Vrana
1da3ca544a Display indexes in Oracle (thanks to Marcello Verona) 2011-05-06 18:04:03 +02:00
Jakub Vrana
fb9db96e4d Better plural forms (thanks to Paulius Lescinskas) 2011-05-06 17:11:51 +02:00
Jakub Vrana
a8895c8238 Bit type default value (thanks to Jan Tojnar) 2011-05-06 15:49:23 +02:00
Jakub Vrana
2a1c409681 Highlight SQL code in textarea 2011-05-05 17:02:39 +02:00
Jakub Vrana
bd88113666 Same fields order as in login form 2011-05-05 17:02:38 +02:00
Jakub Vrana
24e66c2812 Respect numbers in autocomplete 2011-05-05 07:46:36 +02:00
Jakub Vrana
dd295df9bd No AJAX for # links 2011-05-05 07:10:09 +02:00
Jakub Vrana
1c1537b089 Fix ALTER export: add columns together with modify 2011-05-05 07:10:09 +02:00
Jakub Vrana
4358ba8181 Use AJAX in foreign key change 2011-05-05 07:10:09 +02:00
Jakub Vrana
6b4ee48ae8 Autocomplete for big foreign keys 2011-05-04 17:19:54 +02:00
Jakub Vrana
daf85306a5 Send e-mail by Ctrl+Enter (Editor) 2011-05-04 17:19:54 +02:00
Jakub Vrana
b6be64e9c0 Use nbsp in foreign keys list 2011-04-23 09:43:39 +02:00
Jakub Vrana
5792eabd9b Use server name for server dump 2011-04-20 17:20:00 +02:00
Jakub Vrana
88d473ae16 Disable auto_increment by default 2011-04-20 17:15:16 +02:00
Jakub Vrana
4091912219 Lithuanian translation 2011-04-17 04:49:50 +02:00
Jakub Vrana
417b29fe65 Fix 'Commands out of sync' (thanks to Vlasta Neubauer) 2011-04-17 04:36:48 +02:00
Jakub Vrana
d94aad0f69 Avoid re-post confirmation in AJAX (bug #3282288) 2011-04-13 06:30:21 -07:00
Jakub Vrana
374e39eb3e Close opened tags 2011-04-12 08:08:58 -07:00
Jakub Vrana
d7183def4f Typo 2011-04-12 06:58:06 -07:00
Jakub Vrana
d3d6a9ae60 Append new index with auto index selection (bug #3282127) 2011-04-09 07:36:22 -07:00
Jakub Vrana
ba357a553e Respect original memory limit (bug #3282091) 2011-04-09 06:49:36 -07:00
Jakub Vrana
91aae7332f Simplify foreign key discovery 2011-04-08 00:50:33 -06:00
Jakub Vrana
3ebfdd30c1 Simpler customization of name() link 2011-04-03 08:27:34 -07:00
Jakub Vrana
46dad6eec3 Comment 2011-04-03 08:17:33 -07:00
Jakub Vrana
d55ba18b43 Customizable favicon 2011-04-03 08:17:26 -07:00
Jakub Vrana
8e46171f14 Update translation 2011-04-01 08:44:26 -07:00
Jakub Vrana
8f046ea234 Develop 2011-03-28 12:54:13 +02:00
Jakub Vrana
8b0acfe8ca Release 2011-03-28 12:44:17 +02:00
Jakub Vrana
324b19d281 Simplify JUSH replacement 2011-03-28 12:41:02 +02:00
Jakub Vrana
87888f1048 Comment 2011-03-28 12:40:14 +02:00
Jakub Vrana
9f58dc6328 Allow more extends with plugin autoloader 2011-03-28 01:51:18 +02:00
Jakub Vrana
63f197213e Show only errors with file upload by default 2011-03-28 00:56:48 +02:00
Jakub Vrana
869193fa18 Plugin autoloader 2011-03-28 00:47:42 +02:00
Jakub Vrana
989d75886f Schema permanent link before mouse move 2011-03-26 02:26:17 +01:00
Jakub Vrana
52a67a9d7c Drop view from alter 2011-03-25 23:59:27 +01:00
Jakub Vrana
8bda0b64ba Allow replacing JS functions in head method 2011-03-25 16:03:36 +01:00
Jakub Vrana
3929e19c7f Do not depend on externals 2011-03-25 15:59:19 +01:00
Jakub Vrana
b5cbbce3cd Save memory 2011-03-25 13:36:12 +01:00
Jakub Vrana
6d0b86bffa Show only SELECT result in 'Only errors' mode 2011-03-25 13:15:49 +01:00
Jakub Vrana
3535d0a325 Parse comment before delimiter 2011-03-25 12:50:21 +01:00
Jakub Vrana
ce9270ba66 Typo 2011-03-24 16:57:43 +01:00
Jakub Vrana
aea84dda9a Fix plugin extending
http://forum.zdrojak.root.cz/index.php?topic=366.0
2011-03-24 16:23:26 +01:00
Jakub Vrana
2dbc73833b PostgreSQL bool in Editor 2011-03-24 11:37:05 +01:00
Jakub Vrana
ebc0c52f5f Comment 2011-03-24 11:33:31 +01:00
Jakub Vrana
92259121a5 Display loader above menu 2011-03-24 11:07:17 +01:00
Jakub Vrana
58347d495e Load page without POST after denied AJAX reload 2011-03-24 08:39:35 +01:00
Jakub Vrana
fa832055c8 Fix AJAX history after reload 2011-03-24 08:24:57 +01:00
Jakub Vrana
5ee14079b8 Avoid double escaping 2011-03-24 02:19:21 +01:00
Jakub Vrana
07e4476e78 Register events after loading JS functions 2011-03-24 01:30:32 +01:00
Jakub Vrana
06e3746510 No HTML tags in <title> 2011-03-23 21:07:21 +01:00
Jakub Vrana
7d2735512f Develop 2011-03-23 18:33:33 +01:00
Jakub Vrana
85fc4b18e2 Release 3.2.1 2011-03-23 18:17:13 +01:00
Jakub Vrana
931f7ef6c6 Fix inline edit in IE9 2011-03-23 14:59:06 +01:00
Jakub Vrana
fa3268269a Use shortcut 2011-03-23 13:35:52 +01:00
Jakub Vrana
e89f42d466 Set MySQL time zone by PHP setting only in Editor 2011-03-23 13:35:35 +01:00
Jakub Vrana
d8cba0eb5d Allow own code in <head> (thanks to Nikolaj Vasilcuk) 2011-03-23 11:57:35 +01:00
Jakub Vrana
2e6ad2037f Display ; in history (thanks to Jan Cerny) 2011-03-22 15:37:40 +01:00
Jakub Vrana
0bc930c52a Avoid big ternary (save memory) 2011-03-22 15:12:38 +01:00
Jakub Vrana
2671a4774f No edit expression with set and binary 2011-03-22 15:11:42 +01:00
Jakub Vrana
04e5250044 Better translation 2011-03-22 14:10:25 +01:00
Jakub Vrana
9565f74745 JS only label 2011-03-21 15:45:16 +01:00
Jakub Vrana
e4cb779bd9 Fix test 2011-03-21 15:44:46 +01:00
Jakub Vrana
43b9502ce1 Respect number of lines in inline-edit 2011-03-21 14:35:58 +01:00
Jakub Vrana
7d152fbabf Utilize bodyKeydown function 2011-03-21 13:53:48 +01:00
Jakub Vrana
b68ddcad2b Send all forms by Ctrl+Enter on <select> 2011-03-21 12:15:38 +01:00
Jakub Vrana
1804f71b96 New plugin: Display constant list of servers in login form 2011-03-21 10:16:01 +01:00
Jakub Vrana
11863ab2ef Comment 2011-03-21 10:14:22 +01:00
Jakub Vrana
2f76084bbd Avoid big ternary operator (saves memory) 2011-03-21 10:06:27 +01:00
Jakub Vrana
08650eecf1 Send form by AJAX on Ctrl+Enter 2011-03-21 01:12:41 +01:00
Jakub Vrana
3fadf35599 Send search form by Ctrl+Enter on <select> 2011-03-21 00:59:40 +01:00
Jakub Vrana
0bf40f9c70 Respect order after search (Editor) 2011-03-19 14:47:44 +01:00
Jakub Vrana
5586c51d18 Send select search form by Enter on <select> 2011-03-18 17:24:29 +01:00
Jakub Vrana
266d83215d Hide JS only elements with disabled JavaScript 2011-03-18 15:03:41 +01:00
Jakub Vrana
10bb2b1526 Time format hint (Editor) 2011-03-18 14:29:36 +01:00
Jakub Vrana
ef3eb908fd Comment 2011-03-18 09:14:07 +01:00
Jakub Vrana
622845b096 Disable maxlength with edit functions 2011-03-18 09:08:27 +01:00
Jakub Vrana
cdeecc3e19 Avoid double AJAX refresh in Chrome 2011-03-17 23:48:38 +01:00
Jakub Vrana
0f4ca18427 Use class for SQL textarea 2011-03-17 16:23:37 +01:00
Jakub Vrana
06ba118199 Avoid JS error with empty table 2011-03-17 10:10:27 +01:00
Jakub Vrana
010b3e9307 Avoid warning with wrong table name 2011-03-17 10:07:58 +01:00
Jakub Vrana
ee229ef618 Compact JUSH links 2011-03-16 13:14:40 +01:00
Jakub Vrana
a8b62ceff0 Update JUSH 2011-03-16 13:13:01 +01:00
Jakub Vrana
4cb08c4ab3 Delete ajaxMain function 2011-03-16 13:08:46 +01:00
Jakub Vrana
a00b52a689 Confirm AJAX POST reload 2011-03-16 13:07:44 +01:00
Jakub Vrana
f60058aa74 Hide empty breadcrumb 2011-03-15 18:35:24 +01:00
Jakub Vrana
8e5d9d0756 Don't save AJAX redirect to history 2011-03-15 18:13:54 +01:00
Jakub Vrana
327b56bcdf Ability to save expression in edit 2011-03-15 17:34:25 +01:00
Jakub Vrana
c708fa1c69 Display AJAX loader favicon only on blur 2011-03-15 12:58:04 +01:00
Jakub Vrana
c41c101aa3 Offer foreign key for id_my_table (thanks to Kevujin) 2011-03-14 14:17:28 +01:00
Jakub Vrana
021e1e319c Allow % in view definer (thanks to Tomas Votruba) 2011-03-14 11:24:52 +01:00
Jakub Vrana
70066b3f37 Avoid double replacing AJAX favicon 2011-03-12 00:37:08 +01:00
Jakub Vrana
d1f6fa9a3a Title and redirect only in correct AJAX state 2011-03-12 00:33:06 +01:00
Jakub Vrana
f6e29f78f6 Ajax reload with POST data 2011-03-12 00:20:27 +01:00
Jakub Vrana
d3609817a1 Don't add the same page to history in AJAX 2011-03-12 00:16:56 +01:00
Jakub Vrana
3a84672355 Update AJAX history for Firefox 4 RC 2011-03-11 23:25:41 +01:00
Jakub Vrana
db40abccc8 Change favicon during AJAX 2011-03-11 23:21:54 +01:00
Jakub Vrana
e52ac37c3e No warning with setting time zone 2011-03-11 22:15:27 +01:00
Jakub Vrana
a8df780fe0 Clear AJAX loader in correct state only 2011-03-11 22:09:54 +01:00
Jakub Vrana
15ab4d28a7 Find exact count on big page only with InnoDB 2011-03-11 21:59:58 +01:00
Jakub Vrana
d48c3593e3 Style AJAX loader 2011-03-11 21:38:54 +01:00
Jakub Vrana
3c5cd76d26 Handler for stopped AJAX requests 2011-03-11 17:00:02 +01:00
Jakub Vrana
2edd575767 Push AJAX state after transfer 2011-03-11 16:50:36 +01:00
Jakub Vrana
6fee8048e0 Display AJAX loader together with page 2011-03-11 16:50:03 +01:00
Jakub Vrana
1a0369adc0 Display default engine only in MySQL (thanks to Honza Krakora) 2011-03-11 11:49:38 +01:00
Jakub Vrana
0a8cd02636 Set MySQL time zone by PHP setting 2011-03-11 11:10:49 +01:00
Jakub Vrana
b0fe26ba3e Tab: scroll to original position in Firefox 2011-03-10 18:06:48 +01:00
Jakub Vrana
5e189f68e2 Avoid ;;;
Revert "Remove useless rtrim"
This reverts commit 3f4ef94f83.
2011-03-10 12:08:25 +01:00
Jakub Vrana
f332258d56 Show databases even with skip_show_database in MySQL 5 (thanks to Radoslaw Kowalewski) 2011-03-10 12:00:08 +01:00
Jakub Vrana
8bf026336f Export table header 2011-03-10 09:51:46 +01:00
Jakub Vrana
dea2dcc878 Update translation 2011-03-10 09:51:46 +01:00
Jakub Vrana
12f7503a56 Polish translation 2011-03-10 09:51:46 +01:00
Jakub Vrana
3f4ef94f83 Remove useless rtrim 2011-03-10 01:17:29 +01:00
Jakub Vrana
5d7a974671 Typo 2011-03-10 00:37:16 +01:00
Jakub Vrana
d06de5512e Use DELIMITER in history 2011-03-10 00:36:22 +01:00
Jakub Vrana
1420b6a259 Esc to focus next field in Tab textarea (thanks to David Grudl) 2011-03-08 13:46:37 +01:00
Jakub Vrana
740ae10a3d Don't send incomplete forms 2011-03-08 13:43:05 +01:00
Jakub Vrana
071e6a2408 Work in IE8
Revert "Handle keypress instead of keydown (bug #3112458)"
This reverts commit 71438d57c3.
2011-03-08 13:14:36 +01:00
Jakub Vrana
61cec7efcc Ignore compiled files only in root 2011-03-07 14:38:25 +01:00
Jakub Vrana
9ff10f8301 Parse UTF-16 and UTF-8 BOM in all text uploads 2011-03-07 14:27:03 +01:00
Jakub Vrana
db030df487 Remove ? from form.action in AJAX (thanks to krucipisek) 2011-03-01 17:02:20 +01:00
Jakub Vrana
de4820cc83 New plugin: Edit textarea 2011-03-01 16:47:01 +01:00
Jakub Vrana
2ad1b6a062 Schema permanent link (thanks to Martin Hujer) 2011-02-28 17:00:42 +01:00
Jakub Vrana
ee653a689e Better select.value detection 2011-02-28 15:57:37 +01:00
Jakub Vrana
5b8361af65 Don't export triggers without table (bug #3193489) 2011-02-28 14:19:41 +01:00
Jakub Vrana
e25e78037f DESC labels (bug #3192356) 2011-02-25 16:22:25 +01:00
Jakub Vrana
8141463609 Update JUSH 2011-02-25 10:56:52 +01:00
Jakub Vrana
32f2000034 Respect default collation (bug #3191489) 2011-02-25 10:49:19 +01:00
Jakub Vrana
f842e33bee Develop 2011-02-24 17:36:19 +01:00
Jakub Vrana
a59de5640c Release 3.2.0 2011-02-24 17:34:25 +01:00
Jakub Vrana
83d659ca42 Comments 2011-02-24 17:30:15 +01:00
Jakub Vrana
37cb691d8e Search for NULL foreign key (Editor) 2011-02-24 15:06:47 +01:00
Jakub Vrana
55bcd40dd5 Utilize table function 2011-02-24 14:48:40 +01:00
Jakub Vrana
b0cf430b2a Use function 2011-02-18 19:37:39 +01:00
Jakub Vrana
544b562cfe Simplify variables 2011-02-18 19:26:23 +01:00
Jakub Vrana
35c8c9224d Escaping 2011-02-18 16:18:14 +01:00
Jakub Vrana
6cb8749916 New plugin: Edit calendar 2011-02-18 16:16:36 +01:00
Jakub Vrana
f9287eef65 Use static variable instead of property 2011-02-17 21:39:20 +01:00
Jakub Vrana
3e94e9d5f9 Support SameOrigin 2011-02-17 21:22:21 +01:00
Jakub Vrana
5677bc4dd9 New plugin: Dump ZIP 2011-02-17 11:47:36 +01:00
Jakub Vrana
8ab6fffe74 Centralize dump_headers 2011-02-17 11:43:21 +01:00
Jakub Vrana
b1d8bfba36 Print <database> only once 2011-02-17 11:41:19 +01:00
Jakub Vrana
15cf62ce35 New plugins: version-noverify, frames 2011-02-17 09:52:40 +01:00
Jakub Vrana
052828422d Save complete original text 2011-02-15 19:42:22 +01:00
Jakub Vrana
eb41053c61 Improve work with references 2011-02-15 19:42:21 +01:00
Jakub Vrana
e4deeb61ba Utilize location.protocol 2011-02-15 18:11:43 +01:00
Jakub Vrana
15715b32ff Export SQL command result (bug #3116854) 2011-02-15 17:22:50 +01:00
Jakub Vrana
0836c34aef EnumOption plugin 2011-02-10 18:16:10 +01:00
Jakub Vrana
045bce3c9f Use editVal for set values 2011-02-10 11:05:40 +01:00
Jakub Vrana
24fac38d26 Better support for bit data type 2011-02-10 11:04:38 +01:00
Jakub Vrana
d663eed8a5 Update plugins 2011-02-09 22:06:08 +01:00
Jakub Vrana
26b475312d Update plugins 2011-02-09 21:15:34 +01:00
Jakub Vrana
cd6d2fc7a3 Typos 2011-02-09 18:39:25 +01:00
Jakub Vrana
4f9ff89fed Plugins 2011-02-09 18:09:01 +01:00
Jakub Vrana
37ecc2932b Don't call procedures by AJAX (may create tables) 2011-02-09 15:31:20 +01:00
Jakub Vrana
fa63eba7b9 Don't copy tables (to the same database) by AJAX 2011-02-09 15:29:51 +01:00
Jakub Vrana
1be289e8f5 Optimize compiling files 2011-02-09 15:28:45 +01:00
Jakub Vrana
ecc8166f08 Scroll to top with AJAX 2011-02-08 21:52:55 +01:00
Jakub Vrana
ad279e1171 Fix inline edit in IE8 (thanks to kozotoc) 2011-02-08 21:41:57 +01:00
Jakub Vrana
3eba7310da Fix saving schema to cookie in Opera and Firefox 4 2011-02-08 20:58:31 +01:00
Jakub Vrana
806264851e Use IS NULL operator for null value in where_link function 2011-02-08 19:59:16 +01:00
Jakub Vrana
bb4da636e9 Update translations 2011-02-08 19:58:33 +01:00
Jakub Vrana
1518d4bf64 Turkish translation 2011-02-08 19:57:06 +01:00
Jakub Vrana
99b980ab60 Avoid % with operator in Editor (forum 4090988) 2011-02-06 12:42:24 +01:00
Jakub Vrana
3fa68cef99 Slovenian translation 2011-02-06 12:32:00 +01:00
Jakub Vrana
cd68210224 Display upload_max_filesize 2011-02-03 10:21:07 +01:00
Jakub Vrana
a379bde2a4 Save bytes 2011-02-03 10:15:52 +01:00
Jakub Vrana
fb7b5ce29e No auto-focus with POST 2011-02-02 16:28:22 +01:00
Jakub Vrana
efd7b901a7 Avoid warning 2011-02-01 16:26:21 +01:00
Jakub Vrana
4cab347f92 Better auto-focus 2011-02-01 16:21:10 +01:00
Jakub Vrana
37d814649a Utilize oids in PostgreSQL 2011-02-01 16:19:39 +01:00
Jakub Vrana
741b19bc79 Copy tables (bug #3158027) 2011-02-01 14:12:22 +01:00
Jakub Vrana
c5b594d067 Call onchange 2011-02-01 14:11:25 +01:00
Jakub Vrana
ca4de555ba Whitespace 2011-02-01 10:16:31 +01:00
Jakub Vrana
b5a11cde84 Explain numbers 2011-01-31 21:01:07 +01:00
Jakub Vrana
f195903964 Use rel="noreferrer" for documentation links 2011-01-31 20:35:48 +01:00
Jakub Vrana
79fa7dab3b Minimize the chance of displaying message on different page (thanks to Tomas Brukner) 2011-01-31 20:09:08 +01:00
Jakub Vrana
ceef6bc6d3 Focus first field with insert (bug #3126501) 2011-01-31 15:57:28 +01:00
Jakub Vrana
e26b1864e3 Avoid fatal error (bug #3110257) 2011-01-31 15:49:07 +01:00
Jakub Vrana
1d47454079 Hide credentials for SQLite 2011-01-31 14:48:40 +01:00
Jakub Vrana
9e8ab1df31 Whitespace 2011-01-31 14:36:47 +01:00
Jakub Vrana
fbc668cfe3 Simplify JavaScript 2011-01-31 14:36:31 +01:00
Jakub Vrana
0997455fb6 Revert "Better <noscript> removal"
This reverts commit f40b874c0b.
2011-01-31 11:57:35 +01:00
Jakub Vrana
dfc03ca74a Comment 2011-01-31 11:02:00 +01:00
Jakub Vrana
56b0377451 Import supports TSV 2011-01-31 11:01:29 +01:00
Jakub Vrana
675ac01cc1 Ability to search by expression in select (bug #3158017) 2011-01-30 02:12:06 +01:00
Jakub Vrana
ae84525613 Save bytes 2011-01-30 02:12:06 +01:00
Jakub Vrana
241fc4ef6c Ctrl+Up and Down in edit and in-place edit 2011-01-25 17:13:57 +01:00
Jakub Vrana
0926122e14 Use password input for _md5 and _sha1 fields (Editor) 2011-01-25 16:40:33 +01:00
Jakub Vrana
fdea1970d0 Simplify AJAX redirect 2011-01-25 16:13:31 +01:00
Jakub Vrana
4a5eb8b408 Create table keyboard shortcuts: Ctrl+Up, Ctrl+Down 2011-01-25 15:26:13 +01:00
Jakub Vrana
57ec8f0266 Disable AJAX in database change 2011-01-24 15:58:46 +01:00
Jakub Vrana
12443f2f4c Send <input type='image'> by AJAX 2011-01-24 15:35:06 +01:00
Jakub Vrana
d6611f40cb Use generic AJAX 2011-01-24 14:15:44 +01:00
Jakub Vrana
684e70d07a Search for empty enum 2011-01-21 17:36:56 +01:00
Jakub Vrana
f40b874c0b Better <noscript> removal 2011-01-21 17:36:50 +01:00
Jakub Vrana
39d52932f2 Save dump options to cookie 2011-01-21 11:23:31 +01:00
Jakub Vrana
d893e45162 Disable wrap in SQL textarea 2011-01-21 11:23:30 +01:00
Jakub Vrana
ef9d6d4512 Save memory 2011-01-20 23:12:34 +01:00
Jakub Vrana
33aec2c764 Move <td> from Adminer::backwardKeysPrint 2011-01-18 17:33:17 +01:00
Jakub Vrana
c0682062ca Use $adminer->editVal in enum_input function 2011-01-18 14:06:23 +01:00
Jakub Vrana
5b6b0e1b85 Case insensitive M:N relation 2011-01-18 11:25:53 +01:00
Jakub Vrana
13155372b5 No error for big text length (bug #264133) 2011-01-10 17:23:47 +01:00
Jakub Vrana
5e4450ba11 Ability to delete blob (Editor) 2011-01-10 16:56:51 +01:00
Jakub Vrana
3a11358dc7 Use IN for search in numeric fields (Editor) 2011-01-06 09:45:45 +01:00
Jakub Vrana
21192be01e Typo 2011-01-06 09:30:19 +01:00
Jakub Vrana
7416164966 Homepage customization 2011-01-06 09:30:07 +01:00
Jakub Vrana
d7a3e415d5 Don't use AJAX with Alt 2011-01-03 16:53:50 +01:00
Jakub Vrana
10ff7870f5 Change language by JS for AJAX 2011-01-03 16:29:01 +01:00
Jakub Vrana
e37c427e87 Function get_lang useful for customization 2010-12-30 13:53:39 +01:00
Jakub Vrana
fce2312c55 Avoid nowrap on printer 2010-12-30 13:30:08 +01:00
Jakub Vrana
876af58944 Fix sid function 2010-12-30 10:58:26 +01:00
Jakub Vrana
29d7d6ce52 Modify dump link in AJAX 2010-12-30 10:58:26 +01:00
Jakub Vrana
61b1fd57e0 Permanent link in schema 2010-12-30 10:57:23 +01:00
Jakub Vrana
850d1aa130 Report errors only 2010-12-29 17:28:53 +01:00
Jakub Vrana
ed85096367 Avoid double usage of fieldName function 2010-12-28 12:32:47 +01:00
Jakub Vrana
f30fd121c1 Work without session.use_cookies (bug #3138640) 2010-12-20 18:09:13 +01:00
Jakub Vrana
0449351a60 Report errors only in primary connection 2010-12-17 18:25:24 +01:00
Jakub Vrana
9eced7872d Display total time in show only errors mode in SQL command 2010-12-17 18:11:06 +01:00
Jakub Vrana
d7fdd06f12 Comment 2010-12-17 17:13:07 +01:00
Jakub Vrana
be58b9cdbc Escape \n in JSON 2010-12-16 22:52:03 +01:00
Jakub Vrana
991944e82b Fix partitions count (thanks to Igor Aufricht) 2010-12-16 10:52:59 +01:00
Jakub Vrana
fe0866724d Portuguese translation 2010-12-15 18:00:20 +01:00
Jakub Vrana
c29562d369 Declare global variables to allow including from inside a function 2010-12-15 17:41:04 +01:00
Jakub Vrana
5a2c0646d4 Link to EXPLAIN output 2010-12-10 17:54:57 +01:00
Jakub Vrana
3fad0c6ef7 Show number of connections (thanks to fos4) 2010-12-10 17:08:07 +01:00
Jakub Vrana
8a6669f4fa Shorten query in processlist (thanks to fos4) 2010-12-10 17:05:30 +01:00
Jakub Vrana
30c4bec9a7 Auto-select index type after selecting column 2010-12-10 01:16:01 +01:00
Jakub Vrana
79c145a108 Remove <noscript> in AJAX 2010-12-10 01:09:19 +01:00
Jakub Vrana
16c7dc6bb6 Auto focus new table name 2010-12-08 00:42:22 +01:00
Jakub Vrana
c8b14a1eff Default type is int or integer 2010-12-08 00:25:01 +01:00
Jakub Vrana
694a3420fa No AJAX for right-click 2010-12-06 01:13:03 +01:00
Jakub Vrana
5f9282f132 No AJAX for non-HTML output 2010-12-06 01:12:55 +01:00
Jakub Vrana
fc6e71a930 Disable AJAX export 2010-12-03 19:42:10 +01:00
Jakub Vrana
53409fcbe8 AJAX: fix active link 2010-12-03 19:42:10 +01:00
Jakub Vrana
08d51f2ecf Fix index length 2010-12-03 16:13:01 +01:00
Jakub Vrana
01125fd24e Fix event.returnValue 2010-12-03 13:40:37 +01:00
Jakub Vrana
f2c34f43dc Avoid fatal error 2010-12-02 09:56:10 +01:00
Jakub Vrana
9bb0fdc91b Display login in auth form (regression) 2010-12-01 18:44:17 +01:00
Jakub Vrana
ac8ff42689 Typo 2010-12-01 17:49:10 +01:00
Jakub Vrana
ddaa8947ee History: edit all 2010-12-01 09:40:39 +01:00
Jakub Vrana
02d6b90889 CR+LF in CSV export 2010-12-01 09:39:47 +01:00
Jakub Vrana
d0cf5a863f Create table options width 2010-11-29 22:08:42 +01:00
Jakub Vrana
06a916102d Disable AJAX for schema change 2010-11-29 22:02:11 +01:00
Jakub Vrana
a4982c90e0 MS SQL: Create primary key for Auto Increment column 2010-11-29 22:02:11 +01:00
Jakub Vrana
d7079f1778 MS SQL: Foreign key in create table 2010-11-29 22:02:11 +01:00
Jakub Vrana
e86c15479f Reset value for NULL in inline edit 2010-11-29 22:02:11 +01:00
Jakub Vrana
9f69d7ae93 MS SQL: Do not update AI value 2010-11-29 22:02:10 +01:00
Jakub Vrana
4a2fe5eac1 MS SQL: Foreign key in create table 2010-11-29 22:02:10 +01:00
Jakub Vrana
ca27ffc2c4 Display 0 in SQLite (bug #3120685) 2010-11-29 11:12:06 +01:00
Jakub Vrana
8c10fc05f4 Don't print error message with no error (bug #3118538) 2010-11-26 14:13:38 +01:00
Jakub Vrana
50bb1f8d84 Fix active class 2010-11-26 13:06:07 +01:00
Jakub Vrana
e197ccd433 Respect error in EXPLAIN (bug #3118536) 2010-11-26 11:09:50 +01:00
Jakub Vrana
3e1fca97be Utilize js_escape 2010-11-26 10:59:16 +01:00
Jakub Vrana
b7cd6520af No AJAX in drop table, drop database and logout 2010-11-26 10:58:22 +01:00
Jakub Vrana
8194002102 AJAX only with login 2010-11-26 10:32:30 +01:00
Jakub Vrana
8ce9ba616d Don't rely on headers_sent 2010-11-25 10:40:16 +01:00
Jakub Vrana
87fa3d45d7 Don't send login form by AJAX 2010-11-25 10:31:35 +01:00
Jakub Vrana
38894b2977 Send all forms by AJAX 2010-11-23 13:01:30 +01:00
Jakub Vrana
0e29a6a783 AJAX title 2010-11-22 18:13:07 +01:00
Jakub Vrana
341290ce12 Run <script> in AJAX 2010-11-22 18:00:53 +01:00
Jakub Vrana
6585b23ba8 Generic AJAX links 2010-11-22 18:00:53 +01:00
Jakub Vrana
8ad4809bc0 Use class="active" instead of <b> 2010-11-22 18:00:53 +01:00
Jakub Vrana
c108c7a96f Specify UTF-8 (bug #3097662) 2010-11-19 16:14:17 +01:00
Jakub Vrana
9b267eeceb Finish PDO_OCI 2010-11-19 16:13:49 +01:00
Jakub Vrana
4c9044800d Refresh breadcrumb and title in AJAX 2010-11-19 15:50:56 +01:00
Jakub Vrana
a97c45fc9b Utilize innerText or textContent in inline edit 2010-11-19 15:50:55 +01:00
Jakub Vrana
fe2d55ac00 Caret is at the end after setting the value 2010-11-19 15:50:09 +01:00
Jakub Vrana
71438d57c3 Handle keypress instead of keydown (bug #3112458) 2010-11-19 15:07:06 +01:00
Jakub Vrana
293fc0fd60 Merge branch ajax 2010-11-16 13:47:57 +01:00
Jakub Vrana
48ba0c44f9 Release 3.1.0 2010-11-16 13:18:24 +01:00
Jakub Vrana
7dc1fc7ad4 Update translations 2010-11-16 11:18:36 +01:00
Jakub Vrana
b4b59779b9 Include only active translations 2010-11-15 16:54:08 +01:00
Jakub Vrana
8db1469dbc Text direction 2010-11-15 16:24:54 +01:00
Jakub Vrana
d0106295f7 Update translations 2010-11-15 16:20:50 +01:00
Jakub Vrana
caf1ba8af5 Bump version 2010-11-12 18:07:29 +01:00
Jakub Vrana
87d617c68d No extra newline for English 2010-11-12 18:00:19 +01:00
Jakub Vrana
3d4b831280 Whitespace 2010-11-12 17:55:13 +01:00
Jakub Vrana
9802869d0a Merge from master 2010-11-12 17:52:09 +01:00
Jakub Vrana
d8c7ea9837 Highlighting only inside <code> 2010-11-12 17:17:46 +01:00
Jakub Vrana
b535853694 Full AJAX only with pushState to work correctly with history 2010-11-12 17:09:54 +01:00
Jakub Vrana
af0cacba90 Update translations 2010-11-12 14:05:02 +01:00
Jakub Vrana
620df3c44a Move up create table link (thanks to Filip Prochazka) 2010-11-11 13:40:04 +01:00
Jakub Vrana
f4256013a9 Hide hidden columns in PostgreSQL (thanks to Pavel Stehule) 2010-11-11 10:51:20 +01:00
Jakub Vrana
540de0b7c9 RTL text direction support 2010-11-11 10:12:26 +01:00
Jakub Vrana
5bfeeef402 Update translations 2010-11-11 10:00:57 +01:00
Jakub Vrana
7d052b2680 Arabic translation 2010-11-10 17:44:38 +01:00
Jakub Vrana
8aac3b6e05 Dual licensing: Apache or GPL 2010-11-09 12:59:51 +01:00
Jakub Vrana
15ccbec1fd Comments 2010-11-08 09:49:42 +01:00
Jakub Vrana
2ebf4d75d1 Offset probably required in fetch_field (bug #3100185) 2010-11-04 09:51:23 +01:00
Jakub Vrana
014373ca82 Hide hashes in select 2010-11-04 09:51:23 +01:00
Jakub Vrana
7abc734607 Comment 2010-11-04 09:51:23 +01:00
Jakub Vrana
9e51a1d890 Breadcrumb on No extension page 2010-11-04 00:12:01 +01:00
Jakub Vrana
865453f7c9 Comments 2010-11-04 00:00:45 +01:00
Jakub Vrana
cec86f5f9d Link to refresh database cache (bug #3102451) 2010-11-03 23:59:49 +01:00
Jakub Vrana
81f58ed909 Link more foreign keys 2010-11-03 08:40:10 +01:00
Jakub Vrana
c64557aaf5 Support 'character varying' 2010-11-01 16:10:17 +01:00
Jakub Vrana
dca7c51bd3 Hidden Polish translation 2010-11-01 01:22:02 +01:00
Jakub Vrana
9cdeb31ca7 Improve description 2010-10-30 15:25:30 +02:00
Jakub Vrana
5a99ef5cf0 Save bytes 2010-10-30 09:21:42 +02:00
Jakub Vrana
bec5ef28ec Comments 2010-10-30 01:56:49 +02:00
Jakub Vrana
e225d22f97 TSV export and import (bug #3097657) 2010-10-29 18:02:20 +02:00
Jakub Vrana
772f71a780 Print CSV header only in CSV 2010-10-29 17:51:52 +02:00
Jakub Vrana
e908155196 Increase version 2010-10-29 17:44:22 +02:00
Jakub Vrana
164cd3bbb8 Report errors in data export 2010-10-29 17:29:35 +02:00
Jakub Vrana
be3410f822 Simplify dumpOutput, dumpFormat and dumpData methods 2010-10-29 17:23:03 +02:00
Jakub Vrana
095d472366 Customizable export 2010-10-29 17:03:02 +02:00
Jakub Vrana
a2443670f8 Always display all drivers (bug #3097666) 2010-10-29 15:24:06 +02:00
Jakub Vrana
753909ecea Support for virtual foreign keys 2010-10-29 14:01:19 +02:00
Jakub Vrana
43f936a0d8 Links 2010-10-29 00:26:47 +02:00
Jakub Vrana
b05684a5c9 Order by DESC with grouping 2010-10-24 11:52:01 +02:00
Jakub Vrana
8aeb9be791 Show hash columns 2010-10-24 11:43:03 +02:00
Jakub Vrana
9bc9b9fa3a Don't overwrite variable 2010-10-24 11:36:32 +02:00
Jakub Vrana
c918bc83f3 Use shortest PostgreSQL $$ 2010-10-24 08:25:40 +02:00
Jakub Vrana
b7b40b5bd9 Link to bookmark SQL command 2010-10-24 00:45:12 +02:00
Jakub Vrana
b69f9b4a60 Parse MS SQL identifiers 2010-10-24 00:35:27 +02:00
Jakub Vrana
aa1bed7249 Parse PostgreSQL multiline strings 2010-10-24 00:24:32 +02:00
Jakub Vrana
7e5bf6e383 Use DELIMITER only in MySQL 2010-10-24 00:03:13 +02:00
Jakub Vrana
fe0690851f Allow redefining editInput for enum (bug #3048711) 2010-10-23 00:28:48 +02:00
Jakub Vrana
677687fc1a Don't highlight empty queries 2010-10-23 00:02:46 +02:00
Jakub Vrana
5002b89bd5 Big numbers without E 2010-10-23 00:02:24 +02:00
Jakub Vrana
e9ae743578 Fix set prefill 2010-10-22 23:38:57 +02:00
Jakub Vrana
04eccbad62 Allow bigger numbers under 32 bits 2010-10-22 23:36:56 +02:00
Jakub Vrana
28f21aaa6c Escape JavaScript strings (bug #3093243) 2010-10-22 23:07:30 +02:00
Jakub Vrana
7d601c07fc Allow only apostrophes in enums
Use possessive quantifier in enum to fit in backtrack limit
2010-10-22 22:42:40 +02:00
Jakub Vrana
3da0f3be13 Timestamp in export 2010-10-22 21:46:35 +02:00
Jakub Vrana
b3c8d71163 Print data in only_errors mode (important for ALTER export) 2010-10-22 21:27:38 +02:00
Jakub Vrana
6775ac1296 Whitespace 2010-10-22 16:27:16 +02:00
Jakub Vrana
178e23dfe2 Categorize translations 2010-10-22 16:26:31 +02:00
Jakub Vrana
606b10c5e6 Update changes 2010-10-22 14:34:16 +02:00
Jakub Vrana
18e158fcdf Option to show only errors in SQL command 2010-10-22 14:31:46 +02:00
Jakub Vrana
b12756643f Comment 2010-10-22 14:25:56 +02:00
Jakub Vrana
07df8c63c9 Fix translation 2010-10-20 22:53:15 +02:00
Jakub Vrana
1ee0e69b7b Comments 2010-10-20 22:47:15 +02:00
Jakub Vrana
c1363a6ae4 Update translation 2010-10-20 22:44:06 +02:00
Jakub Vrana
0f3a525801 Uses own XSS protection 2010-10-20 22:27:51 +02:00
Jakub Vrana
cb153ac0d1 Auto-focus database name 2010-10-20 12:40:27 +02:00
Jakub Vrana
97344335e7 Improve favicon (thanks to tiso) 2010-10-20 10:19:11 +02:00
Jakub Vrana
b37435d716 Don't use AJAX with Ctrl 2010-10-20 00:15:33 +02:00
Jakub Vrana
8e02d5dfd3 Update TODO 2010-10-19 17:46:28 +02:00
Jakub Vrana
9d47d1e64d Whitespace 2010-10-19 17:29:27 +02:00
Jakub Vrana
84d9ecf0c9 Highlight and edit SQL command in processlist 2010-10-19 16:54:48 +02:00
Jakub Vrana
0ba6eaa3e2 Handle sending the form without AJAX after AJAX request 2010-10-19 16:44:12 +02:00
Jakub Vrana
0311083b49 Comment 2010-10-19 13:28:43 +02:00
Jakub Vrana
dfa1a98829 Merge branch 'master' into ajax 2010-10-19 01:45:48 +02:00
Jakub Vrana
c313dd83a2 Deferred operations by AJAX instead of JS (doesn't require sending token) 2010-10-19 01:40:49 +02:00
Jakub Vrana
1b66afcb82 Disable repetitive events as soon as possible 2010-10-19 01:06:30 +02:00
Jakub Vrana
772f05178d Files can be disabled 2010-10-19 00:58:45 +02:00
Jakub Vrana
c5ee9778b4 Set in-place input name after value to never send empty data 2010-10-19 00:57:37 +02:00
Jakub Vrana
4fe9b606ec Don't send SQL commands by AJAX (can change navigation and flushes output) 2010-10-19 00:22:09 +02:00
Jakub Vrana
21e70bc00f IE compatibility 2010-10-19 00:11:54 +02:00
Jakub Vrana
a93bc19108 Create confirm function 2010-10-18 23:57:39 +02:00
Jakub Vrana
d9fbb905f3 SQL command by AJAX 2010-10-18 23:44:00 +02:00
Jakub Vrana
b50a0fc615 Disable zend.ze1_compatibility_mode (bug #3089645) 2010-10-18 23:09:26 +02:00
Jakub Vrana
6e3c7cba1f Use AJAX for pagination 2010-10-18 22:39:17 +02:00
Jakub Vrana
31afb968bc Last page with empty result (thanks to Frantisek Svoboda) 2010-10-18 22:20:17 +02:00
Jakub Vrana
d8d419317d Last page with empty result (thanks to Frantisek Svoboda) 2010-10-18 22:17:43 +02:00
Jakub Vrana
7f15b99d8f Maria renamed to Aria 2010-10-18 18:26:21 +02:00
Jakub Vrana
388680ac62 Maria renamed to Aria 2010-10-18 16:56:10 +02:00
Jakub Vrana
390e38b8f5 Load long texts for inline-edit by AJAX
Display link to current page only under AJAX
2010-10-18 13:57:22 +02:00
Jakub Vrana
3a1fcdba4e Develop 2010-10-18 10:34:47 +02:00
Jakub Vrana
da9d5f3e49 Release 2010-10-18 10:28:03 +02:00
Jakub Vrana
78adfc2e3a Cancel link for multi-edit 2010-10-18 07:54:08 +02:00
Jakub Vrana
a1f2769309 Merge branch 'master' into ajax 2010-10-18 07:52:49 +02:00
Jakub Vrana
28f494783f Multi save and delete by AJAX 2010-10-18 07:43:50 +02:00
Jakub Vrana
f7d4587880 Hide SQL command link in case of an error 2010-10-18 07:38:23 +02:00
Jakub Vrana
d49903b21d Report invalid schema 2010-10-18 02:15:58 +02:00
Jakub Vrana
09327efdaf Don't download script with no tables 2010-10-18 02:15:13 +02:00
Jakub Vrana
ea258302b4 Fullstops 2010-10-18 02:06:41 +02:00
Jakub Vrana
8d565e63ab Respect scheme support 2010-10-18 01:53:31 +02:00
Jakub Vrana
16b5be1e8d Don't download tables count without databases list 2010-10-18 01:48:27 +02:00
Jakub Vrana
ad9edea30b Typo (bug #3089347) 2010-10-18 01:23:10 +02:00
Jakub Vrana
6f5c1981a0 CSRF protection of included JavaScript 2010-10-18 01:20:02 +02:00
Jakub Vrana
031a82a4ad Remove duplicate statement 2010-10-18 00:33:18 +02:00
Jakub Vrana
e3b829701e Save and continue by AJAX 2010-10-18 00:09:29 +02:00
Jakub Vrana
de24145d81 Clear POST with AJAX redirect 2010-10-18 00:05:39 +02:00
Jakub Vrana
a93e069d06 Edit, clone and delete by AJAX 2010-10-17 23:54:41 +02:00
Jakub Vrana
0782a7b2c1 Save '' instead of NULL for empty char (some drivers don't have varchar) 2010-10-17 22:37:06 +02:00
Jakub Vrana
9db4259409 Introduce Adminer::headers method 2010-10-17 22:13:32 +02:00
Jakub Vrana
1cd506ee1e Comments 2010-10-17 21:58:02 +02:00
Jakub Vrana
b835ce4ef4 Use template1 database as default (bug #3088192) 2010-10-17 21:39:34 +02:00
Jakub Vrana
6ab272b72c Allow comments in translations 2010-10-17 21:12:37 +02:00
Jakub Vrana
44ae8c8766 Check collation 2010-10-17 18:45:05 +02:00
Jakub Vrana
53d7f0306d Save NULL for empty string in inline-edit 2010-10-17 16:37:22 +02:00
Jakub Vrana
210802d1c4 Change message to "increase Text length" 2010-10-17 16:11:21 +02:00
Jakub Vrana
abe5e7b0a7 Minimal inline edit input width 2010-10-17 16:11:21 +02:00
Jakub Vrana
41f4c62fcd Change message to "increase Text length" 2010-10-17 16:07:09 +02:00
Jakub Vrana
d82e69636c Minimal inline edit input width 2010-10-17 16:00:29 +02:00
Jakub Vrana
51e609c461 Disable creating SQLite databases with extension other than db, sdb, sqlite 2010-10-17 08:22:36 +02:00
Jakub Vrana
1a5bec94d9 Send the form by AJAX with Ctrl+Enter 2010-10-17 08:02:12 +02:00
Jakub Vrana
ea38096433 Merge from master 2010-10-17 07:55:58 +02:00
Jakub Vrana
a6bbe1bb3b Save select data by AJAX 2010-10-17 07:50:40 +02:00
Jakub Vrana
8d4b241156 Save bytes 2010-10-17 07:19:01 +02:00
Jakub Vrana
644c355d94 Send the form by Ctrl+Enter in all textareas 2010-10-17 07:16:32 +02:00
Jakub Vrana
7eb85a75f8 Use AJAX in select 2010-10-17 02:22:22 +02:00
Jakub Vrana
420faa3dc4 Comments 2010-10-17 02:10:42 +02:00
Jakub Vrana
53804a2c20 Immunity against CRLF 2010-10-16 22:36:01 +02:00
Jakub Vrana
0198c36c90 Information_schema can be case sensitive (bug #3088228) 2010-10-16 16:38:20 +02:00
Jakub Vrana
1a8d7f1733 Use LIKE for text comparison in MS SQL (bug #3088222) 2010-10-16 16:31:01 +02:00
Jakub Vrana
1cf374bf48 Rename functions (avoid conflict with WordPress) 2010-10-16 15:47:51 +02:00
Jakub Vrana
207673f06c Typo (thanks to Frank Bueltge) 2010-10-16 15:45:21 +02:00
Jakub Vrana
faa6e7edd7 Quote JavaScript strings (thanks to bene) 2010-10-16 15:36:23 +02:00
Jakub Vrana
5875f6db0c Don't quote collation (MS SQL 2005) 2010-10-16 15:31:25 +02:00
Jakub Vrana
14ca6f0931 Read view definition (bug #3088228) 2010-10-16 15:20:46 +02:00
Jakub Vrana
ec4b1cf915 Use table aliases (bug #3088214) 2010-10-16 08:23:34 +02:00
Jakub Vrana
7b4aecb86e Comment 2010-10-15 17:11:39 +02:00
Jakub Vrana
01e967d26c Catalan translation 2010-10-15 16:39:18 +02:00
Jakub Vrana
52b9820ebc Comment 2010-10-15 15:51:40 +02:00
Jakub Vrana
dc8ac1da25 Develop 2010-10-15 14:09:44 +02:00
182 changed files with 18348 additions and 3376 deletions

5
.gitignore vendored
View File

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

20
.gitmodules vendored
View File

@@ -1,6 +1,18 @@
[submodule "jush"]
path = externals/jush
url = git://jush.git.sourceforge.net/gitroot/jush/jush
[submodule "jsmin-php"]
path = externals/jsmin-php
url = git://github.com/rgrove/jsmin-php.git
url = git://git.code.sf.net/p/jush/git
[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
[submodule "JsShrink"]
path = externals/JsShrink
url = git://github.com/vrana/JsShrink.git

View File

@@ -28,19 +28,27 @@ 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)) {
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);
select($result, $connection2);
} else {
echo "<p class='message'>" . lang('Routine has been called, %d row(s) affected.', $connection->affected_rows) . "\n";
}
} while ($connection->next_result());
if ($out) {
select($connection->query("SELECT " . implode(", ", $out)));
}
@@ -57,8 +65,13 @@ if ($in) {
$name = $field["field"];
echo "<tr><th>" . $adminer->fieldName($field);
$value = $_POST["fields"][$name];
if ($value != "" && ereg("enum|set", $field["type"])) {
$value = intval($value);
if ($value != "") {
if ($field["type"] == "enum") {
$value = +$value;
}
if ($field["type"] == "set") {
$value = array_sum($value);
}
}
input($field, $value, (string) $_POST["function"][$name]); // param name can be empty
echo "\n";
@@ -67,6 +80,6 @@ if ($in) {
}
?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Call'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

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,133 +12,144 @@ 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);
$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 && !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"]);
ksort($row["fields"]);
$orig_field = reset($orig_fields);
$after = "FIRST";
foreach ($_POST["fields"] as $key => $field) {
$after = " FIRST";
foreach ($row["fields"] as $key => $field) {
$foreign_key = $foreign_keys[$field["type"]];
$type_field = (isset($foreign_key) ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined 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);
$all_fields[] = array($field["orig"], $process_field, $after);
if ($process_field != process_field($orig_field, $orig_field)) {
$fields[] = array($field["orig"], $process_field, $after);
if ($field["orig"] != "" || $after) {
$use_all_fields = true;
}
}
if (isset($foreign_key)) {
$foreign[] = ($TABLE != "" ? "ADD" : " ") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")" . (in_array($field["on_delete"], $on_actions) ? " ON DELETE $field[on_delete]" : "");
if ($foreign_key !== null) {
$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"]);
$after = " AFTER " . idf_escape($field["field"]);
} elseif ($field["orig"] != "") {
$use_all_fields = true;
$fields[] = array($field["orig"]);
}
if ($field["orig"] != "") {
$orig_field = next($orig_fields);
}
}
$partitioning = "";
if (in_array($_POST["partition_by"], $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 (!$orig_field) {
$after = "";
}
}
$partitioning .= "\nPARTITION BY $_POST[partition_by]($_POST[partition])" . ($partitions // $_POST["partition"] can be expression, not only column
}
$partitioning = "";
if ($partition_by[$row["partition_by"]]) {
$partitions = array();
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 $row[partition_by]($row[partition])" . ($partitions // $row["partition"] can be expression, not only column
? " (" . implode(",", $partitions) . "\n)"
: ($_POST["partitions"] ? " PARTITIONS " . intval($_POST["partitions"]) : "")
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
);
} elseif ($TABLE != "" && support("partitioning")) {
} 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.');
}
queries_redirect(ME . "table=" . urlencode($_POST["name"]), $message, alter_table(
$name = trim($row["name"]);
queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table(
$TABLE,
$_POST["name"],
$fields,
$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"] != "" ? preg_replace('~\\D+~', '', $_POST["Auto_increment"]) : ""),
$row["Comment"],
($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""),
($row["Collation"] && $row["Collation"] != $table_status["Collation"] ? $row["Collation"] : ""),
($row["Auto_increment"] != "" ? +$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" => "")),
"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" : "")))),
"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 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) {
@@ -148,38 +162,58 @@ 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 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" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
<?php echo ($engines ? "<select name='Engine' onchange='helpClose();'" . on_help("getTarget(event).value", 1) . ">" . optionlist(array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) . "</select>" : ""); ?>
<?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")) { ?>
<table cellspacing="0" id="edit-fields" class="nowrap">
<?php $comments = edit_fields($row["fields"], $collations, "TABLE", $suhosin, $foreign_keys, $row["Comment"] != ""); ?>
<?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", $foreign_keys, $comments);
?>
</table>
<p>
<?php echo lang('Auto Increment'); ?>: <input name="Auto_increment" size="6" value="<?php echo h($row["Auto_increment"]); ?>">
<script type="text/javascript">
document.write('<label><input type="checkbox" onclick="columnShow(this.checked, 5);"><?php echo lang('Default values'); ?><\/label>');
</script>
<?php echo (support("comment") ? checkbox("", "", $comments, lang('Comment'), "columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();") . ' <input id="Comment" name="Comment" value="' . h($row["Comment"]) . '" maxlength="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, true, lang('Default values'), "columnShow(this.checked, 5)", "jsonly"); ?>
<?php if (!$_POST["defaults"]) { ?><script type="text/javascript">editingHideDefaults()</script><?php } ?>
<?php echo (support("comment")
? "<label><input type='checkbox' name='comments' value='1' class='jsonly' onclick=\"columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();\"" . ($comments ? " checked" : "") . ">" . lang('Comment') . "</label>"
. ' <input name="Comment" id="Comment" value="' . h($row["Comment"]) . '" maxlength="' . ($connection->server_info >= 5.5 ? 2048 : 60) . '"' . ($comments ? '' : ' class="hidden"') . '>'
: '')
; ?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if (strlen($_GET["create"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?>
<?php } ?>
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?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' onchange='partitionByChange(this);'" . on_help("getTarget(event).value.replace(/./, 'PARTITION BY \$&')", 1) . ">" . optionlist(array("" => "") + $partition_by, $row["partition_by"]) . "</select>"; ?>
(<input name="partition" value="<?php echo h($row["partition"]); ?>">)
<?php echo lang('Partitions'); ?>: <input name="partitions" size="2" 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) . '"' . ($key == count($row["partition_names"]) - 1 ? ' onchange="partitionNameChange(this);"' : '') . ' autocapitalize="off">';
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
}
?>
@@ -188,4 +222,5 @@ foreach ($row["partition_names"] as $key => $val) {
<?php
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,21 +1,24 @@
<?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($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)));
} elseif (DB !== $_POST["name"]) {
} elseif (DB !== $name) {
// create or rename database
if (DB != "") {
$_GET["db"] = $_POST["name"];
queries_redirect(preg_replace('~db=[^&]*&~', '', ME) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.'), rename_database($_POST["name"], $_POST["collation"]));
$_GET["db"] = $name;
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", "", $_POST["name"]));
$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;
@@ -25,23 +28,21 @@ if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP c
}
} else {
// alter database
if (!$_POST["collation"]) {
if (!$row["collation"]) {
redirect(substr(ME, 0, -1));
}
query_redirect("ALTER DATABASE " . idf_escape($_POST["name"]) . " COLLATE " . q($_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) {
@@ -57,17 +58,21 @@ if ($_POST) {
<p>
<?php
echo ($_POST["add_x"] || strpos($name, "\n")
? '<textarea name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input name="name" value="' . h($name) . '" maxlength="64">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $collate) : "");
? '<textarea id="name" name="name" rows="10" cols="40">' . h($name) . '</textarea><br>'
: '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $row["collation"]) . doc_link(array(
'sql' => "charset-charsets.html",
'mssql' => "ms187963.aspx",
)) : "");
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<script type='text/javascript'>focus(document.getElementById('name'));</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() . ">\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; ?>">
</form>

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"])) {
if ($jush == "sql" && 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"]);
@@ -15,6 +16,9 @@ if ($tables_views && !$error && !$_POST["search"]) {
} elseif ($_POST["move"]) {
$result = move_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]);
$message = lang('Tables have been moved.');
} elseif ($_POST["copy"]) {
$result = copy_tables((array) $_POST["tables"], (array) $_POST["views"], $_POST["target"]);
$message = lang('Tables have been copied.');
} elseif ($_POST["drop"]) {
if ($_POST["views"]) {
$result = drop_views($_POST["views"]);
@@ -23,138 +27,200 @@ if ($tables_views && !$error && !$_POST["search"]) {
$result = drop_tables($_POST["tables"]);
}
$message = lang('Tables have been dropped.');
} elseif ($_POST["tables"] && ($result = queries(($_POST["optimize"] ? "OPTIMIZE" : ($_POST["check"] ? "CHECK" : ($_POST["repair"] ? "REPAIR" : "ANALYZE"))) . " TABLE " . implode(", ", array_map('idf_escape', $_POST["tables"]))))) {
} elseif ($jush != "sql") {
$result = ($jush == "sqlite"
? queries("VACUUM")
: apply_queries("VACUUM" . ($_POST["optimize"] ? "" : " ANALYZE"), $_POST["tables"])
);
$message = lang('Tables have been optimized.');
} 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);
}
page_header(($_GET["ns"] == "" ? lang('Database') . ": " . h(DB) : lang('Schema') . ": " . h($_GET["ns"])), $error, true);
echo '<p>' . ($_GET["ns"] == "" ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : "");
if (support("scheme")) {
echo "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n";
}
if ($_GET["ns"] !== "") {
echo '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n";
echo "<h3>" . 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 name='query' value='" . h($_POST["query"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
if ($_POST["search"] && $_POST["query"] != "") {
search_tables();
}
echo "<table cellspacing='0' class='nowrap' onclick='tableClick(event);'>\n";
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);"><th>' . lang('Table') . '<td>' . lang('Engine') . '<td>' . lang('Collation') . '<td>' . lang('Data Length') . '<td>' . lang('Index Length') . '<td>' . lang('Data Free') . '<td>' . lang('Auto Increment') . '<td>' . lang('Rows') . (support("comment") ? '<td>' . lang('Comment') : '') . "</thead>\n";
foreach ($tables_list as $name => $type) {
$view = (isset($type) && !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) . '">' . h($name) . '</a>';
if ($view) {
echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '">' . lang('View') . '</a>';
echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '">?</a>';
} else {
echo "<td id='Engine-" . h($name) . "'>&nbsp;<td id='Collation-" . h($name) . "'>&nbsp;";
foreach (array("Data_length" => "create", "Index_length" => "indexes", "Data_free" => "edit", "Auto_increment" => "auto_increment=1&create", "Rows" => "select") as $key => $link) {
echo "<td align='right'><a href='" . h(ME . "$link=") . urlencode($name) . "' id='$key-" . h($name) . "'>?</a>";
if ($adminer->homepage()) {
if ($_GET["ns"] !== "") {
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";
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"]) . "'> <input type='submit' name='search' value='" . lang('Search') . "'>\n";
echo "</div></fieldset>\n";
if ($_POST["search"] && $_POST["query"] != "") {
search_tables();
}
}
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
}
echo "<tr><td>&nbsp;<th>" . lang('%d in total', count($tables_list));
echo "<td>" . nbsp($connection->result("SELECT @@storage_engine"));
echo "<td>" . nbsp(db_collation(DB, collations()));
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
echo "<td align='right' id='sum-$key'>&nbsp;";
}
echo "</table>\n";
if (!information_schema(DB)) {
echo "<p><input type='hidden' name='token' value='$token'>" . ($jush == "sql" ? "<input type='submit' value='" . lang('Analyze') . "'> <input type='submit' name='optimize' value='" . lang('Optimize') . "'> <input type='submit' name='check' value='" . lang('Check') . "'> <input type='submit' name='repair' value='" . lang('Repair') . "'> " : "") . "<input type='submit' name='truncate' value='" . lang('Truncate') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables/) + ')');\"> <input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /tables|views/) + ')');\">\n";
$databases = (support("scheme") ? schemas() : get_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') . ($databases ? ": " . html_select("target", $databases, $db) : ': <input name="target" value="' . h($db) . '">') . " <input type='submit' name='move' value='" . lang('Move') . "'>\n";
}
}
echo "</form>\n";
}
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 "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
if (support("routine")) {
echo "<h3>" . 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";
odd('');
foreach ($routines as $row) {
echo '<tr' . odd() . '>';
echo '<th><a href="' . h(ME) . ($row["ROUTINE_TYPE"] == "FUNCTION" ? 'callf=' : 'call=') . urlencode($row["ROUTINE_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"] == "FUNCTION" ? 'function=' : 'procedure=') . urlencode($row["ROUTINE_NAME"]) . '">' . lang('Alter') . "</a>";
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(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 "</thead>\n";
$tables = 0;
foreach ($tables_list as $name => $type) {
$view = ($type !== null && !preg_match('~table~i', $type));
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');");
echo '<th>' . (support("table") || support("indexes") ? '<a href="' . h(ME) . 'table=' . urlencode($name) . '" title="' . lang('Show structure') . '">' . 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 align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
} else {
foreach (array(
"Engine" => array(),
"Collation" => array(),
"Data_length" => array("create", lang('Alter table')),
"Index_length" => array("indexes", lang('Alter indexes')),
"Data_free" => array("edit", lang('New item')),
"Auto_increment" => array("auto_increment=1&create", lang('Alter table')),
"Rows" => array("select", lang('Select data')),
) as $key => $link) {
$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) . "'>&nbsp;");
}
$tables++;
}
echo (support("comment") ? "<td id='Comment-" . h($name) . "'>&nbsp;" : "");
}
echo "</table>\n";
}
echo '<p><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()");
if ($sequences) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($sequences as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
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()));
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
echo "<td align='right' id='sum-$key'>&nbsp;";
}
echo "</table>\n";
}
echo "<p><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 "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($types as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
if (!information_schema(DB)) {
$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'") . "> "
: "")))
. (support("table") ? "<input type='submit' name='truncate' value='" . lang('Truncate') . "'" . confirm() . on_help($jush == "sqlite" ? "'DELETE'" : "'TRUNCATE" . ($jush == "pgsql" ? "'" : " TABLE'")) . "> " : "")
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . on_help("'DROP TABLE'") . ">\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) . '" 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='' onclick=\"selectCount('selected', formChecked(this, /^(tables|views)\[/));" . (support("table") ? " selectCount('selected2', formChecked(this, /^tables\[/) || $tables);" : "") . "\">\n"; // used by trCheck()
echo "<input type='hidden' name='token' value='$token'>\n";
echo "</div></fieldset>\n";
}
echo "</table>\n";
echo "</form>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n";
}
echo "<p><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
}
if (support("event")) {
echo "<h3>" . 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";
foreach ($rows as $row) {
echo "<tr>";
echo '<th><a href="' . h(ME) . 'event=' . urlencode($row["Name"]) . '">' . h($row["Name"]) . "</a>";
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 '<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 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";
odd('');
foreach ($routines as $row) {
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 '<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 "</table>\n";
}
echo "</table>\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 id='sequences'>" . lang('Sequences') . "</h3>\n";
$sequences = get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema()");
if ($sequences) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Name') . "</thead>\n";
odd('');
foreach ($sequences as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "sequence=" . urlencode($val) . "'>" . h($val) . "</a>\n";
}
echo "</table>\n";
}
echo "<p class='links'><a href='" . h(ME) . "sequence='>" . lang('Create sequence') . "</a>\n";
}
if (support("type")) {
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 ($user_types as $val) {
echo "<tr" . odd() . "><th><a href='" . h(ME) . "type=" . urlencode($val) . "'>" . h($val) . "</a>\n";
}
echo "</table>\n";
}
echo "<p class='links'><a href='" . h(ME) . "type='>" . lang('Create type') . "</a>\n";
}
if (support("event")) {
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') . "<td></thead>\n";
foreach ($rows as $row) {
echo "<tr>";
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");
if ($event_scheduler && $event_scheduler != "ON") {
echo "<p class='error'><code class='jush-sqlset'>event_scheduler</code>: " . h($event_scheduler) . "\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 '<p><a href="' . h(ME) . 'event=">' . lang('Create event') . "</a>\n";
}
page_footer();
echo "<script type='text/javascript' src='" . h(ME) . "script=db'></script>\n";
exit; // page_footer() already called
}

View File

@@ -1,6 +1,7 @@
<?php
$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), 1));
echo $connection->result("SELECT" . limit(idf_escape($_GET["field"]) . " FROM " . table($TABLE), " WHERE " . where($_GET, $fields), 1));
exit; // don't output footer

View File

@@ -0,0 +1,318 @@
<?php
$drivers["elastic"] = "Elasticsearch (beta)";
if (isset($_GET["elastic"])) {
$possible_drivers = array("json");
define("DRIVER", "elastic");
if (function_exists('json_decode')) {
class Min_DB {
var $extension = "JSON", $server_info, $errno, $error, $_url;
function query($path, $content = array(), $method = 'GET') {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents($this->_url . ($this->_db != "" ? "$this->_db/" : "") . $path, false, stream_context_create(array('http' => array(
'method' => $method,
'content' => json_encode($content),
'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) {
$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;
}
function connect($server, $username, $password) {
$this->_url = "http://$username:$password@$server/";
$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 Min_Result($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, $limit, $page, $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 ((array) $_GET["where"] as $val) {
if ("$val[col]$val[val]" != "") {
$term = array("match" => array(($val["col"] != "" ? $val["col"] : "_all") => $val["val"]));
if ($val["op"] == "=") {
$data["query"]["filtered"]["filter"]["and"][] = $term;
} else {
$data["query"]["filtered"]["query"]["bool"]["must"][] = $term;
}
}
}
if ($data["query"] && !$data["query"]["filtered"]["query"]) {
$data["query"]["filtered"]["query"] = array("match_all" => array());
}
if ($print) {
echo $adminer->selectQuery("$query: " . print_r($data, true));
}
$search = $this->_conn->query($query, $data);
if (!$search) {
return false;
}
$return = array();
foreach ($search['hits']['hits'] as $hit) {
$row = array();
$fields = $hit['_source'];
if ($select != array("*")) {
$fields = array();
foreach ($select as $key) {
$fields[$key] = $hit['fields'][$key];
}
}
foreach ($fields as $key => $val) {
$row[$key] = (is_array($val) ? json_encode($val) : $val); //! display JSON and others differently
}
$return[] = $row;
}
return new Min_Result($return);
}
}
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 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->query('_aliases');
if ($return) {
$return = array_keys($return);
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function count_tables($databases) {
global $connection;
$return = $connection->query('_mapping');
if ($return) {
$return = array_map('count', $return);
}
return $return;
}
function tables_list() {
global $connection;
$return = $connection->query('_mapping');
if ($return) {
$return = array_fill_keys(array_keys(reset($return)), 'table');
}
return $return;
}
function table_status($name = "", $fast = false) {
$return = tables_list();
if ($return) {
foreach ($return as $key => $type) { // _stats have just info about database
$return[$key] = array("Name" => $key, "Engine" => $type);
}
if ($name != "") {
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;
$mapping = $connection->query("$table/_mapping");
$return = array();
if ($mapping) {
foreach ($mapping[$table]['properties'] as $name => $field) {
$return[$name] = array(
"field" => $name,
"full_type" => $field["type"],
"type" => $field["type"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
);
}
}
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 database
* @param string
* @return mixed
*/
function create_database($db) {
global $connection;
return $connection->query(urlencode($db), array(), 'PUT');
}
/** Drop databases
* @param array
* @return mixed
*/
function drop_databases($databases) {
global $connection;
return $connection->query(urlencode(implode(',', $databases)), array(), 'DELETE');
}
/** Drop tables
* @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;
}
$jush = "elastic";
$operators = array("=", "query");
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
}

View File

@@ -0,0 +1,322 @@
<?php
$drivers["mongo"] = "MongoDB (beta)";
if (isset($_GET["mongo"])) {
$possible_drivers = array("mongo");
define("DRIVER", "mongo");
if (class_exists('MongoDB')) {
class Min_DB {
var $extension = "Mongo", $error, $_link, $_db;
function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
$options = array();
if ($username != "") {
$options["username"] = $username;
$options["password"] = $password;
}
if ($db != "") {
$options["db"] = $db;
}
try {
$this->_link = @new MongoClient("mongodb://$server", $options);
return true;
} catch (Exception $ex) {
$this->error = $ex->getMessage();
return false;
}
}
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 Min_Result($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 {
function select($table, $select, $where, $group, $order, $limit, $page, $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(iterator_to_array($this->_conn->_db->selectCollection($table)
->find(array(), $select)
->sort($sort)
->limit(+$limit)
->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'];
return !$return['err'];
} catch (Exception $ex) {
$this->_conn->error = $ex->getMessage();
return false;
}
}
}
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 error() {
global $connection;
return h($connection->error);
}
function logged_user() {
global $adminer;
$credentials = $adminer->credentials();
return $credentials[1];
}
function get_databases($flush) {
global $connection;
$return = array();
$dbs = $connection->_link->listDBs();
foreach ($dbs['databases'] as $db) {
$return[] = $db['name'];
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
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 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 information_schema() {
}
function is_view($table_status) {
}
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"]),
"descs" => $descs,
);
}
return $return;
}
function fields($table) {
return array();
}
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 found_rows($table_status, $where) {
global $connection;
//! don't call count_rows()
return $connection->_db->selectCollection($_GET["select"])->count($where);
}
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;
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function support($feature) {
return preg_match("~database|indexes~", $feature);
}
$jush = "mongo";
$operators = array("=");
$functions = array();
$grouping = array();
$edit_functions = array(array("json"));
}

View File

@@ -5,28 +5,26 @@
* @author Jakub Vrana
*/
$possible_drivers[] = "SQLSRV";
$possible_drivers[] = "MSSQL";
if (extension_loaded("sqlsrv") || extension_loaded("mssql")) {
$drivers["mssql"] = "MS SQL";
}
$drivers["mssql"] = "MS SQL";
if (isset($_GET["mssql"])) {
$possible_drivers = array("SQLSRV", "MSSQL");
define("DRIVER", "mssql");
if (extension_loaded("sqlsrv")) {
class Min_DB {
var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $error;
var $extension = "sqlsrv", $_link, $_result, $server_info, $affected_rows, $errno, $error;
function _get_error() {
$this->error = "";
foreach (sqlsrv_errors() as $error) {
$this->errno = $error["code"];
$this->error .= "$error[message]\n";
}
$this->error = rtrim($this->error);
}
function connect($server, $username, $password) {
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password));
$this->_link = @sqlsrv_connect($server, array("UID" => $username, "PWD" => $password, "CharacterSet" => "UTF-8"));
if ($this->_link) {
$info = sqlsrv_server_info($this->_link);
$this->server_info = $info['SQLServerVersion'];
@@ -41,11 +39,12 @@ if (isset($_GET["mssql"])) {
}
function select_db($database) {
return $this->query("USE $database");
return $this->query("USE " . idf_escape($database));
}
function query($query, $unbuffered = false) {
$result = sqlsrv_query($this->_link, $query); //! , array(), ($unbuffered ? array() : array("Scrollable" => "keyset"))
$this->error = "";
if (!$result) {
$this->_get_error();
return false;
@@ -55,6 +54,7 @@ if (isset($_GET["mssql"])) {
function multi_query($query) {
$this->_result = sqlsrv_query($this->_link, $query);
$this->error = "";
if (!$this->_result) {
$this->_get_error();
return false;
@@ -104,7 +104,7 @@ if (isset($_GET["mssql"])) {
}
return $row;
}
function fetch_assoc() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_NEXT));
}
@@ -124,7 +124,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 +135,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;
@@ -162,6 +162,7 @@ if (isset($_GET["mssql"])) {
function query($query, $unbuffered = false) {
$result = mssql_query($query, $this->_link); //! $unbuffered
$this->error = "";
if (!$result) {
$this->error = mssql_get_last_message();
return false;
@@ -224,14 +225,47 @@ if (isset($_GET["mssql"])) {
function seek($offset) {
mssql_data_seek($this->_result, $offset);
}
function __destruct() {
mssql_free_result($this->_result);
}
}
}
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) . "]";
}
@@ -255,7 +289,7 @@ if (isset($_GET["mssql"])) {
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return (isset($limit) ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
}
function limit1($query, $where) {
@@ -285,14 +319,14 @@ if (isset($_GET["mssql"])) {
$return = array();
foreach ($databases as $db) {
$connection->select_db($db);
$return[$db] = $connection->result("SELECT COUNT(*) FROM information_schema.TABLES");
$return[$db] = $connection->result("SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES");
}
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;
}
@@ -304,12 +338,12 @@ if (isset($_GET["mssql"])) {
function is_view($table_status) {
return $table_status["Engine"] == "VIEW";
}
function fk_support($table_status) {
return true;
}
function fields($table, $hidden = false) {
function fields($table) {
$return = array();
foreach (get_rows("SELECT c.*, t.name type, d.definition [default]
FROM sys.all_columns c
@@ -319,7 +353,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)" : ""),
@@ -337,34 +371,32 @@ WHERE o.schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND o.type IN ('S', 'U',
}
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
$connection2 = $connection;
}
$return = array();
// sp_statistics doesn't return information about primary key
foreach (get_rows("SELECT indexes.name, key_ordinal, is_unique, is_primary_key, columns.name AS column_name
FROM sys.indexes
INNER JOIN sys.index_columns ON indexes.object_id = index_columns.object_id AND indexes.index_id = index_columns.index_id
INNER JOIN sys.columns ON index_columns.object_id = columns.object_id AND index_columns.column_id = columns.column_id
WHERE OBJECT_NAME(indexes.object_id) = " . q($table)
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;
}
@@ -377,42 +409,38 @@ WHERE OBJECT_NAME(indexes.object_id) = " . q($table)
global $connection;
return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
}
function exact_value($val) {
return q($val);
}
function create_database($db, $collation) {
return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " COLLATE " . idf_escape($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 ($collation) {
queries("ALTER DATABASE " . idf_escape(DB) . " COLLATE " . idf_escape($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));
return true; //! false negative "The database name 'test2' has been set."
}
function auto_increment() {
return " IDENTITY" . ($_POST["Auto_increment"] != "" ? "(" . preg_replace('~\\D+~', '', $_POST["Auto_increment"]) . ",1)" : "");
return " IDENTITY" . ($_POST["Auto_increment"] != "" ? "(" . (+$_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) {
$column = idf_escape($field[0]);
$val = $field[1];
if (!$val) {
$alter["DROP"][] = " COLUMN $field[0]";
$alter["DROP"][] = " COLUMN $column";
} else {
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
if ($field[0] == "") {
$alter["ADD"][] = "\n " . implode("", $val);
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
} else {
unset($val[6]); //! identity can't be removed
if ($column != $val[0]) {
@@ -428,6 +456,9 @@ WHERE OBJECT_NAME(indexes.object_id) = " . q($table)
if ($table != $name) {
queries("EXEC sp_rename " . q(table($table)) . ", " . q($name));
}
if ($foreign) {
$alter[""] = $foreign;
}
foreach ($alter as $key => $val) {
if (!queries("ALTER TABLE " . idf_escape($name) . " $key" . implode(",", $val))) {
return false;
@@ -435,21 +466,21 @@ WHERE OBJECT_NAME(indexes.object_id) = " . q($table)
}
return true;
}
function alter_indexes($table, $alter) {
$index = array();
$drop = array();
foreach ($alter as $val) {
if ($val[2]) {
if ($val[2] == "DROP") {
if ($val[0] == "PRIMARY") { //! sometimes used also for UNIQUE
$drop[] = $val[1];
$drop[] = idf_escape($val[1]);
} else {
$index[] = "$val[1] ON " . table($table);
$index[] = idf_escape($val[1]) . " ON " . table($table);
}
} elseif (!queries(($val[0] != "PRIMARY"
? "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table)
? "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[1]")) {
) . " $val[2]")) {
return false;
}
}
@@ -457,43 +488,22 @@ WHERE OBJECT_NAME(indexes.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) {
@@ -520,8 +530,11 @@ WHERE OBJECT_NAME(indexes.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();
}
$rows = get_rows("SELECT s.name [Trigger],
CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(s.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(s.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
CASE WHEN OBJECTPROPERTY(s.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing],
@@ -536,7 +549,7 @@ WHERE s.xtype = 'TR' AND s.name = " . q($name)
}
return $return;
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT sys1.name,
@@ -550,18 +563,18 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("AFTER", "INSTEAD OF"),
"Type" => array("AS"),
);
}
function schemas() {
return get_vals("SELECT name FROM sys.schemas");
}
function get_schema() {
global $connection;
if ($_GET["ns"] != "") {
@@ -569,27 +582,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 support($feature) {
return ereg('^(scheme|trigger|view|drop_col)$', $feature); //! routine|
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
}
$jush = "mssql";
$types = array();
$structured_types = array();

View File

@@ -1,29 +1,25 @@
<?php
$possible_drivers[] = "MySQLi";
$possible_drivers[] = "MySQL";
$possible_drivers[] = "PDO_MySQL";
if (extension_loaded("mysqli") || extension_loaded("mysql") || extension_loaded("pdo_mysql")) {
$drivers = array("server" => "MySQL") + $drivers;
}
$drivers = array("server" => "MySQL") + $drivers;
if (!defined("DRIVER")) {
$possible_drivers = array("MySQLi", "MySQL", "PDO_MySQL");
define("DRIVER", "server"); // server - backwards compatibility
// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable
if (extension_loaded("mysqli")) {
class Min_DB extends MySQLi {
var $extension = "MySQLi";
function Min_DB() {
parent::init();
}
function connect($server, $username, $password) {
mysqli_report(MYSQLI_REPORT_OFF); // stays between requests, not required since PHP 5.3.4
list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket
$return = @$this->real_connect(
($server != "" ? $host : ini_get("mysqli.default_host")),
("$server$username" != "" ? $username : ini_get("mysqli.default_user")),
("$server$username$password" != "" ? $password : ini_get("mysqli.default_pw")),
($server . $username != "" ? $username : ini_get("mysqli.default_user")),
($server . $username . $password != "" ? $password : ini_get("mysqli.default_pw")),
null,
(is_numeric($port) ? $port : ini_get("mysqli.default_port")),
(!is_numeric($port) ? $port : null)
@@ -37,7 +33,7 @@ if (!defined("DRIVER")) {
}
return $return;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result) {
@@ -46,22 +42,23 @@ if (!defined("DRIVER")) {
$row = $result->fetch_array();
return $row[$field];
}
function quote($string) {
return "'" . $this->escape_string($string) . "'";
}
}
} elseif (extension_loaded("mysql")) {
} elseif (extension_loaded("mysql") && !(ini_get("sql.safe_mode") && extension_loaded("pdo_mysql"))) {
class Min_DB {
var
$extension = "MySQL", ///< @var string extension name
$server_info, ///< @var string server version
$affected_rows, ///< @var int number of affected rows
$errno, ///< @var int last error code
$error, ///< @var string last error message
$_link, $_result ///< @access private
;
/** Connect to server
* @param string
* @param string
@@ -88,7 +85,7 @@ if (!defined("DRIVER")) {
}
return (bool) $this->_link;
}
/** Quote string to use in SQL
* @param string
* @return string escaped string enclosed in '
@@ -96,7 +93,7 @@ if (!defined("DRIVER")) {
function quote($string) {
return "'" . mysql_real_escape_string($string, $this->_link) . "'";
}
/** Select database
* @param string
* @return bool
@@ -104,7 +101,7 @@ if (!defined("DRIVER")) {
function select_db($database) {
return mysql_select_db($database, $this->_link);
}
/** Send query
* @param string
* @param bool
@@ -112,7 +109,9 @@ if (!defined("DRIVER")) {
*/
function query($query, $unbuffered = false) {
$result = @($unbuffered ? mysql_unbuffered_query($query, $this->_link) : mysql_query($query, $this->_link)); // @ - mute mysql.trace_mode
$this->error = "";
if (!$result) {
$this->errno = mysql_errno($this->_link);
$this->error = mysql_error($this->_link);
return false;
}
@@ -123,7 +122,7 @@ if (!defined("DRIVER")) {
}
return new Min_Result($result);
}
/** Send query with more resultsets
* @param string
* @return bool
@@ -131,14 +130,14 @@ if (!defined("DRIVER")) {
function multi_query($query) {
return $this->_result = $this->query($query);
}
/** Get current resultset
* @return Min_Result
*/
function store_result() {
return $this->_result;
}
/** Fetch next resultset
* @return bool
*/
@@ -146,7 +145,7 @@ if (!defined("DRIVER")) {
// MySQL extension doesn't support multiple results
return false;
}
/** Get single field from result
* @param string
* @param int
@@ -154,19 +153,19 @@ if (!defined("DRIVER")) {
*/
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result) {
if (!$result || !$result->num_rows) {
return false;
}
return mysql_result($result->_result, 0, $field);
}
}
class Min_Result {
var
$num_rows, ///< @var int number of rows in the result
$_result ///< @access private
$_result, $_offset = 0 ///< @access private
;
/** Constructor
* @param resource
*/
@@ -174,62 +173,99 @@ if (!defined("DRIVER")) {
$this->_result = $result;
$this->num_rows = mysql_num_rows($result);
}
/** Fetch next row as associative array
* @return array
*/
function fetch_assoc() {
return mysql_fetch_assoc($this->_result);
}
/** Fetch next row as numbered array
* @return array
*/
function fetch_row() {
return mysql_fetch_row($this->_result);
}
/** Fetch next field
* @return object properties: name, type, orgtable, orgname, charsetnr
*/
function fetch_field() {
$return = mysql_fetch_field($this->_result);
$return = mysql_fetch_field($this->_result, $this->_offset++); // offset required under certain conditions
$return->orgtable = $return->table;
$return->orgname = $return->name;
$return->charsetnr = ($return->blob ? 63 : 0);
return $return;
}
/** Free result set
*/
function __destruct() {
mysql_free_result($this->_result); //! not called in PHP 4 which is a problem with mysql.trace_mode
mysql_free_result($this->_result);
}
}
} elseif (extension_loaded("pdo_mysql")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_MySQL";
function connect($server, $username, $password) {
$this->dsn("mysql:host=" . str_replace(":", ";unix_socket=", preg_replace('~:([0-9])~', ';port=\\1', $server)), $username, $password);
$this->query("SET NAMES utf8"); // charset in DSN is ignored
$this->dsn("mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), $username, $password);
$this->query("SET NAMES utf8"); // charset in DSN is ignored before PHP 5.3.6
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));
}
function query($query, $unbuffered = false) {
$this->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
return parent::query($query, $unbuffered);
}
}
}
class Min_Driver extends Min_SQL {
function insert($table, $set) {
return ($set ? parent::insert($table, $set) : queries("INSERT INTO " . table($table) . " ()\nVALUES ()"));
}
function insertUpdate($table, $rows, $primary) {
$columns = array_keys(reset($rows));
$prefix = "INSERT INTO " . table($table) . " (" . implode(", ", $columns) . ") VALUES\n";
$values = array();
foreach ($columns as $key) {
$values[$key] = "$key = VALUES($key)";
}
$suffix = "\nON DUPLICATE KEY UPDATE " . implode(", ", $values);
$values = array();
$length = 0;
foreach ($rows as $set) {
$value = "(" . implode(", ", $set) . ")";
if ($values && (strlen($prefix) + $length + strlen($value) + strlen($suffix) > 1e6)) { // 1e6 - default max_allowed_packet
if (!queries($prefix . implode(",\n", $values) . $suffix)) {
return false;
}
$values = array();
$length = 0;
}
$values[] = $value;
$length += strlen($value) + 2; // 2 - strlen(",\n")
}
return queries($prefix . implode(",\n", $values) . $suffix);
}
}
/** Escape database identifier
* @param string
* @return string
@@ -254,26 +290,33 @@ if (!defined("DRIVER")) {
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
$connection->query("SET SQL_QUOTE_SHOW_CREATE=1");
$connection->query("SET sql_quote_show_create = 1, autocommit = 1");
return $connection;
}
return $connection->error;
$return = $connection->error;
if (function_exists('iconv') && !is_utf8($return) && strlen($s = iconv("windows-1250", "utf-8", $return)) > strlen($return)) { // windows-1250 - most common Windows encoding
$return = $s;
}
return $return;
}
/** Get cached list of databases
* @param bool
* @return array
*/
function get_databases($flush = true) {
function get_databases($flush) {
global $connection;
// SHOW DATABASES can take a very long time so it is cached
$return = &get_session("dbs");
if (!isset($return)) {
if ($flush) {
restart_session();
ob_flush();
flush();
}
$return = get_vals("SHOW DATABASES");
$return = get_session("dbs");
if ($return === null) {
$query = ($connection->server_info >= 5
? "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA"
: "SHOW DATABASES"
); // SHOW DATABASES can be disabled by skip_show_database
$return = ($flush ? slow_query($query) : get_vals($query));
restart_session();
set_session("dbs", $return);
stop_session();
}
return $return;
}
@@ -287,11 +330,12 @@ if (!defined("DRIVER")) {
* @return string
*/
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
/** Formulate SQL modification query with limit 1
* @param string everything after UPDATE or DELETE
* @param string
* @return string
*/
function limit1($query, $where) {
@@ -311,7 +355,7 @@ if (!defined("DRIVER")) {
$return = $match[1];
} elseif (preg_match('~ CHARACTER SET ([^ ]+)~', $create, $match)) {
// default collation
$return = $collations[$match[1]][0];
$return = $collations[$match[1]][-1];
}
return $return;
}
@@ -322,7 +366,7 @@ if (!defined("DRIVER")) {
function engines() {
$return = array();
foreach (get_rows("SHOW ENGINES") as $row) {
if (ereg("YES|DEFAULT", $row["Support"])) {
if (preg_match("~YES|DEFAULT~", $row["Support"])) {
$return[] = $row["Engine"];
}
}
@@ -338,11 +382,14 @@ if (!defined("DRIVER")) {
}
/** Get tables list
* @return array
* @return array array($name => $type)
*/
function tables_list() {
global $connection;
return get_key_vals("SHOW" . ($connection->server_info >= 5 ? " FULL" : "") . " TABLES");
return get_key_vals($connection->server_info >= 5
? "SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() ORDER BY TABLE_NAME"
: "SHOW TABLES"
);
}
/** Count tables in all databases
@@ -359,16 +406,21 @@ if (!defined("DRIVER")) {
/** Get table status
* @param string
* @return array
* @param bool return only "Name", "Engine" and "Comment" fields
* @return array array($name => array("Name" => , "Engine" => , "Comment" => , "Oid" => , "Rows" => , "Collation" => , "Auto_increment" => , "Data_length" => , "Index_length" => , "Data_free" => )) or only inner array with $name
*/
function table_status($name = "") {
function table_status($name = "", $fast = false) {
global $connection;
$return = array();
foreach (get_rows("SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_")) : "")) as $row) {
foreach (get_rows($fast && $connection->server_info >= 5
? "SELECT TABLE_NAME AS Name, Engine, TABLE_COMMENT AS Comment FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() " . ($name != "" ? "AND TABLE_NAME = " . q($name) : "ORDER BY Name")
: "SHOW TABLE STATUS" . ($name != "" ? " LIKE " . q(addcslashes($name, "%_\\")) : "")
) as $row) {
if ($row["Engine"] == "InnoDB") {
// ignore internal comment, unnecessary since MySQL 5.1.21
$row["Comment"] = preg_replace('~(?:(.+); )?InnoDB free: .*~', '\\1', $row["Comment"]);
}
if (!isset($row["Rows"])) {
if (!isset($row["Engine"])) {
$row["Comment"] = "";
}
if ($name != "") {
@@ -384,7 +436,7 @@ if (!defined("DRIVER")) {
* @return bool
*/
function is_view($table_status) {
return !isset($table_status["Rows"]);
return $table_status["Engine"] === null;
}
/** Check if table supports foreign keys
@@ -392,15 +444,14 @@ if (!defined("DRIVER")) {
* @return bool
*/
function fk_support($table_status) {
return ($table_status["Engine"] == "InnoDB");
return preg_match('~InnoDB|IBMDB2I~i', $table_status["Engine"]);
}
/** Get information about fields
* @param string
* @param bool display hidden table columns
* @return array array($name => array("field" => , "full_type" => , "type" => , "length" => , "unsigned" => , "default" => , "null" => , "auto_increment" => , "on_update" => , "collation" => , "privileges" => , "comment" => , "primary" => ))
*/
function fields($table, $hidden = false) {
function fields($table) {
$return = array();
foreach (get_rows("SHOW FULL COLUMNS FROM " . table($table)) as $row) {
preg_match('~^([^( ]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match);
@@ -410,12 +461,12 @@ if (!defined("DRIVER")) {
"type" => $match[1],
"length" => $match[2],
"unsigned" => ltrim($match[3] . $match[4]),
"default" => ($row["Default"] != "" || ereg("char", $match[1]) ? $row["Default"] : null),
"default" => ($row["Default"] != "" || preg_match("~char|set~", $match[1]) ? $row["Default"] : null),
"null" => ($row["Null"] == "YES"),
"auto_increment" => ($row["Extra"] == "auto_increment"),
"on_update" => (eregi('^on update (.+)', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
"on_update" => (preg_match('~^on update (.+)~i', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
"collation" => $row["Collation"],
"privileges" => array_flip(explode(",", $row["Privileges"])),
"privileges" => array_flip(preg_split('~, *~', $row["Privileges"])),
"comment" => $row["Comment"],
"primary" => ($row["Key"] == "PRI"),
);
@@ -426,25 +477,22 @@ if (!defined("DRIVER")) {
/** Get table indexes
* @param string
* @param string Min_DB to use
* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array()))
* @return array array($key_name => array("type" => , "columns" => array(), "lengths" => array(), "descs" => array()))
*/
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) { // use the main connection if the separate connection is unavailable
$connection2 = $connection;
}
$return = array();
foreach (get_rows("SHOW INDEX FROM " . table($table), $connection2) as $row) {
$return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE")));
$return[$row["Key_name"]]["columns"][] = $row["Column_name"];
$return[$row["Key_name"]]["lengths"][] = $row["Sub_part"];
$return[$row["Key_name"]]["descs"][] = null;
}
return $return;
}
/** Get foreign keys in table
* @param string
* @return array array($name => array("db" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
* @return array array($name => array("db" => , "ns" => , "table" => , "source" => array(), "target" => array(), "on_delete" => , "on_update" => ))
*/
function foreign_keys($table) {
global $connection, $on_actions;
@@ -452,7 +500,7 @@ if (!defined("DRIVER")) {
$return = array();
$create_table = $connection->result("SHOW CREATE TABLE " . table($table), 1);
if ($create_table) {
preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY \\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER);
preg_match_all("~CONSTRAINT ($pattern) FOREIGN KEY \\(((?:$pattern,? ?)+)\\) REFERENCES ($pattern)(?:\\.($pattern))? \\(((?:$pattern,? ?)+)\\)(?: ON DELETE ($on_actions))?(?: ON UPDATE ($on_actions))?~", $create_table, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
preg_match_all("~$pattern~", $match[2], $source);
preg_match_all("~$pattern~", $match[5], $target);
@@ -461,8 +509,8 @@ if (!defined("DRIVER")) {
"table" => idf_unescape($match[4] != "" ? $match[4] : $match[3]),
"source" => array_map('idf_unescape', $source[0]),
"target" => array_map('idf_unescape', $target[0]),
"on_delete" => $match[6],
"on_update" => $match[7],
"on_delete" => ($match[6] ? $match[6] : "RESTRICT"),
"on_update" => ($match[7] ? $match[7] : "RESTRICT"),
);
}
}
@@ -484,11 +532,15 @@ if (!defined("DRIVER")) {
function collations() {
$return = array();
foreach (get_rows("SHOW COLLATION") as $row) {
$return[$row["Charset"]][] = $row["Collation"];
if ($row["Default"]) {
$return[$row["Charset"]][-1] = $row["Collation"];
} else {
$return[$row["Charset"]][] = $row["Collation"];
}
}
ksort($return);
foreach ($return as $key => $val) {
sort($return[$key]);
asort($return[$key]);
}
return $return;
}
@@ -499,7 +551,8 @@ if (!defined("DRIVER")) {
*/
function information_schema($db) {
global $connection;
return ($connection->server_info >= 5 && $db == "information_schema");
return ($connection->server_info >= 5 && $db == "information_schema")
|| ($connection->server_info >= 5.5 && $db == "performance_schema");
}
/** Get escaped error message
@@ -510,35 +563,39 @@ if (!defined("DRIVER")) {
return h(preg_replace('~^You have an error.*syntax to use~U', "Syntax error", $connection->error));
}
/** Return expression for binary comparison
* @param string
* @return string
/** Get line of error
* @return int 0 for first line
*/
function exact_value($val) {
return q($val) . " COLLATE utf8_bin";
function error_line() {
global $connection;
if (preg_match('~ at line ([0-9]+)$~', $connection->error, $regs)) {
return $regs[1] - 1;
}
}
/** Create database
* @param string
* @param string
* @return string
*/
function create_database($db, $collation) {
set_session("dbs", null);
return queries("CREATE DATABASE " . idf_escape($db) . ($collation ? " COLLATE " . q($collation) : ""));
}
/** Drop databases
* @param array
* @return bool
*/
function drop_databases($databases) {
restart_session();
set_session("dbs", null);
return apply_queries("DROP DATABASE", $databases, 'idf_escape');
}
/** Rename database from DB
* @param string new name
* @return string
* @param string
* @return bool
*/
function rename_database($name, $collation) {
@@ -555,7 +612,7 @@ if (!defined("DRIVER")) {
}
return false;
}
/** Generate modifier for auto increment column
* @return string
*/
@@ -575,7 +632,7 @@ if (!defined("DRIVER")) {
}
return " AUTO_INCREMENT$auto_increment_index";
}
/** Run commands to create or alter table
* @param string "" to create
* @param string new name
@@ -592,7 +649,7 @@ if (!defined("DRIVER")) {
$alter = array();
foreach ($fields as $field) {
$alter[] = ($field[1]
? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD") : " ") . " " . implode($field[1]) . ($table != "" ? " $field[2]" : "")
? ($table != "" ? ($field[0] != "" ? "CHANGE " . idf_escape($field[0]) : "ADD") : " ") . " " . implode($field[1]) . ($table != "" ? $field[2] : "")
: "DROP " . idf_escape($field[0])
);
}
@@ -612,19 +669,22 @@ if (!defined("DRIVER")) {
$alter[] = $status;
return queries("ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter));
}
/** Run commands to alter indexes
* @param string escaped table name
* @param array of array("index type", "(columns definition)") or array("index type", "escaped name", "DROP")
* @param array of array("index type", "name", "(columns definition)") or array("index type", "name", "DROP")
* @return bool
*/
function alter_indexes($table, $alter) {
foreach ($alter as $key => $val) {
$alter[$key] = ($val[2] ? "\nDROP INDEX " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1];
$alter[$key] = ($val[2] == "DROP"
? "\nDROP INDEX " . idf_escape($val[1])
: "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . ($val[1] != "" ? idf_escape($val[1]) . " " : "") . $val[2]
);
}
return queries("ALTER TABLE " . table($table) . implode(",", $alter));
}
/** Run commands to truncate tables
* @param array
* @return bool
@@ -632,7 +692,7 @@ if (!defined("DRIVER")) {
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
/** Drop views
* @param array
* @return bool
@@ -640,7 +700,7 @@ if (!defined("DRIVER")) {
function drop_views($views) {
return queries("DROP VIEW " . implode(", ", array_map('table', $views)));
}
/** Drop tables
* @param array
* @return bool
@@ -648,9 +708,10 @@ if (!defined("DRIVER")) {
function drop_tables($tables) {
return queries("DROP TABLE " . implode(", ", array_map('table', $tables)));
}
/** Move tables to other schema
* @param array
* @param array
* @param string
* @return bool
*/
@@ -662,28 +723,60 @@ if (!defined("DRIVER")) {
return queries("RENAME TABLE " . implode(", ", $rename));
//! move triggers
}
/** Copy tables to other schema
* @param array
* @param array
* @param string
* @return bool
*/
function copy_tables($tables, $views, $target) {
queries("SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'");
foreach ($tables as $table) {
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
if (!queries("DROP TABLE IF EXISTS $name")
|| !queries("CREATE TABLE $name LIKE " . table($table))
|| !queries("INSERT INTO $name SELECT * FROM " . table($table))
) {
return false;
}
}
foreach ($views as $table) {
$name = ($target == DB ? table("copy_$table") : idf_escape($target) . "." . table($table));
$view = view($table);
if (!queries("DROP VIEW IF EXISTS $name")
|| !queries("CREATE VIEW $name AS $view[select]") //! USE to avoid db.table
) {
return false;
}
}
return true;
}
/** Get information about trigger
* @param string trigger name
* @return array array("Trigger" => , "Timing" => , "Event" => , "Statement" => )
* @return array array("Trigger" => , "Timing" => , "Event" => , "Type" => , "Statement" => )
*/
function trigger($name) {
if ($name == "") {
return array();
}
$rows = get_rows("SHOW TRIGGERS WHERE `Trigger` = " . q($name));
return reset($rows);
}
/** Get defined triggers
* @param string
* @return array array($name => array($timing, $event))
*/
function triggers($table) {
$return = array();
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_"))) as $row) {
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\"))) as $row) {
$return[$row["Trigger"]] = array($row["Timing"], $row["Event"]);
}
return $return;
}
/** Get trigger options
* @return array ("Timing" => array(), "Type" => array())
*/
@@ -694,19 +787,19 @@ if (!defined("DRIVER")) {
"Type" => array("FOR EACH ROW"),
);
}
/** Get information about stored routine
* @param string
* @param string FUNCTION or PROCEDURE
* @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => )
* @param string "FUNCTION" or "PROCEDURE"
* @return array ("fields" => array("field" => , "type" => , "length" => , "unsigned" => , "inout" => , "collation" => ), "returns" => , "definition" => , "language" => )
*/
function routine($name, $type) {
global $connection, $enum_length, $inout, $types;
$aliases = array("bool", "boolean", "integer", "double precision", "real", "dec", "numeric", "fixed", "national char", "national varchar");
$type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?";
$pattern = "\\s*(" . ($type == "FUNCTION" ? "" : implode("|", $inout)) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
$type_pattern = "((" . implode("|", array_merge(array_keys($types), $aliases)) . ")\\b(?:\\s*\\(((?:[^'\")]*|$enum_length)++)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?)(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?";
$pattern = "\\s*(" . ($type == "FUNCTION" ? "" : $inout) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
$create = $connection->result("SHOW CREATE $type " . idf_escape($name), 2);
preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match);
preg_match("~\\(((?:$pattern\\s*,?)*)\\)\\s*" . ($type == "FUNCTION" ? "RETURNS\\s+$type_pattern\\s+" : "") . "(.*)~is", $create, $match);
$fields = array();
preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER);
foreach ($matches as $param) {
@@ -716,6 +809,7 @@ if (!defined("DRIVER")) {
"type" => strtolower($param[5]),
"length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[6]),
"unsigned" => strtolower(preg_replace('~\\s+~', ' ', trim("$param[8] $param[7]"))),
"null" => 1,
"full_type" => $param[4],
"inout" => strtoupper($param[1]),
"collation" => strtolower($param[9]),
@@ -728,43 +822,24 @@ if (!defined("DRIVER")) {
"fields" => $fields,
"returns" => array("type" => $match[12], "length" => $match[13], "unsigned" => $match[15], "collation" => $match[16]),
"definition" => $match[17],
"language" => "SQL", // available in information_schema.ROUTINES.PARAMETER_STYLE
);
}
/** Get list of routines
* @return array ("ROUTINE_TYPE" => , "ROUTINE_NAME" => , "DTD_IDENTIFIER" => )
*/
function routines() {
return get_rows("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
return get_rows("SELECT ROUTINE_NAME, ROUTINE_TYPE, DTD_IDENTIFIER FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = " . q(DB));
}
/** Begin transaction
* @return bool
/** Get list of available routine languages
* @return array
*/
function begin() {
return queries("BEGIN");
function routine_languages() {
return array(); // "SQL" not required
}
/** Insert data into table
* @param string
* @param array
* @return bool
*/
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")");
}
/** Insert or update data in the table
* @param string
* @param array
* @param array columns in keys
* @return bool
*/
function insert_update($table, $set, $primary) {
foreach ($set as $key => $val) {
$set[$key] = "$key = $val";
}
$update = implode(", ", $set);
return queries("INSERT INTO " . table($table) . " SET $update ON DUPLICATE KEY UPDATE $update");
}
/** Get last auto increment ID
* @return string
*/
@@ -772,37 +847,46 @@ if (!defined("DRIVER")) {
global $connection;
return $connection->result("SELECT LAST_INSERT_ID()"); // mysql_insert_id() truncates bigint
}
/** Explain select
* @param Min_DB
* @param string
* @return Min_Result
*/
function explain($connection, $query) {
return $connection->query("EXPLAIN $query");
return $connection->query("EXPLAIN " . ($connection->server_info >= 5.1 ? "PARTITIONS " : "") . $query);
}
/** Get approximate number of rows
* @param array
* @param array
* @return int or null if approximate number can't be retrieved
*/
function found_rows($table_status, $where) {
return ($where || $table_status["Engine"] != "InnoDB" ? null : $table_status["Rows"]);
}
/** Get user defined types
* @return array
*/
function types() {
return array();
}
/** Get existing schemas
* @return array
*/
function schemas() {
return array();
}
/** Get current schema
* @return string
*/
function get_schema() {
return "";
}
/** Set current schema
* @param string
* @return bool
@@ -810,7 +894,7 @@ if (!defined("DRIVER")) {
function set_schema($schema) {
return true;
}
/** Get SQL command to create table
* @param string
* @param bool
@@ -820,11 +904,11 @@ if (!defined("DRIVER")) {
global $connection;
$return = $connection->result("SHOW CREATE TABLE " . table($table), 1);
if (!$auto_increment) {
$return = preg_replace('~ AUTO_INCREMENT=[0-9]+~', '', $return); //! skip comments
$return = preg_replace('~ AUTO_INCREMENT=\\d+~', '', $return); //! skip comments
}
return $return;
}
/** Get SQL command to truncate table
* @param string
* @return string
@@ -832,7 +916,7 @@ if (!defined("DRIVER")) {
function truncate_sql($table) {
return "TRUNCATE " . table($table);
}
/** Get SQL command to change database
* @param string
* @return string
@@ -840,7 +924,7 @@ if (!defined("DRIVER")) {
function use_sql($database) {
return "USE " . idf_escape($database);
}
/** Get SQL commands to create triggers
* @param string
* @param string
@@ -848,34 +932,75 @@ if (!defined("DRIVER")) {
*/
function trigger_sql($table, $style) {
$return = "";
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_")), null, "-- ") as $row) {
foreach (get_rows("SHOW TRIGGERS LIKE " . q(addcslashes($table, "%_\\")), null, "-- ") as $row) {
$return .= "\n" . ($style == 'CREATE+ALTER' ? "DROP TRIGGER IF EXISTS " . idf_escape($row["Trigger"]) . ";;\n" : "")
. "CREATE TRIGGER " . idf_escape($row["Trigger"]) . " $row[Timing] $row[Event] ON " . table($row["Table"]) . " FOR EACH ROW\n$row[Statement];;\n";
}
return $return;
}
/** Get server variables
* @return array ($name => $value)
*/
function show_variables() {
return get_key_vals("SHOW VARIABLES");
}
/** Get process list
* @return array ($row)
*/
function process_list() {
return get_rows("SHOW FULL PROCESSLIST");
}
/** Get status variables
* @return array ($name => $value)
*/
function show_status() {
return get_key_vals("SHOW STATUS");
}
/** Check whether a feature is supported
/** Convert field in select and edit
* @param array one element from fields()
* @return string
*/
function convert_field($field) {
if (preg_match("~binary~", $field["type"])) {
return "HEX(" . idf_escape($field["field"]) . ")";
}
if ($field["type"] == "bit") {
return "BIN(" . idf_escape($field["field"]) . " + 0)"; // + 0 is required outside MySQLnd
}
if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
return "AsWKT(" . idf_escape($field["field"]) . ")";
}
}
/** Convert value in edit after applying functions back
* @param array one element from fields()
* @param string
* @return string
*/
function unconvert_field($field, $return) {
if (preg_match("~binary~", $field["type"])) {
$return = "UNHEX($return)";
}
if ($field["type"] == "bit") {
$return = "CONV($return, 2, 10) + 0";
}
if (preg_match("~geometry|point|linestring|polygon~", $field["type"])) {
$return = "GeomFromText($return)";
}
return $return;
}
/** Check whether a feature is supported
* @param string "comment", "copy", "database", "drop_col", "dump", "event", "kill", "partitioning", "privileges", "procedure", "processlist", "routine", "scheme", "sequence", "status", "table", "trigger", "type", "variables", "view", "view_trigger"
* @return bool
*/
function support($feature) {
global $connection;
return !ereg("scheme|sequence|type" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|view|routine|trigger" : "") : ""), $feature);
return !preg_match("~scheme|sequence|type|view_trigger" . ($connection->server_info < 5.1 ? "|event|partitioning" . ($connection->server_info < 5 ? "|routine|trigger|view" : "") : "") . "~", $feature);
}
$jush = "sql"; ///< @var string JUSH identifier
@@ -885,23 +1010,24 @@ if (!defined("DRIVER")) {
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "decimal" => 66, "float" => 12, "double" => 21),
lang('Date and time') => array("date" => 10, "datetime" => 19, "timestamp" => 19, "time" => 10, "year" => 4),
lang('Strings') => array("char" => 255, "varchar" => 65535, "tinytext" => 255, "text" => 65535, "mediumtext" => 16777215, "longtext" => 4294967295),
lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295),
lang('Lists') => array("enum" => 65535, "set" => 64),
lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295),
lang('Geometry') => array("geometry" => 0, "point" => 0, "linestring" => 0, "polygon" => 0, "multipoint" => 0, "multilinestring" => 0, "multipolygon" => 0, "geometrycollection" => 0),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL"); ///< @var array operators used in select
$functions = array("char_length", "date", "from_unixtime", "hex", "lower", "round", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select
$functions = array("char_length", "date", "from_unixtime", "lower", "round", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select
$edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
array(
"char" => "md5/sha1/password/encrypt/uuid", //! JavaScript for disabling maxlength
"binary" => "md5/sha1/hex",
"binary" => "md5/sha1",
"date|time" => "now",
), array(
"int|float|double|decimal" => "+/-",
"(^|[^o])int|float|double|decimal" => "+/-", // not point
"date" => "+ interval/- interval",
"time" => "addtime/subtime",
"char|text" => "concat",

View File

@@ -1,26 +1,23 @@
<?php
$possible_drivers[] = "OCI8";
$possible_drivers[] = "PDO_OCI";
if (extension_loaded("oci8") || extension_loaded("pdo_oci")) {
$drivers["oracle"] = "Oracle";
}
$drivers["oracle"] = "Oracle";
if (isset($_GET["oracle"])) {
$possible_drivers = array("OCI8", "PDO_OCI");
define("DRIVER", "oracle");
if (extension_loaded("oci8")) {
class Min_DB {
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $error;
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
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) {
$this->_link = @oci_new_connect($username, $password, $server); //! AL32UTF8
$this->_link = @oci_new_connect($username, $password, $server, "AL32UTF8");
if ($this->_link) {
$this->server_info = oci_server_version($this->_link);
return true;
@@ -40,8 +37,10 @@ if (isset($_GET["oracle"])) {
function query($query, $unbuffered = false) {
$result = oci_parse($this->_link, $query);
$this->error = "";
if (!$result) {
$error = oci_error($this->_link);
$this->errno = $error["code"];
$this->error = $error["message"];
return false;
}
@@ -60,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)) {
@@ -93,7 +92,7 @@ if (isset($_GET["oracle"])) {
}
return $row;
}
function fetch_assoc() {
return $this->_convert(oci_fetch_assoc($this->_result));
}
@@ -108,28 +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) . '"';
}
@@ -153,7 +169,10 @@ if (isset($_GET["oracle"])) {
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? ($where ? " AND" : $separator . "WHERE") . ($offset ? " rownum > $offset AND" : "") . " rownum <= " . ($limit + $offset) : "");
return ($offset ? " * FROM (SELECT t.*, rownum AS rnum FROM (SELECT $query$where) t WHERE rownum <= " . ($limit + $offset) . ") WHERE rnum > $offset"
: ($limit !== null ? " * FROM (SELECT $query$where) WHERE rownum <= " . ($limit + $offset)
: " $query$where"
));
}
function limit1($query, $where) {
@@ -176,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" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "")
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" : "") . "
ORDER BY 1"
) as $row) {
if ($name != "") {
return $row;
@@ -201,12 +222,12 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
function is_view($table_status) {
return $table_status["Engine"] == "view";
}
function fk_support($table_status) {
return true;
}
function fields($table, $hidden = false) {
function fields($table) {
$return = array();
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . " ORDER BY column_id") as $row) {
$type = $row["DATA_TYPE"];
@@ -232,14 +253,26 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
}
function indexes($table, $connection2 = null) {
return array(); //!
$return = array();
foreach (get_rows("SELECT uic.*, uc.constraint_type
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) {
$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;
}
function view($name) {
$rows = get_rows('SELECT text "select" FROM user_views WHERE view_name = ' . q($name));
return reset($rows);
}
function collations() {
return array(); //!
}
@@ -252,16 +285,15 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
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) {
@@ -283,11 +315,11 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
&& ($table == $name || queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name)))
;
}
function foreign_keys($table) {
return array(); //!
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
@@ -300,43 +332,53 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
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 array();
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() {
return "";
global $connection;
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
}
function set_schema($scheme) {
return true;
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
ON sql.sql_id = sess.sql_id
WHERE sess.type = \'USER\'
ORDER BY PROCESS
');
}
function show_status() {
$rows = get_rows('SELECT * FROM v$instance');
return reset($rows);
}
function support($feature) {
return ereg("view|drop_col|variables|status", $feature); //!
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
}
$jush = "oracle";
$types = array();
$structured_types = array();
@@ -350,7 +392,7 @@ UNION SELECT view_name, 'view' FROM user_views" . ($name != "" ? " WHERE view_na
$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

@@ -1,32 +1,31 @@
<?php
$possible_drivers[] = "PgSQL";
$possible_drivers[] = "PDO_PgSQL";
if (extension_loaded("pgsql") || extension_loaded("pdo_pgsql")) {
$drivers["pgsql"] = "PostgreSQL";
}
$drivers["pgsql"] = "PostgreSQL";
if (isset($_GET["pgsql"])) {
$possible_drivers = array("PgSQL", "PDO_PgSQL");
define("DRIVER", "pgsql");
if (extension_loaded("pgsql")) {
class Min_DB {
var $extension = "PgSQL", $_link, $_result, $_string, $_database = true, $server_info, $affected_rows, $error;
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();
set_error_handler(array($this, '_error'));
$this->_string = "host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' user='" . addcslashes($username, "'\\") . "' password='" . addcslashes($password, "'\\") . "'";
$this->_link = @pg_connect($this->_string . (DB != "" ? " dbname='" . addcslashes(DB, "'\\") . "'" : ""), PGSQL_CONNECT_FORCE_NEW);
if (!$this->_link && DB != "") {
$this->_link = @pg_connect("$this->_string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", PGSQL_CONNECT_FORCE_NEW);
if (!$this->_link && $db != "") {
// try to connect directly with database for performance
$this->_database = false;
$this->_link = @pg_connect($this->_string, PGSQL_CONNECT_FORCE_NEW);
$this->_link = @pg_connect("$this->_string dbname='postgres'", PGSQL_CONNECT_FORCE_NEW);
}
restore_error_handler();
if ($this->_link) {
@@ -36,13 +35,14 @@ if (isset($_GET["pgsql"])) {
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea
}
function select_db($database) {
if ($database == DB) {
global $adminer;
if ($database == $adminer->database()) {
return $this->_database;
}
$return = @pg_connect("$this->_string dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW);
@@ -51,13 +51,14 @@ if (isset($_GET["pgsql"])) {
}
return $return;
}
function close() {
$this->_link = @pg_connect($this->_string);
$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;
@@ -67,45 +68,45 @@ if (isset($_GET["pgsql"])) {
}
return new Min_Result($result);
}
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) {
if (!$result || !$result->num_rows) {
return false;
}
return pg_fetch_result($result->_result, 0, $field);
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($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;
@@ -118,33 +119,64 @@ 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";
function connect($server, $username, $password) {
global $adminer;
$db = $adminer->database();
$string = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' options='-c client_encoding=utf8'";
$this->dsn($string . (DB != "" ? " dbname='" . addcslashes(DB, "'\\") . "'" : ""), $username, $password);
$this->dsn("$string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password);
//! connect without DB in case of an error
return true;
}
function select_db($database) {
return (DB == $database);
global $adminer;
return ($adminer->database() == $database);
}
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 idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
@@ -158,23 +190,26 @@ if (isset($_GET["pgsql"])) {
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
if ($connection->server_info >= 9) {
$connection->query("SET application_name = 'Adminer'");
}
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT datname FROM pg_database");
return get_vals("SELECT datname FROM pg_database ORDER BY datname");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
return " $query$where";
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SHOW LC_COLLATE"); //! respect $db
@@ -183,44 +218,48 @@ 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");
}
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 '' 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\"
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::int 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) : "")
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
" . ($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";
}
function fk_support($table_status) {
return true;
}
function fields($table, $hidden = false) {
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',
);
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
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
JOIN pg_attribute a ON c.oid = a.attrelid
@@ -228,73 +267,87 @@ LEFT JOIN pg_attrdef d ON c.oid = d.adrelid AND a.attnum = d.adnum
WHERE c.relname = " . q($table) . "
AND n.nspname = current_schema()
AND NOT a.attisdropped
" . ($hidden ? "" : "AND a.attnum > 0") . "
ORDER BY a.attnum < 0, a.attnum"
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('~([^([]+)(\((.*)\))?((\[[0-9]*])*)$~', $row["full_type"], $match);
list(, $type, $length, $row["length"], $array) = $match;
$row["length"] .= $array;
$row["type"] = ($aliases[$type] ? $aliases[$type] : $type);
$row["full_type"] = $row["type"] . $length . $array;
$row["null"] = !$row["attnotnull"];
$row["auto_increment"] = 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]) . $match[2];
}
$return[$row["field"]] = $row;
}
return $return;
}
function indexes($table, $connection2 = null) {
global $connection;
if (!is_object($connection2)) {
$connection2 = $connection;
}
$return = array();
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relname = " . q($table));
$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 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["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 tc.constraint_name, kcu.column_name, rc.update_rule AS on_update, rc.delete_rule AS on_delete, ccu.table_name AS table, ccu.column_name AS ref
FROM information_schema.table_constraints tc
LEFT JOIN information_schema.key_column_usage kcu USING (constraint_catalog, constraint_schema, constraint_name)
LEFT JOIN information_schema.referential_constraints rc USING (constraint_catalog, constraint_schema, constraint_name)
LEFT JOIN information_schema.constraint_column_usage ccu ON rc.unique_constraint_catalog = ccu.constraint_catalog AND rc.unique_constraint_schema = ccu.constraint_schema AND rc.unique_constraint_name = ccu.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! there can be more unique_constraint_name
) as $row) {
$foreign_key = &$return[$row["constraint_name"]];
if (!$foreign_key) {
$foreign_key = $row;
foreach (get_rows("SELECT conname, 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]));
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');
$row['on_update'] = (preg_match("~ON UPDATE ($on_actions)~", $match[4], $match2) ? $match2[1] : 'NO ACTION');
$return[$row['conname']] = $row;
}
$foreign_key["source"][] = $row["column_name"];
$foreign_key["target"][] = $row["ref"];
}
return $return;
}
function view($name) {
global $connection;
return array("select" => $connection->result("SELECT pg_get_viewdef(" . 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);
@@ -303,30 +356,26 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
}
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();
@@ -349,7 +398,7 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
}
$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];
}
}
@@ -380,37 +429,51 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
}
return true;
}
function alter_indexes($table, $alter) {
$create = array();
$drop = array();
$queries = array();
foreach ($alter as $val) {
if ($val[0] != "INDEX") {
$create[] = ($val[2] ? "\nDROP CONSTRAINT " : "\nADD $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "")) . $val[1];
} elseif ($val[2]) {
$drop[] = $val[1];
} elseif (!queries("CREATE INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table) . " $val[1]")) {
//! descending UNIQUE indexes results in syntax error
$create[] = ($val[2] == "DROP"
? "\nDROP CONSTRAINT " . idf_escape($val[1])
: "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . $val[2]
);
} elseif ($val[2] == "DROP") {
$drop[] = idf_escape($val[1]);
} else {
$queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " $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)));
}
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))) {
@@ -424,12 +487,15 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
}
return true;
}
function trigger($name) {
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));
return reset($rows);
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
@@ -437,45 +503,60 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . q($table) //! t
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER"),
"Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"),
);
}
function begin() {
return queries("BEGIN");
/*
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];
}
function insert_into($table, $set) {
return queries("INSERT INTO " . table($table) . ($set ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")" : "DEFAULT VALUES"));
*/
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');
}
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";
}
}
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) . ")")
;
function routine_languages() {
return get_vals("SELECT langname FROM pg_catalog.pg_language");
}
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 (preg_match(
"~ rows=([0-9]+)~",
$connection->result("EXPLAIN SELECT * FROM " . idf_escape($table_status["Name"]) . ($where ? " WHERE " . implode(" AND ", $where) : "")),
$regs
)) {
return $regs[1];
}
return false;
}
function types() {
return get_vals("SELECT typname
FROM pg_type
@@ -484,16 +565,16 @@ AND typtype IN ('b','d','e')
AND typelem = 0"
);
}
function schemas() {
return get_vals("SELECT nspname FROM pg_namespace");
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));
@@ -505,28 +586,40 @@ AND typelem = 0"
}
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"));
}
function show_status() {
}
function support($feature) {
return ereg('^(comment|view|scheme|sequence|trigger|type|variables|drop_col)$', $feature); //! routine|
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return preg_match('~^(database|table|columns|sql|indexes|comment|view|scheme|processlist|sequence|trigger|type|variables|drop_col)$~', $feature); //! routine|
}
$jush = "pgsql";
$types = array();
$structured_types = array();
foreach (array( //! arrays
lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20),
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "interval" => 0),
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
@@ -536,7 +629,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");
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid SQL injection
$functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(

View File

@@ -0,0 +1,484 @@
<?php
$drivers["simpledb"] = "SimpleDB";
if (isset($_GET["simpledb"])) {
$possible_drivers = array("SimpleXML");
define("DRIVER", "simpledb");
if (class_exists('SimpleXMLElement')) {
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
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 Min_Result($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 {
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, $limit, $page, $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 connect() {
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 = array();
foreach ((array) $_POST["field_keys"] as $key => $val) {
if ($val != "") {
$val = bracket_escape($val);
$_POST["function"][$val] = $_POST["field_funs"][$key];
$_POST["fields"][$val] = $_POST["field_vals"][$key];
}
}
foreach ((array) $_POST["fields"] as $key => $val) {
$name = bracket_escape($key, 1); // 1 - back
$return[$name] = array("field" => $name, "privileges" => array("insert" => 1, "update" => 1), "null" => 1);
}
return $return;
}
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

@@ -1,30 +1,101 @@
<?php
$possible_drivers[] = "SQLite";
$possible_drivers[] = "SQLite3";
$possible_drivers[] = "PDO_SQLite";
if (extension_loaded("sqlite3") || extension_loaded("pdo_sqlite")) {
$drivers["sqlite"] = "SQLite 3";
}
if (extension_loaded("sqlite") || extension_loaded("pdo_sqlite")) {
$drivers["sqlite2"] = "SQLite 2";
}
$drivers["sqlite"] = "SQLite 3";
$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["sqlite2"]) ? "sqlite" : "sqlite3")) {
if (isset($_GET["sqlite2"])) {
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) {
$this->_link = new SQLite3($filename);
$version = $this->_link->version();
$this->server_info = $version["versionString"];
}
function query($query) {
$result = @$this->_link->query($query);
$this->error = "";
if (!$result) {
$this->errno = $this->_link->lastErrorCode();
$this->error = $this->_link->lastErrorMsg();
return false;
} elseif ($result->numColumns()) {
return new Min_Result($result);
}
$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)) {
return false;
}
$row = $result->_result->fetchArray();
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($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);
return (object) array(
"name" => $this->_result->columnName($column),
"type" => $type,
"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) {
$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);
$this->error = "";
if (!$result) {
$this->error = $error;
return false;
@@ -34,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)) {
@@ -52,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) {
$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) {
@@ -74,11 +145,11 @@ 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 = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
@@ -92,116 +163,63 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
"orgtable" => $table,
);
}
}
} else {
class Min_SQLite {
var $extension = "SQLite3", $server_info, $affected_rows, $error, $_link;
function Min_SQLite($filename) {
$this->_link = new SQLite3($filename);
$version = $this->_link->version();
$this->server_info = $version["versionString"];
}
function query($query) {
$result = @$this->_link->query($query);
if (!$result) {
$this->error = $this->_link->lastErrorMsg();
return false;
} elseif ($result->numColumns()) {
return new Min_Result($result);
}
$this->affected_rows = $this->_link->changes();
return true;
}
function quote($string) {
return "'" . $this->_link->escapeString($string) . "'";
}
function store_result() {
return $this->_result;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
$row = $result->_result->fetchArray();
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function Min_Result($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);
return (object) array(
"name" => $this->_result->columnName($column),
"type" => $type,
"charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary
);
}
function __desctruct() {
return $this->_result->finalize();
}
}
}
} elseif (extension_loaded("pdo_sqlite")) {
class Min_SQLite extends Min_PDO {
var $extension = "PDO_SQLite";
function Min_SQLite($filename) {
$this->dsn(DRIVER . ":$filename", "", "");
}
}
}
class Min_DB extends Min_SQLite {
function Min_DB() {
$this->Min_SQLite(":memory:");
}
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);
return true;
if (class_exists("Min_SQLite")) {
class Min_DB extends Min_SQLite {
function Min_DB() {
$this->Min_SQLite(":memory:");
}
function select_db($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
$this->Min_SQLite($filename);
return true;
}
return false;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function next_result() {
return false;
}
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 idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
@@ -219,7 +237,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . (isset($limit) ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
@@ -249,9 +267,12 @@ 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) {
foreach (get_rows("SELECT name AS Name, type AS Engine FROM sqlite_master WHERE type IN ('table', 'view') " . ($name != "" ? "AND name = " . q($name) : "ORDER BY name")) as $row) {
$row["Oid"] = 1;
$row["Auto_increment"] = "";
$row["Rows"] = $connection->result("SELECT COUNT(*) FROM " . idf_escape($row["Name"]));
$return[$row["Name"]] = $row;
}
foreach (get_rows("SELECT * FROM sqlite_sequence", null, "") as $row) {
@@ -263,47 +284,87 @@ 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, $hidden = false) {
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());
if (!$return) {
foreach (fields($table) as $name => $field) {
if ($field["primary"]) {
$return[""] = array("type" => "PRIMARY", "columns" => array($name), "lengths" => array(), "descs" => array(null));
}
}
}
foreach (get_rows("PRAGMA index_list(" . table($table) . ")") as $row) {
$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"];
$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"];
if (!preg_match("~^sqlite_~", $name)) {
$return[$name]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX");
$return[$name]["lengths"] = array();
foreach (get_rows("PRAGMA index_info(" . idf_escape($name) . ")", $connection2) as $row1) {
$return[$name]["columns"][] = $row1["name"];
}
$return[$name]["descs"] = array();
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 $val) {
$return[$name]["descs"][] = ($val ? '1' : null);
}
}
}
}
return $return;
@@ -340,9 +401,16 @@ 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;
$extensions = "db|sdb|sqlite";
if (!preg_match("~^[^\\0]*\\.($extensions)\$~", $name)) {
$connection->error = lang('Please use one of the extensions %s.', str_replace("|", ", ", $extensions));
return false;
}
return true;
}
function create_database($db, $collation) {
@@ -351,13 +419,21 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
$connection->error = lang('File exists.');
return false;
}
$link = new Min_SQLite($db); //! exception handler
if (!check_sqlite_name($db)) {
return false;
}
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
@@ -369,27 +445,40 @@ 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->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) {
$alter = array();
$use_all_fields = ($table == "" || $foreign);
foreach ($fields as $field) {
if ($field[1]) {
$alter[] = ($table != "" && $field[0] == "" ? "ADD " : " ") . implode($field[1]);
if ($field[0] != "" || !$field[1] || $field[2]) {
$use_all_fields = true;
break;
}
}
$alter = array_merge($alter, $foreign);
if ($table != "") {
$alter = array();
$originals = array();
foreach ($fields as $field) {
if ($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) {
foreach ($alter as $val) {
if (!queries("ALTER TABLE " . table($table) . " $val")) {
return false;
@@ -398,7 +487,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
return false;
}
} elseif (!queries("CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)")) {
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
return false;
}
if ($auto_increment) {
@@ -406,38 +495,148 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return true;
}
function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
queries("BEGIN");
if ($table != "") {
if (!$fields) {
foreach (fields($table) as $key => $field) {
$fields[] = process_field($field, $field);
$originals[$key] = idf_escape($key);
}
}
$primary_key = false;
foreach ($fields as $key => $field) {
if ($field[6]) {
$primary_key = true;
}
$fields[$key] = " " . implode($field);
}
$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" : "");
}
$columns = "(" . implode(", ", $columns) . ")";
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 $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);
}
}
}
$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) {
if (!queries(($val[2] ? "DROP INDEX" : "CREATE" . ($val[0] != "INDEX" ? " UNIQUE" : "") . " INDEX " . idf_escape(uniqid($table . "_")) . " ON " . table($table)) . " $val[1]")) {
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])
: index_sql($table, $val[0], $val[1], $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;
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);
if ($name == "") {
return array("Statement" => "BEGIN\n\t;\nEND");
}
preg_match(
'~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(BEFORE|AFTER|INSTEAD\\s+OF)\\s+([a-z]+)\\s+ON\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(?:FOR\\s*EACH\\s*ROW\\s)?(.*)~is',
$connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
$match
);
return array("Timing" => strtoupper($match[1]), "Event" => strtoupper($match[2]), "Trigger" => $name, "Statement" => $match[3]);
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
@@ -446,75 +645,81 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER", "INSTEAD OF"),
"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");
}
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) {
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) {
return implode(get_vals("SELECT sql || ';;\n' FROM sqlite_master WHERE type = 'trigger' AND name = " . q($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();
@@ -523,7 +728,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function show_status() {
$return = array();
foreach (get_vals("PRAGMA compile_options") as $option) {
@@ -532,16 +737,23 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
}
return $return;
}
function support($feature) {
return ereg('^(view|trigger|variables|status|dump)$', $feature);
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|dump|indexes|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,24 +1,29 @@
<?php
$TABLE = $_GET["dump"];
if ($_POST) {
if ($_POST && !$error) {
$cookie = "";
foreach (array("output", "format", "db_style", "table_style", "data_style") as $key) {
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));
if ($_POST["format"] == "sql") {
$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"]);
if ($is_sql) {
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump
" . ($jush != "sql" ? "" : "SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = " . q($connection->result("SELECT @@time_zone")) . ";
" . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
SET time_zone = " . q(substr(preg_replace('~^[^-]~', '+\0', $connection->result("SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)")), 0, 6)) . ";
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
" : "") . "
");
}
$style = $_POST["db_style"];
$databases = array(DB);
if (DB == "") {
@@ -27,124 +32,92 @@ 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 ($_POST["format"] == "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))) {
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 ($_POST["format"] == "sql") {
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" : "")
. $connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2) . ";;\n\n";
. remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2)) . ";;\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" : "")
. $connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3) . ";;\n\n";
. remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3)) . ";;\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 $row) {
$table = (DB == "" || in_array($row["Name"], (array) $_POST["tables"]));
$data = (DB == "" || in_array($row["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($row)) {
if ($ext == "tar") {
ob_start();
}
dump_table($row["Name"], ($table ? $_POST["table_style"] : ""));
if ($data) {
dump_data($row["Name"], $_POST["data_style"]);
}
if ($_POST["format"] == "sql" && $_POST["triggers"]) {
$triggers = trigger_sql($row["Name"], $_POST["table_style"]);
if ($triggers) {
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
}
}
if ($ext == "tar") {
echo tar_file((DB != "" ? "" : "$db/") . "$row[Name].csv", ob_get_clean());
} elseif ($_POST["format"] == "sql") {
echo "\n";
}
} elseif ($_POST["format"] == "sql") {
$views[] = $row["Name"];
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, $_POST["table_style"]))) {
echo "\nDELIMITER ;;\n$triggers\nDELIMITER ;\n";
}
if ($ext == "tar") {
ob_end_flush();
tar_file((DB != "" ? "" : "$db/") . "$name.csv", $tmp_file);
} elseif ($is_sql) {
echo "\n";
}
}
}
foreach ($views as $view) {
dump_table($view, $_POST["table_style"], true);
$adminer->dumpTable($view, $_POST["table_style"], 1);
}
if ($ext == "tar") {
echo pack("x512");
}
}
if ($style == "CREATE+ALTER" && $_POST["format"] == "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"])) && $_POST["format"] == "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">
@@ -153,30 +126,37 @@ page_header(lang('Export'), "", ($_GET["export"] != "" ? array("table" => $_GET[
$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);
if (!$row) {
$row = array("output" => "text", "format" => "sql", "db_style" => (DB != "" ? "" : "CREATE"), "table_style" => "DROP+CREATE", "data_style" => "INSERT");
}
$checked = ($_GET["dump"] == "");
echo "<tr><th>" . lang('Output') . "<td>" . $adminer->dumpOutput(0, $row["output"]) . "\n";
echo "<tr><th>" . lang('Format') . "<td>" . $adminer->dumpFormat(0, $row["format"]) . "\n";
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, $checked, lang('Routines')) : "")
. (support("event") ? checkbox("events", 1, $checked, lang('Events')) : "")
. (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["table_style"], lang('Auto Increment'))
. (support("trigger") ? checkbox("triggers", 1, $row["table_style"], lang('Triggers')) : "")
. 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
@@ -184,32 +164,37 @@ $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 onclick='formCheck(this, /^tables\\[/);'>" . lang('Tables') . "</label>";
echo "<th style='text-align: right;'><label class='block'>" . lang('Data') . "<input type='checkbox' id='check-data'$checked onclick='formCheck(this, /^data\\[/);'></label>";
echo "</thead>\n";
$views = "";
//! defer number of rows to JavaScript
foreach (table_status() as $row) {
$name = $row["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, "formUncheck('check-tables');");
if (is_view($row)) {
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');", "block");
if ($type !== null && !preg_match('~table~i', $type)) {
$views .= "$print\n";
} else {
echo "$print<td align='right'><label>" . ($row["Engine"] == "InnoDB" && $row["Rows"] ? "~ " : "") . $row["Rows"] . checkbox("data[]", $name, $checked, "", "formUncheck('check-data');") . "</label>\n";
echo "$print<td align='right'><label class='block'><span id='Rows-" . h($name) . "'></span>" . checkbox("data[]", $name, $checked, "", "checkboxClick(event, this); formUncheck('check-data');") . "</label>\n";
}
$prefixes[$prefix]++;
}
echo $views;
if ($tables_list) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=db');</script>\n";
}
} 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";
$databases = get_databases();
echo "<thead><tr><th style='text-align: left;'><label class='block'><input type='checkbox' id='check-databases'" . ($TABLE == "" ? " checked" : "") . " onclick='formCheck(this, /^databases\\[/);'>" . lang('Database') . "</label></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, "formUncheck('check-databases');", "block") . "\n";
$prefixes[$prefix]++;
}
}

View File

@@ -1,44 +1,65 @@
<?php
$TABLE = $_GET["edit"];
$where = (isset($_GET["select"]) ? (count($_POST["check"]) == 1 ? where_check($_POST["check"][0]) : "") : where($_GET));
$update = (isset($_GET["select"]) ? $_POST["edit"] : $where);
$fields = fields($TABLE);
$where = (isset($_GET["select"]) ? (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));
$table_name = $adminer->tableName(table_status1($TABLE, true));
page_header(
($update ? lang('Edit') : lang('Insert')),
$error,
@@ -53,58 +74,121 @@ if ($_POST["save"]) {
$select = array();
foreach ($fields as $name => $field) {
if (isset($field["privileges"]["select"])) {
$select[] = ($_POST["clone"] && $field["auto_increment"] ? "'' AS " : (ereg("enum|set", $field["type"]) ? "1*" . idf_escape($name) . " AS " : "")) . idf_escape($name);
$as = convert_field($field);
if ($_POST["clone"] && $field["auto_increment"]) {
$as = "''";
}
if ($jush == "sql" && preg_match("~enum|set~", $field["type"])) {
$as = "1*" . idf_escape($name);
}
$select[] = ($as ? "$as AS " : "") . idf_escape($name);
}
}
$row = 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));
if (!support("table")) {
$select = array("*");
}
if ($select) {
$result = $driver->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1), 0);
$row = $result->fetch_assoc();
if (isset($_GET["select"]) && (!$row || $result->fetch_assoc())) { // $result->num_rows != 1 isn't available in all drivers
$row = null;
}
}
}
if (!support("table") && !$fields) {
$id = ($jush == "mongo" ? "_id" : "itemName()"); // simpledb
if (!$where) { // insert
$row = $driver->select($TABLE, array("*"), $where, array("*"), array(), 1, 0);
$row = ($row ? $row->fetch_assoc() : array($id => ""));
}
if ($row) {
foreach ($row as $key => $val) {
if (!$where) {
$row[$key] = null;
}
$fields[$key] = array("field" => $key, "null" => ($key != $id), "auto_increment" => ($key == $id));
}
}
}
if ($row === false) {
echo "<p class='error'>" . lang('No rows.') . "\n";
}
?>
<form action="" method="post" enctype="multipart/form-data">
<div id="message"></div>
<form action="" method="post" enctype="multipart/form-data" id="form">
<?php
if ($fields) {
echo "<table cellspacing='0'>\n";
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 = (isset($row)
? ($row[$name] != "" && ereg("enum|set", $field["type"]) ? intval($row[$name]) : $row[$name])
: (!$update && $field["auto_increment"] ? "" : (isset($_GET["select"]) ? false : (isset($default) ? $default : $field["default"])))
if ($default === null) {
$default = $field["default"];
if ($field["type"] == "bit" && preg_match("~^b'([01]*)'\$~", $default, $regs)) {
$default = $regs[1];
}
}
$value = ($row !== null
? ($row[$name] != "" && $jush == "sql" && preg_match("~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)
)
);
if (!$_POST["save"] && is_string($value)) {
$value = $adminer->editVal($value, $field);
}
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($where && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : (isset($value) ? '' : 'NULL'))));
if ($field["type"] == "timestamp" && $value == "CURRENT_TIMESTAMP") {
$function = ($_POST["save"] ? (string) $_POST["function"][$name] : ($update && $field["on_update"] == "CURRENT_TIMESTAMP" ? "now" : ($value === false ? null : ($value !== null ? '' : 'NULL'))));
if (preg_match("~time~", $field["type"]) && $value == "CURRENT_TIMESTAMP") {
$value = "";
$function = "now";
}
input($field, $value, $function);
echo "\n";
}
if (!support("table")) {
echo "<tr>"
. "<th><input name='field_keys[]' value='" . h($_POST["field_keys"][0]) . "'>"
. "<td class='function'>" . html_select("field_funs[]", $adminer->editFunctions(array()), $_POST["field_funs"][0])
. "<td><input name='field_vals[]' value='" . h($_POST["field_vals"][0]) . "'>"
. "\n"
;
}
echo "</table>\n";
}
?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="hidden" name="referer" value="<?php echo h(isset($_POST["referer"]) ? $_POST["referer"] : $_SERVER["HTTP_REFERER"]); ?>">
<input type="hidden" name="save" value="1">
<?php
if (isset($_GET["select"])) {
hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
}
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')) . "\">\n";
echo "<input type='submit' name='insert' value='" . ($update
? lang('Save and continue edit') . "' onclick='return !ajaxForm(this.form, \"" . lang('Saving') . '...", this)'
: lang('Save and insert next')
) . "' title='Ctrl+Shift+Enter'>\n";
}
}
if ($update) {
echo "<input type='submit' name='delete' value='" . lang('Delete') . "'$confirm>\n";
echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "'" . confirm() . ">\n"
: ($_POST || !$fields ? "" : "<script type='text/javascript'>focus(document.getElementById('form').getElementsByTagName('td')[1].firstChild);</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>

View File

@@ -2,34 +2,33 @@
$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"
;
query_redirect(($EVENT != ""
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"])
. " DO\n$_POST[EVENT_DEFINITION]"
, substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')));
. ($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 = array();
if ($_POST) {
$row = $_POST;
} elseif ($EVENT != "") {
if (!$row && $EVENT != "") {
$rows = get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . q(DB) . " AND EVENT_NAME = " . q($EVENT));
$row = reset($rows);
}
@@ -37,17 +36,17 @@ if ($_POST) {
<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"]); ?>">
<tr><th><?php echo lang('Every'); ?><td><input name="INTERVAL_VALUE" value="<?php echo h($row["INTERVAL_VALUE"]); ?>" size="6"> <?php echo html_select("INTERVAL_FIELD", $intervals, $row["INTERVAL_FIELD"]); ?>
<tr><th><?php echo lang('Name'); ?><td><input name="EVENT_NAME" value="<?php echo h($row["EVENT_NAME"]); ?>" 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')); ?>
</table>
<p><?php textarea("EVENT_DEFINITION", $row["EVENT_DEFINITION"]); ?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<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(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,23 +1,29 @@
<?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");
if ($_GET["file"] == "favicon.ico") {
header("Content-Type: image/x-icon");
echo base64_decode("compile_file('../adminer/static/favicon.ico', 'base64_encode');");
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
} elseif ($_GET["file"] == "default.css") {
header("Content-Type: text/css; charset=utf-8");
?>compile_file('../adminer/static/default.css', 'minify_css');<?php
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");
?>compile_file('../adminer/static/functions.js', 'JSMin::minify');compile_file('static/editing.js', 'JSMin::minify');<?php
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js;../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.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"]) {
case "plus.gif": echo base64_decode("compile_file('../adminer/static/plus.gif', 'base64_encode');"); break;
case "cross.gif": echo base64_decode("compile_file('../adminer/static/cross.gif', 'base64_encode');"); break;
case "up.gif": echo base64_decode("compile_file('../adminer/static/up.gif', 'base64_encode');"); break;
case "down.gif": echo base64_decode("compile_file('../adminer/static/down.gif', 'base64_encode');"); break;
case "arrow.gif": echo base64_decode("compile_file('../adminer/static/arrow.gif', 'base64_encode');"); break;
case "plus.gif": echo compile_file('../adminer/static/plus.gif'); break;
case "cross.gif": echo compile_file('../adminer/static/cross.gif'); break;
case "up.gif": echo compile_file('../adminer/static/up.gif'); break;
case "down.gif": echo compile_file('../adminer/static/down.gif'); break;
case "arrow.gif": echo compile_file('../adminer/static/arrow.gif'); break;
}
}
exit;

View File

@@ -1,55 +1,60 @@
<?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.'));
$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);
$row["source"] = array_filter($row["source"], 'strlen');
ksort($row["source"]); // enforce input order
$target = array();
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 {
$source = array_filter($_POST["source"], 'strlen');
ksort($source); // enforce input order
$target = array();
foreach ($source as $key => $val) {
$target[$key] = $_POST["target"][$key];
$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 FOREIGN KEY " . idf_escape($_GET["name"]) . "," : "")
. "\nADD FOREIGN KEY (" . implode(", ", array_map('idf_escape', $source)) . ") REFERENCES " . table($_POST["table"]) . " (" . implode(", ", array_map('idf_escape', $target)) . ")"
. (in_array($_POST["on_delete"], $on_actions) ? " ON DELETE $_POST[on_delete]" : "")
. (in_array($_POST["on_update"], $on_actions) ? " 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">
<p>
<?php if ($row["db"] == "") { ?>
<?php if ($row["db"] == "" && $row["ns"] == "") { ?>
<?php echo lang('Target table'); ?>:
<?php echo html_select("table", $referencable, $row["table"], "this.form['change-js'].value = '1'; this.form.submit();"); ?>
<input type="hidden" name="change-js" value="">
@@ -60,19 +65,25 @@ foreach (table_status() as $name => $table_status) {
$j = 0;
foreach ($row["source"] as $key => $val) {
echo "<tr>";
echo "<td>" . html_select("source[" . intval($key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1));
echo "<td>" . html_select("target[" . intval($key) . "]", $target, $row["target"][$key]);
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]);
$j++;
}
?>
</table>
<p>
<?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + $on_actions, $row["on_delete"]); ?>
<?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + $on_actions, $row["on_update"]); ?>
<?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",
'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(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,11 @@
<?php
$connection = '';
if (!$drivers) {
page_header(lang('No extension'), lang('None of the supported PHP extensions (%s) are available.', implode(", ", $possible_drivers)), null);
page_footer("auth");
exit;
}
$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"]) {
@@ -20,88 +15,163 @@ if ($_COOKIE["adminer_permanent"]) {
}
}
if (isset($_POST["server"])) {
$auth = $_POST["auth"];
if ($auth) {
session_regenerate_id(); // defense against session fixation
$_SESSION["pwds"][$_POST["driver"]][$_POST["server"]][$_POST["username"]] = $_POST["password"];
if ($_POST["permanent"]) {
$key = base64_encode($_POST["driver"]) . "-" . base64_encode($_POST["server"]) . "-" . base64_encode($_POST["username"]);
$private = $adminer->permanentLogin();
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($_POST["password"], $private) : "");
$driver = $auth["driver"];
$server = $auth["server"];
$username = $auth["username"];
$password = $auth["password"];
$db = $auth["db"];
set_password($driver, $server, $username, $password);
$_SESSION["db"][$driver][$server][$username][$db] = true;
if ($auth["permanent"]) {
$key = base64_encode($driver) . "-" . 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) == ($_POST["permanent"] ? 5 : 4) // 4 - driver, server, username, password
|| DRIVER != $_POST["driver"]
|| SERVER != $_POST["server"]
|| $_GET["username"] !== $_POST["username"] // "0" == "00"
if (count($_POST) == 1 // 1 - auth
|| DRIVER != $driver
|| SERVER != $server
|| $_GET["username"] !== $username // "0" == "00"
|| DB != $db
) {
redirect(auth_url($_POST["driver"], $_POST["server"], $_POST["username"]));
redirect(auth_url($driver, $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;
} else {
foreach (array("pwds", "dbs", "queries") as $key) {
foreach (array("pwds", "db", "dbs", "queries") as $key) {
set_session($key, null);
}
$key = base64_encode(DRIVER) . "-" . base64_encode(SERVER) . "-" . base64_encode($_GET["username"]);
if ($permanent[$key]) {
unset($permanent[$key]);
cookie("adminer_permanent", implode(" ", $permanent));
}
redirect(substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
unset_permanent();
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.'));
}
} 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) = array_map('base64_decode', explode("-", $key));
$_SESSION["pwds"][$driver][$server][$username] = decrypt_string(base64_decode($cipher), $private);
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($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;
global $connection, $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 (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
$error = lang('Session expired, please login again.');
} else {
$password = &get_session("pwds");
if (isset($password)) {
$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="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.', '<code>permanentLogin()</code>');
}
set_password(DRIVER, SERVER, $_GET["username"], null);
}
unset_permanent();
}
}
$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("driver", "server", "username", "password", "permanent")); // expired session
hidden_fields($_POST, array("auth")); // expired session
echo "</div>\n";
echo "</form>\n";
page_footer("auth");
}
if (isset($_GET["username"]) && class_exists("Min_DB")) { // doesn't exists with passing wrong driver
function set_password($vendor, $server, $username, $password) {
$_SESSION["pwds"][$vendor][$server][$username] = ($_COOKIE["adminer_key"]
? array(encrypt_string($password, $_COOKIE["adminer_key"]))
: $password
);
}
function get_password() {
$return = get_session("pwds");
if (is_array($return)) {
$return = ($_COOKIE["adminer_key"]
? decrypt_string($return[0], $_COOKIE["adminer_key"])
: false
);
}
return $return;
}
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"))) {
if (!is_object($connection) || !$adminer->login($_GET["username"], get_password())) {
auth_error();
exit;
}
$token = $_SESSION["token"]; ///< @var string CSRF protection
if (isset($_POST["server"]) && $_POST["token"]) {
$driver = new Min_Driver($connection);
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.')
);
}
} 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,8 +4,8 @@ error_reporting(6135); // errors and warnings
include "../adminer/include/coverage.inc.php";
// disable filter.default
$filter = (!ereg('^(unsafe_raw)?$', ini_get("filter.default")) || ini_get("filter.default_flags"));
if ($filter) {
$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);
if ($unsafe) {
@@ -14,6 +14,10 @@ if ($filter) {
}
}
if (function_exists("mb_internal_encoding")) {
mb_internal_encoding("8bit");
}
// used only in compiled file
if (isset($_GET["file"])) {
include "../adminer/file.inc.php";
@@ -21,12 +25,18 @@ if (isset($_GET["file"])) {
include "../adminer/include/functions.inc.php";
if (!isset($_SERVER["REQUEST_URI"])) {
$_SERVER["REQUEST_URI"] = $_SERVER["ORIG_PATH_INFO"] . ($_SERVER["QUERY_STRING"] != "" ? "?$_SERVER[QUERY_STRING]" : ""); // IIS 5 compatibility
global $adminer, $connection, $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"];
}
if (!strpos($_SERVER["REQUEST_URI"], '?') && $_SERVER["QUERY_STRING"] != "") { // IIS 7 compatibility
$_SERVER["REQUEST_URI"] .= "?$_SERVER[QUERY_STRING]";
}
$HTTPS = $_SERVER["HTTPS"] && strcasecmp($_SERVER["HTTPS"], "off");
@ini_set("session.use_trans_sid", false); // protect links in export, @ - may be disabled
session_cache_limiter(""); // to allow restarting session and to not send Cache-Control: no-store
if (!defined("SID")) {
session_name("adminer_sid"); // use specific session name to get own namespace
$params = array(0, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"]), "", $HTTPS);
@@ -38,25 +48,31 @@ if (!defined("SID")) {
}
// disable magic quotes to be able to use database escaping function
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE));
if (function_exists("set_magic_quotes_runtime")) {
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
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
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/simpledb.inc.php";
include "../adminer/drivers/mongo.inc.php";
include "../adminer/drivers/elastic.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"]) . '?'
. (SID && !$_COOKIE ? SID . '&' : '') // !$_COOKIE - don't pass SID with permanent login
. (sid() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
. (DB != "" ? 'db=' . urlencode(DB) . '&' . (isset($_GET["ns"]) ? "ns=" . urlencode($_GET["ns"]) . "&" : "") : '')
@@ -67,14 +83,12 @@ include "./include/adminer.inc.php";
include "../adminer/include/design.inc.php";
include "../adminer/include/xxtea.inc.php";
include "../adminer/include/auth.inc.php";
include "./include/connect.inc.php";
include "./include/editing.inc.php";
include "./include/export.inc.php";
session_cache_limiter(""); // to allow restarting session
if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
}
$on_actions = array("RESTRICT", "CASCADE", "SET NULL", "NO ACTION"); ///< @var array used in foreign_keys()
$confirm = " onclick=\"return confirm('" . lang('Are you sure?') . "');\""; ///< @var string
include "./include/connect.inc.php";
include "./include/editing.inc.php";
$on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys()

View File

@@ -1,18 +1,19 @@
<?php
function connect_error() {
global $connection, $token, $error, $drivers;
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) {
set_session("dbs", null);
queries_redirect(substr(ME, 0, -1), lang('Databases have been dropped.'), drop_databases($_POST["db"]));
}
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 new database'),
'privileges' => lang('Privileges'),
'processlist' => lang('Process list'),
'variables' => lang('Variables'),
@@ -24,40 +25,69 @@ function connect_error() {
}
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('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
$databases = get_databases();
$databases = $adminer->databases();
if ($databases) {
$scheme = support("scheme");
$collations = collations();
echo "<form action='' method='post'>\n";
echo "<table cellspacing='0' onclick='tableClick(event);'>\n";
echo "<thead><tr><td><input type='hidden' name='token' value='$token'>&nbsp;<th>" . lang('Database') . "<td>" . lang('Collation') . "<td>" . lang('Tables') . "</thead>\n";
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo "<thead><tr>" . (support("database") ? "<td>&nbsp;" : "") . "<th>" . lang('Database') . "<td>" . lang('Collation') . "<td>" . lang('Tables') . "</thead>\n";
foreach ($databases as $db) {
$root = h(ME) . "db=" . urlencode($db);
echo "<tr" . odd() . "><td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]));
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"])) : "");
echo "<th><a href='$root'>" . h($db) . "</a>";
echo "<td><a href='$root&amp;database='>" . nbsp(db_collation($db, $collations)) . "</a>";
echo "<td align='right'><a href='$root&amp;schema=' id='tables-" . h($db) . "'>?</a>";
$collation = nbsp(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') . "'>?</a>";
echo "\n";
}
echo "</table>\n";
echo "<p><input type='submit' name='drop' value='" . lang('Drop') . "' onclick=\"return confirm('" . lang('Are you sure?') . " (' + formChecked(this, /db/) + ')');\">\n";
echo (support("database")
? "<fieldset><legend>" . lang('Selected') . " <span id='selected'></span></legend><div>\n"
. "<input type='hidden' name='all' value='' onclick=\"selectCount('selected', formChecked(this, /^db/));\">\n" // used by trCheck()
. "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n"
. "</div></fieldset>\n"
: ""
);
echo "<script type='text/javascript'>tableCheck();</script>\n";
echo "<input type='hidden' name='token' value='$token'>\n";
echo "</form>\n";
}
echo "<p><a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>\n";
}
page_footer("db");
echo "<script type='text/javascript' src='" . h(ME) . "script=connect'></script>\n";
if ($databases) {
echo "<script type='text/javascript'>ajaxSetHtml('" . js_escape(ME) . "script=connect');</script>\n";
}
}
if (isset($_GET["status"])) {
$_GET["variables"] = $_GET["status"];
}
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")) {
if (DB != "") {
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();
set_session("dbs", null);
}
connect_error(); // separate function to catch SQLite error
exit;
}
if (support("scheme") && DB != "" && $_GET["ns"] !== "" && (!isset($_GET["ns"]) || !set_schema($_GET["ns"]))) {
redirect(preg_replace('~ns=[^&]*&~', '', ME) . "ns=" . get_schema());
if (support("scheme") && DB != "" && $_GET["ns"] !== "") {
if (!isset($_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

@@ -1,45 +1,52 @@
<?php
/** Print HTML header
* @param string used in title, breadcrumb and heading
* @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
* @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, $HTTPS, $adminer, $connection, $drivers;
header("Content-Type: text/html; charset=utf-8");
header("X-Frame-Options: deny"); // ClickJacking protection in IE8, Safari 4, Chrome 2, Firefox NoScript plugin
$title_all = $title . ($title2 != "" ? ": " . h($title2) : "");
$protocol = ($HTTPS ? "https" : "http");
global $LANG, $VERSION, $adminer, $connection, $drivers, $jush;
page_headers();
$title_all = $title . ($title2 != "" ? ": $title2" : "");
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="<?php echo $LANG; ?>">
<!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_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name(); ?></title>
<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 if ($adminer->head()) { ?>
<link rel="shortcut icon" type="image/x-icon" href="../adminer/static/favicon.ico">
<link rel="stylesheet" type="text/css" href="../adminer/static/default.css<?php // Ondrej Valka, http://valka.info ?>">
<link rel="apple-touch-icon" href="../adminer/static/favicon.ico">
<?php if (file_exists("adminer.css")) { ?>
<link rel="stylesheet" type="text/css" href="adminer.css">
<?php } ?>
<?php } ?>
<body onload="bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>', '<?php echo $protocol; ?>');<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " verifyVersion('$protocol');"); ?>">
<script type="text/javascript" src="../adminer/static/functions.js"></script>
<script type="text/javascript" src="static/editing.js"></script>
<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('$VERSION');"); ?>">
<script type="text/javascript">
document.body.className = document.body.className.replace(/ nojs/, ' js');
</script>
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden" onmouseover="helpOpen = 1;" onmouseout="helpMouseout(this, event);"></div>
<div id="content">
<?php
if (isset($breadcrumb)) {
$link = substr(preg_replace('~(username|db|ns)=[^&]*&~', '', ME), 0, -1);
echo '<p id="breadcrumb"><a href="' . ($link ? h($link) : ".") . '">' . $drivers[DRIVER] . '</a> &raquo; ';
$link = substr(preg_replace('~(db|ns)=[^&]*&~', '', ME), 0, -1);
if ($breadcrumb !== null) {
$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('~\b(db|ns)=[^&]*&~', '', ME), 0, -1);
$server = (SERVER != "" ? h(SERVER) : lang('Server'));
if ($breadcrumb === false) {
echo "$server\n";
} else {
echo "<a href='" . ($link ? h($link) : ".") . "'>$server</a> &raquo; ";
echo "<a href='" . ($link ? h($link) : ".") . "' accesskey='1' title='Alt+Shift+1'>$server</a> &raquo; ";
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> &raquo; ';
}
@@ -48,9 +55,9 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
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; ";
}
}
}
@@ -59,31 +66,65 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
}
echo "<h2>$title_all</h2>\n";
restart_session();
if ($_SESSION["messages"]) {
echo "<div class='message'>" . implode("</div>\n<div class='message'>", $_SESSION["messages"]) . "</div>\n";
$_SESSION["messages"] = array();
}
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");
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
}
}
/** 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>\n";
unset($_SESSION["messages"][$uri]);
}
if ($error) {
echo "<div class='error'>$error</div>\n";
}
}
/** Print HTML footer
* @param string auth|db
* @param string "auth", "db", "ns"
* @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>
<script type="text/javascript">setupSubmitHighlight(document);</script>
<?php
}

View File

@@ -0,0 +1,108 @@
<?php
/*abstract*/ class Min_SQL {
var $_conn;
/** Create object for performing database operations
* @param Min_DB
*/
function Min_SQL($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, $limit, $page, $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"
);
}
if ($print) {
echo $adminer->selectQuery($query);
}
return $this->_conn->query($query);
}
/** 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($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($query, $queryWhere) : " $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");
}
function commit() {
return queries("COMMIT");
}
function rollback() {
return queries("ROLLBACK");
}
}

View File

@@ -2,14 +2,17 @@
/** Print select result
* @param Min_Result
* @param Min_DB connection to examine indexes
* @return null
* @param array
* @return array $orgtables
*/
function select($result, $connection2 = null) {
function select($result, $connection2 = null, $orgtables = array()) {
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
$blobs = array(); // colno => bool - display bytes for blobs
$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++) {
if (!$i) {
@@ -17,9 +20,13 @@ function select($result, $connection2 = null) {
echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) {
$field = $result->fetch_field();
$name = $field->name;
$orgtable = $field->orgtable;
$orgname = $field->orgname;
if ($orgtable != "") {
$return[$field->table] = $orgtable;
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$links[$j] = ($name == "table" ? "table=" : ($name == "possible_keys" ? "indexes=" : null));
} elseif ($orgtable != "") {
if (!isset($indexes[$orgtable])) {
// find primary key in each table
$indexes[$orgtable] = array();
@@ -41,37 +48,43 @@ function select($result, $connection2 = null) {
$blobs[$j] = true;
}
$types[$j] = $field->type;
echo "<th" . ($orgtable != "" || $field->name != $orgname ? " title='" . h(($orgtable != "" ? "$orgtable." : "") . $orgname) . "'" : "") . ">" . h($field->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))) : "")
;
}
echo "</thead>\n";
}
echo "<tr" . odd() . ">";
foreach ($row as $key => $val) {
if (!isset($val)) {
if ($val === null) {
$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 {
if ($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
$val = "<code>$val</code>";
}
$val = h($val);
if ($types[$key] == 254) { // 254 - char
$val = "<code>$val</code>";
}
if (isset($links[$key]) && !$columns[$links[$key]]) {
}
if (isset($links[$key]) && !$columns[$links[$key]]) {
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
$table = $row[array_search("table=", $links)];
$link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
} else {
$link = "edit=" . urlencode($links[$key]);
foreach ($indexes[$links[$key]] as $col => $j) {
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
}
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
}
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
}
echo "<td>$val";
}
}
echo ($i ? "</table>" : "<p class='message'>" . lang('No rows.')) . "\n";
return $return;
}
/** Get referencable tables with single column primary key except self
@@ -80,7 +93,7 @@ function select($result, $connection2 = null) {
*/
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"]) {
@@ -104,7 +117,16 @@ function referencable_primary($self) {
* @return null
*/
function textarea($name, $value, $rows = 10, $cols = 80) {
echo "<textarea name='$name' rows='$rows' cols='$cols' style='width: 98%;' spellcheck='false' onkeydown='return textareaKeydown(this, event);'>" . h($value) . "</textarea>"; // spellcheck - 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)
}
} else {
echo h($value);
}
echo "</textarea>";
}
/** Print table columns for type edit
@@ -116,12 +138,22 @@ function textarea($name, $value, $rows = 10, $cols = 80) {
*/
function edit_type($key, $field, $collations, $foreign_keys = 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><?php
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($on_actions, $field["on_delete"]) . "</select> " : " "); // space for IE
<td><select name="<?php echo $key; ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"<?php echo on_help("getTarget(event).value", 1); ?>><?php
if ($type && !isset($types[$type]) && !isset($foreign_keys[$type])) {
array_unshift($structured_types, $type);
}
if ($foreign_keys) {
$structured_types[lang('Foreign keys')] = $foreign_keys;
}
echo optionlist($structured_types, $type);
?></select>
<td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3" onfocus="editingLengthFocus(this);"<?php echo (!$field["length"] && preg_match('~var(char|binary)$~', $type) ? " class='required'" : ""); ?> onchange="editingLengthChange(this);" onkeyup="this.onchange();"><td class="options"><?php //! type="number" with enabled JavaScript
echo "<select name='$key" . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='$key" . "[unsigned]'" . (!$type || preg_match('~((^|[^o])int|float|double|decimal)$~', $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='$key" . "[on_update]'" . ($type == "timestamp" ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
echo ($foreign_keys ? "<select name='$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
@@ -130,7 +162,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
@@ -141,9 +176,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('~(^|[^o])int|float|double|decimal~', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
. (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " $collate " . q($field["collation"]) : "")
;
}
@@ -153,12 +188,18 @@ function process_type($field, $collate = "COLLATE") {
* @return array array("field", "type", "NULL", "DEFAULT", "ON UPDATE", "COMMENT", "AUTO_INCREMENT")
*/
function process_field($field, $type_field) {
global $jush;
$default = $field["default"];
return array(
idf_escape($field["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["default"] : q($field["default"])) : ""),
($field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(isset($default) ? " DEFAULT " . (
(preg_match('~time~', $field["type"]) && preg_match('~^CURRENT_TIMESTAMP$~i', $default))
|| ($field["type"] == "bit" && preg_match("~^([0-9]+|b'[0-1]+')\$~", $default))
|| ($jush == "pgsql" && preg_match("~^[a-z]+\\(('[^']*')+\\)\$~", $default))
? $default : q($default)) : ""),
($field["type"] == "timestamp" && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
($field["auto_increment"] ? auto_increment() : null),
);
@@ -175,7 +216,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'";
}
}
@@ -185,18 +226,12 @@ 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()
* @return bool column comments used
* @param bool display comments column
* @return null
*/
function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array(), $comments = false) {
global $inout;
foreach ($fields as $field) {
if ($field["comment"] != "") {
$comments = true;
break;
}
}
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
global $connection, $inout;
?>
<thead><tr class="wrap">
<?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
@@ -206,12 +241,18 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
<td><?php echo lang('Options'); ?>
<?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 class="hidden"><?php echo lang('Default values'); ?>
<td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
'sql' => "example-auto-increment.html",
'sqlite' => "autoinc.html",
'pgsql' => "datatype.html#DATATYPE-SERIAL",
'mssql' => "ms186775.aspx",
)); ?>
<td><?php echo lang('Default values'); ?>
<?php echo (support("comment") ? "<td" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?php } ?>
<td><?php echo "<input type='image' 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 type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
</thead>
<tbody onkeydown="return editingKeydown(event);">
<?php
foreach ($fields as $i => $field) {
$i++;
@@ -219,31 +260,31 @@ function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $forei
$display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i])) && (support("drop_col") || $orig == "");
?>
<tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
<?php echo ($type == "PROCEDURE" ? "<td>" . html_select("fields[$i][inout]", $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); ?>">
<?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="editingNameChange(this);<?php echo ($field["field"] != "" || count($fields) > 1 ? '' : ' editingAddRow(this);" onkeyup="if (this.value) editingAddRow(this);'); ?>" maxlength="64" autocapitalize="off"><?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 class="hidden"><?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='255'>" : ""); ?>
<td><?php echo checkbox("fields[$i][null]", 1, $field["null"], "", "", "block"); ?>
<td><label class="block"><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(); }"></label><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"]); ?>" onkeyup="keyupChange.call(this);" 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
echo "<td>";
echo (support("move_col") ?
"<input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, $allowed, 1);'>&nbsp;"
. "<input type='image' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>&nbsp;"
. "<input type='image' 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') . "' onclick='return !editingAddRow(this, 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;"
: "");
echo ($orig == "" || support("drop_col") ? "<input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editingRemoveRow(this);'>" : "");
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, 'fields\$1[field]');\">" : "");
echo "\n";
}
return $comments;
}
/** Move fields up and down or add field
* @param array
* @return null
* @return bool
*/
function process_fields(&$fields) {
ksort($fields);
@@ -261,8 +302,7 @@ function process_fields(&$fields) {
}
$offset++;
}
}
if ($_POST["down"]) {
} elseif ($_POST["down"]) {
$found = false;
foreach ($fields as $key => $field) {
if (isset($field["field"]) && $found) {
@@ -275,11 +315,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()
@@ -295,7 +337,7 @@ function normalize_enum($match) {
* @param array
* @param string
* @param string
* @return
* @return bool
*/
function grant($grant, $privileges, $columns, $on) {
if (!$privileges) {
@@ -312,24 +354,145 @@ function grant($grant, $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) {
restart_session();
$_SESSION["messages"][] = $message_drop;
}
return $dropped;
}
/** 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]";
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;
$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 "CREATE $routine "
. idf_escape(trim($row["name"]))
. " (" . implode(", ", $set) . ")"
. (isset($_GET["function"]) ? " RETURNS" . process_type($row["returns"], "CHARACTER SET") : "")
. ($row["language"] ? " LANGUAGE $row[language]" : "")
. rtrim("\n$row[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
}
/** 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 ";
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
* @param string
* @return int
*/
function ini_bytes($ini) {
$val = ini_get($ini);
switch (strtolower(substr($val, -1))) {
case 'g': $val *= 1024; // no break
case 'm': $val *= 1024; // no break
case 'k': $val *= 1024;
}
return $val;
}
/** Create link to database documentation
* @param array $jush => $path
* @return string HTML code
*/
function doc_link($paths) {
global $jush, $connection;
$urls = array(
'sql' => "http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/",
'sqlite' => "http://www.sqlite.org/",
'pgsql' => "http://www.postgresql.org/docs/" . substr($connection->server_info, 0, 3) . "/static/",
'mssql' => "http://msdn.microsoft.com/library/",
'oracle' => "http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/",
);
return ($paths[$jush] ? "<a href='$urls[$jush]$paths[$jush]' target='_blank' rel='noreferrer'><sup>?</sup></a>" : "");
}

View File

@@ -1,176 +0,0 @@
<?php
function tar_file($filename, $contents) {
$return = pack("a100a8a8a8a12a12", $filename, 644, 0, 0, decoct(strlen($contents)), 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);
}
function dump_table($table, $style, $is_view = false) {
if ($_POST["format"] != "sql") {
echo "\xef\xbb\xbf"; // UTF-8 byte order mark
if ($style) {
dump_csv(array_keys(fields($table)));
}
} elseif ($style) {
$create = create_sql($table, $_POST["auto_increment"]);
if ($create) {
if ($style == "DROP+CREATE") {
echo "DROP " . ($is_view ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n";
}
if ($is_view) {
// remove DEFINER with current user
$create = preg_replace('~^([A-Z =]+) DEFINER=`' . str_replace("@", "`@`", logged_user()) . '`~', '\\1', $create); //! proper escaping of user
}
echo ($style != "CREATE+ALTER" ? $create : ($is_view ? substr_replace($create, " OR REPLACE", 6, 0) : substr_replace($create, " IF NOT EXISTS", 12, 0))) . ";\n\n";
}
if ($style == "CREATE+ALTER" && !$is_view) {
// create procedure which iterates over original columns and adds new and removes old
$query = "SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, COLLATION_NAME, COLUMN_TYPE, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = " . q($table) . " ORDER BY ORDINAL_POSITION";
echo "DELIMITER ;;
CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN
DECLARE _column_name, _collation_name, after varchar(64) DEFAULT '';
DECLARE _column_type, _column_default text;
DECLARE _is_nullable char(3);
DECLARE _extra varchar(30);
DECLARE _column_comment varchar(255);
DECLARE done, set_after bool DEFAULT 0;
DECLARE add_columns text DEFAULT '";
$fields = array();
$after = "";
foreach (get_rows($query) as $row) {
$default = $row["COLUMN_DEFAULT"];
$row["default"] = (isset($default) ? q($default) : "NULL");
$row["after"] = q($after); //! rgt AFTER lft, lft AFTER id doesn't work
$row["alter"] = escape_string(idf_escape($row["COLUMN_NAME"])
. " $row[COLUMN_TYPE]"
. ($row["COLLATION_NAME"] ? " COLLATE $row[COLLATION_NAME]" : "")
. (isset($default) ? " DEFAULT " . ($default == "CURRENT_TIMESTAMP" ? $default : $row["default"]) : "")
. ($row["IS_NULLABLE"] == "YES" ? "" : " NOT NULL")
. ($row["EXTRA"] ? " $row[EXTRA]" : "")
. ($row["COLUMN_COMMENT"] ? " COMMENT " . q($row["COLUMN_COMMENT"]) : "")
. ($after ? " AFTER " . idf_escape($after) : " FIRST")
);
echo ", ADD $row[alter]";
$fields[] = $row;
$after = $row["COLUMN_NAME"];
}
echo "';
DECLARE columns CURSOR FOR $query;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET @alter_table = '';
OPEN columns;
REPEAT
FETCH columns INTO _column_name, _column_default, _is_nullable, _collation_name, _column_type, _extra, _column_comment;
IF NOT done THEN
SET set_after = 1;
CASE _column_name";
foreach ($fields as $row) {
echo "
WHEN " . q($row["COLUMN_NAME"]) . " THEN
SET add_columns = REPLACE(add_columns, ', ADD $row[alter]', '');
IF NOT (_column_default <=> $row[default]) OR _is_nullable != '$row[IS_NULLABLE]' OR _collation_name != '$row[COLLATION_NAME]' OR _column_type != " . q($row["COLUMN_TYPE"]) . " OR _extra != '$row[EXTRA]' OR _column_comment != " . q($row["COLUMN_COMMENT"]) . " OR after != $row[after] THEN
SET @alter_table = CONCAT(@alter_table, ', MODIFY $row[alter]');
END IF;"; //! don't replace in comment
}
echo "
ELSE
SET @alter_table = CONCAT(@alter_table, ', DROP ', _column_name);
SET set_after = 0;
END CASE;
IF set_after THEN
SET after = _column_name;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE columns;
IF @alter_table != '' OR add_columns != '' THEN
SET alter_command = CONCAT(alter_command, 'ALTER TABLE " . table($table) . "', SUBSTR(CONCAT(add_columns, @alter_table), 2), ';\\n');
END IF;
END;;
DELIMITER ;
CALL adminer_alter(@adminer_alter);
DROP PROCEDURE adminer_alter;
";
//! indexes
}
}
}
function dump_data($table, $style, $select = "") {
global $connection, $jush;
$max_packet = ($jush == "sqlite" ? 0 : 1048576); // default, minimum is 1024
if ($style) {
if ($_POST["format"] == "sql" && $style == "TRUNCATE+INSERT") {
echo truncate_sql($table) . ";\n";
}
$fields = fields($table);
$result = $connection->query(($select ? $select : "SELECT * FROM " . table($table)), 1); // 1 - MYSQLI_USE_RESULT //! enum and set as numbers
if ($result) {
$insert = "";
$buffer = "";
while ($row = $result->fetch_assoc()) {
if ($_POST["format"] != "sql") {
dump_csv($row);
} else {
if (!$insert) {
$insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', array_keys($row))) . ") VALUES";
}
foreach ($row as $key => $val) {
$row[$key] = (isset($val) ? (ereg('int|float|double|decimal', $fields[$key]["type"]) ? $val : q($val)) : "NULL"); //! columns looking like functions
}
$s = implode(",\t", $row);
if ($style == "INSERT+UPDATE") {
$set = array();
foreach ($row as $key => $val) {
$set[] = idf_escape($key) . " = $val";
}
echo "$insert ($s) ON DUPLICATE KEY UPDATE " . implode(", ", $set) . ";\n";
} else {
$s = ($max_packet ? "\n" : " ") . "($s)";
if (!$buffer) {
$buffer = $insert . $s;
} elseif (strlen($buffer) + 2 + strlen($s) < $max_packet) { // 2 - separator and terminator length
$buffer .= ",$s";
} else {
$buffer .= ";\n";
echo $buffer;
$buffer = $insert . $s;
}
}
}
}
if ($_POST["format"] == "sql" && $style != "INSERT+UPDATE" && $buffer) {
$buffer .= ";\n";
echo $buffer;
}
}
}
}
function dump_headers($identifier, $multi_table = false) {
$filename = ($identifier != "" ? friendly_url($identifier) : "adminer");
$output = $_POST["output"];
$ext = ($_POST["format"] == "sql" ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
header("Content-Type: " .
($output == "bz2" ? "application/x-bzip" :
($output == "gz" ? "application/x-gzip" :
($ext == "tar" ? "application/x-tar" :
($ext == "sql" || $output != "file" ? "text/plain" : "text/csv") . "; charset=utf-8"
))));
if ($output != "text") {
header("Content-Disposition: attachment; filename=$filename.$ext" . ($output != "file" && !ereg('[^0-9a-z]', $output) ? ".$output" : ""));
}
session_write_close();
if ($_POST["output"] == "bz2") {
ob_start('bzcompress', 1e6);
}
if ($_POST["output"] == "gz") {
ob_start('gzencode', 1e6);
}
return $ext;
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,47 +2,90 @@
// not used in a single language version
$langs = array(
'en' => 'English', // Jakub Vrána - http://php.vrana.cz
'cs' => 'Čeština', // Jakub Vrána - http://php.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
'en' => 'English', // Jakub Vrána - http://www.vrana.cz
'ar' => 'العربية', // Y.M Amine - Algeria - nbr7@live.fr
'bn' => 'বাংলা', // Dipak Kumar - dipak.ndc@gmail.com
'ca' => 'Català', // Joan Llosas
'cs' => 'Čeština', // Jakub Vrána - http://www.vrana.cz
'de' => 'Deutsch', // Klemens Häckel - http://clickdimension.wordpress.com
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'it' => 'Italiano', // Alessandro Fiorotto, Paolo Asperti
'es' => 'Español', // Klemens Häckel - http://clickdimension.wordpress.com
'et' => 'Eesti', // Priit Kallas
'fa' => 'فارسی', // mojtaba barghbani - Iran - mbarghbani@gmail.com
'fr' => 'Français', // Francis Gagné, Aurélien Royer
'hu' => 'Magyar', // Borsos Szilárd (Borsosfi) - http://www.borsosfi.hu, info@borsosfi.hu
'ru' => 'Русский язык', // Maksim Izmaylov
'zh' => '简体中文', // Mr. Lodar
'zh-tw' => '繁體中文', // http://tzangms.com
'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/
'ko' => '한국어', // dalli - skcha67@gmail.com
'lt' => 'Lietuvių', // Paulius Leščinskas - http://www.lescinskas.lt
'nl' => 'Nederlands', // Maarten Balliauw - http://blog.maartenballiauw.be
'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
'ro' => 'Limba Română', // .nick .messing - dot.nick.dot.messing@gmail.com
'ru' => 'Русский язык', // Maksim Izmaylov
'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
'zh' => '简体中文', // Mr. Lodar, vea - urn2.net - vea.urn2@gmail.com
'zh-tw' => '繁體中文', // http://tzangms.com
);
/** Get current language
* @return string
*/
function get_lang() {
global $LANG;
return $LANG;
}
/** Translate string
* @param string
* @param int
* @return string
*/
function lang($idf, $number = null) {
global $LANG, $translations;
$translation = $translations[$idf];
if (is_array($translation) && $translation) {
$pos = ($number == 1 || (!$number && $LANG == 'fr') ? 0 : ((!$number || $number >= 5) && ereg('cs|sk|ru', $LANG) ? 2 : 1)); // French treat zero as singular, Slavic languages use different form for 2, 3, 4
$translation = ($translations[$idf] ? $translations[$idf] : $idf);
if (is_array($translation)) {
$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 == '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
))))))); // http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
$translation = $translation[$pos];
}
$args = func_get_args();
array_shift($args);
return vsprintf((isset($translation) ? $translation : $idf), $args);
$format = str_replace("%d", "%s", $translation);
if ($format != $translation) {
$args[0] = number_format($number, 0, ".", lang(','));
}
return vsprintf($format, $args);
}
function switch_lang() {
global $LANG, $langs;
echo "<form action=''>\n<div id='lang'>";
hidden_fields($_GET, array('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='" . get_token() . "'>\n"; // $token may be empty in auth.inc.php
echo "</div>\n</form>\n";
}
if (isset($_GET["lang"])) {
$_COOKIE["adminer_lang"] = $_GET["lang"];
$_SESSION["lang"] = $_GET["lang"]; // cookies may be disabled
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
redirect(remove_from_uri());
}
$LANG = "en";

View File

@@ -2,15 +2,23 @@
// PDO can be used in several database drivers
if (extension_loaded('pdo')) {
/*abstract*/ class Min_PDO extends PDO {
var $_result, $server_info, $affected_rows, $error;
var $_result, $server_info, $affected_rows, $errno, $error;
function __construct() {
global $adminer;
$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) {
try {
parent::__construct($dsn, $username, $password);
} catch (Exception $ex) {
auth_error($ex);
exit;
}
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
$this->server_info = $this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
}
@@ -19,9 +27,9 @@ if (extension_loaded('pdo')) {
function query($query, $unbuffered = false) {
$result = parent::query($query);
$this->error = "";
if (!$result) {
$errorInfo = $this->errorInfo();
$this->error = $errorInfo[2];
list(, $this->errno, $this->error) = $this->errorInfo();
return false;
}
$this->store_result($result);
@@ -35,6 +43,9 @@ if (extension_loaded('pdo')) {
function store_result($result = null) {
if (!$result) {
$result = $this->_result;
if (!$result) {
return false;
}
}
if ($result->columnCount()) {
$result->num_rows = $result->rowCount(); // is not guaranteed to work with all drivers
@@ -45,7 +56,11 @@ if (extension_loaded('pdo')) {
}
function next_result() {
return $this->_result->nextRowset();
if (!$this->_result) {
return false;
}
$this->_result->_offset = 0;
return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
}
function result($query, $field = 0) {
@@ -73,11 +88,10 @@ if (extension_loaded('pdo')) {
$row = (object) $this->getColumnMeta($this->_offset++);
$row->orgtable = $row->table;
$row->orgname = $row->name;
$row->charsetnr = (in_array("blob", $row->flags) ? 63 : 0);
$row->charsetnr = (in_array("blob", (array) $row->flags) ? 63 : 0);
return $row;
}
}
}
$possible_drivers = array();
$drivers = array();

View File

@@ -0,0 +1,22 @@
<?php
class TmpFile {
var $handler;
var $size;
function TmpFile() {
$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.0.0";
$VERSION = "4.0.2";

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,17 @@
<?php
/** Adminer - Compact database management
* @link http://www.adminer.org/
* @author Jakub Vrana, http://php.vrana.cz/
* @author Jakub Vrana, http://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)
*/
include "./include/bootstrap.inc.php";
include "./include/tmpfile.inc.php";
$enum_length = '\'(?:\'\'|[^\'\\\\]|\\\\.)*\'|"(?:""|[^"\\\\]|\\\\.)*"';
$inout = array("IN", "OUT", "INOUT");
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*+'";
$inout = "IN|OUT|INOUT";
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
$_GET["edit"] = $_GET["select"];
@@ -20,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,48 +1,64 @@
<?php
$TABLE = $_GET["indexes"];
$index_types = array("PRIMARY", "UNIQUE", "INDEX");
$table_status = table_status($TABLE);
if (ereg("MyISAM|Maria", $table_status["Engine"])) {
$table_status = table_status($TABLE, true);
if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.6 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "FULLTEXT";
}
$indexes = indexes($TABLE);
if ($jush == "sqlite") { // doesn't support primary key
$primary = array();
if ($jush == "mongo") { // doesn't support primary key
$primary = $indexes["_id_"];
unset($index_types[0]);
unset($indexes[""]);
unset($indexes["_id_"]);
}
if ($_POST && !$error && !$_POST["add"]) {
$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 ? "(" . intval($length) . ")" : "");
$desc = $index["descs"][$key];
$set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
$columns[] = $column;
$lengths[] = ($length ? $length : null);
$descs[] = $desc;
}
}
if ($columns) {
foreach ($indexes as $name => $existing) {
$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 2;
continue;
}
}
$alter[] = array($index["type"], "(" . implode(", ", $set) . ")");
$alter[] = array($index["type"], $name, "(" . implode(", ", $set) . ")");
}
}
}
// drop removed indexes
foreach ($indexes as $name => $existing) {
$alter[] = array($existing["type"], idf_escape($name), "DROP");
$alter[] = array($existing["type"], $name, "DROP");
}
if (!$alter) {
redirect(ME . "table=" . urlencode($TABLE));
@@ -50,51 +66,71 @@ 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]["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">
<table cellspacing="0" class="nowrap">
<thead><tr><th><?php echo lang('Index Type'); ?><th><?php echo lang('Column (length)'); ?></thead>
<thead><tr>
<th><?php echo lang('Index Type'); ?>
<th><input type="submit" style="left: -1000px; position: absolute;"><?php echo lang('Column (length)'); ?>
<th><?php echo lang('Name'); ?>
<th><noscript><input type='image' class='icon' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='<?php echo lang('Add next'); ?>'></noscript>&nbsp;
</thead>
<?php
if ($primary) {
echo "<tr><td>PRIMARY<td>";
foreach ($primary["columns"] as $key => $column) {
echo "<select disabled>" . optionlist($fields, $column) . "</select>";
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 $column) {
echo "<span>" . html_select("indexes[$j][columns][$i]", array(-1 => "") + $fields, $column, ($i == count($index["columns"]) ? "indexesAddColumn(this);" : 1));
echo "<input name='indexes[$j][lengths][$i]' size='2' value='" . h($index["lengths"][$i]) . "'> </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(this);" : 1));
echo "<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 ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "'>" : "");
echo ($jush != "sql" ? 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'>\n";
echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'indexes\$1[type]');\">\n";
}
$j++;
}
?>
</table>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<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>

269
adminer/lang/ar.inc.php Normal file
View File

@@ -0,0 +1,269 @@
<?php
$translations = array(
'Login' => 'تسجيل الدخول',
'Logout successful.' => 'مع السلامة.',
'Invalid credentials.' => 'فشل في تسجيل الدخول.',
'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 created.' => 'تم إنشاء قاعدة البيانات.',
'Database has been renamed.' => 'تمت إعادة تسمية فاعدة البيانات.',
'Database has been altered.' => 'تم تعديل قاعدة البيانات.',
'Alter database' => 'تعديل قاعدة البيانات',
'Create database' => 'إنشاء قاعدة بيانات',
'SQL command' => 'إستعلام SQL',
'Dump' => 'تصدير',
'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 Token خاطئ. من فضلك أعد إرسال الإستمارة.',
'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 المدعومة غير موجودة.',
'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' => 'الحدث',
'%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 في خيارات ال PHP.',
'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' => 'الأسطر',
',' => ',',
'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' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'jj/mm/[aaaa]',
'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' => 'المخطط',
'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.' => 'تم إدراج العنصر.',
'now' => 'الآن',
'%d query(s) executed OK.' => array('تم تنفيذ الإستعلام %d بنجاح.', 'تم تنفيذ الإستعلامات %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',
);

269
adminer/lang/bn.inc.php Normal file
View File

@@ -0,0 +1,269 @@
<?php
$translations = array(
'Login' => 'লগইন',
'Logout successful.' => 'লগআউট সম্পন্ন হয়েছে।',
'Invalid credentials.' => 'ভুল পাসওয়ার্ড।',
'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' => 'নির্বাচন',
'Item has been deleted.' => 'বিষয়বস্তু মুছে ফেলা হয়েছে।',
'Item has been updated.' => 'বিষয়বস্তু আপডেট করা হয়েছে।',
'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
'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.' => array('কোয়্যারী সম্পাদন হয়েছে, %d সারি প্রভাবিত হয়েছে।', 'কোয়্যারী সম্পাদন হয়েছে, %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)' => array('%d বাইট', '%d বাইটসমূহ'),
'No commands to execute.' => 'সম্পাদন করার মত কোন নির্দেশ নাই।',
'Unable to upload a file.' => 'ফাইল আপলোড করা সম্ভব হচ্ছে না।',
'File upload' => 'ফাইল আপলোড',
'File uploads are disabled.' => 'ফাইল আপলোড নিষ্ক্রিয় করা আছে।',
'Routine has been called, %d row(s) affected.' => array('রুটিন কল করা হয়েছে, %d টি সারি (সমূহ) প্রভাবিত হয়েছে।', 'রুটিন কল করা হয়েছে, %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.' => array('%d টি প্রসেস (সমূহ) বিনষ্ট করা হয়েছে।', '%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, %s PHP এক্সটেনশনের মধ্য দিয়ে',
'%d row(s)' => array('%d সারি', '%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 ডাটা। ডাটা সংক্ষিপ্ত করো অথবা %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' => 'সারি',
',' => ',',
'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.' => array('%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।', '%d টি সারি (সমূহ) ইমপোর্ট করা হয়েছে।'),
'anywhere' => 'যে কোন স্থানে',
'Import' => 'ইমপোর্ট',
'Stop on error' => 'ত্রুটি পেলে থেমে যাও',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 't.m.[jjjj]',
'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.' => array('%d ইমেইল (গুলি) পাঠানো হয়েছে।', '%d ইমেইল (গুলি) পাঠানো হয়েছে।'),
'Webserver file %s' => 'ওয়েবসার্ভার ফাইল %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.' => array('SQL-কোয়্যারী সফলভাবে সম্পন্ন হয়েছে', '%d SQL-কোয়্যারীসমূহ সফলভাবে সম্পন্ন হয়েছে'),
'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' => 'HH:MM:SS',
);

270
adminer/lang/ca.inc.php Normal file
View File

@@ -0,0 +1,270 @@
<?php
$translations = array(
'Login' => 'Inicia la sessió',
'Logout successful.' => 'Desconnexió correcta.',
'Invalid credentials.' => 'Credencials invàlids.',
'Server' => 'Servidor',
'Username' => 'Nom d\'usuari',
'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.',
'Alter table' => 'Modifica la taula',
'Create table' => 'Crea una taula',
'Table name' => 'Nom de la taula',
'engine' => 'motor',
'collation' => 'compaginació',
'Column name' => 'Nom de la columna',
'Type' => 'Tipus',
'Length' => 'Llargada',
'Auto Increment' => 'Increment automàtic',
'Options' => 'Opcions',
'Save' => 'Desa',
'Drop' => 'Suprimeix',
'Database has been dropped.' => 'S\'ha suprimit la base de dades.',
'Database has been created.' => 'S\'ha creat la base de dades.',
'Database has been renamed.' => 'S\'ha canviat el nom de la base de dades.',
'Database has been altered.' => 'S\'ha modificat la base de dades.',
'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',
'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.',
'Edit' => 'Edita',
'Insert' => 'Insereix',
'Save and insert next' => 'Desa i insereix el següent',
'Delete' => 'Suprimeix',
'Database' => 'Base de dades',
'Routines' => 'Rutines',
'Indexes have been altered.' => 'S\'han modificat els índexs.',
'Indexes' => 'Índexs',
'Alter indexes' => 'Modifica els índexs',
'Add next' => 'Afegeix el següent',
'Language' => 'Idioma',
'Select' => 'Selecciona',
'New item' => 'Nou element',
'Search' => 'Cerca',
'Sort' => 'Ordena',
'descending' => 'descendent',
'Limit' => 'Límit',
'No rows.' => 'No hi ha cap registre.',
'Action' => 'Acció',
'edit' => 'edita',
'Page' => 'Plana',
'Query executed OK, %d row(s) affected.' => array('Consulta executada correctament, %d registre modificat.', 'Consulta executada correctament, %d registres modificats.'),
'Error in query' => 'Error en la consulta',
'Execute' => 'Executa',
'Table' => 'Taula',
'Foreign keys' => 'Claus foranes',
'Triggers' => 'Activadors',
'View' => 'Vista',
'Unable to select the table' => 'Impossible seleccionar la taula',
'Invalid CSRF token. Send the form again.' => 'Token CSRF invàlid. Torna a enviar el formulari.',
'Comment' => 'Comentari',
'Default values' => 'Valors per defecte',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'Cap comanda per executar.',
'Unable to upload a file.' => 'Impossible adjuntar el fitxer.',
'File upload' => 'Adjunta un fitxer',
'File uploads are disabled.' => 'L\'ddjunció de fitxers està desactivada.',
'Routine has been called, %d row(s) affected.' => array('S\'ha cridat la rutina, %d registre modificat.', 'S\'ha cridat la rutina, %d registres modificats.'),
'Call' => 'Crida',
'No extension' => 'Cap extensió',
'None of the supported PHP extensions (%s) are available.' => 'No hi ha cap de les extensions PHP soporatades (%s) disponible.',
'Session support must be enabled.' => 'Cal que estigui permès l\'us de sessions.',
'Session expired, please login again.' => 'La sessió ha expirat, torna a iniciar-ne una.',
'Text length' => 'Longitud del text',
'Foreign key has been dropped.' => 'S\'ha suprimit la clau forana.',
'Foreign key has been altered.' => 'S\'ha modificat la clau forana.',
'Foreign key has been created.' => 'S\'ha creat la clau forana.',
'Foreign key' => 'Clau forana',
'Target table' => 'Taula de destí',
'Change' => 'Canvi',
'Source' => 'Font',
'Target' => 'Destí',
'Add column' => 'Afegeix una columna',
'Alter' => 'Modifica',
'Add foreign key' => 'Afegeix una clau forana',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipus d\'índex',
'Column (length)' => 'Columna (longitud)',
'View has been dropped.' => 'S\'ha suprimit la vista.',
'View has been altered.' => 'S\'ha modificat la vista.',
'View has been created.' => 'S\'ha creat la vista.',
'Alter view' => 'Modifica la vista',
'Create view' => 'Crea una vista',
'Name' => 'Nom',
'Process list' => 'Llista de processos',
'%d process(es) have been killed.' => array('S\'ha aturat %d procés.', 'S\'han aturat %d processos.'),
'Kill' => 'Atura',
'Parameter name' => 'Nom del paràmetre',
'Database schema' => 'Esquema de la base de dades',
'Create procedure' => 'Crea un procediment',
'Create function' => 'Crea una funció',
'Routine has been dropped.' => 'S\'ha suprimit la rutina.',
'Routine has been altered.' => 'S\'ha modificat la rutina.',
'Routine has been created.' => 'S\'ha creat la rutina.',
'Alter function' => 'Modifica la funció',
'Alter procedure' => 'Modifica el procediment',
'Return type' => 'Tipus retornat',
'Add trigger' => 'Afegeix un activador',
'Trigger has been dropped.' => 'S\'ha suprimit l\'activador.',
'Trigger has been altered.' => 'S\'ha modificat l\'activador.',
'Trigger has been created.' => 'S\'ha creat l\'activador.',
'Alter trigger' => 'Modifica l\'activador',
'Create trigger' => 'Crea un activador',
'Time' => 'Temps',
'Event' => 'Event',
'%s version: %s through PHP extension %s' => 'Versió %s: %s amb l\'extensió de PHP %s',
'%d row(s)' => array('%d registre', '%d registres'),
'Remove' => 'Suprimeix',
'Are you sure?' => 'Estàs segur?',
'Privileges' => 'Privilegis',
'Create user' => 'Crea un usuari',
'User has been dropped.' => 'S\'ha suprimit l\'usuari.',
'User has been altered.' => 'S\'ha modificat l\'usuari.',
'User has been created.' => 'S\'ha creat l\'usuari.',
'Hashed' => 'Hashed',
'Column' => 'Columna',
'Routine' => 'Rutina',
'Grant' => 'Grant',
'Revoke' => 'Revoke',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Les dades POST són massa grans. Redueix les dades o incrementa la directiva de configuració %s.',
'Logged as: %s' => 'Connectat com: %s',
'Move up' => 'Mou a dalt',
'Move down' => 'Mou a baix',
'Functions' => 'Funcions',
'Aggregation' => 'Agregació',
'Export' => 'Exporta',
'Output' => 'Sortida',
'open' => 'obre',
'save' => 'desa',
'Format' => 'Format',
'Tables' => 'Taules',
'Data' => 'Dades',
'Event has been dropped.' => 'S\'ha suprimit l\'event.',
'Event has been altered.' => 'S\'ha modificat l\'event.',
'Event has been created.' => 'S\'ha creat l\'event.',
'Alter event' => 'Modifica l\'event',
'Create event' => 'Crea un event',
'At given time' => 'A un moment donat',
'Every' => 'Cada',
'Events' => 'Events',
'Schedule' => 'Horari',
'Start' => 'Comença',
'End' => 'Acaba',
'Status' => 'Estat',
'On completion preserve' => 'Conservar en completar',
'Tables and views' => 'Taules i vistes',
'Data Length' => 'Longitud de les dades',
'Index Length' => 'Longitud de l\'índex',
'Data Free' => 'Espai lliure',
'Collation' => 'Compaginació',
'Analyze' => 'Analitza',
'Optimize' => 'Optimitza',
'Check' => 'Verifica',
'Repair' => 'Repara',
'Truncate' => 'Escapça',
'Tables have been truncated.' => 'S\'han escapçat les taules.',
'Rows' => 'Files',
',' => ',',
'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',
'Engine' => 'Motor',
'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',
'Tables have been dropped.' => 'S\'han suprimit les taules.',
'Clone' => 'Clona',
'Partition by' => 'Fes particions segons',
'Partitions' => 'Particions',
'Partition name' => 'Nom de la partició',
'Values' => 'Valors',
'%d row(s) have been imported.' => array('S\'ha importat %d registre.', 'S\'han importat %d registres.'),
'Import' => 'Importa',
'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.' => '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',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Història',
'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.' => 'Les columnes origen i destí han de ser del mateix tipus, la columna destí ha d\'estar indexada i les dades referenciades han d\'existir.',
'E-mail' => 'Correu electrònic',
'From' => 'De',
'Subject' => 'Assumpte',
'Send' => 'Envia',
'%d e-mail(s) have been sent.' => array('S\'ha enviat %d correu electrònic.', 'S\'han enviat %d correus electrònics.'),
'Run file' => 'Executa el fitxer',
'Numbers' => 'Nombres',
'Date and time' => 'Data i hora',
'Strings' => 'Cadenes',
'Binary' => 'Binari',
'Lists' => 'Llistes',
'Relations' => 'Relacions',
'Maximum allowed file size is %sB.' => 'La mida màxima permesa del fitxer és de %sB.',
'Clear' => 'Suprimeix',
'Editor' => 'Editor',
'Webserver file %s' => 'Fitxer %s del servidor web',
'File does not exist.' => 'El fitxer no existeix.',
'Permanent login' => 'Sessió permanent',
'%d in total' => '%d en total',
'Attachments' => 'Adjuncions',
'System' => 'Sistema',
'last' => 'darrera',
'Network' => 'Xarxa',
'Geometry' => 'Geometria',
'Databases have been dropped.' => 'S\'han suprimit les bases de dades.',
'File exists.' => 'El fitxer ja existeix.',
'Ctrl+click on a value to modify it.' => 'Fes un Ctrl+clic a un valor per modificar-lo.',
'Use edit link to modify this value.' => 'Utilitza l\'enllaç d\'edició per modificar aquest valor.',
'Alter schema' => 'Modifica l\'esquema',
'Create schema' => 'Crea un esquema',
'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',
'Sequence has been dropped.' => 'S\'ha suprimit la seqüència.',
'Sequence has been created.' => 'S\'ha creat la seqüència.',
'Sequence has been altered.' => 'S\'ha modificat la seqüència.',
'Alter sequence' => 'Modifica la seqüència',
'User types' => 'Tipus de l\'usuari',
'Create type' => 'Crea un tipus',
'Type has been dropped.' => 'S\'ha suprimit el tipus.',
'Type has been created.' => 'S\'ha creat el tipus.',
'Alter type' => 'Modifica el tipus',
'Search data in tables' => 'Cerca dades en les taules',
'From server' => 'En el servidor',
'empty' => 'buit',
'now' => 'ara',
'%d query(s) executed OK.' => array('%d consulta executada correctament.', '%d consultes executades correctament.'),
'Show only errors' => 'Mostra només els errors',
'Refresh' => 'Refresca',
'Invalid schema.' => 'Esquema invàlid.',
'Please use one of the extensions %s.' => 'Si us plau, utilitza una de les extensions %s.',
'ltr' => 'ltr',
'Tables have been copied.' => 'S\'han copiat les taules.',
'Copy' => 'Còpia',
'Permanent link' => 'Enllaç permanent',
'Edit all' => 'Edita-ho tot',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -1,136 +1,29 @@
<?php
$translations = array(
'Login' => 'Přihlásit se',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Systém',
'Server' => 'Server',
'Username' => 'Uživatel',
'Password' => 'Heslo',
'Select database' => 'Vybrat databázi',
'Invalid database.' => 'Nesprávná databáze.',
'Create new database' => 'Vytvořit novou databázi',
'Table has been dropped.' => 'Tabulka byla odstraněna.',
'Table has been altered.' => 'Tabulka byla změněna.',
'Table has been created.' => 'Tabulka byla vytvořena.',
'Alter table' => 'Pozměnit tabulku',
'Create table' => 'Vytvořit tabulku',
'Table name' => 'Název tabulky',
'engine' => 'úložiště',
'collation' => 'porovnávání',
'Column name' => 'Název sloupce',
'Type' => 'Typ',
'Length' => 'Délka',
'Auto Increment' => 'Auto Increment',
'Options' => 'Volby',
'Save' => 'Uložit',
'Drop' => 'Odstranit',
'Database has been dropped.' => 'Databáze byla odstraněna.',
'Database has been created.' => 'Databáze byla vytvořena.',
'Database has been renamed.' => 'Databáze byla přejmenována.',
'Database has been altered.' => 'Databáze byla změněna.',
'Alter database' => 'Pozměnit databázi',
'Create database' => 'Vytvořit databázi',
'SQL command' => 'SQL příkaz',
'Dump' => 'Export',
'Permanent login' => 'Trvalé přihlášení',
'Login' => 'Přihlásit se',
'Logout' => 'Odhlásit',
'database' => 'databáze',
'Use' => 'Vybrat',
'No tables.' => 'Žádné tabulky.',
'select' => 'vypsat',
'Create new table' => 'Vytvořit novou tabulku',
'Item has been deleted.' => 'Položka byla smazána.',
'Item has been updated.' => 'Položka byla aktualizována.',
'Item%s has been inserted.' => 'Položka%s byla vložena.',
'Edit' => 'Upravit',
'Insert' => 'Vložit',
'Save and insert next' => 'Uložit a vložit další',
'Delete' => 'Smazat',
'Database' => 'Databáze',
'Routines' => 'Procedury a funkce',
'Indexes have been altered.' => 'Indexy byly změněny.',
'Indexes' => 'Indexy',
'Alter indexes' => 'Pozměnit indexy',
'Add next' => 'Přidat další',
'Logged as: %s' => 'Přihlášen jako: %s',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="http://www.adminer.org/cs/extension/" target="_blank">Implementujte</a> metodu %s, aby platilo stále.',
'Language' => 'Jazyk',
'Select' => 'Vypsat',
'New item' => 'Nová položka',
'Search' => 'Vyhledat',
'Sort' => 'Seřadit',
'descending' => 'sestupně',
'Limit' => 'Limit',
'No rows.' => 'Žádné řádky.',
'Action' => 'Akce',
'edit' => 'upravit',
'Page' => 'Stránka',
'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ů.'),
'Error in query' => 'Chyba v dotazu',
'Execute' => 'Provést',
'Table' => 'Tabulka',
'Foreign keys' => 'Cizí klíče',
'Triggers' => 'Triggery',
'View' => 'Pohled',
'Unable to select the table' => 'Nepodařilo se vypsat tabulku',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
'Comment' => 'Komentář',
'Default values' => 'Výchozí hodnoty',
'%d byte(s)' => array('%d bajt', '%d bajty', '%d bajtů'),
'No commands to execute.' => 'Žádné příkazy k vykonání.',
'Unable to upload a file.' => 'Nepodařilo se nahrát soubor.',
'File upload' => 'Nahrání souboru',
'File uploads are disabled.' => 'Nahrávání souborů není povoleno.',
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
'Call' => 'Zavolat',
'No extension' => 'Žádná extenze',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupná žádná z podporovaných PHP extenzí (%s).',
'No extension' => 'Žádné rozšíření',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%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.',
'Text length' => 'Délka textů',
'Foreign key has been dropped.' => 'Cizí klíč byl odstraněn.',
'Foreign key has been altered.' => 'Cizí klíč byl změněn.',
'Foreign key has been created.' => 'Cizí klíč byl vytvořen.',
'Foreign key' => 'Cizí klíč',
'Target table' => 'Cílová tabulka',
'Change' => 'Změnit',
'Source' => 'Zdroj',
'Target' => 'Cíl',
'Add column' => 'Přidat sloupec',
'Alter' => 'Změnit',
'Add foreign key' => 'Přidat cizí klíč',
'ON DELETE' => 'Při smazání',
'ON UPDATE' => 'Při změně',
'Index Type' => 'Typ indexu',
'Column (length)' => 'Sloupec (délka)',
'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.',
'Alter view' => 'Pozměnit pohled',
'Create view' => 'Vytvořit pohled',
'Name' => 'Název',
'Process list' => 'Seznam procesů',
'%d process(es) have been killed.' => array('Byl ukončen %d proces.', 'Byly ukončeny %d procesy.', 'Bylo ukončeno %d procesů.'),
'Kill' => 'Ukončit',
'Parameter name' => 'Název parametru',
'Database schema' => 'Schéma databáze',
'Create procedure' => 'Vytvořit proceduru',
'Create function' => 'Vytvořit funkci',
'Routine has been dropped.' => 'Procedura byla odstraněna.',
'Routine has been altered.' => 'Procedura byla změněna.',
'Routine has been created.' => 'Procedura byla vytvořena.',
'Alter function' => 'Změnit funkci',
'Alter procedure' => 'Změnit proceduru',
'Return type' => 'Návratový typ',
'Add trigger' => 'Přidat trigger',
'Trigger has been dropped.' => 'Trigger byl odstraněn.',
'Trigger has been altered.' => 'Trigger byl změněn.',
'Trigger has been created.' => 'Trigger byl vytvořen.',
'Alter trigger' => 'Změnit trigger',
'Create trigger' => 'Vytvořit trigger',
'Time' => 'Čas',
'Event' => 'Událost',
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP extenzi %s',
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
'Remove' => 'Odebrat',
'Are you sure?' => 'Opravdu?',
'%s version: %s through PHP extension %s' => 'Verze %s: %s přes PHP rozšíření %s',
'Refresh' => 'Obnovit',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Oprávnění',
'Create user' => 'Vytvořit uživatele',
'User has been dropped.' => 'Uživatel byl odstraněn.',
@@ -141,19 +34,101 @@ $translations = array(
'Routine' => 'Procedura',
'Grant' => 'Povolit',
'Revoke' => 'Zakázat',
'Process list' => 'Seznam procesů',
'%d process(es) have been killed.' => array('Byl ukončen %d proces.', 'Byly ukončeny %d procesy.', 'Bylo ukončeno %d procesů.'),
'Kill' => 'Ukončit',
'Variables' => 'Proměnné',
'Status' => 'Stav',
'SQL command' => 'SQL příkaz',
'%d query(s) executed OK.' => array('%d příkaz proběhl v pořádku.', '%d příkazy proběhly v pořádku.', '%d příkazů proběhlo v pořádku.'),
'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',
'Execute' => 'Provést',
'Stop on error' => 'Zastavit při chybě',
'Show only errors' => 'Zobrazit pouze chyby',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historie',
'Clear' => 'Vyčistit',
'Edit all' => 'Upravit vše',
'File upload' => 'Nahrání souboru',
'From server' => 'Ze serveru',
'Webserver file %s' => 'Soubor %s na webovém serveru',
'Run file' => 'Spustit soubor',
'File does not exist.' => 'Soubor neexistuje.',
'File uploads are disabled.' => 'Nahrávání souborů není povoleno.',
'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.',
'Logged as: %s' => 'Přihlášen jako: %s',
'Move up' => 'Přesunout nahoru',
'Move down' => 'Přesunout dolů',
'Functions' => 'Funkce',
'Aggregation' => 'Agregace',
'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.',
'Export' => 'Export',
'Dump' => 'Export',
'Output' => 'Výstup',
'open' => 'otevřít',
'save' => 'uložit',
'Format' => 'Formát',
'Tables' => 'Tabulky',
'Data' => 'Data',
'Database' => 'Databáze',
'database' => 'databáze',
'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.',
'Database has been renamed.' => 'Databáze byla přejmenována.',
'Database has been altered.' => 'Databáze byla změněna.',
'Alter database' => 'Pozměnit databázi',
'Create database' => 'Vytvořit databázi',
'Database schema' => 'Schéma databáze',
// link to current database schema layout
'Permanent link' => 'Trvalý odkaz',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Úložiště',
'Collation' => 'Porovnávání',
'Data Length' => 'Velikost dat',
'Index Length' => 'Velikost indexů',
'Data Free' => 'Volné místo',
'Rows' => 'Řádků',
'%d in total' => '%d celkem',
'Analyze' => 'Analyzovat',
'Optimize' => 'Optimalizovat',
'Vacuum' => 'Vyčistit',
'Check' => 'Zkontrolovat',
'Repair' => 'Opravit',
'Truncate' => 'Vyprázdnit',
'Tables have been truncated.' => 'Tabulky byly vyprázdněny.',
'Move to other database' => 'Přesunout do jiné databáze',
'Move' => 'Přesunout',
'Tables have been moved.' => 'Tabulky byly přesunuty.',
'Copy' => 'Zkopírovat',
'Tables have been copied.' => 'Tabulky byly zkopírovány.',
'Routines' => 'Procedury a funkce',
'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'),
'Call' => 'Zavolat',
'Parameter name' => 'Název parametru',
'Create procedure' => 'Vytvořit proceduru',
'Create function' => 'Vytvořit funkci',
'Routine has been dropped.' => 'Procedura byla odstraněna.',
'Routine has been altered.' => 'Procedura byla změněna.',
'Routine has been created.' => 'Procedura byla vytvořena.',
'Alter function' => 'Změnit funkci',
'Alter procedure' => 'Změnit proceduru',
'Return type' => 'Návratový typ',
'Events' => 'Události',
'Event has been dropped.' => 'Událost byla odstraněna.',
'Event has been altered.' => 'Událost byla změněna.',
'Event has been created.' => 'Událost byla vytvořena.',
@@ -161,82 +136,173 @@ $translations = array(
'Create event' => 'Vytvořit událost',
'At given time' => 'V daný čas',
'Every' => 'Každých',
'Events' => 'Události',
'Schedule' => 'Plán',
'Start' => 'Začátek',
'End' => 'Konec',
'Status' => 'Stav',
'On completion preserve' => 'Po dokončení zachovat',
'Tables' => 'Tabulky',
'Tables and views' => 'Tabulky a pohledy',
'Data Length' => 'Velikost dat',
'Index Length' => 'Velikost indexů',
'Data Free' => 'Volné místo',
'Collation' => 'Porovnávání',
'Analyze' => 'Analyzovat',
'Optimize' => 'Optimalizovat',
'Check' => 'Zkontrolovat',
'Repair' => 'Opravit',
'Truncate' => 'Vyprázdnit',
'Tables have been truncated.' => 'Tabulky byly vyprázdněny.',
'Rows' => 'Řádků',
',' => ' ',
'Tables have been moved.' => 'Tabulky byly přesunuty',
'Move to other database' => 'Přesunout do jiné databáze',
'Move' => 'Přesunout',
'Engine' => 'Úložiště',
'Save and continue edit' => 'Uložit a pokračovat v editaci',
'original' => 'původní',
'%d item(s) have been affected.' => array('Byl ovlivněn %d záznam.', 'Byly ovlivněny %d záznamy.', 'Bylo ovlivněno %d záznamů.'),
'whole result' => 'celý výsledek',
'Table' => 'Tabulka',
'No tables.' => 'Žádné tabulky.',
'Alter table' => 'Pozměnit tabulku',
'Create table' => 'Vytvořit tabulku',
'Table has been dropped.' => 'Tabulka byla odstraněna.',
'Tables have been dropped.' => 'Tabulky byly odstraněny.',
'Clone' => 'Klonovat',
'Tables have been optimized.' => 'Tabulky byly optimalizovány.',
'Table has been altered.' => 'Tabulka byla změněna.',
'Table has been created.' => 'Tabulka byla vytvořena.',
'Table name' => 'Název tabulky',
'Show structure' => 'Zobrazit strukturu',
'engine' => 'úložiště',
'collation' => 'porovnávání',
'Column name' => 'Název sloupce',
'Type' => 'Typ',
'Length' => 'Délka',
'Auto Increment' => 'Auto Increment',
'Options' => 'Volby',
'Comment' => 'Komentář',
'Default values' => 'Výchozí hodnoty',
'Drop' => 'Odstranit',
'Are you sure?' => 'Opravdu?',
'Move up' => 'Přesunout nahoru',
'Move down' => 'Přesunout dolů',
'Remove' => 'Odebrat',
'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',
'Partition name' => 'Název oddílu',
'Values' => 'Hodnoty',
'%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ů.'),
'CSV Import' => 'Import CSV',
'Import' => 'Import',
'Show structure' => 'Zobrazit strukturu',
'Select data' => 'Vypsat data',
'Stop on error' => 'Zastavit při chybě',
'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.',
'anywhere' => 'kdekoliv',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
'History' => 'Historie',
'Variables' => 'Proměnné',
'View' => '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.',
'Alter view' => 'Pozměnit pohled',
'Create view' => 'Vytvořit pohled',
'Indexes' => 'Indexy',
'Indexes have been altered.' => 'Indexy byly změněny.',
'Alter indexes' => 'Pozměnit indexy',
'Add next' => 'Přidat další',
'Index Type' => 'Typ indexu',
'Column (length)' => 'Sloupec (délka)',
'Foreign keys' => 'Cizí klíče',
'Foreign key' => 'Cizí klíč',
'Foreign key has been dropped.' => 'Cizí klíč byl odstraněn.',
'Foreign key has been altered.' => 'Cizí klíč byl změněn.',
'Foreign key has been created.' => 'Cizí klíč byl vytvořen.',
'Target table' => 'Cílová tabulka',
'Change' => 'Změnit',
'Source' => 'Zdroj',
'Target' => 'Cíl',
'Add column' => 'Přidat sloupec',
'Alter' => 'Změnit',
'Add foreign key' => 'Přidat cizí klíč',
'ON DELETE' => 'Při smazání',
'ON UPDATE' => 'Při změně',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Zdrojové a cílové sloupce musí mít stejný datový typ, nad cílovými sloupci musí být definován index a odkazovaná data musí existovat.',
'Triggers' => 'Triggery',
'Add trigger' => 'Přidat trigger',
'Trigger has been dropped.' => 'Trigger byl odstraněn.',
'Trigger has been altered.' => 'Trigger byl změněn.',
'Trigger has been created.' => 'Trigger byl vytvořen.',
'Alter trigger' => 'Změnit trigger',
'Create trigger' => 'Vytvořit trigger',
'Time' => 'Čas',
'Event' => 'Událost',
'Name' => 'Název',
'select' => 'vypsat',
'Select' => 'Vypsat',
'Select data' => 'Vypsat data',
'Functions' => 'Funkce',
'Aggregation' => 'Agregace',
'Search' => 'Vyhledat',
'anywhere' => 'kdekoliv',
'Search data in tables' => 'Vyhledat data v tabulkách',
'Sort' => 'Seřadit',
'descending' => 'sestupně',
'Limit' => 'Limit',
'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 row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
'Page' => 'Stránka',
'last' => 'poslední',
'Load more data' => 'Nahrát další data',
'Loading' => 'Nahrává se',
'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.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Položka%s byla vložena.',
'Item has been deleted.' => 'Položka byla smazána.',
'Item has been updated.' => 'Položka byla aktualizována.',
'%d item(s) have been affected.' => array('Byl ovlivněn %d záznam.', 'Byly ovlivněny %d záznamy.', 'Bylo ovlivněno %d záznamů.'),
'New item' => 'Nová položka',
'original' => 'původní',
// label for value '' in enum data type
'empty' => 'prázdné',
'edit' => 'upravit',
'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.',
'E-mail' => 'E-mail',
'From' => 'Odesílatel',
'Subject' => 'Předmět',
'Attachments' => 'Přílohy',
'Send' => 'Odeslat',
'%d e-mail(s) have been sent.' => array('Byl odeslán %d e-mail.', 'Byly odeslány %d e-maily.', 'Bylo odesláno %d e-mailů.'),
'Run file' => 'Spustit soubor',
// data type descriptions
'Numbers' => 'Čísla',
'Date and time' => 'Datum a čas',
'Strings' => 'Řetězce',
'Binary' => 'Binární',
'Lists' => 'Seznamy',
'Relations' => 'Vztahy',
'Maximum allowed file size is %sB.' => 'Maximální povolená velikost souboru je %sB.',
'Clear' => 'Vyčistit',
'Editor' => 'Editor',
'Webserver file %s' => 'Soubor %s na webovém serveru',
'File does not exist.' => 'Soubor neexistuje.',
'Permanent login' => 'Trvalé přihlášení',
'%d in total' => '%d celkem',
'Attachments' => 'Přílohy',
'System' => 'Systém',
'last' => 'poslední',
'Network' => 'Síť',
'Geometry' => 'Geometrie',
'Databases have been dropped.' => 'Databáze byly odstraněny.',
'Relations' => 'Vztahy',
'Editor' => 'Editor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'teď',
'yes' => 'ano',
'no' => 'ne',
// general SQLite error in create, drop or rename database
'File exists.' => 'Soubor existuje.',
'Double click on a value to modify it.' => 'Dvojklikněte na políčko, které chcete změnit.',
'Increase text length to modify this value.' => 'Ke změně této hodnoty zvyšte délku textů.',
'Use edit link to modify this value.' => 'Ke změně této hodnoty použijte odkaz upravit.',
'Please use one of the extensions %s.' => 'Prosím použijte jednu z koncovek %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Pozměnit schéma',
'Create schema' => 'Vytvořit schéma',
'Schema has been dropped.' => 'Schéma bylo odstraněno.',
@@ -244,19 +310,20 @@ $translations = array(
'Schema has been altered.' => 'Schéma bylo změněno.',
'schema' => 'schéma',
'Schema' => 'Schéma',
'Invalid schema.' => 'Nesprávné schéma.',
// PostgreSQL sequences support
'Sequences' => 'Sekvence',
'Create sequence' => 'Vytvořit sekvenci',
'Sequence has been dropped.' => 'Sekvence byla odstraněna.',
'Sequence has been created.' => 'Sekvence byla vytvořena.',
'Sequence has been altered.' => 'Sekvence byla změněna.',
'Alter sequence' => 'Pozměnit sekvenci',
// PostgreSQL user types support
'User types' => 'Uživatelské typy',
'Create type' => 'Vytvořit typ',
'Type has been dropped.' => 'Typ byl odstraněn.',
'Type has been created.' => 'Typ byl vytvořen.',
'Alter type' => 'Pozměnit typ',
'Search data in tables' => 'Vyhledat data v tabulkách',
'From server' => 'Ze serveru',
'empty' => 'prázdné',
'now' => 'teď',
);

View File

@@ -15,7 +15,7 @@ $translations = array(
'Alter table' => 'Tabelle ändern',
'Create table' => 'Neue Tabelle erstellen',
'Table name' => 'Name der Tabelle',
'engine' => 'Motor',
'engine' => 'Speicher-Engine',
'collation' => 'Kollation',
'Column name' => 'Spaltenname',
'Type' => 'Typ',
@@ -37,7 +37,6 @@ $translations = array(
'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.',
@@ -173,7 +172,7 @@ $translations = array(
'Data Free' => 'Freier Bereich',
'Collation' => 'Collation',
'Analyze' => 'Analysieren',
'Optimize' => 'Optimisieren',
'Optimize' => 'Optimieren',
'Check' => 'Prüfen',
'Repair' => 'Reparieren',
'Truncate' => 'Entleeren (truncate)',
@@ -187,17 +186,16 @@ $translations = array(
'Save and continue edit' => 'Speichern und weiter bearbeiten',
'original' => 'Original',
'Tables have been dropped.' => 'Tabellen wurden entfernt (drop).',
'%d item(s) have been affected.' => array('%d Artikel betroffen.', '%d Artikel betroffen.'),
'%d item(s) have been affected.' => '%d Artikel betroffen.',
'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.'),
'anywhere' => 'beliebig',
'CSV Import' => 'Importiere CSV',
'Import' => 'Importieren',
'Stop on error' => 'Bei Fehler anhalten',
'%.3f s' => '%.3f s',
@@ -245,11 +243,10 @@ $translations = array(
'Alter type' => 'Typ ändern',
'Type has been dropped.' => 'Typ gelöscht.',
'Type has been created.' => 'Typ erstellt.',
'Double click on a value to modify it.' => 'Doppelklick zum Bearbeiten des Wertes.',
'Increase text length to modify this value.' => 'Vergrössern Sie die Textlänge um den Wert ändern zu können.',
'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.',
'last' => 'letzte',
'From server' => 'Auf Server',
'From server' => 'Im Server',
'System' => 'Datenbank System',
'Select data' => 'Daten auswählen',
'Show structure' => 'Struktur anzeigen',
@@ -258,4 +255,16 @@ $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.'),
'Show only errors' => 'Nur Fehler anzeigen',
'Refresh' => 'Aktualisieren',
'Invalid schema.' => 'Schema nicht gültig.',
'Please use one of the extensions %s.' => 'Bitte einen der Dateitypen %s benutzen.',
'now' => 'jetzt',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabellen wurden kopiert.',
'Copy' => 'Kopieren',
'Permanent link' => 'Dauerhafter Link',
'Edit all' => 'Alle ändern',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -9,4 +9,5 @@ $translations = array(
'%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'),
'%d e-mail(s) have been sent.' => array('%d e-mail has been sent.', '%d e-mails have been sent.'),
'%d in total' => '%d in total',
'%d query(s) executed OK.' => array('%d query executed OK.', '%d queries executed OK.'),
);

View File

@@ -13,7 +13,7 @@ $translations = array(
'Table has been altered.' => 'Tabla modificada.',
'Table has been created.' => 'Tabla creada.',
'Alter table' => 'Modifique estructura',
'Create table' => 'Cree tabla',
'Create table' => 'Crear tabla',
'Table name' => 'Nombre de la tabla',
'engine' => 'motor',
'collation' => 'colación',
@@ -37,7 +37,6 @@ $translations = array(
'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.',
@@ -104,7 +103,7 @@ $translations = array(
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista creada.',
'Alter view' => 'Modificar vista',
'Create view' => 'Cear vista',
'Create view' => 'Crear vista',
'Name' => 'Nombre',
'Process list' => 'Lista de procesos',
'%d process(es) have been killed.' => array('%d proceso detenido.', '%d procesos detenidos.'),
@@ -190,14 +189,13 @@ $translations = array(
'%d item(s) have been affected.' => array('%d ítem afectado.', '%d itemes 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.' => 'Cantida máxima de campos permitidos excedidos. Por favor aumente %s.',
'Partition by' => 'Particionar por',
'Partitions' => 'Particiones',
'Partition name' => 'Nombre de Partición',
'Values' => 'Valores',
'%d row(s) have been imported.' => array('%d registro importado.', '%d registros importados.'),
'anywhere' => 'donde sea',
'CSV Import' => 'Importar CSV',
'Import' => 'Importar',
'Stop on error' => 'Parar en caso de error',
'%.3f s' => '%.3f s',
@@ -245,17 +243,28 @@ $translations = array(
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo creado.',
'Double click on a value to modify it.' => 'Doble-clic sobre el valor para editarlo.',
'Increase text length to modify this value.' => 'Aumente el tamaño del campo de texto para modificar este valor.',
'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.',
'last' => 'último',
'From server' => 'Desde servidor',
'System' => 'Motor de base de datos',
'Select data' => 'Seleccionar datos',
'Select data' => 'Visualizar contenido',
'Show structure' => 'Mostrar estructura',
'empty' => 'ningúno',
'Network' => 'Red',
'Geometry' => 'Geometría',
'File exists.' => 'Archivo ya existe.',
'Attachments' => 'Adjuntos',
'%d query(s) executed OK.' => array('%d sentencia sql ejecutada correctamente.', '%d sentencias sql ejecutadas correctamente.'),
'Show only errors' => 'Mostrar solamente errores',
'Refresh' => 'Refrescar',
'Invalid schema.' => 'Esquema inválido.',
'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.',
'Copy' => 'Copiar',
'Permanent link' => 'Enlace permanente',
'Edit all' => 'Editar todos',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -37,7 +37,6 @@ $translations = array(
'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.',
@@ -62,7 +61,7 @@ $translations = array(
'Action' => 'Tegevus',
'edit' => 'muuda',
'Page' => 'Lehekülg',
'Query executed OK, %d row(s) affected.' => array('Päring õnnestus, mõjutatatud ridu: %d.', 'Päring õnnestus, mõjutatatud ridu: %d.'),
'Query executed OK, %d row(s) affected.' => 'Päring õnnestus, mõjutatatud ridu: %d.',
'Error in query' => 'Päringus esines viga',
'Execute' => 'Käivita',
'Table' => 'Tabel',
@@ -78,7 +77,7 @@ $translations = array(
'Unable to upload a file.' => 'Faili üleslaadimine pole võimalik.',
'File upload' => 'Faili üleslaadimine',
'File uploads are disabled.' => 'Failide üleslaadimine on keelatud.',
'Routine has been called, %d row(s) affected.' => array('Protseduur täideti edukalt, mõjutatud ridu: %d.', 'Protseduur täideti edukalt, mõjutatud ridu: %d.'),
'Routine has been called, %d row(s) affected.' => 'Protseduur täideti edukalt, mõjutatud ridu: %d.',
'Call' => 'Käivita',
'No extension' => 'Ei leitud laiendust',
'None of the supported PHP extensions (%s) are available.' => 'Serveris pole ühtegi toetatud PHP laiendustest (%s).',
@@ -127,7 +126,7 @@ $translations = array(
'Create trigger' => 'Loo uus päästik (TRIGGER)',
'Time' => 'Aeg',
'Event' => 'Sündmus',
'%d row(s)' => array('%d rida', '%d rida'),
'%d row(s)' => '%d rida',
'Remove' => 'Eemalda',
'Are you sure?' => 'Kas oled kindel?',
'Privileges' => 'Õigused',
@@ -187,17 +186,16 @@ $translations = array(
'Truncate' => 'Tühjenda',
'Move to other database' => 'Liiguta teise andmebaasi',
'Move' => 'Liiguta',
'%d item(s) have been affected.' => array('Mõjutatud kirjeid: %d.', 'Mõjutatud kirjeid: %d.'),
'%d item(s) have been affected.' => 'Mõjutatud kirjeid: %d.',
'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',
'Values' => 'Väärtused',
'%d row(s) have been imported.' => array('Imporditi %d rida.', 'Imporditi %d rida.'),
'%d row(s) have been imported.' => 'Imporditi %d rida.',
'anywhere' => 'vahet pole',
'CSV Import' => 'Impordi CSV',
'Import' => 'Impordi',
'Stop on error' => 'Peatuda vea esinemisel',
'%.3f s' => '%.3f s',
@@ -220,7 +218,7 @@ $translations = array(
'From' => 'Kellelt',
'Subject' => 'Pealkiri',
'Send' => 'Saada',
'%d e-mail(s) have been sent.' => array('Saadetud kirju: %d.', 'Saadetud kirju: %d.'),
'%d e-mail(s) have been sent.' => 'Saadetud kirju: %d.',
'Webserver file %s' => 'Fail serveris: %s',
'File does not exist.' => 'Faili ei leitud.',
'%d in total' => 'Kokku: %d',
@@ -245,8 +243,7 @@ $translations = array(
'Alter type' => 'Muuda tüüpi',
'Type has been dropped.' => 'Tüüp on edukalt kustutatud.',
'Type has been created.' => 'Tüüp on edukalt loodud.',
'Double click on a value to modify it.' => 'Väärtuse muutmiseks topelt-kliki sellel.',
'Increase text length to modify this value.' => 'Väärtuse muutmiseks suurenda tekstiveeru pikkust.',
'Ctrl+click on a value to modify it.' => 'Väärtuse muutmiseks Ctrl+kliki sellel.',
'Use edit link to modify this value.' => 'Väärtuse muutmiseks kasuta muutmislinki.',
'last' => 'viimane',
'From server' => 'Serverist',
@@ -258,4 +255,16 @@ $translations = array(
'Geometry' => 'Geomeetria',
'File exists.' => 'Fail juba eksisteerib.',
'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',
'Refresh' => 'Uuenda',
'Invalid schema.' => 'Sobimatu skeema.',
'Please use one of the extensions %s.' => 'Palun kasuta üht laiendustest %s.',
'now' => 'nüüd',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabelid on edukalt kopeeritud.',
'Copy' => 'Kopeeri',
'Permanent link' => 'Püsilink',
'Edit all' => 'Muuda kõiki',
'HH:MM:SS' => 'HH:MM:SS',
);

314
adminer/lang/fa.inc.php Normal file
View File

@@ -0,0 +1,314 @@
<?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.' => 'اعتبار سنجي نامعتبر',
'Language' => 'زبان',
'Invalid CSRF token. Send the form again.' => 'نامعتبر است. دوباره سعی کنید Token CSRF',
'No extension' => 'پسوند نامعتبر',
'None of the supported PHP extensions (%s) are available.' => ' پسوند پی اچ پی در دسترس نیست (%s) تعداد',
'Session support must be enabled.' => 'پشتيباني از نشست بايستي فعال گردد',
'Session expired, please login again.' => 'نشست پايان يافته، لطفا دوباره وارد شويد',
'%s version: %s through PHP extension %s' => 'نسخه %s : %s توسعه پی اچ پی %s',
'Refresh' => 'بازيابي',
// text direction - 'ltr' or 'rtl'
'ltr' => 'rtl',
'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.' => '%d فرآيند متوقف شد',
'Kill' => 'حذف فرآيند',
'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' => 'خطا در كوئري',
'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 را در پيكربندي افزايش دهيد.',
'Export' => 'استخراج',
'Dump' => 'خالي كردن',
'Output' => 'خروجي',
'open' => 'بازكردن',
'save' => 'ذخيره',
'Format' => 'حذف',
'Data' => 'داده',
'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' => 'ساختار پايگاه داده',
// link to current database schema layout
'Permanent link' => 'ارتباط دائم',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'موتور',
'Collation' => 'تطبیق',
'Data Length' => 'طول داده',
'Index Length' => 'طول ایندکس',
'Data Free' => 'داده اختیاری',
'Rows' => 'سطرها',
'%d in total' => ' به طور کل %d ',
'Analyze' => 'تحلیل',
'Optimize' => 'بهینه سازی',
'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.' => 'جدولها حذف شدند',
'Table has been altered.' => 'جدول ویرایش شد',
'Table has been created.' => 'جدول ایجاد شد',
'Table name' => 'نام جدول',
'Show structure' => 'نمایش ساختار',
'engine' => 'موتور',
'collation' => 'تطبیق',
'Column name' => 'نام ستون',
'Type' => 'نوع',
'Length' => 'طول',
'Auto Increment' => 'افزایش خودکار',
'Options' => 'اختیارات',
'Comment' => 'توضیح',
'Default values' => 'مقادیر پیش فرض',
'Drop' => 'حذف',
'Are you sure?' => 'مطمئن هستید؟',
'Move up' => 'انتقال به بالا',
'Move down' => 'انتقال به پایین',
'Remove' => 'حذف',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر مجاز فیلدهای مجاز اشباع شد. لطفا %s را کاهش دهید',
'Partition by' => 'بخشبندی توسط',
'Partitions' => 'بخشبندیها',
'Partition name' => 'نام بخش',
'Values' => 'مقادیر',
'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' => 'محدودیت',
'Text length' => 'طول متن',
'Action' => 'عملیات',
'Unable to select the table' => 'قادر به انتخاب جدول نیستید',
'No rows.' => 'سطری وجود ندارد',
'%d row(s)' => array('%d سطر', '%d سطر'),
'Page' => 'صفحه',
'last' => 'آخری',
'whole result' => 'همه نتایج',
'%d byte(s)' => array('%d بایت', '%d بایت'),
'Import' => 'وارد کردن',
'%d row(s) have been imported.' => array('%d سطر وارد شد', '%d سطر وارد شد'),
// in-place editing in select
'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' => 'ذخیره و درج بعدی',
'Clone' => 'تکثیر',
'Delete' => 'حذف',
'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' => '[yyyy]-mm-dd',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'اکنون',
// 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' => 'ساختار',
'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,7 +1,7 @@
<?php
$translations = array(
'Login' => 'Authentification',
'Logout successful.' => 'Au revoir!',
'Logout successful.' => 'Au revoir !',
'Invalid credentials.' => 'Authentification échouée.',
'Server' => 'Serveur',
'Username' => 'Utilisateur',
@@ -22,7 +22,7 @@ $translations = array(
'Length' => 'Longueur',
'Auto Increment' => 'Auto increment',
'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.',
@@ -36,12 +36,11 @@ $translations = array(
'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',
@@ -139,7 +138,7 @@ $translations = array(
'Grant' => 'Grant',
'Revoke' => 'Revoke',
'%s version: %s through PHP extension %s' => 'Version de %s : %s via l\'extension PHP %s',
'Logged as: %s' => 'Authentifié en tant que %s',
'Logged as: %s' => 'Authentifié en tant que : %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Données POST trop grandes. Réduisez la taille des données ou augmentez la valeur de %s dans la configuration de PHP.',
'Move up' => 'Déplacer vers le haut',
'Move down' => 'Déplacer vers le bas',
@@ -148,7 +147,7 @@ $translations = array(
'Data' => 'Données',
'Output' => 'Sortie',
'open' => 'ouvrir',
'save' => 'sauvegarder',
'save' => 'enregistrer',
'Format' => 'Format',
'Functions' => 'Fonctions',
'Aggregation' => 'Agrégation',
@@ -165,7 +164,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.',
@@ -188,14 +187,13 @@ $translations = array(
'%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',
'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.'),
'anywhere' => 'n\'importe où',
'CSV Import' => 'Importer CSV',
'Import' => 'Importer',
'Stop on error' => 'Arrêter en cas d\'erreur',
'%.3f s' => '%.3f s',
@@ -213,7 +211,7 @@ $translations = array(
'Strings' => 'Chaînes',
'Binary' => 'Binaires',
'Lists' => 'Listes',
'Editor' => 'Editeur',
'Editor' => 'Éditeur',
'E-mail' => 'Courriel',
'From' => 'De',
'Subject' => 'Sujet',
@@ -244,8 +242,7 @@ $translations = array(
'Alter type' => 'Modifier le type',
'Type has been dropped.' => 'Le type a été supprimé.',
'Type has been created.' => 'Le type a été créé.',
'Double click on a value to modify it.' => 'Double-cliquez sur une valeur pour la modifier.',
'Increase text length to modify this value.' => 'Augmentez la longueur de texte affiché pour modifier cette valeur.',
'Ctrl+click on a value to modify it.' => 'Ctrl+cliquez sur une valeur pour la modifier.',
'Use edit link to modify this value.' => 'Utilisez le lien "modifier" pour modifier cette valeur.',
'last' => 'dernière',
'From server' => 'Depuis le serveur',
@@ -259,4 +256,15 @@ $translations = array(
'Attachments' => 'Pièces jointes',
'Item%s has been inserted.' => 'L\'élément%s a été inséré.',
'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',
'Refresh' => 'Rafraîchir',
'Invalid schema.' => 'Schéma invalide.',
'Please use one of the extensions %s.' => 'Veuillez utiliser l\'une des extensions %s.',
'ltr' => 'ltr',
'Tables have been copied.' => 'Les tables ont été copiées.',
'Copy' => 'Copier',
'Permanent link' => 'Lien permanent',
'Edit all' => 'Tout modifier',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -36,8 +36,7 @@ $translations = array(
'database' => 'adatbázis',
'Use' => 'Használ',
'No tables.' => 'Nincs tábla.',
'select' => 'kiválaszt',
'Create new table' => 'Új tábla',
'select' => 'kiválasztás',
'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.',
@@ -52,7 +51,7 @@ $translations = array(
'Alter indexes' => 'Index módosítása',
'Add next' => 'Következő hozzáadása',
'Language' => 'Nyelv',
'Select' => 'Kiválaszt',
'Select' => 'Kiválasztás',
'New item' => 'Új tétel',
'Search' => 'Keresés',
'Sort' => 'Sorba rendezés',
@@ -69,7 +68,7 @@ $translations = array(
'Foreign keys' => 'Idegen kulcs',
'Triggers' => 'Trigger',
'View' => 'Nézet',
'Unable to select the table' => 'Nem tudom kiválasztani a táblát.',
'Unable to select the table' => 'Nem tudom kiválasztani a táblát',
'Invalid CSRF token. Send the form again.' => 'Érvénytelen CSRF azonosító. Küldd újra az űrlapot.',
'Comment' => 'Megjegyzés',
'Default values' => 'Alapértelmezett értékek',
@@ -113,7 +112,7 @@ $translations = array(
'Database schema' => 'Adatbázis séma',
'Create procedure' => 'Eljárás létrehozása',
'Create function' => 'Funkció létrehozása',
'Routine has been dropped.' => 'A rutin eldobva,',
'Routine has been dropped.' => 'A rutin eldobva.',
'Routine has been altered.' => 'A rutin módosult.',
'Routine has been created.' => 'A rutin létrejött.',
'Alter function' => 'Funkció módosítása',
@@ -180,7 +179,7 @@ $translations = array(
'Tables have been truncated.' => 'A tábla felszabadítva.',
'Rows' => 'Oszlop',
',' => ' ',
'Tables have been moved.' => 'Táblák áthelyezve',
'Tables have been moved.' => 'Táblák áthelyezve.',
'Move to other database' => 'Áthelyezés másik adatbázisba',
'Move' => 'Áthelyez',
'Engine' => 'Motor',
@@ -190,21 +189,20 @@ $translations = array(
'whole result' => 'összes eredményt mutatása',
'Tables have been dropped.' => 'Táblák eldobva.',
'Clone' => 'Klónoz',
'Partition by' => 'Rozdělit podle',
'Partition by' => 'Particionálás ezzel',
'Partitions' => 'Particiók',
'Partition name' => 'Partició neve',
'Values' => 'Értékek',
'%d row(s) have been imported.' => array('%d sor importálva.', '%d sor importálva', '%d sor importálva'),
'CSV Import' => 'CSV importálása',
'%d row(s) have been imported.' => array('%d sor importálva.', '%d sor importálva.', '%d sor importálva.'),
'Import' => 'Importálás',
'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',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'[yyyy]-mm-dd' => '[yyyy].m.d',
'History' => 'Történet',
'Variables' => 'Változók',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'A forrás és cél oszlopoknak azonos típusúak legyenek, a cél oszlopok indexeltek legyenek, és a hivatkozott adatnak léteznie kell.',
@@ -229,21 +227,19 @@ $translations = array(
'%d in total' => 'összesen %d',
'Attachments' => 'Csatolmány',
'System' => 'Adatbázis',
'last' => 'utoljára',
'last' => 'utol',
'Network' => 'Hálózat',
'Geometry' => 'Geometria',
'Databases have been dropped.' => 'Adatbázis eldobva.',
'File exists.' => 'A fájl létezik.',
'Double click on a value to modify it.' => 'Kattints kétszer az értékre a szerkesztéshez.',
'Increase text length to modify this value.' => 'Növeld a szöveg hosszát, hogy módosítani tudd ezt az értéket.',
'Use edit link to modify this value.' => 'Használd a szerkesztés hivatkozást ezen érték módosításához.',
'Alter schema' => 'Séma módosítása',
'Create schema' => 'Séma létrehozása',
'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' => 'schéma',
'Schema' => 'Schéma',
'schema' => 'séma',
'Schema' => 'Séma',
'Sequences' => 'Sorozatok',
'Create sequence' => 'Sorozat létrehozása',
'Sequence has been dropped.' => 'Sorozat eldobva.',
@@ -259,4 +255,15 @@ $translations = array(
'From server' => 'Szerverről',
'empty' => 'üres',
'now' => 'most',
'%d query(s) executed OK.' => '%d sikeres lekérdezés.',
'Show only errors' => 'Csak a hibák mutatása',
'Refresh' => 'Frissítés',
'Invalid schema.' => 'Érvénytelen séma.',
'Please use one of the extensions %s.' => 'Használja a(z) %s kiterjesztést.',
'ltr' => 'ltr',
'Tables have been copied.' => 'Táblák átmásolva.',
'Copy' => 'Másolás',
'Permanent link' => 'Hivatkozás',
'Edit all' => 'Összes szerkesztése',
'HH:MM:SS' => 'óó:pp:mm',
);

318
adminer/lang/id.inc.php Normal file
View File

@@ -0,0 +1,318 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Server',
'Username' => 'Pengguna',
'Password' => 'Sandi',
'Permanent login' => 'Masuk permanen',
'Login' => 'Masuk',
'Logout' => 'Keluar',
'Logged as: %s' => 'Masuk sebagai: %s',
'Logout successful.' => 'Berhasil keluar.',
'Invalid credentials.' => 'Akses invalid.',
'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.',
'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',
'Refresh' => 'Segarkan',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilese',
'Create user' => 'Buat pengguna',
'User has been dropped.' => 'Pengguna berhasil dihapus.',
'User has been altered.' => 'Pengguna berhasil diubah.',
'User has been created.' => 'Pengguna berhasil dibuat.',
'Hashed' => 'Hashed*',
'Column' => 'Kolom',
'Routine' => 'Rutin',
'Grant' => 'Beri',
'Revoke' => 'Tarik',
'Process list' => 'Daftar proses',
'%d process(es) have been killed.' => '%d proses berhasil dihentikan.',
'Kill' => 'Hentikan',
'Variables' => 'Variabel',
'Status' => 'Status',
'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',
'Execute' => 'Jalankan',
'Stop on error' => 'Hentikan pada kesalahan',
'Show only errors' => 'Hanya tampilkan kesalahan',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Riwayat',
'Clear' => 'Bersihkan',
'Edit all' => 'Edit 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 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.',
'Export' => 'Ekspor',
'Dump' => 'Ekspor',
'Output' => 'Hasil',
'open' => 'buka',
'save' => 'simpan',
'Format' => 'Format',
'Data' => 'Data',
'Database' => 'Basis data',
'database' => 'basis data',
'Use' => 'Gunakan',
'Select database' => 'Pilih basis data',
'Invalid database.' => 'Basis data invalid.',
'Create new database' => 'Buat basis data baru',
'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 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',
// thousands separator - must contain single byte
',' => '.',
'Engine' => 'Mesin',
'Collation' => 'Kolasi',
'Data Length' => 'Panjang Data',
'Index Length' => 'Panjang Indeks',
'Data Free' => 'Data Bebas',
'Rows' => 'Baris',
'%d in total' => '%d total',
'Analyze' => 'Analisis',
'Optimize' => 'Optimalkan',
'Check' => 'Periksa',
'Repair' => 'Perbaiki',
'Truncate' => 'Kosongkan',
'Tables have been truncated.' => 'Tabel berhasil dikosongkan.',
'Move to other database' => 'Pindahkan ke basis data lain',
'Move' => 'Pindahkan',
'Tables have been moved.' => 'Tabel berhasil dipindahkan.',
'Copy' => 'Salin',
'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'),
'Call' => 'Panggilan',
'Parameter name' => 'Nama paramater',
'Create procedure' => 'Buat prosedur',
'Create function' => 'Buat fungsi',
'Routine has been dropped.' => 'Rutin berhasil dihapus.',
'Routine has been altered.' => 'Rutin berhasil diubah.',
'Routine has been created.' => 'Rutin berhasil dibuat.',
'Alter function' => 'Ubah fungsi',
'Alter procedure' => 'Ubah prosedur',
'Return type' => 'Jenis balikan',
'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',
'At given time' => 'Pada waktu tertentu',
'Every' => 'Setiap',
'Schedule' => 'Jadwal',
'Start' => 'Mulai',
'End' => 'Selesai',
'On completion preserve' => 'Pertahankan saat selesai',
'Tables' => 'Tabel',
'Tables and views' => 'Tabel dan tampilan',
'Table' => 'Tabel',
'No tables.' => 'Tiada tabel.',
'Alter table' => 'Ubah tabel',
'Create table' => 'Buat tabel',
'Table has been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been dropped.' => 'Tabel berhasil dihapus.',
'Tables have been optimized.' => 'Tabel berhasil dioptimalkan.',
'Table has been altered.' => 'Tabel berhasil diubah.',
'Table has been created.' => 'Tabel berhasil dibuat.',
'Table name' => 'Nama tabel',
'Show structure' => 'Lihat struktur',
'engine' => 'mesin',
'collation' => 'kolasi',
'Column name' => 'Nama kolom',
'Type' => 'Jenis',
'Length' => 'Panjang',
'Auto Increment' => 'Kenaikan Otomatis',
'Options' => 'Opsi',
'Comment' => 'Komentar',
'Default values' => 'Nilai bawaan',
'Drop' => 'Hapus',
'Are you sure?' => 'Anda yakin',
'Move up' => 'Naik',
'Move down' => 'Turun',
'Remove' => 'Hapus',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Jumlah ruas maksimum yang diizinkan dilewati. Harap naikkan %s.',
'Partition by' => 'Partisi menurut',
'Partitions' => 'Partisi',
'Partition name' => 'Nama partisi',
'Values' => 'Nilai',
'View' => 'Tampilan',
'View has been dropped.' => 'Tampilan berhasil dihapus.',
'View has been altered.' => 'Tampilan berhasil diubah.',
'View has been created.' => 'Tampilan berhasil dibuat.',
'Alter view' => 'Ubah tampilan',
'Create view' => 'Buat tampilan',
'Indexes' => 'Indeks',
'Indexes have been altered.' => 'Indeks berhasil diubah.',
'Alter indexes' => 'Ubah indeks',
'Add next' => 'Tambah setelahnya',
'Index Type' => 'Jenis Indeks',
'Column (length)' => 'Kolom (panjang)',
'Foreign keys' => 'Kunci asing',
'Foreign key' => 'Kunci asing',
'Foreign key has been dropped.' => 'Kunci asing berhasil dihapus.',
'Foreign key has been altered.' => 'Kunci asing berhasil diubah.',
'Foreign key has been created.' => 'Kunci asing berhasil dibuat.',
'Target table' => 'Tabel sasaran',
'Change' => 'Ubah',
'Source' => 'Sumber',
'Target' => 'Sasaran',
'Add column' => 'Tambah kolom',
'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.' => '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',
'Time' => 'Waktu',
'Event' => 'Peristiwa',
'Name' => 'Nama',
'select' => 'pilih',
'Select' => 'Pilih',
'Select data' => 'Pilih data',
'Functions' => 'Fungsi',
'Aggregation' => 'Agregasi',
'Search' => 'Cari',
'anywhere' => 'di mana pun',
'Search data in tables' => 'Cari data dalam tabel',
'Sort' => 'Urutan',
'descending' => 'menurun',
'Limit' => 'Limit',
'Text length' => 'Panjang teks',
'Action' => 'Tindakan',
'Full table scan' => 'Pindai tabel lengkap',
'Unable to select the table' => 'Gagal memilih tabel',
'No rows.' => 'Tiada baris.',
'%d row(s)' => '%d baris',
'Page' => 'Halaman',
'last' => 'terakhir',
'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.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Entri%s berhasil disisipkan.',
'Item has been deleted.' => 'Entri berhasil dihapus.',
'Item has been updated.' => 'Entri berhasil diperbarui.',
'%d item(s) have been affected.' => '%d entri terpengaruh.',
'New item' => 'Entri baru',
'original' => 'orisinal',
// label for value '' in enum data type
'empty' => 'kosong',
'edit' => 'edit',
'Edit' => 'Edit',
'Insert' => 'Sisipkan',
'Save' => 'Simpan',
'Save and continue edit' => 'Simpan dan terus mengedit',
'Save and insert next' => 'Simpan dan sisipkan yang lain',
'Clone' => 'Gandakan',
'Delete' => 'Hapus',
'E-mail' => 'Surel',
'From' => 'Dari',
'Subject' => 'Subjek',
'Attachments' => 'Lampiran',
'Send' => 'Kirim',
'%d e-mail(s) have been sent.' => array('%d surel berhasil dikirim.', '%d surel berhasil dikirim'),
// data type descriptions
'Numbers' => 'Angka',
'Date and time' => 'Tanggal dan waktu',
'Strings' => 'String',
'Binary' => 'Biner',
'Lists' => 'Daftar',
'Network' => 'Jaringan',
'Geometry' => 'Geometri',
'Relations' => 'Relasi',
'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' => 'now',
'yes' => 'yes',
'no' => 'no',
// general SQLite error in create, drop or rename database
'File exists.' => 'Berkas sudah ada.',
'Please use one of the extensions %s.' => 'Harap gunakan salah satu ekstensi %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Ubah skema',
'Create schema' => 'Buat skema',
'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.',
// PostgreSQL sequences support
'Sequences' => 'Deret',
'Create sequence' => 'Buat deret',
'Sequence has been dropped.' => 'Deret berhasil dihapus.',
'Sequence has been created.' => 'Deret berhasil dibuat.',
'Sequence has been altered.' => 'Deret berhasil diubah.',
'Alter sequence' => 'Ubah deret',
// PostgreSQL user types support
'User types' => 'Jenis pengguna',
'Create type' => 'Buat jenis',
'Type has been dropped.' => 'Jenis berhasil dihapus.',
'Type has been created.' => 'Jenis berhasil dibuat.',
'Alter type' => 'Ubah jenis',
);

View File

@@ -37,7 +37,6 @@ $translations = array(
'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.',
@@ -187,17 +186,16 @@ $translations = array(
'Truncate' => 'Svuota',
'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'),
'%d item(s) have been affected.' => array('Il risultato consiste in %d elemento.', 'Il risultato consiste in %d elementi.'),
'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',
'Values' => 'Valori',
'%d row(s) have been imported.' => array('%d riga importata.', '%d righe importate.'),
'anywhere' => 'ovunque',
'CSV Import' => 'Importa da CSV',
'Import' => 'Importa',
'Stop on error' => 'Stop su errore',
'%.3f s' => '%.3f s',
@@ -245,8 +243,7 @@ $translations = array(
'Alter type' => 'Modifica tipo definito dall\'utente',
'Type has been dropped.' => 'Tipo definito dall\'utente eliminato.',
'Type has been created.' => 'Tipo definito dall\'utente creato.',
'Double click on a value to modify it.' => 'Fai doppio click su un valore per modificarlo.',
'Increase text length to modify this value.' => 'Aumenta la lunghezza del testo per modificare questo valore.',
'Ctrl+click on a value to modify it.' => 'Fai Ctrl+click su un valore per modificarlo.',
'Use edit link to modify this value.' => 'Usa il link modifica per modificare questo valore.',
'last' => 'ultima',
'From server' => 'Dal server',
@@ -258,4 +255,16 @@ $translations = array(
'Geometry' => 'Geometria',
'File exists.' => 'Il file esiste già.',
'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',
'Refresh' => 'Aggiorna',
'Invalid schema.' => 'Schema non valido.',
'Please use one of the extensions %s.' => 'Usa una delle estensioni %s.',
'now' => 'adesso',
'ltr' => 'ltr',
'Tables have been copied.' => 'Le tabelle sono state copiate.',
'Copy' => 'Copia',
'Permanent link' => 'Link permanente',
'Edit all' => 'Modifica tutto',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -37,7 +37,6 @@ $translations = array(
'Use' => '使用',
'No tables.' => 'テーブルがありません。',
'select' => '選択',
'Create new table' => 'テーブルを作成',
'Item has been deleted.' => '項目を削除しました',
'Item has been updated.' => '項目を更新しました',
'Edit' => '編集',
@@ -128,7 +127,7 @@ $translations = array(
'Event' => 'イベント',
'%s version: %s through PHP extension %s' => '%sバージョン%s、 PHP拡張機能 %s',
'%d row(s)' => '%d 行',
'Remove' => '除',
'Remove' => '除',
'Are you sure?' => '実行しますか?',
'Privileges' => '権限',
'Create user' => 'ユーザを作成',
@@ -181,7 +180,7 @@ $translations = array(
'Check' => 'チェック',
'Repair' => '修復',
'Truncate' => 'Truncate',
'Move to other database' => '別のデータベースへ移動?',
'Move to other database' => '別のデータベースへ移動',
'Move' => '移動',
'Save and continue edit' => '保存して継続',
'original' => '元',
@@ -189,7 +188,7 @@ $translations = array(
'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' => 'パーティション名',
@@ -197,7 +196,6 @@ $translations = array(
'%d row(s) have been imported.' => '%d 行をインポートしました',
'Show structure' => '構造',
'anywhere' => '任意',
'CSV Import' => 'CSV インポート',
'Import' => 'インポート',
'Stop on error' => 'エラーの場合は停止',
'Select data' => 'データ',
@@ -246,8 +244,6 @@ $translations = array(
'Alter type' => 'ユーザー定義型変更',
'Type has been dropped.' => 'ユーザー定義型を削除しました',
'Type has been created.' => 'ユーザー定義型を追加しました',
'Double click on a value to modify it.' => 'ダブルクリックして編集',
'Increase text length to modify this value.' => '編集枠を広げる',
'Use edit link to modify this value.' => 'リンクを編集する',
'last' => '最終',
'From server' => 'サーバーから実行',
@@ -259,4 +255,15 @@ $translations = array(
'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' => '時:分:秒',
);

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

@@ -0,0 +1,269 @@
<?php
$translations = array(
'Login' => '로그인',
'Logout successful.' => '로그아웃',
'Invalid credentials.' => '잘못된 로그인',
'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' => '선택',
'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' => '행',
',' => ',',
'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' => '스키마',
'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' => '시:분:초',
);

314
adminer/lang/lt.inc.php Normal file
View File

@@ -0,0 +1,314 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistema',
'Server' => 'Serveris',
'Username' => 'Vartotojas',
'Password' => 'Slaptažodis',
'Permanent login' => 'Pastovus prisijungimas',
'Login' => 'Prisijungti',
'Logout' => 'Atsijungti',
'Logged as: %s' => 'Prisijungęs kaip: %s',
'Logout successful.' => 'Jūs atsijungėte nuo sistemos.',
'Invalid credentials.' => 'Neteisingi prisijungimo duomenys.',
'Language' => 'Kalba',
'Invalid CSRF token. Send the form again.' => 'Neteisingas CSRF tokenas. Bandykite siųsti formos duomenis dar kartą.',
'No extension' => 'Nėra plėtiio',
'None of the supported PHP extensions (%s) are available.' => 'Nėra nei vieno iš palaikomų PHP plėtinių (%s).',
'Session support must be enabled.' => 'Sesijų palaikymas turi būti įjungtas.',
'Session expired, please login again.' => 'Sesijos galiojimas baigėsi. Prisijunkite iš naujo.',
'%s version: %s through PHP extension %s' => '%s versija: %s per PHP plėtinį %s',
'Refresh' => 'Atnaujinti',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Privilegijos',
'Create user' => 'Sukurti vartotoją',
'User has been dropped.' => 'Vartotojas ištrintas.',
'User has been altered.' => 'Vartotojo duomenys pakeisti.',
'User has been created.' => 'Vartotojas sukurtas.',
'Hashed' => 'Šifruotas',
'Column' => 'Stulpelis',
'Routine' => 'Procedūra',
'Grant' => 'Suteikti',
'Revoke' => 'Atšaukti',
'Process list' => 'Procesų sąrašas',
'%d process(es) have been killed.' => array('%d procesas nutrauktas.', '%d procesai nutraukti.', '%d procesų nutraukta.'),
'Kill' => 'Nutraukti',
'Variables' => 'Kintamieji',
'Status' => 'Būsena',
'SQL command' => 'SQL užklausa',
'%d query(s) executed OK.' => array('%d užklausa įvykdyta.', '%d užklausos įvykdytos.', '%d užklausų įvykdyta.'),
'Query executed OK, %d row(s) affected.' => array('Užklausa įvykdyta. Pakeistas %d įrašas.', 'Užklausa įvykdyta. Pakeisti %d įrašai.', 'Užklausa įvykdyta. Pakeista %d įrašų.'),
'No commands to execute.' => 'Nėra vykdomų užklausų.',
'Error in query' => 'Klaida užklausoje',
'Execute' => 'Vykdyti',
'Stop on error' => 'Sustabdyti esant klaidai',
'Show only errors' => 'Rodyti tik klaidas',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Istorija',
'Clear' => 'Išvalyti',
'Edit all' => 'Redaguoti visus',
'File upload' => 'Failo įkėlimas',
'From server' => 'Iš serverio',
'Webserver file %s' => 'Failas %s iš serverio',
'Run file' => 'Vykdyti failą',
'File does not exist.' => 'Failas neegzistuoja.',
'File uploads are disabled.' => 'Failų įkėlimas išjungtas.',
'Unable to upload a file.' => 'Nepavyko įkelti failo.',
'Maximum allowed file size is %sB.' => 'Maksimalus failo dydis - %sB.',
'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',
'Format' => 'Formatas',
'Data' => 'Duomenys',
'Database' => 'Duomenų bazė',
'database' => 'duomenų bazė',
'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.',
'Database has been renamed.' => 'Duomenų bazė pervadinta.',
'Database has been altered.' => 'Duomenų bazė pakeista.',
'Alter database' => 'Redaguoti duomenų bazę',
'Create database' => 'Sukurti duomenų bazę',
'Database schema' => 'Duomenų bazės schema',
// link to current database schema layout
'Permanent link' => 'Pastovi nuoroda',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Variklis',
'Collation' => 'Lyginimas',
'Data Length' => 'Duomenų ilgis',
'Index Length' => 'Indekso ilgis',
'Data Free' => 'Laisvos vietos',
'Rows' => 'Įrašai',
'%d in total' => '%d iš viso',
'Analyze' => 'Analizuoti',
'Optimize' => 'Optimizuoti',
'Check' => 'Patikrinti',
'Repair' => 'Pataisyti',
'Truncate' => 'Tuštinti',
'Tables have been truncated.' => 'Lentelės buvo ištuštintos.',
'Move to other database' => 'Perkelti į kitą duomenų bazę',
'Move' => 'Perkelti',
'Tables have been moved.' => 'Lentelės perkeltos.',
'Copy' => 'Kopijuoti',
'Tables have been copied.' => 'Lentelės nukopijuotos.',
'Routines' => 'Procedūros',
'Routine has been called, %d row(s) affected.' => array('Procedūra įvykdyta. %d įrašas pakeistas.', 'Procedūra įvykdyta. %d įrašai pakeisti.', 'Procedūra įvykdyta. %d įrašų pakeista.'),
'Call' => 'Vykdyti',
'Parameter name' => 'Parametro pavadinimas',
'Create procedure' => 'Sukurti procedūrą',
'Create function' => 'Sukurti funkciją',
'Routine has been dropped.' => 'Procedūra pašalinta.',
'Routine has been altered.' => 'Procedūra pakeista.',
'Routine has been created.' => 'Procedūra sukurta.',
'Alter function' => 'Keisti funkciją',
'Alter procedure' => 'Keiskti procedūrą',
'Return type' => 'Grąžinimo tipas',
'Events' => 'Įvykiai',
'Event has been dropped.' => 'Įvykis pašalintas.',
'Event has been altered.' => 'Įvykis pakeistas.',
'Event has been created.' => 'Įvykis sukurtas.',
'Alter event' => 'Redaguoti įvykį',
'Create event' => 'Sukurti įvykį',
'At given time' => 'Nurodytu laiku',
'Every' => 'Kas',
'Schedule' => 'Grafikas',
'Start' => 'Pradžia',
'End' => 'Pabaiga',
'On completion preserve' => 'Įvykdžius išsaugoti',
'Tables' => 'Lentelės',
'Tables and views' => 'Lentelės ir vaizdai',
'Table' => 'Lentelė',
'No tables.' => 'Nėra lentelių.',
'Alter table' => 'Redaguoti lentelę',
'Create table' => 'Sukurti lentelę',
'Table has been dropped.' => 'Lentelė pašalinta.',
'Tables have been dropped.' => 'Lentelės pašalintos.',
'Table has been altered.' => 'Lentelė pakeista.',
'Table has been created.' => 'Lentelė sukurta.',
'Table name' => 'Lentelės pavadinimas',
'Show structure' => 'Rodyti struktūrą',
'engine' => 'variklis',
'collation' => 'palyginimas',
'Column name' => 'Stulpelio pavadinimas',
'Type' => 'Tipas',
'Length' => 'Ilgis',
'Auto Increment' => 'Auto Increment',
'Options' => 'Nustatymai',
'Comment' => 'Komentaras',
'Default values' => 'Reikšmės pagal nutylėjimą',
'Drop' => 'Pašalinti',
'Are you sure?' => 'Tikrai?',
'Move up' => 'Perkelti į viršų',
'Move down' => 'Perkelti žemyn',
'Remove' => 'Pašalinti',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Viršytas maksimalus leidžiamų stulpelių kiekis. Padidinkite %s.',
'Partition by' => 'Skirstyti pagal',
'Partitions' => 'Skirsniai',
'Partition name' => 'Skirsnio pavadinimas',
'Values' => 'Reikšmės',
'View' => 'Vaizdas',
'View has been dropped.' => 'Vaizdas pašalintas.',
'View has been altered.' => 'Vaizdas pakeistas.',
'View has been created.' => 'Vaizdas sukurtas.',
'Alter view' => 'Redaguoti vaizdą',
'Create view' => 'Sukurti vaizdą',
'Indexes' => 'Indeksai',
'Indexes have been altered.' => 'Indeksai pakeisti.',
'Alter indexes' => 'Redaguoti indeksus',
'Add next' => 'Pridėti kitą',
'Index Type' => 'Indekso tipas',
'Column (length)' => 'Stulpelis (ilgis)',
'Foreign keys' => 'Išoriniai raktai',
'Foreign key' => 'Išorinis raktas',
'Foreign key has been dropped.' => 'Išorinis raktas pašalintas.',
'Foreign key has been altered.' => 'Išorinis raktas pakeistas.',
'Foreign key has been created.' => 'Išorinis raktas sukurtas.',
'Target table' => 'Tikslinė lentelė',
'Change' => 'Pakeisti',
'Source' => 'Šaltinis',
'Target' => 'Tikslas',
'Add column' => 'Pridėti stulpelį',
'Alter' => 'Redaguoti',
'Add foreign key' => 'Pridėti išorinį raktą',
'ON DELETE' => 'Ištrinant',
'ON UPDATE' => 'Atnaujinant',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Šaltinio ir tikslinis stulpelis turi būti to paties tipo, tiksliniame stulpelyje turi būti naudojamas indeksas ir duomenys turi egzistuoti.',
'Triggers' => 'Trigeriai',
'Add trigger' => 'Pridėti trigerį',
'Trigger has been dropped.' => 'Trigeris pašalintas.',
'Trigger has been altered.' => 'Trigeris pakeistas.',
'Trigger has been created.' => 'Trigeris sukurtas.',
'Alter trigger' => 'Keisti trigerį',
'Create trigger' => 'Sukurti trigerį',
'Time' => 'Laikas',
'Event' => 'Įvykis',
'Name' => 'Pavadinimas',
'select' => 'atrinkti',
'Select' => 'Atrinkti',
'Select data' => 'Atrinkti duomenis',
'Functions' => 'Funkcijos',
'Aggregation' => 'Agregacija',
'Search' => 'Ieškoti',
'anywhere' => 'visur',
'Search data in tables' => 'Ieškoti duomenų lentelėse',
'Sort' => 'Rikiuoti',
'descending' => 'mažėjimo tvarka',
'Limit' => 'Limitas',
'Text length' => 'Teksto ilgis',
'Action' => 'Veiksmas',
'Unable to select the table' => 'Neįmanoma atrinkti lentelės',
'No rows.' => 'Nėra įrašų.',
'%d row(s)' => array('%d įrašas', '%d įrašai', '%d įrašų'),
'Page' => 'Puslapis',
'last' => 'paskutinis',
'whole result' => 'visas rezultatas',
'%d byte(s)' => array('%d baitas', '%d baigai', '%d baitų'),
'Import' => 'Importas',
'%d row(s) have been imported.' => array('%d įrašas įkelta.', '%d įrašai įkelti.', '%d įrašų įkelta.'),
// in-place editing in select
'Use edit link to modify this value.' => 'Norėdami redaguoti reikšmę naudokite redagavimo nuorodą.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Įrašas%s sukurtas.',
'Item has been deleted.' => 'Įrašas ištrintas.',
'Item has been updated.' => 'Įrašas pakeistas.',
'%d item(s) have been affected.' => array('Pakeistas %d įrašas.', 'Pakeisti %d įrašai.', 'Pakeistas %d įrašų.'),
'New item' => 'Naujas įrašas',
'original' => 'originalas',
// label for value '' in enum data type
'empty' => 'tuščia',
'edit' => 'redaguoti',
'Edit' => 'Redaguoti',
'Insert' => 'Įrašyti',
'Save' => 'Išsaugoti',
'Save and continue edit' => 'Išsaugoti ir tęsti redagavimą',
'Save and insert next' => 'Išsaugoti ir įrašyti kitą',
'Clone' => 'Klonuoti',
'Delete' => 'Trinti',
'E-mail' => 'El. paštas',
'From' => 'Nuo',
'Subject' => 'Antraštė',
'Attachments' => 'Priedai',
'Send' => 'Siųsti',
'%d e-mail(s) have been sent.' => array('Išsiųstas %d laiškas.', 'Išsiųsti %d laiškai.', 'Išsiųsta %d laiškų.'),
// data type descriptions
'Numbers' => 'Skaičiai',
'Date and time' => 'Data ir laikas',
'Strings' => 'Tekstas',
'Binary' => 'Dvejetainis',
'Lists' => 'Sąrašai',
'Network' => 'Tinklas',
'Geometry' => 'Geometrija',
'Relations' => 'Ryšiai',
'Editor' => 'Redaktorius',
// 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' => 'dabar',
// general SQLite error in create, drop or rename database
'File exists.' => 'Failas egzistuoja.',
'Please use one of the extensions %s.' => 'Naudokite vieną iš plėtinių %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Keisti schemą',
'Create schema' => 'Sukurti schemą',
'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.',
// PostgreSQL sequences support
'Sequences' => 'Sekos',
'Create sequence' => 'Sukurti seką',
'Sequence has been dropped.' => 'Seka pašalinta.',
'Sequence has been created.' => 'Seka sukurta.',
'Sequence has been altered.' => 'Seka pakeista.',
'Alter sequence' => 'Keisti seką',
// PostgreSQL user types support
'User types' => 'Vartotojų tipai',
'Create type' => 'Sukurti tipą',
'Type has been dropped.' => 'Tipas pašalintas.',
'Type has been created.' => 'Tipas sukurtas.',
'Alter type' => 'Keisti tipą',
);

View File

@@ -38,7 +38,6 @@ $translations = array(
'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.',
@@ -191,14 +190,13 @@ $translations = array(
'%d item(s) have been affected.' => array('%d item aangepast.', '%d items aangepast.'),
'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',
'Values' => 'Waarden',
'%d row(s) have been imported.' => array('%d rij werd geïmporteerd.', '%d rijen werden geïmporteerd.'),
'anywhere' => 'overal',
'CSV Import' => 'CSV Import',
'Import' => 'Importeren',
'Stop on error' => 'Stoppen bij fout',
'%.3f s' => '%.3f s',
@@ -245,8 +243,7 @@ $translations = array(
'Alter type' => 'Type wijzigen',
'Type has been dropped.' => 'Type verwijderd.',
'Type has been created.' => 'Type aangemaakt.',
'Double click on a value to modify it.' => 'Dubbelklik op een waarde om deze te bewerken.',
'Increase text length to modify this value.' => 'Verhoog de lengte om deze waarde te bewerken.',
'Ctrl+click on a value to modify it.' => 'Ctrl+klik op een waarde om deze te bewerken.',
'Use edit link to modify this value.' => 'Gebruik de link "bewerk" om deze waarde te wijzigen.',
'last' => 'laatste',
'From server' => 'Van server',
@@ -258,4 +255,16 @@ $translations = array(
'Geometry' => 'Geometrie',
'File exists.' => 'Bestand bestaat reeds.',
'Attachments' => 'Bijlagen',
'%d query(s) executed OK.' => array('%d query succesvol uitgevoerd.', '%d querys succesvol uitgevoerd'),
'Show only errors' => 'Enkel fouten tonen',
'Refresh' => 'Vernieuwen',
'Invalid schema.' => 'Ongeldig schema.',
'Please use one of the extensions %s.' => 'Gebruik 1 van volgende extensies: %s.',
'now' => 'nu',
'ltr' => 'ltr',
'Tables have been copied.' => 'De tabellen zijn gekopieerd.',
'Copy' => 'Kopieren',
'Permanent link' => 'Permanente link',
'Edit all' => 'Alles bewerken',
'HH:MM:SS' => 'HH:MM:SS',
);

325
adminer/lang/pl.inc.php Normal file
View File

@@ -0,0 +1,325 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Rodzaj bazy',
'Server' => 'Serwer',
'Username' => 'Użytkownik',
'Password' => 'Hasło',
'Permanent login' => 'Zapamiętaj sesję',
'Login' => 'Zaloguj się',
'Logout' => 'Wyloguj',
'Logged as: %s' => 'Zalogowany jako: %s',
'Logout successful.' => 'Wylogowano pomyślnie.',
'Invalid credentials.' => 'Nieprawidłowe dane logowania.',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Ważność hasła głównego wygasła. <a href="http://www.adminer.org/pl/extension/" target="_blank">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.',
'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.',
'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',
'Refresh' => 'Odśwież',
// text direction - 'ltr' or 'rtl'
'ltr' => 'ltr',
'Privileges' => 'Uprawnienia użytkowników',
'Create user' => 'Dodaj użytkownika',
'User has been dropped.' => 'Użytkownik został usunięty.',
'User has been altered.' => 'Użytkownik został zmieniony.',
'User has been created.' => 'Użytkownik został dodany.',
'Hashed' => 'Zahashowane',
'Column' => 'Kolumna',
'Routine' => 'Procedura',
'Grant' => 'Uprawnienia',
'Revoke' => 'Usuń uprawnienia',
'Process list' => 'Lista procesów',
'%d process(es) have been killed.' => array('Przerwano %d wątek.', 'Przerwano %d wątki.', 'Przerwano %d wątków.'),
'Kill' => 'Przerwij wykonywanie',
'Variables' => 'Zmienne',
'Status' => 'Status',
'SQL command' => 'Zapytanie SQL',
'%d query(s) executed OK.' => array('Pomyślnie wykonano %d zapytanie.', 'Pomyślnie wykonano %d zapytania.', 'Pomyślnie wykonano %d zapytań.'),
'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',
'Execute' => 'Wykonaj',
'Stop on error' => 'Zatrzymaj w przypadku błędu',
'Show only errors' => 'Pokaż tylko błędy',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Historia',
'Clear' => 'Wyczyść',
'Edit all' => 'Edytuj wszystkie',
'File upload' => 'Wgranie pliku',
'From server' => 'Z serwera',
'Webserver file %s' => 'Plik %s na serwerze',
'Run file' => 'Uruchom z pliku',
'File does not exist.' => 'Plik nie istnieje.',
'File uploads are disabled.' => 'Wgrywanie plików jest wyłączone.',
'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.',
'Export' => 'Eksport',
'Dump' => 'Eksport',
'Output' => 'Rezultat',
'open' => 'otwórz',
'save' => 'zapisz',
'Format' => 'Format',
'Data' => 'Dane',
'Database' => 'Baza danych',
'database' => 'baza danych',
'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.',
'Database has been renamed.' => 'Nazwa bazy danych została zmieniona.',
'Database has been altered.' => 'Baza danych została zmieniona.',
'Alter database' => 'Zmień bazę danych',
'Create database' => 'Utwórz bazę danych',
'Database schema' => 'Schemat bazy danych',
// link to current database schema layout
'Permanent link' => 'Trwały link',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Składowanie',
'Collation' => 'Porównywanie znaków',
'Data Length' => 'Rozmiar danych',
'Index Length' => 'Rozmiar indeksów',
'Data Free' => 'Wolne miejsce',
'Rows' => 'Liczba rekordów',
'%d in total' => '%d w sumie',
'Analyze' => 'Analizuj',
'Optimize' => 'Optymalizuj',
'Check' => 'Sprawdź',
'Repair' => 'Napraw',
'Truncate' => 'Opróżnij',
'Tables have been truncated.' => 'Tabele zostały opróżnione.',
'Move to other database' => 'Przenieś do innej bazy danych',
'Move' => 'Przenieś',
'Tables have been moved.' => 'Tabele zostały przeniesione.',
'Copy' => 'Kopiuj',
'Tables have been copied.' => 'Tabele zostały skopiowane.',
'Routines' => 'Procedury i funkcje',
'Routine has been called, %d row(s) affected.' => array('Procedura została uruchomiona, zmieniono %d rekord.', 'Procedura została uruchomiona, zmieniono %d rekordy.', 'Procedura została uruchomiona, zmieniono %d rekordów.'),
'Call' => 'Uruchom',
'Parameter name' => 'Nazwa parametru',
'Create procedure' => 'Utwórz procedurę',
'Create function' => 'Utwórz funkcję',
'Routine has been dropped.' => 'Procedura została usunięta.',
'Routine has been altered.' => 'Procedura została zmieniona.',
'Routine has been created.' => 'Procedura została utworzona.',
'Alter function' => 'Zmień funkcję',
'Alter procedure' => 'Zmień procedurę',
'Return type' => 'Zwracany typ',
'Events' => 'Wydarzenia',
'Event has been dropped.' => 'Wydarzenie zostało usunięte.',
'Event has been altered.' => 'Wydarzenie zostało zmienione.',
'Event has been created.' => 'Wydarzenie zostało utworzone.',
'Alter event' => 'Zmień wydarzenie',
'Create event' => 'Utwórz wydarzenie',
'At given time' => 'O danym czasie',
'Every' => 'Wykonuj co',
'Schedule' => 'Harmonogram',
'Start' => 'Początek',
'End' => 'Koniec',
'On completion preserve' => 'Nie kasuj wydarzenia po przeterminowaniu',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele i perspektywy',
'Table' => 'Tabela',
'No tables.' => 'Brak tabel.',
'Alter table' => 'Zmień tabelę',
'Create table' => 'Utwórz 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.',
'Table has been altered.' => 'Tabela została zmieniona.',
'Table has been created.' => 'Tabela została utworzona.',
'Table name' => 'Nazwa tabeli',
'Show structure' => 'Struktura tabeli',
'engine' => 'składowanie',
'collation' => 'porównywanie znaków',
'Column name' => 'Nazwa kolumny',
'Type' => 'Typ',
'Length' => 'Długość',
'Auto Increment' => 'Auto Increment',
'Options' => 'Opcje',
'Comment' => 'Komentarz',
'Default values' => 'Wartości domyślne',
'Drop' => 'Usuń',
'Are you sure?' => 'Czy jesteś pewien?',
'Move up' => 'Przesuń w górę',
'Move down' => 'Przesuń w dół',
'Remove' => 'Usuń',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Przekroczono maksymalną liczbę pól. Zwiększ %s.',
'Partition by' => 'Partycjonowanie',
'Partitions' => 'Partycje',
'Partition name' => 'Nazwa partycji',
'Values' => 'Wartości',
'View' => '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.',
'Alter view' => 'Zmień perspektywę',
'Create view' => 'Utwórz perspektywę',
'Indexes' => 'Indeksy',
'Indexes have been altered.' => 'Indeksy zostały zmienione.',
'Alter indexes' => 'Zmień indeksy',
'Add next' => 'Dodaj następny',
'Index Type' => 'Typ indeksu',
'Column (length)' => 'Kolumna (długość)',
'Foreign keys' => 'Klucze obce',
'Foreign key' => 'Klucz obcy',
'Foreign key has been dropped.' => 'Klucz obcy został usunięty.',
'Foreign key has been altered.' => 'Klucz obcy został zmieniony.',
'Foreign key has been created.' => 'Klucz obcy został utworzony.',
'Target table' => 'Tabela docelowa',
'Change' => 'Zmień',
'Source' => 'Źródło',
'Target' => 'Cel',
'Add column' => 'Dodaj kolumnę',
'Alter' => 'Zmień',
'Add foreign key' => 'Dodaj klucz obcy',
'ON DELETE' => 'W przypadku usunięcia',
'ON UPDATE' => 'W przypadku zmiany',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Źródłowa i docelowa kolumna muszą być tego samego typu, powinien istnieć indeks na docelowej kolumnie oraz muszą istnieć dane referencyjne.',
'Triggers' => 'Wyzwalacze',
'Add trigger' => 'Dodaj wyzwalacz',
'Trigger has been dropped.' => 'Wyzwalacz został usunięty.',
'Trigger has been altered.' => 'Wyzwalacz został zmieniony.',
'Trigger has been created.' => 'Wyzwalacz został utworzony.',
'Alter trigger' => 'Zmień wyzwalacz',
'Create trigger' => 'Utwórz wyzwalacz',
'Time' => 'Czas',
'Event' => 'Wydarzenie',
'Name' => 'Nazwa',
'select' => 'przeglądaj',
'Select' => 'pokaż',
'Select data' => 'Pokaż dane',
'Functions' => 'Funkcje',
'Aggregation' => 'Agregacje',
'Search' => 'Szukaj',
'anywhere' => 'gdziekolwiek',
'Search data in tables' => 'Wyszukaj we wszystkich tabelach',
'Sort' => 'Sortuj',
'descending' => 'malejąco',
'Limit' => 'Limit',
'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 row(s)' => array('%d rekord', '%d rekordy', '%d rekordów'),
'Page' => 'Strona',
'last' => 'ostatni',
'Load more data' => 'Wczytaj więcej danych',
'Loading' => 'Wczytywanie',
'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
'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ść.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Rekord%s został dodany.',
'Item has been deleted.' => 'Rekord został usunięty.',
'Item has been updated.' => 'Rekord został zaktualizowany.',
'%d item(s) have been affected.' => array('Zmieniono %d rekord.', 'Zmieniono %d rekordy.', 'Zmieniono %d rekordów.'),
'New item' => 'Nowy rekord',
'original' => 'bez zmian',
// label for value '' in enum data type
'empty' => 'puste',
'edit' => 'edytuj',
'Edit' => 'Edytuj',
'Insert' => 'Dodaj',
'Save' => 'Zapisz zmiany',
'Save and continue edit' => 'Zapisz i kontynuuj edycję',
'Save and insert next' => 'Zapisz i dodaj następny',
'Clone' => 'Duplikuj',
'Delete' => 'Usuń',
'You have no privileges to update this table.' => 'Brak uprawnień do edycji tej tabeli',
'E-mail' => 'E-mail',
'From' => 'Nadawca',
'Subject' => 'Temat',
'Attachments' => 'Załączniki',
'Send' => 'Wyślij',
'%d e-mail(s) have been sent.' => array('Wysłano %d e-mail.', 'Wysłano %d e-maile.', 'Wysłano %d e-maili.'),
// data type descriptions
'Numbers' => 'Numeryczne',
'Date and time' => 'Data i czas',
'Strings' => 'Tekstowe',
'Binary' => 'Binarne',
'Lists' => 'Listy',
'Network' => 'Sieć',
'Geometry' => 'Geometria',
'Relations' => 'Relacje',
'Editor' => 'Edytor',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'HH:MM:SS',
'now' => 'teraz',
'yes' => 'tak',
'no' => 'nie',
// general SQLite error in create, drop or rename database
'File exists.' => 'Plik już istnieje.',
'Please use one of the extensions %s.' => 'Proszę użyć jednego z rozszerzeń: %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Zmień schemat',
'Create schema' => 'Utwórz schemat',
'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.',
// PostgreSQL sequences support
'Sequences' => 'Sekwencje',
'Create sequence' => 'Utwórz sekwencję',
'Sequence has been dropped.' => 'Sekwencja została usunięta.',
'Sequence has been created.' => 'Sekwencja została utworzona.',
'Sequence has been altered.' => 'Sekwencja została zmieniona.',
'Alter sequence' => 'Zmień sekwencję',
// PostgreSQL user types support
'User types' => 'Typy użytkownika',
'Create type' => 'Utwórz typ',
'Type has been dropped.' => 'Typ został usunięty.',
'Type has been created.' => 'Typ został utworzony.',
'Alter type' => 'Zmień typ',
);

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

@@ -0,0 +1,265 @@
<?php
$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Saida 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.',
'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.',
'Alter table' => 'Modificar 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' => 'Remover',
'Database has been dropped.' => 'Base de dados eliminada.',
'Database has been created.' => 'Base de dados criada.',
'Database has been renamed.' => 'Base de dados renomeada.',
'Database has been altered.' => 'Base de dados modificada.',
'Alter database' => 'Modificar Base de dados',
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Dump' => 'Exportar',
'Logout' => 'Sair',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'select' => 'registros',
'Item has been deleted.' => 'Registro eliminado.',
'Item has been updated.' => 'Registro modificado.',
'Item%s has been inserted.' => 'Registro%s inserido.',
'Edit' => 'Modificar',
'Insert' => 'Inserir',
'Save and insert next' => 'Salvar e inserir outro',
'Delete' => 'Apagar',
'Database' => 'Base de dados',
'Routines' => 'Procedimentos',
'Indexes have been altered.' => 'Índices modificados.',
'Indexes' => 'Índices',
'Alter indexes' => 'Modificar í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' => 'modificar',
'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 foráneas',
'Triggers' => 'Triggers',
'View' => 'Visualizar',
'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 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.'),
'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.' => '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',
'Target table' => 'Tabela de destino',
'Change' => 'Modificar',
'Source' => 'Origem',
'Target' => 'Destino',
'Add column' => 'Adicionar coluna',
'Alter' => 'Modificar',
'Add foreign key' => 'Adicionar Chave foránea',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'coluna (tamanho)',
'View has been dropped.' => 'Vista eliminada.',
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista criada.',
'Alter view' => 'Modificar vista',
'Create view' => 'Criar vista',
'Name' => 'Nome',
'Process list' => 'Lista de processos',
'%d process(es) have been killed.' => array('%d processo terminado.', '%d processos 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.' => 'Procedimento eliminado.',
'Routine has been altered.' => 'Procedimento modificado.',
'Routine has been created.' => 'Procedimento criado.',
'Alter function' => 'Modificar Função',
'Alter procedure' => 'Modificar procedimento',
'Return type' => 'Tipo de valor de regreso',
'Add trigger' => 'Adicionar trigger',
'Trigger has been dropped.' => 'Trigger eliminado.',
'Trigger has been altered.' => 'Trigger modificado.',
'Trigger has been created.' => 'Trigger criado.',
'Alter trigger' => 'Modificar 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?' => 'Está seguro?',
'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.',
'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' => 'mostrar',
'save' => 'salvas',
'Format' => 'Formato',
'Tables' => 'Tabelas',
'Data' => 'Dados',
'Event has been dropped.' => 'Evento eliminado.',
'Event has been altered.' => 'Evento modificado.',
'Event has been created.' => 'Evento 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 vistas',
'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.' => 'Tabelas truncadas (truncate).',
'Rows' => 'Registros',
',' => ' ',
'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',
'original' => 'original',
'Tables have been dropped.' => 'Tabelas eliminadas.',
'%d item(s) have been affected.' => array('%d item afetado.', '%d itens 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 importado.', '%d registros 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 é %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 enviado.', '%d emails 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' => 'Salvar Senha',
'Databases have been dropped.' => 'Bases de dados eliminadas.',
'Search data in tables' => 'Buscar dados nas Tabelas',
'schema' => 'esquema',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Criar esquema',
'Schema has been dropped.' => 'Esquema eliminado.',
'Schema has been created.' => 'Esquema criado.',
'Schema has been altered.' => 'Esquema modificado.',
'Sequences' => 'Sequências',
'Create sequence' => 'Criar sequências',
'Alter sequence' => 'Modificar sequência',
'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',
'Create type' => 'Criar tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo criado.',
'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',
'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.',
'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',
);

265
adminer/lang/pt.inc.php Normal file
View File

@@ -0,0 +1,265 @@
<?php
$translations = array(
'Login' => 'Entrar',
'Logout successful.' => 'Sessão terminada com sucesso.',
'Invalid credentials.' => 'Identificação inválida.',
'Server' => 'Servidor',
'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.',
'Alter table' => 'Modificar 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' => 'Guardar',
'Drop' => 'Remover',
'Database has been dropped.' => 'Base de dados eliminada.',
'Database has been created.' => 'Base de dados criada.',
'Database has been renamed.' => 'Base de dados renomeada.',
'Database has been altered.' => 'Base de dados modificada.',
'Alter database' => 'Modificar Base de dados',
'Create database' => 'Criar Base de dados',
'SQL command' => 'Comando SQL',
'Dump' => 'Exportar',
'Logout' => 'Terminar sessão',
'database' => 'base de dados',
'Use' => 'Usar',
'No tables.' => 'Não existem tabelas.',
'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' => '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 próximo',
'Language' => 'Idioma',
'Select' => 'Selecionar',
'New item' => 'Novo Registo',
'Search' => 'Procurar',
'Sort' => 'Ordenar',
'descending' => 'decrescente',
'Limit' => 'Limite',
'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 registo afetado.', 'Consulta executada, %d registos afetados.'),
'Error in query' => 'Erro na consulta',
'Execute' => 'Executar',
'Table' => 'Tabela',
'Foreign keys' => 'Chaves estrangeiras',
'Triggers' => 'Triggers',
'View' => 'Visualizar',
'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 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 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á 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.' => '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 estrangeira',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'coluna (tamanho)',
'View has been dropped.' => 'Vista eliminada.',
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista criada.',
'Alter view' => 'Modificar vista',
'Create view' => 'Criar vista',
'Name' => 'Nome',
'Process list' => 'Lista de processos',
'%d process(es) have been killed.' => array('%d processo terminado.', '%d processos 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.' => 'Procedimento eliminado.',
'Routine has been altered.' => 'Procedimento modificado.',
'Routine has been created.' => 'Procedimento criado.',
'Alter function' => 'Modificar Função',
'Alter procedure' => 'Modificar procedimento',
'Return type' => 'Tipo de valor de regresso',
'Add trigger' => 'Adicionar trigger',
'Trigger has been dropped.' => 'Trigger eliminado.',
'Trigger has been altered.' => 'Trigger modificado.',
'Trigger has been created.' => 'Trigger criado.',
'Alter trigger' => 'Modificar 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 registo', '%d registos'),
'Remove' => 'Remover',
'Are you sure?' => 'Tem a certeza?',
'Privileges' => 'Privilégios',
'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' => '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' => 'abrir',
'save' => 'guardar',
'Format' => 'Formato',
'Tables' => 'Tabelas',
'Data' => 'Dados',
'Event has been dropped.' => 'Evento eliminado.',
'Event has been altered.' => 'Evento modificado.',
'Event has been created.' => 'Evento criado.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Criar Evento',
'At given time' => 'À hora determinada',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Agenda',
'Start' => 'Início',
'End' => 'Fim',
'Status' => 'Estado',
'On completion preserve' => 'Preservar ao completar',
'Tables and views' => 'Tabelas e vistas',
'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.' => 'Tabelas truncadas (truncate).',
'Rows' => 'Registos',
',' => ' ',
'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' => 'Guardar e continuar a edição',
'original' => 'original',
'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',
'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 registo importado.', '%d registos 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 registo referenciado deve existir.',
'Relations' => 'Relações',
'Run file' => 'Executar ficheiro',
'Clear' => 'Limpar',
'Maximum allowed file size is %sB.' => 'Tamanho máximo do ficheiro é %sB.',
'Numbers' => 'Números',
'Date and time' => 'Data e hora',
'Strings' => 'Cadeia',
'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 enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Ficheiro do servidor web %s',
'File does not exist.' => 'Ficheiro não existe.',
'%d in total' => '%d no total',
'Permanent login' => 'Memorizar a senha',
'Databases have been dropped.' => 'Bases de dados eliminadas.',
'Search data in tables' => 'Pesquisar dados nas Tabelas',
'schema' => 'esquema',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Criar esquema',
'Schema has been dropped.' => 'Esquema eliminado.',
'Schema has been created.' => 'Esquema criado.',
'Schema has been altered.' => 'Esquema modificado.',
'Sequences' => 'Sequências',
'Create sequence' => 'Criar sequências',
'Alter sequence' => 'Modificar sequência',
'Sequence has been dropped.' => 'Sequência eliminada.',
'Sequence has been created.' => 'Sequência criada.',
'Sequence has been altered.' => 'Sequência modificada.',
'User types' => 'Tipos definidos pelo utilizador',
'Create type' => 'Criar tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo criado.',
'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' => 'Do servidor',
'System' => 'Motor de Base de dados',
'Select data' => 'Selecionar dados',
'Show structure' => 'Mostrar estrutura',
'empty' => 'vazio',
'Network' => 'Rede',
'Geometry' => 'Geometria',
'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',
'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',
);

270
adminer/lang/ro.inc.php Normal file
View File

@@ -0,0 +1,270 @@
<?php
$translations = array(
'Login' => 'Intră',
'Logout successful.' => 'Ați eș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.',
'Alter table' => 'Modifică tabelul',
'Create table' => 'Crează tabel',
'Table name' => 'Denumirea tabelului',
'engine' => 'tip',
'collation' => 'colaționarea',
'Column name' => 'Denumirea coloanei',
'Type' => 'Tip',
'Length' => 'Lungime',
'Auto Increment' => 'Creșterea automată',
'Options' => 'Acțiune',
'Save' => 'Salvează',
'Drop' => 'Șterge',
'Database has been dropped.' => 'Baza de date a fost ștearsă.',
'Database has been created.' => 'Baza de date a fost creată.',
'Database has been renamed.' => 'Baza de date a fost redenumită.',
'Database has been altered.' => 'Baza de date a fost modificată.',
'Alter database' => 'Modifică baza de date',
'Create database' => 'Crează baza de date',
'SQL command' => 'SQL query',
'Dump' => 'Dump',
'Logout' => 'Eșire',
'database' => 'baza de date',
'Use' => 'Alege',
'No tables.' => 'În baza de date nu sunt tabele.',
'select' => 'selectează',
'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ă.',
'Edit' => 'Editează',
'Insert' => 'Inserează',
'Save and insert next' => 'Salvează și mai inserează',
'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',
'Add next' => 'Adaugă încă',
'Language' => 'Limba',
'Select' => 'Selectează',
'New item' => 'Înscriere nouă',
'Search' => 'Căutare',
'Sort' => 'Sortare',
'descending' => 'descrescător',
'Limit' => 'Limit',
'No rows.' => 'Nu sunt înscrieri.',
'Action' => 'Acțiune',
'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',
'Execute' => 'Execută',
'Table' => 'Tabel',
'Foreign keys' => 'Cheiuri externe',
'Triggers' => 'Triggere',
'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.',
'Comment' => 'Comentariu',
'Default values' => 'Valoarea inițială',
'%d byte(s)' => array('%d octet', '%d octeți'),
'No commands to execute.' => 'Nu sunt comenzi de executat.',
'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.'),
'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.',
'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',
'Target table' => 'Tabela scop',
'Change' => 'Modifică',
'Source' => 'Sursă',
'Target' => 'Scop',
'Add column' => 'Adaugă coloană',
'Alter' => 'Modifică',
'Add foreign key' => 'Adaugă chei extern',
'ON DELETE' => 'La ștergere',
'ON UPDATE' => 'La modificare',
'Index Type' => 'Tipul indexului',
'Column (length)' => 'Coloană (lungimea)',
'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',
'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.'),
'Kill' => 'Termină',
'Parameter name' => 'Numele parametrului',
'Database schema' => 'Schema bazei de date',
'Create procedure' => 'Crează procedură',
'Create function' => 'Crează funcție',
'Routine has been dropped.' => 'Procedura a fost ștearsă.',
'Routine has been altered.' => 'Procedura a fost modificată.',
'Routine has been created.' => 'Procedura a fost creată.',
'Alter function' => 'Modifică funcția',
'Alter procedure' => 'Modifică procedura',
'Return type' => 'Tipul returnării',
'Add trigger' => 'Adaugă trigger',
'Trigger has been dropped.' => 'Triggerul a fost șters.',
'Trigger has been altered.' => 'Triggerul a fost modificat.',
'Trigger has been created.' => 'Triggerul a fost creat.',
'Alter trigger' => 'Modifică trigger',
'Create trigger' => 'Crează trigger',
'Time' => 'Timp',
'Event' => 'Eveniment',
'%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',
'Create user' => 'Crează utilizator',
'User has been dropped.' => 'Utilizatorul a fost șters.',
'User has been altered.' => 'Utilizatorul a fost modificat.',
'User has been created.' => 'Utilizatorul a fost creat.',
'Hashed' => 'Hashed',
'Column' => 'Coloană',
'Routine' => 'Procedură',
'Grant' => 'Permite',
'Revoke' => 'Interzice',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Mesajul POST este prea mare. Trimiteți mai puține date sau măriți parametrul configurației directivei %s.',
'Logged as: %s' => 'Ați intrat ca: %s',
'Move up' => 'Mișcă în sus',
'Move down' => 'Mișcă în jos',
'Functions' => 'Funcții',
'Aggregation' => 'Agregare',
'Export' => 'Export',
'Output' => 'Date de eșire',
'open' => 'deschide',
'save' => 'salvează',
'Format' => 'Format',
'Tables' => 'Tabele',
'Data' => 'Date',
'Event has been dropped.' => 'Evenimentul a fost șters.',
'Event has been altered.' => 'Evenimentul a fost modificat.',
'Event has been created.' => 'Evenimentul a fost adăugat.',
'Alter event' => 'Modifică eveniment',
'Create event' => 'Creează evenimet',
'At given time' => 'În timpul curent',
'Every' => 'Fiecare',
'Events' => 'Evenimente',
'Schedule' => 'Program',
'Start' => 'Început',
'End' => 'Svâ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',
'Data Free' => 'Spațiu liber',
'Collation' => 'Colaționare',
'Analyze' => 'Analizează',
'Optimize' => 'Optimizează',
'Check' => 'Controlează',
'Repair' => 'Repară',
'Truncate' => 'Curăță',
'Tables have been truncated.' => 'Tabelele au fost curățate.',
'Rows' => 'Înscrieri',
',' => ',',
'Tables have been moved.' => 'Tabelele au fost mutate.',
'Move to other database' => 'Mută în altă bază de date',
'Move' => 'Mută',
'Engine' => 'Tip',
'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',
'Tables have been dropped.' => 'Tabelele au fost șterse.',
'Clone' => 'Clonează',
'Partition by' => 'Împarte',
'Partitions' => 'Secțiuni',
'Partition name' => 'Denumirea secțiunii',
'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.' => 'Numărul maxim de înscrieri disponibile a fost atins. Majorați %s.',
'anywhere' => 'oriunde',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5.$3.$1',
'[yyyy]-mm-dd' => 'dd.mm.[yyyy]',
'History' => 'Istoria',
'Variables' => 'Variabile',
'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',
'Maximum allowed file size is %sB.' => 'Fișierul maxim admis - %sO.',
'Numbers' => 'Număr',
'Date and time' => 'Data și timpul',
'Strings' => 'Șire de caractere',
'Binary' => 'Tip binar',
'Lists' => 'Liste',
'Editor' => 'Editor',
'E-mail' => 'Poșta electronică',
'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.'),
'Webserver file %s' => 'Fișierul %s pe server',
'File does not exist.' => 'Așa fișier nu există.',
'%d in total' => 'În total %d',
'Permanent login' => 'Logare permanentă',
'Databases have been dropped.' => 'Baze 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ă',
'Schema has been dropped.' => 'Schema a fost ștearsă.',
'Schema has been created.' => 'Schema a fost creată.',
'Schema has been altered.' => 'Schema a fost modificată.',
'Sequences' => '«Secvențe»',
'Create sequence' => 'Crează «secvență»',
'Alter sequence' => 'Modifică «secvență»',
'Sequence has been dropped.' => '«secvența» a fost ștearsă.',
'Sequence has been created.' => '«secvența» a fost creată.',
'Sequence has been altered.' => '«secvența» a fost modificată.',
'User types' => 'Tipuri de utilizatori',
'Create type' => 'Crează tip noi',
'Alter type' => 'Modifică tip',
'Type has been dropped.' => 'Tiipul a fost șters.',
'Type has been created.' => 'Crează tip nou.',
'Ctrl+click on a value to modify it.' => 'Ctrl+click pe o valoare pentru a o modifica.',
'Use edit link to modify this value.' => 'Valoare poate fi modificată cu ajutorul butonului «modifică».',
'last' => 'ultima',
'From server' => 'De pe server',
'System' => 'Sistema',
'Select data' => 'Selectează',
'Show structure' => 'Arată structura',
'empty' => 'gol',
'Network' => 'Rețea',
'Geometry' => 'Geometrie',
'File exists.' => 'Fișierul deja există.',
'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',
'Refresh' => 'Împrospătează',
'Invalid schema.' => 'Schemă incorectă.',
'Please use one of the extensions %s.' => 'Folosiți una din următoarele extensii %s.',
'now' => 'acum',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabelele au fost copiate',
'Copy' => 'Copiază',
'Permanent link' => 'Adresă permanentă',
'Edit all' => 'Editează tot',
'HH:MM:SS' => 'HH:MM:SS',
);

View File

@@ -37,7 +37,6 @@ $translations = array(
'Use' => 'Выбрать',
'No tables.' => 'В базе данных нет таблиц.',
'select' => 'выбрать',
'Create new table' => 'Создать новую таблицу',
'Item has been deleted.' => 'Запись удалена.',
'Item has been updated.' => 'Запись обновлена.',
'Item%s has been inserted.' => 'Запись%s была вставлена.',
@@ -147,7 +146,7 @@ $translations = array(
'Move down' => 'Переместить вниз',
'Functions' => 'Функции',
'Aggregation' => 'Агрегация',
'Export' => 'Експорт',
'Export' => 'Экспорт',
'Output' => 'Выходные данные',
'open' => 'открыть',
'save' => 'сохранить',
@@ -181,7 +180,7 @@ $translations = array(
'Rows' => 'Строк',
',' => ' ',
'Tables have been moved.' => 'Таблицы были перемещены.',
'Move to other database' => 'Переместить в другою базу данных',
'Move to other database' => 'Переместить в другую базу данных',
'Move' => 'Переместить',
'Engine' => 'Тип',
'Save and continue edit' => 'Сохранить и продолжить редактирование',
@@ -195,10 +194,9 @@ $translations = array(
'Partition name' => 'Название раздела',
'Values' => 'Параметры',
'%d row(s) have been imported.' => array('Импортирована %d строка.', 'Импортировано %d строки.', 'Импортировано %d строк.'),
'CSV Import' => 'Импорт CSV',
'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',
@@ -245,8 +243,7 @@ $translations = array(
'Alter type' => 'Изменить тип',
'Type has been dropped.' => 'Тип удален.',
'Type has been created.' => 'Создан новый тип.',
'Double click on a value to modify it.' => 'Кликни два раза по значению, чтобы его изменить.',
'Increase text length to modify this value.' => 'Увеличь длину текста, чтобы изменить это значение.',
'Ctrl+click on a value to modify it.' => 'Ctrl+кликни по значению, чтобы его изменить.',
'Use edit link to modify this value.' => 'Изменить это значение можно с помощью ссылки «изменить».',
'last' => 'последняя',
'From server' => 'С сервера',
@@ -258,4 +255,16 @@ $translations = array(
'Geometry' => 'Геометрия',
'File exists.' => 'Файл уже существует.',
'Attachments' => 'Прикрепленные файлы',
'%d query(s) executed OK.' => array('%d запрос выполнен успешно.', '%d запроса выполнено успешно.', '%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' => 'ЧЧ:ММ:СС',
);

View File

@@ -38,7 +38,6 @@ $translations = array(
'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á.',
@@ -170,9 +169,9 @@ $translations = array(
'On completion preserve' => 'Po dokončení zachovat',
'Save and continue edit' => 'Uložiť a pokračovať v úpravách',
'original' => 'originál',
'Tables have been truncated.' => 'Tabuľka bola vyprázdnená',
'Tables have been moved.' => 'Tabuľka bola presunutá',
'Tables have been dropped.' => 'Tabuľka bola odstránená',
'Tables have been truncated.' => 'Tabuľka bola vyprázdnená.',
'Tables have been moved.' => 'Tabuľka bola presunutá.',
'Tables have been dropped.' => 'Tabuľka bola odstránená.',
'Tables and views' => 'Tabuľky a pohľady',
'Engine' => 'Typ',
'Collation' => 'Porovnávanie',
@@ -196,10 +195,9 @@ $translations = array(
'Partition name' => 'Názov oddielu',
'Values' => 'Hodnoty',
'%d row(s) have been imported.' => array('Bol importovaný %d záznam.', 'Boli importované %d záznamy.', 'Bolo importovaných %d záznamov.'),
'CSV Import' => 'Import CSV',
'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',
@@ -245,8 +243,7 @@ $translations = array(
'Type has been dropped.' => 'Typ bol odstránený.',
'Type has been created.' => 'Typ bol vytvorený.',
'Alter type' => 'Pozmeniť typ',
'Double click on a value to modify it.' => 'Dvojkliknite na políčko, ktoré chcete zmeniť.',
'Increase text length to modify this value.' => 'Pre zmenu tejto hodnoty zvýšte dĺžku textov.',
'Ctrl+click on a value to modify it.' => 'Ctrl+kliknite na políčko, ktoré chcete zmeniť.',
'Use edit link to modify this value.' => 'Pre zmenu tejto hodnoty použite odkaz upraviť.',
'last' => 'posledný',
'From server' => 'Zo serveru',
@@ -258,4 +255,16 @@ $translations = array(
'Geometry' => 'Geometria',
'File exists.' => 'Súbor existuje.',
'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',
'Refresh' => 'Obnoviť',
'Invalid schema.' => 'Neplatné schéma.',
'Please use one of the extensions %s.' => 'Prosím vyberte jednu z koncoviek %s.',
'now' => 'teraz',
'ltr' => 'ltr',
'Tables have been copied.' => 'Tabuľky boli skopírované.',
'Copy' => 'Kopírovať',
'Permanent link' => 'Permanentný odkaz',
'Edit all' => 'Upraviť všetko',
'HH:MM:SS' => 'HH:MM:SS',
);

309
adminer/lang/sl.inc.php Normal file
View File

@@ -0,0 +1,309 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Strežnik',
'Username' => 'Uporabniško ime',
'Password' => 'Geslo',
'Permanent login' => 'Trajna prijava',
'Login' => 'Prijavi se',
'Logout' => 'Odjavi se',
'Logged as: %s' => 'Prijavljen kot: %s',
'Logout successful.' => 'Prijava uspešna.',
'Invalid credentials.' => 'Neveljavne pravice.',
'Language' => 'Jezik',
'Invalid CSRF token. Send the form again.' => 'Neveljaven token CSRF. Pošljite formular še enkrat.',
'No extension' => 'Brez dodatkov',
'None of the supported PHP extensions (%s) are available.' => 'Noben od podprtih dodatkov za PHP (%s) ni na voljo.',
'Session support must be enabled.' => 'Podpora za seje mora biti omogočena.',
'Session expired, please login again.' => 'Seja je potekla. Prosimo, ponovno se prijavite.',
'%s version: %s through PHP extension %s' => 'Verzija %s: %s preko dodatka za PHP %s',
'Refresh' => 'Osveži',
// text direction
'ltr' => 'ltr',
'Privileges' => 'Pravice',
'Create user' => 'Ustvari uporabnika',
'User has been dropped.' => 'Uporabnik je odstranjen.',
'User has been altered.' => 'Uporabnik je spremenjen.',
'User has been created.' => 'Uporabnik je ustvarjen.',
'Hashed' => 'Zakodirano',
'Column' => 'Stolpec',
'Routine' => 'Postopek',
'Grant' => 'Dovoli',
'Revoke' => 'Odvzemi',
'Process list' => 'Seznam procesov',
'%d process(es) have been killed.' => array('Končan je %d proces.', 'Končana sta %d procesa.', 'Končani so %d procesi.', 'Končanih je %d procesov.'),
'Kill' => 'Končaj',
'Variables' => 'Spremenljivke',
'Status' => 'Stanje',
'SQL command' => 'Ukaz SQL',
'%d query(s) executed OK.' => array('Uspešno se je končala %d poizvedba.', 'Uspešno sta se končali %d poizvedbi.', 'Uspešno so se končale %d poizvedbe.', 'Uspešno se je končalo %d poizvedb.'),
'Query executed OK, %d row(s) affected.' => array('Poizvedba se je uspešno izvedla, spremenjena je %d vrstica.', 'Poizvedba se je uspešno izvedla, spremenjeni sta %d vrstici.', 'Poizvedba se je uspešno izvedla, spremenjene so %d vrstice.', 'Poizvedba se je uspešno izvedla, spremenjenih je %d vrstic.'),
'No commands to execute.' => 'Ni ukazov za izvedbo.',
'Error in query' => 'Napaka v poizvedbi',
'Execute' => 'Izvedi',
'Stop on error' => 'Ustavi ob napaki',
'Show only errors' => 'Pokaži samo napake',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Zgodovina',
'Clear' => 'Počisti',
'File upload' => 'Naloži datoteko',
'From server' => 'z strežnika',
'Webserver file %s' => 'Datoteka na spletnem strežniku %s',
'Run file' => 'Zaženi datoteko',
'File does not exist.' => 'Datoteka ne obstaja.',
'File uploads are disabled.' => 'Nalaganje datotek je onemogočeno.',
'Unable to upload a file.' => 'Ne morem naložiti datoteke.',
'Maximum allowed file size is %sB.' => 'Največja velikost datoteke je %sB.',
'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',
'Format' => 'Format',
'Data' => 'Podatki',
'Database' => 'Baza',
'database' => 'baza',
'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.',
'Database has been renamed.' => 'Baza je preimenovana.',
'Database has been altered.' => 'Baza je spremenjena.',
'Alter database' => 'Spremeni bazo',
'Create database' => 'Ustvari bazo',
'Database schema' => 'Shema baze',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Pogon',
'Collation' => 'Zbiranje',
'Data Length' => 'Velikost podatkov',
'Index Length' => 'Velikost indeksa',
'Data Free' => 'Podatkov prosto ',
'Rows' => 'Vrstic',
'%d in total' => 'Skupaj %d',
'Analyze' => 'Analiziraj',
'Optimize' => 'Optimiziraj',
'Check' => 'Preveri',
'Repair' => 'Popravi',
'Truncate' => 'Skrajšaj',
'Tables have been truncated.' => 'Tabele so skrajšane.',
'Move to other database' => 'Premakni v drugo bazo',
'Move' => 'Premakni',
'Tables have been moved.' => 'Tabele so premaknjene.',
'Copy' => 'Kopiraj',
'Tables have been copied.' => 'Tabele so kopirane.',
'Routines' => 'Postopki',
'Routine has been called, %d row(s) affected.' => array('Klican je bil postopek, spremenjena je %d vrstica.', 'Klican je bil postopek, spremenjeni sta %d vrstici.', 'Klican je bil postopek, spremenjene so %d vrstice.', 'Klican je bil postopek, spremenjenih je %d vrstic.'),
'Call' => 'Pokliči',
'Parameter name' => 'Ime parametra',
'Create procedure' => 'Ustvari postopek',
'Create function' => 'Ustvari funkcijo',
'Routine has been dropped.' => 'Postopek je zavržen.',
'Routine has been altered.' => 'Postopek je spremenjen.',
'Routine has been created.' => 'Postopek je ustvarjen.',
'Alter function' => 'Spremeni funkcijo',
'Alter procedure' => 'Spremeni postopek',
'Return type' => 'Vračalni tip',
'Events' => 'Dogodki',
'Event has been dropped.' => 'Dogodek je zavržen.',
'Event has been altered.' => 'Dogodek je spremenjen.',
'Event has been created.' => 'Dogodek je ustvarjen.',
'Alter event' => 'Spremeni dogodek',
'Create event' => 'Ustvari dogodek',
'At given time' => 'v danem času',
'Every' => 'vsake',
'Schedule' => 'Urnik',
'Start' => 'Začetek',
'End' => 'Konec',
'On completion preserve' => 'Po zaključku ohrani',
'Tables' => 'Tabele',
'Tables and views' => 'Tabele in pogledi',
'Table' => 'Tabela',
'No tables.' => 'Ni tabel.',
'Alter table' => 'Spremeni tabelo',
'Create table' => 'Ustvari tabelo',
'Table has been dropped.' => 'Tabela je zavržena.',
'Tables have been dropped.' => 'Tabele so zavržene.',
'Table has been altered.' => 'Tabela je spremenjena.',
'Table has been created.' => 'Tabela je ustvarjena.',
'Table name' => 'Ime tabele',
'Show structure' => 'Pokaži zgradbo',
'engine' => 'pogon',
'collation' => 'zbiranje',
'Column name' => 'Ime stolpca',
'Type' => 'Tip',
'Length' => 'Dolžina',
'Auto Increment' => 'Samodejno povečevanje',
'Options' => 'Možnosti',
'Comment' => 'Komentar',
'Default values' => 'Privzete vrednosti',
'Drop' => 'Zavrzi',
'Are you sure?' => 'Ste prepričani?',
'Move up' => 'Premakni gor',
'Move down' => 'Premakni dol',
'Remove' => 'Odstrani',
'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',
'Partition name' => 'Ime porazdelitve',
'Values' => 'Vrednosti',
'View' => 'Pogledi',
'View has been dropped.' => 'Pogled je zavržen.',
'View has been altered.' => 'Pogled je spremenjen.',
'View has been created.' => 'Pogled je ustvarjen.',
'Alter view' => 'Spremeni pogled',
'Create view' => 'Ustvari pogled',
'Indexes' => 'Indeksi',
'Indexes have been altered.' => 'Indeksi so spremenjeni.',
'Alter indexes' => 'Spremeni indekse',
'Add next' => 'Dodaj naslednjega',
'Index Type' => 'Tip indeksa',
'Column (length)' => 'Stolpec (dolžina)',
'Foreign keys' => 'Tuji ključi',
'Foreign key' => 'Tuj ključ',
'Foreign key has been dropped.' => 'Tuj ključ je zavržen.',
'Foreign key has been altered.' => 'Tuj ključ je spremenjen.',
'Foreign key has been created.' => 'Tuj ključ je ustvarjen.',
'Target table' => 'Ciljna tabela',
'Change' => 'Spremeni',
'Source' => 'Izvor',
'Target' => 'Cilj',
'Add column' => 'Dodaj stolpec',
'Alter' => 'Spremeni',
'Add foreign key' => 'Dodaj tuj ključ',
'ON DELETE' => 'pri brisanju',
'ON UPDATE' => 'pri posodabljanju',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Izvorni in ciljni stolpec mora imeti isti podatkovni tip. Obstajati mora indeks na ciljnih stolpcih in obstajati morajo referenčni podatki.',
'Triggers' => 'Sprožilniki',
'Add trigger' => 'Dodaj sprožilnik',
'Trigger has been dropped.' => 'Sprožilnik je odstranjen.',
'Trigger has been altered.' => 'Sprožilnik je spremenjen.',
'Trigger has been created.' => 'Sprožilnik je ustvarjen.',
'Alter trigger' => 'Spremeni sprožilnik',
'Create trigger' => 'Ustvari sprožilnik',
'Time' => 'Čas',
'Event' => 'Dogodek',
'Name' => 'Naziv',
'select' => 'izberi',
'Select' => 'Izberi',
'Select data' => 'Izberi podatke',
'Functions' => 'Funkcije',
'Aggregation' => 'Združitev',
'Search' => 'Išči',
'anywhere' => 'kjerkoli',
'Search data in tables' => 'Išče podatke po tabelah',
'Sort' => 'Sortiraj',
'descending' => 'padajoče',
'Limit' => 'Limita',
'Text length' => 'Dolžina teksta',
'Action' => 'Dejanje',
'Unable to select the table' => 'Ne morem izbrati tabele',
'No rows.' => 'Ni vrstic.',
'%d row(s)' => array('%d vrstica', '%d vrstici', '%d vrstice', '%d vrstic'),
'Page' => 'Stran',
'last' => 'Zadnja',
'whole result' => 'cel razultat',
'%d byte(s)' => array('%d bajt', '%d bajta', '%d bajti', '%d bajtov'),
'Import' => 'Uvozi',
'%d row(s) have been imported.' => array('Uvožena je %d vrstica.', 'Uvoženi sta %d vrstici.', 'Uvožene so %d vrstice.', 'Uvoženih je %d vrstic.'),
// in-place editing in select
'Ctrl+click on a value to modify it.' => 'Ctrl+klik na vrednost za urejanje.',
'Use edit link to modify this value.' => 'Uporabite urejanje povezave za spreminjanje te vrednosti.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Predmet%s je vstavljen.',
'Item has been deleted.' => 'Predmet je izbrisan.',
'Item has been updated.' => 'Predmet je posodobljen.',
'%d item(s) have been affected.' => array('Spremenjen je %d predmet.', 'Spremenjena sta %d predmeta.', 'Spremenjeni so %d predmeti.', 'Spremenjenih je %d predmetov.'),
'New item' => 'Nov predmet',
'original' => 'original',
// label for value '' in enum data type
'empty' => 'prazno',
'edit' => 'uredi',
'Edit' => 'Uredi',
'Insert' => 'Vstavi',
'Save' => 'Shrani',
'Save and continue edit' => 'Shrani in nadaljuj z urejanjem',
'Save and insert next' => 'Shrani in vstavi tekst',
'Clone' => 'Kloniraj',
'Delete' => 'Izbriši',
'E-mail' => 'E-mail',
'From' => 'Od',
'Subject' => 'Zadeva',
'Attachments' => 'Priponke',
'Send' => 'Pošlji',
'%d e-mail(s) have been sent.' => array('Poslan je %d e-mail.', 'Poslana sta %d e-maila.', 'Poslani so %d e-maili.', 'Poslanih je %d e-mailov.'),
// data type descriptions
'Numbers' => 'Števila',
'Date and time' => 'Datum in čas',
'Strings' => 'Nizi',
'Binary' => 'Binarni',
'Lists' => 'Seznami',
'Network' => 'Mrežni',
'Geometry' => 'Geometrčni',
'Relations' => 'Relacijski',
'Editor' => 'Urejevalnik',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => 'd.m.[rrrr]',
'now' => 'zdaj',
// general SQLite error in create, drop or rename database
'File exists.' => 'Datoteka obstaja.',
'Please use one of the extensions %s.' => 'Prosim, uporabite enega od dodatkov %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Spremeni shemo',
'Create schema' => 'Ustvari shemo',
'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.',
// PostgreSQL sequences support
'Sequences' => 'Sekvence',
'Create sequence' => 'Ustvari sekvenco',
'Sequence has been dropped.' => 'Sekvenca je zavržena.',
'Sequence has been created.' => 'Sekvence je ustvarjena.',
'Sequence has been altered.' => 'Sekvence je spremenjena.',
'Alter sequence' => 'Spremni sekvenco',
// PostgreSQL user types support
'User types' => 'Uporabniški tipi',
'Create type' => 'Ustvari tip',
'Type has been dropped.' => 'Tip je zavržen.',
'Type has been created.' => 'Tip je ustvarjen.',
'Alter type' => 'Spremeni tip',
);

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

@@ -0,0 +1,321 @@
<?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.' => 'Неважеће дозволе.',
'Language' => 'Језик',
'Invalid CSRF token. Send the form again.' => 'Неважећи CSRF код. Проследите поново форму.',
'No extension' => 'Без додатака',
'None of the supported PHP extensions (%s) are available.' => 'Ниједан од подржаних PHP додатака није доступан.',
'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 процеса су убијена.', '%d процеса је убијено.'),
'Kill' => 'Убиј',
'Variables' => 'Променљиве',
'Status' => 'Статус',
'SQL command' => 'SQL команда',
'%d query(s) executed OK.' => array('%d упит је успешно извршен.', '%d упита су успешно извршена.', '%d упита је успешно извршено.'),
'Query executed OK, %d row(s) affected.' => array('Упит је успешно извршен, %d ред је погођен.', 'Упит је успешно извршен, %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.' => 'Превелики POST податак. Морате да смањите податак или повећајте вредност конфигурационе директиве %s.',
'Export' => 'Извоз',
'Dump' => 'Истовар',
'Output' => 'Испис',
'open' => 'отвори',
'save' => 'сачувај',
'Format' => 'Формат',
'Data' => 'Податци',
'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' => 'Шема базе података',
// link to current database schema layout
'Permanent link' => 'Трајна веза',
// thousands separator - must contain single byte
',' => ',',
'Engine' => 'Механизам',
'Collation' => 'Сравњивање',
'Data Length' => 'Дужина података',
'Index Length' => 'Дужина индекса',
'Data Free' => 'Слободно података',
'Rows' => 'Редова',
'%d in total' => 'укупно %d',
'Analyze' => 'Анализирај',
'Optimize' => 'Оптимизуј',
'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 реда су погођена.', 'Позвана је рутина, %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 values' => 'Подразумеване вредности',
'Drop' => 'Избриши',
'Are you sure?' => 'Да ли сте сигурни?',
'Move up' => 'Помери на горе',
'Move down' => 'Помери на доле',
'Remove' => 'Уклони',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Премашен је максимални број дозвољених поља. Молим увећајте %s.',
'Partition by' => 'Подели по',
'Partitions' => 'Поделе',
'Partition name' => 'Име поделе',
'Values' => 'Вредности',
'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' => 'Граница',
'Text length' => 'Дужина текста',
'Action' => 'Акција',
'Full table scan' => 'Скренирање комплетне табеле',
'Unable to select the table' => 'Не могу да изаберем табелу',
'No rows.' => 'Без редова.',
'%d row(s)' => array('%d ред', '%d реда', '%d редова'),
'Page' => 'Страна',
'last' => 'последња',
'Loading' => 'Учитавам',
'Load more data' => 'Учитавам још података',
'whole result' => 'цео резултат',
'%d byte(s)' => array('%d бајт', '%d бајта', '%d бајтова'),
'Import' => 'Увоз',
'%d row(s) have been imported.' => array('%d ред је увежен.', '%d реда су увежена.', '%d редова је увежено.'),
// in-place editing in select
'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 ставке су погођене.', '%d ставки је погођено.'),
'New item' => 'Нова ставка',
'original' => 'оригинал',
// label for value '' in enum data type
'empty' => 'празно',
'edit' => 'измени',
'Edit' => 'Измени',
'Insert' => 'Уметни',
'Save' => 'Сачувај',
'Save and continue edit' => 'Сачувај и настави уређење',
'Save and insert next' => 'Сачувај и уметни следеће',
'Clone' => 'Дуплирај',
'Delete' => 'Избриши',
'E-mail' => 'Ел. пошта',
'From' => 'Од',
'Subject' => 'Наслов',
'Attachments' => 'Прилози',
'Send' => 'Пошаљи',
'%d e-mail(s) have been sent.' => array('%d порука ел. поште је послата.', '%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' => '$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' => 'сад',
'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' => 'шема',
'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

@@ -2,14 +2,14 @@
$translations = array(
'Login' => 'நுழை',
'Logout successful.' => 'வெற்றிக‌ர‌மாய் வெளியேறியாயிற்று.',
'Invalid credentials.' => 'ச‌ரியான‌ விப‌ர‌ங்க‌ள் இல்லை',
'Invalid credentials.' => 'ச‌ரியான‌ விப‌ர‌ங்க‌ள் இல்லை.',
'Server' => 'வ‌ழ‌ங்கி (Server)',
'Username' => 'ப‌ய‌னாள‌ர் (User)',
'Password' => 'க‌ட‌வுச்சொல்',
'Select database' => 'த‌க‌வ‌ல்த‌ள‌த்தை தேர்வு செய்',
'Invalid database.' => 'த‌க‌வ‌ல்த‌ள‌ம் ச‌ரியானதல்ல‌.',
'Create new database' => 'புதிய‌ த‌க‌வ‌ல்த‌ள‌த்தை உருவாக்கு',
'Table has been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து',
'Table has been dropped.' => 'அட்ட‌வ‌ணை நீக்க‌ப்ப‌ட்ட‌து.',
'Table has been altered.' => 'அட்ட‌வணை மாற்ற‌ப்ப‌ட்ட‌து.',
'Table has been created.' => 'அட்ட‌வ‌ணை உருவாக்க‌ப்ப‌ட்ட‌து.',
'Alter table' => 'அட்ட‌வ‌ணையை மாற்று',
@@ -37,7 +37,6 @@ $translations = array(
'Use' => 'உப‌யோகி',
'No tables.' => 'அட்ட‌வ‌ணை இல்லை.',
'select' => 'தேர்வு செய்',
'Create new table' => 'புதிய‌ அட்ட‌வ‌ணையை உருவாக்கு',
'Item has been deleted.' => 'உருப்படி நீக்க‌ப்ப‌ட்ட‌து.',
'Item has been updated.' => 'உருப்ப‌டி புதுப்பிக்க‌ப்ப‌ட்ட‌து.',
'Edit' => 'தொகு',
@@ -62,13 +61,13 @@ $translations = array(
'edit' => 'தொகு',
'Page' => 'ப‌க்க‌ம்',
'Query executed OK, %d row(s) affected.' => array('வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து, %d வ‌ரிசை மாற்ற‌ப்ப‌ட்ட‌து.', 'வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து, %d வ‌ரிசைக‌ள் மாற்றப்ப‌ட்ட‌ன‌.'),
'Error in query' => 'வின‌வ‌லில் த‌வ‌றுள்ள‌து.',
'Error in query' => 'வின‌வ‌லில் த‌வ‌றுள்ள‌து',
'Execute' => 'செய‌ல்ப‌டுத்து',
'Table' => 'அட்ட‌வ‌ணை',
'Foreign keys' => 'வேற்று விசைக‌ள்',
'Triggers' => 'தூண்டுத‌ல்க‌ள்',
'View' => 'தோற்றம்',
'Unable to select the table' => 'அட்ட‌வ‌ணையை தேர்வு செய்ய‌ முடிய‌வில்லை.',
'Unable to select the table' => 'அட்ட‌வ‌ணையை தேர்வு செய்ய‌ முடிய‌வில்லை',
'Invalid CSRF token. Send the form again.' => 'CSRF டோக்க‌ன் செல்லாது. ப‌டிவ‌த்தை மீண்டும் அனுப்ப‌வும்.',
'Comment' => 'குறிப்பு',
'Default values' => 'உள்ளிருக்கும் (Default) ம‌திப்புக‌ள் ',
@@ -121,8 +120,8 @@ $translations = array(
'Trigger has been dropped.' => 'தூண்டு விசை நீக்க‌ப்ப‌ட்ட‌து.',
'Trigger has been altered.' => 'தூண்டு விசை மாற்ற‌ப்ப‌ட்ட‌து.',
'Trigger has been created.' => 'தூண்டு விசை உருவாக்க‌ப்ப‌ட்ட‌து.',
'Alter trigger' => 'தூண்டு விசையை மாற்று.',
'Create trigger' => 'தூண்டு விசையை உருவாக்கு.',
'Alter trigger' => 'தூண்டு விசையை மாற்று',
'Create trigger' => 'தூண்டு விசையை உருவாக்கு',
'Time' => 'நேர‌ம்',
'Event' => 'நிக‌ழ்ச்சி',
'%d row(s)' => array('%d வ‌ரிசை', '%d வ‌ரிசைக‌ள்'),
@@ -138,7 +137,7 @@ $translations = array(
'Routine' => 'ரொட்டீன்',
'Grant' => 'அனும‌திய‌ளி',
'Revoke' => 'இர‌த்துச்செய்',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'மிக‌ அதிக‌மான‌ POST த‌க‌வ‌ல். த‌க‌வ‌லை குறைக்க‌வும் அல்ல‌து %s வ‌டிவ‌மைப்பை (configuration directive) மாற்ற‌வும்.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'மிக‌ அதிக‌மான‌ POST த‌க‌வ‌ல். த‌க‌வ‌லை குறைக்க‌வும் அல்ல‌து %s வ‌டிவ‌மைப்பை (configuration directive) மாற்ற‌வும்.',
'Logged as: %s' => 'ப‌ய‌னாளர்: %s',
'Move up' => 'மேலே ந‌க‌ர்த்து',
'Move down' => 'கீழே நக‌ர்த்து',
@@ -187,14 +186,13 @@ $translations = array(
'%d item(s) have been affected.' => array('%d உருப்ப‌டி மாற்ற‌ம‌டைந்தது.', '%d உருப்ப‌டிக‌ள் மாற்ற‌ம‌டைந்த‌ன‌.'),
'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' => 'பிரிவின் பெய‌ர்',
'Values' => 'ம‌திப்புக‌ள்',
'%d row(s) have been imported.' => array('%d வ‌ரிசை இற‌க்கும‌தி (Import) செய்ய‌ப்ப‌ட்ட‌து.', '%d வ‌ரிசைக‌ள் இற‌க்கும‌தி (Import) செய்ய‌ப்ப‌ட்டன‌.'),
'Show structure' => 'க‌ட்ட‌மைப்பை காண்பிக்க‌வும்',
'CSV Import' => 'இம்போர்ட் CSV',
'Import' => 'இற‌க்கும‌தி (Import)',
'Stop on error' => 'பிழை ஏற்ப‌டின் நிற்க‌',
'Select data' => 'த‌க‌வ‌லை தேர்வு செய்',
@@ -235,8 +233,6 @@ $translations = array(
'Schema has been dropped.' => 'அமைப்புமுறை நீக்க‌ப்ப‌ட்ட‌து.',
'Schema has been created.' => 'அமைப்புமுறை உருவாக்க‌ப்ப‌ட்ட‌து.',
'Schema has been altered.' => 'அமைப்புமுறை மாற்ற‌ப்ப‌ட்ட‌து.',
'Double click on a value to modify it.' => 'ம‌திப்பினை மாற்ற அத‌ன் மீது இருமுறை சொடுக்க‌வும் (Double click).',
'Increase text length to modify this value.' => 'இந்த‌ ம‌திப்பினை மாற்ற, டெக்ஸ்ட் நீள‌த்தினை அதிக‌ரிக்க‌வும்.',
'Use edit link to modify this value.' => 'இந்த‌ ம‌திப்பினை மாற்ற‌, தொகுப்பு இணைப்பினை உப‌யோகிக்க‌வும்.',
'last' => 'க‌டைசி',
'Sequence has been dropped.' => 'வ‌ரிசைமுறை நீக்க‌ப்ப‌ட்ட‌து.',
@@ -257,6 +253,17 @@ $translations = array(
'Network' => 'நெட்வொர்க்',
'Geometry' => 'வ‌டிவ‌விய‌ல் (Geometry)',
'File exists.' => 'கோப்பு உள்ள‌து.',
'Attachments' => 'இணைப்புக‌ள்.',
'Attachments' => 'இணைப்புக‌ள்',
'now' => 'இப்பொழுது',
'%d query(s) executed OK.' => array('%d வின‌வ‌ல் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌து.', '%d வின‌வ‌ல்க‌ள் செய‌ல்ப‌டுத்த‌ப்ப‌ட்ட‌ன‌.'),
'Show only errors' => 'பிழைக‌ளை ம‌ட்டும் காண்பிக்க‌வும்',
'Refresh' => 'புதுப்பி (Refresh)',
'Invalid schema.' => 'அமைப்புமுறை ச‌ரியான‌த‌ல்ல‌ (Invalid Schema).',
'Please use one of the extensions %s.' => 'த‌ய‌வு செய்து ஒரு விரிவினை %s (extension) உப‌யோகிக்க‌வும்.',
'ltr' => 'ltr',
'Tables have been copied.' => 'அட்டவணைகள் நகலெடுக்கப் பட்டது.',
'Copy' => 'நகல்',
'Permanent link' => 'நிரந்தர இணைப்பு',
'Edit all' => 'அனைத்தையும் தொகு',
'HH:MM:SS' => 'HH:MM:SS',
);

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

@@ -0,0 +1,270 @@
<?php
$translations = array(
'Login' => 'เข้าสู่ระบบ',
'Logout successful.' => 'ออกจากระบบเรียบร้อยแล้ว.',
'Invalid credentials.' => 'ข้อมูลไม่ถูกต้อง.',
'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' => 'เลือก',
'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' => 'แถว',
',' => ' ',
'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',
'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',
);

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

@@ -0,0 +1,321 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Sistem',
'Server' => 'Sunucu',
'Username' => 'Kullanıcı',
'Password' => 'Parola',
'Permanent login' => 'Beni hatırla',
'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.',
'Language' => 'Dil',
'Invalid CSRF token. Send the form again.' => 'Geçersiz (CSRF) jetonu. Formu tekrar yolla.',
'No extension' => 'Uzantı yok',
'None of the supported PHP extensions (%s) are available.' => 'Desteklenen PHP eklentilerinden (%s) hiçbiri mevcut değil.',
'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.',
'%s version: %s through PHP extension %s' => '%s sürüm: %s, %s PHP eklentisi ile',
'Refresh' => 'Tazele',
// text direction
'ltr' => 'ltr',
'Privileges' => 'İzinler',
'Create user' => 'Kullanıcı oluştur',
'User has been dropped.' => 'Kullanıcı silindi.',
'User has been altered.' => 'Kullanıcı değiştirildi.',
'User has been created.' => 'Kullanıcı oluşturuldu.',
'Hashed' => 'Harmanlandı',
'Column' => 'Kolon',
'Routine' => 'Yordam',
'Grant' => 'Yetki Ver',
'Revoke' => 'Yetki Kaldır',
'Process list' => 'İşlem listesi',
'%d process(es) have been killed.' => array('%d işlem sonlandırıldı.', '%d adet işlem sonlandırıldı.'),
'Kill' => 'Sonlandır',
'Variables' => 'Değişkenler',
'Status' => 'Durum',
'SQL command' => 'SQL komutu',
'%d query(s) executed OK.' => array('%d sorgu başarıyla çalıştırıldı.', '%d adet sorgu başarıyla çalıştırıldı.'),
'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',
'Execute' => 'Çalıştır',
'Stop on error' => 'Hata oluşursa dur',
'Show only errors' => 'Sadece hataları göster.',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'Geçmiş',
'Clear' => 'Temizle',
'Edit all' => 'Tümünü düzenle',
'File upload' => 'Dosya gönder',
'From server' => 'Sunucudan',
'Webserver file %s' => '%s web sunucusu dosyası',
'Run file' => 'Dosyayı çalıştır',
'File does not exist.' => 'Dosya mevcut değil.',
'File uploads are disabled.' => 'Dosya gönderimi etkin değil.',
'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.',
'Export' => 'Dışarı Aktar',
'Dump' => 'Döküm',
'Output' => ıktı',
'open' => 'aç',
'save' => 'kaydet',
'Format' => 'Biçim',
'Data' => 'Veri',
'Database' => 'Veri Tabanı',
'database' => 'veri tabanı',
'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.',
'Database has been renamed.' => 'Veri tabanının ismi değiştirildi.',
'Database has been altered.' => 'Veri tabanı değiştirildi.',
'Alter database' => 'Veri tabanını değiştir',
'Create database' => 'Veri tabanı oluştur',
'Database schema' => 'Veri tabanı şeması',
// link to current database schema layout
'Permanent link' => 'Kalıcı bağlantı',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Motor',
'Collation' => 'Karşılaştırma',
'Data Length' => 'Veri Uzunluğu',
'Index Length' => 'Dizin Uzunluğu',
'Data Free' => 'Boş Veri',
'Rows' => 'Kayıtlar',
'%d in total' => 'toplam %d',
'Analyze' => 'Çözümle',
'Optimize' => 'En uygun hale getir',
'Check' => 'Denetle',
'Repair' => 'Tamir Et',
'Truncate' => 'Boşalt',
'Tables have been truncated.' => 'Tablolar boşaltıldı.',
'Move to other database' => 'Başka veri tabanına taşı',
'Move' => 'Taşı',
'Tables have been moved.' => 'Tablolar taşındı.',
'Copy' => 'Kopyala',
'Tables have been copied.' => 'Tablolar kopyalandı.',
'Routines' => 'Yordamlar',
'Routine has been called, %d row(s) affected.' => array('Yordam çağrıldı, %d adet kayıt etkilendi.', 'Yordam çağrıldı, %d kayıt etkilendi.'),
'Call' => 'Çağır',
'Parameter name' => 'Parametre adı',
'Create procedure' => 'Yöntem oluştur',
'Create function' => 'Fonksiyon oluştur',
'Routine has been dropped.' => 'Yordam silindi.',
'Routine has been altered.' => 'Yordam değiştirildi.',
'Routine has been created.' => 'Yordam oluşturuldu.',
'Alter function' => 'Fonksyionu değiştir',
'Alter procedure' => 'Yöntemi değiştir',
'Return type' => 'Geri dönüş türü',
'Events' => 'Olaylar',
'Event has been dropped.' => 'Olay silindi.',
'Event has been altered.' => 'Olay değiştirildi.',
'Event has been created.' => 'Olay oluşturuldu.',
'Alter event' => 'Olayı değiştir',
'Create event' => 'Olay oluştur',
'At given time' => 'Verilen zamanda',
'Every' => 'Her zaman',
'Schedule' => 'Takvimli',
'Start' => 'Başla',
'End' => 'Son',
'On completion preserve' => 'Tamamlama koruması',
'Tables' => 'Tablolar',
'Tables and views' => 'Tablolar ve görünümler',
'Table' => 'Tablo',
'No tables.' => 'Tablo yok.',
'Alter table' => 'Tabloyu değiştir',
'Create table' => 'Tablo oluştur',
'Table has been dropped.' => 'Tablo silindi.',
'Tables have been dropped.' => 'Tablolar silindi.',
'Tables have been optimized.' => 'Tablolar en uygun hale getirildi.',
'Table has been altered.' => 'Tablo değiştirildi.',
'Table has been created.' => 'Tablo oluşturuldu.',
'Table name' => 'Tablo adı',
'Show structure' => 'Yapıyı göster',
'engine' => 'motor',
'collation' => 'karşılaştırma',
'Column name' => 'Kolon adı',
'Type' => 'Tür',
'Length' => 'Uzunluk',
'Auto Increment' => 'Otomatik Artır',
'Options' => 'Seçenekler',
'Comment' => 'Yorum',
'Default values' => 'Varsayılan değerler',
'Drop' => 'Sil',
'Are you sure?' => 'Emin misiniz?',
'Move up' => 'Yukarı taşı',
'Move down' => 'Aşağı taşı',
'Remove' => 'Sil',
'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',
'Partition name' => 'Bölüm adı',
'Values' => 'Değerler',
'View' => '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',
'Add next' => 'Bundan sonra ekle',
'Index Type' => 'Dizin Türü',
'Column (length)' => 'Kolon (uzunluğu)',
'Foreign keys' => 'Dış anahtarlar',
'Foreign key' => 'Dış anahtar',
'Foreign key has been dropped.' => 'Dış anahtar silindi.',
'Foreign key has been altered.' => 'Dış anahtar değiştirildi.',
'Foreign key has been created.' => 'Dış anahtar oluşturuldu.',
'Target table' => 'Hedef tablo',
'Change' => 'Değiştir',
'Source' => 'Kaynak',
'Target' => 'Hedef',
'Add column' => 'Kolon ekle',
'Alter' => 'Değiştir',
'Add foreign key' => 'Dış anahtar ekle',
'ON DELETE' => 'ON DELETE (Hedefteki Kayıt Silinirse)',
'ON UPDATE' => 'ON UPDATE (Hedefteki Kayıt Değiştirilirse)',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Kaynak ve hedef kolonlar aynı veri türünde olmalı, hedef kolonlarda dizin bulunmalı ve başvurulan veri mevcut olmalı.',
'Triggers' => 'Tetikler',
'Add trigger' => 'Tetik ekle',
'Trigger has been dropped.' => 'Tetik silindi.',
'Trigger has been altered.' => 'Tetik değiştirildi.',
'Trigger has been created.' => 'Tetik oluşturuldu.',
'Alter trigger' => 'Tetiği değiştir.',
'Create trigger' => 'Tetik oluştur',
'Time' => 'Zaman',
'Event' => 'Olay',
'Name' => 'Ad',
'select' => 'seç',
'Select' => 'Seç',
'Select data' => 'Veri seç',
'Functions' => 'Fonksiyonlar',
'Aggregation' => 'Kümeleme',
'Search' => 'Ara',
'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',
'Unable to select the table' => 'Tablo seçilemedi',
'No rows.' => 'Kayıt yok.',
'%d row(s)' => array('%d kayıt', '%d adet kayıt'),
'Page' => 'Sayfa',
'last' => 'son',
'Load more data' => 'Daha fazla veri yükle',
'Loading' => 'Yükleniyor',
'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ı.'),
// in-place editing in select
'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.',
// %s can contain auto-increment value
'Item%s has been inserted.' => 'Kayıt%s eklendi.',
'Item has been deleted.' => 'Kayıt silindi.',
'Item has been updated.' => 'Kayıt güncellendi.',
'%d item(s) have been affected.' => array('%d kayıt etkilendi.', '%d adet kayıt etkilendi.'),
'New item' => 'Yeni kayıt',
'original' => 'orijinal',
// label for value '' in enum data type
'empty' => 'boş',
'edit' => 'düzenle',
'Edit' => 'Düzenle',
'Insert' => 'Ekle',
'Save' => 'Kaydet',
'Save and continue edit' => 'Kaydet ve düzenlemeye devam et',
'Save and insert next' => 'Kaydet ve sonrakini ekle',
'Clone' => 'Kopyala',
'Delete' => 'Sil',
'E-mail' => 'E-posta',
'From' => 'Gönderen',
'Subject' => 'Konu',
'Attachments' => 'Ekler',
'Send' => 'Gönder',
'%d e-mail(s) have been sent.' => array('%d e-posta gönderildi.', '%d adet e-posta gönderildi.'),
// data type descriptions
'Numbers' => 'Sayılar',
'Date and time' => 'Tarih ve zaman',
'Strings' => 'Dizge',
'Binary' => 'İkili',
'Lists' => 'Listeler',
'Network' => 'Ağ',
'Geometry' => 'Geometri',
'Relations' => 'İlişkiler',
'Editor' => 'Düzenleyici',
// date format in Editor: $1 yyyy, $2 yy, $3 mm, $4 m, $5 dd, $6 d
'$1-$3-$5' => '$6.$4.$1',
// hint for date format - use language equivalents for day, month and year shortcuts
'[yyyy]-mm-dd' => '[yyyy]-aa-gg',
// hint for time format - use language equivalents for hour, minute and second shortcuts
'HH:MM:SS' => 'SS:DD:ss',
'now' => 'şimdi',
'yes' => 'evet',
'no' => 'hayır',
// general SQLite error in create, drop or rename database
'File exists.' => 'Dosya zaten mevcut.',
'Please use one of the extensions %s.' => '%s uzantılarından birini kullanın.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'Şemayı değiştir',
'Create schema' => 'Şema oluştur',
'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.',
// PostgreSQL sequences support
'Sequences' => 'Diziler',
'Create sequence' => 'Dizi oluştur',
'Sequence has been dropped.' => 'Dizi silindi.',
'Sequence has been created.' => 'Dizi oluşturuldu.',
'Sequence has been altered.' => 'Dizi değiştirildi.',
'Alter sequence' => 'Diziyi değiştir',
// PostgreSQL user types support
'User types' => 'Kullanıcı türleri',
'Create type' => 'Tür oluştur',
'Type has been dropped.' => 'Tür silindi.',
'Type has been created.' => 'Tür oluşturuldu.',
'Alter type' => 'Türü değiştir',
);

318
adminer/lang/uk.inc.php Normal file
View File

@@ -0,0 +1,318 @@
<?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.' => 'Неправильні дані входу.',
'Language' => 'Мова',
'Invalid CSRF token. Send the form again.' => 'Недійсний CSRF токен. Надішліть форму ще раз.',
'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 процеси.', 'Було завершёно %d процесів.'),
'Kill' => 'Завершити процес',
'Variables' => 'Змінні',
'Status' => 'Статус',
'SQL command' => 'SQL запит',
'%d query(s) executed OK.' => array('%d запит виконано успішно.', '%d запити виконано успішно.', '%d запитів виконано успішно.'),
'Query executed OK, %d row(s) affected.' => array('Запит виконано успішно, змінено %d рядок.', 'Запит виконано успішно, змінено %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.' => 'Максимально допустимий розмір файлу %sБ.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'Занадто великий об\'єм POST-даних. Зменшіть об\'єм або збільшіть параметр директиви %s конфигурації.',
'Export' => 'Експорт',
'Dump' => 'Дамп',
'Output' => 'Вихідні дані',
'open' => 'відкрити',
'save' => 'зберегти',
'Format' => 'Формат',
'Data' => 'Дані',
'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' => 'Схема бази даних',
// link to current database schema layout
'Permanent link' => 'Постійне посилання',
// thousands separator - must contain single byte
',' => ' ',
'Engine' => 'Рушій',
'Collation' => 'Співставлення',
'Data Length' => 'Об\'єм даних',
'Index Length' => 'Об\'єм індексів',
'Data Free' => 'Вільне місце',
'Rows' => 'Рядків',
'%d in total' => '%d всього',
'Analyze' => 'Аналізувати',
'Optimize' => 'Оптимізувати',
'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 записи було змінено.', 'Була викликана процедура, %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 values' => 'Значення за замовчуванням',
'Drop' => 'Видалити',
'Are you sure?' => 'Ви впевнені?',
'Move up' => 'Пересунути вгору',
'Move down' => 'Пересунути вниз',
'Remove' => 'Видалити',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Досягнута максимальна кількість доступних полів. Будь ласка, збільшіть %s.',
'Partition by' => 'Розділити по',
'Partitions' => 'Розділи',
'Partition name' => 'Назва розділу',
'Values' => 'Значення',
'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' => 'Обмеження',
'Text length' => 'Довжина тексту',
'Action' => 'Дія',
'Unable to select the table' => 'Неможливо вибрати таблицю',
'No rows.' => 'Нема рядків.',
'%d row(s)' => array('%d рядок', '%d рядки', '%d рядків'),
'Page' => 'Сторінка',
'last' => 'остання',
'whole result' => 'весь результат',
'%d byte(s)' => array('%d байт', '%d байта', '%d байтів'),
'Import' => 'Імпортувати',
'%d row(s) have been imported.' => array('%d рядок було імпортовано.', '%d рядки було імпортовано.', '%d рядків було імпортовано.'),
// in-place editing in select
'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 записи.', 'Було змінено %d записів.'),
'New item' => 'Новий запис',
'original' => 'початковий',
// label for value '' in enum data type
'empty' => 'порожньо',
'edit' => 'редагувати',
'Edit' => 'Редагувати',
'Insert' => 'Вставити',
'Save' => 'Зберегти',
'Save and continue edit' => 'Зберегти і продовжити редагування',
'Save and insert next' => 'Зберегти і вставити знову',
'Clone' => 'Клонувати',
'Delete' => 'Видалити',
'E-mail' => 'E-mail',
'From' => 'Від',
'Subject' => 'Заголовок',
'Attachments' => 'Додатки',
'Send' => 'Надіслати',
'%d e-mail(s) have been sent.' => array('Було надіслано %d повідомлення.', 'Було надіслано %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' => '$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' => 'схема',
'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' => 'Змінити тип',
);

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

@@ -0,0 +1,328 @@
<?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',
'Master password expired. <a href="http://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => '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',
// 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',
'Process list' => 'xx',
'%d process(es) have been killed.' => array('xx', 'xx'),
'Kill' => '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',
// sprintf() format for time of the command
'%.3f s' => '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',
'You can upload a big SQL file via FTP and import it from server.' => 'xx',
'Export' => 'xx',
'Dump' => 'xx',
'Output' => 'xx',
'open' => 'xx',
'save' => 'xx',
'Format' => 'xx',
'Data' => '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',
// link to current database schema layout
'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',
'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',
'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',
'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.' => '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',
'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',
'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',
'anywhere' => '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',
'last' => 'xx',
'Load more data' => 'xx',
'Loading' => 'xx',
'whole result' => 'xx',
'%d byte(s)' => array('xx', 'xx'),
'Import' => 'xx',
'%d row(s) have been imported.' => array('xx', 'xx'),
'File must be in UTF-8 encoding.' => 'xx',
// in-place editing in select
'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',
'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',
'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'),
// data type descriptions
'Numbers' => 'xx',
'Date and time' => 'xx',
'Strings' => 'xx',
'Binary' => 'xx',
'Lists' => 'xx',
'Network' => 'xx',
'Geometry' => 'xx',
'Relations' => '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',
'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',
// 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',
// 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',
// PostgreSQL user types support
'User types' => 'xx',
'Create type' => 'xx',
'Type has been dropped.' => 'xx',
'Type has been created.' => 'xx',
'Alter type' => 'xx',
);

View File

@@ -1,7 +1,7 @@
<?php
$translations = array(
'Login' => '登入',
'Logout successful.' => '登出成功。',
'Logout successful.' => '成功登出。',
'Invalid credentials.' => '無效的憑證。',
'Server' => '伺服器',
'Username' => '帳號',
@@ -9,9 +9,9 @@ $translations = array(
'Select database' => '選擇資料庫',
'Invalid database.' => '無效的資料庫。',
'Create new database' => '建立新資料庫',
'Table has been altered.' => '資料表已改。',
'Table has been created.' => '資料表已改。',
'Alter table' => '改資料表',
'Table has been altered.' => '資料表已改。',
'Table has been created.' => '資料表已改。',
'Alter table' => '改資料表',
'Create table' => '建立資料表表',
'Table name' => '資料表名稱',
'engine' => '引擎',
@@ -19,52 +19,51 @@ $translations = array(
'Column name' => '列名',
'Type' => '類型',
'Length' => '長度',
'Auto Increment' => '自動增',
'Auto Increment' => '自動增',
'Options' => '選項',
'Save' => '儲存',
'Drop' => '丟棄',
'Drop' => '刪除',
'Database has been dropped.' => '資料庫已刪除。',
'Database has been created.' => '已建立資料庫。',
'Database has been renamed.' => '已重新命名資料庫。',
'Database has been altered.' => '已改資料庫。',
'Alter database' => '改資料庫',
'Database has been altered.' => '已改資料庫。',
'Alter database' => '改資料庫',
'Create database' => '建立資料庫',
'SQL command' => 'SQL命令',
'Dump' => '入/出',
'Dump' => '入/出',
'Logout' => '登出',
'database' => '資料庫',
'Use' => '使用',
'No tables.' => '沒有資料表。',
'select' => '選擇',
'Create new table' => '建立新資料表',
'Item has been updated.' => '已更新項目。',
'Item%s has been inserted.' => '已插入項目%s。',
'Item%s has been inserted.' => '已新增項目%s。',
'Edit' => '編輯',
'Insert' => '插入',
'Save and insert next' => '儲存並插入下一',
'Insert' => '新增',
'Save and insert next' => '儲存並新增下一',
'Delete' => '刪除',
'Database' => '資料庫',
'Routines' => '程序',
'Indexes have been altered.' => '已改索引。',
'Indexes have been altered.' => '已改索引。',
'Indexes' => '索引',
'Alter indexes' => '改索引',
'Add next' => '新增下一',
'Alter indexes' => '改索引',
'Add next' => '新增下一',
'Language' => '語言',
'Select' => '選擇',
'New item' => '新建項',
'New item' => '新增項目',
'Search' => '搜尋',
'Sort' => '排序',
'descending' => '降冪',
'descending' => '降冪(遞減)',
'Limit' => '限定',
'No rows.' => '沒有行。',
'Action' => '動作',
'edit' => '編輯',
'Page' => '頁',
'Query executed OK, %d row(s) affected.' => '執行查詢OK%d行受影響',
'Error in query' => '查詢出錯',
'Error in query' => '查詢發生錯誤',
'Execute' => '執行',
'Table' => '資料表',
'Foreign keys' => '外鍵',
'Foreign keys' => '外鍵',
'Triggers' => '觸發器',
'View' => '檢視表',
'Unable to select the table' => '無法選擇該資料表',
@@ -75,53 +74,53 @@ $translations = array(
'No commands to execute.' => '沒有命令可執行。',
'Unable to upload a file.' => '無法上傳檔案。',
'File upload' => '檔案上傳',
'File uploads are disabled.' => '檔案上傳被禁用。',
'File uploads are disabled.' => '檔案上傳已經被停用。',
'Routine has been called, %d row(s) affected.' => '程序已被執行,%d行被影響',
'Call' => '呼叫',
'No extension' => '沒有 擴充模組',
'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' => 'Text 長度',
'Foreign key has been dropped.' => '已刪除外鍵。',
'Foreign key has been altered.' => '已改外鍵。',
'Foreign key has been created.' => '已建立外鍵。',
'Foreign key' => '外鍵',
'Foreign key has been dropped.' => '已刪除外鍵。',
'Foreign key has been altered.' => '已改外鍵。',
'Foreign key has been created.' => '已建立外鍵。',
'Foreign key' => '外鍵',
'Target table' => '目標資料表',
'Change' => '改',
'Change' => '改',
'Source' => '來源',
'Target' => '目標',
'Add column' => '新增資料列',
'Alter' => '改',
'Add foreign key' => '新增外鍵',
'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 dropped.' => '已刪除檢視表。',
'View has been altered.' => '已改檢視表。',
'View has been created.' => '已建立檢視表。',
'Alter view' => '改檢視表',
'Alter view' => '改檢視表',
'Create view' => '建立檢視表',
'Name' => '名稱',
'Process list' => '進程列表',
'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 dropped.' => '已刪除程序。',
'Routine has been altered.' => '已改子程序。',
'Routine has been created.' => '已建立子程序。',
'Alter function' => '改函數',
'Alter procedure' => '改過程',
'Return type' => '回類型',
'Alter function' => '改函數',
'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' => '改觸發器',
'Alter trigger' => '改觸發器',
'Create trigger' => '建立觸發器',
'Time' => '時間',
'Event' => '事件',
@@ -131,8 +130,8 @@ $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' => 'Hashed',
'Column' => '列',
@@ -152,18 +151,18 @@ $translations = array(
'Format' => '格式',
'Functions' => '函數',
'Aggregation' => '集合',
'Event has been dropped.' => '已丟棄事件。',
'Event has been altered.' => '已改事件。',
'Event has been dropped.' => '已刪除事件。',
'Event has been altered.' => '已改事件。',
'Event has been created.' => '已建立事件。',
'Alter event' => '改事件',
'Alter event' => '改事件',
'Create event' => '建立事件',
'Start' => '開始',
'End' => '結束',
'Every' => '每',
'Status' => '狀態',
'On completion preserve' => '在完成後存',
'On completion preserve' => '在完成後存',
'Events' => '事件',
'Schedule' => '調度',
'Schedule' => '排程',
'At given time' => '在指定時間',
'Tables have been truncated.' => '已清空資料表。',
'Tables have been moved.' => '已轉移資料表。',
@@ -176,49 +175,48 @@ $translations = array(
'Rows' => '行數',
',' => ',',
'Analyze' => '分析',
'Optimize' => '化',
'Optimize' => '最佳化',
'Check' => '檢查',
'Repair' => '修復',
'Truncate' => '清空',
'Move to other database' => '轉移到其它資料庫',
'Move' => '轉移',
'Save and continue edit' => '存並繼續編輯',
'Save and continue edit' => '存並繼續編輯',
'original' => '原始',
'%d item(s) have been affected.' => '%d個項目受到影響。',
'whole result' => '所有結果',
'Tables have been dropped.' => '已丟棄表。',
'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' => '分區名',
'Partition name' => '分區名',
'Values' => '值',
'%d row(s) have been imported.' => '%d行已導入。',
'%d row(s) have been imported.' => '已匯入%d行。',
'anywhere' => '任意位置',
'CSV Import' => '匯入 CSV',
'Import' => '匯入',
'Stop on error' => '出錯時停止',
'%.3f s' => '%.3f秒',
'$1-$3-$5' => '$1.$3.$5',
'[yyyy]-mm-dd' => '[yyyy].mm.dd',
'History' => '歷史',
'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.' => '源列和目標列必須具有相同的數據類型,在目標列上必須有一個索引並且引用的數據必須存在。',
'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' => '二進',
'Strings' => '字串',
'Binary' => '二進',
'Lists' => '列表',
'Editor' => '編輯器',
'E-mail' => '電子郵件',
'From' => '來自',
'Subject' => '主',
'Send' => '發送',
'%d e-mail(s) have been sent.' => '已發送 %d 封郵件。',
'Subject' => '主',
'Send' => '寄出',
'%d e-mail(s) have been sent.' => '已寄出 %d 封郵件。',
'Webserver file %s' => '網頁伺服器檔案 %s',
'File does not exist.' => '檔案不存在',
'Item has been deleted.' => '該項目已被刪除',
@@ -227,35 +225,45 @@ $translations = array(
'Table has been dropped.' => '已經刪除資料表。',
'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' => 'Sequences',
'Create sequence' => '建立 sequence',
'Alter sequence' => '更改 sequence',
'Sequence has been dropped.' => '已刪除 sequence。',
'Sequence has been created.' => '已建立 sequence。',
'Sequence has been altered.' => '已更改 sequence。',
'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' => '改類型',
'Alter type' => '改類型',
'Type has been dropped.' => '已刪除類型。',
'Type has been created.' => '已建立類型。',
'Double click on a value to modify it.' => '雙擊以進行修改。',
'Increase text length to modify this value.' => '增加字串長度來修改。',
'Use edit link to modify this value.' => '使用編輯連結來修改。',
'last' => '最後一頁',
'From server' => '從伺服器',
'System' => '資料庫系統',
'Select data' => '選擇資料',
'Show structure' => '秀出結構',
'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' => 'HH:MM:SS',
);

View File

@@ -9,26 +9,26 @@ $translations = array(
'Select database' => '选择数据库',
'Invalid database.' => '无效数据库。',
'Create new database' => '创建新数据库',
'Table has been dropped.' => '已丢弃表。',
'Table has been altered.' => '已改表。',
'Table has been dropped.' => '已删除表。',
'Table has been altered.' => '已改表。',
'Table has been created.' => '已创建表。',
'Alter table' => '改表',
'Alter table' => '改表',
'Create table' => '创建表',
'Table name' => '表名',
'engine' => '引擎',
'collation' => '校对',
'Column name' => '名',
'Column name' => '字段名',
'Type' => '类型',
'Length' => '长度',
'Auto Increment' => '自动增量',
'Options' => '选项',
'Save' => '保存',
'Drop' => '丢弃',
'Database has been dropped.' => '已丢弃数据库。',
'Drop' => '删除',
'Database has been dropped.' => '已删除数据库。',
'Database has been created.' => '已创建数据库。',
'Database has been renamed.' => '已重命名数据库。',
'Database has been altered.' => '已改数据库。',
'Alter database' => '改数据库',
'Database has been altered.' => '已改数据库。',
'Alter database' => '改数据库',
'Create database' => '创建数据库',
'SQL command' => 'SQL命令',
'Dump' => '导出',
@@ -37,7 +37,6 @@ $translations = array(
'Use' => '使用',
'No tables.' => '没有表。',
'select' => '选择',
'Create new table' => '创建新表',
'Item has been deleted.' => '已删除项目。',
'Item has been updated.' => '已更新项目。',
'Item%s has been inserted.' => '已插入项目%s。',
@@ -47,22 +46,22 @@ $translations = array(
'Delete' => '删除',
'Database' => '数据库',
'Routines' => '子程序',
'Indexes have been altered.' => '已改索引。',
'Indexes have been altered.' => '已改索引。',
'Indexes' => '索引',
'Alter indexes' => '改索引',
'Add next' => '添加下一个',
'Alter indexes' => '改索引',
'Add next' => '下一行插入',
'Language' => '语言',
'Select' => '选择',
'New item' => '新建',
'New item' => '新建数据',
'Search' => '搜索',
'Sort' => '排序',
'descending' => '降序',
'Limit' => '限定',
'No rows.' => '没有行。',
'Limit' => '范围',
'No rows.' => '无数据。',
'Action' => '动作',
'edit' => '编辑',
'Page' => '页面',
'Query executed OK, %d row(s) affected.' => '执行查询OK%d 行受影响。',
'Query executed OK, %d row(s) affected.' => '查询执行完毕%d 行受影响。',
'Error in query' => '查询出错',
'Execute' => '执行',
'Table' => '表',
@@ -74,7 +73,7 @@ $translations = array(
'Comment' => '注释',
'Default values' => '默认值',
'%d byte(s)' => '%d 字节',
'No commands to execute.' => '没有命令执行。',
'No commands to execute.' => '没有命令执行。',
'Unable to upload a file.' => '不能上传文件。',
'File upload' => '文件上传',
'File uploads are disabled.' => '文件上传被禁用。',
@@ -82,28 +81,28 @@ $translations = array(
'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' => '文本长度',
'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 altered.' => '已改外键。',
'Foreign key has been created.' => '已创建外键。',
'Foreign key' => '外键',
'Target table' => '目标表',
'Change' => '改',
'Change' => '改',
'Source' => '源',
'Target' => '目标',
'Add column' => '增加列',
'Alter' => '改',
'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 dropped.' => '已删除视图。',
'View has been altered.' => '已改视图。',
'View has been created.' => '已创建视图。',
'Alter view' => '改视图',
'Alter view' => '改视图',
'Create view' => '创建视图',
'Name' => '名称',
'Process list' => '进程列表',
@@ -113,35 +112,35 @@ $translations = array(
'Database schema' => '数据库概要',
'Create procedure' => '创建过程',
'Create function' => '创建函数',
'Routine has been dropped.' => '已丢弃子程序。',
'Routine has been altered.' => '已改子程序。',
'Routine has been dropped.' => '已删除子程序。',
'Routine has been altered.' => '已改子程序。',
'Routine has been created.' => '已创建子程序。',
'Alter function' => '改函数',
'Alter procedure' => '改过程',
'Alter function' => '改函数',
'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' => '改触发器',
'Alter trigger' => '改触发器',
'Create trigger' => '创建触发器',
'Time' => '时间',
'Event' => '事件',
'%s version: %s through PHP extension %s' => '%s 版本:%s 通过 PHP 扩展 %s',
'%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 dropped.' => '已删除用户。',
'User has been altered.' => '已改用户。',
'User has been created.' => '已创建用户。',
'Hashed' => 'Hashed',
'Column' => '列',
'Routine' => '子程序',
'Grant' => '授权',
'Revoke' => '废除',
'Logged as: %s' => '登录%s',
'Logged as: %s' => '登录用户%s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => '太大的 POST 数据。减少数据或者增加 %s 配置命令。',
'Move up' => '上移',
'Move down' => '下移',
@@ -154,10 +153,10 @@ $translations = array(
'Format' => '格式',
'Functions' => '函数',
'Aggregation' => '集合',
'Event has been dropped.' => '已丢弃事件。',
'Event has been altered.' => '已改事件。',
'Event has been dropped.' => '已删除事件。',
'Event has been altered.' => '已改事件。',
'Event has been created.' => '已创建事件。',
'Alter event' => '改事件',
'Alter event' => '改事件',
'Create event' => '创建事件',
'Start' => '开始',
'End' => '结束',
@@ -188,16 +187,15 @@ $translations = array(
'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 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 行已导入。',
'anywhere' => '任意位置',
'CSV Import' => 'CSV 导入',
'Import' => '导入',
'Stop on error' => '出错时停止',
'%.3f s' => '%.3f 秒',
@@ -225,28 +223,26 @@ $translations = array(
'File does not exist.' => '文件不存在。',
'%d in total' => '共计 %d',
'Permanent login' => '保持登录',
'Databases have been dropped.' => '已丢弃数据库。',
'Databases have been dropped.' => '已删除数据库。',
'Search data in tables' => '在表中搜索数据',
'schema' => '模式',
'Schema' => '模式',
'Alter schema' => '改模式',
'Alter schema' => '改模式',
'Create schema' => '创建模式',
'Schema has been dropped.' => '已丢弃模式。',
'Schema has been dropped.' => '已删除模式。',
'Schema has been created.' => '已创建模式。',
'Schema has been altered.' => '已改模式。',
'Schema has been altered.' => '已改模式。',
'Sequences' => '序列',
'Create sequence' => '创建序列',
'Alter sequence' => '改序列',
'Sequence has been dropped.' => '已丢弃序列。',
'Alter sequence' => '改序列',
'Sequence has been dropped.' => '已删除序列。',
'Sequence has been created.' => '已创建序列。',
'Sequence has been altered.' => '已改序列。',
'Sequence has been altered.' => '已改序列。',
'User types' => '用户类型',
'Create type' => '创建类型',
'Alter type' => '改类型',
'Type has been dropped.' => '已丢弃类型。',
'Alter type' => '改类型',
'Type has been dropped.' => '已删除类型。',
'Type has been created.' => '已创建类型。',
'Double click on a value to modify it.' => '在值上双击类修改它。',
'Increase text length to modify this value.' => '增加文本长度以修改该值。',
'Use edit link to modify this value.' => '使用编辑链接来修改该值。',
'last' => '最后',
'From server' => '来自服务器',
@@ -258,4 +254,16 @@ $translations = array(
'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' => 'HH:MM:SS',
);

43
adminer/plugin.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
function adminer_object() {
// required to run any plugin
include_once "../plugins/plugin.php";
// autoloader
foreach (glob("../plugins/*.php") as $filename) {
include_once $filename;
}
$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 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,
new AdminerEnumOption,
new AdminerTablesFilter,
new AdminerEditForeign,
);
/* It is possible to combine customization and plugins:
class AdminerCustomization extends AdminerPlugin {
}
return new AdminerCustomization($plugins);
*/
return new AdminerPlugin($plugins);
}
// include original Adminer or Adminer Editor (usually named adminer.php)
include "./index.php";

View File

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

View File

@@ -1,45 +1,42 @@
<?php
$PROCEDURE = $_GET["procedure"];
$routine = (isset($_GET["function"]) ? "FUNCTION" : "PROCEDURE");
$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[] = (in_array($field["inout"], $inout) ? "$field[inout] " : "") . idf_escape($field["field"]) . process_type($field, "CHARACTER SET");
}
}
$dropped = drop_create(
if ($_POST && !process_fields($row["fields"]) && !$error) {
$temp_name = "$row[name]_adminer_" . uniqid();
drop_create(
"DROP $routine " . idf_escape($PROCEDURE),
"CREATE $routine " . idf_escape($_POST["name"]) . " (" . implode(", ", $set) . ")" . (isset($_GET["function"]) ? " RETURNS" . process_type($_POST["returns"], "CHARACTER SET") : "") . "\n$_POST[definition]",
create_routine($routine, $row),
"DROP $routine " . idf_escape($row["name"]),
create_routine($routine, array("name" => $temp_name) + $row),
"DROP $routine " . idf_escape($temp_name),
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 != "") {
if (!$_POST && $PROCEDURE != "") {
$row = routine($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">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
<?php echo ($routine_languages ? lang('Language') . ": " . html_select("language", $routine_languages, $row["language"]) : ""); ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<table cellspacing="0" class="nowrap">
<?php
edit_fields($row["fields"], $collations, $routine);
@@ -51,8 +48,7 @@ if (isset($_GET["function"])) {
</table>
<p><?php textarea("definition", $row["definition"]); ?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php if ($dropped) { ?><input type="hidden" name="dropped" value="1"><?php } ?>
<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 ($PROCEDURE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,8 +1,8 @@
<?php
if ($_POST && !$error) {
if (support("kill") && $_POST && !$error) {
$killed = 0;
foreach ((array) $_POST["kill"] as $val) {
if (queries("KILL " . ereg_replace("[^0-9]+", "", $val))) {
if (queries("KILL " . (+$val))) {
$killed++;
}
}
@@ -13,17 +13,45 @@ page_header(lang('Process list'), $error);
?>
<form action="" method="post">
<table cellspacing="0" onclick="tableClick(event);" class="nowrap">
<table cellspacing="0" onclick="tableClick(event);" ondblclick="tableClick(event, true);" class="nowrap checkable">
<?php
foreach (get_rows("SHOW FULL PROCESSLIST") as $i => $row) {
// 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'><th>&nbsp;<th>" . implode("<th>", array_keys($row)) . "</thead>\n";
echo "<thead><tr lang='en'>" . (support("kill") ? "<th>&nbsp;" : "");
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() . "><td>" . checkbox("kill[]", $row["Id"], 0) . "<td>" . implode("<td>", array_map('nbsp', $row)) . "\n";
echo "<tr" . odd() . ">" . (support("kill") ? "<td>" . checkbox("kill[]", $row["Id"], 0) : "");
foreach ($row as $key => $val) {
echo "<td>" . (
($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('Clone') . '</a>'
: nbsp($val)
);
}
echo "\n";
}
?>
</table>
<script type='text/javascript'>tableCheck();</script>
<p>
<?php
if (support("kill")) {
echo ($i + 1) . "/" . lang('%d in total', $connection->result("SELECT @@max_connections"));
echo "<p><input type='submit' value='" . lang('Kill') . "'>\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Kill'); ?>">
</form>

View File

@@ -1,13 +1,14 @@
<?php
page_header(lang('Database schema'), "", array(), DB);
page_header(lang('Database schema'), "", array(), h(DB . ($_GET["ns"] ? ".$_GET[ns]" : "")));
$table_pos = array();
$table_pos_js = array();
// saved in one cookie because there is a limit of 20 cookies per domain
preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~', $_COOKIE["adminer_schema"], $matches, PREG_SET_ORDER); //! ':' in table name
$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
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]);
$table_pos_js[] = "\n\t'" . addcslashes($match[1], "\r\n'\\/") . "': [ $match[2], $match[3] ]";
$table_pos_js[] = "\n\t'" . js_escape($match[1]) . "': [ $match[2], $match[3] ]";
}
$top = 0;
@@ -15,76 +16,81 @@ $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 $row) {
if (!isset($row["Engine"])) { // view
foreach (table_status('', true) as $table => $table_status) {
if (is_view($table_status)) {
continue;
}
$pos = 0;
$schema[$row["Name"]]["fields"] = array();
foreach (fields($row["Name"]) as $name => $field) {
$schema[$table]["fields"] = array();
foreach (fields($table) as $name => $field) {
$pos += 1.25;
$field["pos"] = $pos;
$schema[$row["Name"]]["fields"][$name] = $field;
$schema[$table]["fields"][$name] = $field;
}
$schema[$row["Name"]]["pos"] = ($table_pos[$row["Name"]] ? $table_pos[$row["Name"]] : array($top, 0));
if (fk_support($row)) {
foreach (foreign_keys($row["Name"]) as $val) {
if (!$val["db"]) {
$left = $base_left;
if ($table_pos[$row["Name"]][1] || $table_pos[$val["table"]][1]) {
$left = min(floatval($table_pos[$row["Name"]][1]), floatval($table_pos[$val["table"]][1])) - 1;
} else {
$base_left -= .1;
}
while ($lefts[(string) $left]) {
// find free $left
$left -= .0001;
}
$schema[$row["Name"]]["references"][$val["table"]][(string) $left] = array($val["source"], $val["target"]);
$referenced[$val["table"]][$row["Name"]][(string) $left] = $val["target"];
$lefts[(string) $left] = true;
$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][1] || $table_pos[$val["table"]][1]) {
$left = min(floatval($table_pos[$table][1]), floatval($table_pos[$val["table"]][1])) - 1;
} else {
$base_left -= .1;
}
while ($lefts[(string) $left]) {
// find free $left
$left -= .0001;
}
$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[$row["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;">
<div id="schema" style="height: <?php echo $top; ?>em;" onselectstart="return false;">
<script type="text/javascript">
tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
var tablePos = {<?php echo implode(",", $table_pos_js) . "\n"; ?>};
var em = document.getElementById('schema').offsetHeight / <?php echo $top; ?>;
document.onmousemove = schemaMousemove;
document.onmouseup = schemaMouseup;
document.onmouseup = function (ev) {
schemaMouseup(ev, '<?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 '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a><br>\n";
echo '<a href="' . h(ME) . 'table=' . urlencode($name) . '"><b>' . h($name) . "</b></a>";
foreach ($table["fields"] as $field) {
$val = '<span' . type_class($field["type"]) . ' title="' . h($field["full_type"] . ($field["null"] ? " NULL" : '')) . '">' . h($field["field"]) . '</span>';
echo ($field["primary"] ? "<i>$val</i>" : $val) . "<br>\n";
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];
$i = 0;
foreach ($ref[0] as $source) {
echo "<div class='references' title='" . h($target_name) . "' id='refs$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$source]["pos"] . "em; padding-top: .5em;'><div style='border-top: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>\n";
echo "\n<div class='references' title='" . h($target_name) . "' id='refs$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$source]["pos"] . "em; padding-top: .5em;'><div style='border-top: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>";
}
}
}
foreach ((array) $referenced[$name] as $target_name => $refs) {
foreach ($refs as $left => $columns) {
$left1 = $left - $table_pos[$name][1];
$i = 0;
foreach ($columns as $target) {
echo "<div class='references' title='" . h($target_name) . "' id='refd$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$target]["pos"] . "em; height: 1.25em; background: url(../adminer/static/arrow.gif) no-repeat right center;'><div style='height: .5em; border-bottom: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>\n";
echo "\n<div class='references' title='" . h($target_name) . "' id='refd$left-" . ($i++) . "' style='left: $left1" . "em; top: " . $table["fields"][$target]["pos"] . "em; height: 1.25em; background: url(../adminer/static/arrow.gif) no-repeat right center;'><div style='height: .5em; border-bottom: 1px solid Gray; width: " . (-$left1) . "em;'></div></div>";
}
}
}
echo "</div>\n";
echo "\n</div>\n";
}
foreach ($schema as $name => $table) {
foreach ((array) $table["references"] as $target_name => $refs) {
foreach ($refs as $left => $ref) {
@@ -102,3 +108,4 @@ foreach ($schema as $name => $table) {
}
?>
</div>
<p class="links"><a href="<?php echo h(ME . "schema=" . urlencode($SCHEMA)); ?>" id="schema-link"><?php echo lang('Permanent link'); ?></a>

View File

@@ -1,14 +1,17 @@
<?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 {
$link .= urlencode($_POST["name"]);
$name = trim($row["name"]);
$link .= urlencode($name);
if ($_GET["ns"] == "") {
query_redirect("CREATE SCHEMA " . idf_escape($_POST["name"]), $link, lang('Schema has been created.'));
} elseif ($_GET["ns"] != $_POST["name"]) {
query_redirect("ALTER SCHEMA " . idf_escape($_GET["ns"]) . " RENAME TO " . idf_escape($_POST["name"]), $link, lang('Schema has been altered.')); //! sp_rename in MS SQL
query_redirect("CREATE SCHEMA " . idf_escape($name), $link, lang('Schema has been created.'));
} elseif ($_GET["ns"] != $name) {
query_redirect("ALTER SCHEMA " . idf_escape($_GET["ns"]) . " RENAME TO " . idf_escape($name), $link, lang('Schema has been altered.')); //! sp_rename in MS SQL
} else {
redirect($link);
}
@@ -17,19 +20,19 @@ if ($_POST && !$error) {
page_header($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema'), $error);
$row = array("name" => $_GET["ns"]);
if ($_POST) {
$row = $_POST;
if (!$row) {
$row["name"] = $_GET["ns"];
}
?>
<form action="" method="post">
<p><input name="name" value="<?php echo h($row["name"]); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
<script type='text/javascript'>focus(document.getElementById('name'));</script>
<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() . ">\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -3,33 +3,43 @@ 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 $row) {
$id = addcslashes($row["Name"], "\\'/");
echo "setHtml('Comment-$id', '" . nbsp($row["Comment"]) . "');\n";
if (!is_view($row)) {
foreach (table_status() as $name => $table_status) {
$id = js_escape($name);
json_row("Comment-$id", nbsp($table_status["Comment"]));
if (!is_view($table_status)) {
foreach (array("Engine", "Collation") as $key) {
echo "setHtml('$key-$id', '" . nbsp($row[$key]) . "');\n";
json_row("$key-$id", nbsp($table_status[$key]));
}
foreach ($sums + array("Auto_increment" => 0, "Rows" => 0) as $key => $val) {
if ($row[$key] != "") {
$val = number_format($row[$key], 0, '.', lang(','));
echo "setHtml('$key-$id', '" . ($key == "Rows" && $row["Engine"] == "InnoDB" && $val ? "~ $val" : $val) . "');\n";
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"
: $val
));
if (isset($sums[$key])) {
$sums[$key] += ($row["Engine"] != "InnoDB" || $key != "Data_free" ? $row[$key] : 0);
// ignore innodb_file_per_table because it is not active for tables created before it was enabled
$sums[$key] += ($table_status["Engine"] != "InnoDB" || $key != "Data_free" ? $table_status[$key] : 0);
}
} elseif (array_key_exists($key, $row)) {
echo "setHtml('$key-$id');\n";
} elseif (array_key_exists($key, $table_status)) {
json_row("$key-$id");
}
}
}
}
foreach ($sums as $key => $val) {
echo "setHtml('sum-$key', '" . number_format($val, 0, '.', lang(',')) . "');\n";
json_row("sum-$key", number_format($val, 0, '.', lang(',')));
}
json_row("");
} elseif ($_GET["script"] == "kill") {
$connection->query("KILL " . (+$_POST["kill"]));
} else { // connect
foreach (count_tables(get_databases()) as $db => $val) {
echo "setHtml('tables-" . addcslashes($db, "\\'/") . "', '$val');\n";
foreach (count_tables($adminer->databases()) as $db => $val) {
json_row("tables-" . js_escape($db), $val);
}
json_row("");
}
exit; // don't print footer

View File

@@ -1,9 +1,15 @@
<?php
$TABLE = $_GET["select"];
$table_status = table_status($TABLE);
$table_status = table_status1($TABLE);
$indexes = indexes($TABLE);
$fields = fields($TABLE, 1); // 1 - hidden
$fields = fields($TABLE);
$foreign_keys = column_foreign_keys($TABLE);
$oid = "";
if ($table_status["Oid"]) {
$oid = ($jush == "sqlite" ? "rowid" : "oid");
$indexes[] = array("type" => "PRIMARY", "columns" => array($oid));
}
parse_str($_COOKIE["adminer_import"], $adminer_import);
$rights = array(); // privilege => 0
$columns = array(); // selectable columns
@@ -11,8 +17,8 @@ $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));
if (ereg('text|lob', $field["type"])) {
$columns[$key] = html_entity_decode(strip_tags($name), ENT_QUOTES);
if (is_shortable($field)) {
$text_length = $adminer->selectLengthProcess();
}
}
@@ -20,14 +26,35 @@ foreach ($fields as $key => $field) {
}
list($select, $group) = $adminer->selectColumnsProcess($columns, $indexes);
$is_group = count($group) < count($select);
$where = $adminer->selectSearchProcess($fields, $indexes);
$order = $adminer->selectOrderProcess($fields, $indexes);
$limit = $adminer->selectLimitProcess();
$from = ($select ? implode(", ", $select) : "*") . "\nFROM " . table($TABLE);
$group_by = ($group && count($group) < count($select) ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : "");
$from = ($select ? implode(", ", $select) : "*" . ($oid ? ", $oid" : ""))
. convert_fields($columns, $fields, $select)
. "\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)]);
$select = array($as ? $as : idf_escape(key($row)));
$where[] = where_check($unique_idf, $fields);
$return = $driver->select($TABLE, $select, $where, $select, array(), 1, 0);
if ($return) {
echo reset($return->fetch_row());
}
}
exit;
}
if ($_POST && !$error) {
$where_check = "(" . implode(") OR (", array_map('where_check', (array) $_POST["check"])) . ")";
$where_check = $where;
if (!$_POST["all"] && is_array($_POST["check"])) {
$where_check[] = "((" . implode(") OR (", array_map('where_check', $_POST["check"])) . "))";
}
$where_check = ($where_check ? "\nWHERE " . implode(" AND ", $where_check) : "");
$primary = $unselected = null;
foreach ($indexes as $index) {
if ($index["type"] == "PRIMARY") {
@@ -36,77 +63,67 @@ if ($_POST && !$error) {
break;
}
}
foreach ($select as $key => $val) {
$val = $_GET["columns"][$key];
if (!$val["fun"]) {
unset($unselected[$val["col"]]);
foreach ((array) $unselected as $key => $val) {
if (in_array(idf_escape($key), $select)) {
unset($unselected[$key]);
}
}
if ($_POST["export"]) {
cookie("adminer_import", "output=" . urlencode($_POST["output"]) . "&format=" . urlencode($_POST["format"]));
dump_headers($TABLE);
dump_table($TABLE, "");
if ($_POST["format"] != "sql") { // Editor doesn't send format
$row = array_keys($fields);
if ($select) {
$row = array();
foreach ($select as $val) {
$row[] = (ereg('^`.*`$', $val) ? idf_unescape($val) : $val); //! columns looking like functions
}
}
dump_csv($row);
}
$adminer->dumpTable($TABLE, "");
if (!is_array($_POST["check"]) || $unselected === array()) {
$where2 = $where;
if (is_array($_POST["check"])) {
$where2[] = "($where_check)";
}
dump_data($TABLE, "INSERT", "SELECT $from" . ($where2 ? "\nWHERE " . implode(" AND ", $where2) : "") . $group_by);
$query = "SELECT $from$where_check$group_by";
} else {
$union = array();
foreach ($_POST["check"] as $val) {
// where is not unique so OR can't be used
$union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val) . $group_by, 1) . ")";
$union[] = "(SELECT" . limit($from, "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields) . $group_by, 1) . ")";
}
dump_data($TABLE, "INSERT", implode(" UNION ALL ", $union));
$query = implode(" UNION ALL ", $union);
}
$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"]) || count($group) < count($select)) {
$result = queries($command . " $query" . ($_POST["all"] ? ($where ? "\nWHERE " . implode(" AND ", $where) : "") : "\nWHERE $where_check"));
if ($_POST["all"] || ($unselected === array() && 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)));
$where2 = "\nWHERE " . ($where ? implode(" AND ", $where) . " AND " : "") . where_check($val, $fields);
$result = ($_POST["delete"]
? $driver->delete($TABLE, $where2, 1)
: ($_POST["clone"]
? queries("INSERT" . limit1($query, $where2))
: $driver->update($TABLE, $set, $where2)
)
);
if (!$result) {
break;
}
@@ -114,11 +131,19 @@ if ($_POST && !$error) {
}
}
}
queries_redirect(remove_from_uri("page"), lang('%d item(s) have been affected.', $affected), $result);
$message = lang('%d item(s) have been affected.', $affected);
if ($_POST["clone"] && $result && $affected == 1) {
$last_id = last_id();
if ($last_id) {
$message = lang('Item%s has been inserted.', " $last_id");
}
}
queries_redirect(remove_from_uri($_POST["all"] && $_POST["delete"] ? "page" : ""), $message, $result);
//! display edit page in case of an error
} elseif (!$_POST["import"]) { // modify
if (!$_POST["val"]) {
$error = lang('Double click on a value to modify it.');
$error = lang('Ctrl+click on a value to modify it.');
} else {
$result = true;
$affected = 0;
@@ -126,9 +151,15 @@ if ($_POST && !$error) {
$set = array();
foreach ($row as $key => $val) {
$key = bracket_escape($key, 1); // 1 - back
$set[] = idf_escape($key) . " = " . $adminer->processInput($fields[$key], $val);
$set[idf_escape($key)] = (preg_match('~char|text~', $fields[$key]["type"]) || $val != "" ? $adminer->processInput($fields[$key], $val) : "NULL");
}
$result = queries("UPDATE" . limit1(table($TABLE) . " SET " . implode(", ", $set), " WHERE " . where_check($unique_idf) . ($where ? " AND " . implode(" AND ", $where) : ""))); // 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 || $unselected === array()),
" "
);
if (!$result) {
break;
}
@@ -136,16 +167,22 @@ 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))) {
$file = preg_replace("~^\xEF\xBB\xBF~", '', $file); //! 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);
$affected = count($matches[0]);
begin();
$separator = ($_POST["separator"] == "csv" ? "," : ";");
$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);
preg_match_all("~((?>\"[^\"]*\")+|[^$separator]*)$separator~", $val . $separator, $matches2);
if (!$key && !array_diff($matches2[1], $cols)) { //! doesn't work with column names containing ",\n
// first row corresponds to column names - use it for table structure
$cols = $matches2[1];
@@ -155,33 +192,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");
$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);
page_header(lang('Select') . ": $table_name", $error);
session_write_close();
if (is_ajax()) {
page_headers();
ob_start();
} else {
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
|| (!$val["op"] && !preg_match('~[_%]~', $val["val"])) // LIKE in Editor
)) {
$set .= "&set" . urlencode("[" . bracket_escape($val["col"]) . "]") . "=" . urlencode($val["val"]);
}
@@ -189,7 +227,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";
@@ -203,62 +241,86 @@ if (!$columns) {
$adminer->selectOrderPrint($order, $columns, $indexes);
$adminer->selectLimitPrint($limit);
$adminer->selectLengthPrint($text_length);
$adminer->selectActionPrint($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) : ""));
$page = floor(($found_rows - 1) / $limit);
$found_rows = $connection->result(count_rows($TABLE, $where, $is_group, $group));
$page = floor(max(0, $found_rows - 1) / $limit);
}
$query = "SELECT" . limit((intval($limit) && $group && count($group) < count($select) && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . $from, ($where ? "\nWHERE " . implode(" AND ", $where) : "") . $group_by, ($limit != "" ? intval($limit) : null), ($page ? $limit * $page : 0), "\n");
echo $adminer->selectQuery($query);
$result = $connection->query($query);
$select2 = $select;
if (!$select2) {
$select2[] = "*";
if ($oid) {
$select2[] = $oid;
}
}
$convert_fields = convert_fields($columns, $fields, $select);
if ($convert_fields) {
$select2[] = substr($convert_fields, 2);
}
$result = $driver->select($TABLE, $select2, $where, $group, $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();
echo "<form action='' method='post' enctype='multipart/form-data'>\n";
$rows = array();
while ($row = $result->fetch_assoc()) {
if ($page && $jush == "oracle") {
unset($row["RNUM"]);
}
$rows[] = $row;
}
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
if ($_GET["page"] != "last") {
$found_rows = (intval($limit) && $group && count($group) < count($select)
? ($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 cellspacing='0' class='nowrap' onclick='tableClick(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 "<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('Modify') . "</a>");
$names = array();
$functions = array();
reset($select);
$order = 1;
$rank = 1;
foreach ($rows[0] as $key => $val) {
$val = $_GET["columns"][key($select)];
$field = $fields[$select ? $val["col"] : $key];
$name = ($field ? $adminer->fieldName($field, $order) : "*");
if ($name != "") {
$order++;
$names[$key] = $name;
echo '<th><a href="' . h(remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key) . ($_GET["order"][0] == $key && !$_GET["desc"][0] ? '&desc%5B0%5D=1' : '')) . '">' . apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
if ($key != $oid) {
$val = $_GET["columns"][key($select)];
$field = $fields[$select ? ($val ? $val["col"] : current($select)) : $key];
$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 '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
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 "</span>";
}
$functions[$key] = $val["fun"];
next($select);
}
$functions[$key] = $val["fun"];
next($select);
}
$lengths = array();
if ($_GET["modify"]) {
foreach ($rows as $row) {
@@ -267,139 +329,203 @@ 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) {
$unique_idf .= "&" . (isset($val) ? urlencode("where[" . bracket_escape($key) . "]") . "=" . urlencode($val) : "null%5B%5D=" . urlencode($key));
if (($jush == "sql" || $jush == "pgsql") && strlen($val) > 64) {
$key = "MD5(" . (strpos($key, '(') ? $key : idf_escape($key)) . ")"; //! columns looking like functions
$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');") . (count($group) < count($select) || 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"]), "", "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>"));
foreach ($row as $key => $val) {
if (isset($names[$key])) {
$field = $fields[$key];
if ($val != "" && (!isset($email_fields[$key]) || $email_fields[$key] != "")) {
$email_fields[$key] = (is_email($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
$email_fields[$key] = (is_mail($val) ? $names[$key] : ""); //! filled e-mails can be contained on other pages
}
$link = "";
$val = $adminer->editVal($val, $field);
if (!isset($val)) {
$val = "<i>NULL</i>";
} else {
if (ereg('blob|bytea|raw|file', $field["type"]) && $val != "") {
$link = h(ME . 'download=' . urlencode($TABLE) . '&field=' . urlencode($key) . $unique_idf);
}
if ($val == "") {
$val = "&nbsp;";
} elseif ($text_length != "" && ereg('text|blob', $field["type"]) && is_utf8($val)) {
$val = shorten_utf8($val, max(0, intval($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 || count($foreign_key["source"]) == 1) {
foreach ($foreign_key["source"] as $i => $source) {
$link .= where_link($i, $foreign_key["target"][$i], $rows[$n][$source]);
}
$link = h(($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 (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 (count($foreign_key["source"]) == 1) {
break;
}
}
}
if ($key == "COUNT(*)") { //! columns looking like functions
$link = h(ME . "select=" . urlencode($TABLE));
$i = 0;
foreach ((array) $_GET["where"] as $v) {
if (!array_key_exists($v["col"], $unique_array)) {
$link .= h(where_link($i++, $v["col"], $v["val"], $v["op"]));
}
}
foreach ($unique_array as $k => $v) {
$link .= h(where_link($i++, $k, $v, (isset($v) ? "=" : "IS NULL")));
}
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) {
if (is_email($val)) {
$link = "mailto:$val";
}
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(isset($value) ? $value : $row[$key]);
$long = strpos($val, "<i>...</i>");
$editable = is_utf8($val) && !$long && $rows[$n][$key] == $row[$key] && !$functions[$key];
$text = ereg('text|lob', $field["type"]);
echo (($_GET["modify"] && $editable) || isset($value)
? "<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' ondblclick=\"" . ($editable ? "selectDblClick(this, event" . ($text ? ", 1" : "") . ")" : "alert('" . h($long ? lang('Increase text length to modify this value.') : 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' onclick=\"selectClick(this, event, " . ($long ? 2 : ($text ? 1 : 0)) . ($editable ? "" : ", '" . h(lang('Use edit link to modify this value.')) . "'") . ");\">$val";
}
}
}
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";
}
parse_str($_COOKIE["adminer_export"], $adminer_export);
if ($rows || $page) {
if (($rows || $page) && !is_ajax()) {
$exact_count = true;
if ($_GET["page"] != "last" && intval($limit) && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
$found_rows = $table_status["Rows"];
if (!isset($found_rows) || $where || 2 * $page * $limit > $found_rows || ($table_status["Engine"] == "InnoDB" && $found_rows < 1e4)) {
// slow with big tables
ob_flush();
flush();
$found_rows = $connection->result("SELECT COUNT(*) FROM " . table($TABLE) . ($where ? " WHERE " . implode(" AND ", $where) : ""));
} else {
$exact_count = false;
if ($_GET["page"] != "last") {
if (!+$limit) {
$found_rows = 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;
}
}
}
echo "<p class='pages'>";
if (intval($limit) && $found_rows > $limit) {
if (+$limit && ($found_rows === false || $found_rows > $limit || $page)) {
echo "<p class='pages'>";
// display first, previous 4, next 4 and last page
$max_page = floor(($found_rows - 1) / $limit);
echo '<a href="' . h(remove_from_uri("page")) . "\" onclick=\"var page = +prompt('" . lang('Page') . "', '" . ($page + 1) . "'); if (!isNaN(page) &amp;&amp; page) location.href = this.href + (page != 1 ? '&amp;page=' + (page - 1) : ''); return false;\">" . lang('Page') . "</a>:" . pagination(0, $page) . ($page > 5 ? " ..." : "");
for ($i = max(1, $page - 4); $i < min($max_page, $page + 5); $i++) {
echo pagination($i, $page);
$max_page = ($found_rows === false
? $page + (count($rows) >= $limit ? 2 : 1)
: floor(($found_rows - 1) / $limit)
);
if ($jush != "simpledb") {
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);
}
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>"
);
}
echo (($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>'
: ''
);
} else {
echo lang('Page') . ":";
echo pagination(0, $page) . ($page > 1 ? " ..." : "");
echo ($page ? pagination($page, $page) : "");
echo ($max_page > $page ? pagination($page + 1, $page) . ($max_page > $page + 1 ? " ..." : "") : "");
}
echo ($page + 5 < $max_page ? " ..." : "") . ($exact_count ? pagination($max_page, $page) : ' <a href="' . h(remove_from_uri() . "&page=last") . '">' . lang('last') . "</a>");
}
echo " (" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " . checkbox("all", 1, 0, lang('whole result')) . "\n";
if (!information_schema(DB)) {
echo "<p class='count'>\n";
echo ($found_rows !== false ? "(" . ($exact_count ? "" : "~ ") . lang('%d row(s)', $found_rows) . ") " : "");
$display_rows = ($exact_count ? "" : "~ ") . $found_rows;
echo checkbox("all", 1, 0, lang('whole result'), "var checked = formChecked(this, /check/); selectCount('selected', this.checked ? '$display_rows' : checked); selectCount('selected2', this.checked || !checked ? '$display_rows' : checked);") . "\n";
if ($adminer->selectCommandPrint()) {
?>
<fieldset><legend><?php echo lang('Edit'); ?></legend><div>
<input type="submit" value="<?php echo lang('Save'); ?>" title="<?php echo lang('Double click on a value to modify it.'); ?>">
<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
}
print_fieldset("export", lang('Export'));
echo $adminer->dumpOutput(1, $adminer_export["output"]) . " " . $adminer->dumpFormat(1, $adminer_export["format"]); // 1 - select
echo " <input type='submit' name='export' value='" . lang('Export') . "'>\n";
$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";
}
echo (!$group && $select ? "" : "<script type='text/javascript'>tableCheck();</script>\n");
}
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";
}
print_fieldset("import", lang('CSV Import'), !$rows);
echo "<input type='hidden' name='token' value='$token'><input type='file' name='csv_file'> ";
echo html_select("separator", array("csv" => "CSV,", "csv;" => "CSV;"), $adminer_export["format"], 1); // 1 - select
echo " <input type='submit' name='import' value='" . lang('Import') . "'>\n";
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";
}
}
if (is_ajax()) {
ob_end_clean();
exit;
}

View File

@@ -1,14 +1,16 @@
<?php
$SEQUENCE = $_GET["sequence"];
$row = $_POST;
if ($_POST && !$error) {
$link = substr(ME, 0, -1);
$name = trim($row["name"]);
if ($_POST["drop"]) {
query_redirect("DROP SEQUENCE " . idf_escape($SEQUENCE), $link, lang('Sequence has been dropped.'));
} elseif ($SEQUENCE == "") {
query_redirect("CREATE SEQUENCE " . idf_escape($_POST["name"]), $link, lang('Sequence has been created.'));
} elseif ($SEQUENCE != $_POST["name"]) {
query_redirect("ALTER SEQUENCE " . idf_escape($SEQUENCE) . " RENAME TO " . idf_escape($_POST["name"]), $link, lang('Sequence has been altered.'));
query_redirect("CREATE SEQUENCE " . idf_escape($name), $link, lang('Sequence has been created.'));
} elseif ($SEQUENCE != $name) {
query_redirect("ALTER SEQUENCE " . idf_escape($SEQUENCE) . " RENAME TO " . idf_escape($name), $link, lang('Sequence has been altered.'));
} else {
redirect($link);
}
@@ -16,19 +18,18 @@ if ($_POST && !$error) {
page_header($SEQUENCE != "" ? lang('Alter sequence') . ": " . h($SEQUENCE) : lang('Create sequence'), $error);
$row = array("name" => $SEQUENCE);
if ($_POST) {
$row = $_POST;
if (!$row) {
$row["name"] = $SEQUENCE;
}
?>
<form action="" method="post">
<p><input name="name" value="<?php echo h($row["name"]); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<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() . ">\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,4 +1,11 @@
<?php
if (!$error && $_POST["export"]) {
dump_headers("sql");
$adminer->dumpTable("", "");
$adminer->dumpData("", "table", $_POST["query"]);
exit;
}
restart_session();
$history_all = &get_session("queries");
$history = &$history_all[DB];
@@ -7,31 +14,38 @@ 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"]) {
$fp = @fopen((file_exists("adminer.sql")
? "adminer.sql"
: "compress.zlib://adminer.sql.gz"
), "rb");
$query = ($fp ? fread($fp, 1e6) : false);
} elseif ($_FILES["sql_file"]["error"] != 4) { // 4 - 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", 2 * strlen($query) + memory_get_usage() + 8e6); // @ - may be disabled, 2 - substr and trim, 8e6 - other variables
@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 && (!$history || end($history) != $query)) { // don't add repeated and big queries
$history[] = $query;
}
$space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)";
if (!ini_bool("session.use_cookies")) {
session_write_close();
if ($query != "" && strlen($query) < 1e6) { // don't add big queries
$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());
set_session("queries", $history_all); // required because reference is unlinked by stop_session()
stop_session();
}
}
$space = "(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";
$delimiter = ";";
$offset = 0;
$empty = true;
@@ -40,133 +54,182 @@ if (!$error && $_POST) {
$connection2->select_db(DB);
}
$commands = 0;
$errors = "";
$errors = array();
$line = 0;
$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('~^\\s*DELIMITER\\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 {
preg_match('(' . preg_quote($delimiter) . '|[\'`"]|/\\*|-- |#|$)', $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
$found = $match[0][0];
$offset = $match[0][1] + strlen($found);
preg_match('(' . preg_quote($delimiter) . "\\s*|$parse)", $query, $match, PREG_OFFSET_CAPTURE, $offset); // should always match
list($found, $pos) = $match[0];
if (!$found && $fp && !feof($fp)) {
$query .= fread($fp, 1e5);
} else {
if (!$found && rtrim($query) == "") {
break;
}
if (!$found || $found == $delimiter) { // end of a query
$offset = $pos + strlen($found);
if ($found && rtrim($found) != $delimiter) { // find matching quote or comment end
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);
} else {
$offset = $match[0][1] + strlen($s);
if ($s[0] != "\\") {
break;
}
}
}
} else { // end of a query
$empty = false;
$q = substr($query, 0, $match[0][1]);
$q = substr($query, 0, $pos);
$commands++;
echo "<pre class='jush-$jush' id='sql-$commands'>" . shorten_utf8(trim($q), 1000) . "</pre>\n";
ob_flush();
flush(); // can take a long time - show the running query
$start = explode(" ", microtime()); // microtime(true) is available since PHP 5
$print = "<pre id='sql-$commands'><code class='jush-$jush'>" . shorten_utf8(trim($q), 1000) . "</code></pre>\n";
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)) {
echo "<p class='error'>" . lang('Error in query') . ": " . error() . "\n";
$errors .= " <a href='#sql-$commands'>$commands</a>";
if ($_POST["error_stops"]) {
break;
}
} else {
if (is_object($connection2) && preg_match("~^$space*(USE)\\b~isU", $q)) {
$connection2->query($q);
}
do {
$result = $connection->store_result();
$end = explode(" ", microtime());
$time = " <span class='time'>(" . lang('%.3f s', max(0, $end[0] - $start[0] + $end[1] - $start[1])) . ")</span>";
if (is_object($result)) {
select($result, $connection2);
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(true);
$time = " <span class='time'>(" . format_time($start, $end) . ")</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
;
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;
if ($connection2 && preg_match("~^($space|\\()*SELECT\\b~isU", $q)) {
$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>\n";
echo ", <a href='#$id' onclick=\"return !toggle('$id');\">EXPLAIN</a>$export";
echo "<div id='$id' class='hidden'>\n";
select(explain($connection2, $q));
select($explain, $connection2, $orgtables);
echo "</div>\n";
} else {
echo $export;
}
} else {
if (preg_match("~^$space*(CREATE|DROP|ALTER)$space+(DATABASE|SCHEMA)\\b~isU", $q)) {
restart_session();
set_session("dbs", null); // clear cache
session_write_close();
}
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";
}
$start = $end;
} while ($connection->next_result());
}
}
$start = $end;
} while ($connection->next_result());
$line += substr_count($q.$found, "\n");
$query = substr($query, $offset);
$offset = 0;
} else { // find matching quote or comment end
while (preg_match('~' . ($found == '/*' ? '\\*/' : (ereg('-- |#', $found) ? "\n" : "$found|\\\\.")) . '|$~s', $query, $match, PREG_OFFSET_CAPTURE, $offset)) { //! respect sql_mode NO_BACKSLASH_ESCAPES
$s = $match[0][0];
$offset = $match[0][1] + strlen($s);
if (!$s && $fp && !feof($fp)) {
$query .= fread($fp, 1e6);
} elseif ($s[0] != "\\") {
break;
}
}
}
}
}
}
if ($errors && $commands > 1) {
echo "<p class='error'>" . lang('Error in query') . ": $errors\n";
}
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));
echo " <span class='time'>(" . format_time($total_start, microtime(true)) . ")</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";
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
<p><?php
$q = $_GET["sql"]; // overwrite $q from if ($_POST) to save memory
if ($_POST) {
$q = $_POST["query"];
} elseif ($_GET["history"] != "") {
$q = $history[$_GET["history"]];
}
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">' : lang('File uploads are disabled.'));
?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Execute'); ?>" title="Ctrl+Enter">
<form action="" method="post" enctype="multipart/form-data" id="form">
<?php
echo checkbox("error_stops", 1, $_POST["error_stops"], lang('Stop on error'));
print_fieldset("webfile", lang('From server'), $_POST["webfile"]);
$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 ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
echo "<p>$execute\n";
} else {
echo "<fieldset><legend>" . lang('File upload') . "</legend><div>";
echo (ini_bool("file_uploads")
? '<input type="file" name="sql_file[]" multiple> (&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.')
);
echo "\n$execute";
echo "</div></fieldset>\n";
echo "<fieldset><legend>" . lang('From server') . "</legend><div>";
echo lang('Webserver file %s', "<code>adminer.sql" . (extension_loaded("zlib") ? "[.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["only_errors"], 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) {
//! save and display timestamp
echo '<a href="' . h(ME . "sql=&history=$key") . '">' . lang('Edit') . "</a> <code class='jush-$jush'>" . shorten_utf8(ltrim(str_replace("\n", " ", str_replace("\r", "", preg_replace('~^(#|-- ).*~m', '', $val)))), 80, "</code>") . "<br>\n";
for ($val = end($history); $val; $val = prev($history)) { // not array_reverse() to save memory
$key = key($history);
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
}
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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 B

After

Width:  |  Height:  |  Size: 82 B

View File

@@ -1,25 +1,35 @@
/** @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: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; }
td table { width: 100%; 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; }
th { background: #eee; text-align: left; }
thead th { text-align: center; }
thead th { text-align: center; padding: .2em .5em; }
thead td, thead th { background: #ddf; }
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; }
td img { max-width: 200px; max-height: 200px; }
code { background: #eee; }
tr:hover td, tr:hover th { background: #ddf; }
tbody tr:hover td, tbody tr:hover th { background: #eee; }
pre { margin: 1em 0 0; }
pre, textarea { font: 100%/1.25 monospace; }
input[type=image] { vertical-align: middle; }
input.default { box-shadow: 1px 1px 1px #777; }
input.required { box-shadow: 1px 1px 1px red; }
.block { display: block; }
.version { color: #777; font-size: 67%; }
.js .hidden { display: none; }
.js .hidden, .nojs .jsonly { display: none; }
.js .column { position: absolute; background: #ddf; padding: .27em 1ex .3em 0; margin-top: -.27em; }
.nowrap td, .nowrap th, td.nowrap { white-space: pre; }
.wrap td { white-space: normal; }
.error { color: red; background: #fee; }
@@ -31,24 +41,58 @@ pre { margin: 1em 0 0; }
.enum { color: #007F7F; }
.binary { color: red; }
.odd td { background: #F5F5F5; }
.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; }
#menu { position: absolute; margin: 10px 0 0; padding: 0 0 30px 0; top: 2em; left: 0; width: 19em; overflow: auto; overflow-y: hidden; white-space: nowrap; }
.options select { width: 20ex; width: auto\9; }
.view { font-style: italic; }
.active { font-weight: bold; }
.sqlarea { width: 98%; }
.icon { width: 18px; height: 18px; background-color: navy; }
.icon:hover { background-color: red; }
.size { width: 6ex; }
.help { cursor: help; }
.pages { position: fixed; bottom: 0; left: 21em; padding: 5px; background: #ddf; border: 1px solid #999; }
.links a { white-space: nowrap; margin-right: 20px; }
.logout { margin-top: .5em; position: absolute; top: 0; right: 0; }
#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; }
#dbs { overflow: hidden; }
#logins, #tables { white-space: nowrap; overflow: auto; }
#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; }
#h1 { color: #777; text-decoration: none; font-style: italic; }
#version { font-size: 67%; color: red; }
#schema { margin-left: 60px; position: relative; }
#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 #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 #content { margin-right: 10px; }
.rtl #breadcrumb { right: auto; }
}
@media print {
#lang, #menu { display: none; }
#content { margin-left: 1em; }
#breadcrumb { left: 1em; }
.nowrap td, .nowrap th, td.nowrap { white-space: normal; }
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

After

Width:  |  Height:  |  Size: 79 B

View File

@@ -2,44 +2,35 @@
/** Load syntax highlighting
* @param string first three characters of database system version
* @param string 'http' or 'https' - used after compilation
*/
function bodyLoad(version, protocol) {
var jushRoot = '../externals/jush/';
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"';
jush.urls.sql[0] = 'http://dev.mysql.com/doc/refman/' + version + '/en/$key';
jush.urls.sql_sqlset = jush.urls.sql[0];
jush.urls.sqlset[0] = jush.urls.sql[0];
jush.urls.sqlstatus[0] = jush.urls.sql[0];
jush.urls.pgsql[0] = 'http://www.postgresql.org/docs/' + version + '/static/$key';
jush.urls.pgsql_pgsqlset = jush.urls.pgsql[0];
jush.urls.pgsqlset[0] = 'http://www.postgresql.org/docs/' + version + '/static/runtime-config-$key.html#GUC-$1';
jush.style(jushRoot + 'jush.css');
if (window.jushLinks) {
jush.custom_links = jushLinks;
function bodyLoad(version) {
if (window.jush) {
jush.create_links = ' target="_blank" rel="noreferrer"';
for (var key in jush.urls) {
var obj = jush.urls;
if (typeof obj[key] != 'string') {
obj = obj[key];
key = 0;
}
jush.highlight_tag('pre', 0);
jush.highlight_tag('code');
obj[key] = obj[key]
.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;
}
};
document.body.appendChild(script);
}
/** Get value of select
* @param HTMLSelectElement
* @return string
*/
function selectValue(select) {
return select.value || select.options[select.selectedIndex].text;
jush.highlight_tag('code', 0);
var tags = document.getElementsByTagName('textarea');
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);
}
}
}
}
}
/** Get value of dynamically created form field
@@ -48,6 +39,7 @@ function selectValue(select) {
* @return HTMLElement
*/
function formField(form, name) {
// required in IE < 8, form.elements[name] doesn't work
for (var i=0; i < form.length; i++) {
if (form[i].name == name) {
return form[i];
@@ -66,16 +58,117 @@ function typePassword(el, disable) {
}
}
/** Hide or show some login rows for selected driver
* @param HTMLSelectElement
*/
function loginDriver(driver) {
var trs = parentTag(driver, 'table').rows;
for (var i=1; i < trs.length - 1; i++) {
alterClass(trs[i], 'hidden', /sqlite/.test(driver.value));
}
}
var dbCtrl;
var dbPrevious = {};
/** Check if database should be opened to a new window
* @param MouseEvent
* @param HTMLSelectElement
*/
function dbMouseDown(event, el) {
dbCtrl = isCtrl(event);
if (dbPrevious[el.name] == undefined) {
dbPrevious[el.name] = el.value;
}
}
/** Load database after selecting it
* @param HTMLSelectElement
*/
function dbChange(el) {
if (dbCtrl) {
el.form.target = '_blank';
}
el.form.submit();
el.form.target = '';
if (dbCtrl && dbPrevious[el.name] != undefined) {
el.value = dbPrevious[el.name];
dbPrevious[el.name] = undefined;
}
}
/** Check whether the query will be executed with index
* @param HTMLFormElement
*/
function selectFieldChange(form) {
var ok = (function () {
var inputs = form.getElementsByTagName('input');
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 group = false;
var columns = {};
for (var i=0; i < selects.length; i++) {
var select = selects[i];
var col = selectValue(select);
var match = /^(where.+)col\]/.exec(select.name);
if (match) {
var op = selectValue(form[match[1] + 'op]']);
var val = form[match[1] + 'val]'].value;
if (col in indexColumns && (!/LIKE|REGEXP/.test(op) || (op == 'LIKE' && val.charAt(0) != '%'))) {
return true;
} else if (col || val) {
ok = false;
}
}
if ((match = /^(columns.+)fun\]/.exec(select.name))) {
if (/^(avg|count|count distinct|group_concat|max|min|sum)$/.test(col)) {
group = true;
}
var val = selectValue(form[match[1] + 'col]']);
if (val) {
columns[col && col != 'count' ? '' : val] = 1;
}
}
if (col && /^order/.test(select.name)) {
if (!(col in indexColumns)) {
ok = false;
}
break;
}
}
if (group) {
for (var col in columns) {
if (!(col in indexColumns)) {
ok = false;
}
}
}
return ok;
})();
setHtml('noindex', (ok ? '' : '!'));
}
var added = '.', rowCount;
/** Escape string to use in regular expression
/** Check if val is equal to a-delimiter-b where delimiter is '_', '' or big letter
* @param string
* @return string
* @param string
* @param string
* @return boolean
*/
function reEscape(s) {
return s.replace(/[\[\]\\^$*+?.(){|}]/, '\\$&');
function delimiterEqual(val, a, b) {
return (val == a + '_' + b || val == a + b || val == a + b.charAt(0).toUpperCase() + b.substr(1));
}
/** Escape string to use as identifier
@@ -93,33 +186,28 @@ function editingNameChange(field) {
var name = field.name.substr(0, field.name.length - 7);
var type = formField(field.form, name + '[type]');
var opts = type.options;
var table = reEscape(field.value);
var column = '';
var match;
if ((match = /(.+)_(.+)/.exec(table)) || (match = /(.*[a-z])([A-Z].*)/.exec(table))) { // limited to single word columns
table = match[1];
column = match[2];
}
var plural = '(?:e?s)?';
var tabCol = table + plural + '_?' + column;
var re = new RegExp('(^' + idfEscape(table + plural) + '`' + idfEscape(column) + '$' // table_column
+ '|^' + idfEscape(tabCol) + '`' // table
+ '|^' + idfEscape(column + plural) + '`' + idfEscape(table) + '$' // column_table
+ ')|`' + idfEscape(tabCol) + '$' // column
, 'i');
var candidate; // don't select anything with ambiguous match (like column `id`)
var val = field.value;
for (var i = opts.length; i--; ) {
if (!/`/.test(opts[i].value)) { // common type
if (i == opts.length - 2 && candidate && !match[1] && name == 'fields[1]') { // single target table, link to column, first field - probably `id`
return false;
var match = /(.+)`(.+)/.exec(opts[i].value);
if (!match) { // common type
if (candidate && i == opts.length - 2 && val == opts[candidate].value.replace(/.+`/, '') && name == 'fields[1]') { // single target table, link to column, first field - probably `id`
return;
}
break;
}
if (match = re.exec(opts[i].value)) {
if (candidate) {
return false;
var table = match[1];
var column = match[2];
var tables = [ table, table.replace(/s$/, ''), table.replace(/es$/, '') ];
for (var j=0; j < tables.length; j++) {
table = tables[j];
if (val == column || val == table || delimiterEqual(val, table, column) || delimiterEqual(val, column, table)) {
if (candidate) {
return;
}
candidate = i;
break;
}
candidate = i;
}
}
if (candidate) {
@@ -131,21 +219,17 @@ function editingNameChange(field) {
/** Add table row for next field
* @param HTMLInputElement
* @param boolean
* @param boolean
* @return boolean
*/
function editingAddRow(button, allowed, focus) {
if (allowed && rowCount >= allowed) {
return false;
}
var match = /([0-9]+)(\.[0-9]+)?/.exec(button.name);
function editingAddRow(button, focus) {
var match = /(\d+)(\.\d+)?/.exec(button.name);
var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
var row = button.parentNode.parentNode;
var row2 = row.cloneNode(true);
var row = parentTag(button, 'tr');
var row2 = cloneNode(row);
var tags = row.getElementsByTagName('select');
var tags2 = row2.getElementsByTagName('select');
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');
@@ -167,11 +251,15 @@ function editingAddRow(button, allowed, focus) {
tags[0].onchange = function () {
editingNameChange(tags[0]);
};
tags[0].onkeyup = function () {
};
row.parentNode.insertBefore(row2, row.nextSibling);
if (focus) {
input.onchange = function () {
editingNameChange(input);
};
input.onkeyup = function () {
};
input.focus();
}
added += '0';
@@ -181,12 +269,13 @@ function editingAddRow(button, allowed, focus) {
/** Remove table row for field
* @param HTMLInputElement
* @param string
* @return boolean
*/
function editingRemoveRow(button) {
var field = formField(button.form, button.name.replace(/drop_col(.+)/, 'fields$1[field]'));
function editingRemoveRow(button, name) {
var field = formField(button.form, button.name.replace(/[^\[]+(.+)/, name));
field.parentNode.removeChild(field);
button.parentNode.parentNode.style.display = 'none';
parentTag(button, 'tr').style.display = 'none';
return true;
}
@@ -200,25 +289,39 @@ function editingTypeChange(type) {
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.onchange.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|float|double|decimal)$/.test(text));
}
if (el.name == name + '[on_update]') {
alterClass(el, 'hidden', text != 'timestamp');
}
if (el.name == name + '[on_delete]') {
el.className = (/`/.test(text) ? '' : 'hidden');
alterClass(el, 'hidden', !/`/.test(text));
}
}
helpClose();
}
/** Mark length as required
* @param HTMLInputElement
*/
function editingLengthChange(el) {
alterClass(el, 'required', !el.value.length && /var(char|binary)$/.test(selectValue(el.parentNode.previousSibling.firstChild)));
}
/** Edit enum or set
@@ -229,7 +332,7 @@ function editingLengthFocus(field) {
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);
edit.value = (/^'.+'$/.test(val) ? val.substr(1, val.length - 2).replace(/','/g, "\n").replace(/''/g, "'") : val); //! doesn't handle 'a'',''b' correctly
td.appendChild(edit);
field.style.display = 'none';
edit.style.display = 'inline';
@@ -243,7 +346,7 @@ function editingLengthFocus(field) {
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);
field.value = (/^'[^\n]+'$/.test(val) ? val : "'" + val.replace(/\n+$/, '').replace(/'/g, "''").replace(/\n/g, "','") + "'");
field.style.display = 'inline';
edit.style.display = 'none';
}
@@ -255,7 +358,16 @@ function editingLengthBlur(edit) {
function columnShow(checked, column) {
var trs = document.getElementById('edit-fields').getElementsByTagName('tr');
for (var i=0; i < trs.length; i++) {
trs[i].getElementsByTagName('td')[column].className = (checked ? '' : 'hidden');
alterClass(trs[i].getElementsByTagName('td')[column], 'hidden', !checked);
}
}
/** Hide column with default values in narrow window
*/
function editingHideDefaults() {
if (innerWidth < document.documentElement.scrollWidth) {
document.getElementById('form')['defaults'].checked = false;
columnShow(false, 5);
}
}
@@ -264,17 +376,18 @@ function columnShow(checked, column) {
*/
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');
alterClass(el.form['partitions'], 'hidden', partitionTable || !el.selectedIndex);
alterClass(document.getElementById('partition-table'), 'hidden', !partitionTable);
helpClose();
}
/** Add next partition row
* @param HTMLInputElement
*/
function partitionNameChange(el) {
var row = el.parentNode.parentNode.cloneNode(true);
var row = cloneNode(parentTag(el, 'tr'));
row.firstChild.firstChild.value = '';
el.parentNode.parentNode.parentNode.appendChild(row);
parentTag(el, 'table').appendChild(row);
el.onchange = function () {};
}
@@ -284,14 +397,14 @@ function partitionNameChange(el) {
* @param HTMLSelectElement
*/
function foreignAddRow(field) {
var row = field.parentNode.parentNode.cloneNode(true);
field.onchange = function () { };
var row = cloneNode(parentTag(field, 'tr'));
var selects = row.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/\]/, '1$&');
selects[i].selectedIndex = 0;
}
field.parentNode.parentNode.parentNode.appendChild(row);
field.onchange = function () { };
parentTag(field, 'table').appendChild(row);
}
@@ -300,50 +413,77 @@ function foreignAddRow(field) {
* @param HTMLSelectElement
*/
function indexesAddRow(field) {
var row = field.parentNode.parentNode.cloneNode(true);
var spans = row.getElementsByTagName('span');
for (var i=0; i < spans.length - 1; i++) {
row.removeChild(spans[i]);
}
field.onchange = function () { };
var row = cloneNode(parentTag(field, 'tr'));
var selects = row.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/indexes\[[0-9]+/, '$&1');
selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
selects[i].selectedIndex = 0;
}
var input = row.getElementsByTagName('input')[0];
input.name = input.name.replace(/indexes\[[0-9]+/, '$&1');
input.value = '';
field.parentNode.parentNode.parentNode.appendChild(row);
field.onchange = function () { };
var inputs = row.getElementsByTagName('input');
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);
}
/** Change column in index
* @param HTMLSelectElement
* @param string name prefix
*/
function indexesChangeColumn(field, prefix) {
var columns = parentTag(field, 'td').getElementsByTagName('select');
var names = [];
for (var i=0; i < columns.length; i++) {
var value = selectValue(columns[i]);
if (value) {
names.push(value);
}
}
field.form[field.name.replace(/\].*/, '][name]')].value = prefix + names.join('_');
}
/** Add column for index
* @param HTMLSelectElement
* @param string name prefix
*/
function indexesAddColumn(field) {
var column = field.parentNode.cloneNode(true);
var select = column.getElementsByTagName('select')[0];
select.name = select.name.replace(/\]\[[0-9]+/, '$&1');
function indexesAddColumn(field, prefix) {
field.onchange = function () {
indexesChangeColumn(field, prefix);
};
var select = field.form[field.name.replace(/\].*/, '][type]')];
if (!select.selectedIndex) {
while (selectValue(select) != "INDEX" && select.selectedIndex < select.options.length) {
select.selectedIndex++;
}
select.onchange();
}
var column = cloneNode(field.parentNode);
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(/\]\[[0-9]+/, '$&1');
input.name = input.name.replace(/\]\[\d+/, '$&1');
input.value = '';
field.parentNode.parentNode.appendChild(column);
field.onchange = function () { };
parentTag(field, 'td').appendChild(column);
field.onchange();
}
var that, x, y, em, tablePos;
var that, x, y; // em and tablePos defined in schema.inc.php
/** Get mouse position
* @param HTMLElement
* @param MouseEvent
*/
function schemaMousedown(el, event) {
that = el;
x = event.clientX - el.offsetLeft;
y = event.clientY - el.offsetTop;
if ((event.which ? event.which : event.button) == 1) {
that = el;
x = event.clientX - el.offsetLeft;
y = event.clientY - el.offsetTop;
}
}
/** Move object
@@ -358,10 +498,9 @@ function schemaMousemove(ev) {
var lineSet = { };
for (var i=0; i < divs.length; i++) {
if (divs[i].className == 'references') {
var div2 = document.getElementById((divs[i].id.substr(0, 4) == 'refs' ? 'refd' : 'refs') + divs[i].id.substr(4));
var div2 = document.getElementById((/^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 isTop = true;
var id = divs[i].id.replace(/^ref.(.+)-.+/, '$1');
if (divs[i].parentNode != div2.parentNode) {
left1 = Math.min(0, ref[1] - left) - 1;
@@ -370,19 +509,17 @@ function schemaMousemove(ev) {
var left2 = Math.min(0, left - ref[1]) - 1;
div2.style.left = left2 + 'em';
div2.getElementsByTagName('div')[0].style.width = -left2 + 'em';
isTop = (div2.offsetTop + ref[0] * em > divs[i].offsetTop + top * em);
}
if (!lineSet[id]) {
var line = document.getElementById(divs[i].id.replace(/^....(.+)-[0-9]+$/, 'refl$1'));
var shift = ev.clientY - y - that.offsetTop;
line.style.left = (left + left1) + 'em';
if (isTop) {
line.style.top = (line.offsetTop + shift) / em + 'em';
}
var line = document.getElementById(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) {
line = line.getElementsByTagName('div')[0];
line.style.height = (line.offsetHeight + (isTop ? -1 : 1) * shift) / em + 'em';
top2 += ref[0] - top;
line.getElementsByTagName('div')[0].style.height = Math.abs(top1 - top2) + 'em';
}
line.style.left = (left + left1) + 'em';
line.style.top = Math.min(top1, top2) + 'em';
lineSet[id] = true;
}
}
@@ -394,8 +531,9 @@ function schemaMousemove(ev) {
/** Finish move
* @param MouseEvent
* @param string
*/
function schemaMouseup(ev) {
function schemaMouseup(ev, db) {
if (that !== undefined) {
ev = ev || event;
tablePos[that.firstChild.firstChild.firstChild.data] = [ (ev.clientY - y) / em, (ev.clientX - x) / em ];
@@ -404,30 +542,53 @@ function schemaMouseup(ev) {
for (var key in tablePos) {
s += '_' + key + ':' + Math.round(tablePos[key][0] * 10000) / 10000 + 'x' + Math.round(tablePos[key][1] * 10000) / 10000;
}
cookie('adminer_schema=' + encodeURIComponent(s.substr(1)), 30, '; path="' + location.pathname + location.search + '"');
s = encodeURIComponent(s.substr(1));
var link = document.getElementById('schema-link');
link.href = link.href.replace(/[^=]+$/, '') + s;
cookie('adminer_schema-' + db + '=' + s, 30); //! special chars in db
}
}
/** Handle Tab and Ctrl+Enter in textarea
* @param HTMLTextAreaElement
* @param KeyboardEvent
* @return boolean
var helpOpen, helpIgnore; // when mouse outs <option> then it mouse overs border of <select> - ignore it
/** Display help
* @param HTMLElement
* @param MouseEvent
* @param string
* @param bool display on left side (otherwise on top)
*/
function textareaKeydown(target, event) {
if (event.keyCode == 9 && !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey) {
// inspired by http://pallieter.org/Projects/insertTab/
if (target.setSelectionRange) {
var start = target.selectionStart;
target.value = target.value.substr(0, start) + '\t' + target.value.substr(target.selectionEnd);
target.setSelectionRange(start + 1, start + 1);
return false; //! still loses focus in Opera, can be solved by handling onblur
} else if (target.createTextRange) {
document.selection.createRange().text = '\t';
return false;
}
function helpMouseover(el, event, text, side) {
var target = getTarget(event);
if (!text) {
helpClose();
} else if (window.jush && (!helpIgnore || el != target)) {
helpOpen = 1;
var help = document.getElementById('help');
help.innerHTML = text;
jush.highlight_tag([ help ]);
alterClass(help, 'hidden');
var rect = target.getBoundingClientRect();
help.style.top = (rect.top - (side ? (help.offsetHeight - target.offsetHeight) / 2 : help.offsetHeight)) + 'px';
help.style.left = (rect.left - (side ? help.offsetWidth : (help.offsetWidth - target.offsetWidth) / 2)) + 'px';
}
if (event.ctrlKey && (event.keyCode == 13 || event.keyCode == 10) && !event.altKey && !event.metaKey) { // shiftKey allowed
target.form.submit();
}
return true;
}
/** Close help after timeout
* @param HTMLElement
* @param MouseEvent
*/
function helpMouseout(el, event) {
helpOpen = 0;
helpIgnore = (el != getTarget(event));
setTimeout(function () {
if (!helpOpen) {
helpClose();
}
}, 200);
}
/** Close help
*/
function helpClose() {
alterClass(document.getElementById('help'), 'hidden', true);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 318 B

View File

@@ -1,5 +1,12 @@
// to hide elements displayed by JavaScript
document.body.className = 'js';
/** Add or remove CSS class
* @param HTMLElement
* @param string
* @param [bool]
*/
function alterClass(el, className, enable) {
el.className = el.className.replace(RegExp('(^|\\s)' + className + '(\\s|$)'), '$2') + (enable ? ' ' + className : '');
}
/** Toggle visibility
* @param string
@@ -16,20 +23,96 @@ function toggle(id) {
* @param number
* @param string optional
*/
function cookie(assign, days, params) {
function cookie(assign, days) {
var date = new Date();
date.setDate(date.getDate() + days);
document.cookie = assign + '; expires=' + date + (params || '');
document.cookie = assign + '; expires=' + date;
}
/** Verify current Adminer version
* @param string 'http' or 'https'
* @param string
*/
function verifyVersion(protocol) {
function verifyVersion(current) {
cookie('adminer_version=0', 1);
var script = document.createElement('script');
script.src = protocol + '://www.adminer.org/version.php';
document.body.appendChild(script);
var iframe = document.createElement('iframe');
iframe.src = location.protocol + '//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 == location.protocol + '//www.adminer.org') {
var match = /version=(.+)/.exec(event.data);
if (match) {
cookie('adminer_version=' + match[1], 1);
}
}
}, false);
}
document.getElementById('version').appendChild(iframe);
}
/** Get value of select
* @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);
}
/** 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 re.test(el.tagName);
}
/** Get parent node with specified tag name
* @param HTMLElement
* @param string regular expression
* @return HTMLElement
*/
function parentTag(el, tag) {
while (el && !isTag(el, tag)) {
el = el.parentNode;
}
return el;
}
/** Set checked class
* @param HTMLInputElement
*/
function trCheck(el) {
var tr = parentTag(el, 'tr');
alterClass(tr, 'checked', el.checked);
if (el.form && el.form['all']) {
el.form['all'].onclick();
}
}
/** Fill number of selected items
* @param string
* @param string
*/
function selectCount(id, count) {
setHtml(id, (count === '' ? '' : '(' + (count + '').replace(/\B(?=(\d{3})+$)/g, ' ') + ')'));
var inputs = document.getElementById(id).parentNode.parentNode.getElementsByTagName('input');
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
@@ -41,6 +124,21 @@ function formCheck(el, name) {
for (var i=0; i < elems.length; i++) {
if (name.test(elems[i].name)) {
elems[i].checked = el.checked;
trCheck(elems[i]);
}
}
}
/** 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);
}
}
}
}
@@ -49,7 +147,9 @@ function formCheck(el, name) {
* @param string
*/
function formUncheck(id) {
document.getElementById(id).checked = false;
var el = document.getElementById(id);
el.checked = false;
trCheck(el);
}
/** Get number of checked elements matching given name
@@ -70,18 +170,61 @@ function formChecked(el, name) {
/** Select clicked row
* @param MouseEvent
* @param [boolean] force click
*/
function tableClick(event) {
var el = event.target || event.srcElement;
while (!/^tr$/i.test(el.tagName)) {
if (/^(table|a|input|textarea)$/i.test(el.tagName)) {
return;
function tableClick(event, click) {
click = (click || !window.getSelection || getSelection().isCollapsed);
var el = getTarget(event);
while (!isTag(el, 'tr')) {
if (isTag(el, 'table|a|input|textarea')) {
if (el.type != 'checkbox') {
return;
}
checkboxClick(event, el);
click = false;
}
el = el.parentNode;
}
el = el.firstChild.firstChild;
el.click && el.click();
el.onclick && el.onclick();
if (click) {
el.checked = !el.checked;
el.onclick && el.onclick();
}
trCheck(el);
}
var lastChecked;
/** Shift-click on checkbox for multiple selection.
* @param MouseEvent
* @param HTMLInputElement
*/
function checkboxClick(event, el) {
if (!el.name) {
return;
}
if (event.shiftKey && (!lastChecked || lastChecked.name == el.name)) {
var checked = (lastChecked ? lastChecked.checked : true);
var inputs = parentTag(el, 'table').getElementsByTagName('input');
var checking = !lastChecked;
for (var i=0; i < inputs.length; i++) {
var input = inputs[i];
if (input.name === el.name) {
if (checking) {
input.checked = checked;
trCheck(input);
}
if (input === el || input === lastChecked) {
if (checking) {
break;
}
checking = true;
}
}
}
} else {
lastChecked = el;
}
}
/** Set HTML code of an element
@@ -99,44 +242,350 @@ function setHtml(id, html) {
}
}
/** Find node position
* @param Node
* @return number
*/
function nodePosition(el) {
var pos = 0;
while (el = el.previousSibling) {
pos++;
}
return pos;
}
/** Go to the specified page
* @param string
* @param string
* @param [MouseEvent]
*/
function pageClick(href, page, event) {
if (!isNaN(page) && page) {
href += (page != 1 ? '&page=' + (page - 1) : '');
location.href = href;
}
}
/** Display items in menu
* @param HTMLElement
* @param MouseEvent
*/
function menuOver(el, event) {
var a = getTarget(event);
if (isTag(a, 'a|span') && a.offsetLeft + a.offsetWidth > a.parentNode.offsetWidth - 15) { // 15 - ellipsis
el.style.overflow = 'visible';
}
}
/** Hide items in menu
* @param HTMLElement
*/
function menuOut(el) {
el.style.overflow = 'auto';
}
/** Add row in select fieldset
* @param HTMLSelectElement
*/
function selectAddRow(field) {
var row = field.parentNode.cloneNode(true);
field.onchange = function () {
selectFieldChange(field.form);
};
field.onchange();
var row = cloneNode(field.parentNode);
var selects = row.getElementsByTagName('select');
for (var i=0; i < selects.length; i++) {
selects[i].name = selects[i].name.replace(/[a-z]\[[0-9]+/, '$&1');
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]\[[0-9]+/, '$&1');
inputs[0].value = '';
inputs[0].className = '';
for (var i=0; i < inputs.length; i++) {
inputs[i].name = inputs[i].name.replace(/[a-z]\[\d+/, '$&1');
inputs[i].value = '';
inputs[i].className = '';
}
field.parentNode.parentNode.appendChild(row);
field.onchange = function () { };
}
/** Prevent onsearch handler on Enter
* @param HTMLInputElement
* @param KeyboardEvent
*/
function selectSearchKeydown(el, event) {
if (event.keyCode == 13 || event.keyCode == 10) {
el.onsearch = function () {
};
}
}
/** Clear column name after resetting search
* @param HTMLInputElement
*/
function selectSearchSearch(el) {
if (!el.value) {
el.parentNode.firstChild.selectedIndex = 0;
}
}
/** Toggles column context menu
* @param HTMLElement
* @param [string] extra class name
*/
function columnMouse(el, className) {
var spans = el.getElementsByTagName('span');
for (var i=0; i < spans.length; i++) {
if (/column/.test(spans[i].className)) {
spans[i].className = 'column' + (className || '');
}
}
}
/** Fill column in search field
* @param string
*/
function selectSearch(name) {
var el = document.getElementById('fieldset-search');
el.className = '';
var divs = el.getElementsByTagName('div');
for (var i=0; i < divs.length; i++) {
var div = divs[i];
if (isTag(div.firstChild, 'select') && selectValue(div.firstChild) == name) {
break;
}
}
if (i == divs.length) {
div.firstChild.value = name;
div.firstChild.onchange();
}
div.lastChild.focus();
}
/** Check if Ctrl key (Command key on Mac) was pressed
* @param KeyboardEvent|MouseEvent
* @return boolean
*/
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>
* @param KeyboardEvent
* @param [string]
* @return boolean
*/
function bodyKeydown(event, button) {
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 {
target.form.submit();
}
target.focus();
return false;
}
return true;
}
/** Open form to a new window on Ctrl+click or Shift+click
* @param MouseEvent
*/
function bodyClick(event) {
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
target.form.target = '';
}, 0);
}
}
/** Change focus by Ctrl+Up or Ctrl+Down
* @param KeyboardEvent
* @return boolean
*/
function editingKeydown(event) {
if ((event.keyCode == 40 || event.keyCode == 38) && isCtrl(event)) { // 40 - Down, 38 - Up
var target = getTarget(event);
var sibling = (event.keyCode == 40 ? 'nextSibling' : 'previousSibling');
var el = target.parentNode.parentNode[sibling];
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
*/
function functionChange(select) {
var input = select.form[select.name.replace(/^function/, 'fields')];
if (selectValue(select)) {
if (input.origType === undefined) {
input.origType = input.type;
input.origMaxLength = input.maxLength;
}
input.removeAttribute('maxlength');
input.type = 'text';
} else if (input.origType) {
input.type = input.origType;
if (input.origMaxLength >= 0) {
input.maxLength = input.origMaxLength;
}
}
helpClose();
}
/** Call this.onchange() if value changes
* @this HTMLInputElement
*/
function keyupChange() {
if (this.value != this.getAttribute('value')) {
this.onchange();
this.setAttribute('value', this.value);
}
}
/** Create AJAX request
* @param string
* @param function (XMLHttpRequest)
* @param [string]
* @return XMLHttpRequest or false in case of an error
*/
function ajax(url, callback, data) {
var request = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : false));
if (request) {
request.open((data ? 'POST' : 'GET'), url);
if (data) {
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
request.onreadystatechange = function () {
if (request.readyState == 4) {
callback(request);
}
};
request.send(data);
}
return request;
}
/** Use setHtml(key, value) for JSON response
* @param string
* @return XMLHttpRequest or false in case of an error
*/
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]);
}
}
});
}
/** 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('&');
setHtml('message', '<div class="message">' + message + '</div>');
var url = form.action;
if (!/post/i.test(form.method)) {
url = url.replace(/\?.*/, '') + '?' + data;
data = '';
}
return ajax(url, function (request) {
setHtml('message', request.responseText);
if (window.jush) {
jush.highlight_tag(document.getElementById('message').getElementsByTagName('code'), 0);
}
}, data);
}
/** Display edit field
* @param HTMLElement
* @param MouseEvent
* @param boolean display textarea instead of input
* @param number display textarea instead of input, 2 - load long text
* @param string warning to display
*/
function selectDblClick(td, event, text) {
var pos = event.rangeOffset;
var value = (td.firstChild.firstChild ? td.firstChild.firstChild.data : (td.firstChild.alt ? td.firstChild.alt : td.firstChild.data));
function selectClick(td, event, text, warning) {
var target = getTarget(event);
if (!isCtrl(event) || isTag(td.firstChild, 'input|textarea') || isTag(target, 'a')) {
return;
}
if (warning) {
return alert(warning);
}
var original = td.innerHTML;
text = text || /\n/.test(original);
var input = document.createElement(text ? 'textarea' : 'input');
input.name = td.id;
input.value = (value == '\u00A0' || td.getElementsByTagName('i').length ? '' : value); // &nbsp; or i - NULL
input.style.width = (td.clientWidth - 14) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
input.onkeydown = function (event) {
if (!event) {
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;
input.style.width = Math.max(td.clientWidth - 14, 20) + 'px'; // 14 = 2 * (td.border + td.padding + input.border)
if (text) {
var rows = 1;
value.replace(/\n/g, function () {
@@ -144,9 +593,12 @@ function selectDblClick(td, event, text) {
});
input.rows = rows;
}
if (value == '\u00A0' || td.getElementsByTagName('i').length) { // &nbsp; or i - NULL
value = '';
}
if (document.selection) {
var range = document.selection.createRange();
range.moveToPoint(event.x, event.y);
range.moveToPoint(event.clientX, event.clientY);
var range2 = range.duplicate();
range2.moveToElementText(td);
range2.setEndPoint('EndToEnd', range);
@@ -154,13 +606,161 @@ function selectDblClick(td, event, text) {
}
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 && request.responseText) {
input.value = request.responseText;
input.name = td.id;
}
});
}
input.value = value;
input.name = td.id;
input.selectionStart = pos;
input.selectionEnd = pos;
if (document.selection) {
var range = document.selection.createRange();
range.moveStart('character', pos);
range.moveEnd('character', -input.value.length + pos);
range.select();
}
td.ondblclick = function () { };
}
/** Load and display next page in select
* @param HTMLLinkElement
* @param number
* @param string
* @return boolean
*/
function selectLoadMore(a, limit, loading) {
var title = a.innerHTML;
var href = a.href;
a.innerHTML = loading;
if (href) {
a.removeAttribute('href');
return ajax(href, function (request) {
var tbody = document.createElement('tbody');
tbody.innerHTML = request.responseText;
document.getElementById('table').appendChild(tbody);
if (tbody.children.length < limit) {
a.parentNode.removeChild(a);
} else {
a.href = href.replace(/\d+$/, function (page) {
return +page + 1;
});
a.innerHTML = title;
}
});
}
}
/** Stop event propagation
* @param Event
*/
function eventStop(event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
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 = parent.getElementsByTagName(key);
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;
}
var inputs = el.form.getElementsByTagName('input');
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);
setupSubmitHighlight(el2);
return el2;
}

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

View File

@@ -4,9 +4,10 @@ $fields = fields($TABLE);
if (!$fields) {
$error = error();
}
$table_status = ($fields ? table_status($TABLE) : array());
$table_status = table_status1($TABLE, true);
page_header(($fields && is_view($table_status) ? lang('View') : lang('Table')) . ": " . h($TABLE), $error);
$adminer->selectLinks($table_status);
$comment = $table_status["Comment"];
if ($comment != "") {
@@ -18,14 +19,17 @@ if ($fields) {
echo "<thead><tr><th>" . lang('Column') . "<td>" . lang('Type') . (support("comment") ? "<td>" . lang('Comment') : "") . "</thead>\n";
foreach ($fields as $field) {
echo "<tr" . odd() . "><th>" . h($field["field"]);
echo "<td>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
echo "<td title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . ($field["null"] ? " <i>NULL</i>" : "") . ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
echo (isset($field["default"]) ? " [<b>" . h($field["default"]) . "</b>]" : "");
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
echo "\n";
}
echo "</table>\n";
if (!is_view($table_status)) {
echo "<h3>" . lang('Indexes') . "</h3>\n";
}
if (!is_view($table_status)) {
if (support("indexes")) {
echo "<h3 id='indexes'>" . lang('Indexes') . "</h3>\n";
$indexes = indexes($TABLE);
if ($indexes) {
echo "<table cellspacing='0'>\n";
@@ -33,50 +37,51 @@ if ($fields) {
ksort($index["columns"]); // enforce correct columns order
$print = array();
foreach ($index["columns"] as $key => $val) {
$print[] = "<i>" . h($val) . "</i>" . ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "");
$print[] = "<i>" . h($val) . "</i>"
. ($index["lengths"][$key] ? "(" . $index["lengths"][$key] . ")" : "")
. ($index["descs"][$key] ? " DESC" : "")
;
}
echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
}
echo "</table>\n";
}
echo '<p><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
if (fk_support($table_status)) {
echo "<h3>" . lang('Foreign keys') . "</h3>\n";
$foreign_keys = foreign_keys($TABLE);
if ($foreign_keys) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . ($jush != "sqlite" ? "<td>&nbsp;" : "") . "</thead>\n";
foreach ($foreign_keys as $name => $foreign_key) {
$link = ($foreign_key["db"] != "" ? "<b>" . h($foreign_key["db"]) . "</b>." : "") . h($foreign_key["table"]);
echo "<tr>";
echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>";
echo "<td><a href='" . h($foreign_key["db"] != "" ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ME) . "table=" . urlencode($foreign_key["table"]) . "'>$link</a>";
echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)";
echo "<td>$foreign_key[on_delete]\n";
echo "<td>$foreign_key[on_update]\n";
if ($jush != "sqlite") {
echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>';
}
}
echo "</table>\n";
}
if ($jush != "sqlite") {
echo '<p><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n";
echo '<p class="links"><a href="' . h(ME) . 'indexes=' . urlencode($TABLE) . '">' . lang('Alter indexes') . "</a>\n";
}
if (fk_support($table_status)) {
echo "<h3 id='foreign-keys'>" . lang('Foreign keys') . "</h3>\n";
$foreign_keys = foreign_keys($TABLE);
if ($foreign_keys) {
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th>" . lang('Source') . "<td>" . lang('Target') . "<td>" . lang('ON DELETE') . "<td>" . lang('ON UPDATE') . "<td>&nbsp;</thead>\n";
foreach ($foreign_keys as $name => $foreign_key) {
echo "<tr title='" . h($name) . "'>";
echo "<th><i>" . implode("</i>, <i>", array_map('h', $foreign_key["source"])) . "</i>";
echo "<td><a href='" . h($foreign_key["db"] != "" ? preg_replace('~db=[^&]*~', "db=" . urlencode($foreign_key["db"]), ME) : ($foreign_key["ns"] != "" ? preg_replace('~ns=[^&]*~', "ns=" . urlencode($foreign_key["ns"]), ME) : ME)) . "table=" . urlencode($foreign_key["table"]) . "'>"
. ($foreign_key["db"] != "" ? "<b>" . h($foreign_key["db"]) . "</b>." : "") . ($foreign_key["ns"] != "" ? "<b>" . h($foreign_key["ns"]) . "</b>." : "") . h($foreign_key["table"])
. "</a>"
;
echo "(<i>" . implode("</i>, <i>", array_map('h', $foreign_key["target"])) . "</i>)";
echo "<td>" . nbsp($foreign_key["on_delete"]) . "\n";
echo "<td>" . nbsp($foreign_key["on_update"]) . "\n";
echo '<td><a href="' . h(ME . 'foreign=' . urlencode($TABLE) . '&name=' . urlencode($name)) . '">' . lang('Alter') . '</a>';
}
echo "</table>\n";
}
if (support("trigger")) {
echo "<h3>" . lang('Triggers') . "</h3>\n";
$triggers = triggers($TABLE);
if ($triggers) {
echo "<table cellspacing='0'>\n";
foreach ($triggers as $key => $val) {
echo "<tr valign='top'><td>$val[0]<td>$val[1]<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n";
}
echo "</table>\n";
}
echo '<p><a href="' . h(ME) . 'trigger=' . urlencode($TABLE) . '">' . lang('Add trigger') . "</a>\n";
}
echo '<p class="links"><a href="' . h(ME) . 'foreign=' . urlencode($TABLE) . '">' . lang('Add foreign key') . "</a>\n";
}
}
if (support(is_view($table_status) ? "view_trigger" : "trigger")) {
echo "<h3 id='triggers'>" . lang('Triggers') . "</h3>\n";
$triggers = triggers($TABLE);
if ($triggers) {
echo "<table cellspacing='0'>\n";
foreach ($triggers as $key => $val) {
echo "<tr valign='top'><td>$val[0]<td>$val[1]<th>" . h($key) . "<td><a href='" . h(ME . 'trigger=' . urlencode($TABLE) . '&name=' . urlencode($key)) . "'>" . lang('Alter') . "</a>\n";
}
echo "</table>\n";
}
echo '<p class="links"><a href="' . h(ME) . 'trigger=' . urlencode($TABLE) . '">' . lang('Add trigger') . "</a>\n";
}

View File

@@ -1,44 +1,48 @@
<?php
$TABLE = $_GET["trigger"];
$name = $_GET["name"];
$trigger_options = trigger_options();
$trigger_event = array("INSERT", "UPDATE", "DELETE");
$row = (array) trigger($name) + array("Trigger" => $TABLE . "_bi");
$dropped = false;
if ($_POST && !$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) {
$timing_event = " $_POST[Timing] $_POST[Event]";
$on = " ON " . table($TABLE);
$dropped = drop_create(
"DROP TRIGGER " . idf_escape($_GET["name"]) . ($jush == "pgsql" ? $on : ""),
"CREATE TRIGGER " . idf_escape($_POST["Trigger"]) . ($jush == "mssql" ? $on . $timing_event : $timing_event . $on) . " $_POST[Type]\n$_POST[Statement]",
ME . "table=" . urlencode($TABLE),
lang('Trigger has been dropped.'),
lang('Trigger has been altered.'),
lang('Trigger has been created.'),
$_GET["name"]
);
}
page_header(($_GET["name"] != "" ? lang('Alter trigger') . ": " . h($_GET["name"]) : lang('Create trigger')), $error, array("table" => $TABLE));
$row = array("Trigger" => $TABLE . "_bi");
if ($_POST) {
if (!$error && in_array($_POST["Timing"], $trigger_options["Timing"]) && in_array($_POST["Event"], $trigger_event) && in_array($_POST["Type"], $trigger_options["Type"])) {
// don't use drop_create() because there may not be more triggers for the same action
$on = " ON " . table($TABLE);
$drop = "DROP TRIGGER " . idf_escape($name) . ($jush == "pgsql" ? $on : "");
$location = ME . "table=" . urlencode($TABLE);
if ($_POST["drop"]) {
query_redirect($drop, $location, lang('Trigger has been dropped.'));
} else {
if ($name != "") {
queries($drop);
}
queries_redirect(
$location,
($name != "" ? lang('Trigger has been altered.') : lang('Trigger has been created.')),
queries(create_trigger($on, $_POST))
);
if ($name != "") {
queries(create_trigger($on, $row + array("Type" => reset($trigger_options["Type"]))));
}
}
}
$row = $_POST;
} elseif ($_GET["name"] != "") {
$row = trigger($_GET["name"]);
}
page_header(($name != "" ? lang('Alter trigger') . ": " . h($name) : lang('Create trigger')), $error, array("table" => $TABLE));
?>
<form action="" method="post" id="form">
<table cellspacing="0">
<tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "if (/^" . h(preg_quote($TABLE, "/")) . "_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '" . h(addcslashes($TABLE, "\r\n'\\")) . "_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"); ?>
<tr><th><?php echo lang('Time'); ?><td><?php echo html_select("Timing", $trigger_options["Timing"], $row["Timing"], "if (/^" . preg_quote($TABLE, "/") . "_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '" . js_escape($TABLE) . "_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"); ?>
<tr><th><?php echo lang('Event'); ?><td><?php echo html_select("Event", $trigger_event, $row["Event"], "this.form['Timing'].onchange();"); ?>
<tr><th><?php echo lang('Type'); ?><td><?php echo html_select("Type", $trigger_options["Type"], $row["Type"]); ?>
</table>
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64">
<p><?php echo lang('Name'); ?>: <input name="Trigger" value="<?php echo h($row["Trigger"]); ?>" maxlength="64" autocapitalize="off">
<p><?php textarea("Statement", $row["Statement"]); ?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php if ($dropped) { ?><input type="hidden" name="dropped" value="1"><?php } ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?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(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,33 +1,33 @@
<?php
$TYPE = $_GET["type"];
$row = $_POST;
if ($_POST && !$error) {
$link = substr(ME, 0, -1);
if ($_POST["drop"]) {
query_redirect("DROP TYPE " . idf_escape($TYPE), $link, lang('Type has been dropped.'));
} else {
query_redirect("CREATE TYPE " . idf_escape($_POST["name"]) . " $_POST[as]", $link, lang('Type has been created.'));
query_redirect("CREATE TYPE " . idf_escape(trim($row["name"])) . " $row[as]", $link, lang('Type has been created.'));
}
}
page_header($TYPE != "" ? lang('Alter type') . ": " . h($TYPE) : lang('Create type'), $error);
$row["as"] = "AS ";
if ($_POST) {
$row = $_POST;
if (!$row) {
$row["as"] = "AS ";
}
?>
<form action="" method="post">
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php
if ($TYPE != "") {
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'$confirm>\n";
echo "<input type='submit' name='drop' value='" . lang('Drop') . "'" . confirm() . ">\n";
} else {
echo "<input name='name' value='" . h($row['name']) . "'>\n";
echo "<input name='name' value='" . h($row['name']) . "' autocapitalize='off'>\n";
textarea("as", $row["as"]);
echo "<p><input type='submit' value='" . lang('Save') . "'>\n";
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -26,6 +26,7 @@ if ($_POST) {
}
$grants = array();
$old_pass = "";
if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q($USER) . "@" . q($_GET["host"])))) { //! use information_schema for MySQL 5 - column names in column privileges are not escaped
while ($row = $result->fetch_row()) {
if (preg_match('~GRANT (.*) ON (.*) TO ~', $row[0], $match) && preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~', $match[1], $matches, PREG_SET_ORDER)) { //! escape the part between ON and TO
@@ -33,7 +34,7 @@ if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q
if ($val[1] != "USAGE") {
$grants["$match[2]$val[2]"][$val[1]] = true;
}
if (ereg(' WITH GRANT OPTION', $row[0])) { //! don't check inside strings and identifiers
if (preg_match('~ WITH GRANT OPTION~', $row[0])) { //! don't check inside strings and identifiers
$grants["$match[2]$val[2]"]["GRANT OPTION"] = true;
}
}
@@ -46,16 +47,27 @@ if (isset($_GET["host"]) && ($result = $connection->query("SHOW GRANTS FOR " . q
if ($_POST && !$error) {
$old_user = (isset($_GET["host"]) ? q($USER) . "@" . q($_GET["host"]) : "''");
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
$pass = q($_POST["pass"]);
if ($_POST["drop"]) {
query_redirect("DROP USER $old_user", ME . "privileges=", lang('User has been dropped.'));
} else {
if ($old_user != $new_user) {
$error = !queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY" . ($_POST["hashed"] ? " PASSWORD" : "") . " $pass");
} elseif ($_POST["pass"] != $old_pass || !$_POST["hashed"]) {
queries("SET PASSWORD FOR $new_user = " . ($_POST["hashed"] ? $pass : "PASSWORD($pass)"));
$new_user = q($_POST["user"]) . "@" . q($_POST["host"]); // if $_GET["host"] is not set then $new_user is always different
$pass = $_POST["pass"];
if ($pass != '' && !$_POST["hashed"]) {
// compute hash in a separate query so that plain text password is not saved to history
$pass = $connection->result("SELECT PASSWORD(" . q($pass) . ")");
$error = !$pass;
}
$created = false;
if (!$error) {
if ($old_user != $new_user) {
$created = queries(($connection->server_info < 5 ? "GRANT USAGE ON *.* TO" : "CREATE USER") . " $new_user IDENTIFIED BY PASSWORD " . q($pass));
$error = !$created;
} elseif ($pass != $old_pass) {
queries("SET PASSWORD FOR $new_user = " . q($pass));
}
}
if (!$error) {
$revoke = array();
foreach ($new_grants as $object => $grant) {
@@ -81,6 +93,7 @@ if ($_POST && !$error) {
}
}
}
if (!$error && isset($_GET["host"])) {
if ($old_user != $new_user) {
queries("DROP USER $old_user");
@@ -92,8 +105,10 @@ if ($_POST && !$error) {
}
}
}
queries_redirect(ME . "privileges=", (isset($_GET["host"]) ? lang('User has been altered.') : lang('User has been created.')), !$error);
if ($old_user != $new_user) {
if ($created) {
// delete new user in case of an error
$connection->query("DROP USER $new_user");
}
@@ -111,15 +126,15 @@ if ($_POST) {
if ($old_pass != "") {
$row["hashed"] = true;
}
$grants[""] = true;
$grants[(DB == "" || $grants ? "" : idf_escape(addcslashes(DB, "%_\\"))) . ".*"] = array();
}
?>
<form action="" method="post">
<table cellspacing="0">
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>">
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>">
<tr><th><?php echo lang('Password'); ?><td><input id="pass" name="pass" value="<?php echo h($row["pass"]); ?>">
<tr><th><?php echo lang('Server'); ?><td><input name="host" maxlength="60" value="<?php echo h($row["host"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Username'); ?><td><input name="user" maxlength="16" value="<?php echo h($row["user"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Password'); ?><td><input name="pass" id="pass" value="<?php echo h($row["pass"]); ?>">
<?php if (!$row["hashed"]) { ?><script type="text/javascript">typePassword(document.getElementById('pass'));</script><?php } ?>
<?php echo checkbox("hashed", 1, $row["hashed"], lang('Hashed'), "typePassword(this.form['pass'], this.checked);"); ?>
</table>
@@ -127,13 +142,14 @@ if ($_POST) {
<?php
//! MAX_* limits, REQUIRE
echo "<table cellspacing='0'>\n";
echo "<thead><tr><th colspan='2'><a href='http://dev.mysql.com/doc/refman/" . substr($connection->server_info, 0, 3) . "/en/grant.html'>" . lang('Privileges') . "</a>";
echo "<thead><tr><th colspan='2'>" . lang('Privileges') . doc_link(array('sql' => "grant.html#priv_level"));
$i = 0;
foreach ($grants as $object => $grant) {
echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
echo '<th>' . ($object != "*.*" ? "<input name='objects[$i]' value='" . h($object) . "' size='10' autocapitalize='off'>" : "<input type='hidden' name='objects[$i]' value='*.*' size='10'>*.*"); //! separate db, table, columns, PROCEDURE|FUNCTION, routine
$i++;
}
echo "</thead>\n";
foreach (array(
"" => "",
"Server Admin" => lang('Server'),
@@ -148,21 +164,22 @@ foreach (array(
foreach ($grants as $object => $grant) {
$name = "'grants[$i][" . h(strtoupper($privilege)) . "]'";
$value = $grant[strtoupper($privilege)];
if ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : "")) {
if ($context == "Server Admin" && $object != (isset($grants["*.*"]) ? "*.*" : ".*")) {
echo "<td>&nbsp;";
} elseif (isset($_GET["grant"])) {
echo "<td><select name=$name><option><option value='1'" . ($value ? " selected" : "") . ">" . lang('Grant') . "<option value='0'" . ($value == "0" ? " selected" : "") . ">" . lang('Revoke') . "</select>";
} else {
echo "<td align='center'><input type='checkbox' name=$name value='1'" . ($value ? " checked" : "") . ($privilege == "All privileges" ? " id='grants-$i-all'" : ($privilege == "Grant option" ? "" : " onclick=\"if (this.checked) formUncheck('grants-$i-all');\"")) . ">"; //! uncheck all except grant if all is checked
echo "<td align='center'><label class='block'><input type='checkbox' name=$name value='1'" . ($value ? " checked" : "") . ($privilege == "All privileges" ? " id='grants-$i-all'" : ($privilege == "Grant option" ? "" : " onclick=\"if (this.checked) formUncheck('grants-$i-all');\"")) . "></label>"; //! uncheck all except grant if all is checked
}
$i++;
}
}
}
echo "</table>\n";
?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if (isset($_GET["host"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo $confirm; ?>><?php } ?>
<?php if (isset($_GET["host"])) { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,34 +1,49 @@
<?php
$TABLE = $_GET["view"];
$dropped = false;
$row = $_POST;
if ($_POST && !$error) {
$dropped = drop_create(
"DROP VIEW " . table($TABLE),
"CREATE VIEW " . table($_POST["name"]) . " AS\n$_POST[select]",
($_POST["drop"] ? substr(ME, 0, -1) : ME . "table=" . urlencode($_POST["name"])),
lang('View has been dropped.'),
lang('View has been altered.'),
lang('View has been created.'),
$TABLE
);
$name = trim($row["name"]);
$as = " AS\n$row[select]";
$location = ME . "table=" . urlencode($name);
$message = lang('View has been altered.');
if (!$_POST["drop"] && $TABLE == $name && $jush != "sqlite") {
query_redirect(($jush == "mssql" ? "ALTER" : "CREATE OR REPLACE") . " VIEW " . table($name) . $as, $location, $message);
} else {
$temp_name = $name . "_adminer_" . uniqid();
drop_create(
"DROP VIEW " . table($TABLE),
"CREATE VIEW " . table($name) . $as,
"DROP VIEW " . table($name),
"CREATE VIEW " . table($temp_name) . $as,
"DROP VIEW " . table($temp_name),
($_POST["drop"] ? substr(ME, 0, -1) : $location),
lang('View has been dropped.'),
$message,
lang('View has been created.'),
$TABLE,
$name
);
}
}
page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, array("table" => $TABLE), $TABLE);
$row = array();
if ($_POST) {
$row = $_POST;
} elseif ($TABLE != "") {
if (!$_POST && $TABLE != "") {
$row = view($TABLE);
$row["name"] = $TABLE;
if (!$error) {
$error = $connection->error;
}
}
page_header(($TABLE != "" ? lang('Alter view') : lang('Create view')), $error, array("table" => $TABLE), h($TABLE));
?>
<form action="" method="post">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64">
<p><?php echo lang('Name'); ?>: <input name="name" value="<?php echo h($row["name"]); ?>" maxlength="64" autocapitalize="off">
<p><?php textarea("select", $row["select"]); ?>
<p>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<?php if ($dropped) { // old view was dropped but new wasn't created ?><input type="hidden" name="dropped" value="1"><?php } ?>
<input type="submit" value="<?php echo lang('Save'); ?>">
<?php if ($_GET["view"] != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@@ -1,3 +1,332 @@
Adminer 4.0.2 (released 2014-01-11):
Fix handling of long text in SQL textarea
Support paste to SQL textarea in Opera
Adminer 4.0.1 (released 2014-01-11):
Don't use type=number if a SQL function is used
Disable highlighting in textareas with long texts
Don't autofocus SQL textarea in Firefox
Don't link NULL foreign key values
Fix displaying images in Editor, bug since Adminer 3.6.0
Fix uploading files, bug since Adminer 4.0.0
MongoDB: Count tables, display ObjectIds, sort, limit, offset, count rows
Elasticsearch: Fix compiled version, create and drop DB, drop table
Adminer 4.0.0 (released 2014-01-08):
Driver for SimpleDB, MongoDB and Elasticsearch
Highlight SQL in textareas
Save and continue edit by AJAX
Split SQL command and import
Add a new column in alter table on key press
Mark length as required for strings
Add label to database selection, move logout button
Add button for dropping an index
Display number of selected rows
Add links to documentation
Disable underlining links
Differentiate views in navigation
Improve speed of CSV import
Keep form values after refresh in Firefox
Mark auto_increment fields in edit
Don't append newlines to uploaded files, bug since Adminer 3.7.0
Don't display SQL edit form on Ctrl+click on the select query, introduced in Adminer 3.6.4
Use MD5 for editing long keys only in supported drivers, bug since Adminer 3.6.4
Don't reset column when searching for an empty value with Enter, bug since Adminer 3.6.4
Encrypt passwords stored in session by a key stored in cookie
Don't execute external JavaScript when verifying version
Include JUSH in the compiled version
Protect CSRF token against BREACH
Non-MySQL: View triggers
SQLite: Allow editing primary key
SQLite: Allow editing foreign keys
PostgreSQL: Fix handling of nextval() default values
PostgreSQL: Support creating array columns
Customization: Provide schemas()
Portugal Portuguese translation
Thai translation
Adminer 3.7.1 (released 2013-06-29):
Increase click target for checkboxes
Use shadow for highlighting default button
Don't use LIMIT 1 if inline updating unique row
Don't check previous checkbox on added column in create table (bug #3614245)
Order table list by name
Verify UTF-8 encoding of CSV import
Notify user about expired master password for permanent login
Highlight table being altered in navigation
Send 404 for invalid database and schema
Fix title and links on invalid table pages
Display error on invalid alter table and view pages
MySQL: Speed up updating rows without numeric or UTF-8 primary key
Non-MySQL: Descending indexes
PostgreSQL: Fix detecting oid column in PDO
PostgreSQL: Handle timestamp types (bug #3614086)
Add Korean translation
Adminer 3.7.0 (released 2013-05-19):
Allow more SQL files to be uploaded at the same time
Print run time next to executed queries
Don't drop original view and routine before creating the new one
Highlight default submit button
Add server placeholder to login form
Disable SQL export when applying functions in select
Allow using lang() in plugins (customization)
Remove bzip2 compression support
Constraint memory used in TAR export
Allow exporting views dependent on each other (bug #3459151)
Fix resetting search (bug #3612507)
Don't use LIMIT 1 if updating unique row (bug #3613109)
Restrict editing rows without unique identifier to search results
Display navigation bellow main content on mobile browsers
Get number of rows on export page asynchronously
Respect 'whole result' even if some rows are checked (bug #339 since Adminer 3.7.0)
MySQL: Optimize create table page and Editor navigation
MySQL: Display bit type as binary number
MySQL: Improve export of binary data types
MySQL: Fix handling of POINT data type (bug #3582578)
MySQL: Don't export binary and geometry columns twice in select
MySQL: Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4
SQLite: Export views
PostgreSQL: Fix swapped NULL and NOT NULL columns in PDO
Adminer 3.6.4 (released 2013-04-26):
Display pagination on a fixed position
Increase default select limit to 50
Display SQL edit form on Ctrl+click on the select query
Display SQL history from newest
Recover original view, trigger, routine if creating fails
Do not store plain text password to history in creating user
Selectable ON UPDATE CURRENT_TIMESTAMP field in create table
Open database to a new window after selecting it with Ctrl
Clear column name after resetting search (bug #3601200)
Explain partitions in SQL query (bug #3600150)
Allow loading more data with inline edit (bug #3605531)
Stay on the same page after deleting rows (bug #3605845)
Respect checked tables in export filename (bug #3245464)
Respect PHP configuration max_input_vars
Fix unsetting permanent login after logout
Disable autocapitalize in identifiers on mobile browsers
MySQL: Compatibility with MySQL 5.6
MySQL: Move ALTER export to plugin
MySQL: Use numeric time zone in export
MySQL: Link processlist documentation
SQLite: Export indexes
Adminer 3.6.3 (released 2013-01-23):
Display error code in SQL query
Allow specifying external links
Treat Meta key same as Ctrl
Fix XSS in displaying non-UTF-8 strings
Don't use type="number" for decimal numbers
Adminer 3.6.2 (released 2012-12-21):
Edit values by Ctrl+click instead of double click
Don't select row on double click
Support NULL in routine calls
Shorten printed values in varchar fields
Display table default values on wide screens
Display date in SQL history
HTML5 input fields
Display warning for missing UPDATE privilege
Fix switching language on first load
Support enabled mbstring.func_overload
MySQL: Prolong comment length since MySQL 5.5
PostgreSQL: Fix process list in version 9.2
MS SQL: Support databases starting with number
Adminer 3.6.1 (released 2012-09-17):
Fix compiled version on PHP with multibyte support
Adminer 3.6.0 (released 2012-09-16):
Load more data in select
Edit strings with \n in textarea
Time out long running database list and select count
Use VALUES() in INSERT+UPDATE export
Style logout button as link
Store selected database to permanent login
Ctrl+click and Shift+click on button opens form to a blank window
Switch language by POST
Compress translations
MySQL: Support geometry data types
selectQueryBuild() method (customization)
Serbian translation
Adminer 3.5.1 (released 2012-08-10):
Support same name fields in CSV export
Support Shift+click in export
Adminer 3.5.0 (released 2012-08-05):
Links for column search in select
Autohide column context menu in select
Autodisplay long table names in tables list
Display assigned auto_increment after clone
SQLite: Full alter table
SQLite: Better editing in tables without primary key
SQLite: Display number of rows in database overview
Adminer 3.4.0 (released 2012-06-30):
Link to descending order
Shift+click on checkbox to select consecutive rows
Print current time next to executed SQL queries
Warn about selecting data without index
Allow specifying database in login form
Link to original table in EXPLAIN of SELECT * FROM table t
Format numbers in translations
MySQL: inform about disabled event_scheduler
SQLite: support binary data
PostgreSQL: approximate row count in table overview
PostgreSQL: improve PDO support in SQL command
Oracle: schema, processlist, table overview numbers
Simplify work with NULL values (customization)
Use namespace in login form (customization)
Customizable export filename (customization)
Replace JSMin by better JavaScript minifier
Don't use AJAX links and forms
Indonesian translation
Ukrainian translation
Bengali translation
Adminer 3.3.4 (released 2012-03-07):
Foreign keys default actions (bug #3397606)
SET DEFAULT foreign key action
Fix minor parser bug in SQL command with webserver file
Ctrl+click on button opens form to a blank window
Trim table and column names (bug #3405309)
Error message with no response from server in AJAX
Esc to cancel AJAX request
Move AJAX loading indicator to the right
Don't quote bit type in export
Don't check row while selecting text
Fix invalid references line position on Database schema
Disable selecting text on Database schema
Ability to disable export (customization)
Extensible list of databases (customization)
MySQL: set autocommit after connect
SQLite, PostgreSQL: vacuum
SQLite, PostgreSQL: don't use LIKE for numbers (bug #3420408)
PostgreSQL: fix alter foreign key
PostgreSQL over PDO: connect if the eponymous database does not exist (bug #3391619)
Boolean search (Editor)
Persian translation
Adminer 3.3.3 (released 2011-08-12):
Highlight checked rows
Titles of links in database overview and navigation
Fix trigger export (SQLite)
Default trigger statement (SQLite, PostgreSQL)
Remove search by expression (PostgreSQL, MS SQL)
Adminer 3.3.2 (released 2011-08-08):
Display error with non-existent row in edit
Fix minor parser bug in SQL command with webserver file
Fix SQL command Stop on error
Don't scroll with AJAX select order and alter move column
Fast number of rows with big tables (PostgreSQL)
Sort databases and schemas (PostgreSQL)
Adminer 3.3.1 (released 2011-07-27):
Fix XSS introduced in Adminer 3.2.0
Fix altering default values (PostgreSQL)
Process list (PostgreSQL)
Adminer 3.3.0 (released 2011-07-19):
Use Esc to disable in-place edit
Shortcut for database privileges
Editable index names
Append new index with auto index selection (bug #3282127)
Preserve original timestamp value in multiple update (bug #3312614)
Bit type default value
Display foreign key name in tooltip
Display default column value in table overview
Display column collation in tooltip
Keyboard shortcuts: Alt+Shift+1 for homepage, Ctrl+Shift+Enter for Save and continue edit
Show only errors with Webserver file SQL command
Remember select export and import options
Link tables and indexes from SQL command EXPLAIN (MySQL)
Display error with all wrong SQL commands (MySQL)
Display foreign keys from other schemas (PostgreSQL)
Pagination support (Oracle)
Autocomplete for big foreign keys (Editor)
Display name of the referenced record in PostgreSQL (Editor)
Prefer NULL to empty string (Editor, bug #3323800)
Display searched columns (Editor)
Customizable favicon (customization)
Method name can return a link (customization)
Easier sending of default headers (customization)
Lithuanian and Romanian translation
Adminer 3.2.2 (released 2011-03-28):
Fix AJAX history after reload
Adminer 3.2.1 (released 2011-03-23):
Ability to save expression in edit
Respect default database collation (bug #3191489)
Don't export triggers without table (bug #3193489)
Esc to focus next field in Tab textarea
Send forms by Ctrl+Enter on <select>
Enum editor and textarea Ctrl+Enter working in IE
AJAX forms in Google Chrome
Parse UTF-16 and UTF-8 BOM in all text uploads
Display ; in history
Use DELIMITER in history
Show databases even with skip_show_database in MySQL 5
Disable maxlength with functions in edit
Better placement of AJAX icon
Table header in CSV export (Editor)
Time format hint (Editor)
Respect order after search (Editor)
Set MySQL time zone by PHP setting (Editor)
Allow own code in <head> (customization)
Polish translation
Adminer 3.2.0 (released 2011-02-24):
Get long texts and slow information by AJAX
Most links and forms by AJAX in browsers with support for history.pushState
Copy tables
Ability to search by expression in select
Export SQL command result (bug #3116854)
Focus first field with insert (bug #3126501)
Permanent link in schema
Display total time in show only errors mode in SQL command
History: edit all
MS SQL: auto primary and foreign key
SQLite: display 0
Create table default data type: int
Focus upper/lower fields by Ctrl+Up/Ctrl+Down
Hide credentials for SQLite
Utilize oids in PostgreSQL
Homepage customization
Use IN for search in numeric fields (Editor)
Use password input for _md5 and _sha1 fields (Editor)
Work without session.use_cookies (bug #3138640)
Fix saving schema to cookie in Opera
Portuguese, Slovenian and Turkish translation
Adminer 3.1.0 (released 2010-11-16):
TSV export and import
Customizable export
Option to show only errors in SQL command
Link to bookmark SQL command
Recognize $$ strings in SQL command (PostgreSQL)
Highlight and edit SQL command in processlist
Always display all drivers
Timestamp at the end of export
Link to refresh database cache (bug #3102451)
Support for virtual foreign keys
Disable XSS "protection" of IE8
Immunity against zend.ze1_compatibility_mode (bug #3089645)
Fix last page with empty result set
Arabic translation and RTL support
Dual licensing: Apache or GPL
Adminer 3.0.1 (released 2010-10-18):
Send the form by Ctrl+Enter in all textareas
Disable creating SQLite databases with extension other than db, sdb, sqlite
Ability to use Adminer in a frame through customization
Catalan translation
MS SQL 2005 compatibility
PostgreSQL: connect if the eponymous database does not exist
Adminer 3.0.0 (released 2010-10-15):
Drivers for MS SQL, SQLite, PostgreSQL, Oracle
Allow concurrent logins on the same server
@@ -96,9 +425,9 @@ Localize date (Editor)
Treat tinyint(1) as bool (Editor)
Divide types to groups in table creation
Link e-mails in select
Show type in field name title (thanks to Jakub Sochor)
Preselect now() for timestamp columns (thanks to paranoiq)
Clear history (thanks to paranoiq)
Show type in field name title
Preselect now() for timestamp columns
Clear history
Prefill insert by foreign key searches
Print number of rows in SQL command
Remove Delete button from Edit page - use mass operation for it
@@ -109,7 +438,7 @@ Use HTML Strict instead of XHTML
Remove function minification in favor of performance and customization
Fix grant ALL PRIVILEGES with GRANT OPTION
Fix CSV import
Fix work with default values (thanks to Jiri Pospisil)
Fix work with default values
Adminer 1.11.1 (released 2009-07-03):
Fix problem with enabled Filter extension
@@ -138,15 +467,15 @@ Use \n in SQL commands
phpMinAdmin 1.10.1 (released 2009-05-07):
Highlight odd and hover rows
Partition editing comfort (bug #2783446)
Allow full length in limited int (thanks to Vlasta Neubauer)
Allow full length in limited int
phpMinAdmin 1.10.0 (released 2009-04-28):
Partitioning (MySQL 5.1)
CSV import
Plus and minus functions
Option to stop on error in SQL command (thanks to Vaclav Marik)
Option to stop on error in SQL command
Cross links to select and table (bug #2236232), link new item
Suhosin compatibility (thanks to Klemens Hackel)
Suhosin compatibility
Remove max_allowed_packet from export
Read style from phpMinAdmin.css if exists
Size reduction by minification of variables and functions
@@ -165,11 +494,11 @@ Search without column restriction
Use type=password for unhashed password
Only one button for each action in select
Choose language through option-list
XHTML syntax errors (thanks to kozotoc)
XHTML syntax errors
Don't set global variable in export
SHOW DATABASES can be revoked
Order by function result working also in older MySQL versions
Tested on IIS (thanks to krasl.cz)
Tested on IIS
phpMinAdmin 1.8.0 (released 2008-09-12):
Events (MySQL 5.1)

338
compile.php Normal file → Executable file
View File

@@ -1,28 +1,21 @@
#!/usr/bin/env php
<?php
error_reporting(6135); // errors and warnings
include dirname(__FILE__) . "/adminer/include/version.inc.php";
include dirname(__FILE__) . "/externals/jsmin-php/jsmin.php";
if (!class_exists("JSMin")) {
/** Simple JS minifier without full support for regex literals
* @link http://pastebin.com/2Jc2swSr
*/
class JSMin {
/*private static*/ function callback($match) {
$s = trim($match[0]);
return ($s === "" ? "\n" : ($s[0] === "/" && ($s[1] === "*" || $s[1] === "/") ? "" : $s));
}
/*static*/ function minify($input) {
return preg_replace_callback('~//[^\n]*|/\*.*?\*/|/(?!\s)(?:\\\\.|[^/\\\\])*/|\'(?:\\\\.|[^\'\\\\])*\'|"(?:\\\\.|[^"\\\\])*"|\s*[^0-9a-z_$\'"/\s]\s*|\s+~si', array('JSMin', 'callback'), $input);
}
}
}
include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php";
function add_apo_slashes($s) {
return addcslashes($s, "\\'");
}
function add_quo_slashes($s) {
$return = $s;
$return = addcslashes($return, "\n\r\$\"\\");
$return = preg_replace('~\0(?![0-7])~', '\\\\0', $return);
$return = addcslashes($return, "\0");
return $return;
}
function remove_lang($match) {
global $translations;
$idf = strtr($match[2], array("\\'" => "'", "\\\\" => "\\"));
@@ -36,7 +29,7 @@ function remove_lang($match) {
function lang_ids($match) {
global $lang_ids;
$lang_id = &$lang_ids[stripslashes($match[1])];
if (!isset($lang_id)) {
if ($lang_id === null) {
$lang_id = count($lang_ids) - 1;
}
return ($_SESSION["lang"] ? $match[0] : "lang($lang_id$match[2]");
@@ -49,43 +42,124 @@ function put_file($match) {
}
$return = file_get_contents(dirname(__FILE__) . "/$project/$match[2]");
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
if (basename($match[2]) == "lang.inc.php") {
$return = str_replace('function lang($idf, $number = null) {', 'function lang($idf, $number = null) {
if (is_string($idf)) { // compiled version uses numbers, string comes from a plugin
// English translation is closest to the original identifiers //! pluralized translations are not found
$pos = array_search($idf, get_translations("en")); //! this should be cached
if ($pos !== false) {
$idf = $pos;
}
}', $return, $count);
if (!$count) {
echo "lang() not found\n";
}
}
$tokens = token_get_all($return); // to find out the last token
return "?>\n$return" . (in_array($tokens[count($tokens) - 1][0], array(T_CLOSE_TAG, T_INLINE_HTML), true) ? "<?php" : "");
} elseif (preg_match('~\\s*(\\$pos = .*)~', $return, $match2)) {
} elseif (preg_match('~\\s*(\\$pos = (.+\n).+;)~sU', $return, $match2)) {
// single language lang() is used for plural
return "function lang(\$translation, \$number) {\n\t" . str_replace('$LANG', "'$_SESSION[lang]'", $match2[1]) . "\n\treturn sprintf(\$translation[\$pos], \$number);\n}\n";
return "function get_lang() {
return '$_SESSION[lang]';
}
function lang(\$translation, \$number = null) {
if (is_array(\$translation)) {
\$pos = $match2[2]\t\t\t: " . (preg_match("~\\\$LANG == '$_SESSION[lang]'.* \\? (.+)\n~U", $match2[1], $match3) ? $match3[1] : "1") . '
);
$translation = $translation[$pos];
}
$translation = str_replace("%d", "%s", $translation);
$number = number_format($number, 0, ".", lang(\',\'));
return sprintf($translation, $number);
}
';
} else {
echo "lang() not found\n";
echo "lang() \$pos not found\n";
}
}
function lzw_compress($string) {
// compression
$dictionary = array_flip(range("\0", "\xFF"));
$word = "";
$codes = array();
for ($i=0; $i <= strlen($string); $i++) {
$x = $string[$i];
if (strlen($x) && isset($dictionary[$word . $x])) {
$word .= $x;
} elseif ($i) {
$codes[] = $dictionary[$word];
$dictionary[$word . $x] = count($dictionary);
$word = $x;
}
}
// convert codes to binary string
$dictionary_count = 256;
$bits = 8; // ceil(log($dictionary_count, 2))
$return = "";
$rest = 0;
$rest_length = 0;
foreach ($codes as $code) {
$rest = ($rest << $bits) + $code;
$rest_length += $bits;
$dictionary_count++;
if ($dictionary_count >> $bits) {
$bits++;
}
while ($rest_length > 7) {
$rest_length -= 8;
$return .= chr($rest >> $rest_length);
$rest &= (1 << $rest_length) - 1;
}
}
return $return . ($rest_length ? chr($rest << (8 - $rest_length)) : "");
}
function put_file_lang($match) {
global $lang_ids, $project;
global $lang_ids, $project, $langs;
if ($_SESSION["lang"]) {
return "";
}
$return = "";
foreach (glob(dirname(__FILE__) . "/adminer/lang/*.inc.php") as $filename) {
include $filename; // assign $translations
foreach ($langs as $lang => $val) {
include dirname(__FILE__) . "/adminer/lang/$lang.inc.php"; // assign $translations
$translation_ids = array_flip($lang_ids); // default translation
foreach ($translations as $key => $val) {
if (isset($val)) {
$translation_ids[$lang_ids[$key]] = $val;
if ($val !== null) {
$translation_ids[$lang_ids[$key]] = implode("\t", (array) $val);
}
}
$return .= "\tcase \"" . basename($filename, '.inc.php') . '": $translations = array(';
foreach ($translation_ids as $val) {
$return .= (is_array($val) ? "array('" . implode("', '", array_map('add_apo_slashes', $val)) . "')" : "'" . add_apo_slashes($val) . "'") . ", ";
}
$return = substr($return, 0, -2) . "); break;\n";
$return .= '
case "' . $lang . '": $compressed = "' . add_quo_slashes(lzw_compress(implode("\n", $translation_ids))) . '"; break;';
}
return "switch (\$LANG) {\n$return}\n";
$translations_version = crc32($return);
return '$translations = &$_SESSION["translations"];
if ($_SESSION["translations_version"] != ' . $translations_version . ') {
$translations = array();
$_SESSION["translations_version"] = ' . $translations_version . ';
}
function get_translations($lang) {
switch ($lang) {' . $return . '
}
$translations = array();
foreach (explode("\n", lzw_decompress($compressed)) as $val) {
$translations[] = (strpos($val, "\t") ? explode("\t", $val) : $val);
}
return $translations;
}
if (!$translations) {
$translations = get_translations($LANG);
}
';
}
function short_identifier($number, $chars) {
$return = '';
while ($number >= 0) {
$return .= $chars{$number % strlen($chars)};
$return .= $chars[$number % strlen($chars)];
$number = floor($number / strlen($chars)) - 1;
}
return $return;
@@ -93,11 +167,39 @@ function short_identifier($number, $chars) {
// based on http://latrine.dgx.cz/jak-zredukovat-php-skripty
function php_shrink($input) {
$special_variables = array_flip(array('$this', '$GLOBALS', '$_GET', '$_POST', '$_FILES', '$_COOKIE', '$_SESSION', '$_SERVER'));
global $VERSION;
$special_variables = array_flip(array('$this', '$GLOBALS', '$_GET', '$_POST', '$_FILES', '$_COOKIE', '$_SESSION', '$_SERVER', '$http_response_header', '$php_errormsg'));
$short_variables = array();
$shortening = true;
$tokens = token_get_all($input);
// remove unnecessary { }
//! change also `while () { if () {;} }` to `while () if () ;` but be careful about `if () { if () { } } else { }
$shorten = 0;
$opening = -1;
foreach ($tokens as $i => $token) {
if (in_array($token[0], array(T_IF, T_ELSE, T_ELSEIF, T_WHILE, T_DO, T_FOR, T_FOREACH), true)) {
$shorten = ($token[0] == T_FOR ? 4 : 2);
$opening = -1;
} elseif (in_array($token[0], array(T_SWITCH, T_FUNCTION, T_CLASS, T_CLOSE_TAG), true)) {
$shorten = 0;
} elseif ($token === ';') {
$shorten--;
} elseif ($token === '{') {
if ($opening < 0) {
$opening = $i;
} elseif ($shorten > 1) {
$shorten = 0;
}
} elseif ($token === '}' && $opening >= 0 && $shorten == 1) {
unset($tokens[$opening]);
unset($tokens[$i]);
$shorten = 0;
$opening = -1;
}
}
$tokens = array_values($tokens);
foreach ($tokens as $i => $token) {
if ($token[0] === T_VARIABLE && !isset($special_variables[$token[1]])) {
$short_variables[$token[1]]++;
@@ -105,11 +207,17 @@ function php_shrink($input) {
}
arsort($short_variables);
$chars = implode(range('a', 'z')) . '_' . implode(range('A', 'Z'));
// preserve variable names between versions if possible
$short_variables2 = array_splice($short_variables, strlen($chars));
ksort($short_variables);
ksort($short_variables2);
$short_variables += $short_variables2;
foreach (array_keys($short_variables) as $number => $key) {
$short_variables[$key] = short_identifier($number, implode(range('a', 'z')) . '_' . implode(range('A', 'Z'))); // could use also numbers and \x7f-\xff
$short_variables[$key] = short_identifier($number, $chars); // could use also numbers and \x7f-\xff
}
$set = array_flip(preg_split('//', '!"#$&\'()*+,-./:;<=>?@[\]^`{|}'));
$set = array_flip(preg_split('//', '!"#$%&\'()*+,-./:;<=>?@[\]^`{|}'));
$space = '';
$output = '';
$in_echo = false;
@@ -119,10 +227,10 @@ function php_shrink($input) {
$token = array(0, $token);
}
if ($tokens[$i+2][0] === T_CLOSE_TAG && $tokens[$i+3][0] === T_INLINE_HTML && $tokens[$i+4][0] === T_OPEN_TAG
&& strlen(addcslashes($tokens[$i+3][1], "'\\")) < strlen($tokens[$i+3][1]) + 3
&& strlen(add_apo_slashes($tokens[$i+3][1])) < strlen($tokens[$i+3][1]) + 3
) {
$tokens[$i+2] = array(T_ECHO, 'echo');
$tokens[$i+3] = array(T_CONSTANT_ENCAPSED_STRING, "'" . addcslashes($tokens[$i+3][1], "'\\") . "'");
$tokens[$i+3] = array(T_CONSTANT_ENCAPSED_STRING, "'" . add_apo_slashes($tokens[$i+3][1]) . "'");
$tokens[$i+4] = array(0, ';');
}
if ($token[0] == T_COMMENT || $token[0] == T_WHITESPACE || ($token[0] == T_DOC_COMMENT && $doc_comment)) {
@@ -130,6 +238,7 @@ function php_shrink($input) {
} else {
if ($token[0] == T_DOC_COMMENT) {
$doc_comment = true;
$token[1] = substr_replace($token[1], "* @version $VERSION\n", -2, 0);
}
if ($token[0] == T_VAR) {
$shortening = false;
@@ -165,12 +274,32 @@ function php_shrink($input) {
}
function minify_css($file) {
return preg_replace('~\\s*([:;{},])\\s*~', '\\1', $file);
return lzw_compress(preg_replace('~\\s*([:;{},])\\s*~', '\\1', preg_replace('~/\\*.*\\*/~sU', '', $file)));
}
function minify_js($file) {
if (function_exists('jsShrink')) {
$file = jsShrink($file);
}
return lzw_compress($file);
}
function compile_file($match) {
global $project;
return call_user_func($match[2], file_get_contents(dirname(__FILE__) . "/$project/$match[1]"));
$file = "";
foreach (explode(";", $match[1]) as $filename) {
$file .= file_get_contents(dirname(__FILE__) . "/$project/$filename");
}
if ($match[2]) {
$file = call_user_func($match[2], $file);
}
return '"' . add_quo_slashes($file) . '"';
}
$project = "adminer";
if ($_SERVER["argv"][1] == "editor") {
$project = "editor";
array_shift($_SERVER["argv"]);
}
$driver = "";
@@ -182,84 +311,97 @@ if (file_exists(dirname(__FILE__) . "/adminer/drivers/" . $_SERVER["argv"][1] .
unset($_COOKIE["adminer_lang"]);
$_SESSION["lang"] = $_SERVER["argv"][1]; // Adminer functions read language from session
include dirname(__FILE__) . "/adminer/include/lang.inc.php";
if (isset($_SESSION["lang"])) {
if (isset($_SERVER["argv"][2]) || !isset($langs[$_SESSION["lang"]])) {
echo "Usage: php compile.php [lang]\nPurpose: Compile adminer[-lang].php and editor[-lang].php.\n";
exit(1);
}
if (isset($langs[$_SESSION["lang"]])) {
include dirname(__FILE__) . "/adminer/lang/$_SESSION[lang].inc.php";
array_shift($_SERVER["argv"]);
}
if ($_SERVER["argv"][1]) {
echo "Usage: php compile.php [editor] [driver] [lang]\n";
echo "Purpose: Compile adminer[-driver][-lang].php or editor[-driver][-lang].php.\n";
exit(1);
}
// check function definition in drivers
$filename = dirname(__FILE__) . "/adminer/drivers/mysql.inc.php";
preg_match_all('~\\bfunction ([^(]+)~', file_get_contents($filename), $matches); //! respect context (extension, class)
$functions = array_combine($matches[1], $matches[0]);
unset($functions["__destruct"], $functions["Min_DB"], $functions["Min_Result"]);
unset($functions["__destruct"], $functions["Min_DB"], $functions["Min_Result"], $functions["Min_Driver"]);
foreach (glob(dirname(__FILE__) . "/adminer/drivers/" . ($driver ? $driver : "*") . ".inc.php") as $filename) {
if ($filename != "mysql.inc.php") {
$file = file_get_contents($filename);
foreach ($functions as $val) {
if (!strpos($file, "$val(")) {
echo "Missing $val in $filename\n";
fprintf(STDERR, "Missing $val in $filename\n");
}
}
}
}
include dirname(__FILE__) . "/adminer/include/pdo.inc.php";
$features = array("view", "event", "privileges", "user", "processlist", "variables", "trigger", "scheme", "sequence", "dump");
foreach (array("adminer", "editor") as $project) {
$lang_ids = array(); // global variable simplifies usage in a callback function
$file = file_get_contents(dirname(__FILE__) . "/$project/index.php");
if ($driver) {
$connection = (object) array("server_info" => 5.1); // MySQL support is version specific
$_GET[$driver] = true; // to load the driver
include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php";
foreach ($features as $feature) {
if (!support($feature)) {
$file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file);
include dirname(__FILE__) . "/adminer/include/driver.inc.php";
$features = array("call" => "routine", "dump", "event", "privileges", "procedure" => "routine", "processlist", "routine", "scheme", "sequence", "status", "trigger", "type", "user" => "privileges", "variables", "view");
$lang_ids = array(); // global variable simplifies usage in a callback function
$file = file_get_contents(dirname(__FILE__) . "/$project/index.php");
if ($driver) {
$connection = (object) array("server_info" => 5.1); // MySQL support is version specific
$_GET[$driver] = true; // to load the driver
include_once dirname(__FILE__) . "/adminer/drivers/$driver.inc.php";
foreach ($features as $key => $feature) {
if (!support($feature)) {
if (!is_int($key)) {
$feature = $key;
}
}
if (!support("routine")) {
$file = str_replace("} elseif (isset(\$_GET[\"procedure\"])) {\n\tinclude \"./procedure.inc.php\";\n", "", $file);
$file = str_replace("} elseif (isset(\$_GET[\"call\"])) {\n\tinclude \"./call.inc.php\";\n", "", $file);
$file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file);
$file = str_replace("} elseif (isset(\$_GET[\"$feature\"])) {\n\tinclude \"./$feature.inc.php\";\n", "", $file);
}
}
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file);
$file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file);
if ($driver) {
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . ').*\\s*)', '', $file);
if (!support("routine")) {
$file = str_replace("if (isset(\$_GET[\"callf\"])) {\n\t\$_GET[\"call\"] = \$_GET[\"callf\"];\n}\nif (isset(\$_GET[\"function\"])) {\n\t\$_GET[\"procedure\"] = \$_GET[\"function\"];\n}\n", "", $file);
}
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
if ($driver) {
foreach ($features as $feature) {
if (!support($feature)) {
$file = preg_replace("((\t*)" . preg_quote('if (support("' . $feature . '")') . ".*\n\\1\\})sU", '', $file);
}
}
if (count($drivers) == 1) {
$file = str_replace('<?php echo html_select("driver", $drivers, DRIVER); ?>', "<input type='hidden' name='driver' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
}
}
$file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file);
$file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file);
if ($_SESSION["lang"]) {
// single language version
$file = preg_replace_callback("~(<\\?php\\s*echo )?lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])(;\\s*\\?>)?~s", 'remove_lang', $file);
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $file);
}
$file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file);
$file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", $_SERVER["REQUEST_URI"])) . "?file=\\1&amp;version=' . $VERSION;
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file);
$file = str_replace("'../externals/jush/'", "protocol + '://www.adminer.org/static/'", $file);
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
$file = php_shrink($file);
$filename = $project . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
fwrite(fopen($filename, "w"), $file); // file_put_contents() since PHP 5
echo "$filename created (" . strlen($file) . " B).\n";
}
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file);
$file = str_replace('include "../adminer/include/coverage.inc.php";', '', $file);
if ($driver) {
$file = preg_replace('(include "../adminer/drivers/(?!' . preg_quote($driver) . '\.).*\\s*)', '', $file);
}
$file = preg_replace_callback('~\\b(include|require) "([^"]*)";~', 'put_file', $file); // bootstrap.inc.php
if ($driver) {
foreach ($features as $feature) {
if (!support($feature)) {
$file = preg_replace("((\t*)" . preg_quote('if (support("' . $feature . '")') . ".*\n\\1\\})sU", '', $file);
}
}
if (count($drivers) == 1) {
$file = str_replace('<?php echo html_select("driver", $drivers, DRIVER); ?>', "<input type='hidden' name='driver' value='" . ($driver == "mysql" ? "server" : $driver) . "'>" . reset($drivers), $file);
}
$file = preg_replace('(;../externals/jush/modules/jush-(?!textarea\.|txt\.|' . preg_quote($driver == "mysql" ? "sql" : $driver) . '\.)[^.]+.js)', '', $file);
}
if ($project == "editor") {
$file = preg_replace('~;../externals/jush/jush.css~', '', $file);
$file = preg_replace('~;../externals/jush/modules/jush[^.]*.js~', '', $file);
}
$file = preg_replace_callback("~lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])~s", 'lang_ids', $file);
$file = preg_replace_callback('~\\b(include|require) "([^"]*\\$LANG.inc.php)";~', 'put_file_lang', $file);
$file = str_replace("\r", "", $file);
if ($_SESSION["lang"]) {
// single language version
$file = preg_replace_callback("~(<\\?php\\s*echo )?lang\\('((?:[^\\\\']+|\\\\.)*)'([,)])(;\\s*\\?>)?~s", 'remove_lang', $file);
$file = str_replace("<?php switch_lang(); ?>\n", "", $file);
$file = str_replace('<?php echo $LANG; ?>', $_SESSION["lang"], $file);
}
$file = str_replace('<script type="text/javascript" src="static/editing.js"></script>' . "\n", "", $file);
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush.js"></script>' . "\n", "", $file);
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-textarea.js"></script>' . "\n", "", $file);
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-txt.js"></script>' . "\n", "", $file);
$file = str_replace('<script type="text/javascript" src="../externals/jush/modules/jush-<?php echo $jush; ?>.js"></script>' . "\n", "", $file);
$file = str_replace('<link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">' . "\n", "", $file);
$file = preg_replace_callback("~compile_file\\('([^']+)'(?:, '([^']*)')?\\)~", 'compile_file', $file); // integrate static files
$replace = 'h(preg_replace("~\\\\\\\\?.*~", "", ME)) . "?file=\\1&amp;version=' . $VERSION . ($driver ? '&amp;driver=' . $driver : '');
$file = preg_replace('~\\.\\./adminer/static/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
$file = preg_replace('~\\.\\./adminer/static/([^\'"]*)~', '" . ' . $replace, $file);
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);
$file = php_shrink($file);
$filename = $project . (preg_match('~-dev$~', $VERSION) ? "" : "-$VERSION") . ($driver ? "-$driver" : "") . ($_SESSION["lang"] ? "-$_SESSION[lang]" : "") . ".php";
file_put_contents($filename, $file);
echo "$filename created (" . strlen($file) . " B).\n";

View File

@@ -33,7 +33,7 @@ if (!extension_loaded("xdebug")) {
$filename = $_GET["coverage"];
$coverage = (file_exists($coverage_filename) ? unserialize(file_get_contents($coverage_filename)) : array());
$file = explode("<br />", highlight_file($filename, true));
unset($prev_color);
$prev_color = null;
$s = "";
for ($l=0; $l <= count($file); $l++) {
$line = $file[$l];
@@ -43,10 +43,10 @@ if (!extension_loaded("xdebug")) {
case -2: $color = "Silver"; break; // dead code
case null: $color = ""; break; // not executable
}
if (!isset($prev_color)) {
if ($prev_color === null) {
$prev_color = $color;
}
if ($prev_color != $color || !isset($line)) {
if ($prev_color != $color || $line === null) {
echo "<div" . ($prev_color ? " style='background-color: $prev_color;'" : "") . ">$s";
$open_tags = xhtml_open_tags($s);
foreach (array_reverse($open_tags) as $tag) {

62
designs/brade/adminer.css Normal file
View File

@@ -0,0 +1,62 @@
/* CSS by Brade - www.bradezone.com */
*{margin:0;padding:0}
body{font:13px/18px Helvetica,Arial,sans-serif;background:#fff;color:#333}
/* generic */
a,a:visited{color:#06c;text-decoration:none;border-bottom:1px dotted}
a:hover{border-bottom:1px solid #06c;background:#06c;color:#fff}
p{padding-bottom:4px;margin-bottom:4px}
h1{font-size:18px;font-weight:bold;padding-bottom:0px;height:40px;padding:0 0 8px 0;color:#666;border:0}
h2{font:32px Georgia,serif;padding:10px 0 8px;margin:0;background:transparent;border:0;color:#333}
h3{font-size:18px;font-weight:bold;padding:4px 0;margin:0}
form#form{overflow:hidden}
fieldset{float:left;min-height:48px;padding:0 4px 4px 4px;border:1px solid #ccc;margin-bottom:8px;margin-right:4px}
fieldset div{margin-top:4px}
input,select,textarea{font:13px Helvetica,Arial,sans-serif;color:#555;border:1px solid #999;padding:3px}
input[type=submit]{background:#ccc;padding:2px;cursor:pointer;color:#333}
input[type=submit]:hover{background:#bbb}
input[type=image],input[type=checkbox]{border:0;padding:0}
label input[type=checkbox],td input[type=radio],td span select{margin-right:4px}
select{border:1px solid #999;padding:2px}
fieldset select{margin-right:4px}
option{padding:0 5px}
optgroup{font-size:11px}
code{background:#eee;padding:2px 4px;font:16px/20px Courier,monospace}
code a:hover{background:transparent}
table{margin:4px 0 8px;border:1px solid #ccc;font-size:inherit}
tbody tr:hover td,tbody tr:hover th{background:#eee}
thead tr:hover td,thead tr:hover th{background:#ddd}
th,td{text-align:left;padding:2px 4px;vertical-align:top;font-weight:normal;border:1px dotted #ccc;border-width:0 0 0 1px;
margin:0;background:inherit}
thead th,thead td{white-space:nowrap;font-weight:bold;background:#ddd;border-color:#ddd}
th:first-child,td:first-child{border-color:transparent;white-space:nowrap}
td[align=right]{text-align:right}
table code{font-size:13px;line-height:18px}
.hidden{display:none}
.error,.message{padding:0;background:transparent;font-weight:bold}
.error{color:#c00}
.message{color:#090}
/* specific */
#content{margin:0 0 0 320px;padding:50px 20px 40px 0;height:100%}
#content:after{content:'.';clear:both;height:0;overflow:hidden;display:block}
#lang{background:#333;color:#fff;position:fixed;top:0;left:0;width:100%;padding:0 20px 0 40px;line-height:40px;height:40px}
#lang select{border-color:#333}
#menu{background:#eee;position:fixed;top:60px;bottom:20px;overflow:auto;left:20px;width:240px;padding:10px 15px;
border:5px solid #ccc;margin:0}
#menu a{color:#333;margin-right:4px}
#menu a:hover{background:#333;color:#fff;border-color:#333}
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
outline:0;background:url(http://www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
#menu p{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
#breadcrumb a{color:#ff9}
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
#schema .table{padding:4px 8px;background:#f3f3f3}
/* IE hacks */
*+html th:first-child,*+html td:first-child{border-color:inherit;white-space:inherit}
* html #lang,* html #menu,* html #breadcrumb{position:absolute}
* html #lang{padding-top:10px;height:30px}
* html form#form{height:100%}
#logins a,#tables a{background: none}
#logout{color:#333;text-decoration:none;border-bottom:1px dotted}
#logout:hover{border-color:#333;background:#333;color:#fff}
.js .column{background:#ddd}

338
designs/bueltge/adminer.css Normal file
View File

@@ -0,0 +1,338 @@
/**
* Alternative style for Adminer by Frank Bueltge
* @link http://bueltge.de/
*/
body {
margin: 0;
line-height: 1.25em;
font-size: 12px;
background: #F9F9F9;
}
body, select, option, optgroup, button {
font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
} /* IE6 */
input[type='submit'], input[type='reset'], input[type='button'], input[type='file'] {
font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
}
input, textarea, pre, code, samp, kbd, var {
font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
font-size: 12px;
}
a {
color: #21759B;
}
a:visited {
color: #21759B;
}
a:hover {
text-decoration: none;
color: #D54E21;
}
form {
margin: 0;
}
table {
margin: 0 12px 12px 0;
border: 1px #BBB solid;
font-size: 90%;
}
th {
text-align: left;
}
td, th {
background-color: #fff;
padding: 1px 2px;
border: 1px #DfDfDf solid;
border-width: 1px 0 0 1px;
}
tr:first-child td, tr:first-child th {
border-top-width: 0;
}
td:first-child, th:first-child {
border-left-width: 0;
}
thead td, thead th {
background-color: #DFDFDF;
border: none;
border-bottom: 1px #BBB solid;
}
thead tr:hover td, thead tr:hover th {
background-color: #DDD !important;
}
tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd {
background-color: #F1F1F1;
}
tr:hover td, tr:hover th {
background-color: #BCD;
}
fieldset {
display: inline;
vertical-align: top;
padding: 2px 12px;
margin: 25px 12px 12px 0;
border: none;
background-color: #F1F1F1;
border: 1px solid #E3E3E3;
position: relative;
padding-top: 14px;
}
fieldset, x:-moz-any-link {
padding-top: 4px;
}
fieldset {
%padding-top: 14px;
}
legend {
font-weight: 900;
color: #000;
position: absolute;
top: -1.666em;
left: -1em;
padding: 0 4px;
}
input[name='limit'], input[name*='length'] {
width: 3em;
xtext-align: right;
}
input[name='text_length'] {
width: 5em;
}
select + input, select + select {
margin-left: 2px;
}
textarea, input, select {
border-width: 1px;
border-style: solid;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
border-color: #DFDFDF;
}
input[type="checkbox"], input[type="radio"], input[type="image"] {
border: 0 none;
}
input[type=button], input[type=submit] {
border-color: #bbb;
color: #464646;
}
input[type=button]:hover, input[type=submit]:hover {
color: #000;
border-color: #666;
}
input[type=button], input[type=submit] {
text-decoration: none;
font-size: 11px !important;
line-height: 14px;
padding: 2px 8px;
cursor: pointer;
border-width: 1px;
border-style: solid;
-moz-border-radius: 11px;
-khtml-border-radius: 11px;
-webkit-border-radius: 11px;
border-radius: 11px;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
-khtml-box-sizing: content-box;
box-sizing: content-box;
}
input + label input, select + label input {
margin-left: 4px;
}
td input[type='checkbox']:first-child, td input[type='radio']:first-child {
margin-left: 2px;
}
label:hover {
text-decoration: underline;
}
fieldset div {
margin-bottom: 2px;
}
input[name='Comment'] { /* !!! */
width: 24em;
}
input[name='Auto_increment'] { /* !!! */
width: 6em;
}
img {
vertical-align: middle;
margin: 0;
padding: 0;
}
.error {
padding: 8px;
color: red;
background-color: #FEE;
}
.message {
padding: 8px;
background-color: #DDD;
}
.char {
color: #070;
}
.date {
color: #707;
}
.enum {
color: #077;
}
.binary {
color: red;
}
.jush-sql {
padding: 2px 4px;
margin-right: 4px;
outline: 1px #BBB dashed;
font-size: 9pt;
}
#content {
margin: 2px 0 0 260px;
padding: 10px 20px 20px 0;
}
#lang {
height: 23px;
width: 250px;
display: block;
padding: 1px 0;
position: absolute;
top: 0;
left: 0;
text-align: center;
background-color: #f1f1f1;
border: 1px solid #E3E3E3;
line-height: 1.25em;
}
#lang select {
font-size: 8pt;
}
#breadcrumb {
margin: 0;
height: 21px;
display: block;
position: absolute;
top: 0;
left: 260px;
background-color: #f1f1f1;
border: 1px solid #E3E3E3;
padding: 2px 12px;
line-height: 1.25em }
#menu {
position: absolute;
margin: 0;
top: 28px;
left: 0;
width: 250px;
background-color: #f1f1f1;
border: 1px solid #E3E3E3;
}
#menu form {
margin: 0;
}
#menu p {
padding-left: 8px;
font-size: 10pt;
border-bottom: none;
}
#menu form p {
padding-left: 0;
text-align: left;
}
h1 .h1:hover {
text-decoration: underline;
}
h1, h2 {
font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif;
margin: 0;
padding: 14px 15px 3px 10px;
line-height: 35px;
text-shadow: rgba(255,255,255,1) 0 1px 0px;
background: none;
}
h1 {
font-size: 12px;
}
h1 .h1 {
font-size: 12px;
}
h2 {
padding: 22px 0 0 10px;
}
h3 {
margin: 40px 0 0;
font-weight: 400;
font-size: 130%;
}
#schema {
margin: 1.5em 0 0 220px;
position: relative;
}
#schema .table {
border: 1px solid #E3E3E3;
background-color: #F1F1F1;
padding: 0 2px;
cursor: move;
position: absolute;
}
#schema .references {
position: absolute;
}
.js div.hidden {
display: inline;
}
legend a {
color: #333;
text-decoration: none;
cursor: default;
}
legend a:hover {
color: #333;
}
code {
background: transparent;
}
fieldset, legend, h2, table, .error, .message {
-moz-border-radius: 5px;
-khtml-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
#breadcrumb, #lang, #menu {
-moz-border-radius-bottomright: 5px;
-khtml-border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
border-bottom-right-radius: 5px;
}
#breadcrumb {
-moz-border-radius-bottomleft: 5px;
-khtml-border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
border-bottom-left-radius: 5px;
}
#menu {
-moz-border-radius-topright: 5px;
-khtml-border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
border-bottom-top-radius: 5px;
}
.js .column {
background: #DFDFDF;
}
#logout {
color: #21759B;
}
#logout:hover {
text-decoration: none;
}
#logins a, #tables a {
background: #F1F1F1;
line-height: 1.5em;
}

File diff suppressed because one or more lines are too long

337
designs/haeckel/adminer.css Normal file
View File

@@ -0,0 +1,337 @@
/**
* Alternative style for Adminer.
*
* Klemens Häckel [http://clickdimension.wordpress.com/]
*
* update 2014-01
*
* new remaster based on style for WT-NMP 13.12
*
* Created by Miroslav Pokorný [http://fuch.cz].
* Icons by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] (some of them were modified).
* Slightly inspired by themes created by Martin Hořínek and Klemens Häckel.
*
*/
/*** Fonts ***/
/*
* @import url(http://fonts.googleapis.com/css?family=Ubuntu:300&subset=latin,latin-ext);
@import url(http://fonts.googleapis.com/css?family=Ubuntu+Mono&subset=latin,latin-ext);
*
* */
* {
/* font-family: 'Ubuntu', sans-serif */
/* font-family: Verdana; font name */
font-family: Verdana,Arial,Helvetica,sans-serif;
}
textarea, pre, code, samp, kbd, var {
font-family: 'Ubuntu Mono', Consolas, 'Courier New', monospace
}
/*** Icons ***/
/* Error message */
html>/**/body .error {
background: #FFEEEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlpJREFUeNqkU8tu2lAQHT8wtlEQcUKUIjVVgaiCVkhIlSq1isSKTdRNuu5P8AX5Alb9g+6zqZR8QNWmC3ZRa1UJIm0hAWpeNthg/OiMechl00UtHXvuvXPOnbn3mPF9H/7n4en1nmGAwy+BAUghTjB8iThY5v1EfMatzhB3Lg4Ib3FzfkPwdUSSKulCIZs6PFSkeFykCi1dL95dXx81rq7e2JZVxbwPf1WwIkuJxOmL4+Ocz/PSzHHgvtEIFhRFkfdzOTmZTu/ULi5OJ6MRrERYemFZKU4UK8VyOTcyTWk4HEKr1YLC+XkAimluPJ1Kz0qlHBuNVoizFsB+Tg7y+ezAMKQRqhuGAaZprkujmOZ0XQcDRfYymay7OKdFCw7Aq61kUtH6/TVpPB5Dp9MJSLfYiue6i555Hna3txXi4PDdSuChx7Kig3278zkYgwGYkwk0m02IRCLA4jy3Usb1qWmKxAlXAA4u2FQ6VuHjbhGcI3IsFgNh47Q5zHXCtzAH+GV0u0Vf02QpZCy1VAq+8Y27ntv2lDjrQ0S1T912u7eF/ck4lheGgpKqQrleD2I5BN2y+sQJC5zd9np1YFlLRldSUhQhCEKwYzRE9jzPas9mN8RZC3hoz4nrVi81TcUFS0KRJM5/yWQCUCwhbCTXxmPV9LwqcYjLkFUZJDzCwXN042OWreQEIftEEJQEx4mUNHTd6Xfb7qu2fdNAcg1d+IMMSNylAB3mDmIX7bWfBzjaA3iKV/dgabT7LsDXbwAfcVsM4TdCQ66zEmBDbfL/+IPJURMyKHK9PwIMAA7iHkoee771AAAAAElFTkSuQmCC") no-repeat 0.8em center;
padding-left: 38px;
}
/* Ok message */
html>/**/body .message, html>/**/body #menu p.message {
background: #EEFFEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnZJREFUeNqkk01PE0EYx/+zu/TNanTbGCjWhrCmlp6MGl94kUQ9eOCC8chHMDG9mHjiE/QjePGOJsR4QQ8Q0UOJHqgVA6kiKQXa0th97+4OM1tq25MHJ/lvdmae3z/PzDMPoZTif4bEP+RVHBAJE5+QBAjm2d9dpsuncbtM66BYAqUVuGzmUtCFWsegb8yFpEAuPZpWUvGkHA1GQzw/zVSv/aztTm9Vfjy22laeLS0PZNCFzwXPLs5mZzISpLBjO1BttbsXGZfHIkn5Umy1uLbYMvx130TwtykSQSGQm746mbE0K6yqKkzTHFC1WoXe1MK3lVuZABnKcaZn4NL5K8PjiqmaYV3XYRjGgOr1OtZn3mJh5Akcox1OxZIKZ3oGDp2MR+Nyq9VCs9mEZVloqS0cHB6gXC7jdfol9vb28GhoFpvFTXiGJ3OmdwcOTQoQQpqmYePhCpQ3N6HbOii76Y17K36IKIqYeDfpV8q0zRBn+jOA67p4rjzFzs4Ovtz/ACp2YEmSfGXfTwFRFhtm4ZLjMz2DNv1d047MZ6UX/vT4+Bgbd/rgVQZf4LXoyCaWyZn+DD5Wj/Yboixi6vvcX9CHPzH4Yg/mMv/oDc70Gyw1d+vbAohBRgmubz7owAUGjw7CnucaVlXf5kzPwKMVV3Py9c/7Jep4BkkRZL8yONU5c1ee7RhqoVHydC/PGb8NeDMRwvogxa73hjAnjIm5QOaMEkhHZPG8FPKfSdMx7S29YZe0ba/s5lHwlvHLhc+eGvByxpjiSJBhTJBpdu4sK9lI56FhH4co4htdQ4UespUjphpjna6B0HdS6R8dzHtRY9IZ650IMACI9kBqNfbjbgAAAABJRU5ErkJggg==") no-repeat scroll 0.8em center; padding-left:38px;
}
/* Sql */
html>/**/body a[href$="sql="] {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAARpJREFUeNrE0z9LQlEYx/Fr/gXdJILegSQJEk13yrUxxDFwUhqagyAEF8E34BsIFKlozpqao8K9WVrCJSWu30d+F44SOjj4wId77nPOeTjn3HMjQRB4m8SOt2Fsv0CE8HleYoRdnGEPF8jhB4+4xw0ONLc7R4E7VJBX23JNtJBFSflD9YXjrT3fQhxpfKqqRQEf+MaLxuTVF3e3bo02yjjBrTMojD+9R52+sO3F8KxC13YmeELCHbT0vtBnE6ua1EfDGZRQO7qiQNEK1LiNRzynSKpjCJ+8fY1T5d/VZ+2Y5nQs8YVXPW01+zjGg3JvuFK+q1yoZ3tOaVnJpcOzqOtwzzF28rbaX0zWXbQMBvqc/r83cet/40yAAQCHjz1eQkhXqAAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* DB Dump */
html>/**/body #dump {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjpJREFUeNqMU8+LElEc/8w4qeM4urvsCgqpEO7VYu/9YAmkNqiDRNdOQtC5k3QIL127BF78G+rQqegQlBRRhz24S0jWuumOrs74c2be9H2jkuJi+4XPvMe87/f73ufzPk/IZrOYxh1CFOeLOuEVn0izP6PRKFosFl/2ej0MBgNYlo1m06A5g98vQ1VVhEIhhMMh5HL3H3k8Hiw04GFZFjqdDjRNcxs0GjqGIwZFUWHZFkSPiIAiLxxFXHlQAXBocAQ2ASY4fwNKnxQ602LbxXzMU/hSKBRep9PpPcYY+v3+lIpFGvgRDAaJfxiVSuUN5X4+q8FOPp/fmxexcdJFbziG1+dFUFUQJhFv3r6XeZx7yG+g/F8R/5x00BuPIZNwJltD9WAffUNHq9VyeM5Sg2UR/3Fngo3uaRuZBxm6xhzX7grh60oRGbPAzCH6py38qlRgmia0Yw2H2uELWr7OaQszJ5KRduLx+NN5EU3bxPrWOhKXEohejCKgBhY2SG2mnkg8ebIbWxLx5+9jNNtNHOz/wLdP3zEaDLF7dxeRWATbW9t5QRDei7VaDbquwzAMZyZivV4nHKHV0WBYA1zYUJC4nMKYBJ0WP6M93xI+iuVyGdVqlSsvrTQTQVkLovi8iGQy2ZZl+YNt2+4tyGQONRaLBSRJcs3i9XpdCh6fjMCwC9EnQAnKuHrrmuuFUqkk0IkjVKuT27FBiFHHG47jbPKuNE5fAoimwD8QRZGPDp/TepN0ekfrR38FGAASfDL3E+dZ1QAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* DB Import */
html>/**/body a[href$="import="] {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ%0AbWFnZVJlYWR5ccllPAAAAnRJREFUeNqMU72PElEQ/%2B1HWHZhgYPjkiMWxoLkaChMzgoJ0JhwlsTK%0AhsKQmFxjT4ImxL/AxOSKS/wPXAs7Q%2BEHqO0VXElAkc89BA7c3ee8PY5w5xVOMjvvzXszb%2BY3vxUK%0AhQJW8pB0F/8nP0gNvpAvPYvFYvfo6Oj1dDrFfD6HZdno9X7T2oHXq0LXdQQCAQSDAZRKj55KkuTG%0AyScnJ0gkEu7GsizU63VMJhOEwxHMZgznCwc%2Bnw7LtiBKIjSfeqUUkSeo1Wprx2AwQCaTgWmOKeES%0AjHxMcC4UF7opvIVCr9e7ZRgGstms6%2Bz3%2B9jfv4ePn%2BoU6KUgtgq2Xb2SQBCEO6enpy83nY7jYDQa%0AIbylo91u42e7Cb/fT/0H0Ww239OVb5d3BQLjMdnbfFOpVJ5zm8vlEIls4/OXr1D9W9AJOL/uQ5BA%0A5EAeloocxFcuBqRvotHoi3w%2B3y0Wi1gul6A9DOMtzmk9MIfoDroYkZ1Mz/DHWlwFcW9vD6lUau2I%0ARCI4Pj6mJDtQNW3duyPYN2PAE2xKOp12J8F50B2ONyZASVZ6fQqX8r1arb5LJpMHHMTZbLZKZBGR%0AvBgSiH0C0bgGoswvr5C/Wy6XDzaZ%2BIsqMOdTyIoIn18lAHXcz%2BcePHtyaND0Gm6CVquFUCjEwWP8%0ANdM01y93aZTmcgpF8yDEAhBlBk1TQI/YoihiPB5DbjQaiMfjUBRFvvm/Yf8wkR6QeJXEHxcDlcih%0Ax2IxTZZllywej8dtQVJUaOdnEBXBbUHTVEiyyJmqdjqdHYqdCPQJk8ZUVc0wxrZtm0bFmEsyriT8%0AA14yWcbXdN6jCj7QeeevAAMALZ84sPgoxOsAAAAASUVORK5CYII%3D%0A") no-repeat 2px bottom;
padding-left: 22px;
}
/* Adminer logo */
html>/**/body h1 {
background: #eee url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEXAwMD/////AAAATmEAAAAA%0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5w%2BL8AAAAAXRSTlMAQObYZgAAAAlwSFlz%0AAAALEgAACxIB0t1%2B/AAAAEVJREFUCJljYEAGjIKCAmCGoKKSIFhASFBQEcgFkoJCggyMwsaGQiA1%0AjIaCwoKKQkCGsbGxIEwErJcoBtAcqEWCgiguAADa1AZzThzIfQAAAABJRU5ErkJggg%3D%3D%0A") no-repeat 14px center;
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
font-size: 1em;
padding: 6px 6px 5px 35px;
position:fixed;
width: 100%;
height: 22px;
}
/* Logout */
html>/**/body input[name="logout"], #logout {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkVJREFUeNqMU01rE1EUPZkMaGI+JEMkXyaNiKINzSJLBSEEaRbRVf6Ai1Jw68K9O3dCN3ZR/AUxC0UCwW4k4KKoGKVioGATg4kNY2aSTDqZifdOmmmKFr1weG/e3HPeue++59i4BTgceAogg3/H6+kUm+YUDdMEaIRICyBkvPeeZVwul5XlIEVBEGyMXz7C8vJ1HHz/ttT49C4/UPqvKG2T0BANcybNZEmSTpCdTqeFPcqp1Wr8X1q5eVtSep3w14/v8yoJCSwwF/kbmedsN5lMotlsol6vo6eMpBurd1OmgawwMQDGnCzLMkajkU3mkTeYUp2hUAjRaBStVgu6rmNC6yKTOex6x2MLPA8EAhBF0RIwyQaL8Oj1emEYBoF4X4SLIOwwiS3yj2KxiG63i06nYzngTRYFZmWZMwcfxgE2sLNRKNi9GgwGKNB3uVxGIpGwHbC4oihQVdWas7AY1/aZkymVSrZALpdDtVpFPB7/w8H+Txnp+1uYvHkyK+EqeiBkgsEgUqmUpVypVBCLxRCJRGaHuCDAF+fFwzvHDvSjQ+REPjCPx2PdBxbgNe7O5KgEjnjkAiT/udkZsMBYPxZgsIv5nMkM6pjVWo65EDvgzYXnbUBWcKLvi2SO/hDw+/3QNM3CXECldfHHIc7vKdh9vJo97QEJ7rP4PD1wp69cuxT2+XxSu922nPQHJEAJ2lsdDzjx1Dd4iNG6PJS2t+trZ1zu/Ep6KUxuJZWqcuA/Yz0O/KIdlSEuazrWqIIsNWT3twADAMZTN2W0KIqPAAAAAElFTkSuQmCC") no-repeat 2px bottom;
border: none;
cursor: pointer;
height: 18px;
line-height: 18px;
overflow: hidden;
padding: 0;
position: absolute;
right: 8px;
text-indent: 8px;
top: 6px;
width: 80px;
position:fixed;
z-index: 10;
}
/* Alter table */
html>/**/body a[href*="&create="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAl1JREFUeNqck19IU1Ecx7/3drfrXVpJf6BEx53bjK02UaLIJdQsiOrJJvVaL/UePgS52LvPKdRe68GCQOohg4gYmGTZnEzndNPWXpqbNPfH3T+dc3BrDp888OP8zv2d7+/3+f24h/P5/bcAnMT+VlrQNO3URCAwth/17ZGRB4KmqpxODte+Abqu14wkZqbTvf68E//qPQKq5VVV5ekFuq52cmwfsPz3vcT3ynrte9WnGqoVVEXhVJaAw4e4DotQIp0VWOUBiVRMa+BInPpazSdi/RCoVlAUZReB9quIR45Wdp5ZWsI5u535oUgEF51O5n+emyMEHaDaOgIwAq8IfF9ZYf0ebGrCdDTKem6WJHwJh5lPF9VQLU+zqORy/QzOmM1wyTK2SiX02GzoJRT5YhHnHQ5cIBQiocn5fDi7uGhnLTQSzCeTjEASRczGYqyqidIsLCC3sYHc6io83d3oGR29ziuVSq2FKsHp9nY4CEWxXIarsxNuqxUFQmM/+gfq5ibuDg/j2fY2ptzuqV1DrBJE19cZgWg04mc8zgiMlXn8CI3hZr8HjwMzGBwaQjCRWKYEfCOBra0NXYSiTKo4ySzMLWlk4+PwEvHkuxA8fTIsZC5UK5RLpQONBLFUihHQFQ5PIJ98gSuX+vDq9Ue0Wu+h+UQv+5GoVshmMqLBYECwK7/zh4u1t1XIxPB7+SUTvyWV3Zf9OGbuZzGqoVpOkuWHvMnUsddjueNMeZ4Hpz1Pn7jW3oePhyLpw4n6uFYorNGmJWItxIQ9cqTu3+Ams1sYf/NJn22IKcT+/hNgALjZYbRNSSf5AAAAAElFTkSuQmCC") no-repeat 2px bottom;
padding-left: 22px;
}
/* Create table */
html>/**/body a[href$="&create="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi9JREFUeNqck8trE1EUxr+ZTjKZ+kB31UwtSUiVRFykRsGFKGkEF7qqe5e6FARdtVBc+B+0brTg1pU7dSGIWm2sMebRkDQNTVMSoUWC2qZmHp57kkzTuFB64HK/MzPfub9z517pxtTUNQDHsL+oKZZlHX82PT27H/fE5OQtxTJNyabkyiJg27YzqDAPW8y9eef9QuwIhFc2TVMWH4iIBySex/27OkY65rOd510tPMKrmIYhmVxAwquSDb/SpM62eOVxjVasWZDovdCWo8lsH4bwKoZh7CGwqtu4GzrKeaJQQHR0lPX7bBYXwmHWb1IpIjgB4e0hABPEVCC5ssL9HvB48DGf554PahreptOsRQiPQ2DSx7sEwOmREc6/lEqIBINtGip0PhRiPZ/JQHiYgAv0EWRWV5lAU1V8LhZ51UFBk8vtIWgXaLWcFroEp4aHOc+UyzgTCLBO0n483ZlDspGGbul4EnoE4ZV7N1EQiMivrSFHFKrbja/URmp5GR6ieVddwNnoGAq/ivwbuwRyP0HQ6+V8iYqEfT7cSdzDfP0TBqlIw2wALQvxF1dRCX+bUHaazQGrbw+K6+u8ByKy1MaHSgLeeLvohrEB76XOAuUlXfm+uam6XC48Pvmzc8LVv+7WuWoUqZfJ9gm8LEN+TQdKorniriuNWq3uj0Qe/s/l2b5evTl0UR+q56t17bk+J2+5KuLAazQO0VD+WeG2+wH9vzEMSIuY+X2fnvz4I8AAYtpfN5Cu7WwAAAAASUVORK5CYII=") no-repeat 2px bottom;
padding-left: 22px;
}
/* Create new database */
html>/**/body #content a[href*="&database="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjpJREFUeNqUkr+LE1EQx7/7g93sJptERPFSbCGSJkUKK20CinB4d8UVQWytAqIiWEoKi4CVlYJwWNwfoMVZCIJWFhcuTQiCORFDJN5tNtns5TY/Nm93fW8TNcHTOwdmZ1hm5s18Zrh8Po+ZrFFdwsnkO9Ut5og//4zH46WNjY3njuNgOByCEA/t9iH1fUQiCjRNQzweRyIRR6Fw47YgCFgowIQQAtu20el0wgKG0cdo7CMa1UA8Al7goUaVhVb4fzbKAQE1AedPFVM9eQEaPk0MZsleqPMyP0KlVCq9zmazq77vYzAYzEYhlEEEsViMzp9AvV5/Q2N3jipwsVgsrs5DNMwDOCMXkiwhpkWRoBCvrawv3y3cYhsoHwtx37ThuC4UCm7iJylEQFHl/4H4e3af845lcPQWfm3Aw2PjCb7sNWDl2jdPm/FnxCcQMplMGOt5HqrVaoraNBuh1WrhW+MreoYBx+rB6fawxb1F7moOH5rbg70znafmqR5ERpwJtX9CpEn20MGL4SZ2x7tQeQW2Z0MccCqRgx3aVkVsNptIJpNwXTdYhEiwb1mwXQe1UQ3n1y6ED5nExKX1yzp19fcv30Esl8tIp9OQZVn82zHpQQqNV58hiiKk5Sg+bdaak4hnUEYVlqTQ49BSqZTKAtixSJIUjiDICtTRAe7LdxCNKbi3/QBdrwv/kHB42L9Oc/thAapnLctydV1/xGAGQTDbATgq7AOe5zG54q/4ZZzj2sFHlsNO54cAAwDujTg3Gh40tQAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Privileges */
html>/**/body #content a[href*="&privileges="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlNJREFUeNp8U11Ik1EYfr795kynaBBLglbtqiyRSMiMunCCF0FgBP14U5d1JdHFJAKD8rKrEAIjqMlGF/0hTHKLSpi15ZoMjdZgbi23ydzn3PZ93/b1nuFkK7cXHs457/s8z/ee853DybKMckxbVNAowSkUOELLXoJhqxQlfCwW4RcKkAfGpG2NCtXBSUUMtuw1DR3qGeqVtXqjkOUh55LBlW/TPalY0EactwR5R4O8KHe27Tt86fjgyOWvTmvg15LbUShKMHTs7zh5+sI173ubcu13KEzUhbJGUWmQE3Cus/+G2ee2BoMRhx369WFla2Y4lg7Y/QuvgkdPDZgZp1JT1cGmgANNzXvao8n5sEoHM6XM5dqfjdB6d4PKyDi1DfIynxdyOXP/eFdBkpBKxZHhk9BpJOzWyhAEMcc4lZrqLYj47PnkWCySOJ9OYy0WRTwSBJ8IoyDl4fniW2Scmh3QIc7MvrEbE6ur+WMn+kxaXWN7g6SHCCnhdLqXAz6/leMwU7MD5lEo4rF37oNl8tGYq7GlFSq1Bi+fT7m+e/0WVmOcegYsRMIsQc0WSnVpUG/lxH/JVVsQpf9rticT72gYLSfpNqJmB+xWV4BjuSs3b5+l+QOWY+KfsToG9+zAcgTIZkso/a6Jh+OvaX4nswk8dQGTrjoGLF7MAUsrQJpHjq1v3R29yPMY+UHGofgOJ8ZeYxnsMRE0hKar3bBGPfdlGqf6DuI85fSEXeyjlRqu8jlzHMc60hGauww4Y2rD9UAcz3wxzFOObSlN2CDN9nH/FWAAi5Yew8BvpusAAAAASUVORK5CYII=") no-repeat 2px bottom;
padding-left: 22px;
}
/* Process list */
html>/**/body #content a[href*="&processlist="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAj5JREFUeNp0k8FrE0EUxr/ZrNvEWlqITdKqTS/ai6AWTyIWFHsTETx4KF49KR68+Q8IHqwgQr2pBasVBEUFL6KtejBLQRDEoiKShBpzWGya3ZnsjG92Z9co6cCPN/Ptm5n33r5huD8MM3acP3LOqbfWWC6Xw93lewFpVf2BnfmFzYaFUMFQ7nQ6E5zzCW1pPa51triR+B4mFo0dM/NRG0IlDnuFECPtdls5jgPS66S9gUy/XyROEw+NZVr85wAuxG7f91U2m2Wkr0ZqmEbLelkbXCYOewTn+4IgAEUC0q34gPSC68Qj4hpRjtIHijaC1GF7KGUpDENQDUB6VEB1zAF76uvpa0MyTsVF1BEYlIyjkfKvxp75yYZDxGMznzLzKRu/KUknTosLDs/z4hQCk1ohvfF7V/6XiBPEExs+OQrSMwyNnw00m83YxY9/rxphYLso3R+SmbzRbS0ozJFjBQ3ekRk6rI/2ZSgqWke6/r4zunjcbNT2KvFcW8Yu9LnTZ09OSqVQ9Wqoe3WUBooobBumFpBYWnjhkuNBdkP07MQMDlgbX9xP5dzk4Gg9oN7JAuushdCRWLm97EJilr2XH1BTR8l/LmlvGg+IlzqFeQg5+/HmOzdfzAODwFBhCKu3XFfrqKp5VKKCXiamjf0WXZ4WtUT2uDWDGatS/rxfaRutS6w72qUedkyfsgXr9Di+qhb60fJW1vJ0/gJeqbek90fdGlMj7hBXCMc0kstMKAPE1v/qo18BN3Q2e85/BBgADNADzS2n40UAAAAASUVORK5CYII=") no-repeat 2px bottom;
padding-left: 22px;
}
/* Variables */
html>/**/body #content a[href*="&variables="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi5JREFUeNqMU0FoE0EUfTvZlArmFpR4L0jT3HvoKR6EQG6eC5bQeuwhIAhpYREUDz2IYKG0SEvoxbOtBIVC793oRTCQQyOlFGNNUrK72Z3x/8nOpkUQP/z9uzv/vX3vz6z1aG0NHJZllank8O/4LKVsySiCUgrfjo9h8w0H1Xu76+ubAS2OOKVERGtm3XVd7DYaT/hblN/53f2FBQhmi9OSDBqNdAaeh+HVFQaDAfr9vq7vHWeT+h4QdsZIsiMCx2ExtaBrOpWaiA5DhETc7Xbxpl5HcXb27et6vUYrzzWBnBAIBgtNg79IisWitpPJZPDRdX8loJAI4qQ5jgnarRb2trbQabfhk/QP+/vwyI4Vk3OvwYmI2ONMLDQODvB4ZQWfDg+RzWbh+z7SQsCmZBLuNTibLzcsUBMD+P56nSJLU7aN1JhATCzwkMYpjIJSuYwXjoOHpRJ+XlzAox0Z9HqYTqf1bLjX4OxwokDPgLNQKCA/NwfeVkmDe1qr6cqZIoWEsRIFZt8pEwVfm01UV1e1nebJCZ5Vq/hCB4nXtAXqNbibFlgBn+dcLvH/bnsbrzY2sLezo58tvasTC+L32ZkhSHaBIwgCbYcrK9E13mbuZQxjRevoCN1Oh4+tHQ8CndNTjEjeD3pfWV7G0uIiliqVRAH3MoaxHLco79ydn3fUtaCBqUhKRcdY0c+l6CdTXhgqn565lzGMtQ1B7/z88nY+/xL/EXI4vIwJwj8CDAAVoIrz1xox8QAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Status */
html>/**/body #content a[href*="&status="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAftJREFUeNqkU7+LE0EU/mZ2d3bD7pqckhQqB4YDuQRsTj2t1ULESkgnWKloYRMQizQ2dhZXxkq8fyCFjdrYCAqCCIIgLCgWIkQ0m+Q2+9P3ZnMrNsJ5Ax/zivd973vvzYiiKLCfY/Z6vTbdmwR/j9yQ8NrMsuxsv9+/12q1ulmWIk0zQoIk4ThFnucoTRoQwtQwTYXxePxhOHz4wKSEA7PZrBsEgU5mkKjGv2JCdzQauaZlWflgMECz2dS+eCZl1aKKGUmSIIpiSMkOTO1Sz4BsCiZ3Op2qCltfnFpD9vK9Jk4mIWGOet3X9hnz+aQSkFyJSbtgUnH0EFWMiDil5BiW5RBKMrmmnOiPgBACcRxr4i6c1RbCcIbFIoNt15ZEtXRgUTzVApKSJdvmaumZ4/pm8CEdeJ02jmzdROPSaS1k2w6UsrWIdkCVjdqFk0g3T2Dx6Su8+9eqRXvrx9C4dRE/7j6Bf/083HNXcLi2go2VNh5fvVMJSPHiLSbvPush/nz6Su/dXV/DwduXEQ6fwXUbyLbfIC1yBAIIiMhtVw4cx9F98wC5HaU8qG8LTB89h/M9gUG9S2n89Qx3dsoZmPSILKVUtffyWDTAMYyPvxARUUqxrCgqgSgKaa11T/i+f8MwjNX/+Ujk9gtL1pYfydwjP+UPJfb7nX8LMAC+uy+OK4sAWgAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Alter database */
html>/**/body #content a[href*="&database="][href*="&db="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAltJREFUeNqMks1rE1EUxc98kMlkMkkqbaXRhaEStCAhaDeuKii2JBWFtiqCYFcBof+BKW6yU3FpyUJxU1Eo2IKtXdRFV7EiFMG0pVAsxnRmYpPWSTLT+fDNpGpCwfbC4T1m7rvvnt991PDwMPZjkKgLR4sfRNPOhv3zRdO0rmw2+0xVVdRqNRiGCVn+RfYWvF4eoigiEAggGAwglbp5n2EYtBRwwjAMVCoVlEolt4Ak7aKuWRAEEYZpgGZo+AS+pRX6v41SgE0Wm7IaQkNHL0DSGwft/cOmq+ZotvApk8nMxGKxpGVZqFar+1YMwsALv99P/Aexuro6S3KXTisKhhYXWwqcT6fTyWaIkrIDta7Dw3ngFwUECcQriRv9Y6nR6f58PncoxC2lAlXXwRNwe1aIQAR4H4ceWY5EFGWqCDw9BOI/7xbV8C/JRewwzJnI+Ph1GXjIHjqFvxMwsacuYX2Dw6P5+eTV7u4nt2179sgQ620S9rhF3LmWQDwen5Dq9ecjwDLrJDtB1oMQf5ZRqang6RWYpfe43JfA1NsPuHBOqC6vnFzOt7eD3dzcRCgUgq7rditEA1vb29C1zzCNOQwODGDyzRy6e8fw/dWLfEcHjYVyGWwul0M0GgXHcQd4UHoRgvYOg8kEXk7OoLPnHtpO9JILHjNOl2tra+4YefI4xHA47GNZ1n0sHo/HtVBan8Stu6+RnRjB8bOj6Dx1EQxLQ1EUvlAodJKzu4QzjhGFeZ6/ZNt2u2mScdm22wCx8WCoj/76ZYP5uFFkvlEUZRM5/2XSwQLJKfwWYAAtt0zt3hIutwAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Database schema */
html>/**/body #content a[href*="&schema="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcZJREFUeNqkU7tOAkEUvfuABIgsyksTAkgBtISS0kIbYk/sTKgt7PgF/QEK/QMaSDREjQmFNhu0oLEglISHbniEAAE8l8AG2O2Y5OTOnT1z7rk7M8JisaB9hkh7DjmXyx2KoniGuRvozufz19ls9lev13VSJBIhSZJMeVI8Hr/MZDLXwI3T6VQqlUq/2+3W8FEXGA6HNJ1ODbzRaFSTG43GMUTOmcQR+ZOiKNlNm+PxmFqtlm2Xx9/gTIp5PB4lEAiclkqlt2Kx+Gmz2R5kWVYnk0kSnHy/31exwcDTNO1bgB0P7KZB9AEtCBbRayeRSHABdpKvVquEnk15MhY76O9x07LX66XBYKDnbrebms2mgQcBks2OxmKxEGzrOaxTNBpdblgPOCL+0QYBq9VKvV5vay0YDBIu3BE2XbAe0EH+jPhLDoeD/+RWdZzCGlm73U4+n49SqdRVuVx+QdUFR84BEkyvJ/cmL82lUemEJ+Fw+EBV1bs1J5lM3iLcS2YC/D64P1j+wVxdIeb3+12hUChcKBTecYwf7Xb7a9MBz1mQS1u5m1VcAq5cAN8LF6BBXAXquwLC6oFJJhA3wLwp33Jh3+f8L8AAZ3ntkRsbeCkAAAAASUVORK5CYII=") no-repeat 2px bottom;
padding-left: 22px;
}
/* Refresh */
html>/**/body #content a[href*="&refresh="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAt9JREFUeNqkU0tPE1EUPtOZQh9QSVsKtAgB5A3RWDRaU+PCR4RUDSZGSTeuiDvjD3DRhJ1xYeI/MJi4wMRHosTEuJCNEqJBQQtFaAuhb0amnee9nlsLNW5cOMk3c+fc8333nO/McJRS+J9LYLfjD1ZBMJtBEAQw8byX47hxDAcQPZW874g5PGyGELLJ83wY34Nvb3omhb8EQwJPI4cO2tytjRanwybYWFAs6v2JtByMrktXCaVzhq5f2COY9qmUhqy1MHXltOdIm9PSyulgK5UMUBSCZXK2dpeldeyk+4yO5PCY14/PaguUEC/PkchYoGk4tVmCkqrLK1tSMpEuFth+h8/ecKzf1ZVNy3D9vM+/k1dBU9VqBbqqjnf5rO6tuAjZ/K785kPiy3qycBeFRzRZHonGcq+mX0bnPS1WWI/mQNd00BWlKqAqyim3w+zcyRfhayybRPX7aNi0JIpsL4w4cSs86BfzJWhwWcBiFVi82gKe0s1znE2SNUhuFwo4iWlD0wAdZ94E2ajvPZyb/9NtnNT8vgBTkxQdJIOU18QwwDB0qLVY2XgnmRDrGUn+kcPt9c1NdfT568X1aguyHN0uyEXJJIDjgLUBPZlQSzLkUinIZzKwg8Aqj9bV1ZzDnKF4erdRUxTzvgC+vF+LZ3KiUAstvW0+PO0Olj1R2cMu6CjGrnn72lswh9tIZFWM71YFVHVmbflHhtitkODtlqHRwKCnrTGCU/iIeIfr20MXAwNJcz1lORvRuIScbNkLZpAj/Jj1HeLttinX5dHhkk7BbubAUVPWF0WVJCWNxqwCt5J9+mLBKMmzaPSW+OjGbwE0B0yePjD1XgqZfMMRc0+3m+vscBKni33KoimXjdHV2JIWjX4mycUn5NuzGEktQ5lbEWDTcCHcnGegmes8GwRn9yDw5k6MSaDLC5BZ+kRXZpdpfu0nxtKIDHL1PQFWq60C4R9/sFEWBSgil/wSYABg+JOXZhLaRAAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Show structure */
html>/**/body .links a[href*="&table="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoJJREFUeNqkU01oE1EQnk02iTFQE7QihUKRkKTF1iU9+FdQCoWYgAcPegkIeiiIWiHgwUvpQXs1Ggo99OYlFwUhWAhYhZJWUmhMxJbYYk1LFDcmJraSv911vjQbevPgg9kZ5vu+eW9n3hM0TaP/WSI+gUCADAYDmUwmEgSBUNRoNJ5jaKjNSyuKsqRjjUaDVFWlWCy2X0BfDJ5nd5r9KxZI0Wh0BuRgMHibcznGrrD/wD6hawwHxBdcLte12dnZGYfDcYOFhkJBpnL5F3Y0IAcMHHB1nYAj+Xw+xHeZ8FSWf1BPTw+trqY2JElyAkilUhsej8dZKhWpu/s4jY+P3+P0s/n5+f0TVCoVqlarL0Oh0KTZbCZZlmlgoN+pqgrBEO/u/iZg4IALTecX+BQX6/X69Xw+v8e7bYqiSMvLy+t+f2AGhhg5YOCAC43+7+T1eh+srCS1hYU32tJSQkun09rg4NA0TwLTIMTIAQMHXGigbU2hVqsZq9UaNZsKKYrKoxRZKDYwKizEyAEDB1xoOk3kzo6xP4PExMT9WyMjl/q2t7+npqYevkBucvLx1d7eE9Li4tutcPjJXEsoCO+z2WxcP0GcC3zmDt8ZHj7bVyyWyO32SLHYOwl4ufyTdna+ELCuriN2nlSEC2x1mshdRZGbkchcSJaLfCOtFI+//prLbRIMMXLAwAEXmk4T+ZLALo+Ojj1PJtc1t7s/bLfbHyUSGQ2GGDlg4IALTesd6Y8JY7JarX6bzTZtsVhOwq+tfdMymZx2MAcOuPrmrSYKaDHRUbZjbIcA8sM6xQ9sADFP4xNf54/t21tnk9kKrG3qBdCLw20T//GCFbY9tj+sVf8KMAACOoVxz9PPRwAAAABJRU5ErkJggg==") no-repeat 2px bottom;
padding-left: 22px;
}
/* Edit row */
html>/**/body table a[href*="&edit="][href*="&where"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2lpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wUmlnaHRzPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcFJpZ2h0czpNYXJrZWQ9IkZhbHNlIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjcwNEVCNDY0MDM4NzExRTFBREUyQ0JDMzAwQUI1NjI2IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNEVCNDYzMDM4NzExRTFBREUyQ0JDMzAwQUI1NjI2IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzMgV2luZG93cyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOkFDMUYyRTgzMzI0QURGMTFBQUI4QzUzOTBEODVCNUIzIiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOkM5RDM0OTY2NEEzQ0REMTFCMDhBQkJCQ0ZGMTcyMTU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+MT7FiQAAAiZJREFUeNqMk1FIU1EYx/9nO3e+NranKIw2ErM9SQQXxCKMRdFDCWEaNIuIetseQiIKG/jQQ4H0kkQxdLRaYiijtdWwljjKjQlNRQPHEhWUjca9eb3bPd2tFTdrrgMf53x8/98533e+cwhqDFsDQccpILHYXvbv+f1NBcD5DfB8BcZpLfDAvp9+YrE81c+azc6jLlf3RE/PLgWgtBaoGVZZltv4dLpbcjph6+w8Fhgc3CD/AQIMhzOr5osOV7orlUrBaDTC29gY2L25eZPurwfOtAIHW6rUosKyjOtXr7ns4bEW7G1+Bp7n3Tv1eq+V42bojfMAIdvDpzv67MWiDIvFguFHTS8FgfrnCJmZ4zhUvUQtLEkiVlYWEJ98MW7dg35F0SV/yWgtWBByyGaXEH379L16oFtPyRutlG4H53KrEIQsXo0ORQ0c7qg9C2+V02rw2loakvQdwz7PhMGAXkYR0krVlpaN/gteXp6HohQw9MQzqcK3GSO/Yd8YgyiKf2bAGBrEPC6fdfTZM5nPqq/g8YA3pqZ9S42V4ZEww0iI/VUxFSUYCkW0nbsSOT415YbJZMbDB76PtARTvA5GgWBUqdosmhdJs413tBOdbofR1CXev+uI19Ux94ckCb77xGr9NdD1PE4eOnKhdfR5/3Qk5I99WUIgkkBcLcykxhWNFbf4pd2V0htkl06QgdkMYskFTOdFtlERF0qXXZm1a7kSL9sPAQYA2Q4Ie25SbgYAAAAASUVORK5CYII=") no-repeat 5px bottom;
display: block;
float: left;
height: 16px;
overflow: hidden;
padding-left: 24px;
width: 0;
}
/* Select data */
html>/**/body #menu p a[href*="&select="], html>/**/body .links a[href*="&select="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdVJREFUeNqck8tO21AQhn8bB8ehRe0SUEBOlIsSVFGqqlK3oey6K+9A96wTKU/RFU/AG7CrKhAg7gmKiJKIplFWqItWIQEfuzOT2LmsSo408j+2/5lvjo+1rULhM4AFTLfahuu6i3vF4rdp3F/y+W3DVUrzKNk8BTzPC4IKS3h8Hc0Hz49zr8BeXSml8wu8PsU1uW7EhjpHOmd7wX1fs4e9hnIcTUkBDfs1DzGjS5N1pPOGRR3bLjR6ztoNNJm9ebDXcBxnjMD99YCdzGvJT25v8T6ZFH1QLuNjNiv6++UlESyDvSMEEIKcCZzX6zLvXDiMo0pFZn5hWfhxfS2aF3sCAkUvDwmA1ZUVyS9qNawnEn0aKvQhkxF9WCqBPUIgBSYISnd3QmCZJs6qVekaYZqbmzGCfoGnp2AEnyAdjUpeajTwJh4XfU778S6d7tNQISlA3rFN9AkqzaYQmLOzuKIxuGuYaE4H++F/RvbqVEVXE+cgsbSEFFH0Hh+RtW2sxmLo9npYoy/yNpUajkBeo9ftzkwSVFstIeBVpjH8rhc0xigBe43f9/dmKBTCburv4ISb//VvsYe9mmXbX/VIZHman8ntdH7y0BbFSwrjmX6H4s8/AQYAQChL+KIinhAAAAAASUVORK5CYII=") no-repeat left bottom
}
html>/**/body #menu p a[href*="&select="] {
clear: left;
display: block;
float: left;
height: 18px;
margin-right: 5px;
overflow: hidden;
padding-left: 16px;
text-decoration: none;
width: 0;
}
html>/**/body .links a[href*="&select="] {
background-position: 2px bottom;
padding-left: 22px;
}
/* Edit Sql */
html>/**/body #content a[href*="&sql="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkY1Mjg3MUE5NEQwOTExRTFBMTlFQjAzMEMzRTgwNzJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1Mjg3MUFBNEQwOTExRTFBMTlFQjAzMEMzRTgwNzJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjUyODcxQTc0RDA5MTFFMUExOUVCMDMwQzNFODA3MkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjUyODcxQTg0RDA5MTFFMUExOUVCMDMwQzNFODA3MkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz67SGPfAAABvElEQVR42sTTSyhEURgH8O94jRqTJg1lo6YsptGIpEzKa2FhRGhY2chCWZDSbHATmkgkC81CInklpCxGmlGy8QqTopnFJEXyiGsadDv+p87UbKwsfPXr3PP67nncyzjn9JdIoD/G/ydgiFKUXfAIJmiCLOgEC7zBNmyCAlabwZAx9f6uTybqFRk2oAXy5LNoG4ZRyIAq2W7bXWBkNBq9DRbLClcUvsXYvtgCEpEeArAqV5YPl8v9/AmlX47Jw4WVmUym7MXTU2e1xzPxzPmwSDAOTqiEJZkgObZH7zxpot7iIGvkg3rP/Y1Ws9m8fhyNzqHDm4ROnzzMPnEmsAcpkBhLUlJAmeXF5Kiuc9mUAfdrmi4xFInoL2K30CYnrcOgnJMi0ecXVTgqKKe1zWWbnXH7dvx0FwxrN5qmUTtjhSJBB77GIpTfoJMJrqD0IED2+wca6+5xGacn3SeqykcCQYqiL0lVVTHHIwaH4VCWYjXZUAxbtXb2ytVrrnSyUH0VNctDDsdZE3tOlcvVxR8eIhPOakrY0+0jDV0E+RHqX2JX8AGq9GukQS4cwAvUQLq88lT5sgT273/jjwADAGLJkFFBwODaAAAAAElFTkSuQmCC") no-repeat 2px bottom;
margin-left: 10px;
padding-left: 22px;
}
/* Inline plus */
html>/**/body #content input[src*="file=plus.gif"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAelJREFUeNqkU81qFEEQ/tr50UncrI4iwq6oRJCIIV6zxFxE9iCIbxHwXXwA32CPXgRFEZFgPGgiIcfNn0hgYU1mnV070zPTbXXP7Mwke4hgNzVT3f3VV9VV1Uwphf8ZDJ2r9GUXSVuhdZvEP8PmkOQtFF5CqaFttpRauXN99vmDmwtNz7ngVtGnI+QxF9/3Nme3ezt6+cJGavbbCzfmm+JP5ApEBXgwGJh/vV6vcrj3G/ea2wc77ZzAePAtWG54HBaoMAzxefm10VufnqBWqxVnnue5ZGeuaiPJQoyiCJzzAiSEOKFXzxhjGNsVBBpUJdF6v9836/0f+5BSZga2Dd/3JwniOMZoNMK3x+/R6/UwHA4NgeM4+PronTHUMvemhTAKJwnSNAVPOLrdrsm8BmvjseFYQDVKnKRCEGfKkThC4AR4uPU0uyhhNpY+GKP5j8samY0ZcsaodPGpCAIrgJoifWpccJReL+vUl3WUNCciENQBOIcqqiQ4j5JYNxfNMoLIZPcwllQGD2UXkse59VamN072suSSSiZ1S8PCLt3nFq5Jnt61G+40m2aWua+dvwo/13MhnDj+MviZHkQddMQaM5AZdhtL7BmuYJHWl854TAF+YQ2r6hV+q12Wp6eGMs//OhLd8X8FGACYiuElnjs9iAAAAABJRU5ErkJggg==") no-repeat left center;
height: 16px;
overflow: hidden;
padding-left: 16px;
width: 0;
}
/* Inline up */
html>/**/body #content input[src*="file=up.gif"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi1JREFUeNqkUz2IE0EYfZOZ3WySi9FAPLU4fwjEw8IUhyjXxUYrK8FOG8FWQQst7OxEUE7wOq200qv0GguR4+BEMIpwGDxNBE8vcMZcsv87fjPJrkl1iB885s238958M/Mtk1Lif0KI6iINLAfGzhOpEXZto9kkvISUDwHZE4OcvFA9svfS7LH9ZSttWOPrJeIi1Wg7vrO08rVS//idUWpOIArVt9qJmaly51ff6oxIO53BrFAojDpaM0f3lesfvtUGBlIbFFNMWo7jjO399HZFj+eufxnLm2bGIl1R8ZSugOB5LmzbTvD41oFEoPjoN9t2EOuEDAO1hjmOB9d1teDF/arm3W5XC6Iowr3LOZy8+AZccJRKRSogYMMKyCAKmO/7CMMQC3em0Ww28Wyxjna7TZV5eLfaBeccrx/N0pUK9Pu+1ihtbIAgCGG7ARqNBpberuPm/AYMw6B3Frh2t4n3n3qaCzMLyUzEOoHhEbb6EXoex9kb6+D0kkZmx0BAUPzq3AZCvwUzUwDjVP3wCEI7kYEdmjDSeQ0VvttLDISRpXxuvD2i2CD0tQFSalH6b/tQ1yQGZjYxTiL0hwaBp9vT86UrrInEgThOX/mseb50aEzr9Xsu6VRLg8Ndpf0PTwaOU9m5ZypnWBMixQ0oZPK7NeK5gu/Y7trKq9bWz9YT/H6wrMooghUPgp86AzZ5nNy2+ZnkJuSPZYTPF4iuKYOMqlIf599C3X73jwADAG6CADM79TwjAAAAAElFTkSuQmCC") no-repeat left center;
height: 16px;
overflow: hidden;
padding-left: 16px;
width: 0;
}
/* Inline down */
html>/**/body #content input[src*="file=down.gif"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjVJREFUeNqkU01oE1EQ/l72vWTTZps22B+ltCiBRItYsYhSBIkXxUMv9qzgQaH04kEFe/WsIh486s1jDyJePIhIoRepogjRYipoNRBjmuz/Pue9dJf0VKQDHzP7Zr5vZ97sMikl9mKcT78kx/rB2GUKKoShXTgNwitI+QSQbd49k1emp/Zfnz05WTQzwtxZLxE3qbzt+M7b1W+ltY8/GB094ohClaucnpkoNv90zGYPtdnsPuXz+V5Fc+bYgeLah++VroDUAoUUk6bjOElVq9XC84dHdXxx8T0sy0py6XTWJF5B38F2B/A8F7ZtJ0We5+2Ie3NCUPfbPC7DQHnmOB5c102KFKFer2tfq9UQRd2LMLiB4eECNRCoO0AKEQlEAfN9H2EYYvneYSxeMvG73tAC6u0SBh7cnsKbp7MUc3Q6vuYoLtcCZEEQwnYDVKtVTI5I3F0Yp1YF7Znj/s0SThwZ1DFP90EygZiXghqB2tnqRGh7Bubv/NSFx8sDXQIhJp+5+g7CtMBEVnMUNxnBDtMQGQu5oXHML9UTcoyz1z7pXJoEDJFLRqAOaJ7QZ0j1aQGFgX2HMHdrMyGfW/iiz+K8guYQlyPQ62p4vnS5mcvEW8iPlXHhxtck7jWv03aJ19BbgfuZllgeDRynNDg20S/MHE8ZAgpZa0QjflbwHdtdX329sfVr4xn+Pl5RuyyAFQ7COD8HNnqK1Hb5mWQDcnMF4YtlCteVAF0pLP1V/p+pPbb+CTAAmwfytdL1/44AAAAASUVORK5CYII=") no-repeat left center;
height: 16px;
overflow: hidden;
padding-left: 16px;
width: 0;
}
/* Inline cross */
html>/**/body #content input[src*="file=cross.gif"] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe5JREFUeNqkk89KG1EUxr+ZubnUjJaipgtNtTZKxE1AVIi4yM5tF30Hoe/iA3TnQkTBRbZFKApCAl1142CJqLR0ZUNJJpPJZP70nJvcEK0SpAPfzD3n5vedM2dujCRJ8D+XODIMGMA4aYfibdLkCKZO+kxlP5FcwRla7MytrHxcLhazMp2WT5HcbeB5gVOp5H44Dqd2RdTb217a2Mi6vi/h+6O6lu9WV7M3jsPd7ppsQJqMTVO6rgtWdn8fev1YrpskkhlmzZBuLJ8qN5tNLJfLqgw/OX4sxyaaE2G/L8/z0Gq1cLy4iA+1mjKcOzhQ+RrFpmniy9oaUqkUMpkMNDcwCIIAYRhiwraxNz2NwskJLMtSgJQSZwSr6Xa7aDca/xowHFB7Xr0OO47vwazx4W9PJpozu2xK6hCY3N1hLIqQPz29BwshULq8RJp+x5JUTHODIRpkkKbv/GYI/ra+jq+FgjJgbV5dKYMX1KHmBh1ImgFv3pZKCr4geJZiVjWfV+2e53K9LqiQ5kSnfzwjmuIY+cxT8J3g+aF35nWVYJ1rx3HQ6R1pWNd0ewu8bkdRfkYI2zYMi/8M4oF0juGq7//8FUWHh0DF4L2XwMIW8H4KKFL8asRR/vObwHOg3ACu2YA6x0S/wHMunmHzrwADAPb07huzEp/RAAAAAElFTkSuQmCC") no-repeat left center;
height: 16px;
overflow: hidden;
padding-left: 16px;
width: 0;
}
/* Delete */
html>/**/body input[name="delete"], html>/**/body input[name="drop"] {
background: transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0RDRCQjlFNENFRDExRTFCRkZGOUEzNzI5RTFCODEwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjE0RDRCQjlGNENFRDExRTFCRkZGOUEzNzI5RTFCODEwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTRENEJCOUM0Q0VEMTFFMUJGRkY5QTM3MjlFMUI4MTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTRENEJCOUQ0Q0VEMTFFMUJGRkY5QTM3MjlFMUI4MTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5zX5oGAAAB3klEQVR42qRSvU7CUBS+LQXaBgIpgSiJEpIuxMlVwgMwuOAb8Ah9AgZnJmfeABYegMHoGxiW6qAJJg3UEJAWaIvfKW1TjamDJ/l6b+893/n57uEOhwP7jwn0GQwGjOM4H7Aq0AGugPPA7xV4BEbAjJISut3uMUDMrgVB0CqViqrAstmsSI673e7SNM2WYRg3juP04Tf+VkFIBqGnqmoDlUie5zHLssI7GfHkYrFY0nW9t91uWRiEDxyqqVRKq9frDWSTiEhOcdAZ3dVqtQbP81rQ6rEClNkpl8uqbdsSSkwUDYkkVKLO53PS6S4M0JQkSdlsNpGj67qU0QftCUEAJsuyQpx4gDMsIjm12222XC4ZqvFfJZPJMGjjE8mGwyHb7/diwIla8DPggkFpf0+En2RfNP4oWzg/fgAo/obyLxFAnkwmf2lA/jZx4hU8rNfrJjLKwTAlGpKZxImeET8j9P0MsoVBYkmA4UUtnTjxADOaMPQ/xd6iPn8DtLEWi8UUa584UQuYLiaK4rhQKNCzafl8XgWUdDot0j20sVerlQnoKL+Pasf0SvFRFnBQAl6g+m0ul2tBjwucnwb37wj8BJ3uMZUG/k+AOeCEATzgk7qBwwcwTdDQDXyJw74EGAC1PioqQ6UN2AAAAABJRU5ErkJggg==") no-repeat left center;
border: 0;
cursor: pointer;
font-size: .9em;
padding: 1px 5px 1px 18px;
}
html>/**/body input[name="delete"]:hover, html>/**/body input[name="drop"]:hover {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNqkU0tPE1EUPvPoOHdaSSkUsYkY2xLTmpCQmJBAumBNZIFLoz+CX8Av6MpfoHHLhgXsTTWE7ohtDRhEkrGpQy0M7e3ceXnO2Db1BQtv8s3cx/m+87pXCsMQ/meo9HktSaDgnyABZBAbOF1GzA3sviDeoatthOnjgvAcnau/CT6JMbaZXVjIZ+bnU2xiQqcI+eXlonl0VDo5PHwqOC+j3c4vEQzJLJncWlpbK4SqyhzPA+fiYnhmzBYKRjqbnaru7m51f+5HIhJ5eCVJmVu6/mZ5fX2Juy4LguCv+UqYqhqG/GBvb184zrMXYWhGEWA+G3PFYv67bTPHca4tWiwWYzO5XP60VqM6vYwEPICV2+l0ymq3R4au60Kv240ghAAPU4pyVlWYnpxMEWdc4F4gyzoZlSoVME0TOp0OKIoC8XgcEokEaJoWCezkctDv9XTijIpI2h56FLYNjUYj8oah/kGmwajdaOuNd8EFOLNbrcXQsozG6uq1NUiQvRB94oxHUGk1myt3VNUwUP2mccZ5mzg0lwcC25/Pzz+BLHMDW2VQ4/8BbDFvOs4xcUYC2HWz6/vl95ZVxwPOUIQN8h2HQHL16qreC4IycUYXiS7IfVw8xtv4QJY3C5qWf6hpqaSi6GTU8f3+RyHadSGOT5BcxWac4n7EHQhQLaYQ0xmA2SJAaQbgET6uu4OL9rUF8KEG8Bbd4hS+ISzkekMBeSxN9YYa0kPsInrIDX4IMADJaAE/Me2jPAAAAABJRU5ErkJggg==");
color: red;
}
/* New item */
html>/**/body #content p a[href*="&edit="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAetJREFUeNqUU01LG1EUPW/yQsigUmOISZSkYxdVwW2lm4KkFrpwV6F/QGj3Lrpy4a9oN/0FBcFNQYWIuFHoIsRSWxzFkjZCsKaZNElN5r3eOzMOtEg1F87MvTPvnHfu+xDPVlYghFgAkEH/UZVaaxCy71ZXX/fLpslfSOW6nAtNjycfgEAQSqkQ19X7hTsgrpCuL2AozRIC8/cENo6091aKQL83bKBgsYiPrWOAxxPXkG6v5zlwA4FNW2NCdqC//4Lm2QiP40Q8UxDKB9euHgJxhez5AoED+DNX2lieToS97h0eYnZyMqx3SiVykANxDfnz4QkGd3Pf2MFisgs0NKxhidNaLVwPK5PBcbUa1plkEjzec3A53NQXD+w5l6y9+fz01jtQTL/3HbQc5xSmU2RFyjH1aOZG8qedsufAE2icn+cHOqk5+lCkHHtr27dy4Al0u0IatbgY+mg9V0sarwoHoC4xEWnDku2w53/BoQIHRrI0zUmeFdfrcbQTJsoOkE0kMDYygnFasEaziVwqhfzoKO6m0/hRr185MOTvTocFI1fbyOegEAO+VCrhyeMo2/ZfNY8nbkReUN8UsWg0irf3m0GHpIDsf9eAxxM3JmJkyzDNl4Rcv5dJtVpfRZCbhEFupQ8+XyLnjwADAJgWSEmnMNKYAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;
}
/* Create view */
html>/**/body #content a[href*="&view="] {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkVJREFUeNqkU89rE1EQns1udhOCrk2KlxIhaaGHFPfQBFJYxFbc+gtvkQq5+uPoQfAPEHJQemnFIAFFzCFYycGLGEgVElgMRhG7OTRiKiaVKCkYSTTbbF5nYuJBDxYy8LFv3sw384b5lmOMwShmgxFt5AIcWv8wGOUg4jhCQ/gR7kHeDuIjIoN4iWgOecMCHBY4L0nSJU3TpqLR6GHDMFz5fF6koKqqZiAQaCWTya+ZTOZDp9NJIO8p9aURHIhroVDoRi6XU9Pp9LRlWWNer1dstdpAQJJIdxSjHMolTp/L8/wp7Lper9c77XabEbLZLCNLJO4zVZ1nmnaO4avYME65xCGugFWWwuGwG58vmqbZnysWi2FnC1ZX431/cnIGqtUSDOOUSxxstEQFHhYKhbFmszntQKMEn88H2awOc3Mn+wSHQwK73fenwC805HwiLm+z2b5UKpWerutWMBgcl2X5AM4LhvEe/H4FZNmN3Q1YWDgG8e4juLm5vLvyPP7ZePD2Dm2Fx1EtPGzUarXtVCr1vVwuNxRF4Z1Ou1gqvRIbjS1QlMAPj8ezdbt6Vzhz+qwrV9W/Iedq77qrSzvkEYcQHlyNG180gd8j6MuDDYF12bnIpvhxEDgzcjHiX3uyZgDPdVGGBW6gRkp0Imjv3D9yW5GfzUdOHP37+kV6/Q33X60uSqhL6R4wmCV35oIyu/H4XfG3DKEo7EvwDK5AF6W+y17vWKjqnz0AOxfEkUDY919TxxV2WXH71iYgsUhkmJBgT4ABAOtC+bduhTyuAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;
}
/*** Messages ***/
.error {
border: red 1px solid
}
.message {
border: green 1px solid
}
.error, .message {
margin: 1em 0 0 0
}
/*** Content ***/
#breadcrumb {
/* background: #fbfbfb;
border-radius: 2px !important;
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important; */
background: transparent;
font-size: 1em;
margin-left: 0em;
padding-top: 2px;
position:fixed;
z-index: 10;
}
h2 {
display: none
}
#content {
margin: 2em 0 0 21em
}
.tabs {
margin: 12px auto 10px auto
}
#form + p {
margin: 20px 0
}
/*** Tables ***/
html>/**/body table tbody input[name*="check"] {
display: block;
float: left;
}
table {
border-radius: 2px !important;
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
}
thead td, thead th {
background: #eee;
}
table tbody td:first-child {
white-space: normal;
}
td, th {
border-color: #bbb;
border-width: 0 1px 1px 0;
font-size: 0.8em; /* x-small; font size */
}
#tables a {
height: 18px;
line-height: 18px;
}
/*** Links ***/
a:hover {
color: #3b82ca
}
a, a:visited {
color: #385a75
}
/*** Sidebar ***/
#h1 {
color: #222;
font-style: normal;
}
#menu {
background-color: #fafafa;
box-shadow: 0px 0px 3px rgba(0,0,0,0.30) !important;
margin: 0;
padding-bottom: 0;
top: 0;
}
/*** Forms ***/
fieldset {
border-radius: 1px !important
}
/*** Others ***/
#lang {
background: transparent;
font-size: .9em;
left: auto;
right: 90px;
position:fixed;
z-index: 10;
padding-top: 2px;
}
.sqlarea {
width: 99%
}
.jush-sql {
padding: 1px 2px
}
p {
margin: 0.8em 0 0 0
}
#menu form {
padding-top: 30px;
}
.view {
background-color: #FFFFAA !important;
}

72
designs/hever/adminer.css Normal file
View File

@@ -0,0 +1,72 @@
/*
Theme by Hever [http://hev.cz] - January 2014, ver 0.2.1
Used Silk icon set 1.3 by Mark James - http://www.famfamfam.com/lab/icons/silk
*/
.error {background:#FFEEEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIsSURBVDjLpVNLSJQBEP7+h6uu62vLVAJDW1KQTMrINQ1vPQzq1GOpa9EppGOHLh0kCEKL7JBEhVCHihAsESyJiE4FWShGRmauu7KYiv6Pma+DGoFrBQ7MzGFmPr5vmDFIYj1mr1WYfrHPovA9VVOqbC7e/1rS9ZlrAVDYHig5WB0oPtBI0TNrUiC5yhP9jeF4X8NPcWfopoY48XT39PjjXeF0vWkZqOjd7LJYrmGasHPCCJbHwhS9/F8M4s8baid764Xi0Ilfp5voorpJfn2wwx/r3l77TwZUvR+qajXVn8PnvocYfXYH6k2ioOaCpaIdf11ivDcayyiMVudsOYqFb60gARJYHG9DbqQFmSVNjaO3K2NpAeK90ZCqtgcrjkP9aUCXp0moetDFEeRXnYCKXhm+uTW0CkBFu4JlxzZkFlbASz4CQGQVBFeEwZm8geyiMuRVntzsL3oXV+YMkvjRsydC1U+lhwZsWXgHb+oWVAEzIwvzyVlk5igsi7DymmHlHsFQR50rjl+981Jy1Fw6Gu0ObTtnU+cgs28AKgDiy+Awpj5OACBAhZ/qh2HOo6i+NeA73jUAML4/qWux8mt6NjW1w599CS9xb0mSEqQBEDAtwqALUmBaG5FV3oYPnTHMjAwetlWksyByaukxQg2wQ9FlccaK/OXA3/uAEUDp3rNIDQ1ctSk6kHh1/jRFoaL4M4snEMeD73gQx4M4PsT1IZ5AfYH68tZY7zv/ApRMY9mnuVMvAAAAAElFTkSuQmCC") no-repeat scroll 0.8em center; padding-left:38px;}
.message, #menu p.message {background:#EEFFEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKfSURBVDjLpZPrS1NhHMf9O3bOdmwDCWREIYKEUHsVJBI7mg3FvCxL09290jZj2EyLMnJexkgpLbPUanNOberU5taUMnHZUULMvelCtWF0sW/n7MVMEiN64AsPD8/n83uucQDi/id/DBT4Dolypw/qsz0pTMbj/WHpiDgsdSUyUmeiPt2+V7SrIM+bSss8ySGdR4abQQv6lrui6VxsRonrGCS9VEjSQ9E7CtiqdOZ4UuTqnBHO1X7YXl6Daa4yGq7vWO1D40wVDtj4kWQbn94myPGkCDPdSesczE2sCZShwl8CzcwZ6NiUs6n2nYX99T1cnKqA2EKui6+TwphA5k4yqMayopU5mANV3lNQTBdCMVUA9VQh3GuDMHiVcLCS3J4jSLhCGmKCjBEx0xlshjXYhApfMZRP5CyYD+UkG08+xt+4wLVQZA1tzxthm2tEfD3JxARH7QkbD1ZuozaggdZbxK5kAIsf5qGaKMTY2lAU/rH5HW3PLsEwUYy+YCcERmIjJpDcpzb6l7th9KtQ69fi09ePUej9l7cx2DJbD7UrG3r3afQHOyCo+V3QQzE35pvQvnAZukk5zL5qRL59jsKbPzdheXoBZc4saFhBS6AO7V4zqCpiawuptwQG+UAa7Ct3UT0hh9p9EnXT5Vh6t4C22QaUDh6HwnECOmcO7K+6kW49DKqS2DrEZCtfuI+9GrNHg4fMHVSO5kE7nAPVkAxKBxcOzsajpS4Yh4ohUPPWKTUh3PaQEptIOr6BiJjcZXCwktaAGfrRIpwblqOV3YKdhfXOIvBLeREWpnd8ynsaSJoyESFphwTtfjN6X1jRO2+FxWtCWksqBApeiFIR9K6fiTpPiigDoadqCEag5YUFKl6Yrciw0VOlhOivv/Ff8wtn0KzlebrUYwAAAABJRU5ErkJggg==") no-repeat scroll 0.8em center; padding-left:38px;}
#dbs span, th a[href*="&db="]:not([href*="&select="]):not([href*="&table="]) {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
.links a {margin-right:8px;}
a[href$="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHGSURBVHjaxFPNLkNREP5aB6WhaKLSVtKFiIUqK1sLT2DhTXgDL2FlxSOw8FOLRiyQWhDRiKSEhKQJou49P9fMnFsLsevCJCcz594z3/m+mTmJKIrQjSXRpXUNoGqbm39qcMbAkbyIvbVwYQhD3tIeWsOQ1+QVH86Xyz+JXJPIOb9iAI4ZpOMd/yN/vb/vAdiC93cP0El2dNA6z4RjYyW2MaPU0BB0u+0BOGGsVML49LSA3J+cYDCblb0l6jeHBwg/26isrOB0a8uzYBlBgKShgD8M53J4aTTQqFaRSCYl+WxnG83zcxTmKpKg+vtFu9W8NDQDMCXW+VivYyAzjKmlJahUSpiYUKPVbCKTz0sCGzOyOpBLzdcXlCMdDDIxO4vboyoyhQIKlYocLi0uIjczIyBcA98dYqx9NywxUEyDi/P29IyF1VU5dFeroS+dRnF+Xvajk5N0ayjx8tq6+FuSyiwUF4LRHi/reLg4o9ijs6xG9RjWGowUi/h4fcXexoa0L4oc0mNZuVgFzID09VKBnFXoUb7Pnb5zQrvVovpkZC4QzwfiN6QM1eBqdxcmnq6IAA395Mlz8eTxTZwg/pcl/v01fgswAESqYZbsIsnLAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
a[href*="&dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJrSURBVHjajFPPaxNREP72V8ymTbGQbRB/IT0otdV6CcWTgqCoUFQQEXoSEQ/+AypK755E1KsULIpGgw1F9KC22lgstFgQLdoWhSab2PRHTNrs7nvObGhSsRa/ZXjv7c6b+eabWUVKiX9AJQuRRci2k+260N91VwgJIQSEV1mVnjf5axTjvCfFFn7hCcBlBzJNVRA0gAZTQ1ODgXC4gDtjV9AW2QNFUTA0/Q66kPLSqVg4shYF8vEdKQ7mln+i+/VVRM0oFpbmETLq/SS6J4R/OfHtHmV24XouHFo94REDAyE9hMZgBMkvT2GZFqxQE6by0/g4P74SoKLB2ZZzWA8ffqRQLBcxNTuFjRTwxpmbfad7Oo/rHhdN6B20/6JvaKyBCnODhqNbL+PRxHXUGXWINV5kl9TDrkQct/pnZKHkyPsDGcl4MJiWq5Ecsf84LxTL8nbyK2+Pke3XHWJAQkLXgMdDNjRNRTxlQ6UmakRD0vN8NEd7EBsFO6Impu1fzGCCrOSXwCro5HEiZiExnEVnrKlaypNhG4fba02aTC8ik1/ibZrM9RlIkkGnjH0jWWJQWRn8TpLI8fcZ6MSA1WrZFERx2eHPTEPqjksBqASDLh7ZZ+HlWA6H9tYyvhjNomNnI8Km7p8/f5+HGdB46/lJeOoYPHV8mbGy8gA59HngU74asNkKYKVzlQCuW9GA6B5si+DVeA4HWmsM4qksTnZY1TMz0NRauysaUAmt2+oxM1tCM6k8mS74WXjIdm8O+JdWg36oKgXqgnzb3TvRXvZEneN6YPNIFw7MY70W5haXnlUHbp3f+b/wW4ABAAtWTLcKdqLcAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
a[href$="&dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHzSURBVHjajJPPS+NQEMcnaaxpdWsp6Q8vtWtdkIo9+B948SjIgruCUg8F/wGP/glePe5JcBehwl4qePGm0J6KQj30UBHEzaFLUromTfPizJMnrxhhB4bJvDfzme97SZQgCOB/be98J2AsAMYYMP81KjKg0WhMYljHtS30RSz4gjkGdot559F7OLt8vvi1bJRBURS4vr8CTTQ3m80SFv1MpVJlwzBA13XuNGUwGKyY1p+Vk9aPzWw8C7ZjQXximu+9ATA5KhQK5Uwmw+nCIpEIJBIJOLjah3Q8w7379x5urFsOUEUhTl/C6R+ef35mARzPhW6vC+q/iHvyvaYwXwIQje6j1+tBv98H13VhNBpxxyPA5tw2TI50MPQsrMbXbOo53fmtaJIC7iSZAMPhkOe+73MA5Ruz3yCfz9NlvykLBUSjUR41TQPP8zhE7JNSyj8E0CbJpkiXKRoIRFABeQcQd0DFwlVV5evUTFBZRSiATEwnp4lCAa0LI2AoQC4WimRl4qgyYOw12rYNyWSSX6L4mKiBnukDK5VKYJrmmBpZwW6r1TotFotTuVyOQwQgnU7zV9npdKDdbj+hgnXRN/Yz1ev1zwg6QP+KU2disRiXblkWOI7zhJOPce+wWq2aoQDZarXaJ2xYQGfod5VKxQ2rexFgAI4OiAKxKkWeAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
a[href*="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDQPlDJUDwAAAiNJREFUOMutk0tI1FEUh7//Y9TJghyc1KQ20lMthRAlgoKgVkWte6wid0EICUHUQjdBErRqHYmQghgU5KLQGB8FKVEMCi0G1JmRbPLJ/O89p8XYOAMZBB24HM5dfL/fOfdcB6Aj1j6kqm2qWv/o5NMk/xBOR6z9dVVpzbmQEyKxPMcBc5svbheHs91YK1hRjJWCY7FGsSKT3VcPtviquqaqVJVVY6xlZu0hYpRrpyJ/Vb7fN3sMwAG4965Hw+ElKrzdlPphPqTHaYw0EdiAQEwuW4MRg7GGzrYu7j6L8/hGg+MD7DNXmF7tpDpSg6MOYpWbzbe2VV/dMATGAuADTLt3UFEmU+OICCpK72hqW8CFExGymwAAnrya15X1QJ+PJFVVtW90QQvjRay4TmfW9XrPpOYdBFYQVXwP+mMpPM9lYCyF44K7KTI4kQJVQj4cqd1BNihowVpBAd9zuNQSZXAizcWWPXmH/WPJonp27ifGCEUOVMB34eXHNJ6Xy5C7+w3xHRDg6N4ylEKAEVSVkAfnm6MMTy1y9nhlXvHNpzSthyrYFfYBiCcylJf6WwAjOZrnOgxPLQLks+tAIDDydSkPrIuWYG2BA2NMbgYunGms5O3nRU43bDkYGEtzuTWar+OJDN5ma1szUKVh/07mv69TVxXm28JK/i/U15YQT2SKdkFEpeAV9P2D3pmmrJXywFgCY7FGCKxgrPnjMv1Y3hjif8QvwdlGGi2XXTgAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
a[href$="&import="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFDMETKEbQAAAAjZJREFUOMuVkjFoU2EUhc//3gsvptFCIdRHh2CrQ1AcmsUYHTKJDkJrFUdx6uJkpuLspCI4xaJLNik4SMGlOKgEdekQ0EEwFhJqCw+a16RJ//+/x0Heo6XN4B0v537nHLgKAKqNxXckSyTPPyu//IP/GFVtLL6f9INrKZXC791f3UvDysPP3tryjcHt7yTPkRQRaZL8KSKvRGRtbm7OxgCPZJ8kJtOnYaw99ZUfl8UQ5XK5kMlkQBI7OzuzURTNbmxs3Nne3v60srJyd2FhoQ0AztPLtflOv/22tdtCVo3hwvhFUATZbBaO48B1XUxMTCCfz6NUKmF6evqKtfZxnMABgOdXl+c7vTZ87wQUFcRyZOepqSmIyPWkAgA8+HCfFMG3rS8QEVCIvb09pFIpkES/30cYhmi325iZmYGI4BDgReW1Wl1d3apUKrler4coitBqtUASxhh0u10Mh0N4ngeSRwEAQBIk4bou0uk0PM+D53nQWsMYA/JfLRGBtfYoQEQSx/hIKQVrbbJzHGd0ghgQHxhj4LourLXQWkNrDdd1E81IQCy21iaAOEFcU2t9PEBEEvcYeDBZrNvf38ehPwAAay3CMEQul4Pv+4f/XSkEQYBisYhOpzMywb1Go/GmUCiM5fN5+L4PpRRIIggCRFGEZrOJ9fX1TWPMzQR+0Kler58RkUcicstxnPFMJgNjDMIwxGAw2DTG1K21T5aWlraOBRycWq120hhz1hgjWusf1Wp1eJzuL3uxkTGLHB98AAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
@media all and (min-device-width: 880px) {
#menu .links {height:22px; transition:.2s;}
#menu .links:hover {height:5em;}
#menu .links a {color:transparent; transition:.2s; display:block; margin-bottom:-1.25em;}
#menu .links > a + a {margin-left:22px;}
#menu .links > a + a + a {margin-left:44px;}
#menu .links > a + a + a + a {margin-left:66px;}
#menu .links:hover a {color:blue; margin:0;}
#menu .links a:hover {color:red;}
}
#menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
#menu p a[href*="&table="], #menu p a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
#menu p#tables br {display:none;}
.links a[href*="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ6SURBVDjLpZNZSNRRGMV//2XGsjFrMg2z0so2K21xIFpepYUiAsGIICLffI8eWiBBeg3qQV+KwBYKLB8qpHUmrahcKLc0QsxldNSxdPz/79LD1ChBUXTh8sG93POdc75zDa01/7NsgGvPR09rzQmpVZZSCqlAKIWUCqk0QqoZWyKFRir1uvxIbsAGUFqXHQqkpP1L57M3Pm5MMJBKpQHUdF9BKIGQAlcJXOlOVykSdye3leO6MmkGQNyHw+uO/1X3bzGBK+S0B1IqAKqDg3986HeCZPffwvJtoNT7lOZLvUdtAPEDAKBkRzo3QwMUb89InN1uGGD3spdE214xe8MRUnM2MfppNW0Pqy7YAK5UKK2xLbhdP4hlmdxpGMQwwQT8ziNiI534c7cT6WrFazikzF2Eb8HS1IQEDdiWwcHAQmpehTkQSAcgNvSMiYFW5uUUMdV3HW+ywefGNqITJsbUUL75k4FWYJtQ+yaMZcXrk1ANk/33mbdiD7EvlRieETy+FJLkMFcjRRSW3emIAwiF1hqPBfu2LGSWbbA1uZ41SfWkrtxPrPcypsfFiWYzFGzGKTjFV28WEJeIUHETLdOgrmkI1VdHpCdEet5enP4qLK9mKrqMgedv6cyrAP+qxOTiUxAi7oEJi8frELoFoTLpa7nI/HQvscgSRt+0kV1SSW7qYtp7xrBMphm4Mi5h/VIfTcEq1u0oJaknSEdNiMYHET7UvcMpPEN31Ed7zxgASmk1I0g6dK66s8CRak5mVxjnfS05+TsZCw/T9baTx1nnGb47DrQksjE6HrsHYPz6nYt3+Sc3L8+wA2tz0J6pF5OD4WP7Kpq7f5fO79DfSxjdtCtDAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
.links a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;}
#content p a[href*="&create="] {padding-left:22px;}
#content p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&page="] {background-image:none; padding-left:0;}
#content p a[href$="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&edit="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDjLpZPrS5NhGIf9W7YvBYOkhlkoqCklWChv2WyKik7blnNris72bi6dus0DLZ0TDxW1odtopDs4D8MDZuLU0kXq61CijSIIasOvv94VTUfLiB74fXngup7nvrnvJABJ/5PfLnTTdcwOj4RsdYmo5glBWP6iOtzwvIKSWstI0Wgx80SBblpKtE9KQs/We7EaWoT/8wbWP61gMmCH0lMDvokT4j25TiQU/ITFkek9Ow6+7WH2gwsmahCPdwyw75uw9HEO2gUZSkfyI9zBPCJOoJ2SMmg46N61YO/rNoa39Xi41oFuXysMfh36/Fp0b7bAfWAH6RGi0HglWNCbzYgJaFjRv6zGuy+b9It96N3SQvNKiV9HvSaDfFEIxXItnPs23BzJQd6DDEVM0OKsoVwBG/1VMzpXVWhbkUM2K4oJBDYuGmbKIJ0qxsAbHfRLzbjcnUbFBIpx/qH3vQv9b3U03IQ/HfFkERTzfFj8w8jSpR7GBE123uFEYAzaDRIqX/2JAtJbDat/COkd7CNBva2cMvq0MGxp0PRSCPF8BXjWG3FgNHc9XPT71Ojy3sMFdfJRCeKxEsVtKwFHwALZfCUk3tIfNR8XiJwc1LmL4dg141JPKtj3WUdNFJqLGFVPC4OkR4BxajTWsChY64wmCnMxsWPCHcutKBxMVp5mxA1S+aMComToaqTRUQknLTH62kHOVEE+VQnjahscNCy0cMBWsSI0TCQcZc5ALkEYckL5A5noWSBhfm2AecMAjbcRWV0pUTh0HE64TNf0mczcnnQyu/MilaFJCae1nw2fbz1DnVOxyGTlKeZft/Ff8x1BRssfACjTwQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&table="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPtT5JhFMafrW997I9rscA+FFu2QRurtlw5cQ4InLpwBogIPNFSiNJ4C+JVkj0QTBHQKFPQlJfwlanY1tXz3ARkn2jd27Wz++yc33XOvd0UAOp/RNGR/X5zeH9rOlTDVKAK3fsqJrxlqN27GHPuYHh+G4rXRQzZNjEws47Hli/oo/PxNsAU3qvWT3/gX3TPuHrWBhiC30nSktXDtKLB1NI4NKkxqBMqjDByPFkcxNBCPwbCfXgUeEBq705m0AZM+qsk2e3hau88W+4ANOy+XPLFQrkrcbW31KkOYJx9rBaAOzPR0gVHW6x593q9cDgcqB6e4sZoogMYdXzD0ck5ZhfLsHGKVfAqVoadKcMdzcLr82PuwwZCoRACgQCWVzdhoK2gaVpDAMNzWzhkAXamQpze/I4t13w+j2AwiFwuh7W1NXg8HmQyGSgUCshkssuU3F7AQf0c84kK3n68KFc4hXQ6DavVCqlUCqVSSdaIx+NQq9UGMsHg7Ab2jxtwp5rOvqUqia3CUqnEObWn0mp1KBaLcLlckMvloPpfrhOAl230/SGLxQK3241CoQC9Xg9nskKk1emQzWZZkBZCoRBU3/NP2GMBgXTTObjSjI1GA8lkEgzDwO/3E4iObXY6nYhEIhCJRHoWcIW6b1pF7egMlYNT7NROUKzU8XX3GJ+3D2E0GgmAm4Zbh2s0mUyIRqMcAGKx+BIlMeSiYu1K/fbEMm4+TaFnJIHrSgZX5TFIZNPo7e1Fj9QOs9kMlUqFaw9pCASCnzwe7x15xG6/rUQiAZ/Px9/5XyhZOMVGKlOdAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
th a[href*="&table="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
.links #content a[href*="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&schema="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&privileges="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGnSURBVDjLxVM9T8JQFD2lBRQRFPAjEhIwXRgwEUjERRMnZPYXuPoHSJz8BQ7+BCcHJzZHiST4MWC0fsQBJUKCEQnGWihtfa/QBgK6MHiT2/tu3+1559x3y2iahlHMghFtZACuUqmkSdyiiaqqoJJo7HVFUQZi1w+Zcrnc9vl8LAXo7YexHhaNdaFQUDiSsFarFftXClriJz4eTqHJX7DMhDEbiiDlfALP80if1CFKLYjfxCUZR9s8ZcByvadG7w/QLl/guVRC8U2Etnutv5dlGXvr44S+3ZRFjcrgjEQvnFvG2pIfGzYOZ5c3KLCsWZjNZvual0wmOwD0oX/cVnFeXQDHfcDpcuGqtYJaTQKcHYBEImGebrDuY1AvPWImtIhjLoraSwtjHhvmv17Nwnw+/zcD/0QDt+9TUD1TmJ6zQWpImFTfyM64XhiLxdAr17h2E2Bnc9XcEEURzWaTFARM2na7HW63+3eAEul8tVqF1+tFMBiEw+EYmDpBEFAsFhEIBBCJRHQAhgyDQEDCFCgejzO5XE4bNn2Gp1IpJpPJaF05d8y//40/Nlww9OOVWvkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&event="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJlSURBVDjLpZNbaM9hGMc/v8NsTqF2yMhZKIexmpFyRZIiblwouZDauLYoTVEryg2uXIoIOUU5zJkh4e9QDmtJbWxrbUzz/72/9/m6+P3HLslbT9/3ufm+n/f7Pm8gif9ZMcDxe717JLZ62UQzwxukZnhveBOptyHl8anwZk/3b5pZEwOYtGNDzejSfzm58dTH+b8JvFkpwMizdSCBT8E8OJftkzy4BPIOnONHQzPO+eIhBoM5CCrLwNKslBZM8uDykCbwtgMAl/o/GXhvBYMA2rtAlpGYZSR+UIGKCgCSggGSOHy1Q/0DTifufZUknbr/RZJ0+mHWn3mU9edbMu3qG9DmQ08lKSNw3jCJOIKzjzqJopBzLZ3EEVx40smDr/u4e96QGUXPGpkzYQSJywjCwSsIiKOADUvKiUNYX1tOUQhra8oJg4hZ02cQhhGrqyuyp03tTwbOGzKIQ7j8rIsn3Qd4fEVIIn6+kzAMaH35Fn37wbZD68gnCUl+EbAkI3CpIYmiCNZUlwEwbfIUgiBg1cIyJqbzGFPiWbl8GXUb66mqnkrJ2IvUbq88GEI2dQBRGHDjZTcAbZ8+ERDQnOvm+fszVM1egA89C8avwAeO2nlLAeqRxK7j79TzPa/mXJck6darTG8XdM3uhbry+piGrou5I1pcP17h7wwk5k4aRUfPANMrhtP2pZ8J44bx7nMfff29vGl/SNP1LQA0XdtCa2cO4GdhkPRg78kPVYm3kS71uNTjU8N5I/UpxSWracndZOn8ZVx6dZRhQcz9F3cAjgR/+51rt1c2AXXAaOA7cLTlcHvDL6y6kIpO9lqsAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href$="&view="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gEJFwohC2f85AAAAsxJREFUOMulk8tr3HUAxD+/1z5+u5smMYlmm6R1rTlEmrY0RKqtWMVWW6qtePBv8NaKUFGUgmBB9CJ48aIH8SKGBhGKKEIaPdgam0gTQ7Bm3U2zTbKPZrP7+32fHkqDx0LnNocZmGHGsdbyIHB5QPj/J8Vi8bDV8m0RtY5qGaeNMVijsdbiOF6cDDNXw47u8/l8/so9jXMvQqlU+lK0m6+LdjMRBAFCCBq1DYRU+L5P944OtIiRxtru/qHvhh7d8/K2QalUutysrx/zHEu5XGZl9TbWDUilsygDSimMbJGyEYVdAwB09g3MPTayb9RfXl7+RLTuHHOtYn5hkYHCCH5nAW0sUmmEVCiliIRisL8HWf8b0apj4qW9CvcL5+bSX6uNjcrD2gkYPTDG7zf+YWsrRinF9I8TWGt5Yvw4QioSgc+rx8e5uThPeWGGRrOt/Np6pa83v4ue3j4AlFBEsUDru+UBxEIihdwue7DwOKl0yPTlS77f0z9kMtmcp7XGdV2ymQRr1Qax1AwfeA6pNHEUEwvNYL4XYwxaa7Kd3QzsLlhnfm6mms11dOU6H8L3fep3WswuFFmrNu7ml4pYaKJwllv2Gk1RRciY8f7nGW7tEd7Zc28WNjcqB0W0heMFpNNJUgkPqRSbm1toY2lnZmj2/cYzB5/khf2naGf+ZerWNyyVVyqOtZbZ63/8EtVWDyV9j0xXby0Z5qJkmBGu5xuAcxOndr924kXHeA6nH3mPj+bO4OPy1beTkQ8wum//U9NXpi7drpRPhBtrXWEYkkikcIMEAGvNFQLTwUs7zwLw1t4JJosXgcnU9pSfPnzkla8//zRZbtRPR7E447ru0cB1soBTjdbTf1Z/4lrtB94d/Z4Pr58k5aYAIud+3jh2Ifhg53D4zpGRZxnuOsRi7VembvxMebH1sXO/dx67EFwE3gBywCbw2dX35fn/ANYEZmpcDQc/AAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&refresh="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI/SURBVDjLjZPbS9NhHMYH+zNidtCSQrqwQtY5y2QtT2QGrTZf13TkoYFlzsWa/tzcoR3cSc2xYUlGJfzAaIRltY0N12H5I+jaOxG8De+evhtdOP1hu3hv3sPzPO/z4SsBIPnfuvG8cbBlWiEVO5OUItA0VS8oxi9EdhXo+6yV3V3UGHRvVXHNfNv6zRfNuBZVoiFcB/3LdnQ8U+Gk+bhPVKB3qUOuf6/muaQR/qwDkZ9BRFdCmMr5EPz6BN7lMYylLGgNNaKqt3K0SKDnQ7us690t3rNsxeyvaUz+8OJpzo/QNzd8WTtcaQ7WlBmPvxhx1V2Pg7oDziIBimwwf3qAGWESkVwQ7owNujk1ztvk+cg4NnAUTT4FrrjqUKHdF9jxBfXr1rgjaSk4OlMcLrnOrJ7latxbL1V2lgvlbG9MtMTrMw1r1PImtfyn1n5q47TlBLf90n5NmalMtUdKZoyQMkLKlIGLjMyYhFpmlz3nGEVmFJlRZNaf7pIaEndM24XIjCOzjX9mm2S2JsqdkMYIqbB1j5C6yWzVk7YRFTsGFu7l+4nveExIA9aMCcOJh6DIoMigyOh+o4UryRWQOtIjaJtoziM1FD0mpE4uZcTc72gBaUyYKEI6khgqINXO3saR7kM8IZUVCRDS0Ucf+xFbCReQhr97MZ51wpWxYnhpCD3zOrT4lTisr+AJqVx0Fiiyr4/vhP4VyyMFIUWNqRrV96vWKXKckBoIqWzXYcoPDrUslDJoopuEVEpIB0sR+AuErIiZ6OqMKAAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;}
#content p a[href*="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:24px;}
table tbody input[name*="check"] {display:block; float:left;}
table a[href*="&edit="][href*="&where"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;}
table input + a[href*="&edit="][href*="&where"] {width:0; float:left; display:block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 18px; background-position:2px bottom;}
table thead #all-page + a {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;}
table thead #all-page + a {width:0; display:inline-block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 16px;}
table td:first-child {white-space:nowrap;}
input[name="delete"], input[name="drop"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVHjapFM5bsJQEB2zSIDFJrHYpEtyAyoKJAp6CrqIkBPkNDlBAKXjBEgUpKOBCyQNijFiEZvZl8z7wsjESYpkpNFfPO/Nmz9j6Xg80n/M9fWi3W7fMOnd4XAo8qogAbvO5xKvL6lU6s0aL1kVMDjP5ye/36+Gw2FyOp3EQFqtVtTr9WixWHT5/JhOp6s2ghP4ORaLyaFQiGazGa3Xa0HgdrvJ6/WSpmk0Go0MjnvIZDLVM0Gr1brm/WskEkkA3O/3abvdQjq5XC6xgoiVka7rNB6PNT6ns9nsu+OkpODxeBLBYJAGgwHt9/uzQ8Vms6Hdbie+KYqC+ASTFrARBMx2HwgEaDKZiHqn0yktl0uxtzrMMAyKx+MCc+4Cs13hwQCC1GQy+W3Lms2mUIUygbEqEBLNun8z8zswVgUfLO0WD4Z6kekn8/l8okNM8GFVUMYDoVWQ6HA4bEAzoyzL1O12kbRsJajwhYZhiUajJEnShWSAQaqqKnU6HahEGysXg9RoNPJ8+cwZZLSKp47m8/k5Kxzg4XBocNxDLper2ka5Xq+LUeatilahJLN1mEJ+ZDHKJthGAKvVauJnYi9ysHIqQee1xOsLg3/+mf5inwIMAJMhb74NwG5wAAAAAElFTkSuQmCC") no-repeat scroll left center; padding:1px 5px 1px 18px; border:0; cursor:pointer; font-size:.9em;}
input[name="delete"]:hover, input[name="drop"]:hover {color:red; background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==")}
input[name="logout"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJHSURBVDjLlZPNi81hFMc/z7137p1mTCFvNZfGSzLIWNjZKRvFRoqNhRCSYm8xS3+AxRRZ2JAFJWJHSQqTQkbEzYwIM+6Yid/znJfH4prLXShOnb6r8/nWOd8Tcs78bz0/f+KMu50y05nK/wy+uHDylbutqS5extvGcxaWqtoGDA8PZ3dnrs2srQc2Zko41UXLmLdyDW5OfvsUkUgbYGbU63UAQggdmvMzFmzZCgTi7CQmkZwdEaX0JwDgTnGbTCaE0G4zw80omhPI92lcEtkNkdgJCCHwJX7mZvNaB0A14SaYJlwTrpHsTkoFlV1nt2c3x5YYo1/vM9A/gKpxdfwyu/v3teCayKq4JEwT5EB2R6WgYmrs2bYbcUNNUVfEhIfFYy69uci+1fuRX84mkawFSxd/4nVWUopUVIykwlQxRTJBTIDA4Pp1jBZPuNW4wUAPmCqWIn29X1k4f5Ku8g9mpKCkakRLVEs1auVuauVuyqHMo8ejNCe+sWPVTkQKXCMmkeZUmUZjETF1tc6ooly+fgUVw9So1/tRN6YnZji46QghBFKKuAouERNhMlbAHZFE6e7pB+He8MMw+GGI4xtOMf1+lsl3TQ4NHf19BSlaO1DB9BfMHdX0O0iqSgiBbJkjm491hClJbA1LxCURgpPzXwAHhg63necAIi3XngXLcRU0fof8ETMljIyM5LGxMcbHxzvy/6fuXdWgt6+PWncv1e4euqo1ZmabvHs5+jn8yzufO7hiiZmuNpNBM13rbvVSpbrXJE7/BMkHtU9jFIC/AAAAAElFTkSuQmCC") no-repeat scroll right center; padding:1px 22px 1px 5px; border:0; cursor:pointer; font-size:.9em;}
input[name="logout"]:hover {color:red;}

28
designs/jukin/adminer.css Normal file
View File

@@ -0,0 +1,28 @@
/* Redesigned by Janamou - September 2008 */
body { color: #000; background-color: #fff; line-height: 1.25em; font-family: Verdana, Arial, Helvetica, sans-serif; margin: 0; font-size: 90%; }
a { color: black; }
a:visited { color: black; }
a:hover { color: #626262; text-decoration: none; }
h1 { margin: 0; padding: 5px; }
h2 { margin: 0; padding: 7px 0px 7px 10px; border: 1px solid #a3a3a3; font-weight: normal; background: #FCE28E url('data:image/gif;base64,R0lGODlhEAAiAIMAAP/nnf/nn//nof/kk//llP/ab//Zav/aa/7aagAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAiAAMERBDISSsIOOvNu/9gKI5k6VnoJKxs6wpmmsayZQ54jhN8zxfAoHBYMBiPyKTyeGg6m4iodEpFLK/YrHbL7Xq/4LB4LI4AADs=') top left repeat-x; margin-bottom: 20px; }
h3 { font-weight: normal; font-size: 130%; margin: .8em 0; }
table { margin: 0 20px .8em 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; }
td, th { margin-bottom: 1em; border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; }
th { background: black; color: white; }
th a, th a:visited { color: white; text-decoration: none; }
th a:hover { color: #626262; }
fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: 0 .5em .5em 0; border: 1px solid #999; }
img { vertical-align: middle; margin: 0; padding: 0; }
.error { color: red; background: #fee; padding: .5em .8em; border: 1px solid red; }
.message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; }
#menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; }
#menu form { margin: 0; }
#menu p { text-align: center; font-size: 11px; }
#menu p a { color: black; }
#menu p a:hover { color: #626262; text-decoration: none; }
#content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; }
#lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; }
#lang a { color: black; font-weight: bold; }
#breadcrumb { position: absolute; top: 0; left: 293px; background: #d9dadb; font-size: 10px; margin: 0; padding: 2px 5px 2px 5px; }
#breadcrumb a { color: black; }

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