Compare commits

..

8 Commits

14 changed files with 162 additions and 158 deletions

View File

@ -1,35 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -1,17 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*~

19
README
View File

@ -1,8 +1,22 @@
sqlquery Plugin for DokuWiki sqlquery Plugin for DokuWiki
Processing query to mysql database and display results as a table. Processing queries to databases and display results as a table.
All documentation for this plugin can be found at This is a improved version which can connect to different hosts
and databases. The defaults are set in the plugin configuration.
Different types, hosts and databases can be set inside the tag:
<sql type=mysql host=myhost db=mydb>
SELECT foo FROM bar ORDER BY baz
<sql>
For security reasons the credentials for database access are only
stored in the main plugin configuration. At the moment there is
only one user configurable so for access to multiple servers.
So the user and password mast be the same across the servers.
Based on sqlquery-plugin from George Pirogov, original documentation
for that base plugin can be found at
https://www.dokuwiki.org/plugin:sqlquery https://www.dokuwiki.org/plugin:sqlquery
If you install this plugin manually, make sure it is installed in If you install this plugin manually, make sure it is installed in
@ -13,6 +27,7 @@ Please refer to http://www.dokuwiki.org/plugins for additional info
on how to install plugins in DokuWiki. on how to install plugins in DokuWiki.
---- ----
Copyright (C) Thomas Hooge <thomas@hoogi.de>
Copyright (C) George Pirogov <i1557@yandex.ru> Copyright (C) George Pirogov <i1557@yandex.ru>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify

View File

@ -1,4 +0,0 @@
# sqlquery
A dokuwiki plugin for processing query to MySQL databases and display results as a table.
More information at https://www.dokuwiki.org/plugin:sqlquery

View File

@ -7,6 +7,7 @@
//$conf['fixme'] = 'FIXME'; //$conf['fixme'] = 'FIXME';
$conf['type'] = 'mysql';
$conf['Host'] = 'localhost'; $conf['Host'] = 'localhost';
$conf['DB'] = ''; $conf['DB'] = '';
$conf['user'] = ''; $conf['user'] = '';

View File

@ -5,7 +5,7 @@
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
*/ */
$meta['type'] = array('multichoice', '_choices' => array('mysql', 'dblib'));
$meta['Host'] = array('string'); $meta['Host'] = array('string');
$meta['DB'] = array('string'); $meta['DB'] = array('string');
$meta['user'] = array('string'); $meta['user'] = array('string');

16
lang/de/lang.php Normal file
View File

@ -0,0 +1,16 @@
<?php
/**
* German language file for sqlquery plugin
*
* @author Thomas Hooge <thomas@hoogi.de>
*/
// menu entry for admin plugins
// $lang['menu'] = 'Your menu entry';
// custom language strings for the plugin
// $lang['fixme'] = 'FIXME';
//Setup VIM: ex: et ts=4 :

17
lang/de/settings.php Normal file
View File

@ -0,0 +1,17 @@
<?php
/**
* German language file for sqlquery plugin
*
* @author Thomas Hooge <thomas@hoogi.de>
*/
// keys need to match the config setting name
$lang['type'] = 'DSN-Prefix (Datenbanktyp)';
$lang['Host'] = 'Standard-Serveradresse (DNS oder IP)';
$lang['DB'] = 'Standard-Datenbankname';
$lang['user'] = 'Datenbankbenutzername';
$lang['password'] = 'Datenbankkennwort';
//Setup VIM: ex: et ts=4 :

View File

@ -1,6 +1,6 @@
<?php <?php
/** /**
* english language file for sqlquery plugin * English language file for sqlquery plugin
* *
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
*/ */
@ -8,6 +8,11 @@
// keys need to match the config setting name // keys need to match the config setting name
// $lang['fixme'] = 'FIXME'; // $lang['fixme'] = 'FIXME';
$lang['type'] = 'DSN prefix (database type)';
$lang['Host'] = 'Default server address (DNS or IP)';
$lang['DB'] = 'Default database name';
$lang['user'] = 'Database username';
$lang['password'] = 'Database password';
//Setup VIM: ex: et ts=4 : //Setup VIM: ex: et ts=4 :

View File

