Compare commits

..

2 Commits

Author SHA1 Message Date
digitalduke 500e0103a8
Change LICENSE 2019-01-24 09:21:56 +05:00
digitalduke 7a069cc899
Delete LICENSE 2019-01-24 09:21:16 +05:00
14 changed files with 158 additions and 162 deletions

35
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@ -0,0 +1,35 @@
---
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

@ -0,0 +1,17 @@
---
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
View File

@ -1 +0,0 @@
*~

19
README
View File

@ -1,22 +1,8 @@
sqlquery Plugin for DokuWiki sqlquery Plugin for DokuWiki
Processing queries to databases and display results as a table. Processing query to mysql database and display results as a table.
This is a improved version which can connect to different hosts All documentation for this plugin can be found at
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
@ -27,7 +13,6 @@ 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

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# 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,7 +7,6 @@
//$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');

View File

@ -1,16 +0,0 @@
<?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 :

View File

@ -1,17 +0,0 @@
<?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,11 +8,6 @@
// 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
/** /**
* Russian language file for sqlquery plugin * English 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
/** /**
* Russian language file for sqlquery plugin * english language file for sqlquery plugin
* *
* @author George Pirogov <i1557@yandex.ru> * @author George Pirogov <i1557@yandex.ru>
*/ */
@ -8,9 +8,8 @@
// 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 (тип базы данных)'; $lang['Host'] = 'Адрес MySQL сервера (dns или ip)';
$lang['Host'] = 'Адрес сервера по умолчанию (DNS или IP)'; $lang['DB'] = 'Имя базы данных MySQL';
$lang['DB'] = 'Имя базы данных по умолчанию';
$lang['user'] = 'Логин'; $lang['user'] = 'Логин';
$lang['password'] = 'Пароль'; $lang['password'] = 'Пароль';

View File

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

View File

@ -4,26 +4,29 @@
* *
* @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() { return 'substition'; } public function getType() {
public function getSort() { return 666; } return 'substition';
public function getPType() { return 'block'; } }
public function getSort() {
return 666;
}
public function connectTo($mode) public function connectTo($mode)
{ {
$this->Lexer->addSpecialPattern('<sql\b(?:\s+(?:host|db|type)=[\w\-\.$]+?)*\s*>(?:.*?</sql>)', $mode, 'plugin_sqlquery'); $this->Lexer->addEntryPattern('<sql>', $mode, 'plugin_sqlquery');
}
public function postConnect()
{
$this->Lexer->addExitPattern('</sql>','plugin_sqlquery');
} }
/** /**
@ -33,36 +36,29 @@ 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); {
if ($state == DOKU_LEXER_SPECIAL) { switch ( $state )
# get type (DSN prefix) {
if (preg_match('/<sql\b.*type=(mysql|dblib)/', $match, $result)) { case DOKU_LEXER_ENTER:
$data['type'] = $result[1]; $data = array();
} else { return $data;
$data['type'] = $this->getConf('type'); break;
}
# get host case DOKU_LEXER_UNMATCHED:
if (preg_match('/<sql\b.*host=([\w\-\.$]+)/', $match, $result)) { return array('sqlquery' => $match);
$data['host'] = $result[1]; break;
} else {
$data['host'] = $this->getConf('Host'); case DOKU_LEXER_EXIT:
} $data = array();
# get database return $data;
if (preg_match('/<sql\b.*db=([\w\-\.$]+)/', $match, $result)) { break;
$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;
} }
@ -72,73 +68,72 @@ 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;
// get configuration if ( !empty( $data['sqlquery'] ) )
{
// получаем параметры конфигурации
$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 // получаем запрос
$dsn = "{$data['type']}:host={$data['host']};dbname={$data[db]};charset=UTF8;"; $querystring = $data['sqlquery'];
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 // подключаемся к базе
try { $link = mysqli_connect($host, $user, $password, $DB);
$result = $dbh->query($data['query']); mysqli_set_charset($link, "utf8");
} catch (PDOException $e) {
$renderer->doc .= "<pre>Error in query:" . $e->getMessage() . "</pre>\n";
return true;
}
// get the number of fields in the table // подключились
$fieldcount = $result->columnCount(); if ( $link )
{
$result = mysqli_query($link, $querystring);
if ( $result )
{
// получаем кол-во полей в таблице
$fieldcount = mysqli_num_fields($result);
// build a table // строим таблицу
$renderer->doc .= '<table id="sqlquerytable" class="inline">' . "\n"; $renderer->doc .= "<table id=\"sqlquerytable\" class=\"inline\">";
// 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 .= $meta['name']; $renderer->doc .= $fieldinfo->name;
$renderer->doc .= "</th>"; $renderer->doc .= "</th>";
} }
$renderer->doc .= "</tr></thead>\n"; $renderer->doc .= "</tr></thead>";
// build the contents of the table // строим содержимое таблицы
$renderer->doc .= "<tbody>\n"; $renderer->doc .= "<tbody>";
foreach ($result as $row) { while ($row = mysqli_fetch_row($result))
{
$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 .= htmlentities($row[$i]); $renderer->doc .= $row[$i];
$renderer->doc .= "</td>"; $renderer->doc .= "</td>";
} }
$renderer->doc .= "</tr>\n"; $renderer->doc .= "</tr>";
} } // of while fetch_row
// закрываем таблицу
// finish the table $renderer->doc .= "</tbody></table>";
$renderer->doc .= "</tbody>\n</table>\n"; } // of mysqli_query
mysqli_close($link);
// Close connection, there is no close() method with PDO :-( } // of mysqli link
$result = null; } // of sqlquery not empty
$dbh = null;
return true; return true;
} } // of render function
} }
// vim:ts=4:sw=4:et: