Compare commits

...

1211 Commits

Author SHA1 Message Date
ba6fd1e554 Merge pull request #860 from cytopia/release/v1.10.0
Release v1.10.0
2022-01-28 08:36:08 +01:00
fe67bdf6bb Harden CI tests 2022-01-27 17:30:00 +01:00
4a9c0b6d9f Update HTTPD images 2022-01-27 14:49:57 +01:00
855d98d895 Add Docker volumes for MariaDB 10.6 and 10.7 2022-01-27 12:37:47 +01:00
01b0ecdf20 Fixes #807 description in env-example 2022-01-27 08:41:55 +01:00
fe9e6264d9 Update PHP modules in README 2022-01-27 08:30:41 +01:00
55bb37c53b Update project files 2022-01-27 08:23:19 +01:00
a6894b7793 Add MariaDB conf anbd log dirs 2022-01-27 08:21:44 +01:00
0daa62cc02 Update comment about PHP 8.0 and 8.1 stability 2022-01-27 08:17:32 +01:00
38942fa168 Added MariaDB 10.6 and MariaDB 10.7 2022-01-27 08:15:46 +01:00
a0246b7a0e Update HTTPD images 2022-01-27 08:11:28 +01:00
b17f4600f4 Update PHP images 2022-01-27 08:11:12 +01:00
5f465abd61 Merge pull request #851 from felixmosh/fix-850
fix: show utf-8 mail body properly
2022-01-26 12:08:04 +01:00
61246b5151 Merge branch 'master' into fix-850 2022-01-26 10:01:31 +01:00
ca90af0fb0 Merge pull request #859 from cytopia/release/v1.9.3
Release v1.9.3
2022-01-25 20:14:49 +01:00
7bd6b34698 Update project files 2022-01-25 10:06:22 +01:00
2677422250 Update PHP images 2022-01-24 19:29:54 +01:00
200000cb5b Ensure documentation passes CI checks 2022-01-24 15:23:41 +01:00
8560267fdc Update MySQL Docker Images 2022-01-24 14:39:10 +01:00
8c13144d3e Update available PHP modules 2022-01-24 09:27:31 +01:00
2f8fc59dd9 Ensure PHP code is compatible to legacy versions 2022-01-24 09:15:52 +01:00
d9fb88058f Updated PHP Docker Images to 0.129 2022-01-24 08:39:23 +01:00
4c15e191a0 Merge branch 'master' into fix-850 2022-01-23 13:36:19 +01:00
249b132e58 Merge pull request #832 from Ernestopheles/patch-1
Update setup-auto-dns.rst
2022-01-23 13:35:44 +01:00
6e34d3b263 Merge pull request #843 from ericvanjohnson/patch-1
Update add-project-dns-entry-on-win.rst (grammar correction)
2022-01-23 13:33:17 +01:00
68bd88d304 Merge branch 'master' into patch-1 2022-01-23 13:32:39 +01:00
bfb4769e85 fix: show utf-8 mail body properly 2021-11-07 15:56:54 +02:00
23a6aed10d Merge pull request #817 from ulin-evgeny/patch
Fixed typos
2021-10-15 11:48:42 +02:00
0dfd63d7f9 Merge branch 'master' into patch 2021-10-15 11:48:31 +02:00
3804a3b6f3 Merge pull request #842 from ericp-mrel/fix-redis-args-parsing
Fix redis args parsing for password
2021-10-15 11:47:49 +02:00
9cfc69e5bb Update add-project-dns-entry-on-win.rst 2021-10-13 04:48:52 -07:00
56555e87a5 Adjust redis args regex to allow optional quotes. 2021-10-12 10:44:44 -05:00
5e90a3a35d Use preg_match_all to get redis password from args
This should fix the issue where preg_split was being used and would cause an error if the redis args variable didn't contain the --requirepass string and the WebGUI wouldn't load as a result.
2021-10-12 09:42:04 -05:00
54e17f5ec5 Update setup-auto-dns.rst
For me it has been unclear if prot 53 may not be in use in cobination to 127.0.0.1 or generally.
2021-08-24 17:48:52 +02:00
b5d19264de Fixed typos 2021-06-20 05:07:19 +03:00
f6bbdc72fd Merge pull request #814 from cytopia/release/v1.9.2
Release v1.9.2
2021-06-04 13:06:36 +02:00
2f9ba2e30a Release v1.9.2 2021-06-04 10:32:46 +02:00
fa0c8f5632 Merge pull request #787 from merlijnvanlent/master
Ability to view emails within the intranet dashboard.
2021-05-21 15:31:13 +02:00
64330b5b12 Merge branch 'master' into master 2021-05-21 10:50:26 +02:00
872340e14b Merge pull request #806 from Agnohendrix/patch-1
XDebug 3.0 Linux Docs
2021-05-21 10:48:21 +02:00
5eb2ee8ca0 Merge branch 'master' into master 2021-05-20 16:28:02 +02:00
aff86a6b15 Merge branch 'master' into patch-1 2021-05-20 15:48:25 +02:00
fb51eece98 Merge pull request #777 from cytopia/release/v1.9.1
Devilbox Release v1.9.1
2021-05-20 14:51:02 +02:00
6c438bb434 Updated Adminer to 4.8.1 2021-05-20 10:52:49 +02:00
9935780588 Update README 2021-05-20 00:12:10 +02:00
20cba7d773 Update CHANGELOG 2021-05-20 00:03:16 +02:00
353fa53d29 Updated php images to 0.125 2021-05-19 22:59:42 +02:00
f28e1ee4a4 Enable mysql binlog by default 2021-05-19 19:04:22 +02:00
fb390ac429 gitignore php-ini 8.1 dir 2021-05-19 19:03:56 +02:00
867327a8c3 Update project files 2021-05-19 16:06:53 +02:00
8ffd65a905 Upgrade sphinx deprecations 2021-05-19 16:05:45 +02:00
5a4574edb8 Remove Travis CI 2021-05-19 16:05:44 +02:00
dc350b00b5 Update CHANGELOG date 2021-05-19 16:05:43 +02:00
f4d492ea98 Update release date 2021-05-19 16:05:42 +02:00
c40c43c4ea Exclude shellcheck rule 2021-05-19 16:05:41 +02:00
d0585bb174 Update documentation 2021-05-19 16:05:40 +02:00
0b9d18cdf4 Adjust enabled PHP modules 2021-05-19 16:05:33 +02:00
ba42717f01 Update CHANGELOG 2021-05-19 16:05:29 +02:00
b4c3de9195 Update PHP images to 0.124 2021-05-19 16:05:25 +02:00
a0423ebd02 Adjust xdebug CI tests 2021-05-19 16:05:21 +02:00
06c2a7ac51 Update Available PHP modules in README 2021-05-19 16:05:17 +02:00
543e373b91 Added PHP Xdebug info page for intranet 2021-05-19 16:05:14 +02:00
3d0154f987 Docs: smaller headlines for PHP modules 2021-05-19 16:05:10 +02:00
715c6b3c83 Adjusted Xdebug 3.0 defaults 2021-05-19 16:05:06 +02:00
d8e728a6a4 Merge pull request #802 from llaville/patch-intranet
Patch intranet to fix issue 801
2021-05-19 16:04:34 +02:00
1d41fb025c Merge branch 'master' into patch-intranet 2021-05-19 16:01:18 +02:00
af98125279 Merge branch 'master' into patch-1 2021-05-18 08:39:16 +02:00
ab761eedba Merge pull request #783 from mhodge13/master
Kibana 6.6 and above uses ELASTICSEARCH_HOSTS
2021-05-17 20:36:00 +02:00
0058e0bd61 Merge branch 'master' into master 2021-05-17 20:34:25 +02:00
2dd3ec9dd0 Merge pull request #781 from kovacbb/patch-1
Update enable-varnish.rst
2021-05-17 20:33:47 +02:00
7f294735e7 Fixed wrong push 2021-05-05 15:55:44 +02:00
a07b3442f1 Updated XDebug Linux documentation for XDebug 3.0 2021-05-05 15:50:46 +02:00
db1be81471 Update compose/docker-compose.override.yml-elk 2021-04-19 18:10:43 +02:00
d5e463db60 Update compose/docker-compose.override.yml-all 2021-04-19 18:10:36 +02:00
83c0c672d4 avoid PHP Fatal Error when pgsql PHP module is not available 2021-04-19 17:27:20 +02:00
af68fb65f2 avoid PHP Fatal Error when mysqli PHP module is not available 2021-04-19 17:25:56 +02:00
f6c273d6c4 avoid PHP Fatal Error when memcache PHP modules are not available 2021-04-19 17:24:11 +02:00
46f5c48ba0 avoid PHP Fatal Error when redis PHP module is not available 2021-04-19 17:21:47 +02:00
6c18e8f112 avoid PHP Fatal Error when mongo PHP modules are not available 2021-04-19 17:20:00 +02:00
6807b83e6b typo error fixed in memcached info panel 2021-04-19 14:29:43 +00:00
01fb99ec1a Added custom shadowdom element to view emails
WIthout the styling leaking into the global styling.
2021-02-21 14:40:16 +01:00
56342426b3 Kibana 6.6 and above uses ELASTICSEARCH_HOSTS 2021-02-11 08:48:18 -06:00
87e710050f Update enable-varnish.rst
fix small typo
2021-02-04 22:49:29 +01:00
cdfb55ec2d Merge pull request #771 from alikon/patch-1
xdebug v3 info panel
2020-12-21 10:14:40 +01:00
7cad84f527 Update .devilbox/www/htdocs/xdebug.php
Co-authored-by: cytopia <cytopia@everythingcli.org>
2020-12-21 08:24:46 +01:00
e65685b604 with header and footer 2020-12-18 17:16:28 +01:00
7e08261602 moved to Info 2020-12-18 14:07:46 +01:00
30d23f0f6f move to Info 2020-12-18 14:06:57 +01:00
b5fca3f842 moved on Info 2020-12-18 14:06:38 +01:00
dd529d0a1a xdebug 3 info panel 2020-12-18 12:59:49 +01:00
a6863c5ceb xdebug v3 info panel 2020-12-18 12:58:17 +01:00
6dba0ce963 Merge pull request #766 from BrookeDot/patch-1
Capitalize p in WordPress
2020-12-13 17:17:36 +01:00
201925e0b2 Merge branch 'master' into patch-1 2020-12-13 13:07:31 +01:00
ffee650e60 Merge pull request #765 from cytopia/release/v1.9.0
Devilbox Release v1.9.0
2020-12-13 13:03:01 +01:00
59738601b2 Capitalize p in WordPress
This is a simple edit to capitalize the p in WordPress throughout this document
2020-12-12 16:37:03 -08:00
50ae11f95f Retry network tasks 2020-12-12 19:13:31 +01:00
09b8803f21 Adjust test and examples according to Xdebug 3.0 2020-12-12 19:04:35 +01:00
75aa5139e2 Sort correctly when updating modules 2020-12-12 18:14:15 +01:00
f9b4a9d9f4 Fix lint job 2020-12-12 17:54:32 +01:00
0151167635 Devilbox Release v1.9.0 2020-12-12 17:53:36 +01:00
9c6711c948 Update php images 2020-12-12 17:53:32 +01:00
22f5c945ef Fixes #761 missing varnish config env var 2020-12-12 17:53:28 +01:00
1b768425b2 Added checks for TLD_SUFFIX in check-config.sh 2020-12-12 17:53:24 +01:00
a05f3eea47 Merge pull request #760 from avierr/patch-1
Updated docs for Mac SSL
2020-12-01 19:12:20 +01:00
e3c1e18ae3 Update for Mac 2020-12-01 16:46:29 +00:00
a78bccfd33 Merge pull request #757 from cytopia/release/v1.8.3
Release v1.8.3
2020-11-22 17:08:56 +01:00
2679acc569 Fix symlink handling with watcherd 2020-11-22 14:36:13 +01:00
6b18f7b71d CI: wordpress: increase retries and be more verbose 2020-11-22 12:40:02 +01:00
df6ee3fb36 Intranet: show custom Httpd configuration files 2020-11-22 11:54:56 +01:00
fda37efc64 Check supervisor configs with check-config.sh 2020-11-22 11:13:04 +01:00
e9281c9b40 Bump versions 2020-11-22 10:57:37 +01:00
dfd3e27882 Fixes #753 handle symlinks with watcherd 2020-11-22 10:57:06 +01:00
8e7069f893 Fixes #692 Add custom supervisor configs 2020-11-22 10:56:08 +01:00
c96f740c39 check-config.sh: debug mode 2020-11-20 15:15:45 +01:00
fe54bbf714 check-config: custom configs 2020-11-20 15:09:21 +01:00
9660c37937 check-config.sh: verify LOCAL_LISTEN_ADDR 2020-11-20 14:46:29 +01:00
0d6ecf23e3 check-config.sh: check customizations 2020-11-20 14:35:53 +01:00
3a2dacf748 Fix shellcheck for check-config 2020-11-20 13:37:09 +01:00
467fc03640 Validate htdocs dir in check-config 2020-11-20 13:18:19 +01:00
7480eb4e08 Add project checks 2020-11-20 13:06:06 +01:00
f348fa7814 Fixes #751 check-config output duplication 2020-11-17 12:51:15 +01:00
b8055a175b Merge pull request #750 from cytopia/release/v1.8.2
Devilbox Release v1.8.2
2020-11-14 15:19:52 +01:00
9b58e2daa8 Fix typos 2020-11-14 15:17:38 +01:00
30e2b08c72 Fixes #547 Added link to official Contao Devilbox docs 2020-11-14 11:59:32 +01:00
1f0676de4a Fixes #707 Move Backups out of Devilbox directory 2020-11-14 11:51:33 +01:00
6735daaaeb Bump release 2020-11-14 10:49:50 +01:00
657ba28afd Fix entrypoint in MySQL image 2020-11-14 10:34:09 +01:00
14259518c6 check-config: allow paths to be outside Devilbox dir 2020-11-14 10:33:46 +01:00
d406eac805 Provide updating information 2020-11-14 10:33:22 +01:00
dfb2a1097d Various fixes on PHP-FPM images 2020-11-14 10:32:52 +01:00
8553a5645b Merge pull request #747 from cytopia/release/v1.8.1
Release v1.8.1
2020-11-12 19:22:21 +01:00
6e59572a51 CI: check-config.sh checks 2020-11-12 17:12:58 +01:00
bbf297a356 check-config.sh abort if .env file is not present 2020-11-12 17:12:58 +01:00
8a290af71c Ensure to check uid/gid with check-config 2020-11-12 17:12:58 +01:00
f2929f3d08 Merge branch 'master' into release/v1.8.1 2020-11-12 15:36:09 +01:00
4fb0d557a6 Merge pull request #734 from alexandredoria/patch-1
Enable remote_autostart as default on Xdebug configuration
2020-11-12 15:35:52 +01:00
d0776566a2 Merge branch 'master' into patch-1 2020-11-12 15:29:47 +01:00
254b76205c Update gitignore 2020-11-12 15:23:22 +01:00
d727835228 Replace tree with find command 2020-11-12 15:03:57 +01:00
760d1606c5 Adjust CI tests for PHP 8.(0|1) xdebug settings 2020-11-12 14:52:25 +01:00
5d476b9c32 Bump version 2020-11-12 14:44:59 +01:00
6465542af8 Fixes #746 xdebug config for PHP 8.0 and 8.1 2020-11-12 14:44:02 +01:00
686ad73b63 Ensure to check versions in check-config.sh 2020-11-12 14:39:14 +01:00
70695d179c Add hints to check-config.sh 2020-11-12 14:31:59 +01:00
039ffacaf7 Silence PHP warnings in phpmemcached and opcache GUIs 2020-11-12 14:20:42 +01:00
9367c9540a Add check-config.sh script for local troubleshooting 2020-11-12 14:19:49 +01:00
87fa92d931 Merge pull request #743 from cytopia/release/v1.8.0
Release v1.8.0
2020-11-09 09:46:22 +01:00
d655bea64f Fixed undefined var in integration tests 2020-11-08 15:52:32 +01:00
4acfa94639 Fix Adminer for PHP 8.0/8.1 2020-11-08 15:42:43 +01:00
2d5361891e Add integration tests for MariaDB 10.5 2020-11-08 15:42:00 +01:00
db58f3b1bb Disable Wordpress tests for PHP 8.0 and PHP 8.1 2020-11-08 14:46:02 +01:00
2dfb908fbf Fix phpPgAdmin for PHP 8.0 and PHP 8.1 2020-11-08 14:44:21 +01:00
20931a7d97 Fix missing config for phpMyAdmin 5.0.4 2020-11-08 14:09:11 +01:00
8fa4ea59c7 Fix shellcheck issues with tests 2020-11-08 13:59:20 +01:00
da12bccc29 Fix configs for phpMyAdmin 2020-11-08 13:55:44 +01:00
3e9bcec90b Add MariaDB 10.5 2020-11-08 13:52:33 +01:00
e5f93062ca Add PHP 8.1 conf directories 2020-11-08 13:47:02 +01:00
f37e9b2a58 Bump to minor release 2020-11-08 13:28:58 +01:00
156e36be56 Fix Adminer 4.7.7 2020-11-08 13:27:31 +01:00
6aca07a5b9 Update phpMyAdmin 2020-11-08 12:56:53 +01:00
530698aee2 Update documentation 2020-11-08 11:17:04 +01:00
9f647fa745 Adjust integration tests 2020-11-08 11:16:28 +01:00
8f510c7f6c Update Adminer from 4.7.5 to 4.7.7 2020-11-08 11:04:33 +01:00
d94cf193e3 Update env-example 2020-11-08 11:02:55 +01:00
d471794f72 Fix phpPgAdmin error reporting 2020-11-07 16:57:40 +01:00
9ff5006d1a Ensure phpRedmin works without login 2020-11-07 16:41:02 +01:00
9179683f18 Ensure backwards compatibility with phpPgAdmin 2020-11-07 16:15:32 +01:00
16a0f360bf Fix CHANGELOG 2020-11-07 15:56:37 +01:00
bca2a37723 #728 Updated phpPgAdmin from 7.12 to 7.13 2020-11-07 15:52:05 +01:00
e2806d147a Fix typo in version 2020-11-07 12:04:34 +01:00
9cefd120ef Add missing docker volumes 2020-11-07 11:54:35 +01:00
97d8602f19 Fix broken link in docs 2020-11-07 11:45:47 +01:00
2c8c8f2fa5 Update Readme 2020-11-07 11:34:52 +01:00
b9cf538dcf Update Changelog 2020-11-07 11:18:38 +01:00
f034dec17a Add latest available docker images 2020-11-07 11:17:59 +01:00
9ce7111587 Update integration tests 2020-11-07 11:17:13 +01:00
d5eca8a114 Update PHP images 2020-11-07 10:38:03 +01:00
81f344ee04 Enable remote_autostart on Xdebug configuration for Docker on Linux: Xdebug for Visual Studio Code
Normally is need to use a specific HTTP GET/POST variable to start remote debugging. When this setting is set to true, Xdebug will always attempt to start a remote debugging session and try to connect to  vscode-php-debug plugin client, even if the GET/POST/COOKIE variable was not present.

More information on 
https://xdebug.org/docs/all_settings
https://xdebug.org/docs/remote#browser_session
2020-10-09 12:58:03 -03:00
4b23dd6d6d Merge pull request #725 from cytopia/release/v1.7.2
Release v1.7.2
2020-09-18 10:18:39 +02:00
10952e80b2 Merge branch 'master' into release/v1.7.2 2020-09-17 17:28:48 +02:00
ae4514e1ca Merge pull request #726 from tyrann0us/patch-1
Fix typo docker-composer kil
2020-09-17 17:28:30 +02:00
0d1fe20cc4 Fix typo docker-composer kil 2020-09-17 13:47:21 +02:00
f67182f111 Added COMPOSER_MEMORY_LIMIT variable to php settings 2020-09-17 10:46:50 +02:00
4540afa507 CI Adjust drupal test 2020-09-16 15:19:46 +02:00
1868719479 Added new PHP images 2020-09-16 11:32:57 +02:00
3556873f19 Merge pull request #711 from cytopia/release/v1.7.1
Release v1.7.1
2020-08-09 18:32:42 +02:00
eafc56f5ab Update docker images 2020-08-09 16:30:18 +02:00
a10efca1c3 Refs #611, #700 Updating PHP images 2020-06-29 01:27:08 +02:00
8c931cdf56 Merge pull request #690 from cytopia/release/v1.7.0
Release v1.7.0
2020-03-25 09:41:40 +01:00
487b69331c Use reproducible linkcheck 2020-03-24 12:06:32 +01:00
6984d43ff9 Update version and Changelog 2020-03-24 09:31:12 +01:00
a097b5b4d8 Update Readme 2020-03-24 09:29:27 +01:00
0b118486b5 Update docs: available container 2020-03-24 09:29:26 +01:00
c73d5a711f Add Python Flask Compose files 2020-03-24 09:29:25 +01:00
78244371ca Ease linkcheck 2020-03-24 09:29:24 +01:00
a1fa4806e1 Add Python Flask logo 2020-03-24 09:29:22 +01:00
02e3f8cf6e Fix headlines 2020-03-24 09:29:21 +01:00
f7741d88f9 Documentation: Python Flask 2020-03-24 09:29:10 +01:00
bc16d8906e Merge pull request #689 from cytopia/release/v1.6.3
Release v1.6.3
2020-03-23 18:55:28 +01:00
fa6a91350c Fix Release number in Update info 2020-03-23 15:26:00 +01:00
d4e3b885da Update release date 2020-03-23 14:47:55 +01:00
68f34be368 Document new env variable 2020-03-23 14:47:33 +01:00
5679774a30 Default env variable to prevent .env misconfigurations 2020-03-23 11:40:19 +01:00
056bbfb057 Allow postgresql to start without a password 2020-03-23 11:31:43 +01:00
fb77920460 Bump version and update CHANGELOG 2020-03-22 16:15:32 +01:00
a377209a72 Updated HAProxy version 2020-03-22 16:15:28 +01:00
c1fbb9c2c4 Updated PHP-FPM versions 2020-03-22 16:15:24 +01:00
ca6f7f56ac Merge pull request #688 from mjherraiz/patch-1
Update docs to newest symfony version
2020-03-22 16:11:08 +01:00
163642aac7 Update php version in symfony example doc 2020-03-22 12:26:30 +01:00
37c82a334c Update docs to newest symfony version
The new symfony structure delete web folder and change it for more standart public folder.
Now diferents env are managed with and env file
2020-03-21 19:39:46 +01:00
844ca283bf Merge pull request #686 from ops-andy/docs/expressionengine
Add How To for ExpressionEngine cms
2020-03-20 06:22:03 +01:00
63de90415c more tweaks to setup-expressionengine and now passing builds 2020-03-19 13:23:07 -04:00
c67c66c8ef fixed underline error in setup-expressionengine 2020-03-19 12:45:53 -04:00
80b6582d91 Merge branch 'master' into docs/expressionengine 2020-03-19 12:44:20 -04:00
d68adcbb01 added more detail to install instrcutions and shortened curl link 2020-03-19 12:34:21 -04:00
112e24207b added back Joomla question in FAQ 2020-03-19 11:31:42 -04:00
17232a5eb4 added ExpressionEngine install docs 2020-03-19 11:27:04 -04:00
7d6c7a4aff Merge pull request #684 from bplus/patch-3
Minor spelling fix
2020-03-06 17:01:39 +01:00
a98c6146a4 Merge branch 'master' into patch-3 2020-03-06 17:01:32 +01:00
175e4d8d02 Merge pull request #683 from bplus/patch-1
Spelling fix: Apline to Alpine
2020-03-06 17:01:00 +01:00
c56243bb9d Merge branch 'master' into patch-1 2020-03-06 17:00:40 +01:00
e294e6f6cd Merge pull request #682 from bplus/patch-2
Update CONTRIBUTING.md
2020-03-06 17:00:10 +01:00
4691117100 Minor spelling fix 2020-03-05 14:16:47 -06:00
d104e4e9a5 Update CONTRIBUTING.md
Minor spelling fix.
2020-03-05 14:12:34 -06:00
8aabde1b5a Spelling fix: Apline to Alpine
Minor spelling error.
2020-03-05 14:11:06 -06:00
44bbf048ce Merge pull request #676 from llaville/fix_reverse-proxy_docs
Fix reverse proxy docs
2020-02-24 09:06:50 +01:00
84183c9688 fix typo error in desired DNS name 2020-02-19 17:06:16 +01:00
c05a74fd5f wrong dns record (probably copy/paste from setup-reverse-proxy-nodejs.rst) 2020-02-19 17:04:11 +01:00
0c5750b8bf Merge pull request #675 from alikon/patch-1
fix  year 2020 in changelog
2020-02-13 09:16:58 +01:00
886689ca64 year 2020 f 2020-02-10 12:23:28 +01:00
bfdd3ffbfc Merge pull request #671 from cytopia/release/v1.6.2
Release v1.6.2
2020-02-09 10:21:26 +01:00
3c12883ea1 Update modules in README 2020-02-08 18:45:04 +01:00
51281ef5a0 Release v1.6.2 2020-02-06 09:22:15 +01:00
bf140cf8cd Merge pull request #663 from cytopia/release/v1.6.1
Release v1.6.1
2020-01-05 17:43:52 +01:00
ed8639c636 Refs #662 Fix Symfony version display on Devilbox intranet 2020-01-05 17:18:07 +01:00
06830367c9 Fixes #662 Update to latest Symfony CLI 2020-01-05 15:26:56 +01:00
556b50d76c Merge pull request #661 from cytopia/readme-badges
Update badges
2020-01-05 02:18:27 +01:00
4d2839f6d5 Update badges 2020-01-05 02:19:47 +01:00
87fe2ba593 Merge pull request #660 from cytopia/fix-github-settings
Fix username
2020-01-05 01:39:49 +01:00
cd82fa74a7 Fix username 2020-01-05 01:41:25 +01:00
e48c8e96dc Merge pull request #659 from cytopia/release/v1.6.0
Release v1.6.0
2020-01-05 01:37:59 +01:00
f29d552dfa Fixes #378 Allow to mount local ssh dir into PHP container (r/o) 2020-01-04 22:15:50 +01:00
304fc86329 Fixes #615 Add tool: phpmd 2020-01-04 21:07:52 +01:00
d44905bfb5 Use IP address of PHP container for Apache/Nginx upstream to skip DNS lookup 2020-01-04 20:56:30 +01:00
1b9ef528d2 GitHub settings 2020-01-04 17:41:59 +01:00
4f97eae8fe Prepare Release v1.6.0 2020-01-04 17:06:29 +01:00
2e09f7f0f8 Refs #265 Make vhost ssl type configurable 2020-01-04 17:06:08 +01:00
6fa7a84bd3 Refs #642 Make email catch-all configurable 2020-01-04 17:03:42 +01:00
266c5b84a3 Ensure env file has equal spacing everywhere 2020-01-04 17:02:33 +01:00
b75aa9f2ab Merge pull request #658 from cytopia/fix-unbound-var
Fix unbound bash variable in CI tests
2020-01-04 15:44:27 +01:00
99163bd525 Fix unbound bash variable in CI tests 2020-01-04 15:45:54 +01:00
dada924b41 Merge pull request #657 from cytopia/release/v1.5.0
Release v1.5.0
2020-01-04 03:44:09 +01:00
75b6db7676 Refs #653 #643 add integration tests for MySQL/MariaDB/Percona images 2020-01-03 18:24:38 +01:00
f90b53c79a Fixes #654 Add Opcache Control Panel 2020-01-03 15:39:22 +01:00
7d1d3add5a Merge pull request #655 from cytopia/release/v1.4.0
Release v1.4.0
2020-01-02 18:32:22 +01:00
17735e09ce Adjust release date 2020-01-02 16:12:30 +01:00
ff143fe931 Fixes #265 HTTP to HTTPS redirect 2019-12-31 18:42:42 +01:00
72c7a7db02 Fixes #642 Fixes #614 Updated PHP Docker image 2019-12-31 18:41:13 +01:00
151246179d Refs #618 Update Compose override file with new version 2019-12-31 18:13:52 +01:00
6e27f83b4d Update Changelog 2019-12-31 17:47:57 +01:00
616fed6326 Fixes #618 Update Compose version to 2.3 2019-12-31 17:37:32 +01:00
0b9d127979 Merge pull request #650 from cytopia/update-vendors
Release v1.3.0
2019-12-28 23:40:17 +01:00
53e10a5a38 Fix error_reporting in phpMyAdmin 2019-12-28 22:20:32 +01:00
e3ce8593be Remove non-stable Redis image 2019-12-28 22:05:48 +01:00
e3da67d96d Adding Redis 6.0 2019-12-28 22:00:49 +01:00
4ae80c66aa Remove obsolete links from documentation 2019-12-28 21:27:15 +01:00
ada47bbd5b Ensure travis fails on errors 2019-12-28 21:26:49 +01:00
207b7ac7ad Add Adminer update instructions to changelog 2019-12-28 21:12:08 +01:00
25eac35991 Add phpMyAdmin 5.0.0 2019-12-28 21:02:28 +01:00
8eef4b05ec Update phpMyAdmin to 4.9.3 2019-12-28 20:55:21 +01:00
d8a84bb889 Fix failing tests for Adminer and PHP 8.0 2019-12-28 20:48:41 +01:00
4ac8eb17d2 Fix Adminer tests 2019-12-08 11:11:37 +01:00
e2930d2b4e Update version and Changelog 2019-12-08 08:17:19 +01:00
d6818a1470 Update phpMyAdmin to 4.9.2 2019-12-08 08:14:01 +01:00
914f32bc14 Fixes #626 Update Adminer to 4.7.5 2019-12-08 08:12:03 +01:00
9234730dd8 Merge pull request #648 from cytopia/docs
Build documentation in CI
2019-12-02 19:29:06 +01:00
921188a5b3 Build documentation in CI 2019-12-02 11:23:29 +01:00
bdf8eb7578 Merge pull request #647 from cytopia/release/v1.2.0
Release v1.2.0
2019-12-01 10:49:53 +01:00
dc9a30ed5f Fixes #592 sqlsrv connection problem 2019-11-30 23:15:35 +01:00
e6d0a1597f Reference more issues in Changelog 2019-11-30 23:02:31 +01:00
cf91371b61 Add Updating instructions 2019-11-30 22:59:42 +01:00
b07e2cb747 Cleanup docker-compose.yml 2019-11-30 22:53:21 +01:00
ca5dec2e57 Bump version and Changelog 2019-11-30 22:53:05 +01:00
ccea6e3814 Add latest MySQL images 2019-11-30 22:52:37 +01:00
ce4b340224 Fix #622 by adding httpd server with latest cert-gen version 2019-11-30 22:52:19 +01:00
31940fc22a Add latest PHP-FPM images 2019-11-30 22:51:15 +01:00
a7d3c53979 Make PHP 7.3 the default 2019-11-30 22:50:43 +01:00
44b146b824 Merge pull request #645 from cytopia/release/v1.1.0
Release v1.1.0
2019-11-24 22:16:46 +01:00
44b9611c94 Remove empty line from README.md 2019-11-24 16:15:01 +01:00
593dfbe31a Fix Wordpress CI check 2019-11-24 11:38:27 +01:00
a409c214c7 Do not change HTTP port when running from inside container 2019-11-24 10:37:49 +01:00
4daebaa325 Ensure vhost-gen config files match with upstream 2019-11-24 10:34:42 +01:00
967f282739 Adjust Changelog 2019-11-24 10:31:07 +01:00
182269fdf1 Update MongoDB images 2019-11-24 10:29:15 +01:00
57a1f335f6 Update PostgreSQL images 2019-11-24 10:25:29 +01:00
247530bcac Add GitHub Actions build badges 2019-11-24 10:24:04 +01:00
8f47af8bfb Exclude Apache 2.2 from static DirectoryIndex test 2019-11-24 10:06:37 +01:00
49d6c68bb5 Test Frameworks according to chosen PHP version 2019-11-24 10:02:12 +01:00
b318da24c6 Update version dates 2019-11-24 01:04:01 +01:00
3551c89311 Split GitHub Actions workflows 2019-11-24 01:02:51 +01:00
b5ed81e28a Fix Travis builds 2019-11-23 12:41:57 +01:00
57ff6da675 Fix unbound variable 2019-11-23 00:26:50 +01:00
c8de832210 Simplify tests 2019-11-23 00:02:17 +01:00
41493bc514 Test against wordpress 2019-11-22 23:11:34 +01:00
2f129611cc Fix unbound variable in tests 2019-11-22 10:41:25 +01:00
2744a39aec Adjust Travis CI checks 2019-11-22 08:56:49 +01:00
9cff9a1277 Update PHP image version 2019-11-22 08:49:26 +01:00
7301d581df Update Intranet version 2019-11-21 17:34:03 +01:00
c271734278 Update CHANGELOG 2019-11-21 17:33:34 +01:00
574a6cc183 Test all versions via GitHub Actions 2019-11-21 15:20:35 +01:00
5d9f396b14 Ensure Vendor login works 2019-11-21 14:55:16 +01:00
7ea5aa8aed Fixes #641 Adding latest version of phpPgAdmin 2019-11-21 13:35:45 +01:00
2a2167205a Make tests pass shellcheck 2019-11-21 12:44:35 +01:00
2b58cb5153 Fixes #644 Use PHP 7.4 with stable JPEG support 2019-11-20 12:01:20 +01:00
f4ddbfb15e Run CI steps even if previous ones failed 2019-11-18 00:58:24 +01:00
de89a170e7 php-fpm v0.92 2019-11-18 00:20:31 +01:00
2aacfeaaed Add integration tests via GitHub Actions 2019-11-18 00:17:10 +01:00
ace5d7c1fc Merge pull request #624 from nuno-andre/patch-1
Updates end-of-line for batch file
2019-11-02 19:53:34 +01:00
04e7c70b26 Updates end-of-line for batch file
Using *nix' `lf` line endings instead of `crlf` in Windows batch files can lead to [unexpected results](https://stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e).
2019-08-27 19:26:53 +02:00
0543f2da92 Merge pull request #591 from cytopia/ngrok
Make Ngrok region configurable via NGROK_REGION env var
2019-06-11 08:58:53 +02:00
9b5e19cf41 Make Ngrok region configurable via NGROK_REGION env var 2019-06-10 19:00:02 +02:00
3dec841e88 Merge pull request #590 from cytopia/update-php-container
Fix #587 Use updated PHP images
2019-06-10 18:29:31 +02:00
3370934bb3 Bump version date 2019-06-10 16:46:24 +02:00
0a5327ac77 Reflect new modules in README 2019-06-10 16:46:10 +02:00
11c46cd9c0 Fix #587 Use updated PHP images 2019-06-10 16:40:44 +02:00
fdb6cffb3b Merge pull request #582 from cytopia/doc-updates
Bugfix updates
2019-05-21 16:46:56 +02:00
19e5d03fe0 Add yq to available tools 2019-05-21 09:45:06 +02:00
2294672403 Fix table valign 2019-05-21 09:24:57 +02:00
23a9b2b889 Prepare Bugfix release 2019-05-21 09:21:59 +02:00
15dcf8b350 Show OAuth modules in README 2019-05-21 09:09:05 +02:00
23ac8cde1a Bump version and update Changelog 2019-05-21 09:07:09 +02:00
c04750aa15 User latest PHP-FPM version 2019-05-20 23:53:53 +02:00
e6e5a1f8c6 Add Devilbox Flames to README 2019-05-18 15:49:41 +02:00
816aa75dab Merge pull request #578 from cytopia/update-php-container
Use latest php-fpm images
2019-05-16 00:28:41 +02:00
fb8499f645 Use latest php-fpm images 2019-05-12 15:47:09 +02:00
4be9018c2b Merge pull request #569 from cytopia/ci-tests
Re-enable Adminer tests for PHP 7.3
2019-04-28 18:48:28 +02:00
147fffb20d Re-enable Adminer tests for PHP 7.3 2019-04-28 18:48:02 +02:00
65b81ab2f8 Merge pull request #571 from cytopia/stale-bot
Protect WIP PR's from stale-bot
2019-04-28 13:59:49 +02:00
1eed5e2e4b Protect WIP PR's from stale-bot 2019-04-28 13:59:14 +02:00
204a8a0736 Merge pull request #570 from cytopia/stale-bot
Add stale bot to repository
2019-04-28 13:54:20 +02:00
94cb41fb1f Add stale bot to repository 2019-04-28 13:53:20 +02:00
6bc99d02b2 Merge pull request #568 from cytopia/update-php-container
Fix mods for PHP-FPM 8.0
2019-04-27 16:36:22 +02:00
e28f268098 567 Remove orphaned mentions of HOST_PATH_MYSQL_DATADIR 2019-04-27 12:59:09 +02:00
aef23ac4fd Fix link for iPhone app 2019-04-27 11:59:14 +02:00
1e8626bd87 Fix typo in documentation 2019-04-27 11:55:57 +02:00
e044f89ad0 Fix mods for PHP-FPM 8.0 2019-04-27 11:48:08 +02:00
7b853cdf79 Merge pull request #566 from cytopia/tools
Add tools: Angular CLI and Laravel Lumen
2019-04-22 12:27:05 +02:00
8fda181691 Refs #557 #559 Add tools: Angular CLI and Laravel Lumen 2019-04-20 12:40:41 +02:00
e91a7001b4 Merge pull request #565 from cytopia/docs-processwire
Documentation: Setup ProcessWire
2019-04-20 12:12:18 +02:00
e4068aac9f Documentation: Setup ProcessWire 2019-04-20 11:56:14 +02:00
5768c8505e Merge pull request #554 from cytopia/ci-tests
Fix CI tests for mail volume
2019-04-20 10:16:09 +02:00
fb8c378727 Fix CI tests for mail volume 2019-04-20 10:00:53 +02:00
6b7d6516e8 Merge pull request #563 from pniederlag/patch-1
follow TYPO3 CMS brand rules
2019-04-13 00:09:00 +02:00
3dc8d865fe follow TYPO3 CMS brand rules
TYPO3 brand is uppercased ;)
2019-04-12 15:57:46 +02:00
c0530520a1 Merge pull request #562 from cytopia/fix-docs
Fix docs
2019-04-12 09:07:13 +02:00
82206aed02 Update project information 2019-04-12 08:43:41 +02:00
6b663d2df5 Fixed typo in wordpress documentation 2019-04-12 08:43:14 +02:00
1a18c1891c Merge pull request #558 from pedrosanta/docs-version-tag-update
Update release tag on update docs
2019-04-09 08:34:36 +02:00
6d485dcc4f Update release tag on update docs 2019-04-05 16:55:58 +01:00
260c222209 Merge pull request #553 from groovenectar/patch-1
Typo + sentence change
2019-03-28 13:00:24 +01:00
6690610623 Typo + sentence change 2019-03-27 14:38:14 -04:00
ac040416cf Another note about git pull before changing branch (#552)
* Another note about git pull before changing branch

* Update checkout-different-devilbox-release.rst
2019-03-24 19:49:28 +01:00
b479bcaec9 Merge pull request #551 from pnoeric/patch-2
Added git pull
2019-03-24 19:48:12 +01:00
03afc32392 added info about git fetch 2019-03-24 18:08:41 +01:00
7a1dadf10c Added git pull 2019-03-24 13:04:45 +01:00
6da8f35cf7 Merge pull request #550 from cytopia/release/v1.0.1
Bugfix Release v1.0.1
2019-03-24 12:09:55 +01:00
d58b4f6035 Release preparation 2019-03-23 20:42:59 +01:00
f5e32c25a1 #373 Use fixed MySQL images which allow for custom configuration files 2019-03-23 20:40:29 +01:00
f45826edfd Deprecated wddx extension for PHP 7.4 and 8.0: https://wiki.php.net/rfc/deprecate-and-remove-ext-wddx 2019-03-23 20:37:28 +01:00
f94557062d Fixes #536 Add Vue cli 2019-03-23 20:36:41 +01:00
f2aa49b8cd Fixes #540 mysqldump-secure password substitution 2019-03-23 20:36:02 +01:00
acf3293692 #506 documentation: how to connect to MySQL and other services 2019-03-23 20:28:10 +01:00
5064effe89 #209 Fix Xdebug documentation for Docker for Windows 2019-03-23 20:03:53 +01:00
3cbbdb35b0 Merge pull request #416 from cytopia/release/v1.0.0
Devilbox Release v1.0.0
2019-03-19 08:55:19 +01:00
c2b8a53efc #500 docs troubleshooting mysql 2019-03-18 19:28:22 +01:00
2b521c9e71 Remove migration announcement 2019-03-18 19:15:46 +01:00
9e3da94edb Prepare Devilbox v1.0.0 release 2019-03-18 19:13:23 +01:00
1138c498c7 Update CHANGELOG 2019-03-18 19:10:22 +01:00
cfba16f887 Restore failed rebase 2019-03-18 19:10:18 +01:00
ef2f39f794 Clean up docker-compose.yml 2019-03-18 19:09:39 +01:00
f19a5d2ca2 Ensure mail uses a Docker volume 2019-03-18 19:09:38 +01:00
c582163951 Remove unecessary data dirs 2019-03-18 19:09:37 +01:00
c6542ad032 Update container versions 2019-03-18 19:09:36 +01:00
bb1b72d9af Ensure default values are used for mounted data directories as well 2019-03-18 19:09:35 +01:00
ba3dd31729 Refs #175, Refs #382 Use Docker volumes instead of data directories 2019-03-18 19:09:33 +01:00
0dc142e1e2 Merge pull request #546 from cytopia/docs-troubleshooting
Docs troubleshooting
2019-03-18 19:08:40 +01:00
8dbf591624 Update version date 2019-03-18 18:53:14 +01:00
ccdc3e07b8 Update changelog 2019-03-18 18:48:10 +01:00
3d8e08e398 #539 Troubleshoot 'no space left on device on MacOS' 2019-03-18 17:25:01 +01:00
ba58b846e2 #424 #473 #490 #500 #542 Document errors for starting MySQL 2019-03-18 15:16:06 +01:00
e4657f36e0 Merge pull request #538 from nickw108/master
Add blog post reference to documentation
2019-03-12 17:19:30 +01:00
558cd89e95 Add blog post reference to documentation 2019-03-12 12:38:59 +01:00
47f62d23b6 Merge pull request #537 from pnoeric/patch-1
Very small typo fix
2019-03-11 17:58:17 +01:00
c57dff5a44 Very small typo fix 2019-03-11 15:09:32 +01:00
4e429a97c3 Merge pull request #534 from cytopia/release/v0.15.0
Devilbox Release v0.15.0
2019-03-09 16:12:07 +01:00
fbc1b7f22c Prepare v0.15.0 Release 2019-03-09 15:10:59 +01:00
6de4a56fa3 Merge pull request #533 from cytopia/css-theme-docs
Fix CSS for code boxes
2019-03-09 12:49:05 +01:00
0c316eeef3 Fix CSS for code boxes 2019-03-09 12:48:30 +01:00
44f2e36071 Merge pull request #532 from cytopia/documentation-xdebug
Documentation for PHP Xdebug on Windows (indentation fix)
2019-03-09 12:17:42 +01:00
38332ba801 Fix #209 documentation for PHP Xdebug on Windows 2019-03-09 12:16:56 +01:00
c9f72e47c3 Merge pull request #531 from cytopia/documentation-xdebug
Fix documentation for PHP Xdebug on Windows
2019-03-09 12:12:31 +01:00
4e41e64308 Fix #209 documentation for PHP Xdebug on Windows 2019-03-09 12:10:27 +01:00
e36e88127d Merge pull request #530 from cytopia/third-party-devilbox-cli
Documentation: devilbox-cli.sh
2019-03-09 11:32:10 +01:00
73cc2d9b1e Refs #527 Add third-party tool info page: devilbox-cli.sh 2019-03-09 11:22:32 +01:00
8840ce67e4 Merge pull request #529 from cytopia/vendor-phpmemcached
Vendor PHPMemcachedAdmin
2019-03-09 11:16:39 +01:00
afb7d3a577 Fix indentation 2019-03-09 11:14:00 +01:00
54d7b0d1a1 Bump version date 2019-03-09 11:10:54 +01:00
962ae92943 Fix #525 Add docs for PHPMemcachedAdmin 2019-03-09 11:10:31 +01:00
f5bba1732a Fix #525 Add PHPMemcachedAdmin 2019-03-09 11:10:27 +01:00
ecf456db1f Merge pull request #528 from cytopia/update-php-image
Fixes #499 and Fixes #496
2019-03-09 02:23:30 +01:00
297a015b72 Fixes #499 and Fixes #496 2019-03-08 21:16:56 +01:00
d20b76aea6 Merge pull request #526 from cytopia/docs-third-party
Fixes #405 add project information to documentation
2019-03-08 15:07:15 +01:00
eb4c68109d Fixes #405 add project information to documentation 2019-03-08 15:04:21 +01:00
50ab236ea9 Merge pull request #524 from cytopia/documentation-contao
Documentation Contao CMS
2019-03-07 17:49:22 +01:00
e81b456ec3 Add follow up steps for framework/cms examples 2019-03-07 17:23:41 +01:00
c27ac1a8e9 Update CHANGELOG 2019-03-07 17:23:36 +01:00
8ab6b24925 Add configurable PSA banner across all doc pages 2019-03-07 17:23:32 +01:00
dab5c1e2ea Enhance example with note about Symlinks on Docker Toolbox 2019-03-07 17:23:28 +01:00
6ce9a94509 Add documentation: setup Contao CMS 2019-03-07 17:23:24 +01:00
5421d45d82 Merge pull request #523 from cytopia/update-php
Use latest 2.7 release of Xdebug
2019-03-07 17:22:58 +01:00
1b5f40278d Use latest 2.7 release of Xdebug 2019-03-07 00:49:11 +01:00
3d805b1191 Merge pull request #522 from cytopia/feature-ngrok
Feature ngrok
2019-03-06 22:05:36 +01:00
83823e0ccf Update versioning files 2019-03-06 14:11:25 +01:00
bc987a5663 \#453 Add Ngrok Documentation 2019-03-06 14:10:33 +01:00
a7133dd6ed #453 Add Ngrok Compose override file 2019-03-06 14:08:51 +01:00
e8fa029de6 Merge pull request #521 from cytopia/docker-nginx
Nginx worker|connection settings via .env
2019-03-05 08:37:06 +01:00
5263cb6a8b Bump version date 2019-03-04 08:53:01 +01:00
719a127205 Update Changelog 2019-03-04 08:52:37 +01:00
e9abde6194 shell.bat does not need to have executable bit set 2019-03-04 08:50:35 +01:00
6c851a5772 Fixes #393 Be able to customize worker_processes and worker_connections 2019-03-04 08:50:04 +01:00
ec1d312c41 Merge pull request #520 from cytopia/nginx-request-entity-limitations
Set client_max_body_size to 0 for Nginx to be in line with Apache
2019-03-04 08:32:03 +01:00
489695268f Add info about HTTPS 2019-03-03 16:31:03 +01:00
48fb8c5909 Fixes #356 Set client_max_body_size to 0 for Nginx to be in line with Apache 2019-03-03 16:12:05 +01:00
31586cb6e1 Merge pull request #518 from cytopia/wkhtmltopdf-with-qt
Switching to wkhtmltopdf with QT patch enabled
2019-03-03 04:40:42 +01:00
f638f98fa3 Fixes #493 Switching to wkhtmltopdf with QT patch enabled 2019-03-02 22:29:04 +01:00
4e787aa8a4 Merge pull request #519 from cytopia/docs-important
Documentation: Add IMPORTANT section
2019-03-02 20:42:16 +01:00
7d371cc66d Documentation: Add IMPORTANT section 2019-03-02 20:40:45 +01:00
78c76f6b7e Merge pull request #517 from cytopia/docs-xdebug
Fixes #381 Rewrite and simplify Xdebug documentation
2019-03-02 18:02:56 +01:00
408687e9ed Fix sphinx error 2019-03-02 18:02:07 +01:00
cd60aa7568 Fixes #381 Rewrite and simplify Xdebug documentation 2019-03-02 18:00:20 +01:00
771b01aec0 Merge pull request #516 from cytopia/docs-toolbox-symlinks
Fixes #479 Documentation: Docker Toolbox on Windows and Symlinks
2019-03-02 15:55:27 +01:00
62b506470c Fixes #479 Documentation: Docker Toolbox on Windows and Symlinks 2019-03-02 14:42:41 +01:00
9375340426 Merge pull request #515 from cytopia/docs-magento2
Documentation: Magento 2 install example
2019-03-02 12:49:28 +01:00
7016f65ae3 Fixes #483 Add note to use Apache 2.4 by default for Magento 2 example 2019-03-02 12:46:24 +01:00
7cb9502c1e Merge pull request #514 from cytopia/backport-from-release-1.0.0
Backport non-breaking changes from Release v1.0.0
2019-03-02 12:05:58 +01:00
200135164b Backport non-breaking changes from Release v1.0.0 2019-03-01 13:59:33 +01:00
b92d9900ac Merge pull request #512 from cytopia/varnish-ssl-offloading
Varnish SSL offloading with HAProxy
2019-02-28 13:51:18 +01:00
d7a0cdb662 Use diagrams from artwork repository 2019-02-28 12:49:45 +01:00
cb6f109b4f Fix redirected link 2019-02-28 12:43:33 +01:00
47c830116a Ensure README is generated idempotently 2019-02-28 12:43:28 +01:00
8496818dec Keep CHANGELOG in sync 2019-02-28 12:43:24 +01:00
7aaa6d3ea6 Provide Architecture overview in README 2019-02-28 12:43:20 +01:00
5343cabcdc Refs #480 Add HAProxy SSL offloading documentation 2019-02-28 12:43:15 +01:00
cdb27c836f Refs #480 Add HAProxy in front of Varnish for SSL offloading 2019-02-28 12:43:11 +01:00
b76a568a8b Merge pull request #513 from cytopia/docs-restart-devilbox
Docs restart Devilbox (docker-compose rm -f)
2019-02-28 12:42:27 +01:00
c32b8462e2 Add architecture diagram 2019-02-28 12:37:47 +01:00
16131d3c87 Fixes #426: Emphasize importance of docker-compose rm 2019-02-28 12:37:30 +01:00
1b1004c87e Merge pull request #510 from cytopia/elk-stack
ELK stack
2019-02-26 21:39:29 +01:00
d10eab8471 Update CHANGELOG 2019-02-23 12:14:15 +01:00
dfc0bdde21 Bump version date 2019-02-23 12:10:55 +01:00
0cb503db49 Reflect container changes in main README 2019-02-23 12:10:43 +01:00
7f58dd9a79 Refs: #360 Add documentation for ELK stack 2019-02-23 12:03:56 +01:00
cb74322d1a Append info about env variables 2019-02-23 12:02:38 +01:00
e15c019eea Consolidate overwrite files 2019-02-23 12:02:13 +01:00
588c537199 Refs: #360 Add ELK stack 2019-02-23 11:59:49 +01:00
fe5c3bb63d Merge pull request #509 from cytopia/varnish-mount
Varnish custom configs
2019-02-17 18:18:02 +01:00
68f49c0be6 Adjust documentation to reflect custom Varnish config mounts 2019-02-17 12:04:05 +01:00
6fb39c0e69 Ensure Varnish can mount custom configurations 2019-02-17 11:53:43 +01:00
325acdf89a Merge pull request #508 from cytopia/features
Feature: Add Varnish to Devilbox stack
2019-02-17 10:29:24 +01:00
5bb4ae5db6 Update Changelog 2019-02-16 21:13:20 +01:00
447678413e Bump version 2019-02-16 21:12:48 +01:00
ae0ced0a67 Add documentation for Varnish 2019-02-16 21:12:34 +01:00
e4a5d09fd9 Provide Varnish docker-compose.override.yml files 2019-02-16 21:11:58 +01:00
84830a86c5 Use latest PHP-FPM images 2019-02-16 20:38:14 +01:00
047be5ac0a Merge pull request #507 from cytopia/ci-tests
Add HTTPS CI tests
2019-02-16 19:03:38 +01:00
57aa1846b9 Add CI tests against HTTPS 2019-02-16 13:27:46 +01:00
384976a780 Backport tests from release branch 2019-02-16 13:27:18 +01:00
cc6de2dfa1 Merge pull request #502 from cytopia/php-8.0
PHP-FPM 8.0
2019-02-10 15:23:25 +01:00
598358e99e Allow to disable certain version for vendor checks 2019-02-10 12:29:42 +01:00
25e94d28cb Add PHP-FPM 8.0 2019-02-09 16:51:40 +01:00
1db72efa5e Merge pull request #495 from cytopia/update-php-version
Update PHP container
2019-02-07 12:42:50 +01:00
a8321eefe5 Merge pull request #494 from mrbig00/patch-1
Fix example command @ customizing vhost template
2019-02-07 08:41:40 +01:00
324e2539c1 Update PHP container 2019-02-06 20:16:03 +01:00
decaa8ed66 Fix example command @ customizing vhost template 2019-02-06 20:29:52 +02:00
ddf1bbb3b5 Merge pull request #491 from cytopia/repository-upgrade
Release preparation
2019-02-05 17:25:43 +01:00
546ad07150 Disable Mongo login for PHP 7.3 due to xdebug issues 2019-02-05 12:46:03 +01:00
ff81e6b897 Use correct hostnames in check instead of 127.0.0.1 2019-02-05 12:45:59 +01:00
d4688be7e2 Update Adminer to latest version 2019-02-05 12:45:54 +01:00
fe343ad2f9 Backport repository files from v1.0.0 release 2019-02-05 12:45:50 +01:00
54eb7be023 Update PHP-FPM 7.3 with latest xdebug module 2019-02-05 12:45:46 +01:00
59a098303b Update PR template to specify goal 2019-02-05 12:45:42 +01:00
d67b8c1ea7 Merge pull request #492 from felixmosh/fix-doc-typo
Align port number
2019-02-03 19:28:33 +01:00
d21f96f211 Align port number 2019-02-03 20:25:35 +02:00
d00ebe7176 Merge pull request #489 from cytopia/phppgadmin-autologin
phpPgAdmin autologin
2019-01-30 18:49:32 +01:00
4ee37cb9a9 Bump version 2019-01-30 15:53:27 +01:00
47ed08d61b Refs #476 Adjust documentation for phpPgAdmin autologin 2019-01-30 15:53:23 +01:00
a1fc1863fb Refs #476 Adjust tests for phpPgAdmin autologin 2019-01-30 15:53:19 +01:00
f20e8205d8 Refs #476 Enable autologin for phpPgAdmin 2019-01-30 15:53:15 +01:00
5c492f3089 Merge pull request #488 from cytopia/file-permissions
Check against correct phpMyAdmin config permissions
2019-01-30 15:52:36 +01:00
1ab9ff778a Refs #342 Regression test: Ensure phpMyAdmin is configured correctly 2019-01-30 13:35:43 +01:00
eef3582b93 Check against correct phpMyAdmin config permissions 2019-01-30 02:07:56 +01:00
cd20dc00b7 Merge pull request #478 from mrbig00/patch-1
Config phpmyadmin 4.8.4 to autologin
2019-01-30 01:08:40 +01:00
a47a497597 Remove pre-login from phpMyAdmin CI test 2019-01-29 18:02:31 +01:00
4324f13714 Add documentation entry for env settings about phpMyAdmin autologin 2019-01-29 15:59:08 +01:00
6caaea6b34 Configure old phpMyAdmin version for autologin 2019-01-29 15:59:04 +01:00
7a75f04952 Make autologin configurable 2019-01-29 15:59:00 +01:00
233c906d57 Change hostname from 127.0.0.1 to mysql 2019-01-29 15:58:56 +01:00
67c3d8bd13 Config phpmyadmin 4.8.4 to autologin 2019-01-29 15:58:51 +01:00
94466a0d1f Merge pull request #487 from cytopia/documentation-docker-compose-override
Documentation docker compose override
2019-01-29 12:56:59 +01:00
728c17b5f5 Bump version 2019-01-29 12:51:15 +01:00
7ac909566f Refs #451 Improve docs about docker-compose.override.yml 2019-01-29 12:50:45 +01:00
4a43c155a7 Merge pull request #470 from cytopia/documentation-blackfire
Blackfire improvements
2019-01-28 14:43:09 +01:00
56a5faaf44 Adjust TL;DR section of blackfire documentation 2019-01-28 11:45:12 +01:00
872ae0d536 Ensure startup scripts are tested correctly 2019-01-28 11:35:59 +01:00
5c951bbfb3 Only configure blackfire cli if binary is present 2019-01-28 11:35:40 +01:00
8ebf735e9d Bump Devilbox version 2019-01-28 02:37:44 +01:00
30156f108e Adjust blackfire documentation 2019-01-28 02:37:40 +01:00
5686e415cc Provide default blackfire php.ini files 2019-01-28 02:37:35 +01:00
a4c05d34e9 Fix autostart script for blackfire to only configure client 2019-01-28 02:37:31 +01:00
e09d6a06b8 Add blackfire client configuration to override.yml-all 2019-01-28 02:37:26 +01:00
43ca5a8a1f Add blackfire client configuration 2019-01-28 02:37:22 +01:00
3cc0448446 Add blackfire-agent startup script (configure and run) 2019-01-28 02:37:18 +01:00
44279ea9c1 Refs #451 Ensure to properly document how to enable blackfire 2019-01-28 02:37:13 +01:00
33600fe1ba Merge pull request #485 from cytopia/editorconfig
Editorconfig
2019-01-28 01:11:14 +01:00
20f3dfa86f Ensure correct executable bit is set 2019-01-26 19:52:44 +01:00
4caf169c9d Ensure current files adhere to .editorconfig 2019-01-26 19:52:40 +01:00
8fa2c56060 Refs #481 Adding editorconfig 2019-01-26 19:52:36 +01:00
93010826ee Merge pull request #484 from cytopia/documentation-links
Fix documentation links
2019-01-26 19:50:29 +01:00
f1d4771aba Merge pull request #477 from ibnuh/patch-1
Fix typo setup-yii.rst
2019-01-26 17:22:16 +01:00
ce2b83f06d Fix documentation links 2019-01-26 17:18:19 +01:00
0460c92775 Fix typo setup-yii.rst 2019-01-18 14:46:42 +07:00
67db5ac40c Merge pull request #474 from cytopia/bugfix-release
Bugfix release
2019-01-17 09:34:51 +01:00
88729db0cc Fixes #472 Ensure to fail on invalid vhost-gen override file 2019-01-16 18:21:22 +01:00
d57446b6dc Fixes #471 Adding zip binary 2019-01-16 18:20:30 +01:00
3400c02b45 Merge pull request #468 from cytopia/php-cs-fixer
Feature Release: Foreign Function Interface (FFI) and PHP-CS-Fixer
2019-01-13 02:20:56 +01:00
765ffb3232 Update to latest PHP-FPM images 2019-01-12 17:41:37 +01:00
8c6c95e32d Bump version 2019-01-12 14:58:30 +01:00
26c90d4bec Use latest PHP-FPM Docker images 2019-01-12 14:58:10 +01:00
0091e59adb Fixes #467 Add tool: PHP CS Fixer 2019-01-11 10:52:59 +01:00
74bd19b241 Merge pull request #457 from cytopia/blackfire
PHP Blackfire
2019-01-09 22:09:05 +01:00
119b2e2a6c Bump version date 2019-01-08 08:58:15 +01:00
c643f81ce5 Fix 2019-01-08 08:57:34 +01:00
d74ff4f01d Merge pull request #464 from cytopia/fix-global-vhost-gen
Use new HTTP container that properly read global vhost-gen config
2019-01-08 08:53:21 +01:00
1c846d4e5b Fixes #463 Use new HTTP container that properly read global vhost-gen config 2019-01-07 19:16:42 +01:00
bd12669b88 Merge pull request #462 from cytopia/http2-support
Use HTTP/2 as default for all SSL connections
2019-01-07 18:59:17 +01:00
eb53315861 Update vhost-gen templates 2019-01-06 13:02:38 +01:00
9fb398a5ee Bump version 2019-01-06 12:58:26 +01:00
d5caba5e11 Fixes #431: Use HTTP/2 as default for all SSL connections 2019-01-06 12:54:34 +01:00
2c0264a436 Merge pull request #461 from ztickm/patch-1
Fixed Typo: color to colon
2019-01-06 01:40:10 +01:00
188b22d65d Fixed Typo: color to colon 2019-01-06 00:09:14 +01:00
f647f16b7b Merge pull request #460 from keithy/patch-1
typo
2019-01-05 17:27:54 +01:00
89cb711f55 typo 2019-01-05 14:20:06 +00:00
e91638552a Merge pull request #458 from cytopia/cytopia-patch-1
Update issue templates
2019-01-04 15:26:54 +01:00
e1867c01dc Update issue templates 2019-01-04 15:23:59 +01:00
930e074e2f Merge pull request #456 from cytopia/community-forum
Fixes #245 Discourse community forums
2019-01-03 18:43:30 +01:00
b6763ad40f Fixes #245 Add Discourse forums 2019-01-03 17:57:35 +01:00
40d9bd1b85 Merge pull request #452 from cytopia/oracle-support
Fixes #394 Native Oracle Database support for PHP
2019-01-02 14:55:22 +01:00
39d1e1eb5a Fixes #394 Native Oracle Database support for PHP 2019-01-01 21:39:56 +01:00
5cc0b548c6 Merge pull request #449 from cytopia/vendors
Reverse Proxy, Autostart and phpPgAdmin
2018-12-31 16:57:47 +01:00
3a3aec4d66 Bump version 2018-12-31 13:41:57 +01:00
83eb20d138 Add autostart and reverse proxy documentation 2018-12-31 13:14:29 +01:00
782a7c05be Simplify Reverse Proxy vhost-gen templates 2018-12-31 10:55:22 +01:00
c93f97ce2e Fix vhost-gen documentation to also reflect changes of rproxy templates 2018-12-29 17:38:15 +01:00
03ead39f2c Remove duplicate newlines 2018-12-29 15:39:41 +01:00
f60af9b8f8 Refs #240 use HTTPD images with reverse proxy capabilities 2018-12-29 15:27:15 +01:00
ccb70befc3 Reflect Reverse proxy capabilities in README 2018-12-29 15:25:41 +01:00
529646520d Normalize vhost-gen configs 2018-12-29 14:23:13 +01:00
b23fef2fa4 Ensure tests really fail in case of errors 2018-12-29 14:22:51 +01:00
0bf985103c Fix vhost-gen templates for reverse proxy settings 2018-12-29 13:55:53 +01:00
cf5fb86e4b Update vhost-gen templates 2018-12-29 13:13:01 +01:00
4c45a7e33d Add global autostart example 2018-12-29 13:12:38 +01:00
1dfa98446b Rewrite tests to also accompany for rproxy tests 2018-12-29 13:12:06 +01:00
ccd3f1dbc2 Enable new autostart behaviour: per version and for all 2018-12-29 00:19:54 +01:00
f2b0773fb5 Clean-up docker-compose.yml 2018-12-28 23:56:14 +01:00
a1b1d9ad93 Provide phpPgAdmin default configuration 2018-12-28 23:49:25 +01:00
3e4517ec42 Fix phppgadmin test on failure 2018-12-28 23:33:54 +01:00
1ffaf4ce92 Bump version date 2018-12-28 23:08:09 +01:00
15e72edb5f Use PHP-FPM 0.64 images 2018-12-28 22:49:51 +01:00
a96da64830 Distinguish between base, mods and available php extensions 2018-12-28 22:47:35 +01:00
de44f23594 Add phpPgAdmin to README 2018-12-28 22:45:54 +01:00
2e580b29f0 Fix retrieval of available PHP extensions 2018-12-28 22:45:30 +01:00
46141b7e50 Update readthedocs for phpPgAdmin 2018-12-28 22:44:50 +01:00
5c95242111 Add vendor: phpPgAdmin 2018-12-28 22:38:09 +01:00
93c16d4e03 Merge pull request #446 from cytopia/custom-startup-scripts
Custom startup scripts
2018-12-27 17:21:21 +01:00
4e44082cd8 Import GPG key into rpm before installing software to ensure it is valid 2018-12-27 14:28:49 +01:00
79b197822a Ensure oracle oci8/pdo_oci work on every version 2018-12-27 14:14:01 +01:00
fad12d120d Tie PHP module check against currently used php-fpm tag 2018-12-27 13:51:09 +01:00
7fabead92d Auto accept EULA for CI tests 2018-12-27 13:46:31 +01:00
cb7ec86765 Test startup files 2018-12-27 13:18:42 +01:00
ddbe0f9bb6 Test against available php modules 2018-12-27 13:10:51 +01:00
b37afe3268 Use latest PHP images without env var name collisions 2018-12-26 17:36:47 +01:00
dbd69c8d59 Refs #394 - Add startup script examples for Oracle instaclient 2018-12-26 17:36:09 +01:00
d930c08a45 Fix requirements to build documentation 2018-12-26 17:31:23 +01:00
09c564c68d Add documentation for custom startup scripts 2018-12-26 17:31:09 +01:00
30ea9ff2b5 Fix undefined variable in intranet vhost_gen overview 2018-12-26 15:31:15 +01:00
42602d2ce3 Bump version date 2018-12-26 12:15:00 +01:00
3359bd3f9a Pull docker images until success to circumvent short network outages 2018-12-26 11:55:01 +01:00
0115ee3b77 Allow for custom startup scripts 2018-12-25 16:40:19 +01:00
aa574e9205 Adjust ignored files 2018-12-25 16:39:48 +01:00
8f38cbd736 Add examples for how to install Ms ODBC after accepting the license 2018-12-25 16:39:34 +01:00
3260e68c90 Merge pull request #445 from cytopia/update-php
Refs #439 Adding sqlsrv and pdo_sqlsrv for PHP 7.0, 7.1, 7.2 and 7.3
2018-12-23 17:19:31 +01:00
6e238cc095 Refs #439 Adding sqlsrv and pdo_sqlsrv for PHP 7.0, 7.1, 7.2 and 7.3 2018-12-23 12:19:38 +01:00
3ebeebef10 Merge pull request #444 from cytopia/update-php
Update to latest PHP container
2018-12-23 01:22:30 +01:00
8fd60fb9a9 Update to latest PHP container 2018-12-22 22:38:32 +01:00
f7bfc72cd2 Merge pull request #443 from cytopia/use-alpine-images
Use alpine images
2018-12-21 17:43:05 +01:00
97a62d3efe Remove Redis 2.8-alpine as it does not exist 2018-12-21 11:51:20 +01:00
80b7682f89 Speed up Docker pull tests and be easy on network usage 2018-12-20 23:26:15 +01:00
d5d43d0c71 Fix drush check for intranet homepage 2018-12-20 20:05:29 +01:00
d1e5c6d360 Add commented Alpine versions and adjust warning note 2018-12-20 20:04:50 +01:00
3bbefdc845 Remove old MongoDB image versions that segfault after startup 2018-12-20 17:41:15 +01:00
16bbaf4b3a Do not use Alpine image by default, but document how to enable them 2018-12-20 13:50:20 +01:00
8d005f5a70 Bump version date 2018-12-20 11:33:23 +01:00
2e86bbafd0 Ensure all provided images are properly tested via TravisCI 2018-12-20 11:32:43 +01:00
6a4083a7a3 Fixes #429 Adding smaller Alpine images where possible 2018-12-20 11:32:14 +01:00
3b73b1c5e5 Merge pull request #442 from cytopia/devilbox-ui
Devilbox Web UI: Vhost overview
2018-12-19 17:56:09 +01:00
4c39ae9edf Add integration tests for Devilbox vhost web ui 2018-12-19 14:16:27 +01:00
e8c38550c9 Extend Devilbox web ui with vhost configs 2018-12-19 14:16:04 +01:00
fb5bbcd1e1 Merge pull request #441 from cytopia/update-vendors
Update intranet vendors
2018-12-18 21:54:22 +01:00
35ff034786 Ensure to exclude breaking tests 2018-12-18 20:29:51 +01:00
09ac5f3f85 Fix check against PHP version 2018-12-18 14:47:09 +01:00
d8794950c0 Disable phpRedmin CI tests for PHP 5.3 and PHP 5.4 2018-12-18 14:40:41 +01:00
112e3d2c33 Adjust phpRedmin configuration 2018-12-18 14:30:50 +01:00
c9d3dab042 Attach latest HTTPD images 2018-12-18 12:47:35 +01:00
586cd2a882 Ensure PHP Xdebug does not autostart 2018-12-18 11:51:12 +01:00
d9272d5c52 Attach latest PHP-FPM images 2018-12-18 11:13:04 +01:00
c1d8516d84 Bump Devilbox version date 2018-12-17 11:59:16 +01:00
bfd0b22676 Upgrade PHP container versions 2018-12-17 11:58:52 +01:00
a9d56daaa0 Exclude experimental PHP versions from Xdebug check 2018-12-17 11:57:28 +01:00
e925c47b78 Ensure to test subdirectories of PHPRedmin 2018-12-17 11:01:29 +01:00
4588948d0c Test against PHP Xdebug 2018-12-16 16:10:39 +01:00
008cb7c023 Fix phpMyAdmin login check 2018-12-16 15:44:42 +01:00
1d075f4b3b Add login CI tests for phpMyAdmin 2018-12-16 15:31:22 +01:00
2b9c98bbc7 Update phpMyAdmin 2018-12-16 15:31:03 +01:00
689a8b9f12 Fix check for selecting Adminer/phpMyAdmin version 2018-12-16 02:16:50 +01:00
590855fe75 Supress stderr when gathering binary versions to prevent log spamming 2018-12-16 00:39:22 +01:00
178a81c24b Check against PHPRedmin 2018-12-16 00:34:59 +01:00
a459597759 Ensure Adminer and phpMyAdmin work with old PHP versions 2018-12-16 00:29:50 +01:00
60b2d99c09 Pipe curl output into double tac to prevent broken pipe 2018-12-15 22:58:29 +01:00
a652b0d8c5 Create CI tests for Adminer and phpMyAdmin 2018-12-15 22:22:21 +01:00
ae9330be96 Update Adminer from 4.6.2 to 4.7.0 2018-12-15 22:22:00 +01:00
9efc68b62d Merge pull request #435 from cytopia/redis-ui
Bugfixes: PHP-xdebug, Redis UI and Memcached UI
2018-12-15 20:51:05 +01:00
a237ce85d0 Simplify travis configuration 2018-12-15 17:58:17 +01:00
eff72f41a9 Update version 2018-12-15 17:12:56 +01:00
60774c0532 Ensure nc command exits properly when looking up Memcached data 2018-12-15 17:04:26 +01:00
788cea98a1 Do not load MongoDB driver if no connection exists 2018-12-15 17:03:45 +01:00
42630ab62e Fix #434 Add Xdebug to PHP 7.3 2018-12-15 14:05:54 +01:00
01cdfca7fb Integration tests for Redis and Memcached UI 2018-12-15 14:05:10 +01:00
c143eac015 Default keys for Redis and Memcached 2018-12-15 14:05:05 +01:00
8e038d403c Allow to delete keys in Redis via UI 2018-12-15 14:05:00 +01:00
e916c5100d Merge pull request #436 from cytopia/php-versions
Use latest PHP-FPM images
2018-12-10 20:04:04 +01:00
de9c9b6eb1 Use latest PHP-FPM images 2018-12-10 14:42:45 +01:00
bb42602cb3 Merge pull request #437 from cytopia/documentation-links
Fix Shopware documentation link
2018-12-10 14:41:36 +01:00
ed862b9666 Fix Shopware documentation link 2018-12-10 14:40:56 +01:00
d4e5aae7bf Merge pull request #430 from cytopia/travis-checks
Ensure to test against different Docker and Docker Compose versions
2018-12-10 13:51:08 +01:00
56672eec23 Replace test scripts with Makefile 2018-12-10 00:43:42 +01:00
330d047495 Ensure to run different Docker and Docker Compose versions 2018-12-08 14:06:22 +01:00
ea9631790e Merge pull request #428 from cytopia/docker-images
Fixes #423 once and for all: Keep Docker images up-to-date
2018-11-18 12:58:13 +01:00
28ed6b2a24 Fixes #423 once and for all: Keep Docker images up-to-date 2018-11-17 17:46:33 +01:00
e7d4800ad7 Merge pull request #427 from cytopia/fix-mongo
Fix #425 Ensure MongoDB data directory is ignored by git
2018-11-17 15:58:20 +01:00
032aefadb3 Fix #425 Ensure MongoDB data directory is ignored by git 2018-11-17 13:39:58 +01:00
208cd03a11 Merge pull request #422 from cytopia/specify-magento
Documentation: Specify Magento version
2018-11-12 09:20:15 +01:00
212ac6764a Documentation: Use Magento 2 instead of Magento where applicable 2018-11-12 09:04:07 +01:00
93a7cfeb8c Specify Magento 2
Magento 2 and 1 are both pretty prevalent at the moment, I feel it's helpful to specify in the sidebar that this is setting up **magento 2**
2018-11-11 16:44:45 +01:00
b45284bc0f Merge pull request #421 from cytopia/update-php-container
Minor fixes
2018-11-11 16:43:58 +01:00
f91ef8d9cc Refs #250: Documentation - Fix php.ini comments from # to ; 2018-11-11 13:32:50 +01:00
b7862cd9bf Update PHP container 2018-11-10 21:26:17 +01:00
ef5b35378b Merge pull request #420 from cytopia/docs-fix-links
Documentation: Fix redirect links
2018-11-10 13:00:53 +01:00
d9af495862 Documentation: Fix redirect links 2018-11-09 09:05:33 +01:00
ce3d9655a1 Merge pull request #419 from AGPDev/master
Visual improvment in vhosts list
2018-11-08 18:59:40 +01:00
d3b15cd40a Fix wrong HTML table head tag 2018-11-08 14:24:39 -02:00
c2c02ff351 Ordening vhost list asc 2018-11-08 14:23:39 -02:00
a49633f377 Merge pull request #417 from TheGlenn88/patch-1
Phalcon routes fix
2018-11-08 16:54:46 +01:00
44132c9c52 Update setup-phalcon.rst 2018-11-08 14:48:30 +00:00
8f14054606 Update setup-phalcon.rst 2018-11-08 08:54:12 +00:00
0f57b9f623 Phalcon routes fix 2018-11-08 00:12:16 +00:00
cf328ef126 Merge pull request #415 from cytopia/update-php-container
Use latest version of PHP container
2018-11-06 12:35:37 +01:00
8dd678a118 Use latest version of PHP container 2018-11-06 11:20:51 +01:00
564c6a97f7 Merge pull request #412 from cytopia/update-php-images
Use latest PHP images
2018-11-04 16:39:59 +01:00
71b31218b0 Use latest PHP images 2018-11-04 14:02:26 +01:00
4b8d60feff Merge pull request #410 from cytopia/php-7-4
Adding PHP-FPM 7.4-dev (Seven Four)
2018-11-03 15:23:43 +01:00
a3dcc12cde Allow linkcheck to ignore SSL certificate issues 2018-11-03 12:33:06 +01:00
7f0f312a37 Bump PHP version which supports Redis on PHP 7.4 2018-11-03 12:32:40 +01:00
2e9f5e48c4 Adding PHP-FPM 7.4 2018-11-02 22:55:15 +01:00
528eb45738 Merge pull request #408 from cytopia/update-docker-php-fpm-images
Fixes #367 Latest PHP-FPM images
2018-11-02 15:19:26 +01:00
708471a640 Fixes #367 Latest PHP-FPM images 2018-11-02 12:13:27 +01:00
c3af49f401 Merge pull request #407 from cytopia/documentation-performance-osx
Refs #105 document how to mitigate OSX performance issues
2018-11-01 10:52:56 +01:00
9289fa17e7 Refs #105 document how to mitigate OSX performance issues 2018-11-01 10:50:10 +01:00
0188970367 Merge pull request #406 from cytopia/intranet-drush-versions
#401 Fix display of drush versions
2018-11-01 10:22:08 +01:00
7769e34794 #401 Fix display of drush versions 2018-11-01 10:19:43 +01:00
14cd1f0838 Merge pull request #404 from sonyarianto/patch-2
Another typo fix
2018-10-27 11:18:40 +02:00
d0d63461e2 Another typo fix 2018-10-27 11:02:13 +07:00
e70cfb1fcc Merge pull request #402 from cytopia/docs-readme
Update community section
2018-10-26 09:38:50 +02:00
d6a843bd71 Update community section 2018-10-26 09:27:06 +02:00
a13d7a26c4 Merge pull request #400 from sonyarianto/master
Fix brand typo, Wordpress to WordPress
2018-10-24 20:38:57 +02:00
bf8c087622 Fix minor typo 2018-10-24 23:11:13 +07:00
1525e62429 Merge branch 'master' into master 2018-10-24 23:05:39 +07:00
49bdceaccf Fix brand typo, Wordpress to WordPress 2018-10-24 23:04:51 +07:00
4812061c12 Merge pull request #399 from sonyarianto/patch-1
Fix typo
2018-10-24 04:18:07 +02:00
31b1423b7a Fix typo 2018-10-23 10:30:49 +07:00
751820a178 Merge pull request #397 from cytopia/git-directories
Fix #396: typo in gitignore
2018-10-10 09:27:14 +02:00
d2aa3c5f77 Fix #396: typo in gitignore 2018-10-09 09:50:34 +02:00
77d5bdc108 Merge pull request #395 from polo2ro/patch-1
Update customize-specific-virtual-host.rst
2018-10-05 16:32:42 +02:00
fe30f536e2 Update customize-specific-virtual-host.rst 2018-10-05 10:04:04 +02:00
f561c8c951 Merge pull request #392 from cytopia/update-php-container
Add tool: wkhtmltopdf
2018-10-02 09:27:45 +02:00
5e5144c57f Add tool: wkhtmltopdf 2018-10-01 11:13:32 +02:00
ad66bdc9d9 Merge pull request #391 from cytopia/update-php-container
Update PHP container with different drush binaries
2018-10-01 11:11:02 +02:00
0e917deb7c Fixes #384 Update PHP container with different drush binaries 2018-09-30 12:47:40 +02:00
753a53334f Merge pull request #390 from cytopia/github-templates
Update issue templates
2018-09-30 10:19:54 +02:00
7bc8b6ea92 Update issue templates 2018-09-30 10:18:28 +02:00
a8eaabda4f Merge pull request #387 from cytopia/rdkafka
Fixes #385 Adding rdkafka-enabled PHP container
2018-09-28 11:05:02 +02:00
4de394ee88 Fixes #385 Adding rdkafka-enabled PHP container 2018-09-27 09:48:14 +02:00
35a5a38a9a Merge pull request #379 from cytopia/update-php-images
Refs #378: Add tool: Deployer
2018-09-14 14:33:09 +02:00
dd4eff2efd Refs #378: Add tool: Deployer 2018-09-14 08:58:16 +02:00
c84235c620 Merge pull request #377 from cytopia/update-php-docker-images
Fix #376 Adding graphviz-capable Docker images
2018-09-12 18:06:49 +02:00
3b0b12ac6c Fix #376 Adding graphviz-capable Docker images 2018-09-12 08:46:16 +02:00
a81decf6df Merge pull request #375 from Harmageddon/patch-1
Switched phpMyAdmin and phpRedMin
2018-09-11 21:02:54 +02:00
d0064394ad Switched phpMyAdmin and phpRedMin
The two labels got confused.
2018-09-08 20:17:44 +02:00
f10e51dd6d Merge pull request #372 from cytopia/documentation-vhost-gen
Fix #362 - Document how to add multiple server names for Apache 2.2 and Apache 2.4
2018-09-05 14:39:49 +02:00
359eb5990d Fix #362 - Document how to add multiple server names for Apache 2.2 and Apache 2.4 2018-09-05 08:51:08 +02:00
0b0462f8d6 Merge pull request #370 from cytopia/update-php-container
Update PHP container
2018-08-31 08:31:44 +02:00
7fc5bd4a70 Update PHP container 2018-08-30 08:24:20 +02:00
60f8b2c2e0 Merge pull request #368 from cytopia/latest-php-version
Fix #367: Usage latest PHP version
2018-08-29 22:20:20 +02:00
e8553504c3 Fix #367: Usage latest PHP version 2018-08-29 08:33:45 +02:00
ba17ae3811 Merge pull request #364 from cytopia/default-php-modules
Fix #361: Disable swoole by default
2018-08-29 08:29:10 +02:00
2f2ad5bbe0 Merge pull request #366 from texeltexel2009/patch-1
Fixed small links mixup
2018-08-29 08:27:12 +02:00
c5b238b7f7 Fixed small links mixup
Phpmyadmin and Phpredmin links were in the incorrect place. Just switched places.
2018-08-27 17:03:26 +02:00
0a2ff37fa1 Fix #361: Disable swoole by default 2018-08-24 09:29:42 +02:00
8913fd4536 Merge pull request #358 from cytopia/docker-blackfire
Adding new container: Blackfire
2018-08-19 12:39:08 +02:00
db2bdbca4d Fix table width 2018-08-19 12:32:53 +02:00
77eb96f65e Adding new container: Blackfire 2018-08-19 12:27:42 +02:00
085b96cae7 Merge pull request #357 from cytopia/docker-solr
Adding new container: Solr
2018-08-18 15:10:07 +02:00
5291c97db7 Adjust pre-configured container overview 2018-08-18 14:16:01 +02:00
98552275d0 Adding available container to README 2018-08-18 14:09:20 +02:00
4cd1f2e284 Bump version date 2018-08-18 13:59:02 +02:00
1defa162a8 Fix RabbitMQ variable case in documentation 2018-08-18 13:58:33 +02:00
f25f57dc37 Add links to Container versions 2018-08-18 13:57:59 +02:00
a4c1a1b72c Adding new container: Solr 2018-08-18 13:51:35 +02:00
32fe1ffb5f Merge pull request #354 from cytopia/enable-custom-docker-container
RabbitMQ
2018-08-15 20:53:16 +02:00
1906b6baad Update Devilbox release date 2018-08-15 20:23:54 +02:00
00d5d95221 Fix rst syntax error in headline 2018-08-15 20:23:37 +02:00
9170486cbf Documentation: enable all additional container 2018-08-15 20:20:52 +02:00
0c7a9234bf Fix #57: Add RabbitMQ 2018-08-15 19:54:20 +02:00
994df7d6da MailHog fine-tuning 2018-08-15 19:53:06 +02:00
c77fd90472 Merge pull request #352 from cytopia/release-0.15
Devilbox Release v0.15
2018-08-13 20:36:27 +02:00
acac4f0459 Prepare Devilbox Release v0.15 2018-08-13 01:15:45 +02:00
b9a4ee211d Merge pull request #351 from cytopia/meta
Devilbox intranet, docs and fixes
2018-08-12 18:43:33 +02:00
cf3764cd1d TL;DR Copy/paste instructions 2018-08-12 13:49:00 +02:00
eee6612b0b Make MailHog port configurable 2018-08-12 13:30:05 +02:00
ad69497ce4 Fix #202 Document MailHog integration 2018-08-12 13:20:17 +02:00
94f0b984dd Fix #323 add sane default configurations for the webservers 2018-08-12 12:21:09 +02:00
ff9d6ec972 Preview: Redis 5 2018-08-12 11:54:02 +02:00
cceefb569c Linkcheck: increase retries 2018-08-12 11:51:08 +02:00
8b177c4b05 Note about SSL certificates 2018-08-12 11:46:01 +02:00
0ee032131b Link images 2018-08-12 11:43:00 +02:00
d2b26f5e0f Adjust image size 2018-08-12 11:42:50 +02:00
f2581f0438 Bump version 2018-08-12 11:22:16 +02:00
8cb76c0966 Add documentation for phpRedMin 2018-08-12 11:21:31 +02:00
141b7bf72d Integrate PHPRedMin into Devilbox intranet 2018-08-12 10:52:13 +02:00
ed01a55960 Add PHPRedMin 2018-08-12 10:51:32 +02:00
8e14009d3d Show Redis keys grouped by DB 2018-08-12 10:29:59 +02:00
ed52e7e3d8 Test update script via Travis 2018-08-12 01:21:37 +02:00
bb201d86b1 Update Docker update script 2018-08-12 01:21:12 +02:00
58da41ab85 Merge pull request #350 from cytopia/redis-password
Redis startup options
2018-08-12 00:07:27 +02:00
8df3ed5d8f Fix linkcheck 2018-08-11 23:24:11 +02:00
b0f43a2077 Documentation: Redis startup parameter 2018-08-11 22:42:19 +02:00
32592b03dc Replace Redis password option with Redis startup options to make it more dynamic 2018-08-11 13:50:21 +02:00
d4deff1340 Merge pull request #303 from longelas/redis-custom-pass
Redis-custom-pass
2018-08-11 11:52:39 +02:00
2254ec6c49 Merge pull request #138 from cytopia/DVL-013-fix-dns
(Feedback required) DVL-013 Fix Auto-DNS for non bridged Docker networks
2018-08-11 11:39:46 +02:00
fe3306885c Forward https port 2018-08-11 11:33:17 +02:00
4d9ba6f971 DVL-013 Fix Auto-DNS for non bridged Docker networks 2018-08-11 11:33:14 +02:00
ebdd729212 Merge pull request #297 from cytopia/mount-options
Mount options: Allow SE Linux machines
2018-08-11 11:29:43 +02:00
dead8eac3d Fixes #255 - Document SELinux labels for mount options 2018-08-11 11:14:34 +02:00
7ec9a8df8f Variablize mount options 2018-08-10 09:26:14 +02:00
271230bb62 Merge pull request #349 from kusl/mount-options
Bring Mount options to par with master
2018-08-10 08:54:34 +02:00
a351c7d2d8 add z to /var/mail in docker compose
Signed-off-by: Kushal Hada <kushaldeveloper@gmail.com>
2018-08-09 22:12:43 -04:00
c036270510 Merge branch 'master' of github.com:cytopia/devilbox into mount-options 2018-08-09 20:45:07 -04:00
75836f6afc Merge pull request #348 from cytopia/linkcheck
Fix broken link in docs
2018-08-09 23:11:54 +02:00
8c2362e719 Merge pull request #347 from cytopia/phpmyadmin-settings
Fix #342 phpMyAdmin config permission error
2018-08-09 23:11:12 +02:00
cb992d08a7 Fix broken link in docs 2018-08-09 23:09:28 +02:00
0e25ca5584 Fix #342 phpMyAdmin config permission error 2018-08-09 23:01:33 +02:00
54aa508b11 Merge pull request #346 from cytopia/documentation-craftcms
Fixes #341 - Documentation: Install CraftCMS
2018-08-08 12:34:40 +02:00
245b6e6135 Merge pull request #345 from cytopia/rsync
Fixes #343: Use PHP images with rsync support
2018-08-08 12:29:00 +02:00
8b2f39972f Fixes #341 - Documentation: Install CraftCMS 2018-08-08 09:31:36 +02:00
7b1af0a947 Fixes #343: Use PHP images with rsync support 2018-08-08 08:41:23 +02:00
e91d5eac4f Merge pull request #340 from cytopia/global-vhost-gen-templates
Fix #144 Be able to use global vhost-gen templates
2018-08-06 22:23:34 +02:00
abc3cbc1a2 Unifiy README for Linux, MacOS and Windows 2018-08-06 21:56:59 +02:00
35546e7fa1 Documentation for vhost-gen templates 2018-08-06 21:42:03 +02:00
a1c6510131 Fix table 2018-08-06 20:34:58 +02:00
eb632e27cc Update install instructions 2018-08-06 08:39:15 +02:00
de61ba4a65 Fix #144 Be able to use global vhost-gen templates 2018-08-05 19:24:42 +02:00
fad7571875 Merge pull request #339 from cytopia/php-72-depreceated
Fix PHP 7.2 deprecated function: create_function()
2018-08-05 17:00:49 +02:00
9a9cb55917 Fix PHP 7.2 deprecated function: create_function() 2018-08-05 16:55:26 +02:00
d17e9bf6fe Merge pull request #333 from cytopia/ensure-hostnames-are-fix
ref #331 - Ensure hostnames are fixed
2018-08-05 05:29:11 +02:00
99765bebf0 ref #331 - Ensure hostnames are fixed 2018-08-05 05:20:51 +02:00
9a4538bb37 Merge pull request #338 from cytopia/default-example-configurations
Feature Release: Performance, Timeouts and PHP 5.2
2018-08-05 05:17:22 +02:00
c093aff25c Adding mail dir 2018-08-05 05:13:45 +02:00
c0e220b1bd Make timeout from httpd to php-fpm configurable 2018-08-05 03:04:03 +02:00
e28d56b053 Move sentence to correct headline 2018-08-05 02:43:22 +02:00
7089917126 Make mails survive reboot 2018-08-05 02:41:42 +02:00
0e61de538e Documentation: extend Magento setup instructions 2018-08-04 22:09:42 +02:00
ca33060d25 Use new PHP-FPM images 2018-08-04 22:09:42 +02:00
75765c2063 Fix default listen.backlog 2018-08-04 22:09:41 +02:00
f9db50f03a Warn about problematic TLDs 2018-08-04 22:09:41 +02:00
4ecee3f677 Add Docker logo 2018-08-04 22:09:40 +02:00
24851eb58d Apply new vhost-gen templates 2018-08-04 22:09:40 +02:00
a0982e9bb6 Link documentation and fix minor typos 2018-08-04 22:09:39 +02:00
10b99953f1 Add quickstart instructions for Windows 2018-08-04 22:09:38 +02:00
d50f9c5c24 Documentation: do not use official domains for TLD_SUFFIX 2018-08-04 22:09:38 +02:00
306107d1c6 Documentation about new php default configuration 2018-08-04 22:09:37 +02:00
7d0e0a8fa6 Documentation about PHP 5.2 2018-08-04 22:09:36 +02:00
f1a350c5b3 Add documentation links 2018-08-04 22:09:36 +02:00
66708e2b76 Fix framework links 2018-08-04 22:09:35 +02:00
9e0f65b147 Add PHP 5.2 information 2018-08-04 22:09:35 +02:00
42daba8ba6 Add documentation links 2018-08-04 22:09:34 +02:00
3c7fea1e0f Adding PHP 5.2 compatibility mode 2018-08-04 22:09:33 +02:00
1589dc96fe Fixes #234 and fixes #311 performance issues and 504 Gateway timeouts 2018-08-04 22:09:33 +02:00
1502a7e22b Adjust documentation to newly create Xdebug default configuration 2018-08-04 22:09:32 +02:00
eb0f119f7a Adjust gitignore for PHP 5.2, 5.3 and 7.3 2018-08-04 22:09:20 +02:00
ff7fa9d9ab Generalize default configs for PHP-FPM 2018-08-04 22:09:16 +02:00
b0eeb9b836 Generalize php.ini default configuration 2018-08-04 22:09:12 +02:00
c34416690c Merge pull request #336 from cytopia/github-templates
Update Github issue/pr templates
2018-08-03 10:37:08 +02:00
e49f508b04 Update Github issue/pr templates 2018-08-03 10:33:35 +02:00
0591e44775 Merge pull request #334 from cytopia/documentation-install-magento
Documentation: Install Magento
2018-08-01 00:29:01 +02:00
407a636913 Documentation: Install Magento 2018-08-01 00:12:26 +02:00
bc300ae594 Merge pull request #332 from cytopia/documentation-presta-shop
Documentation presta shop
2018-07-31 21:29:13 +02:00
c789261917 Backport tools to README 2018-07-31 21:27:12 +02:00
0d5eb38bc7 Documentation: Install PrestaShop 2018-07-31 20:21:56 +02:00
8b30fe9507 Merge pull request #330 from cytopia/documentation-wordpress-install
Improve Wordpress installation example
2018-07-31 19:51:24 +02:00
ecfbfe411d Merge pull request #329 from cytopia/documentation-subdomains
ref #324 How to properly add subdomains for the same project
2018-07-31 19:50:35 +02:00
2f4241a865 Improve Wordpress installation example 2018-07-31 19:49:28 +02:00
ab33b268fd ref #324 How to properly add subdomains for the same project 2018-07-31 19:21:27 +02:00
e0ff50089d Merge pull request #328 from cytopia/docs-examples-https
Documentation: more detailed examples
2018-07-30 09:41:54 +02:00
cbd2e62539 Documentation: more detailed examples 2018-07-30 09:32:40 +02:00
fa238275ac Merge pull request #327 from cytopia/fix-email-xss
Fix #326 XSS vulnerability in email display
2018-07-28 09:23:54 +02:00
fb376fe3fa Fix #326 XSS vulnerability in email display 2018-07-28 09:21:43 +02:00
896c2bc0c9 Merge pull request #325 from cytopia/update-available-tools
Update available tools
2018-07-27 19:55:07 +02:00
442a8b1696 Update available tools 2018-07-27 19:42:07 +02:00
d0f138a105 Merge pull request #322 from cytopia/fix-readme
Restore README images
2018-07-27 00:42:01 +02:00
f155123aa4 Restore README images 2018-07-27 00:41:31 +02:00
120bf377d8 Merge pull request #298 from cytopia/restructure-documentation
WIP: Restructuring of documentation
2018-07-26 14:04:28 +02:00
ee45e5e3a6 Fix broken link 2018-07-26 09:50:11 +02:00
dcbff8c44a Generalize links 2018-07-26 09:39:03 +02:00
ddc23aafd8 Fix default file extensions for linkcheck 2018-07-26 09:39:02 +02:00
f7ce65ab94 More sophisticated linkcheck 2018-07-26 09:39:02 +02:00
6ae32fe294 Fix #288 by documenting some edge cases 2018-07-26 09:39:01 +02:00
88ab56c617 Harden linkcheck 2018-07-26 09:39:00 +02:00
56538c10d8 Clean-up unused files 2018-07-26 09:39:00 +02:00
0514c38e54 Validate raw links 2018-07-26 09:38:59 +02:00
ed36d8b709 Change ext link icon from svg to png 2018-07-26 09:38:58 +02:00
2a312b4802 Replace url of static assets 2018-07-26 09:38:58 +02:00
a419efe9c4 External links 2018-07-26 09:38:57 +02:00
74f71a9f59 #244 Connect container to Devilbox network 2018-07-26 09:38:56 +02:00
775180af8b Move links into separate file 2018-07-26 09:38:56 +02:00
ce56d52dd1 #250 PHP Xdebug documentation 2018-07-26 09:38:55 +02:00
b48a7a393f Documentation: Xdebug on MacOS has several ways 2018-07-26 09:38:54 +02:00
e9094fe286 Documentation: Xdebug for Atom 2018-07-26 09:38:54 +02:00
75caa9baa6 Documentation: Add Xdebug section header 2018-07-26 09:38:53 +02:00
0145b26cda Documentation: Update FAQ 2018-07-26 09:38:52 +02:00
091bd57520 Documentation: Fix broken links 2018-07-26 09:38:52 +02:00
586fbd7a93 Documentation: External databases 2018-07-26 09:38:51 +02:00
1f343ce404 Documentation: SSH and SSH tunnelling 2018-07-26 09:38:50 +02:00
dea471b766 Use included links 2018-07-26 09:38:49 +02:00
1c4aa9f1b0 SSH into docker toolbox 2018-07-26 09:38:49 +02:00
cfc80f6ab2 Remove WIP files 2018-07-26 09:38:48 +02:00
954a37211c Documentation: replace external links 2018-07-26 09:38:47 +02:00
bca4cf6a75 Documentation: replace external links 2018-07-26 09:38:47 +02:00
3655988315 Reorganize links 2018-07-26 09:38:46 +02:00
b9c52925f9 Use absolute paths 2018-07-26 09:38:45 +02:00
04e9854470 Restructuring images 2018-07-26 09:38:45 +02:00
04250f2fc3 Shared Devilbox server in LAN 2018-07-26 09:38:44 +02:00
1725de8c48 Add documentation version 2018-07-26 09:38:43 +02:00
5d6a8914d6 Add documentation to connect to external hosts, services or container 2018-07-26 09:38:42 +02:00
b8a571065d Rename custom CNAME creation 2018-07-26 09:38:42 +02:00
bd7c5bd983 #300 Shopware installation guide 2018-07-26 09:38:41 +02:00
88132a0b59 Add more documentation 2018-07-26 09:38:40 +02:00
e56fb56f7c Adjust menu CSS 2018-07-26 09:38:40 +02:00
cd8359332d Add more external links 2018-07-26 09:38:39 +02:00
cfd02321cc Extending support section 2018-07-26 09:38:38 +02:00
1228f5d97a Add example to setup Typo3 2018-07-26 09:38:38 +02:00
af80d6a790 Capitalize headline 2018-07-26 09:38:37 +02:00
ca22a892b1 Move section below correct headline 2018-07-26 09:38:36 +02:00
3c0062b273 Fix external image url 2018-07-26 09:38:36 +02:00
acab8b346e Documentation restructuring 2018-07-26 09:38:35 +02:00
0121371048 Fix external links 2018-07-26 09:38:33 +02:00
2662566677 Merge pull request #319 from cytopia/fix-httpd-silent-mode
Fix #318 vhost creation in non-debug mode
2018-07-25 23:10:02 +02:00
900c7ff4ed Fix #318 vhost creation in non-debug mode 2018-07-25 23:00:42 +02:00
109413cfa8 Merge pull request #309 from cytopia/fix-win-autostart
Fix #242 - Prevent auto-starts on Windows
2018-07-17 08:47:21 +02:00
eafcc2dffc Revert bind autostart 2018-07-16 08:51:11 +02:00
c2dae8ebc2 Fix #242 - Prevent auto-starts on Windows 2018-07-12 22:58:41 +02:00
6f0ca30ad9 Merge pull request #308 from cytopia/github-issue-template
Fix bug report issue type
2018-07-08 12:46:14 +02:00
f5f20cfae9 Fix bug report issue type 2018-07-08 12:45:36 +02:00
c8fb0116df Merge pull request #306 from cytopia/github-issue-template
Iconize issue categories
2018-07-06 17:14:09 +02:00
3b95dcfb48 Split issues into more categories 2018-07-06 17:13:44 +02:00
3b7f9a313d Iconize issue categories 2018-07-06 17:05:40 +02:00
343dc170bb Merge pull request #305 from cytopia/github-issue-template
New issue templates
2018-07-06 16:22:54 +02:00
b061f1c692 New issue templates 2018-07-06 16:22:01 +02:00
47b3491f3a Redis-custom-pass 2018-07-05 23:50:24 +02:00
51298f0662 Merge pull request #289 from kusl/master
add z to everything
2018-06-29 08:57:03 +02:00
0a2fe975b7 Merge branch 'master' into master 2018-06-28 11:29:19 -04:00
3ee0649275 Merge pull request #296 from science695/root-ca-doc
Documentation: Adding in guide link on putting the SSL Root CA into your OS' security keychain
2018-06-27 08:58:25 +02:00
2ee7b6c95e Adding in documentation guide on putting the SSL Root CA into your OS' security keychain 2018-06-26 10:15:27 -04:00
3b1321908e Merge pull request #295 from cytopia/upgrade-httpd-container
Use release httpd container (index: index.php index.html index.htm)
2018-06-23 23:15:55 +02:00
db25322daf Use tagged httpd versions 2018-06-23 20:48:52 +02:00
1cc9eb8a9c Use release httpd container 2018-06-23 17:45:32 +02:00
bb5c78d025 Merge pull request #294 from cytopia/fix-www-data-dir
Ensure data dir is available
2018-06-23 17:44:10 +02:00
0225d4aea8 Ensure data dir is available 2018-06-23 17:43:29 +02:00
39f7dc17b0 add z to everything
fixes #255

I tested on fedora 28
looks good to me
please test this on a non-SE Linux machine
it should not have any effect there
2018-06-07 20:31:29 -04:00
b3e4e6efdb Merge pull request #282 from cytopia/underscore-domains
Fix #224
2018-06-07 07:59:06 +02:00
c9c63743c5 Merge branch 'master' into underscore-domains
* master:
  Retry install on network outage
  Minor typo fix
  Minor typo fix
  Clean up travis-ci file
  Check documentation via travis
  Fix warnings
  Fix overlay scroll
  Clean out sphinx errors
  Fix table
2018-06-05 16:44:13 +02:00
b8b73fd6d9 Merge pull request #285 from acafourek/master
Minor typo fix in docs
2018-06-05 16:41:19 +02:00
76d136afac Merge pull request #284 from cytopia/documentation-fixes2
Retry install on network outage
2018-06-05 16:40:37 +02:00
9ac4a768d4 Retry install on network outage 2018-06-05 14:15:54 +02:00
3344f19b11 Merge pull request #1 from acafourek/patch-2
Minor typo fix
2018-06-04 22:15:36 -04:00
aa274a59d0 Merge pull request #2 from acafourek/patch-1
Minor typo fix
2018-06-04 22:15:31 -04:00
195ce98efc Minor typo fix 2018-06-04 22:14:24 -04:00
7cb99c62ef Minor typo fix 2018-06-04 22:13:36 -04:00
cbdc036422 Merge pull request #283 from cytopia/documentation-fixes
Documentation cleanup
2018-06-04 18:24:56 +02:00
a06e7d5ea1 Clean up travis-ci file 2018-06-04 10:30:13 +02:00
8f71c56a51 Check documentation via travis 2018-06-03 21:54:38 +02:00
5cf7a45638 Fix warnings 2018-06-03 20:17:21 +02:00
3ffcaf133c Fix overlay scroll 2018-06-03 20:05:33 +02:00
65497cb9d8 Clean out sphinx errors 2018-06-03 19:16:22 +02:00
b7b215b6f1 Fix table 2018-06-03 14:59:16 +02:00
c4fdf564b2 Fix #224 underscore domains for Apache 2018-06-03 14:03:56 +02:00
cd6319a102 Merge pull request #276 from cytopia/enable-disable-php-modules
#270 #263 Enable/Disable PHP Modules
2018-05-22 01:27:52 +02:00
5835f9d2ad Merge pull request #277 from cytopia/doc-codeignitor
Documentation: Setup CodeIgniter
2018-05-21 10:53:11 +02:00
ad532b3d98 Documentation: Setup CodeIgniter 2018-05-21 10:52:37 +02:00
a53d1ee0d6 #270 #263 Enable/Disable PHP Modules 2018-05-21 10:23:55 +02:00
1d9879d966 Merge pull request #272 from cytopia/update-docker
Add PHP 7.3 to update-docker script
2018-05-19 12:51:14 +02:00
5a518bac95 Add PHP 7.3 to update-docker script 2018-05-18 18:00:49 +02:00
2fc71eb8e3 Merge pull request #269 from cytopia/trust-ca-internally
Fix #259 Add CA as trusted entity to PHP container
2018-05-17 22:11:41 +02:00
55f8ab5e22 Merge pull request #268 from cytopia/photoncms
Documentation: how to install Photon CMS
2018-05-16 08:35:19 +02:00
dd92609cf8 Update Photon CMS documentation 2018-05-16 08:34:22 +02:00
9a561fe4ba Fix #259 Add CA as trusted entity to PHP container 2018-05-15 08:38:01 +02:00
1309037643 How to install Photon CMS 2018-05-15 00:30:00 +02:00
21e78ee0b9 Merge pull request #267 from cytopia/php-7.3
Adding: PHP-FPM 7.3
2018-05-14 23:31:09 +02:00
93024c39f1 Adding: PHP-FPM 7.3 2018-05-13 17:21:32 +02:00
ea0ec54aad Merge pull request #264 from cytopia/php-5.3
PHP-FPM 5.3
2018-05-12 20:40:06 +02:00
61d58dcf56 Fix up build jobs 2018-05-12 19:58:29 +02:00
87edcfdcdc Add PHP 5.3 support 2018-05-12 16:03:43 +02:00
58952f884a Bump version 2018-05-12 16:02:02 +02:00
6e7a622c88 Fix PHP syntax for PHP 5.3 2018-05-12 16:01:31 +02:00
8fa0e2a427 Merge pull request #257 from cytopia/doc-fix-toc
Fix ToC
2018-05-08 09:27:03 +02:00
9c1fc63bb7 Fix ToC 2018-05-08 09:26:24 +02:00
30a3246591 Merge pull request #256 from cytopia/doc-auto-dns
Fix #225 systemd-resolvd documentation
2018-05-08 09:07:00 +02:00
7ae2a75e59 Fix #225 systemd-resolvd documentation 2018-05-08 09:06:10 +02:00
f68621fd43 Merge pull request #253 from cytopia/documentation-updates
Documentation updates
2018-05-07 09:09:43 +02:00
8b31862b02 Clarify that all frameworks are supported 2018-05-07 09:09:06 +02:00
a5c980fb99 Extend feature section with SSL certificates 2018-05-07 09:08:37 +02:00
c4f099d9f3 Merge pull request #251 from echosa/patch-1
Correct typo in docs.
2018-05-07 08:46:01 +02:00
d2cffdfebe Merge pull request #252 from cytopia/fix-tools
Fix tools table
2018-05-07 01:02:47 +02:00
4915351421 Fix tools table 2018-05-07 01:02:20 +02:00
f0f13bb360 Correct typo in docs. 2018-05-06 17:24:08 -05:00
eecc791540 Merge pull request #239 from cytopia/https
Add HTTPS support
2018-05-06 11:10:37 +02:00
9f868c7e04 Merge pull request #249 from Remo/patch-1
add ssh to available tools
2018-05-05 23:03:11 +02:00
5c4c856b84 add ssh to available tools 2018-05-05 18:15:02 +02:00
04ddd07312 Merge pull request #247 from cytopia/variable-naming
Fix #242 variable naming
2018-05-05 17:13:08 +02:00
7fcd82be2a Fix #242 variable naming 2018-05-05 13:23:46 +02:00
9e469cdc72 Documentation: How to enable SSL on Firefox 2018-05-05 12:57:11 +02:00
ea08824172 Documentation: link HTTPS documentation 2018-05-05 12:56:36 +02:00
535a398bff Bump release version 2018-05-05 12:35:07 +02:00
02464bc6d5 README: HTTPS support via auto-generated SSL certificates 2018-05-05 12:35:02 +02:00
5a63ceb105 Documentation: SSL Certificates 2018-05-05 12:34:58 +02:00
44b4aa527a Lock to latest httpd server version 2018-05-05 12:34:53 +02:00
2f73e97f64 Update vhost-gen templates 2018-05-05 12:34:49 +02:00
b03a9a1ead Show SSL port in intranet page 2018-05-05 12:34:45 +02:00
05af938cb8 Make intranet SSL certificate CN configurable 2018-05-05 12:34:40 +02:00
42383489bd Update vhost-gen templates 2018-05-05 12:34:36 +02:00
91ba18f3bd Temporarily adding release tag for httpd container 2018-05-05 12:34:32 +02:00
0765c02aa5 Adjust env settings to match new HTTPD container 2018-05-05 12:34:28 +02:00
84c1729a81 Add HTTPS port 2018-05-05 12:34:23 +02:00
fdce2ebd8e Add Certificate Authority mount directory 2018-05-05 12:34:19 +02:00
d6cabd2e09 Ignore Certificate Authority from being added to git 2018-05-05 12:34:15 +02:00
c7b777dfb2 Send AJAX calls on http or https 2018-05-05 12:34:11 +02:00
6453954565 Merge pull request #243 from ortic/disable-mysql-general-log
disable mysql query log by default
2018-05-04 08:55:02 +02:00
3248c81c62 set default value for general log in documentation 2018-05-04 08:53:46 +02:00
c8c6f914c2 disable mysql query log 2018-05-03 20:16:02 +02:00
139dc7cec7 Merge pull request #237 from cytopia/documentation-dns
Release v0.13.1 (Communicate with external hosts)
2018-04-29 11:41:36 +02:00
5c57f8a1a7 Fix DNS issues with CNAME's 2018-04-28 16:28:13 +02:00
e7206f2e30 Merge pull request #238 from cytopia/fix-bind-version
Fix bind version in intranet
2018-04-28 16:27:36 +02:00
babefe4160 Fix bind version in intranet 2018-04-28 15:21:09 +02:00
8b50316787 Bump version 2018-04-28 15:13:37 +02:00
494cb061c3 Documentation: Communicate with external hosts 2018-04-28 12:17:07 +02:00
3aacd81d26 Be able to communicate with external hosts 2018-04-28 12:15:41 +02:00
e5ec9c5e44 Merge pull request #232 from cytopia/DVL-014-doc-env
Documentation for how to handle multiple env files
2018-04-25 01:03:14 +02:00
14d759d18b Merge pull request #231 from cytopia/DVL-014
Add documentation for #222 #229: Custom docker images
2018-04-25 01:02:35 +02:00
18a07a15f7 Fixes #145: Documentation for how to handle multiple env files 2018-04-25 00:41:13 +02:00
f0834dc9c5 Add documentation for #222 #229: Custom docker images 2018-04-25 00:24:47 +02:00
ba233165ab Merge pull request #229 from pedrosanta/compose-override-gitignore
Ignore 'docker-compose.override.yml'
2018-04-24 20:22:34 +02:00
79d4618345 Add docker compose override file to .gitignore
As documented on https://docs.docker.com/compose/extends it's possible
to use a docker-compose.override.yml file to override/extend
configurations of a docker-compose.yml. As such, this is an excellent
way for one to perform own/local tweaks and overrides without
changing/impacting project files. This adds a line for it on .gitignore.
2018-04-19 12:47:28 +01:00
8c121c5457 Merge pull request #226 from chrizz1001/patch-1
Typo in update doc
2018-04-17 11:27:24 +02:00
7bb469f3c7 Typo in update doc
# Ensure containers are stopped
   host> docker-compose ps
2018-04-17 08:51:13 +02:00
96041807a0 Merge pull request #203 from cytopia/new-php-container
REL-0.13: New PHP Container
2018-04-15 10:43:38 +02:00
068545a2a9 Intranet: Update phpMyAdmin to 4.8 2018-04-14 11:32:33 +02:00
e59bd1098f Intranet: Update Adminer to 4.6.2 2018-04-14 10:57:31 +02:00
88eb3ae68d Intranet: show new PHP mounts 2018-04-14 10:54:09 +02:00
b75e04dcab Documentation: available container 2018-04-14 10:51:53 +02:00
fbb475123f Add more container versions 2018-04-14 10:50:55 +02:00
3cf7321d3b Fix contributors link 2018-04-14 10:46:18 +02:00
7615dfa443 Bump version 2018-04-14 10:46:00 +02:00
2fbdd56a0d Documentation: remove build files 2018-04-14 10:17:59 +02:00
5eee20877a Documentation: Finish feature section 2018-04-14 10:17:58 +02:00
76a825b887 Documentation: Update legacy docs 2018-04-14 10:17:55 +02:00
2b1dc0efc2 Documentation: Xdebug for PHPStorm 2018-04-14 10:17:53 +02:00
a23b23b774 Documentation: Xdebug 2018-04-14 10:17:53 +02:00
8689bc993e Documentation: awesome-ci 2018-04-14 10:17:52 +02:00
9b3e3aa738 Documentation: Xdebug - first draft 2018-04-14 10:17:51 +02:00
e713c72bfa Fix loading times to find available services 2018-04-14 10:17:50 +02:00
b5c3b13dce Make PHP-FPM follow log behaviour from .env 2018-04-14 10:17:50 +02:00
0570e2cdf2 Remove file from git 2018-04-14 10:17:49 +02:00
17fd7108f1 Make PHP-FPM configurable 2018-04-14 10:17:48 +02:00
7b4b2370ff Documentation: #217 add best-practice hostnames for php config 2018-04-14 10:17:47 +02:00
271313c025 Documentation: custom env variables 2018-04-14 10:17:46 +02:00
e09ff53d58 Documentation: best-practice 2018-04-14 10:17:45 +02:00
d6a58ff1ac Documentation: apache.conf 2018-04-14 10:17:45 +02:00
474b8b2121 Documentation: nginx.conf 2018-04-14 10:17:44 +02:00
04812a5131 Documentation: typo fix 2018-04-14 10:17:43 +02:00
86b4247b81 Documentation: #212 MySQL configuration files on Docker Toolbox 2018-04-14 10:17:42 +02:00
63fa5e6811 Add Documentation build badge 2018-04-14 10:17:42 +02:00
d7a2bcb266 Documentation: config files 2018-04-14 10:17:41 +02:00
f5cc9bcee6 Documentation: bashrc.sh 2018-04-14 10:17:40 +02:00
618e485460 Documentation: Configuration files 2018-04-14 10:17:39 +02:00
6424e6e426 Documentation: Backup and Restore MongoDB 2018-04-14 10:17:39 +02:00
cc1ce40858 Documentation: Backup and Restore PostgreSQL 2018-04-14 10:17:38 +02:00
474565a66d Documentation: Backup and Restore PostgreSQL 2018-04-14 10:17:37 +02:00
a6348344f1 Documentation: Backup and Restore MySQL 2018-04-14 10:17:36 +02:00
4012bfd2cf Documentation: hacking 2018-04-14 10:17:36 +02:00
3d4b3e059d Documentation: Backup and Restore MySQL 2018-04-14 10:17:35 +02:00
2a4316079a Documentation: various 2018-04-14 10:17:34 +02:00
b445e9f4e2 Documentation: FAQ 2018-04-14 10:17:33 +02:00
50904504cf Documentation: Troubleshooting 2018-04-14 10:17:32 +02:00
4f8e5ee948 Documentation: artwork 2018-04-14 10:17:31 +02:00
7f9771081a Documentation: Devilbox intranet 2018-04-14 10:17:30 +02:00
64b08f61bf Documentation: Email catch-all 2018-04-14 10:17:30 +02:00
794f037727 Documentation: change images 2018-04-14 10:17:29 +02:00
4502497371 Documentation: Docker logs 2018-04-14 10:17:28 +02:00
7d184a5e55 Documentation: php.ini 2018-04-14 10:17:27 +02:00
08ebab728c Documentation: php.ini 2018-04-14 10:17:27 +02:00
d9bb7419cc Documentation: vhost-gen 2018-04-14 10:17:26 +02:00
099751a8b9 Documentation: Auto-DNS 2018-04-14 10:17:25 +02:00
7d5e4feada Documentation: DNS 2018-04-14 10:17:24 +02:00
33082a98ed Documentation: Auto-DNS 2018-04-14 10:17:24 +02:00
71899930aa Documentation: Examples 2018-04-14 10:17:23 +02:00
f6ac5fc776 Cleanup 2018-04-14 10:17:22 +02:00
a621d4b6f7 documentation: work inside the PHP container 2018-04-14 10:17:21 +02:00
6f79f007de Change container versions 2018-04-14 10:17:21 +02:00
08bc17d186 Warning about use of localhost as TLD 2018-04-14 10:17:20 +02:00
a562c85dac Finalize subdomains 2018-04-14 10:17:19 +02:00
ed2d12dbba Adding vhost-gen templates 2018-04-14 10:17:18 +02:00
2c69626a1d Stashing changes 2018-04-14 10:17:17 +02:00
ea7b2c9499 Minor wording fixes 2018-04-14 10:17:16 +02:00
5f61d9d8e6 Add available tools 2018-04-14 10:17:16 +02:00
83a3829206 How to enter the PHP container 2018-04-14 10:17:15 +02:00
5fec8a7e09 Do not add sphinx builds to git 2018-04-14 10:17:14 +02:00
8bd7dd6157 Finalize env-file documentation 2018-04-14 10:17:13 +02:00
68636deeaf Extend env file documentation 2018-04-14 10:17:13 +02:00
b1f0e12111 Extend env file documentation 2018-04-14 10:17:12 +02:00
c587e97eba Extend env file documentation 2018-04-14 10:17:11 +02:00
9b41a2468c Info about .env file 2018-04-14 10:17:10 +02:00
dc641b9298 Add files to ToC 2018-04-14 10:17:10 +02:00
75236067e5 Fix typos 2018-04-14 10:17:09 +02:00
d56a7db02a Update about section 2018-04-14 10:17:08 +02:00
7de5103fcc Address permission problem 2018-04-14 10:17:07 +02:00
ca002781c2 Add stale files to index 2018-04-14 10:17:06 +02:00
107f689595 Finalize getting-started-guide 2018-04-14 10:17:06 +02:00
5a29be3f92 Extend documentation 2018-04-14 10:17:04 +02:00
2180e8a287 Extend getting started guide 2018-04-14 10:17:03 +02:00
41d22a804d getting started 2018-04-14 10:17:03 +02:00
b5ced99621 Getting started 2018-04-14 10:17:02 +02:00
fc791c497d Setup menu 2018-04-14 10:17:01 +02:00
76936c9afd Add theme options 2018-04-14 10:17:00 +02:00
0f28572ef1 Add imports 2018-04-14 10:16:59 +02:00
a5f7e4885d Add markdown support 2018-04-14 10:16:58 +02:00
10459db183 Update index 2018-04-14 10:16:58 +02:00
77950f77bc conf.py theme 2018-04-14 10:16:57 +02:00
f0192cce73 Build in RST format 2018-04-14 10:16:56 +02:00
e215dd610e Fix extensions 2018-04-14 10:16:55 +02:00
e32fad5185 Fix build error 2018-04-14 10:16:54 +02:00
43235e69ba Fix build error 2018-04-14 10:16:54 +02:00
6fd9ea1b72 Add quickstart 2018-04-14 10:16:53 +02:00
9110dd0f38 Installation subdir 2018-04-14 10:16:52 +02:00
7aecaa22ba Adding index 2018-04-14 10:16:51 +02:00
5c0f778666 Adding configuration file 2018-04-14 10:16:50 +02:00
e1e60c736e Adjust date 2018-04-14 10:16:50 +02:00
e73604dfb5 Fixing #206: change docroot to subdir 2018-04-14 10:16:49 +02:00
5a23138268 Update update-docker.sh 2018-04-14 10:16:48 +02:00
5c89cd2fe4 Update travis tests 2018-04-14 10:16:47 +02:00
ab7e3b7279 Integrate new PHP container 2018-04-14 10:16:46 +02:00
dcad1b2387 Add new PHP container namespace 2018-04-14 10:16:45 +02:00
abb7b8dd5d Merge pull request #204 from kerrizor/patch-1
typo
2018-03-07 21:59:50 +01:00
2465e29628 typo 2018-03-06 16:15:58 -08:00
51e951ef3b Merge pull request #200 from codetriage-readme-bot/codetriage-badge
Add CodeTriage badge to cytopia/devilbox
2018-03-04 13:34:40 +01:00
7f1fc72e3e Merge pull request #201 from pbearne/master
Added shell.bat to box access on windows
2018-03-01 14:55:32 +01:00
d9fe19a8d7 Added window shell.bat instructions 2018-03-01 08:06:00 -05:00
cc73cefd3f Create shell.bat
shell for windows
2018-03-01 08:02:02 -05:00
f3ce95b6b8 Merge pull request #199 from xmarkclx/patch-2
Add Mac Instructions on Making Auto-DNS Work
2018-02-27 22:06:18 +01:00
7b190170c5 Add CodeTriage badge to cytopia/devilbox
Adds a badge showing the number of people helping this repo on CodeTriage.

[![Open Source Helpers](https://www.codetriage.com/cytopia/devilbox/badges/users.svg)](https://www.codetriage.com/cytopia/devilbox)

## What is CodeTriage?

CodeTriage is an Open Source app that is designed to make contributing to Open Source projects easier. It works by sending subscribers a few open issues in their inbox. If subscribers get busy, there is an algorithm that backs off issue load so they do not get overwhelmed

[Read more about the CodeTriage project](https://www.codetriage.com/what).

## Why am I getting this PR?

Your project was picked by the human, @schneems. They selected it from the projects submitted to https://www.codetriage.com and hand edited the PR. How did your project get added to [CodeTriage](https://www.codetriage.com/what)? Roughly about 1 year ago, [cytopia](https://github.com/cytopia) added this project to CodeTriage in order to start contributing.

## What does adding a badge accomplish?

Adding a badge invites people to help contribute to your project. It also lets developers know that others are invested in the longterm success and maintainability of the project.

You can see an example of a CodeTriage badge on these popular OSS READMEs:

- [![Email clients like GMAIL do not render SVG images](https://www.codetriage.com/rails/rails/badges/users.svg)](https://www.codetriage.com/rails/rails) https://github.com/rails/rails
- [![Email clients like GMAIL do not render SVG images](https://www.codetriage.com/crystal-lang/crystal/badges/users.svg)](https://www.codetriage.com/crystal-lang/crystal) https://github.com/crystal-lang/crystal

## Have a question or comment?

While I am a bot, this PR was manually reviewed and monitored by a human - @schneems. My job is writing commit messages and handling PR logistics.

If you have any questions, you can reply back to this PR and they will be answered by @schneems. If you do not want a badge right now, no worries, close the PR, you will not hear from me again.

Thanks for making your project Open Source! Any feedback is greatly appreciated.
2018-02-26 14:08:06 -06:00
c7071e527e Update Configure.md 2018-02-26 17:37:56 +08:00
34e946e50f Merge pull request #185 from cytopia/release-0-12-1
Release v0.12.1
2018-01-31 17:14:08 +01:00
2df763d147 Merge pull request #184 from irhen/fixing-typos
Update Configure.md
2018-01-30 19:29:23 +01:00
e26bae0d83 Bump date and version 2018-01-30 15:36:04 +01:00
6dcde6b1b7 Have Bind bound to a specific tag to make sure it is stable 2018-01-30 15:30:59 +01:00
8726acfb5a Update Configure.md
fix some typos
2018-01-30 17:21:39 +03:00
996874daa1 Merge pull request #181 from mwmllr/DVL-013
DVL-013 removing invalid option from quick start docker-composer remo…
2018-01-28 17:37:26 +01:00
1e001b616a DVL-013 removing invalid option from quick start docker-composer removal in the docs 2018-01-25 21:21:28 +01:00
865860affe Merge pull request #172 from noplanman/patch-1
Copy-Paste fix, typos
2017-12-30 00:06:47 +01:00
2c4fd49478 Copy-Paste fix, typos 2017-12-29 18:53:31 +00:00
909d72dbbe Merge pull request #164 from Cipa/master
body might be in a different spot
2017-12-18 07:52:24 +01:00
382d7001e1 email body detection improvments 2017-12-08 07:17:07 -08:00
514fab16e3 Merge pull request #165 from cytopia/DVL-013-doc-fixes
Dvl 013 doc fixes
2017-12-07 11:47:26 +01:00
d1bbd5d92b DVL-013 Link Date statement in PR template 2017-12-07 09:35:43 +01:00
3f5555ee19 DVL-013 Fix typo in PR template 2017-12-07 09:34:04 +01:00
38460eaa1a DVL-013 Improve docs: work inside the container 2017-12-07 09:32:09 +01:00
033ed60148 DVL-013 #163 Extend Auto-DNS documentation 2017-12-07 09:15:52 +01:00
e0e37bb64d DVL-013 Adjust Pull Request template 2017-12-07 08:42:07 +01:00
1f8390c8a6 DVL-013 Bump date 2017-12-07 08:41:49 +01:00
00c43bf8b7 DVL-013 Show Auto-DNS in documentation ToC 2017-12-07 08:41:33 +01:00
708962647c body be in a diffrent spot
When sending email with codeigniter the body is inside $structure->parts.

I should look into what mail objects variants are out there.
2017-12-06 11:17:05 -08:00
654b6375fb Merge pull request #162 from Cipa/master
mail improvments
2017-12-06 08:22:58 +01:00
f1ed392b94 mail improvments
- html email by default
- Raw source button
- extra from column
2017-12-05 20:04:33 -08:00
2381b5b5fb Merge pull request #156 from alexmanno/correct_typo_in_readme
Correct typo on README.md
2017-11-24 21:41:12 +01:00
4107481747 Correct typo on README.md 2017-11-24 21:28:51 +01:00
3c1cf64b15 Merge pull request #153 from cytopia/DVL-013-http-port
DVL-013 Fix #151 Use correct Httpd port in intranet
2017-11-21 09:02:42 +01:00
5a0b275610 DVL-013 Fix #151 Use correct Httpd port in intranet 2017-11-21 09:01:15 +01:00
930bb1c7fc Merge pull request #141 from cytopia/DVL-013-memcd-fixes
DVL-013 Handle false values retrieved from Memcached
2017-11-07 00:43:32 +01:00
776ec5d517 DVL-013 Handle false values retrieved from Memcached 2017-11-05 19:00:34 +01:00
959aa29f92 Merge pull request #140 from cytopia/DVL-013-intranet-fixes
Dvl 013 intranet fixes
2017-11-04 17:40:40 +01:00
e254d01a65 DVL-013 Fix error handling in logger 2017-11-04 13:42:41 +01:00
aaaab931b7 DVL-013 Sort Feature list 2017-11-04 13:42:15 +01:00
e79eb87cbb Merge pull request #137 from cytopia/DVL-013
WIP: DVL-013 Logos and layout
2017-10-16 17:56:22 +02:00
b42e3eb964 DVL-013 Remove battery logos 2017-10-16 17:53:33 +02:00
23b6ac07be DVL-013 Update dash graphics 2017-10-16 17:47:27 +02:00
051d723d13 DVL-013 Remove unneeded images 2017-10-16 17:12:32 +02:00
ab3df0c5dc DVL-013 Shorten README 2017-10-16 13:56:49 +02:00
aac3da3111 DVL-013 Fix markdown 2017-10-16 11:33:43 +02:00
0f1de08356 DVL-013 Logos and layout 2017-10-16 09:17:27 +02:00
c04fa23578 Merge pull request #130 from cytopia/REL-0.12
Rel 0.12
2017-10-10 15:45:38 +02:00
062aa18730 REL-0.12 Fix bold headline 2017-10-10 09:13:12 +02:00
1fa6bc7008 REL-0.12 Bump version for upcoming release 2017-10-10 08:56:10 +02:00
5fce8da961 REL-0.12 Revert Xdebug port back to 9000 2017-10-08 12:27:31 +02:00
bb2288a461 REL-0.12 Update new versions of available Docker container 2017-10-08 12:17:36 +02:00
f454a032c9 REL-0.12 Doc: How to setup Joomla 2017-10-03 12:45:37 +02:00
cc0c947d6b REL-0.12 Remove fixed note about uid/gid 2017-10-03 11:58:42 +02:00
c87201db13 REL-0.12 Bump version 2017-10-03 11:50:09 +02:00
5bd184c609 REL-0.12 Doc: How to customize the web server configuration 2017-10-03 11:49:16 +02:00
6f00608fba REL-0.12 Doc: #128 How to add custom environment variables 2017-10-03 11:43:57 +02:00
352a8d3b40 REL-0.12 Doc: How to customize per project vhost 2017-10-03 11:38:39 +02:00
2b5336c342 REL-0.12 Doc: How to change the htdocs directory name 2017-10-03 11:28:42 +02:00
54bddc820a REL-0.12 Doc: How to disable the Intranet 2017-10-03 11:07:18 +02:00
8ad5b4ef61 REL-0.12 Default to listen on all Interfaces 2017-10-03 10:32:23 +02:00
5d11a09866 REL-0.12 Fix version getter 2017-10-02 13:00:48 +02:00
3990d2de71 REL-0.12 Speed up frontpage by using Ajax requests 2017-10-02 12:42:29 +02:00
20383fee48 REL-0.12 Update update-docker.sh to use new httpd namespace 2017-10-01 19:16:09 +02:00
fb193aba20 DVL-012 Switch httpd Docker namespace 2017-10-01 18:59:11 +02:00
f5b03f22b7 REL-0.12 Make document root dir dynamic 2017-09-28 16:31:33 +02:00
0cb54d34ef REL-0.12 Remove quotes from variable values 2017-09-28 16:30:51 +02:00
32add6d2a0 REL-0.12 Use custom doc root directory in Intranet 2017-09-28 16:30:00 +02:00
bf0bc75b90 REL-0.12 Evade cross domain requests via POST 2017-09-27 14:42:42 +02:00
d8e60644e8 REL-0.12 Remove deprecates from docker-compose.yml 2017-09-26 19:56:28 +02:00
4ad3596daa REL-0.12 #128 Source environment variables 2017-09-26 19:53:31 +02:00
9752af1363 REL-0.12 Add directories to globally configure web servers 2017-09-26 19:39:38 +02:00
769b34c3e6 REL-0.12 Set correct httpd status page 2017-09-26 17:44:31 +02:00
69bb14288d REL-0.12 Enable devilbox intranet by default 2017-09-26 17:43:41 +02:00
c58b1e3db3 REL-0.12 Add option to disable devilbox Intranet 2017-09-26 16:58:24 +02:00
1ad6de7e4c REL-0.12 Attach new nginx Docker container 2017-09-26 16:51:49 +02:00
cac8a17bb6 Merge pull request #124 from cytopia/DVL-012-adminer
DVL-012 Fix #97: Open Adminer in new window to overcome UI glitches
2017-09-10 11:54:40 +02:00
4bbea8f134 Merge pull request #127 from cytopia/DVL-012-password-protection
DVL-012 Password protect the devilbox intranet
2017-09-10 11:54:16 +02:00
19908307d6 DVL-012 Add documentation for how to password protect 2017-09-09 14:16:04 +02:00
63e1acc02a DVL-012 #121 Password protect the devilbox intranet 2017-09-09 10:40:07 +02:00
dd34e4780e DVL-012 Fix #97: Open Adminer in new window to overcome UI glitches 2017-09-09 08:29:22 +02:00
0c4290b0c4 Merge pull request #115 from cytopia/DVL-012-customise-bash
DVL-012 be able to customize bash config files
2017-08-18 20:23:26 +02:00
87b7219901 DVL-012 Documentation: Customize bash and vim 2017-08-18 09:14:33 +02:00
bbfd938001 Merge pull request #114 from cytopia/DVL-012-requirements
DVL-012 Name correct required Docker version in documentation
2017-08-18 08:40:40 +02:00
e8975ec92c Merge pull request #113 from cytopia/DVL-012-fix-dns-forwarder
DVL-012 #112 Fixes wrong docker-compose var for BIND
2017-08-18 08:39:55 +02:00
bb0a15f4e6 DVL-012 be able to customize bash config files 2017-08-17 21:20:41 +02:00
8f75590e8d DVL-012 Name correct required Docker version in documentation 2017-08-17 08:37:53 +02:00
4cabfeccec DVL-012 #112 Fixes wrong docker-compose var for BIND 2017-08-17 08:30:18 +02:00
5c22c045a1 Merge pull request #111 from cytopia/DVL-012-awesome-ci-fix
DVL-012 Fix ToC on README.md
2017-08-16 23:29:13 +02:00
f5792f1bad DVL-012 Fix ToC on README.md 2017-08-16 20:23:59 +02:00
4181805ff2 Merge pull request #110 from cytopia/DVL-012-awesome-ci
DVL-012 Add documentation for awesome-ci
2017-08-16 20:20:24 +02:00
b6be233241 DVL-012 Fix ToC 2017-08-16 09:21:48 +02:00
b2ebe2df0a DVL-012 Add documentation for awesome-ci 2017-08-16 09:16:58 +02:00
77fb8d50d1 Merge pull request #108 from cytopia/DVL-012-custom-php-modules
DVL-012 #107 Allow to load custom PHP modules
2017-08-16 08:12:03 +02:00
b7fd5a01e1 Merge pull request #100 from cytopia/DVL-012
WIP: DVL-012 Fix #97 Devilbox UI footer overlaps embedded tools
2017-08-13 14:02:11 +02:00
bcfa689fab DVL-012 Documentation: Add ToC for FAQ section 2017-08-13 13:56:37 +02:00
e2c724ce23 DVL-012 Documentation: How to load custom PHP modules 2017-08-13 13:36:24 +02:00
d6bf969212 DVL-012 #107 Allow to load custom PHP modules 2017-08-12 11:05:39 +02:00
9545113e43 DVL-012 Fix #97 Devilbox UI footer overlaps embedded tools 2017-07-22 11:43:07 +02:00
817a942bba Merge pull request #98 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2017-07-22 10:01:41 +02:00
def3636196 Add Gitter badge 2017-07-21 08:49:17 +00:00
1b143eb222 Merge pull request #95 from cytopia/DVL-012
DVL-012 Stop all container during travis checks
2017-07-09 14:33:53 +02:00
2faf541c93 DVL-012 Stop all container during travis checks 2017-07-08 14:16:55 +02:00
358d3e6ca5 Merge pull request #94 from cytopia/DVL-012
DVL-012 #92 Adds documentation for changing data directories
2017-07-05 08:18:24 +02:00
dd750f88ad DVL-012 Add datadir change info in env-example 2017-07-05 08:12:07 +02:00
5a9fce85a2 DVL-012 #92 Adds documentation for changing data directories 2017-07-04 09:00:29 +02:00
df915f8ebb Merge pull request #91 from cytopia/DVL-012
DVL-012 Fix contradictory TLD_SUFFIX documentation to default to *.loc
2017-07-03 20:14:17 +02:00
d9a0083edd Merge pull request #93 from kodemaan/patch-1
Update README.md
2017-07-03 20:00:57 +02:00
742f7decee Update README.md 2017-07-03 11:19:10 -04:00
6a9d248c4a DVL-012 Fix contradictory TLD_SUFFIX documentation to default to *.loc 2017-07-03 08:53:48 +02:00
d4d3e1223d Merge pull request #89 from cytopia/DVL-012
DVL-012 Adding PerconaDB
2017-07-02 10:54:40 +02:00
e560fe5712 DVL-012 Add more info about supported frameworks 2017-07-02 10:52:31 +02:00
0073374d91 DVL-012 Harden composer-download for travis tests 2017-07-02 10:20:54 +02:00
1a3b9e03cf DVL-012 Fix domain mixup in Examples 2017-07-01 21:03:11 +02:00
0b609be2fe DVL-012 Adding PerconaDB 2017-07-01 18:54:09 +02:00
812b0eface Merge pull request #88 from cytopia/DVL-012
DVL-012 Howto setup laravel
2017-07-01 15:59:34 +02:00
4990931c3c DVL-012 Howto setup laravel 2017-07-01 12:40:59 +02:00
fd7a19c9b1 Merge pull request #87 from cytopia/DVL-012
REL-0.12 Making devilbox ready for PHP 7.2
2017-06-27 18:19:49 +02:00
4ea1aa2370 REL-0.12 Making devilbox ready for PHP 7.2 2017-06-27 13:14:02 +02:00
ba498cad2a Merge pull request #86 from cytopia/DVL-012
DVL-012
2017-06-26 13:15:42 +02:00
af5d5bbcba DVL-0.12 Fixing ToC links 2017-06-26 13:05:15 +02:00
f190b64766 DVL-0.12 Binding latest images to docker-compose 2017-06-26 11:19:28 +02:00
12375 changed files with 1352050 additions and 698333 deletions

View File

@ -1,3 +0,0 @@
<?php
// Fix DocumentRoot for VirtualDocumentRoot Hosts
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);

View File

@ -1,3 +0,0 @@
<?php
// Fix DocumentRoot for VirtualDocumentRoot Hosts
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);

4
.devilbox/cfg/mysql.cnf Normal file
View File

@ -0,0 +1,4 @@
[mysqld]
server_id = 1
log_bin = "mysql-bin"
sync_binlog = 0

View File

@ -1,23 +0,0 @@
CustomLog "/var/log/apache-2.2/access_log" combined
ErrorLog "/var/log/apache-2.2/error_log"
LogLevel warn
AddDefaultCharset UTF-8
# No DNS
HostnameLookups Off
#
Timeout 60
KeepAlive On
KeepAliveTimeout 10
MaxKeepAliveRequests 100
#
#
EnableMMAP Off
EnableSendfile Off
#
#
#
#
XSendFile On
XSendFilePath /shared/httpd

View File

@ -1,6 +0,0 @@
#### PHP-FPM config ####
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/local/bin/php-fcgi
FastCgiExternalServer /usr/local/bin/php-fcgi -host php:9000 -pass-header Authorization

View File

@ -1,40 +0,0 @@
##
## Default Host for http://localhost
##
NameVirtualHost *:80
<VirtualHost _default_:80>
ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.238.*
ServerAlias httpd
ServerAdmin root@localhost
ErrorLog /var/log/apache-2.2/devilbox-error.log
CustomLog /var/log/apache-2.2/devilbox-access.log combined
DirectoryIndex index.php index.html
DocumentRoot "/var/www/default/htdocs"
<Directory "/var/www/default/htdocs">
DirectoryIndex index.php index.html
AllowOverride All
Options All
RewriteEngine on
RewriteBase /
Order allow,deny
Allow from all
</Directory>
<Location /devilbox-httpd-status>
SetHandler server-status
Order allow,deny
Allow from all
</Location>
</VirtualHost>

View File

@ -1,44 +0,0 @@
##
## Default Mass Virtual Host
##
<VirtualHost *:80>
# Get the server name from the Host: header
UseCanonicalName Off
ServerName localhost
ServerAlias *.*
ServerAdmin root@localhost
# Required for DNS checking
SetEnvIf Origin "http(s)?://(domain1.org|localhost|127.0.0.1|httpd)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
LogFormat "%V;%h;%l;%u;%t;\"%r\";%>s;%b;\"%{Referer}i\";\"%{User-agent}i\"" vcommon
CustomLog "/var/log/apache-2.2/projects-access.log" vcommon
ErrorLog /var/log/apache-2.2/projects-error.log
DirectoryIndex index.php index.html
# When using VirtualDocumentRoot the PHP Env var DOCUMENT_ROOT
# is not filled, so we need to do that manually with a custom script.
VirtualDocumentRoot /shared/httpd/%-2+/htdocs/
php_admin_value auto_prepend_file /opt/bin/fix-virtual-docroot.php
# Devilbox API endpoint
Alias "/devilbox-api" "/var/www/default/api/devilbox-api"
<Directory "/shared/httpd/*/htdocs/">
DirectoryIndex index.php index.html
AllowOverride All
Options All
RewriteEngine on
RewriteBase /
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

View File

@ -1,23 +0,0 @@
CustomLog "/var/log/apache-2.4/access_log" combined
ErrorLog "/var/log/apache-2.4/error_log"
LogLevel warn
AddDefaultCharset UTF-8
# No DNS
HostnameLookups Off
#
Timeout 60
KeepAlive On
KeepAliveTimeout 10
MaxKeepAliveRequests 100
#
#
EnableMMAP Off
EnableSendfile Off
#
#
#
#
XSendFile On
XSendFilePath /shared/httpd

View File

@ -1,17 +0,0 @@
#### PHP-FPM config ####
# enablereuse
# Defining a worker will improve performance
# And in this case, re-use the worker (dependent on support from the fcgi application)
# If you have enough idle workers, this would only improve the performance marginally
#
# enablereuse requires Apache 2.4.11 or later
#<Proxy "fcgi://php:9000/" enablereuse=on max=10></Proxy>
<FilesMatch "\.php$">
Require all granted
# Pick one of the following approaches
# Use the standard TCP socket
SetHandler "proxy:fcgi://php:9000"
# If your version of httpd is 2.4.9 or newer (or has the back-ported feature), you can use the unix domain socket
#SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/:9000"
</FilesMatch>

View File

@ -1,42 +0,0 @@
##
## Default Host for http://localhost
##
<VirtualHost _default_:80>
ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.238.*
ServerAlias httpd
ServerAdmin root@localhost
ErrorLog /var/log/apache-2.4/devilbox-error.log
CustomLog /var/log/apache-2.4/devilbox-access.log combined
DirectoryIndex index.php index.html
DocumentRoot "/var/www/default/htdocs"
<Directory "/var/www/default/htdocs">
DirectoryIndex index.php index.html
AllowOverride All
Options All
RewriteEngine on
RewriteBase /
Order allow,deny
Allow from all
Require all granted
</Directory>
<Location /devilbox-httpd-status>
SetHandler server-status
Order allow,deny
Allow from all
Require all granted
</Location>
</VirtualHost>

View File

@ -1,45 +0,0 @@
##
## Default Mass Virtual Host
##
<VirtualHost *:80>
# Get the server name from the Host: header
UseCanonicalName Off
ServerName localhost
ServerAlias *.*
ServerAdmin root@localhost
# Required for DNS checking
SetEnvIf Origin "http(s)?://(domain1.org|localhost|127.0.0.1|httpd)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
LogFormat "%V;%h;%l;%u;%t;\"%r\";%>s;%b;\"%{Referer}i\";\"%{User-agent}i\"" vcommon
CustomLog "/var/log/apache-2.4/projects-access.log" vcommon
ErrorLog /var/log/apache-2.4/projects-error.log
DirectoryIndex index.php index.html
# When using VirtualDocumentRoot the PHP Env var DOCUMENT_ROOT
# is not filled, so we need to do that manually with a custom script.
VirtualDocumentRoot /shared/httpd/%-2+/htdocs/
php_admin_value auto_prepend_file /opt/bin/fix-virtual-docroot.php
# Devilbox API endpoint
Alias "/devilbox-api" "/var/www/default/api/devilbox-api"
<Directory "/shared/httpd/*/htdocs/">
DirectoryIndex index.php index.html
AllowOverride All
Options All
RewriteEngine on
RewriteBase /
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>

View File

@ -1,10 +0,0 @@
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

View File

@ -1,8 +0,0 @@
charset utf-8;
send_timeout 60;
keepalive_timeout 10;
sendfile off;
tcp_nopush on;
tcp_nodelay on;

View File

@ -1,77 +0,0 @@
##
## Default Host for http://localhost
##
server {
listen 80 default_server;
server_name _;
server_name localhost;
server_name 127.0.0.1;
server_name httpd;
server_name 172.16.238.*;
# Root directive
root /var/www/default/htdocs;
index index.php;
access_log /var/log/nginx-mainline/devilbox-access.log main;
error_log /var/log/nginx-mainline/devilbox-error.log warn;
# Devilbox httpd info/status
location /devilbox-httpd-status {
stub_status on;
access_log off;
}
# Devilbox API endpoint
location ~ /devilbox-api/ {
root /var/www/default/api/;
index status.json;
# Allow cross-domain requests to this domain
# Used to validate if client DNS is setup correctly
if ( $http_origin ~* (https?://(localhost|127\.0\.0\.1|httpd)$) ) {
add_header "Access-Control-Allow-Origin" "$http_origin";
}
}
# Front-controller pattern as recommended by the nginx docs
location / {
try_files $uri $uri/ /index.php;
}
# PHP FPM
location ~ \.php?$ {
# PHP.INI:
# ---------------------------
# // Find this:
# cgi.fix_pathinfo=1
# // Replace with:
# cgi.fix_pathinfo=0
try_files $uri = 404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
#### FPM Server
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
# disallow access to git configs path
location ~ /\.git {
deny all;
}
}

View File

@ -1,67 +0,0 @@
##
## Default Mass Virtual Host
##
server {
listen 80;
server_name ~^(?<domain>.+)\.[a-zA-Z]+$;
# Root directive
root /shared/httpd/$domain/htdocs/;
index index.php;
access_log /var/log/nginx-mainline/projects-access.log main;
error_log /var/log/nginx-mainline/projects-error.log warn;
# Devilbox API endpoint
location ~ /devilbox-api/ {
root /var/www/default/api/;
index status.json;
access_log off;
# Allow cross-domain requests to this domain
# Used to validate if client DNS is setup correctly
if ( $http_origin ~* (https?://(localhost|127\.0\.0\.1|httpd)$) ) {
add_header "Access-Control-Allow-Origin" "$http_origin";
}
}
# Front-controller pattern as recommended by the nginx docs
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP FPM
location ~ \.php?$ {
# PHP.INI:
# ---------------------------
# // Find this:
# cgi.fix_pathinfo=1
# // Replace with:
# cgi.fix_pathinfo=0
try_files $uri = 404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
#### SOCKET
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
# disallow access to git configs path
location ~ /\.git {
deny all;
}
}

View File

@ -1,8 +0,0 @@
charset utf-8;
send_timeout 60;
keepalive_timeout 10;
sendfile off;
tcp_nopush on;
tcp_nodelay on;

View File

@ -1,75 +0,0 @@
##
## Default Host for http://localhost
##
server {
listen 80 default_server;
server_name _;
server_name localhost;
server_name 127.0.0.1;
server_name httpd;
server_name 172.16.238.*;
# Root directive
root /var/www/default/htdocs;
index index.php;
access_log /var/log/nginx-stable/devilbox-access.log main;
error_log /var/log/nginx-stable/devilbox-error.log warn;
# Devilbox httpd info/status
location /devilbox-httpd-status {
stub_status on;
access_log off;
}
# Devilbox API endpoint
location ~ /devilbox-api/ {
root /var/www/default/api/;
index status.json;
# Allow cross-domain requests to this domain
# Used to validate if client DNS is setup correctly
if ( $http_origin ~* (https?://(localhost|127\.0\.0\.1|httpd)$) ) {
add_header "Access-Control-Allow-Origin" "$http_origin";
}
}
# Front-controller pattern as recommended by the nginx docs
location / {
try_files $uri $uri/ /index.php;
}
# PHP FPM
location ~ \.php?$ {
# PHP.INI:
# ---------------------------
# // Find this:
# cgi.fix_pathinfo=1
# // Replace with:
# cgi.fix_pathinfo=0
try_files $uri = 404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
#### FPM Server
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
# disallow access to git configs path
location ~ /\.git {
deny all;
}
}

View File

@ -1,67 +0,0 @@
##
## Default Mass Virtual Host
##
server {
listen 80;
server_name ~^(?<domain>.+)\.[a-zA-Z]+$;
# Root directive
root /shared/httpd/$domain/htdocs/;
index index.php;
access_log /var/log/nginx-stable/projects-access.log main;
error_log /var/log/nginx-stable/projects-error.log warn;
# Devilbox API endpoint
location ~ /devilbox-api/ {
root /var/www/default/api/;
index status.json;
access_log off;
# Allow cross-domain requests to this domain
# Used to validate if client DNS is setup correctly
if ( $http_origin ~* (https?://(localhost|127\.0\.0\.1|httpd)$) ) {
add_header "Access-Control-Allow-Origin" "$http_origin";
}
}
# Front-controller pattern as recommended by the nginx docs
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP FPM
location ~ \.php?$ {
# PHP.INI:
# ---------------------------
# // Find this:
# cgi.fix_pathinfo=1
# // Replace with:
# cgi.fix_pathinfo=0
try_files $uri = 404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)$;
#### SOCKET
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
# disallow access to git configs path
location ~ /\.git {
deny all;
}
}

View File

@ -2,6 +2,9 @@
// Measure time
$TIME_START = microtime(true);
// Start session
session_start();
// Turn on all PHP errors
error_reporting(-1);
@ -10,8 +13,8 @@ error_reporting(-1);
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
$DEVILBOX_VERSION = 'v0.11';
$DEVILBOX_DATE = '2017-06-25';
$DEVILBOX_VERSION = 'v1.10.0';
$DEVILBOX_DATE = '2022-01-28';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
//
@ -124,8 +127,40 @@ function loadClass($class) {
break;
case 'Redis':
// Check if redis is using a password
$REDIS_ROOT_PASSWORD = '';
$_REDIS_ARGS = loadClass('Helper')->getEnv('REDIS_ARGS');
/*
* This pattern will match optional quoted string, 'my password' or "my password"
* or if there aren't any quotes, it will match up until the next space.
*/
$_REDIS_PASS = array();
preg_match_all('/--requirepass\s+("|\')?(?(1)(.*)|([^\s]*))(?(1)\1|)/', $_REDIS_ARGS, $_REDIS_PASS, PREG_SET_ORDER);
if (! empty($_REDIS_PASS)) {
/*
* In case the option is specified multiple times, use the last effective one.
*
* preg_match_all returns a multi-dimensional array, the first level array is in order of which was matched first,
* and the password string is either matched in group 2 or group 3 which is always the end of the sub-array.
*/
$_REDIS_PASS = end(end($_REDIS_PASS));
if (strlen($_REDIS_PASS) > 0) {
$REDIS_ROOT_PASSWORD = $_REDIS_PASS;
}
}
loadFile($class, $cnt_dir);
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME']);
if ($REDIS_ROOT_PASSWORD == '') {
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME']);
} else {
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME'], array(
'pass' => $REDIS_ROOT_PASSWORD,
));
}
break;
case 'Memcd':
@ -140,7 +175,7 @@ function loadClass($class) {
// Get optional docker classes
default:
// Redis
// Unknown class
exit('Class does not exist: '.$class);
}
return $_LOADED_LIBS[$class];

View File

@ -1,19 +1,123 @@
<?php
require '../config.php';
if (isset($_GET['database'])) {
if (isset($_GET['type']) && $_GET['type'] == 'mysql') {
echo json_encode(array(
'size' => (string)loadClass('Mysql')->getDBSize($_GET['database']),
'table' => (string)loadClass('Mysql')->getTableCount($_GET['database'])
));
} else if (isset($_GET['type']) && $_GET['type'] == 'postgres') {
$schema = isset($_GET['schema']) ? $_GET['schema'] : '';
echo json_encode(array(
'size' => (string)loadClass('Pgsql')->getSchemaSize($_GET['database'], $schema),
'table' => (string)loadClass('Pgsql')->getTableCount($_GET['database'], $schema)
));
if (loadClass('Helper')->isLoggedIn()) {
//
// ?database=
//
if (isset($_GET['database'])) {
// &type=mysql
if (isset($_GET['type']) && $_GET['type'] == 'mysql') {
echo json_encode(array(
'size' => (string)loadClass('Mysql')->getDBSize($_GET['database']),
'table' => (string)loadClass('Mysql')->getTableCount($_GET['database'])
));
// &type=postgres
} else if (isset($_GET['type']) && $_GET['type'] == 'postgres') {
$schema = isset($_GET['schema']) ? $_GET['schema'] : '';
echo json_encode(array(
'size' => (string)loadClass('Pgsql')->getSchemaSize($_GET['database'], $schema),
'table' => (string)loadClass('Pgsql')->getTableCount($_GET['database'], $schema)
));
}
}
//
// ?vhost=
//
else if (isset($_GET['vhost'])) {
echo loadClass('Httpd')->checkVirtualHost($_GET['vhost']);
}
//
// ?software=
//
else if (isset($_GET['software'])) {
$no = '<span class="text-danger">not installed</span>';
$software = array();
if ($_GET['software'] == 'composer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drupalc') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrupalConsoleVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush7') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(7)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush8') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(8)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush9') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(9)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'git') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'mds') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getMdsVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'node') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getNodeVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'npm') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'phalcon') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhalconVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'symfony') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getSymfonyVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'wpcli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no
));
} else {
echo json_encode(array($_GET['software'] => 'unknown software'));
}
}
//
// WRONG REQUEST
//
else {
loadClass('Helper')->redirect('/');
}
} else if (isset($_GET['vhost'])) {
echo loadClass('Httpd')->checkVirtualHost($_GET['vhost']);
}
//
// Not logged in
//
else {
loadClass('Helper')->redirect('/');
}

View File

@ -1,11 +1,11 @@
.meter {
height: 20px; /* Can be anything */
position: relative;
background: #555;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
border-radius: 25px;
box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
height: 20px; /* Can be anything */
position: relative;
background: #555;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
border-radius: 25px;
box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
}
.meter > span {
display: block;
@ -16,49 +16,49 @@
border-bottom-left-radius: 20px;
background-color: rgb(43,194,83);
background-image: linear-gradient(
center bottom,
rgb(43,194,83) 37%,
rgb(84,240,84) 69%
center bottom,
rgb(43,194,83) 37%,
rgb(84,240,84) 69%
);
box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
position: relative;
overflow: hidden;
}
.dash-box {
border: 1px solid #383737;
background-color: #3d3d3d;
color: #999999;
height:100%;
border: 1px solid #383737;
background-color: #3d3d3d;
color: #999999;
height:100%;
}
.dash-box-head {
background-color: #383737;
color: #999999;
width:100%;
display: inline-block;
padding:10px;
font-weight: bold;
background-color: #383737;
color: #999999;
width:100%;
display: inline-block;
padding:10px;
font-weight: bold;
}
.dash-box-body {
padding:10px;
padding:10px;
}
.row-margin {
margin-bottom:20px;
margin-bottom:20px;
}
.col-margin {
margin-bottom:20px;
margin-bottom:20px;
}
/* Bootstrap overwrites
-------------------------------------------------- */
html, body {
font-size: 14px;
font-size: 14px;
}
@ -71,7 +71,7 @@ html {
}
body {
/* Margin bottom by footer height */
margin-bottom: 80px;
margin-bottom: 80px !important;
}
.footer {
position: absolute;
@ -86,7 +86,7 @@ body {
/* Generics
-------------------------------------------------- */
.font-small {
font-size: 12px;
font-size: 12px;
}
@ -95,52 +95,52 @@ body {
-------------------------------------------------- */
.circles{
margin:0px auto;
margin:0px auto;
}
.circles > div {
overflow:hidden;
float:left;
width:auto;
height:auto;
position: relative;
border-radius:50%;
-moz-border-radius:50%;
-webkit-border-radius:50%;
-khtml-border-radius: 50%;
background:#eee;
overflow:hidden;
float:left;
width:auto;
height:auto;
position: relative;
border-radius:50%;
-moz-border-radius:50%;
-webkit-border-radius:50%;
-khtml-border-radius: 50%;
background:#eee;
}
.circles > div > div {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.circles > div > div > div {
display: table;
width: 100%;
height: 100%;
display: table;
width: 100%;
height: 100%;
}
.circles > div > div > div > div {
display: table-cell;
text-align: center;
vertical-align: middle;
display: table-cell;
text-align: center;
vertical-align: middle;
}
@media (max-width: 320px)
{
.circles > div {padding: 50%;}
.circles > div {padding: 50%;}
}
@media (min-width: 321px) and (max-width: 800px)
{
.circles > div {padding: 50%;}
.circles > div {padding: 50%;}
}
@media (min-width: 801px)
{
.circles > div {padding: 48%;}
.circles > div {padding: 48%;}
}
@ -150,18 +150,21 @@ body {
a.navbar-brand {
background-color: transparent !important;
}
a.navbar-brand img {
margin-right: 10px;
}
a.nav-link {
background-color: transparent !important;
background-color: transparent !important;
}
img.d-inline-block {
float: none;
float: none;
}
nav.navbar {
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
font-size: 1rem;
line-height: 1.5;
color: #373a3c;
background-color: #fff;
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
font-size: 1rem;
line-height: 1.5;
color: #373a3c;
background-color: #fff;
}
@ -170,23 +173,62 @@ nav.navbar {
/* mail.php;
-------------------------------------------------- */
tr.subject {
cursor: pointer;
cursor: pointer;
}
td.break-word {
word-break: break-word;
word-break: break-word;
}
/* adminer.php;
-------------------------------------------------- */
#menu {
position: absolute;
margin: 76px 0 0 !important;
position: absolute;
margin: 76px 0 0 !important;
}
#breadcrumb {
top: 60px !important;
top: 60px !important;
}
#lang {
top: 53px !important;
top: 53px !important;
}
.pages {
z-index:1000;
}
/* login.php;
-------------------------------------------------- */
/* Extra markup and styles for table-esque vertical and horizontal centering */
.site-wrapper {
display: table;
width: 100%;
height: 100%; /* For at least Firefox */
min-height: 100%;
-webkit-box-shadow: inset 0 0 5rem rgba(0,0,0,.5);
box-shadow: inset 0 0 5rem rgba(0,0,0,.5);
}
.site-wrapper-inner {
display: table-cell;
vertical-align: top;
}
.cover-container {
margin-right: auto;
margin-left: auto;
}
/* Affix and center */
@media (min-width: 40em) {
/* Start the vertical centering */
.site-wrapper-inner {
vertical-align: middle;
}
}
@media (min-width: 62em) {
.masthead,
.mastfoot,
.cover-container {
width: 32rem;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,22 @@
class HtmlEmail extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
let emailContent;
const templateId = this.dataset.templateId;
try {
emailContent = document.getElementById(templateId).innerHTML;
} catch (error) {
console.log(error);
return;
}
const container = document.createElement('div');
container.innerHTML = emailContent;
this.shadowRoot.appendChild(container);
}
}
customElements.define('html-email', HtmlEmail);

View File

@ -0,0 +1,62 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>Httpd custom configs</h1>
<br/>
<br/>
<p>Shows your currently custom configuration files applied to the Httpd container.</p>
<div class="row">
<div class="col-md-12">
<?php $vHosts = loadClass('Httpd')->getVirtualHosts(); ?>
<?php $custom = false; ?>
<?php foreach ($vHosts as $vHost): ?>
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
<?php $custom = true; ?>
<?php endif; ?>
<?php endforeach; ?>
<?php if ($custom): ?>
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Project</th>
<th>Host</th>
<th>Container</th>
<th>Files</th>
</tr>
</thead>
<tbody>
<?php foreach ($vHosts as $vHost): ?>
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
<tr>
<th><?php echo $vHost['domain']; ?></th>
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vHost['name'].'/'.loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR');?></td>
<td><?php echo dirname($vhostGen); ?></td>
<td><code><?php echo basename($vhostGen); ?></code></td>
</tr>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
<?php else: ?>
<p>No custom configurations applied.</p>
<?php endif; ?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -0,0 +1,126 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>PHP custom configs</h1>
<br/>
<br/>
<p>Shows your currently custom configuration files applied to the PHP-FPM container.</p>
<div class="row">
<div class="col-md-12">
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Section</th>
<th>Host</th>
<th>Container</th>
<th>Files</th>
</tr>
</thead>
<tbody>
<tr>
<th>Supervisord</th>
<td>supervisor/</td>
<td>/etc/supervisor/custom.d/</td>
<td>
<?php
$files = glob('/etc/supervisor/custom.d/*.conf');
if ($files) {
foreach ($files as $file) {
echo '<code>'.basename($file). '</code><br/>';
}
} else {
echo 'No custom files';
}
?>
</td>
</tr>
<tr>
<th>Autostart (global)</th>
<td>autostart/</td>
<td>/startup.2.d/</td>
<td>
<?php
$files = glob('/startup.2.d/*.sh');
if ($files) {
foreach ($files as $file) {
echo '<code>'.basename($file). '</code><br/>';
}
} else {
echo 'No custom files';
}
?>
</td>
</tr>
<tr>
<th>Autostart (version)</th>
<td>cfg/php-startup-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
<td>/startup.1.d/</td>
<td>
<?php
$files = glob('/startup.1.d/*.sh');
if ($files) {
foreach ($files as $file) {
echo '<code>'.basename($file). '</code><br/>';
}
} else {
echo 'No custom files';
}
?>
</td>
</tr>
<tr>
<th>PHP-FPM</th>
<td>cfg/php-fpm-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
<td>/etc/php-fpm-custom.d/</td>
<td>
<?php
$files = glob('/etc/php-fpm-custom.d/*.conf');
if ($files) {
foreach ($files as $file) {
echo '<code>'.basename($file). '</code><br/>';
}
} else {
echo 'No custom files';
}
?>
</td>
</tr>
<tr>
<th>PHP</th>
<td>cfg/php-ini-<?php echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;?>/</td>
<td>/etc/php-custom.d/</td>
<td>
<?php
$files = glob('/etc/php-custom.d/*.ini');
if ($files) {
foreach ($files as $file) {
echo '<code>'.basename($file). '</code><br/>';
}
} else {
echo 'No custom files';
}
?>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
@ -18,7 +19,7 @@
<div class="col-md-6">
<h2>Contributors</h2>
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox">Devilbox</a>.</p>
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox/graphs/contributors">Devilbox</a>.</p>
<table class="table table-striped ">
<thead class="thead-inverse ">
<tr>
@ -59,32 +60,47 @@
<tr>
<td>Adminer</td>
<td>Apache License 2.0 or GPL 2</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/vrana/adminer">vrana/adminer</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/vrana/adminer">vrana/adminer</a></td>
</tr>
<tr>
<td>Bootstrap</td>
<td>MIT</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
</tr>
<tr>
<td>Font Awesome (css)</td>
<td>MIT</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
</tr>
<tr>
<td>Font Awesome (fonts)</td>
<td>SIL OFL 1.1</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
</tr>
<tr>
<td>Opcache GUI</td>
<td>MIT</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
</tr>
<tr>
<td>PHPMemcachedAdmin</td>
<td>Apache 2.0</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/elijaa/phpmemcachedadmin">elijaa/phpmemcachedadmin</a></td>
</tr>
<tr>
<td>phpMyAdmin</td>
<td>GPL 2.0</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
</tr>
<tr>
<td>phpPgAdmin</td>
<td>GPL 2.0</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phppgadmin/phppgadmin">phppgadmin/phppgadmin</a></td>
</tr>
<tr>
<td>PHPRedMin</td>
<td>BSD 3-Clause License</td>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/sasanrose/phpredmin">sasanrose/phpredmin</a></td>
</tr>
</tbody>
</table>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
@ -24,6 +25,8 @@
<thead class="thead-inverse ">
<tr>
<th>Key</th>
<th>Size</th>
<th>TTL</th>
<th>Value</th>
</th>
</thead>
@ -31,7 +34,9 @@
<?php foreach (loadClass('Memcd')->getKeys() as $data): ?>
<tr>
<td><?php print_r($data['key']);?></td>
<td><?php print_r($data['value']);?></td>
<td><?php print_r($data['size']);?></td>
<td><?php print_r($data['ttl']);?></td>
<td><?php print_r($data['val']);?></td>
</tr>
<?php endforeach; ?>
</tbody>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
// Also required for JS calls (see bottom of this page)
$len_table = 4;

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
// Also required for JS calls (see bottom of this page)
$len_table = 4;

View File

@ -1,4 +1,12 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
if (isset($_GET['redisdb'])) {
loadClass('Redis')->flushDB($_GET['redisdb']);
loadClass('Helper')->redirect('/db_redis.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
@ -14,6 +22,27 @@
<br/>
<br/>
<?php $databases = array_keys(loadClass('Redis')->getKeys()); ?>
<?php if (count($databases)): ?>
<div class="row">
<div class="col-md-12">
<form class="form-inline">
<div class="form-group">
<label class="sr-only" for="redisdb">Redis DB</label>
<select class="form-control" name="redisdb">
<option value="" selected disabled>Select Redis DB</option>
<?php foreach ($databases as $db): ?>
<option value="<?php echo $db;?>"><?php echo $db;?></option>
<?php endforeach; ?>
</select>
</div>&nbsp;&nbsp;
<button type="submit" class="btn btn-primary">Flush database</button>
</form>
<br/>
</div>
</div>
<?php endif; ?>
<div class="row">
<div class="col-md-12">
@ -21,19 +50,43 @@
<p>Redis container is not running.</p>
<?php else: ?>
<table class="table table-striped ">
<thead class="thead-inverse ">
<tr>
<th>Key</th>
<th>Value</th>
</th>
</thead>
<tbody>
<?php foreach (loadClass('Redis')->getKeys() as $key => $value): ?>
<tr>
<td><?php echo $key;?></td>
<td><?php print_r($value);?></td>
</tr>
<?php endforeach; ?>
<?php $redisKeys = loadClass('Redis')->getKeys(); ?>
<?php if (count($redisKeys)): ?>
<?php foreach ($redisKeys as $db_name => $keys): ?>
<tr class="thead-inverse ">
<th colspan="5">
Database: <?php echo $db_name; ?>&nbsp;&nbsp;&nbsp;&nbsp;
Items: <?php echo count($keys); ?>
</th>
</th>
<tr class="table-info">
<tr>
<th>DB</th>
<th>Key</th>
<th>Expires</th>
<th>Type</th>
<th>Value</th>
</th>
</tr>
<?php foreach ($keys as $key): ?>
<tr>
<td><?php echo $db_name;?></td>
<td class="break-word" style="width:30%;"><?php echo $key['name'];?></td>
<td><?php echo $key['ttl'];?>s</td>
<td><?php echo $key['type'];?></td>
<td class="break-word">
<code>
<?php echo htmlentities($key['val']);?>
</code>
</td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
<?php else: ?>
<p>No keys set.</p>
<?php endif; ?>
</tbody>
</table>
<?php endif; ?>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
/*********************************************************************************
@ -29,6 +30,7 @@ $connection = array();
$error = null;
// ---- HTTPD (required) ----
$host = $GLOBALS['HTTPD_HOST_NAME'];
$succ = loadClass('Httpd')->canConnect($error, $host);
$connection['Httpd'][$host] = array(
@ -50,7 +52,6 @@ $connection['Httpd'][$host] = array(
'host' => $host,
'succ' => $succ
);
// ---- MYSQL ----
if ($avail_mysql) {
$host = $GLOBALS['MYSQL_HOST_NAME'];
@ -126,6 +127,7 @@ if ($avail_redis) {
);
}
// ---- MEMCACHED ----
if ($avail_memcd) {
$host = $GLOBALS['MEMCD_HOST_NAME'];
@ -245,7 +247,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</div>
<div class="col-md-4 col-sm-4 col-xs-12 col-margin">
<img src="/assets/img/devilbox_80.png" style="width:100%;" />
<img src="/assets/img/banner.png" style="width:100%;" />
</div>
<div class="col-md-4 col-sm-4 col-xs-12 col-margin">
@ -350,6 +352,14 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<th>gid</th>
<td><?php echo loadClass('Php')->getGid(); ?></td>
</tr>
<tr>
<th>vHost docroot dir</th>
<td><?php echo loadClass('Helper')->getEnv('HTTPD_DOCROOT_DIR'); ?></td>
</tr>
<tr>
<th>vHost config dir</th>
<td><?php echo loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR'); ?></td>
</tr>
<tr>
<th>vHost TLD</th>
<td>*.<?php echo loadClass('Httpd')->getTldSuffix(); ?></td>
@ -362,40 +372,6 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<th>Postfix</th>
<td><?php echo loadClass('Helper')->getEnv('ENABLE_MAIL') ? 'Enabled' : '<span class="bg-danger">No</span> Disabled';?></td>
</tr>
<tr>
<th>Xdebug</th>
<td>
<?php $Xdebug = (loadClass('Helper')->getEnv('PHP_XDEBUG_ENABLE') == 0) ? '' : loadClass('Helper')->getEnv('PHP_XDEBUG_ENABLE'); ?>
<?php if ($Xdebug == loadClass('Php')->getConfig('xdebug.remote_enable')): ?>
<?php echo loadClass('Php')->getConfig('xdebug.remote_enable') == 1 ? 'Yes' : 'No'; ?>
<?php else: ?>
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_enable'); ?>
<?php endif; ?>
</td>
</tr>
<tr>
<th>Xdebug Remote</th>
<td>
<?php if (loadClass('Helper')->getEnv('PHP_XDEBUG_REMOTE_HOST') == loadClass('Php')->getConfig('xdebug.remote_host')): ?>
<?php echo loadClass('Php')->getConfig('xdebug.remote_host'); ?>
<?php else: ?>
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_host'); ?>
<?php endif; ?>
</td>
</tr>
<tr>
<th>Xdebug Port</th>
<td>
<?php if (loadClass('Helper')->getEnv('PHP_XDEBUG_REMOTE_PORT') == loadClass('Php')->getConfig('xdebug.remote_port')): ?>
<?php echo loadClass('Php')->getConfig('xdebug.remote_port'); ?>
<?php else: ?>
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_port'); ?>
<?php endif; ?>
</td>
</tr>
</tbody>
</table>
@ -408,47 +384,55 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<tbody>
<tr>
<th>composer</th>
<td><?php if (($version = loadClass('Php')->getComposerVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_composer"></td>
</tr>
<tr>
<th>drupal-console</th>
<td><?php if (($version = loadClass('Php')->getDrushConsoleVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_drupalc"></td>
</tr>
<tr>
<th>drush</th>
<td><?php if (($version = loadClass('Php')->getDrushVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<th>drush7</th>
<td id="app_drush7"></td>
</tr>
<tr>
<th>drush8</th>
<td id="app_drush8"></td>
</tr>
<tr>
<th>drush9</th>
<td id="app_drush9"></td>
</tr>
<tr>
<th>git</th>
<td><?php if (($version = loadClass('Php')->getGitVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_git"></td>
</tr>
<tr>
<th>Laravell installer</th>
<td><?php if (($version = loadClass('Php')->getLaravelVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<th>Laravel installer</th>
<td id="app_laravel"></td>
</tr>
<tr>
<th>mysqldump-secure</th>
<td><?php if (($version = loadClass('Php')->getMdsVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_mds"></td>
</tr>
<tr>
<th>node</th>
<td><?php if (($version = loadClass('Php')->getNodeVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_node"></td>
</tr>
<tr>
<th>npm</th>
<td><?php if (($version = loadClass('Php')->getNpmVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_npm"></td>
</tr>
<tr>
<th>Phalcon devtools</th>
<td><?php if (($version = loadClass('Php')->getPhalconVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_phalcon"></td>
</tr>
<tr>
<th>Symfony installer</th>
<td><?php if (($version = loadClass('Php')->getSymfonyVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_symfony"></td>
</tr>
<tr>
<th>Wordpress cli</th>
<td><?php if (($version = loadClass('Php')->getWpcliVersion()) === false) {echo '<span class="text-danger">not installed</span>';}else{echo $version;}; ?></td>
<td id="app_wpcli"></td>
</tr>
</tbody>
</table>
@ -608,8 +592,11 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</tr>
<tr>
<th>httpd</th>
<td><?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD');?></td>
<td>80</td>
<td>
<?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD');?><br/>
<?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD_SSL');?>
</td>
<td>80<br/>443</td>
</tr>
<?php if ($avail_mysql): ?>
<tr>
@ -692,14 +679,14 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<?php if ($avail_mysql): ?>
<tr>
<th>mysql</th>
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_MYSQL_DATADIR').'/'.loadClass('Helper')->getEnv('MYSQL_SERVER'); ?></td>
<td>Docker volume</td>
<td>/var/lib/mysql</td>
</tr>
<?php endif; ?>
<?php if ($avail_pgsql): ?>
<tr>
<th>pgsql</th>
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_PGSQL_DATADIR').'/'.loadClass('Helper')->getEnv('PGSQL_SERVER'); ?></td>
<td>Docker volume</td>
<td>/var/lib/postgresql/data/pgdata</td>
</tr>
<?php endif; ?>
@ -720,7 +707,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<?php if ($avail_mongo): ?>
<tr>
<th>mongo</th>
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_MONGO_DATADIR'); ?></td>
<td>Docker volume</td>
<td>/data/db</td>
</tr>
<?php endif; ?>
@ -755,14 +742,19 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</thead>
<tbody>
<tr>
<th>php</th>
<td>./cfg/<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
<th>php (ini)</th>
<td>./cfg/php-ini-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
<td>/etc/php-custom.d</td>
</tr>
<tr>
<th>php (fpm)</th>
<td>./cfg/php-fpm-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
<td>/etc/php-fpm-custom.d</td>
</tr>
<tr>
<th>httpd</th>
<td>-</td>
<td>-</td>
<td>./cfg/<?php echo loadClass('Helper')->getEnv('HTTPD_SERVER'); ?></td>
<td>/etc/httpd-custom.d</td>
</tr>
<?php if ($avail_mysql): ?>
<tr>
@ -831,7 +823,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<tbody>
<tr>
<th>php</th>
<td>./log/<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
<td>./log/php-fpm-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
<td>/var/log/php</td>
</tr>
<tr>
@ -901,6 +893,39 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
(function() {
// your page initialization code here
// the DOM will be available here
/**
* Update installed tool versions.
* Ajax method is faster for loading the front page
* @param string app Name of the tool
*/
function updateVersions(app) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
var elem = document.getElementById('app_'+app);
if (this.readyState == 4 && this.status == 200) {
json = JSON.parse(this.responseText);
elem.innerHTML = json[app];
}
};
xhttp.open('GET', '_ajax_callback.php?software='+app, true);
xhttp.send();
}
updateVersions('composer');
updateVersions('drupalc');
updateVersions('drush7');
updateVersions('drush8');
updateVersions('drush9');
updateVersions('git');
updateVersions('laravel');
updateVersions('mds');
updateVersions('node');
updateVersions('npm');
updateVersions('phalcon');
updateVersions('symfony');
updateVersions('wpcli');
})();
</script>
</body>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
@ -18,7 +19,7 @@
<div class="col-md-12">
<?php if (!loadClass('Memcd')->isAvailable()): ?>
<p>Memcahed container is not running.</p>
<p>Memcached container is not running.</p>
<?php else: ?>
<?php foreach (loadClass('Memcd')->getInfo() as $srv => $data): ?>
<h2><?php echo $srv; ?></h2>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -0,0 +1,66 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
if (!isset($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
if (!strlen($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
$vhost = $_GET['name'];
$found = false;
$vhosts = loadClass('Httpd')->getVirtualHosts();
foreach ($vhosts as $v) {
if ($vhost == $v['name']) {
$found = true;
break;
}
}
// Be safe before using outputs
$vhost = htmlentities($vhost);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>vhost-gen: <?php echo $vhost;?></h1>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<?php if (!$found): ?>
<p>The Virtual Host "<?php echo $vhost; ?>" does not exist.</p>
<?php else: ?>
<?php $tpl = loadClass('Httpd')->getVhostgenTemplatePath($vhost); ?>
<?php if (!$tpl): ?>
<p>No custom vhost-gen configuration found for "<?php echo $vhost; ?>".</p>
<?php else: ?>
<p>Note: If the resulting virtual host config does not reflect the vhost-gen template changes, you will need to restart the Devilbox.</p>
<a href="/vhosts.php"><i class="fa fa-chevron-left" aria-hidden="true"></i> Overview</a><br/>
<br/><h3>virtual host config</h3><br/>
<a title="Virtual host: <?php echo $vhost;?>.conf" target="_blank" href="/vhost.d/<?php echo $vhost;?>.conf">
<i class="fa fa-external-link" aria-hidden="true"></i> <?php echo $vhost;?>.conf
</a>
<br/><br/><h3>vhost-gen config</h3><br/>
<code><?php echo $tpl; ?></code><br/><br/>
<?php $lines = file($tpl); ?>
<pre style="border: 1px solid black; padding:5px;"><code><?php foreach ($lines as $line): ?><?php echo $line; ?><?php endforeach; ?></code></pre>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -0,0 +1,32 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<div class="row">
<div class="col-md-12">
<style>
body {width: 100% !important;}
</style>
<?php if (($version = phpversion('xdebug')) === false): ?>
<p><code>xdebug</code> module is not enabled.</p>
<?php elseif (!function_exists('xdebug_info')): ?>
<p>Xdebug info only available with <code>xdebug 3.x.x</code> or greater. Your version is <code>xdebug <?php echo $version;?></code></p>
<?php else:?>
<?php xdebug_info(); ?>
<?php endif; ?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -0,0 +1,66 @@
<?php require '../config.php'; ?>
<?php
// If login protection is disabled or user has already logged in
if (loadClass('Helper')->isloggedIn()) {
loadClass('Helper')->redirect('/');
}
// Validate $_POST login
$login_error = '';
if (isset($_POST['username']) && isset($_POST['password'])) {
// Auth successful
if (loadClass('Helper')->login($_POST['username'], $_POST['password'])) {
loadClass('Helper')->redirect('/');
}
$login_error = 'Wrong username or password';
}
?>
<!DOCTYPE html>
<html lang="en" style="height: 100%;min-height: 100%;">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body style="height: 100%; min-height: 100%; text-align: center; color: #fff; text-shadow: 0 .05rem .1rem rgba(0,0,0,.5); background: #1f1f1f; margin-bottom:0 !important;">
<div class="site-wrapper">
<div class="site-wrapper-inner">
<div class="cover-container">
<div class="container">
<div class="inner cover">
<img src="/assets/img/banner.png" style="width:60%; padding-bottom:20px;"/>
<h1 class="cover-heading">Devilbox Login</h1>
<div class="text-danger"><?php echo $login_error; ?></div>
<form method="POST">
<div class="form-group row">
<div class="col-sm-12">
<input type="text" class="form-control" id="inputUsername" placeholder="Username" name="username" value="<?php echo isset($_POST['username']) ? $_POST['username'] : ''; ?>">
</div>
</div>
<div class="form-group row">
<div class="col-sm-12">
<input type="password" class="form-control" id="inputPassword" placeholder="Password" name="password">
</div>
</div>
<div class="form-group row">
<div class="col-sm-12">
<button type="submit" class="btn btn-primary">Sign in</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,11 @@
<?php require '../config.php'; ?>
<?php
if (isset($_GET['id'])) {
if ($_GET['id'] == session_id()) {
loadClass('Helper')->logout();
loadClass('Helper')->redirect('/login.php');
}
}
loadClass('Helper')->redirect('/');

View File

@ -1,5 +1,6 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
require '../config.php';
//
// $_POST submit for sending a test email
@ -9,7 +10,7 @@ if (isset($_GET['email']) && isset($_GET['subject']) && isset($_GET['message']))
$subj = $_GET['subject'];
$mess = $_GET['message'];
if (! mail($mail, $subj, $mess)) {
loadClass('Logger')->error('Could not send mail to: '.$mail.' | subject: '.$subject);
loadClass('Logger')->error('Could not send mail to: '.$mail.' | subject: '.$subj);
}
header('Location: /mail.php');
exit();
@ -29,7 +30,7 @@ require $LIB_DIR . DIRECTORY_SEPARATOR . 'Sort.php';
// Sort/Order settings
$defaultSort = array('sort' => 'date', 'order' => 'DESC');
$allowedSorts = array('date', 'subject', 'x-original-to');
$allowedSorts = array('date', 'subject', 'x-original-to', 'from');
$allowedOrders = array('ASC', 'DESC');
$GET_sortKeys = array('sort' => 'sort', 'order' => 'order');
@ -40,6 +41,7 @@ $order = $MySort->getOrder();
// Evaluate Sorters/Orderers
$orderDate = '<a href="/mail.php?sort=date&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
$orderFrom = '<a href="/mail.php?sort=from&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
$orderTo = '<a href="/mail.php?sort=x-original-to&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
$orderSubj = '<a href="/mail.php?sort=subject&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a>';
@ -61,6 +63,12 @@ if ($sort == 'date') {
} else {
$orderTo = '<a href="/mail.php?sort=x-original-to&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-desc" aria-hidden="true"></i>';
}
} else if ($sort == 'from') {
if ($order == 'ASC') {
$orderFrom = '<a href="/mail.php?sort=from&order=DESC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-asc" aria-hidden="true"></i>';
} else {
$orderFrom = '<a href="/mail.php?sort=from&order=ASC"><i class="fa fa-sort" aria-hidden="true"></i></a> <i class="fa fa-sort-alpha-desc" aria-hidden="true"></i>';
}
}
@ -141,6 +149,7 @@ $messages = $MyMbox->get($sortOrderArr);
<tr>
<th>#</th>
<th>Date <?php echo $orderDate;?></th>
<th>From <?php echo $orderFrom;?></th>
<th>To <?php echo $orderTo;?></th>
<th>Subject <?php echo $orderSubj;?></th>
</tr>
@ -148,8 +157,19 @@ $messages = $MyMbox->get($sortOrderArr);
<tbody>
<?php foreach ($messages as $data): ?>
<?php
$message = $data['raw'];
$message = htmlentities($data['raw']);
$structure = $data['decoded'];
$body = null;
if (isset($structure->body)) {
$body = $structure->body;
}
elseif(isset($structure->parts[1]->body)) {
$body = $structure->parts[1]->body;
}
elseif(isset($structure->parts[0]->body)) {
$body = $structure->parts[0]->body;
}
?>
<tr id="<?php echo $data['num'];?>" class="subject">
<td><?php echo $data['num'];?></td>
@ -157,14 +177,25 @@ $messages = $MyMbox->get($sortOrderArr);
<?php echo date('H:i', strtotime($structure->headers['date']));?><br/>
<small><?php echo date('Y-m-d', strtotime($structure->headers['date']));?></small>
</td>
<td><?php echo $structure->headers['x-original-to'];?></td>
<td><?php echo $structure->headers['subject'];?></td>
<td><?php echo htmlentities($structure->headers['from']);?></td>
<td><?php echo htmlentities($structure->headers['x-original-to']);?></td>
<td><?php echo htmlentities($structure->headers['subject']);?></td>
</tr>
<tr></tr>
<tr id="mail-<?php echo $data['num'];?>" style="display:none">
<td></td>
<td colspan="3">
<pre><?php echo $message;?></pre>
<td colspan="4">
<?php if ($body !== null): ?>
<template id="mail-body-<?=$data['num']?>"><?=$body?></template>
<html-email data-template-id="mail-body-<?=$data['num']?>"></html-email>
<?php else: ?>
<div class="alert alert-warning" role="alert">
No valid body found
</div>
<?php endif; ?>
<hr>
<p><a class="btn btn-primary" data-toggle="collapse" href="#email-<?php echo $data['num'];?>" aria-expanded="false" aria-controls="email-<?php echo $data['num'];?>">Raw source</a></p>
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre><?php echo $message;?></pre></div>
</td>
</tr>
<?php endforeach; ?>
@ -182,15 +213,13 @@ $messages = $MyMbox->get($sortOrderArr);
<?php echo loadClass('Html')->getFooter(); ?>
<script>
$(function() {
$('.subject').each(function() {
$(this).click(function() {
var id = ($(this).attr('id'));
$('#mail-'+id).toggle();
})
$('.subject').click(function() {
var id = ($(this).attr('id'));
$('#mail-'+id).toggle();
})
// Handler for .ready() called.
});
</script>
<script src="/assets/js/html-email.js"></script>
</body>
</html>

View File

@ -1,4 +1,5 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
/**
@ -12,6 +13,7 @@
* @license MIT, http://acollington.mit-license.org/
*/
error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE);
/*
* User configuration

View File

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

View File

@ -1,85 +0,0 @@
<?php
$PROCEDURE = $_GET["call"];
page_header(lang('Call') . ": " . h($PROCEDURE), $error);
$routine = routine($PROCEDURE, (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE"));
$in = array();
$out = array();
foreach ($routine["fields"] as $i => $field) {
if (substr($field["inout"], -3) == "OUT") {
$out[$i] = "@" . idf_escape($field["field"]) . " AS " . idf_escape($field["field"]);
}
if (!$field["inout"] || substr($field["inout"], 0, 2) == "IN") {
$in[] = $i;
}
}
if (!$error && $_POST) {
$call = array();
foreach ($routine["fields"] as $key => $field) {
if (in_array($key, $in)) {
$val = process_input($field);
if ($val === false) {
$val = "''";
}
if (isset($out[$key])) {
$connection->query("SET @" . idf_escape($field["field"]) . " = $val");
}
}
$call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val);
}
$query = (isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . table($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, $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)));
}
}
}
?>
<form action="" method="post">
<?php
if ($in) {
echo "<table cellspacing='0'>\n";
foreach ($in as $key) {
$field = $routine["fields"][$key];
$name = $field["field"];
echo "<tr><th>" . $adminer->fieldName($field);
$value = $_POST["fields"][$name];
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";
}
echo "</table>\n";
}
?>
<p>
<input type="submit" value="<?php echo lang('Call'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@ -1,225 +0,0 @@
<?php
$TABLE = $_GET["create"];
$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();
foreach ($referencable_primary as $table_name => $field) {
$foreign_keys[str_replace("`", "``", $table_name) . "`" . str_replace("`", "``", $field["field"])] = $table_name; // not idf_escape() - used in JS
}
$orig_fields = array();
$table_status = array();
if ($TABLE != "") {
$orig_fields = fields($TABLE);
$table_status = table_status($TABLE);
if (!$table_status) {
$error = lang('No tables.');
}
}
$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"]) {
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();
$orig_field = reset($orig_fields);
$after = " FIRST";
foreach ($row["fields"] as $key => $field) {
$foreign_key = $foreign_keys[$field["type"]];
$type_field = ($foreign_key !== null ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
if ($field["field"] != "") {
if (!$field["has_default"]) {
$field["default"] = null;
}
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 ($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"]);
} elseif ($field["orig"] != "") {
$use_all_fields = true;
$fields[] = array($field["orig"]);
}
if ($field["orig"] != "") {
$orig_field = next($orig_fields);
if (!$orig_field) {
$after = "";
}
}
}
$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)"
: ($row["partitions"] ? " PARTITIONS " . (+$row["partitions"]) : "")
);
} elseif (support("partitioning") && preg_match("~partitioned~", $table_status["Create_options"])) {
$partitioning .= "\nREMOVE PARTITIONING";
}
$message = lang('Table has been altered.');
if ($TABLE == "") {
cookie("adminer_engine", $row["Engine"]);
$message = lang('Table has been created.');
}
$name = trim($row["name"]);
queries_redirect(ME . (support("table") ? "table=" : "select=") . urlencode($name), $message, alter_table(
$TABLE,
$name,
($jush == "sqlite" && ($use_all_fields || $foreign) ? $all_fields : $fields),
$foreign,
($row["Comment"] != $table_status["Comment"] ? $row["Comment"] : null),
($row["Engine"] && $row["Engine"] != $table_status["Engine"] ? $row["Engine"] : ""),
($row["Collation"] && $row["Collation"] != $table_status["Collation"] ? $row["Collation"] : ""),
($row["Auto_increment"] != "" ? number($row["Auto_increment"]) : ""),
$partitioning
));
}
}
page_header(($TABLE != "" ? lang('Alter table') : lang('Create table')), $error, array("table" => $TABLE), h($TABLE));
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"] = "";
}
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);
}
}
}
$collations = collations();
$engines = engines();
// case of engine may differ
foreach ($engines as $engine) {
if (!strcasecmp($engine, $row["Engine"])) {
$row["Engine"] = $engine;
break;
}
}
?>
<form action="" method="post" id="form">
<p>
<?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 = ($_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 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="submit" value="<?php echo lang('Save'); ?>">
<?php } ?>
<?php if ($TABLE != "") { ?><input type="submit" name="drop" value="<?php echo lang('Drop'); ?>"<?php echo confirm(); ?>><?php } ?>
<?php
if (support("partitioning")) {
$partition_table = preg_match('~RANGE|LIST~', $row["partition_by"]);
print_fieldset("partition", lang('Partition by'), $row["partition_by"]);
?>
<p>
<?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 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);"' : '') . ' autocapitalize="off">';
echo '<td><input name="partition_values[]" value="' . h($row["partition_values"][$key]) . '">';
}
?>
</table>
</div></fieldset>
<?php
}
?>
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@ -1,79 +0,0 @@
<?php
$row = $_POST;
if ($_POST && !$error && !isset($_POST["add_x"])) { // add is an image and PHP changes add.x to add_x
$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 !== $name) {
// create or rename database
if (DB != "") {
$_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", "", $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, $row["collation"])) {
$success = false;
}
$last = $db;
}
}
restart_session();
set_session("dbs", null);
queries_redirect(ME . "db=" . urlencode($last), lang('Database has been created.'), $success);
}
} else {
// alter database
if (!$row["collation"]) {
redirect(substr(ME, 0, -1));
}
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(), h(DB));
$collations = collations();
$name = DB;
if ($_POST) {
$name = $row["name"];
} elseif (DB != "") {
$row["collation"] = db_collation(DB, $collations);
} elseif ($jush == "sql") {
// propose database name with limited privileges
foreach (get_vals("SHOW GRANTS") as $grant) {
if (preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~', $grant, $match) && $match[1]) {
$name = stripcslashes(idf_unescape("`$match[2]`"));
break;
}
}
}
?>
<form action="" method="post">
<p>
<?php
echo ($_POST["add_x"] || strpos($name, "\n")
? '<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",
)) : "");
?>
<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";
} elseif (!$_POST["add_x"] && $_GET["db"] == "") {
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

@ -1,227 +0,0 @@
<?php
$tables_views = array_merge((array) $_POST["tables"], (array) $_POST["views"]);
if ($tables_views && !$error && !$_POST["search"]) {
$result = true;
$message = "";
if ($jush == "sql" && count($_POST["tables"]) > 1 && ($_POST["drop"] || $_POST["truncate"] || $_POST["copy"])) {
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"]);
}
$message = lang('Tables have been truncated.');
} 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"]);
}
if ($result && $_POST["tables"]) {
$result = drop_tables($_POST["tables"]);
}
$message = lang('Tables have been dropped.');
} 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);
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();
}
}
$doc_link = doc_link(array('sql' => 'show-table-status.html'));
echo "<table cellspacing='0' class='nowrap checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo '<thead><tr class="wrap"><td><input id="check-all" type="checkbox" onclick="formCheck(this, /^(tables|views)\[/);" class="jsonly">';
echo '<th>' . lang('Table');
echo '<td>' . lang('Engine') . doc_link(array('sql' => 'storage-engines.html'));
echo '<td>' . lang('Collation') . doc_link(array('sql' => 'charset-mysql.html'));
echo '<td>' . lang('Data Length') . $doc_link;
echo '<td>' . lang('Index Length') . $doc_link;
echo '<td>' . lang('Data Free') . $doc_link;
echo '<td>' . lang('Auto Increment') . doc_link(array('sql' => 'example-auto-increment.html'));
echo '<td>' . lang('Rows') . $doc_link;
echo (support("comment") ? '<td>' . lang('Comment') . $doc_link : '');
echo "</thead>\n";
$tables = 0;
foreach ($tables_list as $name => $type) {
$view = ($type !== null && !preg_match('~table~i', $type));
$id = h("Table-" . $name);
echo '<tr' . odd() . '><td>' . checkbox(($view ? "views[]" : "tables[]"), $name, in_array($name, $tables_views, true), "", "formUncheck('check-all');", "", $id);
echo '<th>' . (support("table") || support("indexes") ? "<a href='" . h(ME) . "table=" . urlencode($name) . "' title='" . lang('Show structure') . "' id='$id'>" . h($name) . '</a>' : h($name));
if ($view) {
echo '<td colspan="6"><a href="' . h(ME) . "view=" . urlencode($name) . '" title="' . lang('Alter view') . '">' . (preg_match('~materialized~i', $type) ? lang('Materialized view') : lang('View')) . '</a>';
echo '<td align="right"><a href="' . h(ME) . "select=" . urlencode($name) . '" title="' . lang('Select data') . '">?</a>';
} else {
foreach (array(
"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 "<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";
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'") . "> "
: "")))
. "<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 "</form>\n";
echo "<script type='text/javascript'>tableCheck();</script>\n";
}
echo '<p class="links"><a href="' . h(ME) . 'create=">' . lang('Create table') . "</a>\n";
echo (support("view") ? '<a href="' . h(ME) . 'view=">' . lang('Create view') . "</a>\n" : "");
if (support("routine")) {
echo "<h3 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 '<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() ORDER BY sequence_name");
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";
}
}
}

View File

@ -1,10 +0,0 @@
<?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"]));
$select = array(idf_escape($_GET["field"]));
$result = $driver->select($TABLE, $select, array(where($_GET, $fields)), $select);
$row = ($result ? $result->fetch_row() : array());
echo $row[0];
exit; // don't output footer

View File

@ -1,375 +0,0 @@
<?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;
/** Performs query
* @param string
* @param array
* @param string
* @return mixed
*/
function rootQuery($path, $content = array(), $method = 'GET') {
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents($this->_url . '/' . ltrim($path, '/'), false, stream_context_create(array('http' => array(
'method' => $method,
'content' => 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 === null) {
$this->errno = json_last_error();
if (function_exists('json_last_error_msg')) {
$this->error = json_last_error_msg();
} else {
$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
if ($value == $this->errno && preg_match('~^JSON_ERROR_~', $name)) {
$this->error = $name;
break;
}
}
}
}
return $return;
}
/** Performs query relative to actual selected DB
* @param string
* @param array
* @param string
* @return mixed
*/
function query($path, $content = array(), $method = 'GET') {
return $this->rootQuery(($this->_db != "" ? "$this->_db/" : "/") . ltrim($path, '/'), $content, $method);
}
function connect($server, $username, $password) {
preg_match('~^(https?://)?(.*)~', $server, $match);
$this->_url = ($match[1] ? $match[1] : "http://") . "$username:$password@$match[2]/";
$return = $this->query('');
if ($return) {
$this->server_info = $return['version']['number'];
}
return (bool) $return;
}
function select_db($database) {
$this->_db = $database;
return true;
}
function quote($string) {
return $string;
}
}
class Min_Result {
var $num_rows, $_rows;
function __construct($rows) {
$this->num_rows = count($this->_rows);
$this->_rows = $rows;
reset($this->_rows);
}
function fetch_assoc() {
$return = current($this->_rows);
next($this->_rows);
return $return;
}
function fetch_row() {
return array_values($this->fetch_assoc());
}
}
}
class Min_Driver extends Min_SQL {
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer;
$data = array();
$query = "$table/_search";
if ($select != array("*")) {
$data["fields"] = $select;
}
if ($order) {
$sort = array();
foreach ($order as $col) {
$col = preg_replace('~ DESC$~', '', $col, 1, $count);
$sort[] = ($count ? array($col => "desc") : $col);
}
$data["sort"] = $sort;
}
if ($limit) {
$data["size"] = +$limit;
if ($page) {
$data["from"] = ($page * $limit);
}
}
foreach ($where as $val) {
list($col,$op,$val) = explode(" ",$val,3);
if ($col == "_id") {
$data["query"]["ids"]["values"][] = $val;
}
elseif ($col . $val != "") {
$term = array("term" => array(($col != "" ? $col : "_all") => $val));
if ($op == "=") {
$data["query"]["filtered"]["filter"]["and"][] = $term;
} else {
$data["query"]["filtered"]["query"]["bool"]["must"][] = $term;
}
}
}
if ($data["query"] && !$data["query"]["filtered"]["query"] && !$data["query"]["ids"]) {
$data["query"]["filtered"]["query"] = array("match_all" => array());
}
$start = microtime(true);
$search = $this->_conn->query($query, $data);
if ($print) {
echo $adminer->selectQuery("$query: " . print_r($data, true), format_time($start));
}
if (!$search) {
return false;
}
$return = array();
foreach ($search['hits']['hits'] as $hit) {
$row = array();
if ($select == array("*")) {
$row["_id"] = $hit["_id"];
}
$fields = $hit['_source'];
if ($select != array("*")) {
$fields = array();
foreach ($select as $key) {
$fields[$key] = $hit['fields'][$key];
}
}
foreach ($fields as $key => $val) {
if ($data["fields"]) {
$val = $val[0];
}
$row[$key] = (is_array($val) ? json_encode($val) : $val); //! display JSON and others differently
}
$return[] = $row;
}
return new Min_Result($return);
}
}
function 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->rootQuery('_aliases');
if ($return) {
$return = array_keys($return);
sort($return, SORT_STRING);
}
return $return;
}
function collations() {
return array();
}
function db_collation($db, $collations) {
}
function engines() {
return array();
}
function count_tables($databases) {
global $connection;
$return = $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($return[$connection->_db]["mappings"]), 'table');
}
return $return;
}
function table_status($name = "", $fast = false) {
global $connection;
$search = $connection->query("_search?search_type=count", array(
"facets" => array(
"count_by_type" => array(
"terms" => array(
"field" => "_type",
)
)
)
), "POST");
$return = array();
if ($search) {
foreach ($search["facets"]["count_by_type"]["terms"] as $table) {
$return[$table["term"]] = array(
"Name" => $table["term"],
"Engine" => "table",
"Rows" => $table["count"],
);
if ($name != "" && $name == $table["term"]) {
return $return[$name];
}
}
}
return $return;
}
function error() {
global $connection;
return h($connection->error);
}
function information_schema() {
}
function is_view($table_status) {
}
function indexes($table, $connection2 = null) {
return array(
array("type" => "PRIMARY", "columns" => array("_id")),
);
}
function fields($table) {
global $connection;
$result = $connection->query("$table/_mapping");
$return = array();
if ($result) {
$mappings = $result[$table]['properties'];
if (!$mappings) {
$mappings = $result[$connection->_db]['mappings'][$table]['properties'];
}
if ($mappings) {
foreach ($mappings as $name => $field) {
$return[$name] = array(
"field" => $name,
"full_type" => $field["type"],
"type" => $field["type"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
);
if ($field["properties"]) { // only leaf fields can be edited
unset($return[$name]["privileges"]["insert"]);
unset($return[$name]["privileges"]["update"]);
}
}
}
}
return $return;
}
function foreign_keys($table) {
return array();
}
function table($idf) {
return $idf;
}
function idf_escape($idf) {
return $idf;
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function fk_support($table_status) {
}
function found_rows($table_status, $where) {
return null;
}
/** Create database
* @param string
* @return mixed
*/
function create_database($db) {
global $connection;
return $connection->rootQuery(urlencode($db), array(), 'PUT');
}
/** Drop databases
* @param array
* @return mixed
*/
function drop_databases($databases) {
global $connection;
return $connection->rootQuery(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

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

View File

@ -1,357 +0,0 @@
<?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, $last_id, $_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 __construct($result) {
foreach ($result as $item) {
$row = array();
foreach ($item as $key => $val) {
if (is_a($val, 'MongoBinData')) {
$this->_charset[$key] = 63;
}
$row[$key] =
(is_a($val, 'MongoId') ? 'ObjectId("' . strval($val) . '")' :
(is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
(is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
(is_a($val, 'MongoRegex') ? strval($val) :
(is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
$val
)))));
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = count($this->_rows);
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
$name = $keys[$this->_offset++];
return (object) array(
'name' => $name,
'charsetnr' => $this->_charset[$name],
);
}
}
}
class Min_Driver extends Min_SQL {
public $primary = "_id";
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
$select = ($select == array("*")
? array()
: array_fill_keys($select, true)
);
$sort = array();
foreach ($order as $val) {
$val = preg_replace('~ DESC$~', '', $val, 1, $count);
$sort[$val] = ($count ? -1 : 1);
}
return new Min_Result($this->_conn->_db->selectCollection($table)
->find(array(), $select)
->sort($sort)
->limit(+$limit)
->skip($page * $limit)
);
}
function insert($table, $set) {
try {
$return = $this->_conn->_db->selectCollection($table)->insert($set);
$this->_conn->errno = $return['code'];
$this->_conn->error = $return['err'];
$this->_conn->last_id = $set['_id'];
return !$return['err'];
} catch (Exception $ex) {
$this->_conn->error = $ex->getMessage();
return false;
}
}
}
function 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"]),
"lengths" => array(),
"descs" => $descs,
);
}
return $return;
}
function fields($table) {
return fields_from_edit();
}
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 alter_indexes($table, $alter) {
global $connection;
foreach ($alter as $val) {
list($type, $name, $set) = $val;
if ($set == "DROP") {
$return = $connection->_db->command(array("deleteIndexes" => $table, "index" => $name));
} else {
$columns = array();
foreach ($set as $column) {
$column = preg_replace('~ DESC$~', '', $column, 1, $count);
$columns[$column] = ($count ? -1 : 1);
}
$return = $connection->_db->selectCollection($table)->ensureIndex($columns, array(
"unique" => ($type == "UNIQUE"),
"name" => $name,
//! "sparse"
));
}
if ($return['errmsg']) {
$connection->error = $return['errmsg'];
return false;
}
}
return true;
}
function last_id() {
global $connection;
return $connection->last_id;
}
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

@ -1,654 +0,0 @@
<?php
/**
* @author Jakub Cernohuby
* @author Vladimir Stastka
* @author Jakub Vrana
*/
$drivers["mssql"] = "MS SQL";
if (isset($_GET["mssql"])) {
$possible_drivers = array("SQLSRV", "MSSQL", "PDO_DBLIB");
define("DRIVER", "mssql");
if (extension_loaded("sqlsrv")) {
class Min_DB {
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, "CharacterSet" => "UTF-8"));
if ($this->_link) {
$info = sqlsrv_server_info($this->_link);
$this->server_info = $info['SQLServerVersion'];
} else {
$this->_get_error();
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($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;
}
return $this->store_result($result);
}
function multi_query($query) {
$this->_result = sqlsrv_query($this->_link, $query);
$this->error = "";
if (!$this->_result) {
$this->_get_error();
return false;
}
return true;
}
function store_result($result = null) {
if (!$result) {
$result = $this->_result;
}
if (!$result) {
return false;
}
if (sqlsrv_field_metadata($result)) {
return new Min_Result($result);
}
$this->affected_rows = sqlsrv_rows_affected($result);
return true;
}
function next_result() {
return $this->_result ? sqlsrv_next_result($this->_result) : null;
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
$row = $result->fetch_row();
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
function __construct($result) {
$this->_result = $result;
// $this->num_rows = sqlsrv_num_rows($result); // available only in scrollable results
}
function _convert($row) {
foreach ((array) $row as $key => $val) {
if (is_a($val, 'DateTime')) {
$row[$key] = $val->format("Y-m-d H:i:s");
}
//! stream
}
return $row;
}
function fetch_assoc() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_ASSOC));
}
function fetch_row() {
return $this->_convert(sqlsrv_fetch_array($this->_result, SQLSRV_FETCH_NUMERIC));
}
function fetch_field() {
if (!$this->_fields) {
$this->_fields = sqlsrv_field_metadata($this->_result);
}
$field = $this->_fields[$this->_offset++];
$return = new stdClass;
$return->name = $field["Name"];
$return->orgname = $field["Name"];
$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
}
}
function __destruct() {
sqlsrv_free_stmt($this->_result);
}
}
} elseif (extension_loaded("mssql")) {
class Min_DB {
var $extension = "MSSQL", $_link, $_result, $server_info, $affected_rows, $error;
function connect($server, $username, $password) {
$this->_link = @mssql_connect($server, $username, $password);
if ($this->_link) {
$result = $this->query("SELECT SERVERPROPERTY('ProductLevel'), SERVERPROPERTY('Edition')");
$row = $result->fetch_row();
$this->server_info = $this->result("sp_server_info 2", 2) . " [$row[0]] $row[1]";
} else {
$this->error = mssql_get_last_message();
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
return mssql_select_db($database);
}
function query($query, $unbuffered = false) {
$result = @mssql_query($query, $this->_link); //! $unbuffered
$this->error = "";
if (!$result) {
$this->error = mssql_get_last_message();
return false;
}
if ($result === true) {
$this->affected_rows = mssql_rows_affected($this->_link);
return true;
}
return new Min_Result($result);
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
return mssql_next_result($this->_result->_result);
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!is_object($result)) {
return false;
}
return mssql_result($result->_result, 0, $field);
}
}
class Min_Result {
var $_result, $_offset = 0, $_fields, $num_rows;
function __construct($result) {
$this->_result = $result;
$this->num_rows = mssql_num_rows($result);
}
function fetch_assoc() {
return mssql_fetch_assoc($this->_result);
}
function fetch_row() {
return mssql_fetch_row($this->_result);
}
function num_rows() {
return mssql_num_rows($this->_result);
}
function fetch_field() {
$return = mssql_fetch_field($this->_result);
$return->orgtable = $return->table;
$return->orgname = $return->name;
return $return;
}
function seek($offset) {
mssql_data_seek($this->_result, $offset);
}
function __destruct() {
mssql_free_result($this->_result);
}
}
} elseif (extension_loaded("pdo_dblib")) {
class Min_DB extends Min_PDO {
var $extension = "PDO_DBLIB";
function connect($server, $username, $password) {
$this->dsn("dblib:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), $username, $password);
return true;
}
function select_db($database) {
// database selection is separated from the connection so dbname in DSN can't be used
return $this->query("USE " . idf_escape($database));
}
}
}
class Min_Driver extends Min_SQL {
function insertUpdate($table, $rows, $primary) {
foreach ($rows as $set) {
$update = array();
$where = array();
foreach ($set as $key => $val) {
$update[] = "$key = $val";
if (isset($primary[idf_unescape($key)])) {
$where[] = "$key = $val";
}
}
//! can use only one query for all rows
if (!queries("MERGE " . table($table) . " USING (VALUES(" . implode(", ", $set) . ")) AS source (c" . implode(", c", range(1, count($set))) . ") ON " . implode(" AND ", $where) //! source, c1 - possible conflict
. " WHEN MATCHED THEN UPDATE SET " . implode(", ", $update)
. " WHEN NOT MATCHED THEN INSERT (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ");" // ; is mandatory
)) {
return false;
}
}
return true;
}
function begin() {
return queries("BEGIN TRANSACTION");
}
}
function idf_escape($idf) {
return "[" . str_replace("]", "]]", $idf) . "]";
}
function table($idf) {
return ($_GET["ns"] != "" ? idf_escape($_GET["ns"]) . "." : "") . idf_escape($idf);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT name FROM sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return ($limit !== null ? " TOP (" . ($limit + $offset) . ")" : "") . " $query$where"; // seek later
}
function limit1($query, $where) {
return limit($query, $where, 1);
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SELECT collation_name FROM sys.databases WHERE name = " . q($db));
}
function engines() {
return array();
}
function logged_user() {
global $connection;
return $connection->result("SELECT SUSER_NAME()");
}
function tables_list() {
return get_key_vals("SELECT name, type_desc FROM sys.all_objects WHERE schema_id = SCHEMA_ID(" . q(get_schema()) . ") AND type IN ('S', 'U', 'V') ORDER BY name");
}
function count_tables($databases) {
global $connection;
$return = array();
foreach ($databases as $db) {
$connection->select_db($db);
$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) : "ORDER BY name")) as $row) {
if ($name != "") {
return $row;
}
$return[$row["Name"]] = $row;
}
return $return;
}
function is_view($table_status) {
return $table_status["Engine"] == "VIEW";
}
function fk_support($table_status) {
return true;
}
function fields($table) {
$return = array();
foreach (get_rows("SELECT c.*, t.name type, d.definition [default]
FROM sys.all_columns c
JOIN sys.all_objects o ON c.object_id = o.object_id
JOIN sys.types t ON c.user_type_id = t.user_type_id
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 = (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)" : ""),
"type" => $type,
"length" => $length,
"default" => $row["default"],
"null" => $row["is_nullable"],
"auto_increment" => $row["is_identity"],
"collation" => $row["collation_name"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
"primary" => $row["is_identity"], //! or indexes.is_primary_key
);
}
return $return;
}
function indexes($table, $connection2 = null) {
$return = array();
// sp_statistics doesn't return information about primary key
foreach (get_rows("SELECT i.name, key_ordinal, is_unique, is_primary_key, c.name AS column_name, 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) {
$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))));
}
function collations() {
$return = array();
foreach (get_vals("SELECT name FROM fn_helpcollations()") as $collation) {
$return[preg_replace('~_.*~', '', $collation)][] = $collation;
}
return $return;
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return nl_br(h(preg_replace('~^(\\[[^]]*])+~m', '', $connection->error)));
}
function create_database($db, $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 (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"] != "" ? "(" . number($_POST["Auto_increment"]) . ",1)" : "") . " PRIMARY KEY";
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$alter = array();
foreach ($fields as $field) {
$column = idf_escape($field[0]);
$val = $field[1];
if (!$val) {
$alter["DROP"][] = " COLUMN $column";
} else {
$val[1] = preg_replace("~( COLLATE )'(\\w+)'~", "\\1\\2", $val[1]);
if ($field[0] == "") {
$alter["ADD"][] = "\n " . implode("", $val) . ($table == "" ? substr($foreign[$val[0]], 16 + strlen($val[0])) : ""); // 16 - strlen(" FOREIGN KEY ()")
} else {
unset($val[6]); //! identity can't be removed
if ($column != $val[0]) {
queries("EXEC sp_rename " . q(table($table) . ".$column") . ", " . q(idf_unescape($val[0])) . ", 'COLUMN'");
}
$alter["ALTER COLUMN " . implode("", $val)][] = "";
}
}
}
if ($table == "") {
return queries("CREATE TABLE " . table($name) . " (" . implode(",", (array) $alter["ADD"]) . "\n)");
}
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;
}
}
return true;
}
function alter_indexes($table, $alter) {
$index = array();
$drop = array();
foreach ($alter as $val) {
if ($val[2] == "DROP") {
if ($val[0] == "PRIMARY") { //! sometimes used also for UNIQUE
$drop[] = idf_escape($val[1]);
} else {
$index[] = idf_escape($val[1]) . " ON " . table($table);
}
} elseif (!queries(($val[0] != "PRIMARY"
? "CREATE $val[0] " . ($val[0] != "INDEX" ? "INDEX " : "") . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table)
: "ALTER TABLE " . table($table) . " ADD PRIMARY KEY"
) . " (" . implode(", ", $val[2]) . ")")) {
return false;
}
}
return (!$index || queries("DROP INDEX " . implode(", ", $index)))
&& (!$drop || queries("ALTER TABLE " . table($table) . " DROP " . implode(", ", $drop)))
;
}
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) {
$foreign_key = &$return[$row["FK_NAME"]];
$foreign_key["table"] = $row["PKTABLE_NAME"];
$foreign_key["source"][] = $row["FKCOLUMN_NAME"];
$foreign_key["target"][] = $row["PKCOLUMN_NAME"];
}
return $return;
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
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) {
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],
c.text
FROM sysobjects s
JOIN syscomments c ON s.id = c.id
WHERE s.xtype = 'TR' AND s.name = " . q($name)
); // triggers are not schema-scoped
$return = reset($rows);
if ($return) {
$return["Statement"] = preg_replace('~^.+\\s+AS\\s+~isU', '', $return["text"]); //! identifiers, comments
}
return $return;
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT sys1.name,
CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE' WHEN OBJECTPROPERTY(sys1.id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' END [Event],
CASE WHEN OBJECTPROPERTY(sys1.id, 'ExecIsInsteadOfTrigger') = 1 THEN 'INSTEAD OF' ELSE 'AFTER' END [Timing]
FROM sysobjects sys1
JOIN sysobjects sys2 ON sys1.parent_obj = sys2.id
WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
) as $row) { // triggers are not schema-scoped
$return[$row["name"]] = array($row["Timing"], $row["Event"]);
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("AFTER", "INSTEAD OF"),
"Event" => array("INSERT", "UPDATE", "DELETE"),
"Type" => array("AS"),
);
}
function schemas() {
return get_vals("SELECT name FROM sys.schemas");
}
function get_schema() {
global $connection;
if ($_GET["ns"] != "") {
return $_GET["ns"];
}
return $connection->result("SELECT SCHEMA_NAME()");
}
function set_schema($schema) {
return true; // ALTER USER is permanent
}
function use_sql($database) {
return "USE " . idf_escape($database);
}
function show_variables() {
return array();
}
function show_status() {
return array();
}
function convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
return preg_match('~^(columns|database|drop_col|indexes|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
}
$jush = "mssql";
$types = array();
$structured_types = array();
foreach (array( //! use sys.types
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
$functions = array("len", "lower", "round", "upper");
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
$edit_functions = array(
array(
"date|time" => "getdate",
), array(
"int|decimal|real|float|money|datetime" => "+/-",
"char|text" => "+",
)
);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,430 +0,0 @@
<?php
$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, $errno, $error;
function _error($errno, $error) {
if (ini_bool("html_errors")) {
$error = html_entity_decode(strip_tags($error));
}
$error = preg_replace('~^[^:]*: ~', '', $error);
$this->error = $error;
}
function connect($server, $username, $password) {
$this->_link = @oci_new_connect($username, $password, $server, "AL32UTF8");
if ($this->_link) {
$this->server_info = oci_server_version($this->_link);
return true;
}
$error = oci_error();
$this->error = $error["message"];
return false;
}
function quote($string) {
return "'" . str_replace("'", "''", $string) . "'";
}
function select_db($database) {
return true;
}
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;
}
set_error_handler(array($this, '_error'));
$return = @oci_execute($result);
restore_error_handler();
if ($return) {
if (oci_num_fields($result)) {
return new Min_Result($result);
}
$this->affected_rows = oci_num_rows($result);
}
return $return;
}
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)) {
return false;
}
return oci_result($result->_result, $field);
}
}
class Min_Result {
var $_result, $_offset = 1, $num_rows;
function __construct($result) {
$this->_result = $result;
}
function _convert($row) {
foreach ((array) $row as $key => $val) {
if (is_a($val, 'OCI-Lob')) {
$row[$key] = $val->load();
}
}
return $row;
}
function fetch_assoc() {
return $this->_convert(oci_fetch_assoc($this->_result));
}
function fetch_row() {
return $this->_convert(oci_fetch_row($this->_result));
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
$return->name = oci_field_name($this->_result, $column);
$return->orgname = $return->name;
$return->type = oci_field_type($this->_result, $column);
$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) . '"';
}
function table($idf) {
return idf_escape($idf);
}
function connect() {
global $adminer;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT tablespace_name FROM user_tablespaces");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
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) {
return " $query$where";
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'"); //! respect $db
}
function engines() {
return array();
}
function logged_user() {
global $connection;
return $connection->result("SELECT USER FROM DUAL");
}
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
ORDER BY 1"
); //! views don't have schema
}
function count_tables($databases) {
return array();
}
function table_status($name = "") {
$return = array();
$search = q($name);
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") . "
ORDER BY 1"
) as $row) {
if ($name != "") {
return $row;
}
$return[$row["Name"]] = $row;
}
return $return;
}
function is_view($table_status) {
return $table_status["Engine"] == "view";
}
function fk_support($table_status) {
return true;
}
function fields($table) {
$return = array();
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . " ORDER BY column_id") as $row) {
$type = $row["DATA_TYPE"];
$length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
if ($length == ",") {
$length = $row["DATA_LENGTH"];
} //! int
$return[$row["COLUMN_NAME"]] = array(
"field" => $row["COLUMN_NAME"],
"full_type" => $type . ($length ? "($length)" : ""),
"type" => strtolower($type),
"length" => $length,
"default" => $row["DATA_DEFAULT"],
"null" => ($row["NULLABLE"] == "Y"),
//! "auto_increment" => false,
//! "collation" => $row["CHARACTER_SET_NAME"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
//! "comment" => $row["Comment"],
//! "primary" => ($row["Key"] == "PRI"),
);
}
return $return;
}
function indexes($table, $connection2 = null) {
$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(); //!
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return h($connection->error); //! highlight sqltext from offset
}
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) {
$val = $field[1];
if ($val && $field[0] != "" && idf_escape($field[0]) != $val[0]) {
queries("ALTER TABLE " . table($table) . " RENAME COLUMN " . idf_escape($field[0]) . " TO $val[0]");
}
if ($val) {
$alter[] = ($table != "" ? ($field[0] != "" ? "MODIFY (" : "ADD (") : " ") . implode($val) . ($table != "" ? ")" : ""); //! error with name change only
} else {
$drop[] = idf_escape($field[0]);
}
}
if ($table == "") {
return queries("CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)");
}
return (!$alter || queries("ALTER TABLE " . table($table) . "\n" . implode("\n", $alter)))
&& (!$drop || queries("ALTER TABLE " . table($table) . " DROP (" . implode(", ", $drop) . ")"))
&& ($table == $name || queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name)))
;
}
function foreign_keys($table) {
$return = array();
$query = "SELECT c_list.CONSTRAINT_NAME as NAME,
c_src.COLUMN_NAME as SRC_COLUMN,
c_dest.OWNER as DEST_DB,
c_dest.TABLE_NAME as DEST_TABLE,
c_dest.COLUMN_NAME as DEST_COLUMN,
c_list.DELETE_RULE as ON_DELETE
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
AND c_list.CONSTRAINT_TYPE = 'R'
AND c_src.TABLE_NAME = " . q($table);
foreach (get_rows($query) as $row) {
$return[$row['NAME']] = array(
"db" => $row['DEST_DB'],
"table" => $row['DEST_TABLE'],
"source" => array($row['SRC_COLUMN']),
"target" => array($row['DEST_COLUMN']),
"on_delete" => $row['ON_DELETE'],
"on_update" => null,
);
}
return $return;
}
function truncate_tables($tables) {
return apply_queries("TRUNCATE TABLE", $tables);
}
function drop_views($views) {
return apply_queries("DROP VIEW", $views);
}
function drop_tables($tables) {
return apply_queries("DROP TABLE", $tables);
}
function last_id() {
return 0; //!
}
function schemas() {
return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
}
function get_schema() {
global $connection;
return $connection->result("SELECT sys_context('USERENV', 'SESSION_USER') FROM dual");
}
function set_schema($scheme) {
global $connection;
return $connection->query("ALTER SESSION SET CURRENT_SCHEMA = " . idf_escape($scheme));
}
function show_variables() {
return get_key_vals('SELECT name, display_value FROM v$parameter');
}
function process_list() {
return get_rows('SELECT sess.process AS "process", sess.username AS "user", sess.schemaname AS "schema", sess.status AS "status", sess.wait_class AS "wait_class", sess.seconds_in_wait AS "seconds_in_wait", sql.sql_text AS "sql_text", sess.machine AS "machine", sess.port AS "port"
FROM v$session sess LEFT OUTER JOIN v$sql sql
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 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();
foreach (array(
lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
) as $key => $val) {
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$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(
array( //! no parentheses
"date" => "current_date",
"timestamp" => "current_timestamp",
), array(
"number|float|double" => "+/-",
"date|timestamp" => "+ interval/- interval",
"char|clob" => "||",
)
);
}

View File

@ -1,794 +0,0 @@
<?php
$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 = 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 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 dbname='postgres'", PGSQL_CONNECT_FORCE_NEW);
}
restore_error_handler();
if ($this->_link) {
$version = pg_version($this->_link);
$this->server_info = $version["server"];
pg_set_client_encoding($this->_link, "UTF8");
}
return (bool) $this->_link;
}
function quote($string) {
return "'" . pg_escape_string($this->_link, $string) . "'"; //! bytea
}
function select_db($database) {
global $adminer;
if ($database == $adminer->database()) {
return $this->_database;
}
$return = @pg_connect("$this->_string dbname='" . addcslashes($database, "'\\") . "'", PGSQL_CONNECT_FORCE_NEW);
if ($return) {
$this->_link = $return;
}
return $return;
}
function close() {
$this->_link = @pg_connect("$this->_string dbname='postgres'");
}
function query($query, $unbuffered = false) {
$result = @pg_query($this->_link, $query);
$this->error = "";
if (!$result) {
$this->error = pg_last_error($this->_link);
return false;
} elseif (!pg_num_fields($result)) {
$this->affected_rows = pg_affected_rows($result);
return true;
}
return new Min_Result($result);
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function store_result() {
return $this->_result;
}
function next_result() {
// PgSQL extension doesn't support multiple results
return false;
}
function result($query, $field = 0) {
$result = $this->query($query);
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 __construct($result) {
$this->_result = $result;
$this->num_rows = pg_num_rows($result);
}
function fetch_assoc() {
return pg_fetch_assoc($this->_result);
}
function fetch_row() {
return pg_fetch_row($this->_result);
}
function fetch_field() {
$column = $this->_offset++;
$return = new stdClass;
if (function_exists('pg_field_table')) {
$return->orgtable = pg_field_table($this->_result, $column);
}
$return->name = pg_field_name($this->_result, $column);
$return->orgname = $return->name;
$return->type = pg_field_type($this->_result, $column);
$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 dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password);
//! connect without DB in case of an error
return true;
}
function select_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) . '"';
}
function table($idf) {
return idf_escape($idf);
}
function connect() {
global $adminer, $types, $structured_types;
$connection = new Min_DB;
$credentials = $adminer->credentials();
if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
if ($connection->server_info >= 9) {
$connection->query("SET application_name = 'Adminer'");
if ($connection->server_info >= 9.2) {
$structured_types[lang('Strings')][] = "json";
$types["json"] = 4294967295;
if ($connection->server_info >= 9.4) {
$structured_types[lang('Strings')][] = "jsonb";
$types["jsonb"] = 4294967295;
}
}
}
return $connection;
}
return $connection->error;
}
function get_databases() {
return get_vals("SELECT datname FROM pg_database WHERE has_database_privilege(datname, 'CONNECT') ORDER BY datname");
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
return " $query$where";
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("SHOW LC_COLLATE"); //! respect $db
}
function engines() {
return array();
}
function logged_user() {
global $connection;
return $connection->result("SELECT user");
}
function tables_list() {
$query = "SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema()";
if (support('materializedview')) {
$query .= "
UNION ALL
SELECT matviewname, 'MATERIALIZED VIEW'
FROM pg_matviews
WHERE schemaname = current_schema()";
}
$query .= "
ORDER BY 1";
return get_key_vals($query);
}
function count_tables($databases) {
return array(); // would require reconnect
}
function table_status($name = "") {
$return = array();
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", c.relhasoids::int AS \"Oid\", c.reltuples as \"Rows\", n.nspname
FROM pg_class c
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
WHERE relkind IN ('r', 'm', 'v')
" . ($name != "" ? "AND relname = " . q($name) : "ORDER BY c.oid")
) as $row) { //! Index_length, Auto_increment
$return[$row["Name"]] = $row;
}
return ($name != "" ? $return[$name] : $return);
}
function is_view($table_status) {
return in_array($table_status["Engine"], array("view", "materialized view"));
}
function fk_support($table_status) {
return true;
}
function fields($table) {
$return = array();
$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
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
AND a.attnum > 0
ORDER BY a.attnum"
) as $row) {
//! collation, primary
preg_match('~([^([]+)(\((.*)\))?([a-z ]+)?((\[[0-9]*])*)$~', $row["full_type"], $match);
list(, $type, $length, $row["length"], $addon, $array) = $match;
$row["length"] .= $array;
$check_type = $type . $addon;
if (isset($aliases[$check_type])) {
$row["type"] = $aliases[$check_type];
$row["full_type"] = $row["type"] . $length . $array;
} else {
$row["type"] = $type;
$row["full_type"] = $row["type"] . $length . $addon . $array;
}
$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 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::int, indisprimary::int, indkey, indoption , (indpred IS NOT NULL)::int as indispartial FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
$relname = $row["relname"];
$return[$relname]["type"] = ($row["indispartial"] ? "INDEX" : ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX")));
$return[$relname]["columns"] = array();
foreach (explode(" ", $row["indkey"]) as $indkey) {
$return[$relname]["columns"][] = $columns[$indkey];
}
$return[$relname]["descs"] = array();
foreach (explode(" ", $row["indoption"]) as $indoption) {
$return[$relname]["descs"][] = ($indoption & 1 ? '1' : null); // 1 - INDOPTION_DESC
}
$return[$relname]["lengths"] = array();
}
return $return;
}
function foreign_keys($table) {
global $on_actions;
$return = array();
foreach (get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition
FROM pg_constraint
WHERE conrelid = (SELECT pc.oid FROM pg_class AS pc INNER JOIN pg_namespace AS pn ON (pn.oid = pc.relnamespace) WHERE pc.relname = " . q($table) . " AND pn.nspname = current_schema())
AND contype = 'f'::char
ORDER BY conkey, conname") as $row) {
if (preg_match('~FOREIGN KEY\s*\((.+)\)\s*REFERENCES (.+)\((.+)\)(.*)$~iA', $row['definition'], $match)) {
$row['source'] = array_map('trim', explode(',', $match[1]));
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;
}
}
return $return;
}
function view($name) {
global $connection;
return array("select" => trim($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);
if (preg_match('~^(.*\\n)?([^\\n]*)\\n( *)\\^(\\n.*)?$~s', $return, $match)) {
$return = $match[1] . preg_replace('~((?:[^&]|&[^;]*;){' . strlen($match[3]) . '})(.*)~', '\\1<b>\\2</b>', $match[2]) . $match[4];
}
return nl_br($return);
}
function 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();
foreach ($fields as $field) {
$column = idf_escape($field[0]);
$val = $field[1];
if (!$val) {
$alter[] = "DROP $column";
} else {
$val5 = $val[5];
unset($val[5]);
if (isset($val[6]) && $field[0] == "") { // auto_increment
$val[1] = ($val[1] == "bigint" ? " big" : " ") . "serial";
}
if ($field[0] == "") {
$alter[] = ($table != "" ? "ADD " : " ") . implode($val);
} else {
if ($column != $val[0]) {
$queries[] = "ALTER TABLE " . table($table) . " RENAME $column TO $val[0]";
}
$alter[] = "ALTER $column TYPE$val[1]";
if (!$val[6]) {
$alter[] = "ALTER $column " . ($val[3] ? "SET$val[3]" : "DROP DEFAULT");
$alter[] = "ALTER $column " . ($val[2] == " NULL" ? "DROP NOT" : "SET") . $val[2];
}
}
if ($field[0] != "" || $val5 != "") {
$queries[] = "COMMENT ON COLUMN " . table($table) . ".$val[0] IS " . ($val5 != "" ? substr($val5, 9) : "''");
}
}
}
$alter = array_merge($alter, $foreign);
if ($table == "") {
array_unshift($queries, "CREATE TABLE " . table($name) . " (\n" . implode(",\n", $alter) . "\n)");
} elseif ($alter) {
array_unshift($queries, "ALTER TABLE " . table($table) . "\n" . implode(",\n", $alter));
}
if ($table != "" && $table != $name) {
$queries[] = "ALTER TABLE " . table($table) . " RENAME TO " . table($name);
}
if ($table != "" || $comment != "") {
$queries[] = "COMMENT ON TABLE " . table($name) . " IS " . q($comment);
}
if ($auto_increment != "") {
//! $queries[] = "SELECT setval(pg_get_serial_sequence(" . q($name) . ", ), $auto_increment)";
}
foreach ($queries as $query) {
if (!queries($query)) {
return false;
}
}
return true;
}
function alter_indexes($table, $alter) {
$create = array();
$drop = array();
$queries = array();
foreach ($alter as $val) {
if ($val[0] != "INDEX") {
//! descending UNIQUE indexes results in syntax error
$create[] = ($val[2] == "DROP"
? "\nDROP CONSTRAINT " . idf_escape($val[1])
: "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $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) . " (" . implode(", ", $val[2]) . ")";
}
}
if ($create) {
array_unshift($queries, "ALTER TABLE " . table($table) . implode(",", $create));
}
if ($drop) {
array_unshift($queries, "DROP INDEX " . implode(", ", $drop));
}
foreach ($queries as $query) {
if (!queries($query)) {
return false;
}
}
return true;
}
function truncate_tables($tables) {
return queries("TRUNCATE " . implode(", ", array_map('table', $tables)));
return true;
}
function drop_views($views) {
return drop_tables($views);
}
function drop_tables($tables) {
foreach ($tables as $table) {
$status = table_status($table);
if (!queries("DROP " . strtoupper($status["Engine"]) . " " . table($table))) {
return false;
}
}
return true;
}
function move_tables($tables, $views, $target) {
foreach (array_merge($tables, $views) as $table) {
$status = table_status($table);
if (!queries("ALTER " . strtoupper($status["Engine"]) . " " . table($table) . " SET SCHEMA " . idf_escape($target))) {
return false;
}
}
return true;
}
function trigger($name, $table = null) {
if ($name == "") {
return array("Statement" => "EXECUTE PROCEDURE ()");
}
if ($table === null) {
$table = $_GET['trigger'];
}
$rows = get_rows('SELECT t.trigger_name AS "Trigger", t.action_timing AS "Timing", (SELECT STRING_AGG(event_manipulation, \' OR \') FROM information_schema.triggers WHERE event_object_table = t.event_object_table AND trigger_name = t.trigger_name ) AS "Events", t.event_manipulation AS "Event", \'FOR EACH \' || t.action_orientation AS "Type", t.action_statement AS "Statement" FROM information_schema.triggers t WHERE t.event_object_table = ' . q($table) . ' AND t.trigger_name = ' . q($name));
return reset($rows);
}
function triggers($table) {
$return = array();
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
$return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]);
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER"),
"Event" => array("INSERT", "UPDATE", "DELETE"),
"Type" => array("FOR EACH ROW", "FOR EACH STATEMENT"),
);
}
/*
function routine($name, $type) {
//! there can be more functions with the same name differing only in parameters, it must be also passed to DROP FUNCTION
//! no procedures, only functions
//! different syntax of CREATE FUNCTION
$rows = get_rows('SELECT pg_catalog.format_type(p.prorettype, NULL) AS "returns", p.prosrc AS "definition"
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
WHERE n.nspname = current_schema() AND p.proname = ' . q($name));
$rows[0]["fields"] = array(); //!
return $rows[0];
}
*/
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 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
WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())
AND typtype IN ('b','d','e')
AND typelem = 0"
);
}
function schemas() {
return get_vals("SELECT nspname FROM pg_namespace ORDER BY nspname");
}
function get_schema() {
global $connection;
return $connection->result("SELECT current_schema()");
}
function set_schema($schema) {
global $connection, $types, $structured_types;
$return = $connection->query("SET search_path TO " . idf_escape($schema));
foreach (types() as $type) { //! get types from current_schemas('t')
if (!isset($types[$type])) {
$types[$type] = 0;
$structured_types[lang('User types')][] = $type;
}
}
return $return;
}
/** Get SQL command to create table
* @param string
* @param bool
* @return string
*/
function create_sql($table, $auto_increment) {
global $connection;
$return = '';
$return_parts = array();
$sequences = array();
$status = table_status($table);
$fields = fields($table);
$indexes = indexes($table);
ksort($indexes);
$fkeys = foreign_keys($table);
ksort($fkeys);
$triggers = triggers($table);
if (!$status || empty($fields)) {
return false;
}
$return = "CREATE TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " (\n ";
// fields' definitions
foreach ($fields as $field_name => $field) {
$part = idf_escape($field['field']) . ' ' . $field['full_type']
. (is_null($field['default']) ? "" : " DEFAULT $field[default]")
. ($field['attnotnull'] ? " NOT NULL" : "");
$return_parts[] = $part;
// sequences for fields
if (preg_match('~nextval\(\'([^\']+)\'\)~', $field['default'], $matches)) {
$sequence_name = $matches[1];
$sq = reset(get_rows("SELECT * FROM $sequence_name"));
$sequences[] = "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value] START " . ($auto_increment ? $sq['last_value'] : 1) . " CACHE $sq[cache_value];";
}
}
// adding sequences before table definition
if (!empty($sequences)) {
$return = implode("\n\n", $sequences) . "\n\n$return";
}
// primary + unique keys
foreach ($indexes as $index_name => $index) {
switch($index['type']) {
case 'UNIQUE': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " UNIQUE (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
case 'PRIMARY': $return_parts[] = "CONSTRAINT " . idf_escape($index_name) . " PRIMARY KEY (" . implode(', ', array_map('idf_escape', $index['columns'])) . ")"; break;
}
}
// foreign keys
foreach ($fkeys as $fkey_name => $fkey) {
$return_parts[] = "CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition] " . ($fkey['deferrable'] ? 'DEFERRABLE' : 'NOT DEFERRABLE');
}
$return .= implode(",\n ", $return_parts) . "\n) WITH (oids = " . ($status['Oid'] ? 'true' : 'false') . ");";
// "basic" indexes after table definition
foreach ($indexes as $index_name => $index) {
if ($index['type'] == 'INDEX') {
$return .= "\n\nCREATE INDEX " . idf_escape($index_name) . " ON " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " USING btree (" . implode(', ', array_map('idf_escape', $index['columns'])) . ");";
}
}
// coments for table & fields
if ($status['Comment']) {
$return .= "\n\nCOMMENT ON TABLE " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " IS " . q($status['Comment']) . ";";
}
foreach ($fields as $field_name => $field) {
if ($field['comment']) {
$return .= "\n\nCOMMENT ON COLUMN " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . "." . idf_escape($field_name) . " IS " . q($field['comment']) . ";";
}
}
// triggers
foreach ($triggers as $trg_id => $trg) {
$trigger = trigger($trg_id, $status['Name']);
$return .= "\n\nCREATE TRIGGER " . idf_escape($trigger['Trigger']) . " $trigger[Timing] $trigger[Events] ON " . idf_escape($status["nspname"]) . "." . idf_escape($status['Name']) . " $trigger[Type] $trigger[Statement];";
}
return rtrim($return, ';');
}
/** Get SQL commands to create triggers
* @param string
* @param string
* @return string
*/
//@TODO
function trigger_sql($table, $style) {
$return = "";
//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;
return false;
}
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 convert_field($field) {
}
function unconvert_field($field, $return) {
return $return;
}
function support($feature) {
global $connection;
return preg_match('~^(database|table|columns|sql|indexes|comment|view|' . ($connection->server_info >= 9.3 ? 'materializedview|' : '') . 'scheme|processlist|sequence|trigger|type|variables|drop_col|kill|dump)$~', $feature); //! routine|
}
function kill_process($val) {
return queries("SELECT pg_terminate_backend(" . number($val) . ")");
}
function connection_id(){
return "SELECT pg_backend_pid()";
}
function max_connections() {
global $connection;
return $connection->result("SHOW max_connections");
}
$jush = "pgsql";
$types = array();
$structured_types = array();
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, "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),
lang('Geometry') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0),
) as $key => $val) { //! can be retrieved from pg_type
$types += $val;
$structured_types[$key] = array_keys($val);
}
$unsigned = array();
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "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(
array(
"char" => "md5",
"date|time" => "now",
), array(
"int|numeric|real|money" => "+/-",
"date|time" => "+ interval/- interval", //! escape
"char|text" => "||",
)
);
}

View File

@ -1,473 +0,0 @@
<?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 __construct($result) {
foreach ($result as $item) {
$row = array();
if ($item->Name != '') { // SELECT COUNT(*)
$row['itemName()'] = (string) $item->Name;
}
foreach ($item->Attribute as $attribute) {
$name = $this->_processValue($attribute->Name);
$value = $this->_processValue($attribute->Value);
if (isset($row[$name])) {
$row[$name] = (array) $row[$name];
$row[$name][] = $value;
} else {
$row[$name] = $value;
}
}
$this->_rows[] = $row;
foreach ($row as $key => $val) {
if (!isset($this->_rows[0][$key])) {
$this->_rows[0][$key] = null;
}
}
}
$this->num_rows = count($this->_rows);
}
function _processValue($element) {
return (is_object($element) && $element['encoding'] == 'base64' ? base64_decode($element) : (string) $element);
}
function fetch_assoc() {
$row = current($this->_rows);
if (!$row) {
return $row;
}
$return = array();
foreach ($this->_rows[0] as $key => $val) {
$return[$key] = $row[$key];
}
next($this->_rows);
return $return;
}
function fetch_row() {
$return = $this->fetch_assoc();
if (!$return) {
return $return;
}
return array_values($return);
}
function fetch_field() {
$keys = array_keys($this->_rows[0]);
return (object) array('name' => $keys[$this->_offset++]);
}
}
}
class Min_Driver extends Min_SQL {
public $primary = "itemName()";
function _chunkRequest($ids, $action, $params, $expand = array()) {
global $connection;
foreach (array_chunk($ids, 25) as $chunk) {
$params2 = $params;
foreach ($chunk as $i => $id) {
$params2["Item.$i.ItemName"] = $id;
foreach ($expand as $key => $val) {
$params2["Item.$i.$key"] = $val;
}
}
if (!sdb_request($action, $params2)) {
return false;
}
}
$connection->affected_rows = count($ids);
return true;
}
function _extractIds($table, $queryWhere, $limit) {
$return = array();
if (preg_match_all("~itemName\(\) = (('[^']*+')+)~", $queryWhere, $matches)) {
$return = array_map('idf_unescape', $matches[1]);
} else {
foreach (sdb_request_all('Select', 'Item', array('SelectExpression' => 'SELECT itemName() FROM ' . table($table) . $queryWhere . ($limit ? " LIMIT 1" : ""))) as $item) {
$return[] = $item->Name;
}
}
return $return;
}
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $connection;
$connection->next = $_GET["next"];
$return = parent::select($table, $select, $where, $group, $order, $limit, $page, $print);
$connection->next = 0;
return $return;
}
function delete($table, $queryWhere, $limit = 0) {
return $this->_chunkRequest(
$this->_extractIds($table, $queryWhere, $limit),
'BatchDeleteAttributes',
array('DomainName' => $table)
);
}
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
$delete = array();
$insert = array();
$i = 0;
$ids = $this->_extractIds($table, $queryWhere, $limit);
$id = idf_unescape($set["`itemName()`"]);
unset($set["`itemName()`"]);
foreach ($set as $key => $val) {
$key = idf_unescape($key);
if ($val == "NULL" || ($id != "" && array($id) != $ids)) {
$delete["Attribute." . count($delete) . ".Name"] = $key;
}
if ($val != "NULL") {
foreach ((array) $val as $k => $v) {
$insert["Attribute.$i.Name"] = $key;
$insert["Attribute.$i.Value"] = (is_array($val) ? $v : idf_unescape($v));
if (!$k) {
$insert["Attribute.$i.Replace"] = "true";
}
$i++;
}
}
}
$params = array('DomainName' => $table);
return (!$insert || $this->_chunkRequest(($id != "" ? array($id) : $ids), 'BatchPutAttributes', $params, $insert))
&& (!$delete || $this->_chunkRequest($ids, 'BatchDeleteAttributes', $params, $delete))
;
}
function insert($table, $set) {
$params = array("DomainName" => $table);
$i = 0;
foreach ($set as $name => $value) {
if ($value != "NULL") {
$name = idf_unescape($name);
if ($name == "itemName()") {
$params["ItemName"] = idf_unescape($value);
} else {
foreach ((array) $value as $val) {
$params["Attribute.$i.Name"] = $name;
$params["Attribute.$i.Value"] = (is_array($value) ? $val : idf_unescape($value));
$i++;
}
}
}
}
return sdb_request('PutAttributes', $params);
}
function insertUpdate($table, $rows, $primary) {
//! use one batch request
foreach ($rows as $set) {
if (!$this->update($table, $set, "WHERE `itemName()` = " . q($set["`itemName()`"]))) {
return false;
}
}
return true;
}
function begin() {
return false;
}
function commit() {
return false;
}
function rollback() {
return false;
}
}
function 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 fields_from_edit();
}
function foreign_keys($table) {
return array();
}
function table($idf) {
return idf_escape($idf);
}
function idf_escape($idf) {
return "`" . str_replace("`", "``", $idf) . "`";
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" : "");
}
function unconvert_field($field, $return) {
return $return;
}
function fk_support($table_status) {
}
function engines() {
return array();
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
return ($table == "" && sdb_request('CreateDomain', array('DomainName' => $name)));
}
function drop_tables($tables) {
foreach ($tables as $table) {
if (!sdb_request('DeleteDomain', array('DomainName' => $table))) {
return false;
}
}
return true;
}
function count_tables($databases) {
foreach ($databases as $db) {
return array($db => count(tables_list()));
}
}
function found_rows($table_status, $where) {
return ($where ? null : $table_status["Rows"]);
}
function last_id() {
}
function hmac($algo, $data, $key, $raw_output = false) {
// can use hash_hmac() since PHP 5.1.2
$blocksize = 64;
if (strlen($key) > $blocksize) {
$key = pack("H*", $algo($key));
}
$key = str_pad($key, $blocksize, "\0");
$k_ipad = $key ^ str_repeat("\x36", $blocksize);
$k_opad = $key ^ str_repeat("\x5C", $blocksize);
$return = $algo($k_opad . pack("H*", $algo($k_ipad . $data)));
if ($raw_output) {
$return = pack("H*", $return);
}
return $return;
}
function sdb_request($action, $params = array()) {
global $adminer, $connection;
list($host, $params['AWSAccessKeyId'], $secret) = $adminer->credentials();
$params['Action'] = $action;
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s+00:00');
$params['Version'] = '2009-04-15';
$params['SignatureVersion'] = 2;
$params['SignatureMethod'] = 'HmacSHA1';
ksort($params);
$query = '';
foreach ($params as $key => $val) {
$query .= '&' . rawurlencode($key) . '=' . rawurlencode($val);
}
$query = str_replace('%7E', '~', substr($query, 1));
$query .= "&Signature=" . urlencode(base64_encode(hmac('sha1', "POST\n" . preg_replace('~^https?://~', '', $host) . "\n/\n$query", $secret, true)));
@ini_set('track_errors', 1); // @ - may be disabled
$file = @file_get_contents((preg_match('~^https?://~', $host) ? $host : "http://$host"), false, stream_context_create(array('http' => array(
'method' => 'POST', // may not fit in URL with GET
'content' => $query,
'ignore_errors' => 1, // available since PHP 5.2.10
))));
if (!$file) {
$connection->error = $php_errormsg;
return false;
}
libxml_use_internal_errors(true);
$xml = simplexml_load_string($file);
if (!$xml) {
$error = libxml_get_last_error();
$connection->error = $error->message;
return false;
}
if ($xml->Errors) {
$error = $xml->Errors->Error;
$connection->error = "$error->Message ($error->Code)";
return false;
}
$connection->error = '';
$tag = $action . "Result";
return ($xml->$tag ? $xml->$tag : true);
}
function sdb_request_all($action, $tag, $params = array(), $timeout = 0) {
$return = array();
$start = ($timeout ? microtime(true) : 0);
$limit = (preg_match('~LIMIT\s+(\d+)\s*$~i', $params['SelectExpression'], $match) ? $match[1] : 0);
do {
$xml = sdb_request($action, $params);
if (!$xml) {
break;
}
foreach ($xml->$tag as $element) {
$return[] = $element;
}
if ($limit && count($return) >= $limit) {
$_GET["next"] = $xml->NextToken;
break;
}
if ($timeout && microtime(true) - $start > $timeout) {
return false;
}
$params['NextToken'] = $xml->NextToken;
if ($limit) {
$params['SelectExpression'] = preg_replace('~\d+\s*$~', $limit - count($return), $params['SelectExpression']);
}
} while ($xml->NextToken);
return $return;
}
$jush = "simpledb";
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL");
$functions = array();
$grouping = array("count");
$edit_functions = array(array("json"));
}

View File

@ -1,784 +0,0 @@
<?php
$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 (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 __construct($filename) {
$this->_link = new SQLite3($filename);
$version = $this->_link->version();
$this->server_info = $version["versionString"];
}
function query($query) {
$result = @$this->_link->query($query);
$this->error = "";
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 __construct($result) {
$this->_result = $result;
}
function fetch_assoc() {
return $this->_result->fetchArray(SQLITE3_ASSOC);
}
function fetch_row() {
return $this->_result->fetchArray(SQLITE3_NUM);
}
function fetch_field() {
$column = $this->_offset++;
$type = $this->_result->columnType($column);
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 __construct($filename) {
$this->server_info = sqlite_libversion();
$this->_link = new SQLiteDatabase($filename);
}
function query($query, $unbuffered = false) {
$method = ($unbuffered ? "unbufferedQuery" : "query");
$result = @$this->_link->$method($query, SQLITE_BOTH, $error);
$this->error = "";
if (!$result) {
$this->error = $error;
return false;
} elseif ($result === true) {
$this->affected_rows = $this->changes();
return true;
}
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)) {
return false;
}
$row = $result->_result->fetch();
return $row[$field];
}
}
class Min_Result {
var $_result, $_offset = 0, $num_rows;
function __construct($result) {
$this->_result = $result;
if (method_exists($result, 'numRows')) { // not available in unbuffered query
$this->num_rows = $result->numRows();
}
}
function fetch_assoc() {
$row = $this->_result->fetch(SQLITE_ASSOC);
if (!$row) {
return false;
}
$return = array();
foreach ($row as $key => $val) {
$return[($key[0] == '"' ? idf_unescape($key) : $key)] = $val;
}
return $return;
}
function fetch_row() {
return $this->_result->fetch(SQLITE_NUM);
}
function fetch_field() {
$name = $this->_result->fieldName($this->_offset++);
$pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))';
if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) {
$table = ($match[3] != "" ? $match[3] : idf_unescape($match[2]));
$name = ($match[5] != "" ? $match[5] : idf_unescape($match[4]));
}
return (object) array(
"name" => $name,
"orgname" => $name,
"orgtable" => $table,
);
}
}
}
} elseif (extension_loaded("pdo_sqlite")) {
class Min_SQLite extends Min_PDO {
var $extension = "PDO_SQLite";
function __construct($filename) {
$this->dsn(DRIVER . ":$filename", "", "");
}
}
}
if (class_exists("Min_SQLite")) {
class Min_DB extends Min_SQLite {
function __construct() {
parent::__construct(":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
parent::__construct($filename);
return true;
}
return false;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
function next_result() {
return false;
}
}
}
class Min_Driver extends Min_SQL {
function insertUpdate($table, $rows, $primary) {
$values = array();
foreach ($rows as $set) {
$values[] = "(" . implode(", ", $set) . ")";
}
return queries("REPLACE INTO " . table($table) . " (" . implode(", ", array_keys(reset($rows))) . ") VALUES\n" . implode(",\n", $values));
}
}
function idf_escape($idf) {
return '"' . str_replace('"', '""', $idf) . '"';
}
function table($idf) {
return idf_escape($idf);
}
function connect() {
return new Min_DB;
}
function get_databases() {
return array();
}
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
return " $query$where" . ($limit !== null ? $separator . "LIMIT $limit" . ($offset ? " OFFSET $offset" : "") : "");
}
function limit1($query, $where) {
global $connection;
return ($connection->result("SELECT sqlite_compileoption_used('ENABLE_UPDATE_DELETE_LIMIT')") ? limit($query, $where, 1) : " $query$where");
}
function db_collation($db, $collations) {
global $connection;
return $connection->result("PRAGMA encoding"); // there is no database list so $db == DB
}
function engines() {
return array();
}
function logged_user() {
return get_current_user(); // should return effective user
}
function tables_list() {
return get_key_vals("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') ORDER BY (name = 'sqlite_sequence'), name", 1);
}
function count_tables($databases) {
return array();
}
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) : "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) {
$return[$row["name"]]["Auto_increment"] = $row["seq"];
}
return ($name != "" ? $return[$name] : $return);
}
function is_view($table_status) {
return $table_status["Engine"] == "view";
}
function fk_support($table_status) {
global $connection;
return !$connection->result("SELECT sqlite_compileoption_used('OMIT_FOREIGN_KEY')");
}
function fields($table) {
global $connection;
$return = array();
$primary = "";
foreach (get_rows("PRAGMA table_info(" . table($table) . ")") as $row) {
$name = $row["name"];
$type = strtolower($row["type"]);
$default = $row["dflt_value"];
$return[$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" => (preg_match("~'(.*)'~", $default, $match) ? str_replace("''", "'", $match[1]) : ($default == "NULL" ? null : $default)),
"null" => !$row["notnull"],
"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();
$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 (!$return) {
foreach (fields($table) as $name => $field) {
if ($field["primary"]) {
$return[""] = array("type" => "PRIMARY", "columns" => array($name), "lengths" => array(), "descs" => array(null));
}
}
}
$sqls = get_key_vals("SELECT name, sql FROM sqlite_master WHERE type = 'index' AND tbl_name = " . q($table), $connection2);
foreach (get_rows("PRAGMA index_list(" . table($table) . ")", $connection2) as $row) {
$name = $row["name"];
$index = array("type" => ($row["unique"] ? "UNIQUE" : "INDEX"));
$index["lengths"] = array();
$index["descs"] = array();
foreach (get_rows("PRAGMA index_info(" . idf_escape($name) . ")", $connection2) as $row1) {
$index["columns"][] = $row1["name"];
$index["descs"][] = null;
}
if (preg_match('~^CREATE( UNIQUE)? INDEX ' . preg_quote(idf_escape($name) . ' ON ' . idf_escape($table), '~') . ' \((.*)\)$~i', $sqls[$name], $regs)) {
preg_match_all('/("[^"]*+")+( DESC)?/', $regs[2], $matches);
foreach ($matches[2] as $key => $val) {
if ($val) {
$index["descs"][$key] = '1';
}
}
}
if (!$return[""] || $index["type"] != "UNIQUE" || $index["columns"] != $return[""]["columns"] || $index["descs"] != $return[""]["descs"] || !preg_match("~^sqlite_~", $name)) {
$return[$name] = $index;
}
}
return $return;
}
function foreign_keys($table) {
$return = array();
foreach (get_rows("PRAGMA foreign_key_list(" . table($table) . ")") as $row) {
$foreign_key = &$return[$row["id"]];
//! idf_unescape in SQLite2
if (!$foreign_key) {
$foreign_key = $row;
}
$foreign_key["source"][] = $row["from"];
$foreign_key["target"][] = $row["to"];
}
return $return;
}
function view($name) {
global $connection;
return array("select" => preg_replace('~^(?:[^`"[]+|`[^`]*`|"[^"]*")* AS\\s+~iU', '', $connection->result("SELECT sql FROM sqlite_master WHERE name = " . q($name)))); //! identifiers may be inside []
}
function collations() {
return (isset($_GET["create"]) ? get_vals("PRAGMA collation_list", 1) : array());
}
function information_schema($db) {
return false;
}
function error() {
global $connection;
return h($connection->error);
}
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) {
global $connection;
if (file_exists($db)) {
$connection->error = lang('File exists.');
return false;
}
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->__construct(":memory:"); // to unlock file, doesn't work in PDO on Windows
foreach ($databases as $db) {
if (!@unlink($db)) {
$connection->error = lang('File exists.');
return false;
}
}
return true;
}
function rename_database($name, $collation) {
global $connection;
if (!check_sqlite_name($name)) {
return false;
}
$connection->__construct(":memory:");
$connection->error = lang('File exists.');
return @rename(DB, $name);
}
function auto_increment() {
return " PRIMARY KEY" . (DRIVER == "sqlite" ? " AUTOINCREMENT" : "");
}
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
$use_all_fields = ($table == "" || $foreign);
foreach ($fields as $field) {
if ($field[0] != "" || !$field[1] || $field[2]) {
$use_all_fields = true;
break;
}
}
$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;
}
}
if ($table != $name && !queries("ALTER TABLE " . table($table) . " RENAME TO " . table($name))) {
return false;
}
} elseif (!recreate_table($table, $name, $alter, $originals, $foreign)) {
return false;
}
if ($auto_increment) {
queries("UPDATE sqlite_sequence SET seq = $auto_increment WHERE name = " . q($name)); // ignores error
}
return true;
}
function recreate_table($table, $name, $fields, $originals, $foreign, $indexes = array()) {
if ($table != "") {
if (!$fields) {
foreach (fields($table) as $key => $field) {
$fields[] = process_field($field, $field);
$originals[$key] = idf_escape($key);
}
}
$primary_key = false;
foreach ($fields as $field) {
if ($field[6]) {
$primary_key = true;
}
}
$drop_indexes = array();
foreach ($indexes as $key => $val) {
if ($val[2] == "DROP") {
$drop_indexes[$val[1]] = true;
unset($indexes[$key]);
}
}
foreach (indexes($table) as $key_name => $index) {
$columns = array();
foreach ($index["columns"] as $key => $column) {
if (!$originals[$column]) {
continue 2;
}
$columns[] = $originals[$column] . ($index["descs"][$key] ? " DESC" : "");
}
if (!$drop_indexes[$key_name]) {
if ($index["type"] != "PRIMARY" || !$primary_key) {
$indexes[] = array($index["type"], $key_name, $columns);
}
}
}
foreach ($indexes as $key => $val) {
if ($val[0] == "PRIMARY") {
unset($indexes[$key]);
$foreign[] = " PRIMARY KEY (" . implode(", ", $val[2]) . ")";
}
}
foreach (foreign_keys($table) as $key_name => $foreign_key) {
foreach ($foreign_key["source"] as $key => $column) {
if (!$originals[$column]) {
continue 2;
}
$foreign_key["source"][$key] = idf_unescape($originals[$column]);
}
if (!isset($foreign[" $key_name"])) {
$foreign[] = " " . format_foreign_key($foreign_key);
}
}
queries("BEGIN");
}
foreach ($fields as $key => $field) {
$fields[$key] = " " . implode($field);
}
$fields = array_merge($fields, array_filter($foreign));
if (!queries("CREATE TABLE " . table($table != "" ? "adminer_$name" : $name) . " (\n" . implode(",\n", $fields) . "\n)")) {
// implicit ROLLBACK to not overwrite $connection->error
return false;
}
if ($table != "") {
if ($originals && !queries("INSERT INTO " . table("adminer_$name") . " (" . implode(", ", $originals) . ") SELECT " . implode(", ", array_map('idf_escape', array_keys($originals))) . " FROM " . table($table))) {
return false;
}
$triggers = array();
foreach (triggers($table) as $trigger_name => $timing_event) {
$trigger = trigger($trigger_name);
$triggers[] = "CREATE TRIGGER " . idf_escape($trigger_name) . " " . implode(" ", $timing_event) . " ON " . table($name) . "\n$trigger[Statement]";
}
if (!queries("DROP TABLE " . table($table))) { // drop before creating indexes and triggers to allow using old names
return false;
}
queries("ALTER TABLE " . table("adminer_$name") . " RENAME TO " . table($name));
if (!alter_indexes($name, $indexes)) {
return false;
}
foreach ($triggers as $trigger) {
if (!queries($trigger)) {
return false;
}
}
queries("COMMIT");
}
return true;
}
function index_sql($table, $type, $name, $columns) {
return "CREATE $type " . ($type != "INDEX" ? "INDEX " : "")
. idf_escape($name != "" ? $name : uniqid($table . "_"))
. " ON " . table($table)
. " $columns"
;
}
function alter_indexes($table, $alter) {
foreach ($alter as $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], "(" . implode(", ", $val[2]) . ")")
)) {
return false;
}
}
return true;
}
function truncate_tables($tables) {
return apply_queries("DELETE FROM", $tables);
}
function drop_views($views) {
return apply_queries("DROP VIEW", $views);
}
function drop_tables($tables) {
return apply_queries("DROP TABLE", $tables);
}
function move_tables($tables, $views, $target) {
return false;
}
function trigger($name) {
global $connection;
if ($name == "") {
return array("Statement" => "BEGIN\n\t;\nEND");
}
$idf = '(?:[^`"\\s]+|`[^`]*`|"[^"]*")+';
$trigger_options = trigger_options();
preg_match(
"~^CREATE\\s+TRIGGER\\s*$idf\\s*(" . implode("|", $trigger_options["Timing"]) . ")\\s+([a-z]+)(?:\\s+OF\\s+($idf))?\\s+ON\\s*$idf\\s*(?:FOR\\s+EACH\\s+ROW\\s)?(.*)~is",
$connection->result("SELECT sql FROM sqlite_master WHERE type = 'trigger' AND name = " . q($name)),
$match
);
$of = $match[3];
return array(
"Timing" => strtoupper($match[1]),
"Event" => strtoupper($match[2]) . ($of ? " OF" : ""),
"Of" => ($of[0] == '`' || $of[0] == '"' ? idf_unescape($of) : $of),
"Trigger" => $name,
"Statement" => $match[4],
);
}
function triggers($table) {
$return = array();
$trigger_options = trigger_options();
foreach (get_rows("SELECT * FROM sqlite_master WHERE type = 'trigger' AND tbl_name = " . q($table)) as $row) {
preg_match('~^CREATE\\s+TRIGGER\\s*(?:[^`"\\s]+|`[^`]*`|"[^"]*")+\\s*(' . implode("|", $trigger_options["Timing"]) . ')\\s*(.*)\\s+ON\\b~iU', $row["sql"], $match);
$return[$row["name"]] = array($match[1], $match[2]);
}
return $return;
}
function trigger_options() {
return array(
"Timing" => array("BEFORE", "AFTER", "INSTEAD OF"),
"Event" => array("INSERT", "UPDATE", "UPDATE OF", "DELETE"),
"Type" => array("FOR EACH ROW"),
);
}
function routine($name, $type) {
// not supported by SQLite
}
function routines() {
// not supported by SQLite
}
function routine_languages() {
// not supported by SQLite
}
function begin() {
return queries("BEGIN");
}
function last_id() {
global $connection;
return $connection->result("SELECT LAST_INSERT_ROWID()");
}
function explain($connection, $query) {
return $connection->query("EXPLAIN QUERY PLAN $query");
}
function found_rows($table_status, $where) {
}
function types() {
return array();
}
function schemas() {
return array();
}
function get_schema() {
return "";
}
function set_schema($scheme) {
return true;
}
function create_sql($table, $auto_increment) {
global $connection;
$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 tbl_name = " . q($table)));
}
function show_variables() {
global $connection;
$return = array();
foreach (array("auto_vacuum", "cache_size", "count_changes", "default_cache_size", "empty_result_callbacks", "encoding", "foreign_keys", "full_column_names", "fullfsync", "journal_mode", "journal_size_limit", "legacy_file_format", "locking_mode", "page_size", "max_page_count", "read_uncommitted", "recursive_triggers", "reverse_unordered_selects", "secure_delete", "short_column_names", "synchronous", "temp_store", "temp_store_directory", "schema_version", "integrity_check", "quick_check") as $key) {
$return[$key] = $connection->result("PRAGMA $key");
}
return $return;
}
function show_status() {
$return = array();
foreach (get_vals("PRAGMA compile_options") as $option) {
list($key, $val) = explode("=", $option, 2);
$return[$key] = $val;
}
return $return;
}
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", "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(
array(
// "text" => "date('now')/time('now')/datetime('now')",
), array(
"integer|real|numeric" => "+/-",
// "text" => "date/time/datetime",
"text" => "||",
)
);
}

View File

@ -1,220 +0,0 @@
<?php
$TABLE = $_GET["dump"];
if ($_POST && !$error) {
$cookie = "";
foreach (array("output", "format", "db_style", "routines", "events", "table_style", "auto_increment", "triggers", "data_style") as $key) {
$cookie .= "&$key=" . urlencode($_POST[$key]);
}
cookie("adminer_export", substr($cookie, 1));
$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\n\n";
if ($jush == "sql") {
echo "SET NAMES utf8;
SET time_zone = '+00:00';
" . ($_POST["data_style"] ? "SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
" : "") . "
";
$connection->query("SET time_zone = '+00:00';");
}
}
$style = $_POST["db_style"];
$databases = array(DB);
if (DB == "") {
$databases = $_POST["databases"];
if (is_string($databases)) {
$databases = explode("\n", rtrim(str_replace("\r", "", $databases), "\n"));
}
}
foreach ((array) $databases as $db) {
$adminer->dumpDatabase($db);
if ($connection->select_db($db)) {
if ($is_sql && preg_match('~CREATE~', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) {
set_utf8mb4($create);
if ($style == "DROP+CREATE") {
echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n";
}
echo "$create;\n";
}
if ($is_sql) {
if ($style) {
echo use_sql($db) . ";\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) {
$create = remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
}
}
}
if ($_POST["events"]) {
foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) {
$create = remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3));
set_utf8mb4($create);
$out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n";
}
}
if ($out) {
echo "DELIMITER ;;\n\n$out" . "DELIMITER ;\n\n";
}
}
if ($_POST["table_style"] || $_POST["data_style"]) {
$views = array();
foreach (table_status('', 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 ($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) {
$adminer->dumpTable($view, $_POST["table_style"], 1);
}
if ($ext == "tar") {
echo pack("x512");
}
}
}
}
if ($is_sql) {
echo "-- " . $connection->result("SELECT NOW()") . "\n";
}
exit;
}
page_header(lang('Export'), $error, ($_GET["export"] != "" ? array("table" => $_GET["export"]) : array()), h(DB));
?>
<form action="" method="post">
<table cellspacing="0">
<?php
$db_style = array('', 'USE', 'DROP+CREATE', 'CREATE');
$table_style = array('', 'DROP+CREATE', 'CREATE');
$data_style = array('', 'TRUNCATE+INSERT', 'INSERT');
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");
}
if (!isset($row["events"])) { // backwards compatibility
$row["routines"] = $row["events"] = ($_GET["dump"] == "");
$row["triggers"] = $row["table_style"];
}
echo "<tr><th>" . lang('Output') . "<td>" . html_select("output", $adminer->dumpOutput(), $row["output"], 0) . "\n"; // 0 - radio
echo "<tr><th>" . lang('Format') . "<td>" . html_select("format", $adminer->dumpFormat(), $row["format"], 0) . "\n"; // 0 - radio
echo ($jush == "sqlite" ? "" : "<tr><th>" . lang('Database') . "<td>" . html_select('db_style', $db_style, $row["db_style"])
. (support("routine") ? checkbox("routines", 1, $row["routines"], lang('Routines')) : "")
. (support("event") ? checkbox("events", 1, $row["events"], lang('Events')) : "")
);
echo "<tr><th>" . lang('Tables') . "<td>" . html_select('table_style', $table_style, $row["table_style"])
. checkbox("auto_increment", 1, $row["auto_increment"], lang('Auto Increment'))
. (support("trigger") ? checkbox("triggers", 1, $row["triggers"], lang('Triggers')) : "")
;
echo "<tr><th>" . lang('Data') . "<td>" . html_select('data_style', $data_style, $row["data_style"]);
?>
</table>
<p><input type="submit" value="<?php echo lang('Export'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<table cellspacing="0">
<?php
$prefixes = array();
if (DB != "") {
$checked = ($TABLE != "" ? "" : " checked");
echo "<thead><tr>";
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 = "";
$tables_list = tables_list();
foreach ($tables_list as $name => $type) {
$prefix = preg_replace('~_.*~', '', $name);
$checked = ($TABLE == "" || $TABLE == (substr($TABLE, -1) == "%" ? "$prefix%" : $name)); //! % may be part of table name
$print = "<tr><td>" . checkbox("tables[]", $name, $checked, $name, "checkboxClick(event, this); formUncheck('check-tables');", "block");
if ($type !== null && !preg_match('~table~i', $type)) {
$views .= "$print\n";
} else {
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 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 = preg_replace('~_.*~', '', $db);
echo "<tr><td>" . checkbox("databases[]", $db, $TABLE == "" || $TABLE == "$prefix%", $db, "formUncheck('check-databases');", "block") . "\n";
$prefixes[$prefix]++;
}
}
} else {
echo "<tr><td><textarea name='databases' rows='10' cols='20'></textarea>";
}
}
?>
</table>
</form>
<?php
$first = true;
foreach ($prefixes as $key => $val) {
if ($key != "" && $val > 1) {
echo ($first ? "<p>" : " ") . "<a href='" . h(ME) . "dump=" . urlencode("$key%") . "'>" . h($key) . "</a>";
$first = false;
}
}

View File

@ -1,113 +0,0 @@
<?php
$TABLE = $_GET["edit"];
$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 (!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"])) {
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)] = $val;
}
}
if ($update) {
if (!$set) {
redirect($location);
}
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 = $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
}
}
}
$row = null;
if ($_POST["save"]) {
$row = (array) $_POST["fields"];
} elseif ($where) {
$select = array();
foreach ($fields as $name => $field) {
if (isset($field["privileges"]["select"])) {
$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 (!support("table")) {
$select = array("*");
}
if ($select) {
$result = $driver->select($TABLE, $select, array($where), $select, array(), (isset($_GET["select"]) ? 2 : 1));
$row = $result->fetch_assoc();
if (!$row) { // MySQLi returns null
$row = false;
}
if (isset($_GET["select"]) && (!$row || $result->fetch_assoc())) { // $result->num_rows != 1 isn't available in all drivers
$row = null;
}
}
}
if (!support("table") && !$fields) {
if (!$where) { // insert
$result = $driver->select($TABLE, array("*"), $where, array("*"));
$row = ($result ? $result->fetch_assoc() : false);
if (!$row) {
$row = array($driver->primary => "");
}
}
if ($row) {
foreach ($row as $key => $val) {
if (!$where) {
$row[$key] = null;
}
$fields[$key] = array("field" => $key, "null" => ($key != $driver->primary), "auto_increment" => ($key == $driver->primary));
}
}
}
edit_form($TABLE, $fields, $row, $update);

View File

@ -1,52 +0,0 @@
<?php
$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($row["INTERVAL_FIELD"], $intervals) && isset($statuses[$row["STATUS"]])) {
$schedule = "\nON SCHEDULE " . ($row["INTERVAL_VALUE"]
? "EVERY " . q($row["INTERVAL_VALUE"]) . " $row[INTERVAL_FIELD]"
. ($row["STARTS"] ? " STARTS " . q($row["STARTS"]) : "")
. ($row["ENDS"] ? " ENDS " . q($row["ENDS"]) : "") //! ALTER EVENT doesn't drop ENDS - MySQL bug #39173
: "AT " . q($row["STARTS"])
) . " ON COMPLETION" . ($row["ON_COMPLETION"] ? "" : " NOT") . " PRESERVE"
;
queries_redirect(substr(ME, 0, -1), ($EVENT != "" ? lang('Event has been altered.') : lang('Event has been created.')), queries(($EVENT != ""
? "ALTER EVENT " . idf_escape($EVENT) . $schedule
. ($EVENT != $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);
if (!$row && $EVENT != "") {
$rows = get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = " . q(DB) . " AND EVENT_NAME = " . q($EVENT));
$row = reset($rows);
}
?>
<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" 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="submit" value="<?php echo lang('Save'); ?>">
<?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,33 +0,0 @@
<?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");
header("Cache-Control: immutable");
if ($_GET["file"] == "favicon.ico") {
header("Content-Type: image/x-icon");
echo lzw_decompress(compile_file('../adminer/static/favicon.ico', 'lzw_compress'));
} elseif ($_GET["file"] == "default.css") {
header("Content-Type: text/css; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/default.css;../externals/jush/jush.css', 'minify_css'));
} elseif ($_GET["file"] == "functions.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../adminer/static/functions.js;static/editing.js', 'minify_js'));
} elseif ($_GET["file"] == "jush.js") {
header("Content-Type: text/javascript; charset=utf-8");
echo lzw_decompress(compile_file('../externals/jush/modules/jush.js;../externals/jush/modules/jush-textarea.js;../externals/jush/modules/jush-txt.js;../externals/jush/modules/jush-js.js;../externals/jush/modules/jush-sql.js;../externals/jush/modules/jush-pgsql.js;../externals/jush/modules/jush-sqlite.js;../externals/jush/modules/jush-mssql.js;../externals/jush/modules/jush-oracle.js;../externals/jush/modules/jush-simpledb.js', 'minify_js'));
} else {
header("Content-Type: image/gif");
switch ($_GET["file"]) {
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,91 +0,0 @@
<?php
$TABLE = $_GET["foreign"];
$name = $_GET["name"];
$row = $_POST;
if ($_POST && !$error && !$_POST["add"] && !$_POST["change"] && !$_POST["change-js"]) {
$message = ($_POST["drop"] ? lang('Foreign key has been dropped.') : ($name != "" ? lang('Foreign key has been altered.') : lang('Foreign key has been created.')));
$location = ME . "table=" . urlencode($TABLE);
if (!$_POST["drop"]) {
$row["source"] = array_filter($row["source"], 'strlen');
ksort($row["source"]); // enforce input order
$target = array();
foreach ($row["source"] as $key => $val) {
$target[$key] = $row["target"][$key];
}
$row["target"] = $target;
}
if ($jush == "sqlite") {
queries_redirect($location, $message, recreate_table($TABLE, $TABLE, array(), array(), array(" $name" => ($_POST["drop"] ? "" : " " . format_foreign_key($row)))));
} else {
$alter = "ALTER TABLE " . table($TABLE);
$drop = "\nDROP " . ($jush == "sql" ? "FOREIGN KEY " : "CONSTRAINT ") . idf_escape($name);
if ($_POST["drop"]) {
query_redirect($alter . $drop, $location, $message);
} else {
query_redirect($alter . ($name != "" ? "$drop," : "") . "\nADD" . format_foreign_key($row), $location, $message);
$error = lang('Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.') . "<br>$error"; //! no partitioning
}
}
}
page_header(lang('Foreign key'), $error, array("table" => $TABLE), h($TABLE));
if ($_POST) {
ksort($row["source"]);
if ($_POST["add"]) {
$row["source"][] = "";
} elseif ($_POST["change"] || $_POST["change-js"]) {
$row["target"] = array();
}
} elseif ($name != "") {
$foreign_keys = foreign_keys($TABLE);
$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_keys(array_filter(table_status('', true), 'fk_support'));
?>
<form action="" method="post">
<p>
<?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="">
<noscript><p><input type="submit" name="change" value="<?php echo lang('Change'); ?>"></noscript>
<table cellspacing="0">
<thead><tr><th id="label-source"><?php echo lang('Source'); ?><th id="label-target"><?php echo lang('Target'); ?></thead>
<?php
$j = 0;
foreach ($row["source"] as $key => $val) {
echo "<tr>";
echo "<td>" . html_select("source[" . (+$key) . "]", array(-1 => "") + $source, $val, ($j == count($row["source"]) - 1 ? "foreignAddRow(this);" : 1), "label-source");
echo "<td>" . html_select("target[" . (+$key) . "]", $target, $row["target"][$key], 1, "label-target");
$j++;
}
?>
</table>
<p>
<?php echo lang('ON DELETE'); ?>: <?php echo html_select("on_delete", array(-1 => "") + explode("|", $on_actions), $row["on_delete"]); ?>
<?php echo lang('ON UPDATE'); ?>: <?php echo html_select("on_update", array(-1 => "") + explode("|", $on_actions), $row["on_update"]); ?>
<?php echo doc_link(array(
'sql' => "innodb-foreign-key-constraints.html",
'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 ($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,963 +0,0 @@
<?php
// any method change in this file should be transferred to editor/include/adminer.inc.php and plugins/plugin.php
class Adminer {
/** @var array operators used in select, null for all operators */
var $operators;
/** Name in title and navigation
* @return string HTML code
*/
function name() {
return "<a href='https://www.adminer.org/' target='_blank' id='h1'>Adminer</a>";
}
/** Connection parameters
* @return array ($server, $username, $password)
*/
function credentials() {
return array(SERVER, $_GET["username"], get_password());
}
/** Get key used for permanent login
* @param bool
* @return string cryptic string which gets combined with password or false in case of an error
*/
function permanentLogin($create = false) {
return password_file($create);
}
/** Return key used to group brute force attacks; behind a reverse proxy, you want to return the last part of X-Forwarded-For
* @return string
*/
function bruteForceKey() {
return $_SERVER["REMOTE_ADDR"];
}
/** Identifier of selected database
* @return string
*/
function database() {
// should be used everywhere instead of DB
return DB;
}
/** Get cached list of databases
* @param bool
* @return array
*/
function databases($flush = true) {
return get_databases($flush);
}
/** Get list of schemas
* @return array
*/
function schemas() {
return schemas();
}
/** Specify limit for waiting on some slow queries like DB list
* @return float number of seconds
*/
function queryTimeout() {
return 5;
}
/** Headers to send before HTML output
* @return bool true to send security headers
*/
function headers() {
return true;
}
/** Print HTML code inside <head>
* @return bool true to link adminer.css if exists
*/
function head() {
?>
<link rel="stylesheet" type="text/css" href="../externals/jush/jush.css">
<?php
return true;
}
/** Print login form
* @return null
*/
function loginForm() {
global $drivers;
?>
<table cellspacing="0">
<tr><th><?php echo lang('System'); ?><td><?php echo html_select("auth[driver]", $drivers, DRIVER); ?>
<tr><th><?php echo lang('Server'); ?><td><input name="auth[server]" value="<?php echo h(SERVER); ?>" title="hostname[:port]" placeholder="localhost" autocapitalize="off">
<tr><th><?php echo lang('Username'); ?><td><input name="auth[username]" id="username" value="<?php echo h($_GET["username"]); ?>" autocapitalize="off">
<tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
<tr><th><?php echo lang('Database'); ?><td><input name="auth[db]" value="<?php echo h($_GET["db"]); ?>" autocapitalize="off">
</table>
<script type="text/javascript">
focus(document.getElementById('username'));
</script>
<?php
echo "<p><input type='submit' value='" . lang('Login') . "'>\n";
echo checkbox("auth[permanent]", 1, $_COOKIE["adminer_permanent"], lang('Permanent login')) . "\n";
}
/** Authorize the user
* @param string
* @param string
* @return mixed true for success, string for error message, false for unknown error
*/
function login($login, $password) {
global $jush;
if ($jush == "sqlite") {
return lang('<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.', '<code>login()</code>');
}
return true;
}
/** Table caption used in navigation and headings
* @param array result of SHOW TABLE STATUS
* @return string HTML code, "" to ignore table
*/
function tableName($tableStatus) {
return h($tableStatus["Name"]);
}
/** Field caption used in select and edit
* @param array single field returned from fields()
* @param int order of column in select
* @return string HTML code, "" to ignore field
*/
function fieldName($field, $order = 0) {
return '<span title="' . h($field["full_type"]) . '">' . h($field["field"]) . '</span>';
}
/** Print links after select heading
* @param array result of SHOW TABLE STATUS
* @param string new item options, NULL for no new item
* @return null
*/
function selectLinks($tableStatus, $set = "") {
echo '<p class="links">';
$links = array("select" => lang('Select data'));
if (support("table") || support("indexes")) {
$links["table"] = lang('Show structure');
}
if (support("table")) {
if (is_view($tableStatus)) {
$links["view"] = lang('Alter view');
} else {
$links["create"] = lang('Alter table');
}
}
if ($set !== null) {
$links["edit"] = lang('New item');
}
foreach ($links as $key => $val) {
echo " <a href='" . h(ME) . "$key=" . urlencode($tableStatus["Name"]) . ($key == "edit" ? $set : "") . "'" . bold(isset($_GET[$key])) . ">$val</a>";
}
echo "\n";
}
/** Get foreign keys for table
* @param string
* @return array same format as foreign_keys()
*/
function foreignKeys($table) {
return foreign_keys($table);
}
/** Find backward keys for table
* @param string
* @param string
* @return array $return[$target_table]["keys"][$key_name][$target_column] = $source_column; $return[$target_table]["name"] = $this->tableName($target_table);
*/
function backwardKeys($table, $tableName) {
return array();
}
/** Print backward keys for row
* @param array result of $this->backwardKeys()
* @param array
* @return null
*/
function backwardKeysPrint($backwardKeys, $row) {
}
/** Query printed in select before execution
* @param string query to be executed
* @param string elapsed time
* @return string
*/
function selectQuery($query, $time) {
global $jush;
return "<p><code class='jush-$jush'>" . h(str_replace("\n", " ", $query)) . "</code> <span class='time'>($time)</span>"
. (support("sql") ? " <a href='" . h(ME) . "sql=" . urlencode($query) . "'>" . lang('Edit') . "</a>" : "")
. "</p>" // </p> - required for IE9 inline edit
;
}
/** Query printed in SQL command before execution
* @param string query to be executed
* @return string escaped query to be printed
*/
function sqlCommandQuery($query)
{
return shorten_utf8(trim($query), 1000);
}
/** Description of a row in a table
* @param string
* @return string SQL expression, empty string for no description
*/
function rowDescription($table) {
return "";
}
/** Get descriptions of selected data
* @param array all data to print
* @param array
* @return array
*/
function rowDescriptions($rows, $foreignKeys) {
return $rows;
}
/** Get a link to use in select table
* @param string raw value of the field
* @param array single field returned from fields()
* @return string or null to create the default link
*/
function selectLink($val, $field) {
}
/** Value printed in select table
* @param string HTML-escaped value to print
* @param string link to foreign key
* @param array single field returned from fields()
* @param array original value before applying editVal() and escaping
* @return string
*/
function selectVal($val, $link, $field, $original) {
$return = ($val === null ? "<i>NULL</i>" : (preg_match("~char|binary~", $field["type"]) && !preg_match("~var~", $field["type"]) ? "<code>$val</code>" : $val));
if (preg_match('~blob|bytea|raw|file~', $field["type"]) && !is_utf8($val)) {
$return = "<i>" . lang('%d byte(s)', strlen($original)) . "</i>";
}
if (preg_match('~json~', $field["type"])) {
$return = "<code class='jush-js'>$return</code>";
}
return ($link ? "<a href='" . h($link) . "'" . (is_url($link) ? " rel='noreferrer'" : "") . ">$return</a>" : $return);
}
/** Value conversion used in select and edit
* @param string
* @param array single field returned from fields()
* @return string
*/
function editVal($val, $field) {
return $val;
}
/** Print table structure in tabular format
* @param array data about individual fields
* @return null
*/
function tableStructurePrint($fields) {
echo "<table cellspacing='0'>\n";
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><span title='" . h($field["collation"]) . "'>" . h($field["full_type"]) . "</span>";
echo ($field["null"] ? " <i>NULL</i>" : "");
echo ($field["auto_increment"] ? " <i>" . lang('Auto Increment') . "</i>" : "");
echo (isset($field["default"]) ? " <span title='" . lang('Default value') . "'>[<b>" . h($field["default"]) . "</b>]</span>" : "");
echo (support("comment") ? "<td>" . nbsp($field["comment"]) : "");
echo "\n";
}
echo "</table>\n";
}
/** Print list of indexes on table in tabular format
* @param array data about all indexes on a table
* @return null
*/
function tableIndexesPrint($indexes) {
echo "<table cellspacing='0'>\n";
foreach ($indexes as $name => $index) {
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] . ")" : "")
. ($index["descs"][$key] ? " DESC" : "")
;
}
echo "<tr title='" . h($name) . "'><th>$index[type]<td>" . implode(", ", $print) . "\n";
}
echo "</table>\n";
}
/** Print columns box in select
* @param array result of selectColumnsProcess()[0]
* @param array selectable columns
* @return null
*/
function selectColumnsPrint($select, $columns) {
global $functions, $grouping;
print_fieldset("select", lang('Select'), $select);
$i = 0;
$select[""] = array();
foreach ($select as $key => $val) {
$val = $_GET["columns"][$key];
$column = select_input(" name='columns[$i][col]' onchange='" . ($key !== "" ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";'", $columns, $val["col"]);
echo "<div>" . ($functions || $grouping ? "<select name='columns[$i][fun]' onchange='helpClose();" . ($key !== "" ? "" : " this.nextSibling.nextSibling.onchange();") . "'"
. on_help("getTarget(event).value && getTarget(event).value.replace(/ |\$/, '(') + ')'", 1) . ">" . optionlist(array(-1 => "") + array_filter(array(lang('Functions') => $functions, lang('Aggregation') => $grouping)), $val["fun"]) . "</select>"
. "($column)" : $column) . "</div>\n";
$i++;
}
echo "</div></fieldset>\n";
}
/** Print search box in select
* @param array result of selectSearchProcess()
* @param array selectable columns
* @param array
* @return null
*/
function selectSearchPrint($where, $columns, $indexes) {
print_fieldset("search", lang('Search'), $where);
foreach ($indexes as $i => $index) {
if ($index["type"] == "FULLTEXT") {
echo "(<i>" . implode("</i>, <i>", array_map('h', $index["columns"])) . "</i>) AGAINST";
echo " <input type='search' name='fulltext[$i]' value='" . h($_GET["fulltext"][$i]) . "' onchange='selectFieldChange(this.form);'>";
echo checkbox("boolean[$i]", 1, isset($_GET["boolean"][$i]), "BOOL");
echo "<br>\n";
}
}
$_GET["where"] = (array) $_GET["where"];
reset($_GET["where"]);
$change_next = "this.nextSibling.onchange();";
for ($i = 0; $i <= count($_GET["where"]); $i++) {
list(, $val) = each($_GET["where"]);
if (!$val || ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators))) {
echo "<div>" . select_input(" name='where[$i][col]' onchange='$change_next'", $columns, $val["col"], "(" . lang('anywhere') . ")");
echo html_select("where[$i][op]", $this->operators, $val["op"], $change_next);
echo "<input type='search' name='where[$i][val]' value='" . h($val["val"]) . "' onchange='" . ($val ? "selectFieldChange(this.form)" : "selectAddRow(this)") . ";' onkeydown='selectSearchKeydown(this, event);' onsearch='selectSearchSearch(this);'></div>\n";
}
}
echo "</div></fieldset>\n";
}
/** Print order box in select
* @param array result of selectOrderProcess()
* @param array selectable columns
* @param array
* @return null
*/
function selectOrderPrint($order, $columns, $indexes) {
print_fieldset("sort", lang('Sort'), $order);
$i = 0;
foreach ((array) $_GET["order"] as $key => $val) {
if ($val != "") {
echo "<div>" . select_input(" name='order[$i]' onchange='selectFieldChange(this.form);'", $columns, $val);
echo checkbox("desc[$i]", 1, isset($_GET["desc"][$key]), lang('descending')) . "</div>\n";
$i++;
}
}
echo "<div>" . select_input(" name='order[$i]' onchange='selectAddRow(this);'", $columns);
echo checkbox("desc[$i]", 1, false, lang('descending')) . "</div>\n";
echo "</div></fieldset>\n";
}
/** Print limit box in select
* @param string result of selectLimitProcess()
* @return null
*/
function selectLimitPrint($limit) {
echo "<fieldset><legend>" . lang('Limit') . "</legend><div>"; // <div> for easy styling
echo "<input type='number' name='limit' class='size' value='" . h($limit) . "' onchange='selectFieldChange(this.form);'>";
echo "</div></fieldset>\n";
}
/** Print text length box in select
* @param string result of selectLengthProcess()
* @return null
*/
function selectLengthPrint($text_length) {
if ($text_length !== null) {
echo "<fieldset><legend>" . lang('Text length') . "</legend><div>";
echo "<input type='number' name='text_length' class='size' value='" . h($text_length) . "'>";
echo "</div></fieldset>\n";
}
}
/** Print action box in select
* @param array
* @return null
*/
function selectActionPrint($indexes) {
echo "<fieldset><legend>" . lang('Action') . "</legend><div>";
echo "<input type='submit' value='" . lang('Select') . "'>";
echo " <span id='noindex' title='" . lang('Full table scan') . "'></span>";
echo "<script type='text/javascript'>\n";
echo "var indexColumns = ";
$columns = array();
foreach ($indexes as $index) {
$current_key = reset($index["columns"]);
if ($index["type"] != "FULLTEXT" && $current_key) {
$columns[$current_key] = 1;
}
}
$columns[""] = 1;
foreach ($columns as $key => $val) {
json_row($key);
}
echo ";\n";
echo "selectFieldChange(document.getElementById('form'));\n";
echo "</script>\n";
echo "</div></fieldset>\n";
}
/** Print command box in select
* @return bool whether to print default commands
*/
function selectCommandPrint() {
return !information_schema(DB);
}
/** Print import box in select
* @return bool whether to print default import
*/
function selectImportPrint() {
return !information_schema(DB);
}
/** Print extra text in the end of a select form
* @param array fields holding e-mails
* @param array selectable columns
* @return null
*/
function selectEmailPrint($emailFields, $columns) {
}
/** Process columns box in select
* @param array selectable columns
* @param array
* @return array (array(select_expressions), array(group_expressions))
*/
function selectColumnsProcess($columns, $indexes) {
global $functions, $grouping;
$select = array(); // select expressions, empty for *
$group = array(); // expressions without aggregation - will be used for GROUP BY if an aggregation function is used
foreach ((array) $_GET["columns"] as $key => $val) {
if ($val["fun"] == "count" || ($val["col"] != "" && (!$val["fun"] || in_array($val["fun"], $functions) || in_array($val["fun"], $grouping)))) {
$select[$key] = apply_sql_function($val["fun"], ($val["col"] != "" ? idf_escape($val["col"]) : "*"));
if (!in_array($val["fun"], $grouping)) {
$group[] = $select[$key];
}
}
}
return array($select, $group);
}
/** Process search box in select
* @param array
* @param array
* @return array expressions to join by AND
*/
function selectSearchProcess($fields, $indexes) {
global $connection, $jush;
$return = array();
foreach ($indexes as $i => $index) {
if ($index["type"] == "FULLTEXT" && $_GET["fulltext"][$i] != "") {
$return[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST (" . q($_GET["fulltext"][$i]) . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")";
}
}
foreach ((array) $_GET["where"] as $val) {
if ("$val[col]$val[val]" != "" && in_array($val["op"], $this->operators)) {
$cond = " $val[op]";
if (preg_match('~IN$~', $val["op"])) {
$in = process_length($val["val"]);
$cond .= " " . ($in != "" ? $in : "(NULL)");
} elseif ($val["op"] == "SQL") {
$cond = " $val[val]"; // SQL injection
} elseif ($val["op"] == "LIKE %%") {
$cond = " LIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
} elseif ($val["op"] == "ILIKE %%") {
$cond = " ILIKE " . $this->processInput($fields[$val["col"]], "%$val[val]%");
} elseif (!preg_match('~NULL$~', $val["op"])) {
$cond .= " " . $this->processInput($fields[$val["col"]], $val["val"]);
}
if ($val["col"] != "") {
$return[] = idf_escape($val["col"]) . $cond;
} else {
// find anywhere
$cols = array();
foreach ($fields as $name => $field) {
$is_text = preg_match('~char|text|enum|set~', $field["type"]);
if ((is_numeric($val["val"]) || !preg_match('~(^|[^o])int|float|double|decimal|bit~', $field["type"]))
&& (!preg_match("~[\x80-\xFF]~", $val["val"]) || $is_text)
) {
$name = idf_escape($name);
$cols[] = ($jush == "sql" && $is_text && !preg_match("~^utf8_~", $field["collation"]) ? "CONVERT($name USING " . charset($connection) . ")" : $name);
}
}
$return[] = ($cols ? "(" . implode("$cond OR ", $cols) . "$cond)" : "0");
}
}
}
return $return;
}
/** Process order box in select
* @param array
* @param array
* @return array expressions to join by comma
*/
function selectOrderProcess($fields, $indexes) {
$return = array();
foreach ((array) $_GET["order"] as $key => $val) {
if ($val != "") {
$return[] = (preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~', $val) ? $val : idf_escape($val)) //! MS SQL uses []
. (isset($_GET["desc"][$key]) ? " DESC" : "")
;
}
}
return $return;
}
/** Process limit box in select
* @return string expression to use in LIMIT, will be escaped
*/
function selectLimitProcess() {
return (isset($_GET["limit"]) ? $_GET["limit"] : "50");
}
/** Process length box in select
* @return string number of characters to shorten texts, will be escaped
*/
function selectLengthProcess() {
return (isset($_GET["text_length"]) ? $_GET["text_length"] : "100");
}
/** Process extras in select form
* @param array AND conditions
* @param array
* @return bool true if processed, false to process other parts of form
*/
function selectEmailProcess($where, $foreignKeys) {
return false;
}
/** Build SQL query used in select
* @param array result of selectColumnsProcess()[0]
* @param array result of selectSearchProcess()
* @param array result of selectColumnsProcess()[1]
* @param array result of selectOrderProcess()
* @param int result of selectLimitProcess()
* @param int index of page starting at zero
* @return string empty string to use default query
*/
function selectQueryBuild($select, $where, $group, $order, $limit, $page) {
return "";
}
/** Query printed after execution in the message
* @param string executed query
* @param string elapsed time
* @return string
*/
function messageQuery($query, $time) {
global $jush;
restart_session();
$history = &get_session("queries");
$id = "sql-" . count($history[$_GET["db"]]);
if (strlen($query) > 1e6) {
$query = preg_replace('~[\x80-\xFF]+$~', '', substr($query, 0, 1e6)) . "\n..."; // [\x80-\xFF] - valid UTF-8, \n - can end by one-line comment
}
$history[$_GET["db"]][] = array($query, time(), $time); // not DB - $_GET["db"] is changed in database.inc.php //! respect $_GET["ns"]
return " <span class='time'>" . @date("H:i:s") . "</span> <a href='#$id' onclick=\"return !toggle('$id');\">" . lang('SQL command') . "</a>" // @ - time zone may be not set
. "<div id='$id' class='hidden'><pre><code class='jush-$jush'>" . shorten_utf8($query, 1000) . '</code></pre>'
. ($time ? " <span class='time'>($time)</span>" : '')
. (support("sql") ? '<p><a href="' . h(str_replace("db=" . urlencode(DB), "db=" . urlencode($_GET["db"]), ME) . 'sql=&history=' . (count($history[$_GET["db"]]) - 1)) . '">' . lang('Edit') . '</a>' : '')
. '</div>'
;
}
/** Functions displayed in edit form
* @param array single field from fields()
* @return array
*/
function editFunctions($field) {
global $edit_functions;
$return = ($field["null"] ? "NULL/" : "");
foreach ($edit_functions as $key => $functions) {
if (!$key || (!isset($_GET["call"]) && (isset($_GET["select"]) || where($_GET)))) { // relative functions
foreach ($functions as $pattern => $val) {
if (!$pattern || preg_match("~$pattern~", $field["type"])) {
$return .= "/$val";
}
}
if ($key && !preg_match('~set|blob|bytea|raw|file~', $field["type"])) {
$return .= "/SQL";
}
}
}
if ($field["auto_increment"] && !isset($_GET["select"]) && !where($_GET)) {
$return = lang('Auto Increment');
}
return explode("/", $return);
}
/** Get options to display edit field
* @param string table name
* @param array single field from fields()
* @param string attributes to use inside the tag
* @param string
* @return string custom input field or empty string for default
*/
function editInput($table, $field, $attrs, $value) {
if ($field["type"] == "enum") {
return (isset($_GET["select"]) ? "<label><input type='radio'$attrs value='-1' checked><i>" . lang('original') . "</i></label> " : "")
. ($field["null"] ? "<label><input type='radio'$attrs value=''" . ($value !== null || isset($_GET["select"]) ? "" : " checked") . "><i>NULL</i></label> " : "")
. enum_input("radio", $attrs, $field, $value, 0) // 0 - empty
;
}
return "";
}
/** Process sent input
* @param array single field from fields()
* @param string
* @param string
* @return string expression to use in a query
*/
function processInput($field, $value, $function = "") {
if ($function == "SQL") {
return $value; // SQL injection
}
$name = $field["field"];
$return = q($value);
if (preg_match('~^(now|getdate|uuid)$~', $function)) {
$return = "$function()";
} elseif (preg_match('~^current_(date|timestamp)$~', $function)) {
$return = $function;
} elseif (preg_match('~^([+-]|\\|\\|)$~', $function)) {
$return = idf_escape($name) . " $function $return";
} elseif (preg_match('~^[+-] interval$~', $function)) {
$return = idf_escape($name) . " $function " . (preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i", $value) ? $value : $return);
} elseif (preg_match('~^(addtime|subtime|concat)$~', $function)) {
$return = "$function(" . idf_escape($name) . ", $return)";
} elseif (preg_match('~^(md5|sha1|password|encrypt)$~', $function)) {
$return = "$function($return)";
}
return unconvert_field($field, $return);
}
/** Returns export output options
* @return array
*/
function dumpOutput() {
$return = array('text' => lang('open'), 'file' => lang('save'));
if (function_exists('gzencode')) {
$return['gz'] = 'gzip';
}
return $return;
}
/** Returns export format options
* @return array empty to disable export
*/
function dumpFormat() {
return array('sql' => 'SQL', 'csv' => 'CSV,', 'csv;' => 'CSV;', 'tsv' => 'TSV');
}
/** Export database structure
* @param string
* @return null prints data
*/
function dumpDatabase($db) {
}
/** Export table structure
* @param string
* @param string
* @param int 0 table, 1 view, 2 temporary view table
* @return null prints data
*/
function dumpTable($table, $style, $is_view = 0) {
if ($_POST["format"] != "sql") {
echo "\xef\xbb\xbf"; // UTF-8 byte order mark
if ($style) {
dump_csv(array_keys(fields($table)));
}
} else {
if ($is_view == 2) {
$fields = array();
foreach (fields($table) as $name => $field) {
$fields[] = idf_escape($name) . " $field[full_type]";
}
$create = "CREATE TABLE " . table($table) . " (" . implode(", ", $fields) . ")";
} else {
$create = create_sql($table, $_POST["auto_increment"]);
}
set_utf8mb4($create);
if ($style && $create) {
if ($style == "DROP+CREATE" || $is_view == 1) {
echo "DROP " . ($is_view == 2 ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n";
}
if ($is_view == 1) {
$create = remove_definer($create);
}
echo "$create;\n\n";
}
}
}
/** Export table data
* @param string
* @param string
* @param string
* @return null prints data
*/
function dumpData($table, $style, $query) {
global $connection, $jush;
$max_packet = ($jush == "sqlite" ? 0 : 1048576); // default, minimum is 1024
if ($style) {
if ($_POST["format"] == "sql") {
if ($style == "TRUNCATE+INSERT") {
echo truncate_sql($table) . ";\n";
}
$fields = fields($table);
}
$result = $connection->query($query, 1); // 1 - MYSQLI_USE_RESULT //! enum and set as numbers
if ($result) {
$insert = "";
$buffer = "";
$keys = array();
$suffix = "";
$fetch_function = ($table != '' ? 'fetch_assoc' : 'fetch_row');
while ($row = $result->$fetch_function()) {
if (!$keys) {
$values = array();
foreach ($row as $val) {
$field = $result->fetch_field();
$keys[] = $field->name;
$key = idf_escape($field->name);
$values[] = "$key = VALUES($key)";
}
$suffix = ($style == "INSERT+UPDATE" ? "\nON DUPLICATE KEY UPDATE " . implode(", ", $values) : "") . ";\n";
}
if ($_POST["format"] != "sql") {
if ($style == "table") {
dump_csv($keys);
$style = "INSERT";
}
dump_csv($row);
} else {
if (!$insert) {
$insert = "INSERT INTO " . table($table) . " (" . implode(", ", array_map('idf_escape', $keys)) . ") VALUES";
}
foreach ($row as $key => $val) {
$field = $fields[$key];
$row[$key] = ($val !== null
? unconvert_field($field, preg_match('~(^|[^o])int|float|double|decimal~', $field["type"]) && $val != '' ? $val : q($val))
: "NULL"
);
}
$s = ($max_packet ? "\n" : " ") . "(" . implode(",\t", $row) . ")";
if (!$buffer) {
$buffer = $insert . $s;
} elseif (strlen($buffer) + 4 + strlen($s) + strlen($suffix) < $max_packet) { // 4 - length specification
$buffer .= ",$s";
} else {
echo $buffer . $suffix;
$buffer = $insert . $s;
}
}
}
if ($buffer) {
echo $buffer . $suffix;
}
} elseif ($_POST["format"] == "sql") {
echo "-- " . str_replace("\n", " ", $connection->error) . "\n";
}
}
}
/** Set export filename
* @param string
* @return string filename without extension
*/
function dumpFilename($identifier) {
return friendly_url($identifier != "" ? $identifier : (SERVER != "" ? SERVER : "localhost"));
}
/** Send headers for export
* @param string
* @param bool
* @return string extension
*/
function dumpHeaders($identifier, $multi_table = false) {
$output = $_POST["output"];
$ext = (preg_match('~sql~', $_POST["format"]) ? "sql" : ($multi_table ? "tar" : "csv")); // multiple CSV packed to TAR
header("Content-Type: " .
($output == "gz" ? "application/x-gzip" :
($ext == "tar" ? "application/x-tar" :
($ext == "sql" || $output != "file" ? "text/plain" : "text/csv") . "; charset=utf-8"
)));
if ($output == "gz") {
ob_start('ob_gzencode', 1e6);
}
return $ext;
}
/** Print homepage
* @return bool whether to print default homepage
*/
function homepage() {
echo '<p class="links">' . ($_GET["ns"] == "" && support("database") ? '<a href="' . h(ME) . 'database=">' . lang('Alter database') . "</a>\n" : "");
echo (support("scheme") ? "<a href='" . h(ME) . "scheme='>" . ($_GET["ns"] != "" ? lang('Alter schema') : lang('Create schema')) . "</a>\n" : "");
echo ($_GET["ns"] !== "" ? '<a href="' . h(ME) . 'schema=">' . lang('Database schema') . "</a>\n" : "");
echo (support("privileges") ? "<a href='" . h(ME) . "privileges='>" . lang('Privileges') . "</a>\n" : "");
return true;
}
/** Prints navigation after Adminer title
* @param string can be "auth" if there is no database connection, "db" if there is no database selected, "ns" with invalid schema
* @return null
*/
function navigation($missing) {
global $VERSION, $jush, $drivers, $connection;
?>
<h1>
<?php echo $this->name(); ?> <span class="version"><?php echo $VERSION; ?></span>
<a href="https://www.adminer.org/#download" target="_blank" id="version"><?php echo (version_compare($VERSION, $_COOKIE["adminer_version"]) < 0 ? h($_COOKIE["adminer_version"]) : ""); ?></a>
</h1>
<?php
if ($missing == "auth") {
$first = true;
foreach ((array) $_SESSION["pwds"] as $vendor => $servers) {
foreach ($servers as $server => $usernames) {
foreach ($usernames as $username => $password) {
if ($password !== null) {
if ($first) {
echo "<p id='logins' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
$first = false;
}
$dbs = $_SESSION["db"][$vendor][$server][$username];
foreach (($dbs ? array_keys($dbs) : array("")) as $db) {
echo "<a href='" . h(auth_url($vendor, $server, $username, $db)) . "'>($drivers[$vendor]) " . h($username . ($server != "" ? "@$server" : "") . ($db != "" ? " - $db" : "")) . "</a><br>\n";
}
}
}
}
}
} else {
if ($_GET["ns"] !== "" && !$missing && DB != "") {
$connection->select_db(DB);
$tables = table_status('', true);
}
?>
<script type="text/javascript" src="../externals/jush/modules/jush.js"></script>
<script type="text/javascript" src="../externals/jush/modules/jush-textarea.js"></script>
<script type="text/javascript" src="../externals/jush/modules/jush-txt.js"></script>
<script type="text/javascript" src="../externals/jush/modules/jush-js.js"></script>
<?php
if (support("sql")) {
?>
<script type="text/javascript" src="../externals/jush/modules/jush-<?php echo $jush; ?>.js"></script>
<script type="text/javascript">
<?php
if ($tables) {
$links = array();
foreach ($tables as $table => $type) {
$links[] = preg_quote($table, '/');
}
echo "var jushLinks = { $jush: [ '" . js_escape(ME) . (support("table") ? "table=" : "select=") . "\$&', /\\b(" . implode("|", $links) . ")\\b/g ] };\n";
foreach (array("bac", "bra", "sqlite_quo", "mssql_bra") as $val) {
echo "jushLinks.$val = jushLinks.$jush;\n";
}
}
?>
bodyLoad('<?php echo (is_object($connection) ? substr($connection->server_info, 0, 3) : ""); ?>');
</script>
<?php
}
$this->databasesPrint($missing);
if (DB == "" || !$missing) {
echo "<p class='links'>" . (support("sql") ? "<a href='" . h(ME) . "sql='" . bold(isset($_GET["sql"]) && !isset($_GET["import"])) . ">" . lang('SQL command') . "</a>\n<a href='" . h(ME) . "import='" . bold(isset($_GET["import"])) . ">" . lang('Import') . "</a>\n" : "") . "";
if (support("dump")) {
echo "<a href='" . h(ME) . "dump=" . urlencode(isset($_GET["table"]) ? $_GET["table"] : $_GET["select"]) . "' id='dump'" . bold(isset($_GET["dump"])) . ">" . lang('Export') . "</a>\n";
}
}
if ($_GET["ns"] !== "" && !$missing && DB != "") {
echo '<a href="' . h(ME) . 'create="' . bold($_GET["create"] === "") . ">" . lang('Create table') . "</a>\n";
if (!$tables) {
echo "<p class='message'>" . lang('No tables.') . "\n";
} else {
$this->tablesPrint($tables);
}
}
}
}
/** Prints databases list in menu
* @param string
* @return null
*/
function databasesPrint($missing) {
global $adminer, $connection;
$databases = $this->databases();
?>
<form action="">
<p id="dbs">
<?php
hidden_fields_get();
$db_events = " onmousedown='dbMouseDown(event, this);' onchange='dbChange(this);'";
echo "<span title='" . lang('database') . "'>DB</span>: " . ($databases
? "<select name='db'$db_events>" . optionlist(array("" => "") + $databases, DB) . "</select>"
: '<input name="db" value="' . h(DB) . '" autocapitalize="off">'
);
echo "<input type='submit' value='" . lang('Use') . "'" . ($databases ? " class='hidden'" : "") . ">\n";
if ($missing != "db" && DB != "" && $connection->select_db(DB)) {
if (support("scheme")) {
echo "<br>" . lang('Schema') . ": <select name='ns'$db_events>" . optionlist(array("" => "") + $adminer->schemas(), $_GET["ns"]) . "</select>";
if ($_GET["ns"] != "") {
set_schema($_GET["ns"]);
}
}
}
echo (isset($_GET["sql"]) ? '<input type="hidden" name="sql" value="">'
: (isset($_GET["schema"]) ? '<input type="hidden" name="schema" value="">'
: (isset($_GET["dump"]) ? '<input type="hidden" name="dump" value="">'
: (isset($_GET["privileges"]) ? '<input type="hidden" name="privileges" value="">'
: ""))));
echo "</p></form>\n";
}
/** Prints table list in menu
* @param array result of table_status('', true)
* @return null
*/
function tablesPrint($tables) {
echo "<ul id='tables' onmouseover='menuOver(this, event);' onmouseout='menuOut(this);'>\n";
foreach ($tables as $table => $status) {
echo '<li><a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
$name = $this->tableName($status);
echo (support("table") || support("indexes")
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
. " title='" . lang('Show structure') . "'>$name</a>"
: "<span>$name</span>"
) . "\n";
}
echo "</ul>\n";
}
}
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
if ($adminer->operators === null) {
$adminer->operators = $operators;
}

View File

@ -1,203 +0,0 @@
<?php
$connection = '';
$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"]) {
foreach (explode(" ", $_COOKIE["adminer_permanent"]) as $val) {
list($key) = explode(":", $val);
$permanent[$key] = $val;
}
}
function add_invalid_login() {
global $adminer;
$filename = get_temp_dir() . "/adminer.invalid";
$fp = @fopen($filename, "r+"); // @ - may not exist
if (!$fp) { // c+ is available since PHP 5.2.6
$fp = @fopen($filename, "w"); // @ - may not be writable
if (!$fp) {
return;
}
}
flock($fp, LOCK_EX);
$invalids = unserialize(stream_get_contents($fp));
$time = time();
if ($invalids) {
foreach ($invalids as $ip => $val) {
if ($val[0] < $time) {
unset($invalids[$ip]);
}
}
}
$invalid = &$invalids[$adminer->bruteForceKey()];
if (!$invalid) {
$invalid = array($time + 30*60, 0); // active for 30 minutes
}
$invalid[1]++;
$serialized = serialize($invalids);
rewind($fp);
fwrite($fp, $serialized);
ftruncate($fp, strlen($serialized));
flock($fp, LOCK_UN);
fclose($fp);
}
$auth = $_POST["auth"];
if ($auth) {
$invalids = unserialize(@file_get_contents(get_temp_dir() . "/adminer.invalid")); // @ - may not exist
$invalid = $invalids[$adminer->bruteForceKey()];
$next_attempt = ($invalid[1] > 30 ? $invalid[0] - time() : 0); // allow 30 invalid attempts
if ($next_attempt > 0) { //! do the same with permanent login
auth_error(lang('Too many unsuccessful logins, try again in %d minute(s).', ceil($next_attempt / 60)));
}
session_regenerate_id(); // defense against session fixation
$vendor = $auth["driver"];
$server = $auth["server"];
$username = $auth["username"];
$password = (string) $auth["password"];
$db = $auth["db"];
set_password($vendor, $server, $username, $password);
$_SESSION["db"][$vendor][$server][$username][$db] = true;
if ($auth["permanent"]) {
$key = base64_encode($vendor) . "-" . base64_encode($server) . "-" . base64_encode($username) . "-" . base64_encode($db);
$private = $adminer->permanentLogin(true);
$permanent[$key] = "$key:" . base64_encode($private ? encrypt_string($password, $private) : "");
cookie("adminer_permanent", implode(" ", $permanent));
}
if (count($_POST) == 1 // 1 - auth
|| DRIVER != $vendor
|| SERVER != $server
|| $_GET["username"] !== $username // "0" == "00"
|| DB != $db
) {
redirect(auth_url($vendor, $server, $username, $db));
}
} elseif ($_POST["logout"]) {
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", "db", "dbs", "queries") as $key) {
set_session($key, null);
}
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();
foreach ($permanent as $key => $val) {
list(, $cipher) = explode(":", $val);
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));
}
/** Renders an error message and a login form
* @param string plain text
* @return null exits
*/
function auth_error($error) {
global $adminer, $has_token;
$session_name = session_name();
if (isset($_GET["username"])) {
header("HTTP/1.1 403 Forbidden"); // 401 requires sending WWW-Authenticate header
if (($_COOKIE[$session_name] || $_GET[$session_name]) && !$has_token) {
$error = lang('Session expired, please login again.');
} else {
add_invalid_login();
$password = get_password();
if ($password !== null) {
if ($password === false) {
$error .= '<br>' . lang('Master password expired. <a href="https://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();
}
}
if (!$_COOKIE[$session_name] && $_GET[$session_name] && ini_bool("session.use_only_cookies")) {
$error = lang('Session support must be enabled.');
}
$params = session_get_cookie_params();
cookie("adminer_key", ($_COOKIE["adminer_key"] ? $_COOKIE["adminer_key"] : rand_string()), $params["lifetime"]);
page_header(lang('Login'), $error, null);
echo "<form action='' method='post'>\n";
$adminer->loginForm();
echo "<div>";
hidden_fields($_POST, array("auth")); // expired session
echo "</div>\n";
echo "</form>\n";
page_footer("auth");
exit;
}
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();
}
$driver = new Min_Driver($connection);
if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_password())) !== true) {
auth_error((is_string($connection) ? h($connection) : (is_string($login) ? $login : lang('Invalid credentials.'))));
}
if ($auth && $_POST["token"]) {
$_POST["token"] = $token; // reset token after explicit login
}
$error = ''; ///< @var string
if ($_POST) {
if (!verify_token()) {
$ini = "max_input_vars";
$max_vars = ini_get($ini);
if (extension_loaded("suhosin")) {
foreach (array("suhosin.request.max_vars", "suhosin.post.max_vars") as $key) {
$val = ini_get($key);
if ($val && (!$max_vars || $val < $max_vars)) {
$ini = $key;
$max_vars = $val;
}
}
}
$error = (!$_POST["token"] && $max_vars
? lang('Maximum number of allowed fields exceeded. Please increase %s.', "'$ini'")
: lang('Invalid CSRF token. Send the form again.') . ' ' . lang('If you did not send this request from Adminer then close this page.')
);
}
} elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
// posted form with no data means that post_max_size exceeded because Adminer always sends token at least
$error = lang('Too big POST data. Reduce the data or increase the %s configuration directive.', "'post_max_size'");
if (isset($_GET["sql"])) {
$error .= ' ' . lang('You can upload a big SQL file via FTP and import it from server.');
}
}

View File

@ -1,95 +0,0 @@
<?php
error_reporting(6135); // errors and warnings
include "../adminer/include/coverage.inc.php";
// disable filter.default
$filter = !preg_match('~^(unsafe_raw)?$~', ini_get("filter.default"));
if ($filter || ini_get("filter.default_flags")) {
foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $val) {
$unsafe = filter_input_array(constant("INPUT$val"), FILTER_UNSAFE_RAW);
if ($unsafe) {
$$val = $unsafe;
}
}
}
if (function_exists("mb_internal_encoding")) {
mb_internal_encoding("8bit");
}
// used only in compiled file
if (isset($_GET["file"])) {
include "../adminer/file.inc.php";
}
include "../adminer/include/functions.inc.php";
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);
if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
$params[] = true; // HttpOnly
}
call_user_func_array('session_set_cookie_params', $params); // ini_set() may be disabled
session_start();
}
// disable magic quotes to be able to use database escaping function
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/firebird.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() ? SID . '&' : '')
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
. (DB != "" ? 'db=' . urlencode(DB) . '&' . (isset($_GET["ns"]) ? "ns=" . urlencode($_GET["ns"]) . "&" : "") : '')
);
include "../adminer/include/version.inc.php";
include "./include/adminer.inc.php";
include "../adminer/include/design.inc.php";
include "../adminer/include/xxtea.inc.php";
include "../adminer/include/auth.inc.php";
if (!ini_bool("session.use_cookies") || @ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
session_write_close(); // improves concurrency if a user opens several pages at once, may be restarted later
}
include "./include/editing.inc.php";
include "./include/connect.inc.php";
$on_actions = "RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT"; ///< @var string used in foreign_keys()

View File

@ -1,100 +0,0 @@
<?php
function connect_error() {
global $adminer, $connection, $token, $error, $drivers;
if (DB != "") {
header("HTTP/1.1 404 Not Found");
page_header(lang('Database') . ": " . h(DB), lang('Invalid database.'), true);
} else {
if ($_POST["db"] && !$error) {
queries_redirect(substr(ME, 0, -1), lang('Databases have been dropped.'), drop_databases($_POST["db"]));
}
page_header(lang('Select database'), $error, false);
echo "<p class='links'>\n";
foreach (array(
'database' => lang('Create database'),
'privileges' => lang('Privileges'),
'processlist' => lang('Process list'),
'variables' => lang('Variables'),
'status' => lang('Status'),
'replication' => lang('Replication'),
) as $key => $val) {
if (support($key)) {
echo "<a href='" . h(ME) . "$key='>$val</a>\n";
}
}
echo "<p>" . lang('%s version: %s through PHP extension %s', $drivers[DRIVER], "<b>" . h($connection->server_info) . "</b>", "<b>$connection->extension</b>") . "\n";
echo "<p>" . lang('Logged as: %s', "<b>" . h(logged_user()) . "</b>") . "\n";
$databases = $adminer->databases();
if ($databases) {
$scheme = support("scheme");
$collations = collations();
echo "<form action='' method='post'>\n";
echo "<table cellspacing='0' class='checkable' onclick='tableClick(event);' ondblclick='tableClick(event, true);'>\n";
echo "<thead><tr>"
. (support("database") ? "<td>&nbsp;" : "")
. "<th>" . lang('Database') . " - <a href='" . h(ME) . "refresh=1'>" . lang('Refresh') . "</a>"
. "<td>" . lang('Collation')
. "<td>" . lang('Tables')
. "<td>" . lang('Size') . " - <a href='" . h(ME) . "dbsize=1' onclick=\"return !ajaxSetHtml('" . h(js_escape(ME)) . "script=connect');\">" . lang('Compute') . "</a>"
. "</thead>\n"
;
$databases = ($_GET["dbsize"] ? count_tables($databases) : array_flip($databases));
foreach ($databases as $db => $tables) {
$root = h(ME) . "db=" . urlencode($db);
$id = h("Db-" . $db);
echo "<tr" . odd() . ">" . (support("database") ? "<td>" . checkbox("db[]", $db, in_array($db, (array) $_POST["db"]), "", "", "", $id) : "");
echo "<th><a href='$root' id='$db'>" . 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') . "'>" . ($_GET["dbsize"] ? $tables : "?") . "</a>";
echo "<td align='right' id='size-" . h($db) . "'>" . ($_GET["dbsize"] ? db_size($db) : "?");
echo "\n";
}
echo "</table>\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";
}
}
page_footer("db");
}
if (isset($_GET["status"])) {
$_GET["variables"] = $_GET["status"];
}
if (isset($_GET["import"])) {
$_GET["sql"] = $_GET["import"];
}
if (!(DB != "" ? $connection->select_db(DB) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]) || isset($_GET["processlist"]) || isset($_GET["privileges"]) || isset($_GET["user"]) || isset($_GET["replication"]) || 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"] !== "") {
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,18 +0,0 @@
<?php
// coverage is used in tests and removed in compilation
if (extension_loaded("xdebug") && file_exists(sys_get_temp_dir() . "/adminer_coverage.ser")) {
function save_coverage() {
$coverage_filename = sys_get_temp_dir() . "/adminer_coverage.ser";
$coverage = unserialize(file_get_contents($coverage_filename));
foreach (xdebug_get_code_coverage() as $filename => $lines) {
foreach ($lines as $l => $val) {
if (!$coverage[$filename][$l] || $val > 0) {
$coverage[$filename][$l] = $val;
}
}
file_put_contents($coverage_filename, serialize($coverage));
}
}
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
register_shutdown_function('save_coverage');
}

View File

@ -1,140 +0,0 @@
<?php
/** Print HTML header
* @param string used in title, breadcrumb and heading, should be HTML escaped
* @param string
* @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, $VERSION, $adminer, $drivers, $jush;
page_headers();
if (is_ajax() && $error) {
page_messages($error);
exit;
}
$title_all = $title . ($title2 != "" ? ": $title2" : "");
$title_page = strip_tags($title_all . (SERVER != "" && SERVER != "localhost" ? h(" - " . SERVER) : "") . " - " . $adminer->name());
?>
<!DOCTYPE html>
<html lang="<?php echo $LANG; ?>" dir="<?php echo lang('ltr'); ?>">
<?php /* devilbox edit */ echo loadClass('Html')->getHead(); error_reporting(6135); ?>
<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">
<meta name="referrer" content="origin-when-crossorigin">
<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="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 class="<?php echo lang('ltr'); ?> nojs" onkeydown="bodyKeydown(event);" onclick="bodyClick(event);"<?php echo (isset($_COOKIE["adminer_version"]) ? "" : " onload=\"verifyVersion('$VERSION');\""); ?>>
<?php /* devilbox edit */ echo loadClass('Html')->getNavbar(); error_reporting(6135);?>
<script type="text/javascript">
document.body.className = document.body.className.replace(/ nojs/, ' js');
var offlineMessage = '<?php echo js_escape(lang('You are offline.')); ?>';
</script>
<div id="help" class="jush-<?php echo $jush; ?> jsonly hidden" onmouseover="helpOpen = 1;" onmouseout="helpMouseout(this, event);"></div>
<div id="content">
<?php
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) : ".") . "' 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; ';
}
if (is_array($breadcrumb)) {
if ($_GET["ns"] != "") {
echo '<a href="' . h(substr(ME, 0, -1)) . '">' . h($_GET["ns"]) . '</a> &raquo; ';
}
foreach ($breadcrumb as $key => $val) {
$desc = (is_array($val) ? $val[1] : h($val));
if ($desc != "") {
echo "<a href='" . h(ME . "$key=") . urlencode(is_array($val) ? $val[0] : $val) . "'>$desc</a> &raquo; ";
}
}
}
echo "$title\n";
}
}
echo "<h2>$title_all</h2>\n";
echo "<div id='ajaxstatus' class='jsonly hidden'></div>\n";
restart_session();
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", "ns"
* @return null
*/
function page_footer($missing = "") {
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
/* devilbox edit */ echo loadClass('Html')->getFooter(); error_reporting(6135);
}

View File

@ -1,110 +0,0 @@
<?php
/*abstract*/ class Min_SQL {
var $_conn;
/** Create object for performing database operations
* @param Min_DB
*/
function __construct($connection) {
$this->_conn = $connection;
}
/** Select data from table
* @param string
* @param array result of $adminer->selectColumnsProcess()[0]
* @param array result of $adminer->selectSearchProcess()
* @param array result of $adminer->selectColumnsProcess()[1]
* @param array result of $adminer->selectOrderProcess()
* @param int result of $adminer->selectLimitProcess()
* @param int index of page starting at zero
* @param bool whether to print the query
* @return Min_Result
*/
function select($table, $select, $where, $group, $order = array(), $limit = 1, $page = 0, $print = false) {
global $adminer, $jush;
$is_group = (count($group) < count($select));
$query = $adminer->selectQueryBuild($select, $where, $group, $order, $limit, $page);
if (!$query) {
$query = "SELECT" . limit(
($_GET["page"] != "last" && +$limit && $group && $is_group && $jush == "sql" ? "SQL_CALC_FOUND_ROWS " : "") . implode(", ", $select) . "\nFROM " . table($table),
($where ? "\nWHERE " . implode(" AND ", $where) : "") . ($group && $is_group ? "\nGROUP BY " . implode(", ", $group) : "") . ($order ? "\nORDER BY " . implode(", ", $order) : ""),
($limit != "" ? +$limit : null),
($page ? $limit * $page : 0),
"\n"
);
}
$start = microtime(true);
$return = $this->_conn->query($query);
if ($print) {
echo $adminer->selectQuery($query, format_time($start));
}
return $return;
}
/** Delete data from table
* @param string
* @param string " WHERE ..."
* @param int 0 or 1
* @return bool
*/
function delete($table, $queryWhere, $limit = 0) {
$query = "FROM " . table($table);
return queries("DELETE" . ($limit ? limit1($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

@ -1,538 +0,0 @@
<?php
/** Print select result
* @param Min_Result
* @param Min_DB connection to examine indexes
* @param array
* @param int
* @return array $orgtables
*/
function select($result, $connection2 = null, $orgtables = array(), $limit = 0) {
global $jush;
$links = array(); // colno => orgtable - create links from these columns
$indexes = array(); // orgtable => array(column => colno) - primary keys
$columns = array(); // orgtable => array(column => ) - not selected columns in primary key
$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; (!$limit || $i < $limit) && ($row = $result->fetch_row()); $i++) {
if (!$i) {
echo "<table cellspacing='0' class='nowrap'>\n";
echo "<thead><tr>";
for ($j=0; $j < count($row); $j++) {
$field = $result->fetch_field();
$name = $field->name;
$orgtable = $field->orgtable;
$orgname = $field->orgname;
$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();
foreach (indexes($orgtable, $connection2) as $index) {
if ($index["type"] == "PRIMARY") {
$indexes[$orgtable] = array_flip($index["columns"]);
break;
}
}
$columns[$orgtable] = $indexes[$orgtable];
}
if (isset($columns[$orgtable][$orgname])) {
unset($columns[$orgtable][$orgname]);
$indexes[$orgtable][$orgname] = $j;
$links[$j] = $orgtable;
}
}
if ($field->charsetnr == 63) { // 63 - binary
$blobs[$j] = true;
}
$types[$j] = $field->type;
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 ($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 {
$val = h($val);
if ($types[$key] == 254) { // 254 - char
$val = "<code>$val</code>";
}
}
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>";
}
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
* @param string
* @return array ($table_name => $field)
*/
function referencable_primary($self) {
$return = array(); // table_name => field
foreach (table_status('', true) as $table_name => $table) {
if ($table_name != $self && fk_support($table)) {
foreach (fields($table_name) as $field) {
if ($field["primary"]) {
if ($return[$table_name]) { // multi column primary key
unset($return[$table_name]);
break;
}
$return[$table_name] = $field;
}
}
}
}
return $return;
}
/** Print SQL <textarea> tag
* @param string
* @param string or array in which case [0] of every element is used
* @param int
* @param int
* @return null
*/
function textarea($name, $value, $rows = 10, $cols = 80) {
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, $elapsed)
}
} else {
echo h($value);
}
echo "</textarea>";
}
/** Print table columns for type edit
* @param string
* @param array
* @param array
* @param array returned by referencable_primary()
* @return null
*/
function edit_type($key, $field, $collations, $foreign_keys = array()) {
global $structured_types, $types, $unsigned, $on_actions;
$type = $field["type"];
?>
<td><select name="<?php echo h($key); ?>[type]" class="type" onfocus="lastType = selectValue(this);" onchange="editingTypeChange(this);"<?php echo on_help("getTarget(event).value", 1); ?> aria-labelledby="label-type"><?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 h($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();" aria-labelledby="label-length"><td class="options"><?php //! type="number" with enabled JavaScript
echo "<select name='" . h($key) . "[collation]'" . (preg_match('~(char|text|enum|set)$~', $type) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
echo ($unsigned ? "<select name='" . h($key) . "[unsigned]'" . (!$type || preg_match('~((^|[^o])int|float|double|decimal)$~', $type) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
echo (isset($field['on_update']) ? "<select name='" . h($key) . "[on_update]'" . (preg_match('~timestamp|datetime~', $type) ? "" : " class='hidden'") . '>' . optionlist(array("" => "(" . lang('ON UPDATE') . ")", "CURRENT_TIMESTAMP"), $field["on_update"]) . '</select>' : '');
echo ($foreign_keys ? "<select name='" . h($key) . "[on_delete]'" . (preg_match("~`~", $type) ? "" : " class='hidden'") . "><option value=''>(" . lang('ON DELETE') . ")" . optionlist(explode("|", $on_actions), $field["on_delete"]) . "</select> " : " "); // space for IE
}
/** Filter length value including enums
* @param string
* @return string
*/
function process_length($length) {
global $enum_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
* @param array
* @param string
* @return string
*/
function process_type($field, $collate = "COLLATE") {
global $unsigned;
return " $field[type]"
. 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"]) : "")
;
}
/** Create SQL string from field
* @param array basic field information
* @param array information about field type
* @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(trim($field["field"])),
process_type($type_field),
($field["null"] ? " NULL" : " NOT NULL"), // NULL for timestamp
(isset($default) ? " DEFAULT " . (
(preg_match('~time~', $field["type"]) && preg_match('~^CURRENT_TIMESTAMP$~i', $default))
|| ($jush == "sqlite" && preg_match('~^CURRENT_(TIME|TIMESTAMP|DATE)$~i', $default))
|| ($field["type"] == "bit" && preg_match("~^([0-9]+|b'[0-1]+')\$~", $default))
|| ($jush == "pgsql" && preg_match("~^[a-z]+\\(('[^']*')+\\)\$~", $default))
? $default : q($default)) : ""),
(preg_match('~timestamp|datetime~', $field["type"]) && $field["on_update"] ? " ON UPDATE $field[on_update]" : ""),
(support("comment") && $field["comment"] != "" ? " COMMENT " . q($field["comment"]) : ""),
($field["auto_increment"] ? auto_increment() : null),
);
}
/** Get type class to use in CSS
* @param string
* @return string class=''
*/
function type_class($type) {
foreach (array(
'char' => 'text',
'date' => 'time|year',
'binary' => 'blob',
'enum' => 'set',
) as $key => $val) {
if (preg_match("~$key|$val~", $type)) {
return " class='$key'";
}
}
}
/** Print table interior for fields editing
* @param array
* @param array
* @param string TABLE or PROCEDURE
* @param array returned by referencable_primary()
* @param bool display comments column
* @return null
*/
function edit_fields($fields, $collations, $type = "TABLE", $foreign_keys = array(), $comments = false) {
global $connection, $inout;
$fields = array_values($fields);
?>
<thead><tr class="wrap">
<?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
<th id="label-name"><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
<td id="label-type"><?php echo lang('Type'); ?><textarea id="enum-edit" rows="4" cols="12" wrap="off" style="display: none;" onblur="editingLengthBlur(this);"></textarea>
<td id="label-length"><?php echo lang('Length'); ?>
<td><?php echo lang('Options'); /* no label required, options have their own label */ ?>
<?php if ($type == "TABLE") { ?>
<td id="label-null">NULL
<td><input type="radio" name="auto_increment_col" value=""><acronym id="label-ai" title="<?php echo lang('Auto Increment'); ?>">AI</acronym><?php echo doc_link(array(
'sql' => "example-auto-increment.html",
'sqlite' => "autoinc.html",
'pgsql' => "datatype.html#DATATYPE-SERIAL",
'mssql' => "ms186775.aspx",
)); ?>
<td id="label-default"><?php echo lang('Default value'); ?>
<?php echo (support("comment") ? "<td id='label-comment'" . ($comments ? "" : " class='hidden'") . ">" . lang('Comment') : ""); ?>
<?php } ?>
<td><?php echo "<input type='image' class='icon' name='add[" . (support("move_col") ? 0 : count($fields)) . "]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
</thead>
<tbody onkeydown="return editingKeydown(event);">
<?php
foreach ($fields as $i => $field) {
$i++;
$orig = $field[($_POST ? "orig" : "field")];
$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]", 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" aria-labelledby="label-name"><?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"], "", "", "block", "label-null"); ?>
<td><label class="block"><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?> onclick="var field = this.form['fields[' + this.value + '][field]']; if (!field.value) { field.value = 'id'; field.onchange(); }" aria-labelledby="label-ai"></label><td><?php
echo checkbox("fields[$i][has_default]", 1, $field["has_default"], "", "", "", "label-default"); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onkeyup="keyupChange.call(this);" onchange="this.previousSibling.checked = true;" aria-labelledby="label-default">
<?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) . "' aria-labelledby='label-comment'>" : ""); ?>
<?php } ?>
<?php
echo "<td>";
echo (support("move_col") ?
"<input type='image' class='icon' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editingAddRow(this, 1);'>&nbsp;"
. "<input type='image' class='icon' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "' onclick='return !editingMoveRow(this, 1);'>&nbsp;"
. "<input type='image' class='icon' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "' onclick='return !editingMoveRow(this, 0);'>&nbsp;"
: "");
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";
}
}
/** Move fields up and down or add field
* @param array
* @return bool
*/
function process_fields(&$fields) {
$offset = 0;
if ($_POST["up"]) {
$last = 0;
foreach ($fields as $key => $field) {
if (key($_POST["up"]) == $key) {
unset($fields[$key]);
array_splice($fields, $last, 0, array($field));
break;
}
if (isset($field["field"])) {
$last = $offset;
}
$offset++;
}
} elseif ($_POST["down"]) {
$found = false;
foreach ($fields as $key => $field) {
if (isset($field["field"]) && $found) {
unset($fields[key($_POST["down"])]);
array_splice($fields, $offset, 0, array($found));
break;
}
if (key($_POST["down"]) == $key) {
$found = $field;
}
$offset++;
}
} 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()
* @param array
* @return string
*/
function normalize_enum($match) {
return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0][0] . $match[0][0], $match[0][0], substr($match[0], 1, -1))), '\\')) . "'";
}
/** Issue grant or revoke commands
* @param string GRANT or REVOKE
* @param array
* @param string
* @param string
* @return bool
*/
function grant($grant, $privileges, $columns, $on) {
if (!$privileges) {
return true;
}
if ($privileges == array("ALL PRIVILEGES", "GRANT OPTION")) {
// can't be granted or revoked together
return ($grant == "GRANT"
? queries("$grant ALL PRIVILEGES$on WITH GRANT OPTION")
: queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
);
}
return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
}
/** Drop old object and create a new one
* @param string drop 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
* @param string
* @return null redirect in success
*/
function drop_create($drop, $create, $drop_created, $test, $drop_test, $location, $message_drop, $message_alter, $message_create, $old_name, $new_name) {
if ($_POST["drop"]) {
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)
);
}
}
/** Generate SQL query for creating trigger
* @param string
* @param array result of trigger()
* @return string
*/
function create_trigger($on, $row) {
global $jush;
$timing_event = " $row[Timing] $row[Event]" . ($row["Event"] == "UPDATE OF" ? " " . idf_escape($row["Of"]) : "");
return "CREATE TRIGGER "
. idf_escape($row["Trigger"])
. ($jush == "mssql" ? $on . $timing_event : $timing_event . $on)
. rtrim(" $row[Type]\n$row[Statement]", ";")
. ";"
;
}
/** Generate SQL query for creating routine
* @param string "PROCEDURE" or "FUNCTION"
* @param array result of routine()
* @return string
*/
function create_routine($routine, $row) {
global $inout;
$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>" : "");
}
/** Wrap gzencode() for usage in ob_start()
* @param string
* @return string
*/
function ob_gzencode($string) {
// ob_start() callback recieves an optional parameter $phase but gzencode() accepts optional parameter $level
return gzencode($string);
}
/** Compute size of database
* @param string
* @return string formatted
*/
function db_size($db) {
global $connection;
if (!$connection->select_db($db)) {
return "?";
}
$return = 0;
foreach (table_status() as $table_status) {
$return += $table_status["Data_length"] + $table_status["Index_length"];
}
return format_number($return);
}
/** Print SET NAMES if utf8mb4 might be needed
* @param string
* @return null
*/
function set_utf8mb4($create) {
global $connection;
static $set = false;
if (!$set && preg_match('~\butf8mb4~i', $create)) { // possible false positive
$set = true;
echo "SET NAMES " . charset($connection) . ";\n\n";
}
}

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -1,96 +0,0 @@
<?php
// PDO can be used in several database drivers
if (extension_loaded('pdo')) {
/*abstract*/ class Min_PDO extends PDO {
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) {
try {
parent::__construct($dsn, $username, $password);
} catch (Exception $ex) {
auth_error(h($ex->getMessage()));
}
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
$this->server_info = @$this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
}
/*abstract function select_db($database);*/
function query($query, $unbuffered = false) {
$result = parent::query($query);
$this->error = "";
if (!$result) {
list(, $this->errno, $this->error) = $this->errorInfo();
return false;
}
$this->store_result($result);
return $result;
}
function multi_query($query) {
return $this->_result = $this->query($query);
}
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
return $result;
}
$this->affected_rows = $result->rowCount();
return true;
}
function next_result() {
if (!$this->_result) {
return false;
}
$this->_result->_offset = 0;
return @$this->_result->nextRowset(); // @ - PDO_PgSQL doesn't support it
}
function result($query, $field = 0) {
$result = $this->query($query);
if (!$result) {
return false;
}
$row = $result->fetch();
return $row[$field];
}
}
class Min_PDOStatement extends PDOStatement {
var $_offset = 0, $num_rows;
function fetch_assoc() {
return $this->fetch(2); // PDO::FETCH_ASSOC
}
function fetch_row() {
return $this->fetch(3); // PDO::FETCH_NUM
}
function fetch_field() {
$row = (object) $this->getColumnMeta($this->_offset++);
$row->orgtable = $row->table;
$row->orgname = $row->name;
$row->charsetnr = (in_array("blob", (array) $row->flags) ? 63 : 0);
return $row;
}
}
}
$drivers = array();

View File

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

View File

@ -1,2 +0,0 @@
<?php
$VERSION = "4.3.1";

View File

@ -1,107 +0,0 @@
<?php
/** PHP implementation of XXTEA encryption algorithm
* @author Ma Bingyao <andot@ujn.edu.cn>
* @link http://www.coolcode.cn/?action=show&id=128
*/
function int32($n) {
while ($n >= 2147483648) {
$n -= 4294967296;
}
while ($n <= -2147483649) {
$n += 4294967296;
}
return (int) $n;
}
function long2str($v, $w) {
$s = '';
foreach ($v as $val) {
$s .= pack('V', $val);
}
if ($w) {
return substr($s, 0, end($v));
}
return $s;
}
function str2long($s, $w) {
$v = array_values(unpack('V*', str_pad($s, 4 * ceil(strlen($s) / 4), "\0")));
if ($w) {
$v[] = strlen($s);
}
return $v;
}
function xxtea_mx($z, $y, $sum, $k) {
return int32((($z >> 5 & 0x7FFFFFF) ^ $y << 2) + (($y >> 3 & 0x1FFFFFFF) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k ^ $z));
}
/** Cipher
* @param string plain-text password
* @param string
* @return string binary cipher
*/
function encrypt_string($str, $key) {
if ($str == "") {
return "";
}
$key = array_values(unpack("V*", pack("H*", md5($key))));
$v = str2long($str, true);
$n = count($v) - 1;
$z = $v[$n];
$y = $v[0];
$q = floor(6 + 52 / ($n + 1));
$sum = 0;
while ($q-- > 0) {
$sum = int32($sum + 0x9E3779B9);
$e = $sum >> 2 & 3;
for ($p=0; $p < $n; $p++) {
$y = $v[$p + 1];
$mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
$z = int32($v[$p] + $mx);
$v[$p] = $z;
}
$y = $v[0];
$mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
$z = int32($v[$n] + $mx);
$v[$n] = $z;
}
return long2str($v, false);
}
/** Decipher
* @param string binary cipher
* @param string
* @return string plain-text password
*/
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;
$z = $v[$n];
$y = $v[0];
$q = floor(6 + 52 / ($n + 1));
$sum = int32($q * 0x9E3779B9);
while ($sum) {
$e = $sum >> 2 & 3;
for ($p=$n; $p > 0; $p--) {
$z = $v[$p - 1];
$mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
$y = int32($v[$p] - $mx);
$v[$p] = $y;
}
$z = $v[$n];
$mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]);
$y = int32($v[0] - $mx);
$v[0] = $y;
$sum = int32($sum - 0x9E3779B9);
}
return long2str($v, true);
}

View File

@ -1,83 +0,0 @@
<?php
/** Adminer - Compact database management
* @link https://www.adminer.org/
* @author Jakub Vrana, https://www.vrana.cz/
* @copyright 2007 Jakub Vrana
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other)
*/
/* devilbox inject */ require '../../../../config.php'; error_reporting(6135);
include "./include/bootstrap.inc.php";
include "./include/tmpfile.inc.php";
$enum_length = "'(?:''|[^'\\\\]|\\\\.)*'";
$inout = "IN|OUT|INOUT";
if (isset($_GET["select"]) && ($_POST["edit"] || $_POST["clone"]) && !$_POST["save"]) {
$_GET["edit"] = $_GET["select"];
}
if (isset($_GET["callf"])) {
$_GET["call"] = $_GET["callf"];
}
if (isset($_GET["function"])) {
$_GET["procedure"] = $_GET["function"];
}
if (isset($_GET["download"])) {
include "./download.inc.php";
} elseif (isset($_GET["table"])) {
include "./table.inc.php";
} elseif (isset($_GET["schema"])) {
include "./schema.inc.php";
} elseif (isset($_GET["dump"])) {
include "./dump.inc.php";
} elseif (isset($_GET["privileges"])) {
include "./privileges.inc.php";
} elseif (isset($_GET["sql"])) {
include "./sql.inc.php";
} elseif (isset($_GET["edit"])) {
include "./edit.inc.php";
} elseif (isset($_GET["create"])) {
include "./create.inc.php";
} elseif (isset($_GET["indexes"])) {
include "./indexes.inc.php";
} elseif (isset($_GET["database"])) {
include "./database.inc.php";
} elseif (isset($_GET["scheme"])) {
include "./scheme.inc.php";
} elseif (isset($_GET["call"])) {
include "./call.inc.php";
} elseif (isset($_GET["foreign"])) {
include "./foreign.inc.php";
} elseif (isset($_GET["view"])) {
include "./view.inc.php";
} elseif (isset($_GET["event"])) {
include "./event.inc.php";
} elseif (isset($_GET["procedure"])) {
include "./procedure.inc.php";
} elseif (isset($_GET["sequence"])) {
include "./sequence.inc.php";
} elseif (isset($_GET["type"])) {
include "./type.inc.php";
} elseif (isset($_GET["trigger"])) {
include "./trigger.inc.php";
} elseif (isset($_GET["user"])) {
include "./user.inc.php";
} elseif (isset($_GET["processlist"])) {
include "./processlist.inc.php";
} elseif (isset($_GET["replication"])) {
include "./replication.inc.php";
} elseif (isset($_GET["select"])) {
include "./select.inc.php";
} elseif (isset($_GET["variables"])) {
include "./variables.inc.php";
} elseif (isset($_GET["script"])) {
include "./script.inc.php";
} else {
include "./db.inc.php";
}
// each page calls its own page_header(), if the footer should not be called then the page exits
page_footer();

View File

@ -1,143 +0,0 @@
<?php
$TABLE = $_GET["indexes"];
$index_types = array("PRIMARY", "UNIQUE", "INDEX");
$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";
}
if (preg_match('~MyISAM|M?aria' . ($connection->server_info >= 5.7 ? '|InnoDB' : '') . '~i', $table_status["Engine"])) {
$index_types[] = "SPATIAL";
}
$indexes = indexes($TABLE);
$primary = array();
if ($jush == "mongo") { // doesn't support primary key
$primary = $indexes["_id_"];
unset($index_types[0]);
unset($indexes["_id_"]);
}
$row = $_POST;
if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"]) {
$alter = array();
foreach ($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];
$desc = $index["descs"][$key];
$set[] = idf_escape($column) . ($length ? "(" . (+$length) . ")" : "") . ($desc ? " DESC" : "");
$columns[] = $column;
$lengths[] = ($length ? $length : null);
$descs[] = $desc;
}
}
if ($columns) {
$existing = $indexes[$name];
if ($existing) {
ksort($existing["columns"]);
ksort($existing["lengths"]);
ksort($existing["descs"]);
if ($index["type"] == $existing["type"]
&& array_values($existing["columns"]) === $columns
&& (!$existing["lengths"] || array_values($existing["lengths"]) === $lengths)
&& array_values($existing["descs"]) === $descs
) {
// skip existing index
unset($indexes[$name]);
continue;
}
}
$alter[] = array($index["type"], $name, $set);
}
}
}
// drop removed indexes
foreach ($indexes as $name => $existing) {
$alter[] = array($existing["type"], $name, "DROP");
}
if (!$alter) {
redirect(ME . "table=" . urlencode($TABLE));
}
queries_redirect(ME . "table=" . urlencode($TABLE), lang('Indexes have been altered.'), alter_indexes($TABLE, $alter));
}
page_header(lang('Indexes'), $error, array("table" => $TABLE), h($TABLE));
$fields = array_keys(fields($TABLE));
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')) {
$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 id="label-type"><?php echo lang('Index Type'); ?>
<th><input type="submit" class="wayoff"><?php echo lang('Column (length)'); ?>
<th id="label-name"><?php echo lang('Name'); ?>
<th><noscript><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_input(" disabled", $fields, $column);
echo "<label><input disabled type='checkbox'>" . lang('descending') . "</label> ";
}
echo "<td><td>\n";
}
$j = 1;
foreach ($row["indexes"] as $index) {
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), "label-type");
echo "<td>";
ksort($index["columns"]);
$i = 1;
foreach ($index["columns"] as $key => $column) {
echo "<span>" . select_input(
" name='indexes[$j][columns][$i]' onchange=\"" . ($i == count($index["columns"]) ? "indexesAddColumn" : "indexesChangeColumn") . "(this, '" . h(js_escape($jush == "sql" ? "" : $_GET["indexes"] . "_")) . "');\" title='" . lang('Column') . "'",
($fields ? array_combine($fields, $fields) : $fields),
$column
);
echo ($jush == "sql" || $jush == "mssql" ? "<input type='number' name='indexes[$j][lengths][$i]' class='size' value='" . h($index["lengths"][$key]) . "' title='" . lang('Length') . "'>" : "");
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' aria-labelledby='label-name'>\n";
echo "<td><input type='image' class='icon' name='drop_col[$j]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick=\"return !editingRemoveRow(this, 'indexes\$1[type]');\">\n";
}
$j++;
}
?>
</table>
<p>
<input type="submit" value="<?php echo lang('Save'); ?>">
<input type="hidden" name="token" value="<?php echo $token; ?>">
</form>

View File

@ -1,267 +0,0 @@
<?php
$translations = array(
'Login' => 'تسجيل الدخول',
'Logout successful.' => 'تم تسجيل الخروج بنجاح.',
'Invalid credentials.' => 'بيانات الدخول غير صالحة.',
'Server' => 'الخادم',
'Username' => 'اسم المستخدم',
'Password' => 'كلمة المرور',
'Select database' => 'اختر قاعدة البيانات',
'Invalid database.' => 'قاعدة البيانات غير صالحة.',
'Table has been dropped.' => 'تم حذف الجدول.',
'Table has been altered.' => 'تم تعديل الجدول.',
'Table has been created.' => 'تم إنشاء الجدول.',
'Alter table' => 'تعديل الجدول',
'Create table' => 'إنشاء جدول',
'Table name' => 'اسم الجدول',
'engine' => 'المحرك',
'collation' => 'الترتيب',
'Column name' => 'اسم العمود',
'Type' => 'النوع',
'Length' => 'الطول',
'Auto Increment' => 'تزايد تلقائي',
'Options' => 'خيارات',
'Save' => 'حفظ',
'Drop' => 'حذف',
'Database has been created.' => 'تم إنشاء قاعدة البيانات.',
'Database has been renamed.' => 'تمت إعادة تسمية فاعدة البيانات.',
'Database has been altered.' => 'تم تعديل قاعدة البيانات.',
'Alter database' => 'تعديل قاعدة البيانات',
'Create database' => 'إنشاء قاعدة بيانات',
'SQL command' => 'استعلام SQL',
'Logout' => 'تسجيل الخروج',
'database' => 'قاعدة بيانات',
'Use' => 'استعمال',
'No tables.' => 'لا توجد جداول.',
'select' => 'تحديد',
'Item has been deleted.' => 'تم حذف العنصر.',
'Item has been updated.' => 'تم تعديل العنصر.',
'Edit' => 'تعديل',
'Insert' => 'إنشاء',
'Save and insert next' => 'جفظ و إنشاء التالي',
'Delete' => 'مسح',
'Database' => 'قاعدة بيانات',
'Routines' => 'الروتينات',
'Indexes have been altered.' => 'تم تعديل المؤشر.',
'Indexes' => 'المؤشرات',
'Alter indexes' => 'تعديل المؤشرات',
'Add next' => 'إضافة التالي',
'Language' => 'اللغة',
'Select' => 'اختيار',
'New item' => 'عنصر جديد',
'Search' => 'بحث',
'Sort' => 'ترتيب',
'descending' => 'تنازلي',
'Limit' => 'حد',
'No rows.' => 'لا توجد نتائج.',
'Action' => 'الإجراء',
'edit' => 'تعديل',
'Page' => 'صفحة',
'Query executed OK, %d row(s) affected.' => 'تم تنفسذ الاستعلام, %d عدد الأسطر المعدلة.',
'Error in query' => 'هناك خطأ في الاستعلام',
'Execute' => 'تنفيذ',
'Table' => 'جدول',
'Foreign keys' => 'مفاتيح أجنبية',
'Triggers' => 'الزنادات',
'View' => 'عرض',
'Unable to select the table' => 'يتعذر اختيار الجدول',
'Invalid CSRF token. Send the form again.' => 'رمز 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 المدعومة غير موجودة.',
'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' => 'الأسطر',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'تحليل',
'Optimize' => 'تحسين',
'Check' => 'فحص',
'Repair' => 'إصلاح',
'Truncate' => 'قطع',
'Move to other database' => 'نقل إلى قاعدة بيانات أخرى',
'Move' => 'نقل',
'%d item(s) have been affected.' => 'عدد العناصر المعدلة هو %d.',
'whole result' => 'نتيجة كاملة',
'Clone' => 'نسخ',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'لقد تجاوزت العدد الأقصى للحقول. يرجى الرفع من %s.',
'Partition by' => 'مقسم بواسطة',
'Partitions' => 'التقسيمات',
'Partition name' => 'اسم التقسيم',
'Values' => 'القيم',
'%d row(s) have been imported.' => 'تم استيراد %d سطرا',
'anywhere' => 'في اي مكان',
'Import' => 'استيراد',
'Stop on error' => 'أوقف في حالة حدوث خطأ',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$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' => 'المخطط',
'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',
);

View File

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

View File

@ -1,267 +0,0 @@
<?php
$translations = array(
'Login' => 'লগইন',
'Logout successful.' => 'লগআউট সম্পন্ন হয়েছে।',
'Invalid credentials.' => 'ভুল পাসওয়ার্ড।',
'Server' => 'সার্ভার',
'Username' => 'ইউজারের নাম',
'Password' => 'পাসওয়ার্ড',
'Select database' => 'ডাটাবেজ নির্বাচন করো',
'Invalid database.' => 'ভুল ডাটাবেজ।',
'Table has been dropped.' => 'টেবিল মুছে ফেলা হয়েছে।',
'Table has been altered.' => 'টেবিল সম্পাদনা করা হয়েছে।',
'Table has been created.' => 'টেবিল তৈরী করা হয়েছে।',
'Alter table' => 'টেবিল সম্পাদনা',
'Create table' => 'টেবিল তৈরী করো',
'Table name' => 'টেবিলের নাম',
'engine' => 'ইন্জিন',
'collation' => 'কলোকেশন',
'Column name' => 'কলামের নাম',
'Type' => 'টাইপ',
'Length' => 'দৈর্ঘ্য',
'Auto Increment' => 'স্বয়ংক্রিয় বৃদ্ধি',
'Options' => 'অপশন',
'Save' => 'সংরক্ষণ',
'Drop' => 'মুছে ফেলো',
'Database has been dropped.' => 'ডাটাবেজ মুছে ফেলা হয়েছে।',
'Database has been created.' => 'ডাটাবেজ তৈরী করা হয়েছে।',
'Database has been renamed.' => 'ডাটাবেজের নতুন নামকরণ করা হয়েছে।',
'Database has been altered.' => 'ডাটাবেজ সম্পাদনা করা হয়েছে।',
'Alter database' => 'ডাটাবেজ সম্পাদনা',
'Create database' => 'ডাটাবেজ তৈরী',
'SQL command' => 'SQL-কোয়্যারী',
'Logout' => 'লগআউট',
'database' => 'ডাটাবেজ',
'Use' => 'ব্যবহার',
'No tables.' => 'কোন টেবিল নাই।',
'select' => 'নির্বাচন',
'Item has been deleted.' => 'বিষয়বস্তু মুছে ফেলা হয়েছে।',
'Item has been updated.' => 'বিষয়বস্তু আপডেট করা হয়েছে।',
'Item%s has been inserted.' => 'বিষয়বস্তুসমূহ সংযোজন করা হয়েছে।',
'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' => 'সারি',
',' => ',',
'0123456789' => '০১২৩৪৫৬৭৮৯',
'Tables have been moved.' => 'টেবিল স্থানান্তর করা হয়েছে।',
'Move to other database' => 'অন্য ডাটাবেজে স্থানান্তর করো',
'Move' => 'স্থানান্তর করো',
'Engine' => 'ইঞ্জিন',
'Save and continue edit' => 'সংরক্ষণ করো এবং সম্পাদনা চালিয়ে যাও',
'original' => 'প্রকৃত',
'Tables have been dropped.' => 'টেবিলসমূহ মুছে ফেলা হয়েছে।',
'%d item(s) have been affected.' => '%d টি বিষয়বস্তু প্রভাবিত হয়েছে',
'whole result' => 'সম্পূর্ণ ফলাফল',
'Clone' => 'ক্লোন',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'অনুমোদিত ফিল্ড এর সর্বাধিক সংখ্যা অতিক্রম করে গেছে। অনুগ্রহপূর্বক %s বৃদ্ধি করুন।',
'Partition by' => 'পার্টিশন যার মাধ্যমে',
'Partitions' => 'পার্টিশন',
'Partition name' => 'পার্টিশনের নাম',
'Values' => 'মানসমূহ',
'%d row(s) have been imported.' => 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' => 'স্কিমা',
'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',
);

View File

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

View File

@ -1,268 +0,0 @@
<?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.',
'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',
'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',
',' => ',',
'0123456789' => '0123456789',
'Tables have been moved.' => 'S\'han desplaçat les taules.',
'Move to other database' => 'Desplaça a una altra base de dades',
'Move' => 'Desplaça',
'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',
'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,346 +0,0 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'Systém',
'Server' => 'Server',
'Username' => 'Uživatel',
'Password' => 'Heslo',
'Permanent login' => 'Trvalé přihlášení',
'Login' => 'Přihlásit se',
'Logout' => 'Odhlásit',
'Logged as: %s' => 'Přihlášen jako: %s',
'Logout successful.' => 'Odhlášení proběhlo v pořádku.',
'Invalid credentials.' => 'Neplatné přihlašovací údaje.',
'<a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to use SQLite.' => 'Pro přihlášení k SQLite <a href="https://www.adminer.org/cs/extension/" target="_blank">implementujte</a> metodu %s.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minutu.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minuty.', 'Příliš mnoho pokusů o přihlášení, zkuste to znovu za %d minut.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Platnost hlavního hesla vypršela. <a href="https://www.adminer.org/cs/extension/" target="_blank">Implementujte</a> metodu %s, aby platilo stále.',
'Language' => 'Jazyk',
'Invalid CSRF token. Send the form again.' => 'Neplatný token CSRF. Odešlete formulář znovu.',
'If you did not send this request from Adminer then close this page.' => 'Pokud jste tento požadavek neposlali z Adminera, tak tuto stránku zavřete.',
'No extension' => 'Žádné rozšíření',
'None of the supported PHP extensions (%s) are available.' => 'Není dostupné žádné z podporovaných PHP rozšíření (%s).',
'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.',
'%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.',
'User has been altered.' => 'Uživatel byl změněn.',
'User has been created.' => 'Uživatel byl vytvořen.',
'Hashed' => 'Zahašované',
'Column' => 'Sloupec',
'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',
'Replication' => 'Replikace',
'Master status' => 'Master status',
'Slave status' => 'Slave status',
'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',
'ATTACH queries are not supported.' => 'Dotazy ATTACH nejsou podporované.',
'Execute' => 'Provést',
'Stop on error' => 'Zastavit při chybě',
'Show only errors' => 'Zobrazit pouze chyby',
// 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.',
'You can upload a big SQL file via FTP and import it from server.' => 'Velký SQL soubor můžete nahrát pomocí FTP a importovat ho ze serveru.',
'You are offline.' => 'Jste offline.',
'Export' => 'Export',
'Output' => 'Výstup',
'open' => 'otevřít',
'save' => 'uložit',
'Format' => 'Formát',
'Data' => 'Data',
'Database' => 'Databáze',
'database' => 'databáze',
'Use' => 'Vybrat',
'Select database' => 'Vybrat databázi',
'Invalid database.' => 'Nesprávná databáze.',
'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
',' => ' ',
'0123456789' => '0123456789',
'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.',
'Alter event' => 'Pozměnit událost',
'Create event' => 'Vytvořit událost',
'At given time' => 'V daný čas',
'Every' => 'Každých',
'Schedule' => 'Plán',
'Start' => 'Začátek',
'End' => 'Konec',
'On completion preserve' => 'Po dokončení zachovat',
'Tables' => 'Tabulky',
'Tables and views' => 'Tabulky a pohledy',
'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.',
'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 value' => 'Výchozí hodnota',
'Default values' => 'Výchozí hodnoty',
'Drop' => 'Odstranit',
'Are you sure?' => 'Opravdu?',
'Size' => 'Velikost',
'Compute' => 'Spočítat',
'Move up' => 'Přesunout nahoru',
'Move down' => 'Přesunout dolů',
'Remove' => 'Odebrat',
'Maximum number of allowed fields exceeded. Please increase %s.' => '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',
'View' => 'Pohled',
'Materialized view' => 'Materializovaný pohled',
'View has been dropped.' => 'Pohled byl odstraněn.',
'View has been altered.' => 'Pohled byl změněn.',
'View has been created.' => 'Pohled byl vytvořen.',
'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',
'Limit rows' => 'Limit řádek',
'Text length' => 'Délka textů',
'Action' => 'Akce',
'Full table scan' => 'Průchod celé tabulky',
'Unable to select the table' => 'Nepodařilo se vypsat tabulku',
'No rows.' => 'Žádné řádky.',
'%d / ' => '%d / ',
'%d row(s)' => array('%d řádek', '%d řádky', '%d řádků'),
'Page' => 'Stránka',
'last' => 'poslední',
'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ů.'),
// data type descriptions
'Numbers' => 'Čísla',
'Date and time' => 'Datum a čas',
'Strings' => 'Řetězce',
'Binary' => 'Binární',
'Lists' => 'Seznamy',
'Network' => 'Síť',
'Geometry' => 'Geometrie',
'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.',
'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.',
'Schema has been created.' => 'Schéma bylo vytvořeno.',
'Schema has been altered.' => 'Schéma bylo změněno.',
'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',
'Replication' => null,
'Master status' => null,
'Slave status' => null,
);

View File

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

View File

@ -1,288 +0,0 @@
<?php
$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Abmeldung erfolgreich.',
'Invalid credentials.' => 'Ungültige Anmelde-Informationen.',
'Server' => 'Server',
'Username' => 'Benutzer',
'Password' => 'Passwort',
'Select database' => 'Datenbank auswählen',
'Invalid database.' => 'Datenbank ungültig.',
'Table has been dropped.' => 'Tabelle wurde entfernt.',
'Table has been altered.' => 'Tabelle wurde geändert.',
'Table has been created.' => 'Tabelle wurde erstellt.',
'Alter table' => 'Tabelle ändern',
'Create table' => 'Tabelle erstellen',
'Table name' => 'Name der Tabelle',
'engine' => 'Speicher-Engine',
'collation' => 'Kollation',
'Column name' => 'Spaltenname',
'Type' => 'Typ',
'Length' => 'Länge',
'Auto Increment' => 'Auto-Inkrement',
'Options' => 'Optionen',
'Save' => 'Speichern',
'Drop' => 'Entfernen',
'Database has been dropped.' => 'Datenbank wurde entfernt.',
'Database has been created.' => 'Datenbank wurde erstellt.',
'Database has been renamed.' => 'Datenbank wurde umbenannt.',
'Database has been altered.' => 'Datenbank wurde geändert.',
'Alter database' => 'Datenbank ändern',
'Create database' => 'Datenbank erstellen',
'SQL command' => 'SQL-Kommando',
'Logout' => 'Abmelden',
'database' => 'Datenbank',
'Use' => 'Benutzung',
'No tables.' => 'Keine Tabellen.',
'select' => 'zeigen',
'Item has been deleted.' => 'Datensatz wurde gelöscht.',
'Item has been updated.' => 'Datensatz wurde geändert.',
'Item%s has been inserted.' => 'Datensatz%s wurde eingefügt.',
'Edit' => 'Bearbeiten',
'Insert' => 'Einfügen',
'Save and insert next' => 'Speichern und nächsten einfügen',
'Delete' => 'Entfernen',
'Database' => 'Datenbank',
'Routines' => 'Routinen',
'Indexes have been altered.' => 'Indizes geändert.',
'Indexes' => 'Indizes',
'Alter indexes' => 'Indizes ändern',
'Add next' => 'Hinzufügen',
'Language' => 'Sprache',
'Select' => 'Daten zeigen von',
'New item' => 'Neuer Datensatz',
'Search' => 'Suchen',
'Sort' => 'Ordnen',
'descending' => 'absteigend',
'Limit' => 'Begrenzung',
'No rows.' => 'Keine Datensätze.',
'Action' => 'Aktion',
'edit' => 'bearbeiten',
'Page' => 'Seite',
'Query executed OK, %d row(s) affected.' => array('Abfrage ausgeführt, %d Datensatz betroffen.', 'Abfrage ausgeführt, %d Datensätze betroffen.'),
'Error in query' => 'Fehler in der SQL-Abfrage',
'Execute' => 'Ausführen',
'Table' => 'Tabelle',
'Foreign keys' => 'Fremdschlüssel',
'Triggers' => 'Trigger',
'View' => 'View',
'Unable to select the table' => 'Auswahl der Tabelle fehlgeschlagen',
'Invalid CSRF token. Send the form again.' => 'CSRF Token ungültig. Bitte die Formulardaten erneut abschicken.',
'Comment' => 'Kommentar',
'Default values' => 'Vorgabewerte festlegen',
'%d byte(s)' => array('%d Byte', '%d Bytes'),
'No commands to execute.' => 'Kein Kommando vorhanden.',
'Unable to upload a file.' => 'Hochladen von Datei fehlgeschlagen.',
'File upload' => 'Datei importieren',
'File uploads are disabled.' => 'Importieren von Dateien abgeschaltet.',
'Routine has been called, %d row(s) affected.' => array('Routine wurde ausgeführt, %d Datensatz betroffen.', 'Routine wurde ausgeführt, %d Datensätze betroffen.'),
'Call' => 'Aufrufen',
'No extension' => 'Keine Erweiterungen installiert',
'None of the supported PHP extensions (%s) are available.' => 'Keine der unterstützten PHP-Erweiterungen (%s) ist vorhanden.',
'Session support must be enabled.' => 'Unterstüzung für PHP-Sessions muss aktiviert sein.',
'Session expired, please login again.' => 'Sitzungsdauer abgelaufen, bitte erneut anmelden.',
'Text length' => 'Textlänge',
'Foreign key has been dropped.' => 'Fremdschlüssel wurde entfernt.',
'Foreign key has been altered.' => 'Fremdschlüssel wurde geändert.',
'Foreign key has been created.' => 'Fremdschlüssel wurde erstellt.',
'Foreign key' => 'Fremdschlüssel',
'Target table' => 'Zieltabelle',
'Change' => 'Ändern',
'Source' => 'Ursprung',
'Target' => 'Ziel',
'Add column' => 'Spalte hinzufügen',
'Alter' => 'Ändern',
'Add foreign key' => 'Fremdschlüssel hinzufügen',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Index-Typ',
'Column (length)' => 'Spalte (Länge)',
'View has been dropped.' => 'View wurde entfernt.',
'View has been altered.' => 'View wurde geändert.',
'View has been created.' => 'View wurde erstellt.',
'Alter view' => 'View ändern',
'Create view' => 'View erstellen',
'Name' => 'Name',
'Process list' => 'Prozessliste',
'%d process(es) have been killed.' => array('%d Prozess gestoppt.', '%d Prozesse gestoppt.'),
'Kill' => 'Anhalten',
'Parameter name' => 'Name des Parameters',
'Database schema' => 'Datenbankschema',
'Create procedure' => 'Prozedur erstellen',
'Create function' => 'Funktion erstellen',
'Routine has been dropped.' => 'Routine wurde entfernt.',
'Routine has been altered.' => 'Routine wurde geändert.',
'Routine has been created.' => 'Routine wurde erstellt.',
'Alter function' => 'Funktion ändern',
'Alter procedure' => 'Prozedur ändern',
'Return type' => 'Typ des Rückgabewertes',
'Add trigger' => 'Trigger hinzufügen',
'Trigger has been dropped.' => 'Trigger wurde entfernt.',
'Trigger has been altered.' => 'Trigger wurde geändert.',
'Trigger has been created.' => 'Trigger wurde erstellt.',
'Alter trigger' => 'Trigger ändern',
'Create trigger' => 'Trigger erstellen',
'Time' => 'Zeitpunkt',
'Event' => 'Ereignis',
'%s version: %s through PHP extension %s' => 'Version %s: %s mit PHP-Erweiterung %s',
'%d row(s)' => array('%d Datensatz', '%d Datensätze'),
'Remove' => 'Entfernen',
'Are you sure?' => 'Sind Sie sicher?',
'Privileges' => 'Rechte',
'Create user' => 'Benutzer erstellen',
'User has been dropped.' => 'Benutzer wurde entfernt.',
'User has been altered.' => 'Benutzer wurde geändert.',
'User has been created.' => 'Benutzer wurde erstellt.',
'Hashed' => 'Hashed',
'Column' => 'Spalte',
'Routine' => 'Routine',
'Grant' => 'Erlauben',
'Revoke' => 'Widerrufen',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-Daten sind zu groß. Reduzieren Sie die Größe oder vergrößern Sie den Wert %s in der Konfiguration.',
'Logged as: %s' => 'Angemeldet als: %s',
'Move up' => 'Nach oben',
'Move down' => 'Nach unten',
'Functions' => 'Funktionen',
'Aggregation' => 'Aggregationen',
'Export' => 'Exportieren',
'Output' => 'Ergebnis',
'open' => 'anzeigen',
'save' => 'Datei',
'Format' => 'Format',
'Tables' => 'Tabellen',
'Data' => 'Daten',
'Event has been dropped.' => 'Ereignis wurde entfernt.',
'Event has been altered.' => 'Ereignis wurde geändert.',
'Event has been created.' => 'Ereignis wurde erstellt.',
'Alter event' => 'Ereignis ändern',
'Create event' => 'Ereignis erstellen',
'At given time' => 'Zur angegebenen Zeit',
'Every' => 'Jede',
'Events' => 'Ereignisse',
'Schedule' => 'Zeitplan',
'Start' => 'Start',
'End' => 'Ende',
'Status' => 'Status',
'On completion preserve' => 'Nach der Ausführung erhalten',
'Tables and views' => 'Tabellen und Views',
'Data Length' => 'Datengröße',
'Index Length' => 'Indexgröße',
'Data Free' => 'Freier Bereich',
'Collation' => 'Kollation',
'Analyze' => 'Analysieren',
'Optimize' => 'Optimieren',
'Check' => 'Prüfen',
'Repair' => 'Reparieren',
'Truncate' => 'Leeren (truncate)',
'Tables have been truncated.' => 'Tabellen wurden geleert (truncate).',
'Rows' => 'Datensätze',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Tabellen verschoben.',
'Move to other database' => 'In andere Datenbank verschieben',
'Move' => 'Verschieben',
'Engine' => 'Speicher-Engine',
'Save and continue edit' => 'Speichern und weiter bearbeiten',
'original' => 'Original',
'Tables have been dropped.' => 'Tabellen wurden entfernt (drop).',
'%d item(s) have been affected.' => '%d Artikel betroffen.',
'whole result' => 'Gesamtergebnis',
'Clone' => 'Klonen',
'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 wurde importiert.', '%d Datensätze wurden importiert.'),
'anywhere' => 'beliebig',
'Import' => 'Importieren',
'Stop on error' => 'Bei Fehler anhalten',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 't.m.[jjjj]',
'History' => 'History',
'Variables' => 'Variablen',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Quell- und Zielspalten müssen vom gleichen Datentyp sein, es muss unter den Zielspalten ein Index existieren und die referenzierten Daten müssen existieren.',
'Relations' => 'Relationen',
'Run file' => 'Datei ausführen',
'Clear' => 'Löschen',
'Maximum allowed file size is %sB.' => 'Maximal erlaubte Dateigröße ist %sB.',
'Numbers' => 'Zahlen',
'Date and time' => 'Datum und Zeit',
'Strings' => 'Zeichenketten',
'Binary' => 'Binär',
'Lists' => 'Listen',
'Editor' => 'Editor',
'E-mail' => 'E-Mail',
'From' => 'Von',
'Subject' => 'Betreff',
'Send' => 'Abschicken',
'%d e-mail(s) have been sent.' => array('%d E-Mail abgeschickt.', '%d E-Mails abgeschickt.'),
'Webserver file %s' => 'Webserver Datei %s',
'File does not exist.' => 'Datei existiert nicht.',
'%d in total' => '%d insgesamt',
'Permanent login' => 'Passwort speichern',
'Databases have been dropped.' => 'Datenbanken wurden entfernt.',
'Search data in tables' => 'Suche in Tabellen',
'Schema' => 'Schema',
'Alter schema' => 'Schema ändern',
'Create schema' => 'Schema erstellen',
'Schema has been dropped.' => 'Schema wurde gelöscht.',
'Schema has been created.' => 'Schema wurde erstellt.',
'Schema has been altered.' => 'Schema wurde geändert.',
'Sequences' => 'Sequenzen',
'Create sequence' => 'Sequenz erstellen',
'Alter sequence' => 'Sequenz ändern',
'Sequence has been dropped.' => 'Sequenz wurde gelöscht.',
'Sequence has been created.' => 'Sequenz wurde erstellt.',
'Sequence has been altered.' => 'Sequenz wurde geändert.',
'User types' => 'Benutzerdefinierte Typen',
'Create type' => 'Typ erstellen',
'Alter type' => 'Typ ändern',
'Type has been dropped.' => 'Typ wurde gelöscht.',
'Type has been created.' => 'Typ wurde erstellt.',
'Ctrl+click on a value to modify it.' => 'Ctrl+Klick zum Bearbeiten des Wertes.',
'Use edit link to modify this value.' => 'Benutzen Sie den Link zum Bearbeiten dieses Wertes.',
'last' => 'letzte',
'From server' => 'Vom Server',
'System' => 'Datenbank System',
'Select data' => 'Daten auswählen',
'Show structure' => 'Struktur anzeigen',
'empty' => 'leer',
'Network' => 'Netzwerk',
'Geometry' => 'Geometrie',
'File exists.' => 'Datei existiert schon.',
'Attachments' => 'Anhänge',
'%d query(s) executed OK.' => array('SQL-Abfrage erfolgreich ausgeführt.', '%d SQL-Abfragen 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 bearbeiten',
'HH:MM:SS' => 'HH:MM:SS',
'Compute' => 'kalkulieren',
'Size' => 'Größe',
'Modify' => 'Ändern',
'Selected' => 'Ausgewählte',
'Default value' => 'Vorgabewert festlegen',
'Limit rows' => 'Datensätze begrenzen',
'Tables have been optimized.' => 'Tabellen wurden optimiert.',
'File must be in UTF-8 encoding.' => 'Die Datei muss UTF-8 kodiert sein.',
'Loading' => 'Lade',
'Load more data' => 'Mehr Daten laden',
'Too many unsuccessful logins, try again in %d minute(s).' => array('Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minute noch einmal.', 'Zu viele erfolglose Login-Versuche. Bitte probieren Sie es in %d Minuten noch einmal.'),
'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
'You are offline.' => 'Sie sind offline.',
'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.' ,
'Saving' => 'Speichere',
'yes' => 'ja',
'no' => 'nein',
'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'Das Master-Passwort ist abgelaufen. <a href="https://www.adminer.org/de/extension/" target="_blank">Implementieren</a> Sie die %s Methode, um es permanent zu machen.',
'%d / ' => '%d / ',
);

View File

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

View File

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

@ -1,268 +0,0 @@
<?php
$translations = array(
'Login' => 'Login',
'Logout successful.' => 'Sesión finalizada con éxito.',
'Invalid credentials.' => 'Usuario y/o clave de acceso incorrecta.',
'Server' => 'Servidor',
'Username' => 'Usuario',
'Password' => 'Contraseña',
'Select database' => 'Seleccionar Base de datos',
'Invalid database.' => 'Base de datos incorrecta.',
'Table has been dropped.' => 'Tabla eliminada.',
'Table has been altered.' => 'Tabla modificada.',
'Table has been created.' => 'Tabla creada.',
'Alter table' => 'Modificar tabla',
'Create table' => 'Crear tabla',
'Table name' => 'Nombre de la tabla',
'engine' => 'motor',
'collation' => 'colación',
'Column name' => 'Nombre de columna',
'Type' => 'Tipo',
'Length' => 'Longitud',
'Auto Increment' => 'Incremento automático',
'Options' => 'Opciones',
'Save' => 'Guardar',
'Drop' => 'Eliminar',
'Database has been dropped.' => 'Base de datos eliminada.',
'Database has been created.' => 'Base de datos creada.',
'Database has been renamed.' => 'Base de datos renombrada.',
'Database has been altered.' => 'Base de datos modificada.',
'Alter database' => 'Modificar Base de datos',
'Create database' => 'Crear Base de datos',
'SQL command' => 'Comando SQL',
'Logout' => 'Cerrar sesión',
'database' => 'base de datos',
'Use' => 'Usar',
'No tables.' => 'No existen tablas.',
'select' => 'registros',
'Item has been deleted.' => 'Registro eliminado.',
'Item has been updated.' => 'Registro modificado.',
'Item%s has been inserted.' => 'Registro%s insertado.',
'Edit' => 'Modificar',
'Insert' => 'Agregar',
'Save and insert next' => 'Guardar e insertar siguiente',
'Delete' => 'Eliminar',
'Database' => 'Base de datos',
'Routines' => 'Procedimientos',
'Indexes have been altered.' => 'Indices actualizados.',
'Indexes' => 'Indices',
'Alter indexes' => 'Modificar indices',
'Add next' => 'Agregar',
'Language' => 'Idioma',
'Select' => 'Mostrar',
'New item' => 'Nuevo Registro',
'Search' => 'Condición',
'Sort' => 'Ordenar',
'descending' => 'descendiente',
'Limit' => 'Limite',
'No rows.' => 'No existen registros.',
'Action' => 'Acción',
'edit' => 'modificar',
'Page' => 'Página',
'Query executed OK, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Error in query' => 'Error al ejecutar consulta',
'Execute' => 'Ejecutar',
'Table' => 'Tabla',
'Foreign keys' => 'Claves externas',
'Triggers' => 'Disparadores',
'View' => 'Vista',
'Unable to select the table' => 'No es posible seleccionar la tabla',
'Invalid CSRF token. Send the form again.' => 'Token CSRF inválido. Vuelva a enviar los datos del formulario.',
'Comment' => 'Comentario',
'Default values' => 'Valores predeterminados',
'%d byte(s)' => array('%d byte', '%d bytes'),
'No commands to execute.' => 'No es posible ejecutar ningún comando.',
'Unable to upload a file.' => 'No es posible importar el archivo.',
'File upload' => 'Importar archivo',
'File uploads are disabled.' => 'Importación de archivos deshablilitada.',
'Routine has been called, %d row(s) affected.' => array('Consulta ejecutada, %d registro afectado.', 'Consulta ejecutada, %d registros afectados.'),
'Call' => 'Llamar',
'No extension' => 'No hay extension',
'None of the supported PHP extensions (%s) are available.' => 'Ninguna de las extensiones PHP soportadas (%s) está disponible.',
'Session support must be enabled.' => 'Deben estar habilitadas las sesiones.',
'Session expired, please login again.' => 'Sesión caducada, por favor escriba su clave de nuevo.',
'Text length' => 'Longitud de texto',
'Foreign key has been dropped.' => 'Clave externa eliminada.',
'Foreign key has been altered.' => 'Clave externa modificada.',
'Foreign key has been created.' => 'Clave externa creada.',
'Foreign key' => 'Clave externa',
'Target table' => 'Tabla de destino',
'Change' => 'Modificar',
'Source' => 'Origen',
'Target' => 'Destino',
'Add column' => 'Agregar columna',
'Alter' => 'Modificar',
'Add foreign key' => 'Agregar clave externa',
'ON DELETE' => 'AL BORRAR',
'ON UPDATE' => 'AL ACTUALIZAR',
'Index Type' => 'Tipo de índice',
'Column (length)' => 'Columna (longitud)',
'View has been dropped.' => 'Vista eliminada.',
'View has been altered.' => 'Vista modificada.',
'View has been created.' => 'Vista creada.',
'Alter view' => 'Modificar 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.'),
'Kill' => 'Detener',
'Parameter name' => 'Nombre de Parámetro',
'Database schema' => 'Esquema de base de datos',
'Create procedure' => 'Crear procedimiento',
'Create function' => 'Crear función',
'Routine has been dropped.' => 'Procedimiento eliminado.',
'Routine has been altered.' => 'Procedimiento modificado.',
'Routine has been created.' => 'Procedimiento creado.',
'Alter function' => 'Modificar Función',
'Alter procedure' => 'Modificar procedimiento',
'Return type' => 'Tipo de valor de vuelta',
'Add trigger' => 'Agregar disparador',
'Trigger has been dropped.' => 'Disparador eliminado.',
'Trigger has been altered.' => 'Disparador modificado.',
'Trigger has been created.' => 'Disparador creado.',
'Alter trigger' => 'Modificar Disparador',
'Create trigger' => 'Agregar Disparador',
'Time' => 'Tiempo',
'Event' => 'Evento',
'%s version: %s through PHP extension %s' => 'Versión %s: %s a través de la extensión de PHP %s',
'%d row(s)' => array('%d registro', '%d registros'),
'Remove' => 'Eliminar',
'Are you sure?' => 'Está seguro?',
'Privileges' => 'Privilegios',
'Create user' => 'Crear Usuario',
'User has been dropped.' => 'Usuario eliminado.',
'User has been altered.' => 'Usuario modificado.',
'User has been created.' => 'Usuario creado.',
'Hashed' => 'Hash',
'Column' => 'Columna',
'Routine' => 'Rutina',
'Grant' => 'Conceder',
'Revoke' => 'Impedir',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST data demasiado grande. Reduzca el tamaño o aumente la directiva de configuración %s.',
'Logged as: %s' => 'Logeado como: %s',
'Move up' => 'Mover arriba',
'Move down' => 'Mover abajo',
'Functions' => 'Funciones',
'Aggregation' => 'Agregados',
'Export' => 'Exportar',
'Output' => 'Salida',
'open' => 'mostrar',
'save' => 'archivo',
'Format' => 'Formato',
'Tables' => 'Tablas',
'Data' => 'Datos',
'Event has been dropped.' => 'Evento eliminado.',
'Event has been altered.' => 'Evento modificado.',
'Event has been created.' => 'Evento creado.',
'Alter event' => 'Modificar Evento',
'Create event' => 'Crear Evento',
'At given time' => 'En el momento indicado',
'Every' => 'Cada',
'Events' => 'Eventos',
'Schedule' => 'Agenda',
'Start' => 'Inicio',
'End' => 'Fin',
'Status' => 'Estado',
'On completion preserve' => 'Al completar mantener',
'Tables and views' => 'Tablas y vistas',
'Data Length' => 'Longitud de datos',
'Index Length' => 'Longitud de índice',
'Data Free' => 'Espacio libre',
'Collation' => 'Colación',
'Analyze' => 'Analizar',
'Optimize' => 'Optimizar',
'Check' => 'Comprobar',
'Repair' => 'Reparar',
'Truncate' => 'Vaciar',
'Tables have been truncated.' => 'Las tablas han sido vaciadas.',
'Rows' => 'Registros',
',' => ' ',
'0123456789' => '0123456789',
'Tables have been moved.' => 'Se movieron las tablas.',
'Move to other database' => 'Mover a otra base de datos',
'Move' => 'Mover',
'Engine' => 'Motor',
'Save and continue edit' => 'Guardar y continuar editando',
'original' => 'original',
'Tables have been dropped.' => 'Tablas eliminadas.',
'%d item(s) have been affected.' => array('%d elemento afectado.', '%d elementos afectados.'),
'whole result' => 'resultado completo',
'Clone' => 'Clonar',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'Excedida la cantidad máxima de campos permitidos. 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',
'Import' => 'Importar',
'Stop on error' => 'Parar en caso de error',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$5/$3/$1',
'[yyyy]-mm-dd' => 'dd/mm/[aaaa]',
'History' => 'Histórico',
'Variables' => 'Variables',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Las columnas de origen y destino deben ser del mismo tipo, debe existir un índice entre las columnas del destino y el registro referenciado debe existir también.',
'Relations' => 'Relaciones',
'Run file' => 'Ejecutar Archivo',
'Clear' => 'Vaciar',
'Maximum allowed file size is %sB.' => 'El tamaño máximo de archivo es %sB.',
'Numbers' => 'Números',
'Date and time' => 'Fecha y hora',
'Strings' => 'Cadena',
'Binary' => 'Binario',
'Lists' => 'Listas',
'Editor' => 'Editor',
'E-mail' => 'Email',
'From' => 'De',
'Subject' => 'Asunto',
'Send' => 'Enviar',
'%d e-mail(s) have been sent.' => array('%d email enviado.', '%d emails enviados.'),
'Webserver file %s' => 'Archivo de servidor web %s',
'File does not exist.' => 'Ese archivo no existe.',
'%d in total' => '%d en total',
'Permanent login' => 'Guardar contraseña',
'Databases have been dropped.' => 'Bases de datos eliminadas.',
'Search data in tables' => 'Buscar datos en tablas',
'Schema' => 'Esquema',
'Alter schema' => 'Modificar esquema',
'Create schema' => 'Crear esquema',
'Schema has been dropped.' => 'Esquema eliminado.',
'Schema has been created.' => 'Esquema creado.',
'Schema has been altered.' => 'Esquema modificado.',
'Sequences' => 'Secuencias',
'Create sequence' => 'Crear secuencias',
'Alter sequence' => 'Modificar secuencia',
'Sequence has been dropped.' => 'Secuencia eliminada.',
'Sequence has been created.' => 'Secuencia creada.',
'Sequence has been altered.' => 'Secuencia modificada.',
'User types' => 'Tipos definidos por el usuario',
'Create type' => 'Crear tipo',
'Alter type' => 'Modificar tipo',
'Type has been dropped.' => 'Tipo eliminado.',
'Type has been created.' => 'Tipo creado.',
'Ctrl+click on a value to modify it.' => 'Ctrl+clic sobre el valor para editarlo.',
'Use edit link to modify this value.' => 'Utilice el enlace de edición para realizar cambios.',
'last' => 'último',
'From server' => 'Desde servidor',
'System' => 'Motor de base de datos',
'Select data' => 'Visualizar contenido',
'Show structure' => 'Mostrar estructura',
'empty' => 'ningúno',
'Network' => 'Red',
'Geometry' => 'Geometría',
'File exists.' => 'Ese 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

@ -1,268 +0,0 @@
<?php
$translations = array(
'Login' => 'Logi sisse',
'Logout successful.' => 'Väljalogimine õnnestus.',
'Invalid credentials.' => 'Ebakorrektsed andmed.',
'Server' => 'Server',
'Username' => 'Kasutajanimi',
'Password' => 'Parool',
'Select database' => 'Vali andmebaas',
'Invalid database.' => 'Tundmatu andmebaas.',
'Table has been dropped.' => 'Tabel on edukalt kustutatud.',
'Table has been altered.' => 'Tabeli andmed on edukalt muudetud.',
'Table has been created.' => 'Tabel on edukalt loodud.',
'Alter table' => 'Muuda tabeli struktuuri',
'Create table' => 'Loo uus tabel',
'Table name' => 'Tabeli nimi',
'engine' => 'andmebaasimootor',
'collation' => 'tähetabel',
'Column name' => 'Veeru nimi',
'Type' => 'Tüüp',
'Length' => 'Pikkus',
'Auto Increment' => 'Automaatselt suurenev',
'Options' => 'Valikud',
'Save' => 'Salvesta',
'Drop' => 'Kustuta',
'Database has been dropped.' => 'Andmebaas on edukalt kustutatud.',
'Database has been created.' => 'Andmebaas on edukalt loodud.',
'Database has been renamed.' => 'Andmebaas on edukalt ümber nimetatud.',
'Database has been altered.' => 'Andmebaasi struktuuri uuendamine õnnestus.',
'Alter database' => 'Muuda andmebaasi',
'Create database' => 'Loo uus andmebaas',
'SQL command' => 'SQL-Päring',
'Logout' => 'Logi välja',
'database' => 'andmebaas',
'Use' => 'Kasuta',
'No tables.' => 'Tabeleid ei leitud.',
'select' => 'kuva',
'Item has been deleted.' => 'Kustutamine õnnestus.',
'Item has been updated.' => 'Uuendamine õnnestus.',
'Item%s has been inserted.' => 'Kirje%s on edukalt lisatud.',
'Edit' => 'Muuda',
'Insert' => 'Sisesta',
'Save and insert next' => 'Salvesta ja lisa järgmine',
'Delete' => 'Kustuta',
'Database' => 'Andmebaas',
'Routines' => 'Protseduurid',
'Indexes have been altered.' => 'Indeksite andmed on edukalt uuendatud.',
'Indexes' => 'Indeksid',
'Alter indexes' => 'Muuda indekseid',
'Add next' => 'Lisa järgmine',
'Language' => 'Keel',
'Select' => 'Kuva',
'New item' => 'Lisa kirje',
'Search' => 'Otsi',
'Sort' => 'Sorteeri',
'descending' => 'kahanevalt',
'Limit' => 'Piira',
'No rows.' => 'Sissekanded puuduvad.',
'Action' => 'Tegevus',
'edit' => 'muuda',
'Page' => 'Lehekülg',
'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',
'Foreign keys' => 'Võõrvõtmed (foreign key)',
'Triggers' => 'Päästikud (trigger)',
'View' => 'Vaata',
'Unable to select the table' => 'Tabeli valimine ebaõnnestus',
'Invalid CSRF token. Send the form again.' => 'Sobimatu CSRF, palun postitage vorm uuesti.',
'Comment' => 'Kommentaar',
'Default values' => 'Vaikimisi väärtused',
'%d byte(s)' => array('%d bait', '%d baiti'),
'No commands to execute.' => 'Käsk puudub.',
'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.' => '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).',
'Session support must be enabled.' => 'Sessioonid peavad olema lubatud.',
'Session expired, please login again.' => 'Sessioon on aegunud, palun logige uuesti sisse.',
'Text length' => 'Teksti pikkus',
'Foreign key has been dropped.' => 'Võõrvõti on edukalt kustutatud.',
'Foreign key has been altered.' => 'Võõrvõtme andmed on edukalt muudetud.',
'Foreign key has been created.' => 'Võõrvõri on edukalt loodud.',
'Foreign key' => 'Võõrvõti',
'Target table' => 'Siht-tabel',
'Change' => 'Muuda',
'Source' => 'Allikas',
'Target' => 'Sihtkoht',
'Add column' => 'Lisa veerg',
'Alter' => 'Muuda',
'Add foreign key' => 'Lisa võõrvõti',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Index Type' => 'Indeksi tüüp',
'Column (length)' => 'Veerg (pikkus)',
'View has been dropped.' => 'Vaade (VIEW) on edukalt kustutatud.',
'View has been altered.' => 'Vaade (VIEW) on edukalt muudetud.',
'View has been created.' => 'Vaade (VIEW) on edukalt loodud.',
'Alter view' => 'Muuda vaadet (VIEW)',
'Create view' => 'Loo uus vaade (VIEW)',
'Name' => 'Nimi',
'Process list' => 'Protsesside nimekiri',
'%d process(es) have been killed.' => array('Protsess on edukalt peatatud (%d).', 'Valitud protsessid (%d) on edukalt peatatud.'),
'Kill' => 'Peata',
'Parameter name' => 'Parameetri nimi',
'Database schema' => 'Andmebaasi skeem',
'Create procedure' => 'Loo uus protseduur',
'Create function' => 'Loo uus funktsioon',
'Routine has been dropped.' => 'Protseduur on edukalt kustutatud.',
'Routine has been altered.' => 'Protseduuri andmed on edukalt muudetud.',
'Routine has been created.' => 'Protseduur on edukalt loodud.',
'Alter function' => 'Muuda funktsiooni',
'Alter procedure' => 'Muuda protseduuri',
'Return type' => 'Tagastustüüp',
'Add trigger' => 'Lisa päästik (TRIGGER)',
'Trigger has been dropped.' => 'Päästik on edukalt kustutatud.',
'Trigger has been altered.' => 'Päästiku andmed on edukalt uuendatud.',
'Trigger has been created.' => 'Uus päästik on edukalt loodud.',
'Alter trigger' => 'Muuda päästiku andmeid',
'Create trigger' => 'Loo uus päästik (TRIGGER)',
'Time' => 'Aeg',
'Event' => 'Sündmus',
'%d row(s)' => '%d rida',
'Remove' => 'Eemalda',
'Are you sure?' => 'Kas oled kindel?',
'Privileges' => 'Õigused',
'Create user' => 'Loo uus kasutaja',
'User has been dropped.' => 'Kasutaja on edukalt kustutatud.',
'User has been altered.' => 'Kasutaja andmed on edukalt muudetud.',
'User has been created.' => 'Kasutaja on edukalt lisatud.',
'Hashed' => 'Häshitud (Hashed)',
'Column' => 'Veerg',
'Routine' => 'Protseduur',
'Grant' => 'Anna',
'Revoke' => 'Eemalda',
'%s version: %s through PHP extension %s' => '%s versioon: %s, kasutatud PHP moodul: %s',
'Logged as: %s' => 'Sisse logitud: %s',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST-andmete maht on liialt suur. Palun vähendage andmeid või suurendage %s php-seadet.',
'Move up' => 'Liiguta ülespoole',
'Move down' => 'Liiguta allapoole',
'Export' => 'Ekspordi',
'Tables' => 'Tabelid',
'Data' => 'Andmed',
'Output' => 'Väljund',
'open' => 'näita brauseris',
'save' => 'salvesta failina',
'Format' => 'Formaat',
'Functions' => 'Funktsioonid',
'Aggregation' => 'Liitmine',
'Event has been dropped.' => 'Sündmus on edukalt kustutatud.',
'Event has been altered.' => 'Sündmuse andmed on edukalt uuendatud.',
'Event has been created.' => 'Sündmus on edukalt loodud.',
'Alter event' => 'Muuda sündmuse andmeid',
'Create event' => 'Loo uus sündmus (EVENT)',
'Start' => 'Alusta',
'End' => 'Lõpeta',
'Every' => 'Iga',
'Status' => 'Staatus',
'On completion preserve' => 'Lõpetamisel jäta sündmus alles',
'Events' => 'Sündmused (EVENTS)',
'Schedule' => 'Ajakava',
'At given time' => 'Antud ajahetkel',
'Save and continue edit' => 'Salvesta ja jätka muutmist',
'original' => 'originaal',
'Tables have been truncated.' => 'Validud tabelid on edukalt tühjendatud.',
'Tables have been moved.' => 'Valitud tabelid on edukalt liigutatud.',
'Tables have been dropped.' => 'Valitud tabelid on edukalt kustutatud.',
'Tables and views' => 'Tabelid ja vaated',
'Engine' => 'Implementatsioon',
'Collation' => 'Tähetabel',
'Data Length' => 'Andmete pikkus',
'Index Length' => 'Indeksi pikkus',
'Data Free' => 'Vaba ruumi',
'Rows' => 'Ridu',
',' => ',',
'0123456789' => '0123456789',
'Analyze' => 'Analüüsi',
'Optimize' => 'Optimeeri',
'Check' => 'Kontrolli',
'Repair' => 'Paranda',
'Truncate' => 'Tühjenda',
'Move to other database' => 'Liiguta teise andmebaasi',
'Move' => 'Liiguta',
'%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.' => '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.' => 'Imporditi %d rida.',
'anywhere' => 'vahet pole',
'Import' => 'Impordi',
'Stop on error' => 'Peatuda vea esinemisel',
'%.3f s' => '%.3f s',
'$1-$3-$5' => '$6.$4.$1',
'[yyyy]-mm-dd' => 'd.m.[yyyy]',
'History' => 'Ajalugu',
'Variables' => 'Muutujad',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'Lähte- ja sihtveerud peavad eksisteerima ja omama sama andmetüüpi, sihtveergudel peab olema määratud indeks ning viidatud andmed peavad eksisteerima.',
'Relations' => 'Seosed',
'Run file' => 'Käivita fail',
'Clear' => 'Puhasta',
'Maximum allowed file size is %sB.' => 'Maksimaalne failisuurus %sB.',
'Numbers' => 'Numbrilised',
'Date and time' => 'Kuupäev ja kellaaeg',
'Strings' => 'Tekstid',
'Binary' => 'Binaar',
'Lists' => 'Listid',
'Editor' => 'Redaktor',
'E-mail' => 'E-post',
'From' => 'Kellelt',
'Subject' => 'Pealkiri',
'Send' => 'Saada',
'%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',
'Permanent login' => 'Jäta mind meelde',
'Databases have been dropped.' => 'Andmebaasid on edukalt kustutatud.',
'Search data in tables' => 'Otsi kogu andmebaasist',
'Schema' => 'Struktuur',
'Alter schema' => 'Muuda struktuuri',
'Create schema' => 'Loo struktuur',
'Schema has been dropped.' => 'Struktuur on edukalt kustutatud.',
'Schema has been created.' => 'Struktuur on edukalt loodud.',
'Schema has been altered.' => 'Struktuur on edukalt muudetud.',
'Sequences' => 'Jadad (sequences)',
'Create sequence' => 'Loo jada',
'Alter sequence' => 'Muuda jada',
'Sequence has been dropped.' => 'Jada on edukalt kustutatud.',
'Sequence has been created.' => 'Jada on edukalt loodud.',
'Sequence has been altered.' => 'Jada on edukalt muudetud.',
'User types' => 'Kasutajatüübid',
'Create type' => 'Loo tüüp',
'Alter type' => 'Muuda tüüpi',
'Type has been dropped.' => 'Tüüp on edukalt kustutatud.',
'Type has been created.' => 'Tüüp on edukalt loodud.',
'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',
'System' => 'Andmebaasimootor',
'Select data' => 'Vaata andmeid',
'Show structure' => 'Näita struktuuri',
'empty' => 'tühi',
'Network' => 'Võrk (network)',
'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',
);

View File

@ -1,334 +0,0 @@
<?php
$translations = array(
// label for database system selection (MySQL, SQLite, ...)
'System' => 'سیستم',
'Server' => 'سرور',
'Username' => 'نام کاربری',
'Password' => 'کلمه عبور',
'Permanent login' => 'ورود دائم',
'Login' => 'ورود',
'Logout' => 'خروج',
'Logged as: %s' => 'ورود به عنوان: %s',
'Logout successful.' => 'با موفقیت خارج شدید.',
'Invalid credentials.' => 'اعتبار سنجی نامعتبر.',
'Too many unsuccessful logins, try again in %d minute(s).' => array('ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.', 'ورودهای ناموفق بیش از حد، %d دقیقه دیگر تلاش نمایید.'),
'Master password expired. <a href="https://www.adminer.org/en/extension/" target="_blank">Implement</a> %s method to make it permanent.' => 'رمز اصلی باطل شده است. روش %s را <a href="https://www.adminer.org/en/extension/" target="_blank">پیاده سازی</a> کرده تا آن را دائمی سازید.',
'Language' => 'زبان',
'Invalid CSRF token. Send the form again.' => 'CSRF token نامعتبر است. دوباره سعی کنید.',
'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 توسعه پی اچ پی %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' => 'دستور SQL',
'%d query(s) executed OK.' => '%d کوئری اجرا شد.',
'Query executed OK, %d row(s) affected.' => 'کوئری اجرا شد. %d سطر تغیر کرد.',
'No commands to execute.' => 'دستوری برای اجرا وجود ندارد.',
'Error in query' => 'خطا در کوئری',
'Execute' => 'اجرا',
'Stop on error' => 'توقف بر روی خطا',
'Show only errors' => 'فقط نمایش خطاها',
// sprintf() format for time of the command
'%.3f s' => '%.3f s',
'History' => 'تاریخ',
'Clear' => 'پاک کردن',
'Edit all' => 'ویرایش همه',
'File upload' => 'بارگذاری فایل',
'From server' => 'از سرور',
'Webserver file %s' => '%s فایل وب سرور',
'Run file' => 'اجرای فایل',
'File does not exist.' => 'فایل وجود ندارد.',
'File uploads are disabled.' => 'بارگذاری غیر فعال است.',
'Unable to upload a file.' => 'قادر به بارگذاری فایل نیستید.',
'Maximum allowed file size is %sB.' => ' %sB حداکثر اندازه فایل.',
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'حجم داده ارسالی برزگ است. حجم داده کاهش دهید و یا مقدار %s را در پیکربندی افزایش دهید.',
'You can upload a big SQL file via FTP and import it from server.' => 'شما می توانید فایل SQL حجیم را از طریق FTP بارگزاری و از روی سرور وارد نمایید.',
'You are offline.' => 'شما آفلاین می باشید.',
'Export' => 'استخراج',
'Output' => 'خروجی',
'open' => 'بازکردن',
'save' => 'ذخیره',
'Format' => 'حذف',
'Data' => 'داده',
'Database' => 'پایگاه داده',
'database' => 'پایگاه داده',
'Use' => 'استفاده',
'Select database' => 'انتخاب پایگاه داده',
'Invalid database.' => 'پایگاه داده نامعتبر.',
'Database has been dropped.' => 'پایگاه داده حذف شد.',
'Databases have been dropped.' => 'پایگاه های داده حذف شدند.',
'Database has been created.' => 'پایگاه داده ایجاد شد.',
'Database has been renamed.' => 'نام پایگاه داده تغیر کرد.',
'Database has been altered.' => 'پایگاه داده ویرایش شد.',
'Alter database' => 'ویرایش پایگاه داده',
'Create database' => 'ایجاد پایگاه داده',
'Database schema' => 'ساختار پایگاه داده',
// link to current database schema layout
'Permanent link' => 'ارتباط دائم',
// thousands separator - must contain single byte
',' => ' ',
'0123456789' => '۰۱۲۳۴۵۶۷۸۹',
'Engine' => 'موتور',
'Collation' => 'تطبیق',
'Data Length' => 'طول داده',
'Index Length' => 'طول ایندکس',
'Data Free' => 'داده اختیاری',
'Rows' => 'سطرها',
'%d in total' => ' به طور کل %d ',
'Analyze' => 'تحلیل',
'Optimize' => 'بهینه سازی',
'Vacuum' => 'پاک سازی',
'Check' => 'بررسی',
'Repair' => 'تعمیر',
'Truncate' => 'کوتاه کردن',
'Tables have been truncated.' => 'جدولها بریده شدند.',
'Move to other database' => 'انتقال به یک پایگاه داده دیگر',
'Move' => 'انتقال',
'Tables have been moved.' => 'جدولها انتقال داده شدند.',
'Copy' => 'کپی کردن',
'Tables have been copied.' => 'جدولها کپی شدند.',
'Routines' => 'روالها',
'Routine has been called, %d row(s) affected.' => array('روال فراخوانی شد %d سطر متاثر شد.', 'روال فراخوانی شد %d سطر متاثر شد.'),
'Call' => 'صدا زدن',
'Parameter name' => 'نام پارامتر',
'Create procedure' => 'ایجاد زیربرنامه',
'Create function' => 'ایجاد تابع',
'Routine has been dropped.' => 'روال حذف شد.',
'Routine has been altered.' => 'روال ویرایش شد.',
'Routine has been created.' => 'روال ایجاد شد.',
'Alter function' => 'ویرایش تابع',
'Alter procedure' => 'ویرایش زیربرنامه',
'Return type' => 'برگرداندن نوع',
'Events' => 'رویدادها',
'Event has been dropped.' => 'رویداد حذف شد.',
'Event has been altered.' => 'رویداد ویرایش شد.',
'Event has been created.' => 'رویداد ایجاد شد.',
'Alter event' => 'ویرایش رویداد',
'Create event' => 'ایجاد رویداد',
'At given time' => 'زمان معین',
'Every' => 'همه',
'Schedule' => 'زمانبندی',
'Start' => 'آغاز',
'End' => 'پایان',
'On completion preserve' => 'تکمیل حفاظت فعال است',
'Tables' => 'جدولها',
'Tables and views' => 'جدولها و نمایه ها',
'Table' => 'جدول',
'No tables.' => 'جدولی وجود ندارد',
'Alter table' => 'ویرایش جدول',
'Create table' => 'ایجاد جدول',
'Table has been dropped.' => 'جدول حذف شد.',
'Tables have been dropped.' => 'جدولها حذف شدند.',
'Tables have been optimized.' => 'جدولها بهینه شدند.',
'Table has been altered.' => 'جدول ویرایش شد.',
'Table has been created.' => 'جدول ایجاد شد.',
'Table name' => 'نام جدول',
'Show structure' => 'نمایش ساختار',
'engine' => 'موتور',
'collation' => 'تطبیق',
'Column name' => 'نام ستون',
'Type' => 'نوع',
'Length' => 'طول',
'Auto Increment' => 'افزایش خودکار',
'Options' => 'اختیارات',
'Comment' => 'توضیح',
'Default value' => 'مقدار پیش فرض',
'Default values' => 'مقادیر پیش فرض',
'Drop' => 'حذف',
'Are you sure?' => 'مطمئن هستید؟',
'Size' => 'حجم',
'Compute' => 'محاسبه',
'Move up' => 'انتقال به بالا',
'Move down' => 'انتقال به پایین',
'Remove' => 'حذف',
'Maximum number of allowed fields exceeded. Please increase %s.' => 'حداکثر تعداد فیلدهای مجاز اشباع شد. لطفا %s را افزایش دهید.',
'Partition by' => 'بخشبندی توسط',
'Partitions' => 'بخشبندیها',
'Partition name' => 'نام بخش',
'Values' => 'مقادیر',
'View' => 'نمایش',
'Materialized view' => 'نمایه مادی',
'View has been dropped.' => 'نمایش حذف شد.',
'View has been altered.' => 'نمایش ویرایش شد.',
'View has been created.' => 'نمایش ایجاد شد.',
'Alter view' => 'حذف نمایش',
'Create view' => 'ایجاد نمایش',
'Indexes' => 'ایندکسها',
'Indexes have been altered.' => 'ایندکسها ویرایش شدند.',
'Alter indexes' => 'ویرایش ایندکسها',
'Add next' => 'افرودن بعدی',
'Index Type' => 'نوع ایندکس',
'Column (length)' => 'ستون (طول)',
'Foreign keys' => 'کلیدهای خارجی',
'Foreign key' => 'کلید خارجی',
'Foreign key has been dropped.' => 'کلید خارجی حذف شد.',
'Foreign key has been altered.' => 'کلید خارجی ویرایش شد.',
'Foreign key has been created.' => 'کلید خارجی ایجاد شد.',
'Target table' => 'جدول هدف',
'Change' => 'تغییر',
'Source' => 'منبع',
'Target' => 'هدف',
'Add column' => 'افزودن ستون',
'Alter' => 'ویرایش',
'Add foreign key' => 'افزودن کلید خارجی',
'ON DELETE' => 'ON DELETE',
'ON UPDATE' => 'ON UPDATE',
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => 'داده مبدا و مقصد ستونها بایستی شبیه هم باشند.',
'Triggers' => 'تریگرها',
'Add trigger' => 'افزودن تریگر',
'Trigger has been dropped.' => 'تریگر حذف شد.',
'Trigger has been altered.' => 'تریگر ویرایش شد.',
'Trigger has been created.' => 'تریگر ایجاد شد.',
'Alter trigger' => 'ویرایش تریگر',
'Create trigger' => 'ایجاد تریگر',
'Time' => 'زمان',
'Event' => 'رویداد',
'Name' => 'نام',
'select' => 'انتخاب',
'Select' => 'انتخاب',
'Select data' => 'انتخاب داده',
'Functions' => 'توابع',
'Aggregation' => 'تجمع',
'Search' => 'جستجو',
'anywhere' => 'هرکجا',
'Search data in tables' => 'جستجوی داده در جدول',
'Sort' => 'مرتب کردن',
'descending' => 'نزولی',
'Limit' => 'محدودیت',
'Limit rows' => 'محدودیت سطرها',
'Text length' => 'طول متن',
'Action' => 'عملیات',
'Full table scan' => 'اسکن کامل جدول',
'Unable to select the table' => 'قادر به انتخاب جدول نیستید',
'No rows.' => 'سطری وجود ندارد',
'%d / ' => '%d / ',
'%d row(s)' => array('%d سطر', '%d سطر'),
'Page' => 'صفحه',
'last' => 'آخری',
'Load more data' => 'بارگزاری اطلاعات بیشتر',
'Loading' => 'در حال بارگزاری',
'whole result' => 'همه نتایج',
'%d byte(s)' => array('%d بایت', '%d بایت'),
'Import' => 'وارد کردن',
'%d row(s) have been imported.' => array('%d سطر وارد شد.', '%d سطر وارد شد.'),
'File must be in UTF-8 encoding.' => 'فرمت فایل باید UTF-8 باشید.',
// in-place editing in select
'Modify' => 'ویرایش',
'Ctrl+click on a value to modify it.' => 'برای ویرایش بر روی مقدار ctrl+click کنید.',
'Use edit link to modify this value.' => 'از لینک ویرایش برای ویرایش این مقدار استفاده کنید.',
// %s can contain auto-increment value
'Item%s has been inserted.' => '%s آیتم درج شد.',
'Item has been deleted.' => 'آیتم حذف شد.',
'Item has been updated.' => 'آیتم بروز رسانی شد.',
'%d item(s) have been affected.' => array('%d آیتم متاثر شد.', '%d آیتم متاثر شد.'),
'New item' => 'آیتم جدید',
'original' => 'اصلی',
// label for value '' in enum data type
'empty' => 'خالی',
'edit' => 'ویرایش',
'Edit' => 'ویرایش',
'Insert' => 'درج',
'Save' => 'ذخیره',
'Save and continue edit' => 'ذخیره و ادامه ویرایش',
'Save and insert next' => 'ذخیره و درج بعدی',
'Selected' => 'انتخاب شده',
'Clone' => 'تکثیر',
'Delete' => 'حذف',
'You have no privileges to update this table.' => 'شما اختیار ویرایش این جدول را ندارید.',
'E-mail' => 'پست الکترونیک',
'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' => 'اکنون',
'yes' => 'بله',
'no' => 'خیر',
// general SQLite error in create, drop or rename database
'File exists.' => 'فایل موجود است.',
'Please use one of the extensions %s.' => 'لطفا یکی از پسوندها را انتخاب نمائید %s.',
// PostgreSQL and MS SQL schema support
'Alter schema' => 'ویرایش ساختار',
'Create schema' => 'ایجاد ساختار',
'Schema has been dropped.' => 'ساختار حذف شد.',
'Schema has been created.' => 'ساختار ایجاد شد.',
'Schema has been altered.' => 'ساختار ویرایش شد.',
'Schema' => 'ساختار',
'Invalid schema.' => 'ساختار نامعتبر.',
// PostgreSQL sequences support
'Sequences' => 'صف ها',
'Create sequence' => 'ایجاد صف',
'Sequence has been dropped.' => 'صف حذف شد.',
'Sequence has been created.' => 'صف ایجاد شد.',
'Sequence has been altered.' => 'صف ویرایش شد.',
'Alter sequence' => 'ویرایش صف',
// PostgreSQL user types support
'User types' => 'انواع کاربر',
'Create type' => 'ایجاد نوع',
'Type has been dropped.' => 'نوع حذف شد.',
'Type has been created.' => 'نوع ایجاد شد.',
'Alter type' => 'ویرایش نوع',
);

View File

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

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