@ -1,6 +1,6 @@
<?php <?php
/** /**
* English language file for sqlquery plugin * Russian language file for sqlquery plugin
* *
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
*/ */

View File

@ -1,6 +1,6 @@
<?php <?php
/** /**
* english language file for sqlquery plugin * Russian language file for sqlquery plugin
* *
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
*/ */
@ -8,8 +8,9 @@
// keys need to match the config setting name // keys need to match the config setting name
// $lang['fixme'] = 'FIXME'; // $lang['fixme'] = 'FIXME';
$lang['Host'] = 'Адрес MySQL сервера (dns или ip)'; $lang['type'] = 'Префикс DSN (тип базы данных)';
$lang['DB'] = 'Имя базы данных MySQL'; $lang['Host'] = 'Адрес сервера по умолчанию (DNS или IP)';
$lang['DB'] = 'Имя базы данных по умолчанию';
$lang['user'] = 'Логин'; $lang['user'] = 'Логин';
$lang['password'] = 'Пароль'; $lang['password'] = 'Пароль';

View File

@ -1,7 +1,6 @@
base sqlquery base sqlquery
author George Pirogov author Thomas Hooge
email i1557@yandex.ru email thomas@hoogi.de
date 2016-11-25 date 2023-12-01
name SQL query plugin name SQL query plugin (multidb)
desc Processing query to mysql database and display results as a table. desc Processing queries to databases and display results as a table.
url https://www.dokuwiki.org/plugin:sqlquery

View File

