This commit is contained in:
2021-08-10 15:48:44 -04:00
parent 2d4f48f3a9
commit ed28bf360b
8 changed files with 320 additions and 0 deletions

View File

@ -0,0 +1,4 @@
<?php
require_once('plugins/dump-json.php');
return new AdminerDumpJson();

View File

@ -0,0 +1,4 @@
<?php
require_once('plugins/edit-foreign.php');
return new AdminerEditForeign();

View File

@ -0,0 +1,4 @@
<?php
require_once('plugins/enum-option.php');
return new AdminerEnumOption();

View File

@ -0,0 +1,4 @@
<?php
require_once('plugins/json-column.php');
return new AdminerJsonColumn();

View File

@ -0,0 +1,8 @@
<?php
require_once 'plugins/database-hide.php';
return new AdminerDatabaseHide([
'mysql',
'information_schema',
'performance_schema'
]);

View File

@ -0,0 +1,142 @@
<?php
/*
* AdminerDumpMarkdown - dump to MARKDOWN format v0.7 (October 14th, 2020)
*
* @link https://github.com/fthiella/adminer-plugin-dump-markdown
* @author Federico Thiella, https://fthiella.github.io/
* @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)
*
*/
class AdminerDumpMarkdown {
private $type = 'markdown';
private $format = 'Markdown';
function _format_value($s, $l, $c) {
return (strlen(utf8_decode($s)) > $l) ? substr($s, 0, $l) : $s.str_repeat($c, $l-strlen(utf8_decode($s)));
}
function _map($array, $width, $c) {
foreach ($array as $k => &$v) $v = $this->_format_value($v, $width[$k], $c);
return $array;
}
function _map_header($array) {
foreach ($array as $k => &$v) $v = $k;
return $array;
}
function _map_mtable($array) {
foreach ($array as $k => &$v) $v = '-';
return $array;
}
function _markdown_row($row, $column_width, $separator, $filler) {
return implode($separator, $this->_map($row, $column_width, $filler));
}
function _markdown_table($rows, $column_width) {
$content = $this->_markdown_row($this->_map_header($rows[0]), $column_width, " | ", " ") . "\n";
$content .= $this->_markdown_row($this->_map_mtable($rows[0]), $column_width, "-|-", "-") . "\n";
foreach ($rows as $row) {
$content .= $this->_markdown_row($row, $column_width, " | ", " ") . "\n";
}
return $content;
}
function _bool($value) {
return $value == 1 ? 'Yes' : 'No';
}
function dumpFormat() {
return array($this->type => $this->format);
}
function dumpDatabase($db) {
if ($_POST["format"] == $this->type) {
echo '# ' . $db . "\n\n";
return true;
}
}
/* export table structure */
function dumpTable($table, $style, $is_view = false) {
if ($_POST["format"] == $this->type) {
echo '## ' . addcslashes($table, "\n\"\\") . "\n\n";
if ($style) {
echo "### table structure\n\n";
$field_rows = array();
$field_width = (['Column name' => 11, 'Type' => 4, 'Comment' => 7, 'Null' => 4, 'AI' => 2]);
foreach (fields($table) as $field) {
$new_row = [
'Column name' => $field['field'],
'Type' => $field['full_type'],
'Comment' => $field['comment'],
'Null' => $this->_bool($field['null']),
'AI' => $this->_bool($field['auto_increment'])
];
array_push($field_rows, $new_row);
foreach ($new_row as $key => $val) {
$field_width[$key] = max($field_width[$key], strlen(utf8_decode($new_row[$key])));
}
}
echo $this->_markdown_table($field_rows, $field_width);
echo "\n";
}
return true;
}
}
/* export table data */
function dumpData($table, $style, $query) {
if ($_POST["format"] == $this->type) {
echo "### table data\n\n";
$connection = connection();
$result = $connection->query($query, 1);
if ($result) {
$rn = 0;
$sample_rows = array();
$column_width = array();
while ($row = $result->fetch_assoc()) {
switch(true) {
case $rn==0:
foreach ($row as $key => $val) {
$column_width[$key] = strlen(utf8_decode($key));
}
case $rn<100:
$sample_rows[$rn]=$row;
foreach ($row as $key => $val) {
$column_width[$key] = max($column_width[$key], strlen(utf8_decode($row[$key])));
}
break;
case $rn==100:
echo $this->_markdown_table($sample_rows, $column_width);
default:
echo $this->_markdown_row($row, $column_width, " | ", " ") . "\n";
}
$rn++;
}
if ($rn<100) {
echo $this->_markdown_table($sample_rows, $column_width);
}
echo "\n";
}
return true;
}
}
function dumpHeaders($identifier, $multi_table = false) {
if ($_POST["format"] == $this->type) {
header("Content-Type: text/text; charset=utf-8");
return "md";
}
}
}

