193d995e0SAndreas Gohr<?php 293d995e0SAndreas Gohr/** 393d995e0SAndreas Gohr * DokuWiki Plugin sqlite (Admin Component) 493d995e0SAndreas Gohr * 593d995e0SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 693d995e0SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 793d995e0SAndreas Gohr */ 893d995e0SAndreas Gohr 9*af0e7691SSzymon Olewniczakuse dokuwiki\Form\Form; 10*af0e7691SSzymon Olewniczak 1193d995e0SAndreas Gohr// must be run within Dokuwiki 1293d995e0SAndreas Gohrif(!defined('DOKU_INC')) die(); 1393d995e0SAndreas Gohr 1493d995e0SAndreas Gohrclass admin_plugin_sqlite extends DokuWiki_Admin_Plugin { 1593d995e0SAndreas Gohr 160542fc8eSKlap-in function getMenuSort() { 170542fc8eSKlap-in return 500; 180542fc8eSKlap-in } 190542fc8eSKlap-in 200542fc8eSKlap-in function forAdminOnly() { 210542fc8eSKlap-in return true; 220542fc8eSKlap-in } 2393d995e0SAndreas Gohr 2493d995e0SAndreas Gohr function handle() { 25a34ef333SKlap-in global $conf; 260dbd1d4cSSzymon Olewniczak global $INPUT; 270dbd1d4cSSzymon Olewniczak 28*af0e7691SSzymon Olewniczak if($INPUT->bool('sqlite_rename') && checkSecurityToken()) { 29a34ef333SKlap-in 307431dc90SSzymon Olewniczak $path = $conf['metadir'].'/'.$INPUT->str('db'); 31a34ef333SKlap-in if(io_rename($path.'.sqlite', $path.'.sqlite3')) { 32a34ef333SKlap-in msg('Renamed database file succesfull!', 1); 33a34ef333SKlap-in //set to new situation 347431dc90SSzymon Olewniczak $INPUT->set('version', 'sqlite3'); 35a34ef333SKlap-in 36a34ef333SKlap-in } else { 37a34ef333SKlap-in msg('Renaming database file fails!', -1); 38a34ef333SKlap-in } 390dbd1d4cSSzymon Olewniczak } elseif($INPUT->bool('sqlite_export') && checkSecurityToken()) { 400dbd1d4cSSzymon Olewniczak 410dbd1d4cSSzymon Olewniczak /** @var $DBI helper_plugin_sqlite */ 420dbd1d4cSSzymon Olewniczak $DBI = plugin_load('helper', 'sqlite'); 430dbd1d4cSSzymon Olewniczak $dbname = $INPUT->str('db'); 440dbd1d4cSSzymon Olewniczak 450dbd1d4cSSzymon Olewniczak $dumpfile = $DBI->dumpDatabase($dbname, DOKU_EXT_PDO, true); 460dbd1d4cSSzymon Olewniczak if ($dumpfile) { 470dbd1d4cSSzymon Olewniczak header('Content-Type: text/sql'); 480dbd1d4cSSzymon Olewniczak header('Content-Disposition: attachment; filename="'.$dbname.'.sql";'); 490dbd1d4cSSzymon Olewniczak 500dbd1d4cSSzymon Olewniczak readfile($dumpfile); 510dbd1d4cSSzymon Olewniczak exit(0); 520dbd1d4cSSzymon Olewniczak } 530dbd1d4cSSzymon Olewniczak } elseif($INPUT->bool('sqlite_import') && checkSecurityToken()) { 540dbd1d4cSSzymon Olewniczak global $conf; 550dbd1d4cSSzymon Olewniczak 560dbd1d4cSSzymon Olewniczak /** @var $DBI helper_plugin_sqlite */ 570dbd1d4cSSzymon Olewniczak $DBI = plugin_load('helper', 'sqlite'); 580dbd1d4cSSzymon Olewniczak $dbname = $INPUT->str('db'); 590dbd1d4cSSzymon Olewniczak $dumpfile = $_FILES['dumpfile']['tmp_name']; 600dbd1d4cSSzymon Olewniczak 610dbd1d4cSSzymon Olewniczak if (empty($dumpfile)) { 620dbd1d4cSSzymon Olewniczak msg($this->getLang('import_no_file'), -1); 630dbd1d4cSSzymon Olewniczak return; 640dbd1d4cSSzymon Olewniczak } 650dbd1d4cSSzymon Olewniczak 660dbd1d4cSSzymon Olewniczak if ($DBI->fillDatabaseFromDump($dbname, $dumpfile, true)) { 670dbd1d4cSSzymon Olewniczak msg($this->getLang('import_success'), 1); 680dbd1d4cSSzymon Olewniczak } 69a34ef333SKlap-in } 7093d995e0SAndreas Gohr } 7193d995e0SAndreas Gohr 7293d995e0SAndreas Gohr function html() { 7393d995e0SAndreas Gohr global $ID; 74a34ef333SKlap-in global $conf; 75271f9caeSSzymon Olewniczak global $INPUT; 7693d995e0SAndreas Gohr 7793d995e0SAndreas Gohr echo $this->locale_xhtml('intro'); 7893d995e0SAndreas Gohr 797431dc90SSzymon Olewniczak if($INPUT->has('db') && checkSecurityToken()) { 8093d995e0SAndreas Gohr 817431dc90SSzymon Olewniczak echo '<h2>'.$this->getLang('db').' "'.hsc($INPUT->str('db')).'"</h2>'; 8293d995e0SAndreas Gohr echo '<div class="level2">'; 8393d995e0SAndreas Gohr 84a34ef333SKlap-in $sqlcommandform = true; 85a34ef333SKlap-in /** @var $DBI helper_plugin_sqlite */ 8679288b58SGerrit Uitslag $DBI = plugin_load('helper', 'sqlite'); 877431dc90SSzymon Olewniczak if($INPUT->str('version') == 'sqlite2') { 887431dc90SSzymon Olewniczak if(helper_plugin_sqlite_adapter::isSqlite3db($conf['metadir'].'/'.$INPUT->str('db').'.sqlite')) { 89a34ef333SKlap-in 90a34ef333SKlap-in msg('This is a database in sqlite3 format.', 2); 91a34ef333SKlap-in msg( 92a34ef333SKlap-in 'This plugin needs your database file has the extension ".sqlite3" 93a34ef333SKlap-in instead of ".sqlite" before it will be recognized as sqlite3 database.', 2 94a34ef333SKlap-in ); 95*af0e7691SSzymon Olewniczak $form = new Form(); 96*af0e7691SSzymon Olewniczak $form->setHiddenField('do', 'admin'); 97*af0e7691SSzymon Olewniczak $form->setHiddenField('page', 'sqlite'); 98*af0e7691SSzymon Olewniczak $form->setHiddenField('sqlite_rename', 'go'); 99*af0e7691SSzymon Olewniczak $form->setHiddenField('db', $INPUT->str('db')); 100*af0e7691SSzymon Olewniczak $form->addButton('', sprintf($this->getLang('rename2to3'), hsc($INPUT->str('db')))) 101*af0e7691SSzymon Olewniczak ->attr('type', 'submit'); 102*af0e7691SSzymon Olewniczak print $form->toHTML(); 103a34ef333SKlap-in 104a34ef333SKlap-in if($DBI->existsPDOSqlite()) $sqlcommandform = false; 105a34ef333SKlap-in 106a34ef333SKlap-in } else { 107a34ef333SKlap-in msg( 108a34ef333SKlap-in 'Before PDO sqlite can handle this format, it needs a conversion to the sqlite3 format. 109cd9d7ecbSSzymon Olewniczak Because PHP sqlite extension is no longer supported, 1107431dc90SSzymon Olewniczak you should manually convert "'.hsc($INPUT->str('db')).'.sqlite" in the meta directory to "'.hsc($INPUT->str('db')).'.sqlite3".<br /> 111a34ef333SKlap-in See for info about the conversion '.$this->external_link('http://www.sqlite.org/version3.html').'.', -1 112a34ef333SKlap-in ); 113a34ef333SKlap-in } 114a34ef333SKlap-in } else { 115a34ef333SKlap-in if(!$DBI->existsPDOSqlite()) { 116a34ef333SKlap-in $sqlcommandform = false; 117a34ef333SKlap-in msg('A database in sqlite3 format needs the PHP PDO sqlite plugin.', -1); 118a34ef333SKlap-in } 119a34ef333SKlap-in } 120a34ef333SKlap-in 121a34ef333SKlap-in if($sqlcommandform) { 12293d995e0SAndreas Gohr echo '<ul>'; 1237f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 124a34ef333SKlap-in wl( 125a34ef333SKlap-in $ID, array( 126a34ef333SKlap-in 'do' => 'admin', 1277f5f9a98SAndreas Gohr 'page' => 'sqlite', 1287431dc90SSzymon Olewniczak 'db' => $INPUT->str('db'), 1297431dc90SSzymon Olewniczak 'version'=> $INPUT->str('version'), 1307f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'table\' ORDER BY name', 131a34ef333SKlap-in 'sectok' => getSecurityToken() 132a34ef333SKlap-in ) 133a34ef333SKlap-in ). 134ab6c40f9SAdrian Lang '">'.$this->getLang('table').'</a></div></li>'; 1357f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 136a34ef333SKlap-in wl( 137a34ef333SKlap-in $ID, array( 138a34ef333SKlap-in 'do' => 'admin', 1397f5f9a98SAndreas Gohr 'page' => 'sqlite', 1407431dc90SSzymon Olewniczak 'db' => $INPUT->str('db'), 1417431dc90SSzymon Olewniczak 'version'=> $INPUT->str('version'), 1427f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'index\' ORDER BY name', 143a34ef333SKlap-in 'sectok' => getSecurityToken() 144a34ef333SKlap-in ) 145a34ef333SKlap-in ). 146ab6c40f9SAdrian Lang '">'.$this->getLang('index').'</a></div></li>'; 1470dbd1d4cSSzymon Olewniczak echo '<li><div class="li"><a href="'. 1480dbd1d4cSSzymon Olewniczak wl( 1490dbd1d4cSSzymon Olewniczak $ID, array( 1500dbd1d4cSSzymon Olewniczak 'do' => 'admin', 1510dbd1d4cSSzymon Olewniczak 'page' => 'sqlite', 1527431dc90SSzymon Olewniczak 'db' => $INPUT->str('db'), 1537431dc90SSzymon Olewniczak 'version'=> $INPUT->str('version'), 1540dbd1d4cSSzymon Olewniczak 'sqlite_export' => '1', 1550dbd1d4cSSzymon Olewniczak 'sectok' => getSecurityToken() 1560dbd1d4cSSzymon Olewniczak ) 1570dbd1d4cSSzymon Olewniczak ). 1580dbd1d4cSSzymon Olewniczak '">'.$this->getLang('export').'</a></div></li>'; 1590dbd1d4cSSzymon Olewniczak 1600dbd1d4cSSzymon Olewniczak 1610dbd1d4cSSzymon Olewniczak $form = new \dokuwiki\Form\Form(array('enctype' => 'multipart/form-data')); 1620dbd1d4cSSzymon Olewniczak $form->setHiddenField('id', $ID); 1630dbd1d4cSSzymon Olewniczak $form->setHiddenField('do', 'admin'); 1640dbd1d4cSSzymon Olewniczak $form->setHiddenField('page', 'sqlite'); 1657431dc90SSzymon Olewniczak $form->setHiddenField('db', $INPUT->str('db')); 1667431dc90SSzymon Olewniczak $form->setHiddenField('version', $INPUT->str('version')); 1670dbd1d4cSSzymon Olewniczak $form->addElement(new dokuwiki\Form\InputElement('file', 'dumpfile')); 1680dbd1d4cSSzymon Olewniczak $form->addButton('sqlite_import', $this->getLang('import')); 1690dbd1d4cSSzymon Olewniczak echo '<li>' . $form->toHTML() . '</li>'; 17093d995e0SAndreas Gohr echo '</ul>'; 17193d995e0SAndreas Gohr 17209a0e52bSSzymon Olewniczak /** @var $helper helper_plugin_sqlite */ 17309a0e52bSSzymon Olewniczak $sqlite_db = plugin_load('helper', 'sqlite'); 17409a0e52bSSzymon Olewniczak $sqlite_db->init('sqlite', DOKU_PLUGIN . 'sqlite/db/'); 175271f9caeSSzymon Olewniczak 176271f9caeSSzymon Olewniczak if($INPUT->str('action') == 'save') { 177271f9caeSSzymon Olewniczak $ok = true; 178271f9caeSSzymon Olewniczak if(empty($INPUT->str('sql'))) { 17974f97ccfSSzymon Olewniczak msg($this->getLang('validation query_required'), -1); 180271f9caeSSzymon Olewniczak $ok = false; 181271f9caeSSzymon Olewniczak } 182271f9caeSSzymon Olewniczak if(empty($INPUT->str('name'))) { 18374f97ccfSSzymon Olewniczak msg($this->getLang('validation query_name_required'), -1); 184271f9caeSSzymon Olewniczak $ok = false; 185271f9caeSSzymon Olewniczak } 18609a0e52bSSzymon Olewniczak 187271f9caeSSzymon Olewniczak if($ok) { 18809a0e52bSSzymon Olewniczak $sqlite_db->storeEntry('queries', array( 1897431dc90SSzymon Olewniczak 'db' => $INPUT->str('db'), 190271f9caeSSzymon Olewniczak 'name' => $INPUT->str('name'), 191271f9caeSSzymon Olewniczak 'sql' => $INPUT->str('sql') 192271f9caeSSzymon Olewniczak )); 19374f97ccfSSzymon Olewniczak msg($this->getLang('success query_saved'), 1); 194271f9caeSSzymon Olewniczak } 195271f9caeSSzymon Olewniczak } elseif($INPUT->str('action') == 'delete') { 19674f97ccfSSzymon Olewniczak $sqlite_db->query("DELETE FROM queries WHERE id=?;", $INPUT->int('query_id')); 19774f97ccfSSzymon Olewniczak msg($this->getLang('success query_deleted'), 1); 198271f9caeSSzymon Olewniczak } 199271f9caeSSzymon Olewniczak 20074f97ccfSSzymon Olewniczak $form = new Doku_Form(array('class'=> 'sqliteplugin', 'action' => wl($ID, '', true, '&'))); 20193d995e0SAndreas Gohr $form->startFieldset('SQL Command'); 20293d995e0SAndreas Gohr $form->addHidden('id', $ID); 20393d995e0SAndreas Gohr $form->addHidden('do', 'admin'); 20493d995e0SAndreas Gohr $form->addHidden('page', 'sqlite'); 2057431dc90SSzymon Olewniczak $form->addHidden('db', $INPUT->str('db')); 2067431dc90SSzymon Olewniczak $form->addHidden('version', $INPUT->str('version')); 2077431dc90SSzymon Olewniczak $form->addElement('<textarea name="sql" class="edit">'.hsc($INPUT->str('sql')).'</textarea>'); 20893d995e0SAndreas Gohr $form->addElement('<input type="submit" class="button" /> '); 20974f97ccfSSzymon Olewniczak $form->addElement('<label>'.$this->getLang('query_name').': <input type="text" name="name" /></label> '); 21074f97ccfSSzymon Olewniczak $form->addElement('<button name="action" value="save">'.$this->getLang('save_query').'</button>'); 21193d995e0SAndreas Gohr $form->endFieldset(); 21293d995e0SAndreas Gohr $form->printForm(); 21393d995e0SAndreas Gohr 214271f9caeSSzymon Olewniczak // List saved queries 2157431dc90SSzymon Olewniczak $res = $sqlite_db->query("SELECT id, name, sql FROM queries WHERE db=?", $INPUT->str('db')); 21609a0e52bSSzymon Olewniczak $result = $sqlite_db->res2arr($res); 21709a0e52bSSzymon Olewniczak if(count($result) > 0) { 21874f97ccfSSzymon Olewniczak echo '<h3>' . $this->getLang('saved_queries') . '</h3>'; 219271f9caeSSzymon Olewniczak echo '<div>'; 220271f9caeSSzymon Olewniczak echo '<table class="inline">'; 221271f9caeSSzymon Olewniczak echo '<tr>'; 222271f9caeSSzymon Olewniczak echo '<th>name</th>'; 223271f9caeSSzymon Olewniczak echo '<th>sql</th>'; 224271f9caeSSzymon Olewniczak echo '<th></th>'; 225271f9caeSSzymon Olewniczak echo '</tr>'; 226271f9caeSSzymon Olewniczak foreach($result as $row) { 227271f9caeSSzymon Olewniczak echo '<tr>'; 228271f9caeSSzymon Olewniczak echo '<td>'.hsc($row['name']).'</td>'; 229271f9caeSSzymon Olewniczak $link = wl($ID, array( 'do'=> 'admin', 230271f9caeSSzymon Olewniczak 'page'=> 'sqlite', 2317431dc90SSzymon Olewniczak 'db'=> $INPUT->str('db'), 2327431dc90SSzymon Olewniczak 'version'=> $INPUT->str('version'), 233271f9caeSSzymon Olewniczak 'sql' => $row['sql'], 234271f9caeSSzymon Olewniczak 'sectok'=> getSecurityToken())); 235271f9caeSSzymon Olewniczak echo '<td><a href="'.$link.'">'.hsc($row['sql']).'</a></td>'; 236271f9caeSSzymon Olewniczak 237271f9caeSSzymon Olewniczak $link = wl($ID, array( 'do'=> 'admin', 238271f9caeSSzymon Olewniczak 'page'=> 'sqlite', 2397431dc90SSzymon Olewniczak 'db'=> $INPUT->str('db'), 2407431dc90SSzymon Olewniczak 'version'=> $INPUT->str('version'), 241271f9caeSSzymon Olewniczak 'action' => 'delete', 24274f97ccfSSzymon Olewniczak 'query_id' => $row['id'], 243271f9caeSSzymon Olewniczak 'sectok'=> getSecurityToken())); 244271f9caeSSzymon Olewniczak echo '<td><a href="'.$link.'">delete</a></td>'; 245271f9caeSSzymon Olewniczak echo '</tr>'; 246271f9caeSSzymon Olewniczak } 247271f9caeSSzymon Olewniczak echo '</table>'; 248271f9caeSSzymon Olewniczak echo '</div>'; 249271f9caeSSzymon Olewniczak } 250271f9caeSSzymon Olewniczak 2517431dc90SSzymon Olewniczak if($INPUT->has('sql')) { 2527431dc90SSzymon Olewniczak if(!$DBI->init($INPUT->str('db'), '')) return; 25309a0e52bSSzymon Olewniczak 254271f9caeSSzymon Olewniczak print '<h3>Query results</h3>'; 2557431dc90SSzymon Olewniczak $sql = $DBI->SQLstring2array($INPUT->str('sql')); 25693d995e0SAndreas Gohr foreach($sql as $s) { 25793d995e0SAndreas Gohr $s = preg_replace('!^\s*--.*$!m', '', $s); 25893d995e0SAndreas Gohr $s = trim($s); 25993d995e0SAndreas Gohr if(!$s) continue; 26084041991SKlap-in 26184041991SKlap-in $time_start = microtime(true); 26284041991SKlap-in 26393d995e0SAndreas Gohr $res = $DBI->query("$s;"); 26493d995e0SAndreas Gohr if($res === false) continue; 26593d995e0SAndreas Gohr 26693d995e0SAndreas Gohr $result = $DBI->res2arr($res); 26784041991SKlap-in 26884041991SKlap-in $time_end = microtime(true); 26984041991SKlap-in $time = $time_end - $time_start; 27084041991SKlap-in 27184041991SKlap-in $cnt = $DBI->res2count($res); 27284041991SKlap-in msg($cnt.' affected rows in '.($time < 0.0001 ? substr($time, 0, 5).substr($time, -3) : substr($time, 0, 7)).' seconds', 1); 27384041991SKlap-in if(!$cnt) continue; 27493d995e0SAndreas Gohr 275f57002afSPPPCR echo '<div>'; 27693d995e0SAndreas Gohr $ths = array_keys($result[0]); 27793d995e0SAndreas Gohr echo '<table class="inline">'; 27893d995e0SAndreas Gohr echo '<tr>'; 27993d995e0SAndreas Gohr foreach($ths as $th) { 28093d995e0SAndreas Gohr echo '<th>'.hsc($th).'</th>'; 28193d995e0SAndreas Gohr } 28293d995e0SAndreas Gohr echo '</tr>'; 28393d995e0SAndreas Gohr foreach($result as $row) { 28493d995e0SAndreas Gohr echo '<tr>'; 28593d995e0SAndreas Gohr $tds = array_values($row); 28693d995e0SAndreas Gohr foreach($tds as $td) { 2875eb2cff1SAndreas Gohr if($td === null) $td='␀'; 28893d995e0SAndreas Gohr echo '<td>'.hsc($td).'</td>'; 28993d995e0SAndreas Gohr } 29093d995e0SAndreas Gohr echo '</tr>'; 29193d995e0SAndreas Gohr } 29293d995e0SAndreas Gohr echo '</table>'; 293f57002afSPPPCR echo '</div>'; 29493d995e0SAndreas Gohr } 29593d995e0SAndreas Gohr } 29693d995e0SAndreas Gohr 297a34ef333SKlap-in } 29893d995e0SAndreas Gohr echo '</div>'; 29993d995e0SAndreas Gohr } 30093d995e0SAndreas Gohr } 30193d995e0SAndreas Gohr 30293d995e0SAndreas Gohr function getTOC() { 30393d995e0SAndreas Gohr global $conf; 30493d995e0SAndreas Gohr global $ID; 30593d995e0SAndreas Gohr 30693d995e0SAndreas Gohr $toc = array(); 30740698f67SKlap-in $fileextensions = array('sqlite2'=> '.sqlite', 'sqlite3'=> '.sqlite3'); 30893d995e0SAndreas Gohr 30940698f67SKlap-in foreach($fileextensions as $dbformat => $fileextension) { 31093d995e0SAndreas Gohr $toc[] = array( 3110542fc8eSKlap-in 'link' => wl($ID, array('do'=> 'admin', 'page'=> 'sqlite')), 31240698f67SKlap-in 'title' => $dbformat.':', 31393d995e0SAndreas Gohr 'level' => 1, 31493d995e0SAndreas Gohr 'type' => 'ul', 31593d995e0SAndreas Gohr ); 31640698f67SKlap-in 31740698f67SKlap-in $dbfiles = glob($conf['metadir'].'/*'.$fileextension); 31840698f67SKlap-in 31940698f67SKlap-in if(is_array($dbfiles)) foreach($dbfiles as $file) { 32040698f67SKlap-in $db = basename($file, $fileextension); 32140698f67SKlap-in $toc[] = array( 32284041991SKlap-in 'link' => wl($ID, array('do'=> 'admin', 'page'=> 'sqlite', 'db'=> $db, 'version'=> $dbformat, 'sectok'=> getSecurityToken())), 32340698f67SKlap-in 'title' => $this->getLang('db').' '.$db, 32440698f67SKlap-in 'level' => 2, 32540698f67SKlap-in 'type' => 'ul', 32640698f67SKlap-in ); 32740698f67SKlap-in } 32893d995e0SAndreas Gohr } 32993d995e0SAndreas Gohr 33093d995e0SAndreas Gohr return $toc; 33193d995e0SAndreas Gohr } 33293d995e0SAndreas Gohr} 33393d995e0SAndreas Gohr 334dd79791bSAndreas Gohr// vim:ts=4:sw=4:et: 335