@ -4,29 +4,26 @@
* *
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
* @author Thomas Hooge <hooge@rowa-group.com>
*
*/ */
// must be run within Dokuwiki // must be run within Dokuwiki
if (!defined('DOKU_INC')) die(); if (!defined('DOKU_INC')) die();
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_sqlquery extends DokuWiki_Syntax_Plugin { class syntax_plugin_sqlquery extends DokuWiki_Syntax_Plugin {
public function getType() { public function getType() { return 'substition'; }
return 'substition'; public function getSort() { return 666; }
} public function getPType() { return 'block'; }
public function getSort() {
return 666;
}
public function connectTo($mode) public function connectTo($mode)
{ {
$this->Lexer->addEntryPattern('<sql>', $mode, 'plugin_sqlquery'); $this->Lexer->addSpecialPattern('<sql\b(?:\s+(?:host|db|type)=[\w\-\.$]+?)*\s*>(?:.*?</sql>)', $mode, 'plugin_sqlquery');
}
public function postConnect()
{
$this->Lexer->addExitPattern('</sql>','plugin_sqlquery');
} }
/** /**
@ -36,29 +33,36 @@ class syntax_plugin_sqlquery extends DokuWiki_Syntax_Plugin {
* @param int $state The state of the handler * @param int $state The state of the handler
* @param int $pos The position in the document * @param int $pos The position in the document
* @param Doku_Handler $handler The handler * @param Doku_Handler $handler The handler
*
* @return array Data for the renderer * @return array Data for the renderer
*/ */
public function handle($match, $state, $pos, Doku_Handler $handler) public function handle($match, $state, $pos, Doku_Handler $handler) {
{ $data = array('state' => $state);
switch ( $state ) if ($state == DOKU_LEXER_SPECIAL) {
{ # get type (DSN prefix)
case DOKU_LEXER_ENTER: if (preg_match('/<sql\b.*type=(mysql|dblib)/', $match, $result)) {
$data = array(); $data['type'] = $result[1];
return $data; } else {
break; $data['type'] = $this->getConf('type');
}
case DOKU_LEXER_UNMATCHED: # get host
return array('sqlquery' => $match); if (preg_match('/<sql\b.*host=([\w\-\.$]+)/', $match, $result)) {
break; $data['host'] = $result[1];
} else {
case DOKU_LEXER_EXIT: $data['host'] = $this->getConf('Host');
$data = array(); }
return $data; # get database
break; if (preg_match('/<sql\b.*db=([\w\-\.$]+)/', $match, $result)) {
$data['db'] = $result[1];
} else {
$data['db'] = $this->getConf('DB');
}
# get query
$data['match'] = $match;
if (preg_match('%<sql.*?>(.*)</sql>%s', $match, $result)) {
$data['query'] = trim($result[1]);
}
} }
$data = array();
return $data; return $data;
} }
@ -68,72 +72,73 @@ class syntax_plugin_sqlquery extends DokuWiki_Syntax_Plugin {
* @param string $mode Renderer mode (supported modes: xhtml) * @param string $mode Renderer mode (supported modes: xhtml)
* @param Doku_Renderer $renderer The renderer * @param Doku_Renderer $renderer The renderer
* @param array $data The data from the handler() function * @param array $data The data from the handler() function
*
* @return bool If rendering was successful. * @return bool If rendering was successful.
*/ */
public function render($mode, Doku_Renderer $renderer, $data) public function render($mode, Doku_Renderer $renderer, $data)
{ {
if ($mode != 'xhtml') return false; if ($mode != 'xhtml') return false;
if (empty($data['query'])) return true;
if ( !empty( $data['sqlquery'] ) ) // get configuration
{
// получаем параметры конфигурации
$host = $this->getConf('Host');
$DB = $this->getConf('DB');
$user = $this->getConf('user'); $user = $this->getConf('user');
$password = $this->getConf('password'); $password = $this->getConf('password');
// получаем запрос // connect to database
$querystring = $data['sqlquery']; $dsn = "{$data['type']}:host={$data['host']};dbname={$data[db]};charset=UTF8;";
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
$renderer->doc .= "<pre>Unable to connect to database:" . $e->getMessage() . "</pre>\n";
return true;
}
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);
// подключаемся к базе // run query
$link = mysqli_connect($host, $user, $password, $DB); try {
mysqli_set_charset($link, "utf8"); $result = $dbh->query($data['query']);
} catch (PDOException $e) {
$renderer->doc .= "<pre>Error in query:" . $e->getMessage() . "</pre>\n";
return true;
}
// подключились // get the number of fields in the table
if ( $link ) $fieldcount = $result->columnCount();
{
$result = mysqli_query($link, $querystring);
if ( $result )
{
// получаем кол-во полей в таблице
$fieldcount = mysqli_num_fields($result);
// строим таблицу // build a table
$renderer->doc .= "<table id=\"sqlquerytable\" class=\"inline\">"; $renderer->doc .= '<table id="sqlquerytable" class="inline">' . "\n";
// строим заголовок // build the header section of the table
$renderer->doc .= "<thead><tr>"; $renderer->doc .= "<thead><tr>";
while ($fieldinfo = mysqli_fetch_field($result))
{ for ($i = 0; $i < $fieldcount; $i++) {
$meta = $result->getColumnMeta($i);
$renderer->doc .= "<th>"; $renderer->doc .= "<th>";
$renderer->doc .= $fieldinfo->name; $renderer->doc .= $meta['name'];
$renderer->doc .= "</th>"; $renderer->doc .= "</th>";
} }
$renderer->doc .= "</tr></thead>"; $renderer->doc .= "</tr></thead>\n";
// строим содержимое таблицы // build the contents of the table
$renderer->doc .= "<tbody>"; $renderer->doc .= "<tbody>\n";
while ($row = mysqli_fetch_row($result)) foreach ($result as $row) {
{
$renderer->doc .= "<tr>"; $renderer->doc .= "<tr>";
for ( $i = 0; $i < $fieldcount; $i++ ) {
// строим строку
for ( $i = 0; $i < $fieldcount; $i++ )
{
$renderer->doc .= "<td>"; $renderer->doc .= "<td>";
$renderer->doc .= $row[$i]; $renderer->doc .= htmlentities($row[$i]);
$renderer->doc .= "</td>"; $renderer->doc .= "</td>";
} }
$renderer->doc .= "</tr>"; $renderer->doc .= "</tr>\n";
} // of while fetch_row
// закрываем таблицу
$renderer->doc .= "</tbody></table>";
} // of mysqli_query
mysqli_close($link);
} // of mysqli link
} // of sqlquery not empty
return true;
} // of render function
} }
// vim:ts=4:sw=4:et: // finish the table
$renderer->doc .= "</tbody>\n</table>\n";
// Close connection, there is no close() method with PDO :-(
$result = null;
$dbh = null;
return true;
}
}