View File

@ -0,0 +1,86 @@
<?php
class AdminerForeignKeys {
function head() {
?>
<script<?php echo nonce(); ?>>
document.addEventListener("DOMContentLoaded", function()
{
collapsable = document.getElementsByClassName('collapsable')
for (item of collapsable) {
item.addEventListener('click', function () {
moreDiv = this.parentElement.getElementsByClassName('fk-more')[0]
if (moreDiv.classList.contains('hidden')) {
moreDiv.classList.remove('hidden')
this.innerHTML = " [<a>less</a>]"
} else {
moreDiv.classList.add('hidden')
this.innerHTML = " [<a>more</a>]"
}
})
}
})
</script>
<style>
.collapsable {
cursor: pointer;
}
</style>
<?php
return true;
}
function backwardKeys($table, $tableName) {
$connection = connection();
$database = $connection->query('SELECT DATABASE() AS db;')->fetch_assoc();
$result = $connection->query(sprintf('SELECT TABLE_NAME,COLUMN_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = \'%s\' AND CONSTRAINT_SCHEMA = \'%s\';', $tableName, $database['db']));
$backwardKeys = [];
$i = 0;
if ($result) {
while ($row = $result->fetch_assoc()) {
$backwardKeys[$row['TABLE_NAME'] . $i] = [
'tableName' => $row['TABLE_NAME'],
'columnName' =>$row['COLUMN_NAME'],
'referencedColumnName' =>$row['REFERENCED_COLUMN_NAME'],
];
$i++;
}
}
ksort($backwardKeys);
return $backwardKeys;
}
function backwardKeysPrint($backwardKeys, $row) {
$iterator = 0;
foreach ($backwardKeys as $backwardKey) {
$iterator++;
$whereLink = where_link(1, $backwardKey['columnName'], $row[$backwardKey['referencedColumnName']]);
$link = sprintf('select=%s%s', $backwardKey['tableName'], $whereLink);
if ($iterator === 2) {
echo '<div class="fk-more hidden">';
}
echo sprintf("<a href='%s'>%s</a>%s\n", h(ME . $link), $backwardKey['tableName'], ($iterator === 1 && count($backwardKeys) > 1) ? '<span class="collapsable"> [<a>more</a>]</span>' : '');
if ($iterator === count($backwardKeys)) {
echo '</div>';
}
}
echo '</div>';
}
}
return new AdminerForeignKeys();

68
docker-compose.yml Normal file
View File

@ -0,0 +1,68 @@
version: '3'
services:
backend-proxy:
container_name: backend_proxy
image: nginx
volumes:
- ./api/:/app/
- ./api/nginx.conf:/etc/nginx/conf.d/default.conf
- ./logs/api/:/var/log/nginx/
restart: unless-stopped
ports:
- 8081:80
depends_on:
- backend
backend:
container_name: backend
image: php
build:
context: ./api
dockerfile: PHP.Dockerfile
env_file: .db.env
volumes:
- ./api/:/app/
depends_on:
- db
frontend-proxy:
container_name: frontend_proxy
image: nginx
volumes:
- ./ui/:/app/
- ./ui/nginx.conf:/etc/nginx/conf.d/default.conf
- ./logs/ui/:/var/log/nginx/
restart: unless-stopped
ports:
- 8080:80
depends_on:
- frontend
frontend:
container_name: frontend
image: php:ui
build:
context: ./ui
dockerfile: PHP.Dockerfile
env_file: .ui.env
volumes:
- ./ui/:/app/
db:
image: mariadb
volumes:
- database:/var/lib/mysql
env_file: .db.env
adminer:
image: adminer
environment:
ADMINER_PLUGINS: "dump-json edit-foreign enum-option json-column"
ADMINER_DESIGN: "dracula"
volumes:
- ./adminer/plugins-enabled/:/var/www/html/plugins-enabled/
ports:
- 8082:8080
depends_on:
- db
volumes:
database: