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 993d995e0SAndreas Gohr// must be run within Dokuwiki 1093d995e0SAndreas Gohrif(!defined('DOKU_INC')) die(); 1193d995e0SAndreas Gohr 1293d995e0SAndreas Gohrif(!defined('DOKU_LF')) define('DOKU_LF', "\n"); 1393d995e0SAndreas Gohrif(!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 1493d995e0SAndreas Gohrif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 1593d995e0SAndreas Gohr 1693d995e0SAndreas Gohrrequire_once(DOKU_PLUGIN.'admin.php'); 1793d995e0SAndreas Gohr 1893d995e0SAndreas Gohrclass admin_plugin_sqlite extends DokuWiki_Admin_Plugin { 1993d995e0SAndreas Gohr 2093d995e0SAndreas Gohr function getInfo() { 2193d995e0SAndreas Gohr return confToHash(dirname(__FILE__).'plugin.info.txt'); 2293d995e0SAndreas Gohr } 2393d995e0SAndreas Gohr 24*0542fc8eSKlap-in function getMenuSort() { 25*0542fc8eSKlap-in return 500; 26*0542fc8eSKlap-in } 27*0542fc8eSKlap-in 28*0542fc8eSKlap-in function forAdminOnly() { 29*0542fc8eSKlap-in return true; 30*0542fc8eSKlap-in } 3193d995e0SAndreas Gohr 3293d995e0SAndreas Gohr function handle() { 33a34ef333SKlap-in global $conf; 34a34ef333SKlap-in if(isset($_POST['sqlite_rename'])) { 35a34ef333SKlap-in 36a34ef333SKlap-in $path = $conf['metadir'].'/'.$_REQUEST['db']; 37a34ef333SKlap-in if(io_rename($path.'.sqlite', $path.'.sqlite3')) { 38a34ef333SKlap-in msg('Renamed database file succesfull!', 1); 39a34ef333SKlap-in //set to new situation 40a34ef333SKlap-in $_REQUEST['version'] = 'sqlite3'; 41a34ef333SKlap-in 42a34ef333SKlap-in } else { 43a34ef333SKlap-in msg('Renaming database file fails!', -1); 44a34ef333SKlap-in } 45a34ef333SKlap-in 46a34ef333SKlap-in } elseif(isset($_POST['sqlite_convert'])) { 47a34ef333SKlap-in 48a34ef333SKlap-in /** @var $DBI helper_plugin_sqlite */ 49a34ef333SKlap-in $DBI =& plugin_load('helper', 'sqlite'); 50a34ef333SKlap-in $time_start = microtime(true); 51a34ef333SKlap-in 52a34ef333SKlap-in if($dumpfile = $DBI->dumpDatabase($_REQUEST['db'], DOKU_EXT_SQLITE)) { 53a34ef333SKlap-in msg('Database temporary dumped to file: '.hsc($dumpfile).'. Now loading in new database...', 1); 54a34ef333SKlap-in 55a34ef333SKlap-in if(!$DBI->fillDatabaseFromDump($_REQUEST['db'], $dumpfile)) { 56a34ef333SKlap-in msg('Conversion failed!', -1); 57a34ef333SKlap-in return false; 58a34ef333SKlap-in } 59a34ef333SKlap-in 60a34ef333SKlap-in //TODO delete dumpfile 61a34ef333SKlap-in //return @unlink($dumpfile); 62a34ef333SKlap-in //TODO delete old sqlite2-db 63a34ef333SKlap-in // return @unlink($conf['metadir'].'/'.$_REQUEST['db'].'.sqlite'); 64a34ef333SKlap-in 65a34ef333SKlap-in msg('Conversion succeed!', 1); 66a34ef333SKlap-in //set to new situation 67a34ef333SKlap-in $_REQUEST['version'] = 'sqlite3'; 68a34ef333SKlap-in } 69a34ef333SKlap-in $time_end = microtime(true); 70a34ef333SKlap-in $time = $time_end - $time_start; 71a34ef333SKlap-in msg('Database "'.hsc($_REQUEST['db']).'" converted from sqlite 2 to 3 in '.$time.' seconds.', 0); 72a34ef333SKlap-in 73a34ef333SKlap-in } 7493d995e0SAndreas Gohr } 7593d995e0SAndreas Gohr 7693d995e0SAndreas Gohr function html() { 7793d995e0SAndreas Gohr global $ID; 78a34ef333SKlap-in global $conf; 7993d995e0SAndreas Gohr 8093d995e0SAndreas Gohr echo $this->locale_xhtml('intro'); 8193d995e0SAndreas Gohr 82a34ef333SKlap-in if(isset($_REQUEST['db']) && checkSecurityToken()) { 8393d995e0SAndreas Gohr 84a34ef333SKlap-in echo '<h2>'.$this->getLang('db').' "'.hsc($_REQUEST['db']).'"</h2>'; 8593d995e0SAndreas Gohr echo '<div class="level2">'; 8693d995e0SAndreas Gohr 87a34ef333SKlap-in $sqlcommandform = true; 88a34ef333SKlap-in /** @var $DBI helper_plugin_sqlite */ 89a34ef333SKlap-in $DBI =& plugin_load('helper', 'sqlite'); 90a34ef333SKlap-in if($_REQUEST['version'] == 'sqlite2') { 91a34ef333SKlap-in if(helper_plugin_sqlite_adapter::isSqlite3db($conf['metadir'].'/'.$_REQUEST['db'].'.sqlite')) { 92a34ef333SKlap-in 93a34ef333SKlap-in msg('This is a database in sqlite3 format.', 2); 94a34ef333SKlap-in msg( 95a34ef333SKlap-in 'This plugin needs your database file has the extension ".sqlite3" 96a34ef333SKlap-in instead of ".sqlite" before it will be recognized as sqlite3 database.', 2 97a34ef333SKlap-in ); 98a34ef333SKlap-in $form = new Doku_Form(array('method'=> 'post')); 99a34ef333SKlap-in $form->addHidden('page', 'sqlite'); 100a34ef333SKlap-in $form->addHidden('sqlite_rename', 'go'); 101a34ef333SKlap-in $form->addHidden('db', $_REQUEST['db']); 102a34ef333SKlap-in $form->addElement(form_makeButton('submit', 'admin', sprintf($this->getLang('rename2to3'), hsc($_REQUEST['db'])))); 103a34ef333SKlap-in $form->printForm(); 104a34ef333SKlap-in 105a34ef333SKlap-in if($DBI->existsPDOSqlite()) $sqlcommandform = false; 106a34ef333SKlap-in 107a34ef333SKlap-in } else { 108a34ef333SKlap-in if($DBI->existsPDOSqlite()) { 109a34ef333SKlap-in $sqlcommandform = false; 110a34ef333SKlap-in msg('This is a database in sqlite2 format.', 2); 111a34ef333SKlap-in 112a34ef333SKlap-in if($DBI->existsSqlite2()) { 113a34ef333SKlap-in $form = new Doku_Form(array('method'=> 'post')); 114a34ef333SKlap-in $form->addHidden('page', 'sqlite'); 115a34ef333SKlap-in $form->addHidden('sqlite_convert', 'go'); 116a34ef333SKlap-in $form->addHidden('db', $_REQUEST['db']); 117a34ef333SKlap-in $form->addElement(form_makeButton('submit', 'admin', sprintf($this->getLang('convert2to3'), hsc($_REQUEST['db'])))); 118a34ef333SKlap-in $form->printForm(); 119a34ef333SKlap-in } else { 120a34ef333SKlap-in msg( 121a34ef333SKlap-in 'Before PDO sqlite can handle this format, it needs a conversion to the sqlite3 format. 122a34ef333SKlap-in Because PHP sqlite extension is not available, 123a34ef333SKlap-in you should manually convert "'.hsc($_REQUEST['db']).'.sqlite" in the meta directory to "'.hsc($_REQUEST['db']).'.sqlite3".<br /> 124a34ef333SKlap-in See for info about the conversion '.$this->external_link('http://www.sqlite.org/version3.html').'.', -1 125a34ef333SKlap-in ); 126a34ef333SKlap-in } 127a34ef333SKlap-in } 128a34ef333SKlap-in } 129a34ef333SKlap-in } else { 130a34ef333SKlap-in if(!$DBI->existsPDOSqlite()) { 131a34ef333SKlap-in $sqlcommandform = false; 132a34ef333SKlap-in msg('A database in sqlite3 format needs the PHP PDO sqlite plugin.', -1); 133a34ef333SKlap-in } 134a34ef333SKlap-in } 135a34ef333SKlap-in 136a34ef333SKlap-in if($sqlcommandform) { 13793d995e0SAndreas Gohr echo '<ul>'; 1387f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 139a34ef333SKlap-in wl( 140a34ef333SKlap-in $ID, array( 141a34ef333SKlap-in 'do' => 'admin', 1427f5f9a98SAndreas Gohr 'page' => 'sqlite', 1437f5f9a98SAndreas Gohr 'db' => $_REQUEST['db'], 14484041991SKlap-in 'version'=> $_REQUEST['version'], 1457f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'table\' ORDER BY name', 146a34ef333SKlap-in 'sectok' => getSecurityToken() 147a34ef333SKlap-in ) 148a34ef333SKlap-in ). 149ab6c40f9SAdrian Lang '">'.$this->getLang('table').'</a></div></li>'; 1507f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 151a34ef333SKlap-in wl( 152a34ef333SKlap-in $ID, array( 153a34ef333SKlap-in 'do' => 'admin', 1547f5f9a98SAndreas Gohr 'page' => 'sqlite', 1557f5f9a98SAndreas Gohr 'db' => $_REQUEST['db'], 15684041991SKlap-in 'version'=> $_REQUEST['version'], 1577f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'index\' ORDER BY name', 158a34ef333SKlap-in 'sectok' => getSecurityToken() 159a34ef333SKlap-in ) 160a34ef333SKlap-in ). 161ab6c40f9SAdrian Lang '">'.$this->getLang('index').'</a></div></li>'; 16293d995e0SAndreas Gohr echo '</ul>'; 16393d995e0SAndreas Gohr 164dd79791bSAndreas Gohr $form = new Doku_Form(array('class'=> 'sqliteplugin')); 16593d995e0SAndreas Gohr $form->startFieldset('SQL Command'); 16693d995e0SAndreas Gohr $form->addHidden('id', $ID); 16793d995e0SAndreas Gohr $form->addHidden('do', 'admin'); 16893d995e0SAndreas Gohr $form->addHidden('page', 'sqlite'); 16993d995e0SAndreas Gohr $form->addHidden('db', $_REQUEST['db']); 17084041991SKlap-in $form->addHidden('version', $_REQUEST['version']); 17193d995e0SAndreas Gohr $form->addElement('<textarea name="sql" class="edit">'.hsc($_REQUEST['sql']).'</textarea>'); 17293d995e0SAndreas Gohr $form->addElement('<input type="submit" class="button" />'); 17393d995e0SAndreas Gohr $form->endFieldset(); 17493d995e0SAndreas Gohr $form->printForm(); 17593d995e0SAndreas Gohr 17693d995e0SAndreas Gohr if($_REQUEST['sql']) { 17793d995e0SAndreas Gohr 17893d995e0SAndreas Gohr if(!$DBI->init($_REQUEST['db'], '')) return; 17993d995e0SAndreas Gohr 180a34ef333SKlap-in $sql = $DBI->SQLstring2array($_REQUEST['sql']); 18193d995e0SAndreas Gohr foreach($sql as $s) { 18293d995e0SAndreas Gohr $s = preg_replace('!^\s*--.*$!m', '', $s); 18393d995e0SAndreas Gohr $s = trim($s); 18493d995e0SAndreas Gohr if(!$s) continue; 18584041991SKlap-in 18684041991SKlap-in $time_start = microtime(true); 18784041991SKlap-in 18893d995e0SAndreas Gohr $res = $DBI->query("$s;"); 18993d995e0SAndreas Gohr if($res === false) continue; 19093d995e0SAndreas Gohr 19193d995e0SAndreas Gohr $result = $DBI->res2arr($res); 19284041991SKlap-in 19384041991SKlap-in $time_end = microtime(true); 19484041991SKlap-in $time = $time_end - $time_start; 19584041991SKlap-in 19684041991SKlap-in $cnt = $DBI->res2count($res); 19784041991SKlap-in msg($cnt.' affected rows in '.($time < 0.0001 ? substr($time, 0, 5).substr($time, -3) : substr($time, 0, 7)).' seconds', 1); 19884041991SKlap-in if(!$cnt) continue; 19993d995e0SAndreas Gohr 20093d995e0SAndreas Gohr echo '<p>'; 20193d995e0SAndreas Gohr $ths = array_keys($result[0]); 20293d995e0SAndreas Gohr echo '<table class="inline">'; 20393d995e0SAndreas Gohr echo '<tr>'; 20493d995e0SAndreas Gohr foreach($ths as $th) { 20593d995e0SAndreas Gohr echo '<th>'.hsc($th).'</th>'; 20693d995e0SAndreas Gohr } 20793d995e0SAndreas Gohr echo '</tr>'; 20893d995e0SAndreas Gohr foreach($result as $row) { 20993d995e0SAndreas Gohr echo '<tr>'; 21093d995e0SAndreas Gohr $tds = array_values($row); 21193d995e0SAndreas Gohr foreach($tds as $td) { 21293d995e0SAndreas Gohr echo '<td>'.hsc($td).'</td>'; 21393d995e0SAndreas Gohr } 21493d995e0SAndreas Gohr echo '</tr>'; 21593d995e0SAndreas Gohr } 21693d995e0SAndreas Gohr echo '</table>'; 21793d995e0SAndreas Gohr echo '</p>'; 21893d995e0SAndreas Gohr } 21993d995e0SAndreas Gohr } 22093d995e0SAndreas Gohr 221a34ef333SKlap-in } 22293d995e0SAndreas Gohr echo '</div>'; 22393d995e0SAndreas Gohr } 22493d995e0SAndreas Gohr } 22593d995e0SAndreas Gohr 22693d995e0SAndreas Gohr function getTOC() { 22793d995e0SAndreas Gohr global $conf; 22893d995e0SAndreas Gohr global $ID; 22993d995e0SAndreas Gohr 23093d995e0SAndreas Gohr $toc = array(); 23140698f67SKlap-in $fileextensions = array('sqlite2'=> '.sqlite', 'sqlite3'=> '.sqlite3'); 23293d995e0SAndreas Gohr 23340698f67SKlap-in foreach($fileextensions as $dbformat => $fileextension) { 23493d995e0SAndreas Gohr $toc[] = array( 235*0542fc8eSKlap-in 'link' => wl($ID, array('do'=> 'admin', 'page'=> 'sqlite')), 23640698f67SKlap-in 'title' => $dbformat.':', 23793d995e0SAndreas Gohr 'level' => 1, 23893d995e0SAndreas Gohr 'type' => 'ul', 23993d995e0SAndreas Gohr ); 24040698f67SKlap-in 24140698f67SKlap-in $dbfiles = glob($conf['metadir'].'/*'.$fileextension); 24240698f67SKlap-in 24340698f67SKlap-in if(is_array($dbfiles)) foreach($dbfiles as $file) { 24440698f67SKlap-in $db = basename($file, $fileextension); 24540698f67SKlap-in $toc[] = array( 24684041991SKlap-in 'link' => wl($ID, array('do'=> 'admin', 'page'=> 'sqlite', 'db'=> $db, 'version'=> $dbformat, 'sectok'=> getSecurityToken())), 24740698f67SKlap-in 'title' => $this->getLang('db').' '.$db, 24840698f67SKlap-in 'level' => 2, 24940698f67SKlap-in 'type' => 'ul', 25040698f67SKlap-in ); 25140698f67SKlap-in } 25293d995e0SAndreas Gohr } 25393d995e0SAndreas Gohr 25493d995e0SAndreas Gohr return $toc; 25593d995e0SAndreas Gohr } 25693d995e0SAndreas Gohr} 25793d995e0SAndreas Gohr 258dd79791bSAndreas Gohr// vim:ts=4:sw=4:et: 259