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 2493d995e0SAndreas Gohr function getMenuSort() { return 500; } 2593d995e0SAndreas Gohr function forAdminOnly() { return true; } 2693d995e0SAndreas Gohr 2793d995e0SAndreas Gohr function handle() { 28*a34ef333SKlap-in global $conf; 29*a34ef333SKlap-in if(isset($_POST['sqlite_rename'])) { 30*a34ef333SKlap-in 31*a34ef333SKlap-in $path = $conf['metadir'].'/'.$_REQUEST['db']; 32*a34ef333SKlap-in if(io_rename($path.'.sqlite', $path.'.sqlite3')) { 33*a34ef333SKlap-in msg('Renamed database file succesfull!', 1); 34*a34ef333SKlap-in //set to new situation 35*a34ef333SKlap-in $_REQUEST['version'] = 'sqlite3'; 36*a34ef333SKlap-in 37*a34ef333SKlap-in } else { 38*a34ef333SKlap-in msg('Renaming database file fails!', -1); 39*a34ef333SKlap-in } 40*a34ef333SKlap-in 41*a34ef333SKlap-in } elseif(isset($_POST['sqlite_convert'])) { 42*a34ef333SKlap-in 43*a34ef333SKlap-in /** @var $DBI helper_plugin_sqlite */ 44*a34ef333SKlap-in $DBI =& plugin_load('helper', 'sqlite'); 45*a34ef333SKlap-in $time_start = microtime(true); 46*a34ef333SKlap-in 47*a34ef333SKlap-in if($dumpfile = $DBI->dumpDatabase($_REQUEST['db'], DOKU_EXT_SQLITE)) { 48*a34ef333SKlap-in msg('Database temporary dumped to file: '.hsc($dumpfile).'. Now loading in new database...', 1); 49*a34ef333SKlap-in 50*a34ef333SKlap-in if(!$DBI->fillDatabaseFromDump($_REQUEST['db'], $dumpfile)) { 51*a34ef333SKlap-in msg('Conversion failed!', -1); 52*a34ef333SKlap-in return false; 53*a34ef333SKlap-in } 54*a34ef333SKlap-in 55*a34ef333SKlap-in //TODO delete dumpfile 56*a34ef333SKlap-in //return @unlink($dumpfile); 57*a34ef333SKlap-in //TODO delete old sqlite2-db 58*a34ef333SKlap-in // return @unlink($conf['metadir'].'/'.$_REQUEST['db'].'.sqlite'); 59*a34ef333SKlap-in 60*a34ef333SKlap-in msg('Conversion succeed!', 1); 61*a34ef333SKlap-in //set to new situation 62*a34ef333SKlap-in $_REQUEST['version'] = 'sqlite3'; 63*a34ef333SKlap-in } 64*a34ef333SKlap-in $time_end = microtime(true); 65*a34ef333SKlap-in $time = $time_end - $time_start; 66*a34ef333SKlap-in msg('Database "'.hsc($_REQUEST['db']).'" converted from sqlite 2 to 3 in '.$time.' seconds.', 0); 67*a34ef333SKlap-in 68*a34ef333SKlap-in } 6993d995e0SAndreas Gohr } 7093d995e0SAndreas Gohr 7193d995e0SAndreas Gohr function html() { 7293d995e0SAndreas Gohr global $ID; 73*a34ef333SKlap-in global $conf; 7493d995e0SAndreas Gohr 7593d995e0SAndreas Gohr echo $this->locale_xhtml('intro'); 7693d995e0SAndreas Gohr 77*a34ef333SKlap-in if(isset($_REQUEST['db']) && checkSecurityToken()) { 7893d995e0SAndreas Gohr 79*a34ef333SKlap-in echo '<h2>'.$this->getLang('db').' "'.hsc($_REQUEST['db']).'"</h2>'; 8093d995e0SAndreas Gohr echo '<div class="level2">'; 8193d995e0SAndreas Gohr 82*a34ef333SKlap-in $sqlcommandform = true; 83*a34ef333SKlap-in /** @var $DBI helper_plugin_sqlite */ 84*a34ef333SKlap-in $DBI =& plugin_load('helper', 'sqlite'); 85*a34ef333SKlap-in if($_REQUEST['version'] == 'sqlite2') { 86*a34ef333SKlap-in if(helper_plugin_sqlite_adapter::isSqlite3db($conf['metadir'].'/'.$_REQUEST['db'].'.sqlite')) { 87*a34ef333SKlap-in 88*a34ef333SKlap-in msg('This is a database in sqlite3 format.', 2); 89*a34ef333SKlap-in msg( 90*a34ef333SKlap-in 'This plugin needs your database file has the extension ".sqlite3" 91*a34ef333SKlap-in instead of ".sqlite" before it will be recognized as sqlite3 database.', 2 92*a34ef333SKlap-in ); 93*a34ef333SKlap-in $form = new Doku_Form(array('method'=> 'post')); 94*a34ef333SKlap-in $form->addHidden('page', 'sqlite'); 95*a34ef333SKlap-in $form->addHidden('sqlite_rename', 'go'); 96*a34ef333SKlap-in $form->addHidden('db', $_REQUEST['db']); 97*a34ef333SKlap-in $form->addElement(form_makeButton('submit', 'admin', sprintf($this->getLang('rename2to3'), hsc($_REQUEST['db'])))); 98*a34ef333SKlap-in $form->printForm(); 99*a34ef333SKlap-in 100*a34ef333SKlap-in if($DBI->existsPDOSqlite()) $sqlcommandform = false; 101*a34ef333SKlap-in 102*a34ef333SKlap-in } else { 103*a34ef333SKlap-in if($DBI->existsPDOSqlite()) { 104*a34ef333SKlap-in $sqlcommandform = false; 105*a34ef333SKlap-in msg('This is a database in sqlite2 format.', 2); 106*a34ef333SKlap-in 107*a34ef333SKlap-in if($DBI->existsSqlite2()) { 108*a34ef333SKlap-in $form = new Doku_Form(array('method'=> 'post')); 109*a34ef333SKlap-in $form->addHidden('page', 'sqlite'); 110*a34ef333SKlap-in $form->addHidden('sqlite_convert', 'go'); 111*a34ef333SKlap-in $form->addHidden('db', $_REQUEST['db']); 112*a34ef333SKlap-in $form->addElement(form_makeButton('submit', 'admin', sprintf($this->getLang('convert2to3'), hsc($_REQUEST['db'])))); 113*a34ef333SKlap-in $form->printForm(); 114*a34ef333SKlap-in } else { 115*a34ef333SKlap-in msg( 116*a34ef333SKlap-in 'Before PDO sqlite can handle this format, it needs a conversion to the sqlite3 format. 117*a34ef333SKlap-in Because PHP sqlite extension is not available, 118*a34ef333SKlap-in you should manually convert "'.hsc($_REQUEST['db']).'.sqlite" in the meta directory to "'.hsc($_REQUEST['db']).'.sqlite3".<br /> 119*a34ef333SKlap-in See for info about the conversion '.$this->external_link('http://www.sqlite.org/version3.html').'.', -1 120*a34ef333SKlap-in ); 121*a34ef333SKlap-in } 122*a34ef333SKlap-in } 123*a34ef333SKlap-in } 124*a34ef333SKlap-in } else { 125*a34ef333SKlap-in if(!$DBI->existsPDOSqlite()) { 126*a34ef333SKlap-in $sqlcommandform = false; 127*a34ef333SKlap-in msg('A database in sqlite3 format needs the PHP PDO sqlite plugin.', -1); 128*a34ef333SKlap-in } 129*a34ef333SKlap-in } 130*a34ef333SKlap-in 131*a34ef333SKlap-in if($sqlcommandform) { 13293d995e0SAndreas Gohr echo '<ul>'; 1337f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 134*a34ef333SKlap-in wl( 135*a34ef333SKlap-in $ID, array( 136*a34ef333SKlap-in 'do' => 'admin', 1377f5f9a98SAndreas Gohr 'page' => 'sqlite', 1387f5f9a98SAndreas Gohr 'db' => $_REQUEST['db'], 13984041991SKlap-in 'version'=> $_REQUEST['version'], 1407f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'table\' ORDER BY name', 141*a34ef333SKlap-in 'sectok' => getSecurityToken() 142*a34ef333SKlap-in ) 143*a34ef333SKlap-in ). 144ab6c40f9SAdrian Lang '">'.$this->getLang('table').'</a></div></li>'; 1457f5f9a98SAndreas Gohr echo '<li><div class="li"><a href="'. 146*a34ef333SKlap-in wl( 147*a34ef333SKlap-in $ID, array( 148*a34ef333SKlap-in 'do' => 'admin', 1497f5f9a98SAndreas Gohr 'page' => 'sqlite', 1507f5f9a98SAndreas Gohr 'db' => $_REQUEST['db'], 15184041991SKlap-in 'version'=> $_REQUEST['version'], 1527f5f9a98SAndreas Gohr 'sql' => 'SELECT name,sql FROM sqlite_master WHERE type=\'index\' ORDER BY name', 153*a34ef333SKlap-in 'sectok' => getSecurityToken() 154*a34ef333SKlap-in ) 155*a34ef333SKlap-in ). 156ab6c40f9SAdrian Lang '">'.$this->getLang('index').'</a></div></li>'; 15793d995e0SAndreas Gohr echo '</ul>'; 15893d995e0SAndreas Gohr 159dd79791bSAndreas Gohr $form = new Doku_Form(array('class'=> 'sqliteplugin')); 16093d995e0SAndreas Gohr $form->startFieldset('SQL Command'); 16193d995e0SAndreas Gohr $form->addHidden('id', $ID); 16293d995e0SAndreas Gohr $form->addHidden('do', 'admin'); 16393d995e0SAndreas Gohr $form->addHidden('page', 'sqlite'); 16493d995e0SAndreas Gohr $form->addHidden('db', $_REQUEST['db']); 16584041991SKlap-in $form->addHidden('version', $_REQUEST['version']); 16693d995e0SAndreas Gohr $form->addElement('<textarea name="sql" class="edit">'.hsc($_REQUEST['sql']).'</textarea>'); 16793d995e0SAndreas Gohr $form->addElement('<input type="submit" class="button" />'); 16893d995e0SAndreas Gohr $form->endFieldset(); 16993d995e0SAndreas Gohr $form->printForm(); 17093d995e0SAndreas Gohr 17193d995e0SAndreas Gohr if($_REQUEST['sql']) { 17293d995e0SAndreas Gohr 17393d995e0SAndreas Gohr if(!$DBI->init($_REQUEST['db'], '')) return; 17493d995e0SAndreas Gohr 175*a34ef333SKlap-in $sql = $DBI->SQLstring2array($_REQUEST['sql']); 17693d995e0SAndreas Gohr foreach($sql as $s) { 17793d995e0SAndreas Gohr $s = preg_replace('!^\s*--.*$!m', '', $s); 17893d995e0SAndreas Gohr $s = trim($s); 17993d995e0SAndreas Gohr if(!$s) continue; 18084041991SKlap-in 18184041991SKlap-in $time_start = microtime(true); 18284041991SKlap-in 18393d995e0SAndreas Gohr $res = $DBI->query("$s;"); 18493d995e0SAndreas Gohr if($res === false) continue; 18593d995e0SAndreas Gohr 18693d995e0SAndreas Gohr $result = $DBI->res2arr($res); 18784041991SKlap-in 18884041991SKlap-in $time_end = microtime(true); 18984041991SKlap-in $time = $time_end - $time_start; 19084041991SKlap-in 19184041991SKlap-in $cnt = $DBI->res2count($res); 19284041991SKlap-in msg($cnt.' affected rows in '.($time < 0.0001 ? substr($time, 0, 5).substr($time, -3) : substr($time, 0, 7)).' seconds', 1); 19384041991SKlap-in if(!$cnt) continue; 19493d995e0SAndreas Gohr 19593d995e0SAndreas Gohr echo '<p>'; 19693d995e0SAndreas Gohr $ths = array_keys($result[0]); 19793d995e0SAndreas Gohr echo '<table class="inline">'; 19893d995e0SAndreas Gohr echo '<tr>'; 19993d995e0SAndreas Gohr foreach($ths as $th) { 20093d995e0SAndreas Gohr echo '<th>'.hsc($th).'</th>'; 20193d995e0SAndreas Gohr } 20293d995e0SAndreas Gohr echo '</tr>'; 20393d995e0SAndreas Gohr foreach($result as $row) { 20493d995e0SAndreas Gohr echo '<tr>'; 20593d995e0SAndreas Gohr $tds = array_values($row); 20693d995e0SAndreas Gohr foreach($tds as $td) { 20793d995e0SAndreas Gohr echo '<td>'.hsc($td).'</td>'; 20893d995e0SAndreas Gohr } 20993d995e0SAndreas Gohr echo '</tr>'; 21093d995e0SAndreas Gohr } 21193d995e0SAndreas Gohr echo '</table>'; 21293d995e0SAndreas Gohr echo '</p>'; 21393d995e0SAndreas Gohr } 21493d995e0SAndreas Gohr } 21593d995e0SAndreas Gohr 216*a34ef333SKlap-in } 21793d995e0SAndreas Gohr echo '</div>'; 21893d995e0SAndreas Gohr } 21993d995e0SAndreas Gohr } 22093d995e0SAndreas Gohr 22193d995e0SAndreas Gohr function getTOC(){ 22293d995e0SAndreas Gohr global $conf; 22393d995e0SAndreas Gohr global $ID; 22493d995e0SAndreas Gohr 22593d995e0SAndreas Gohr $toc = array(); 22640698f67SKlap-in $fileextensions = array('sqlite2'=>'.sqlite','sqlite3'=>'.sqlite3'); 22793d995e0SAndreas Gohr 22840698f67SKlap-in foreach($fileextensions as $dbformat => $fileextension){ 22993d995e0SAndreas Gohr $toc[] = array( 23040698f67SKlap-in 'link' => '', 23140698f67SKlap-in 'title' => $dbformat.':', 23293d995e0SAndreas Gohr 'level' => 1, 23393d995e0SAndreas Gohr 'type' => 'ul', 23493d995e0SAndreas Gohr ); 23540698f67SKlap-in 23640698f67SKlap-in $dbfiles = glob($conf['metadir'].'/*'.$fileextension); 23740698f67SKlap-in 23840698f67SKlap-in if(is_array($dbfiles)) foreach($dbfiles as $file){ 23940698f67SKlap-in $db = basename($file,$fileextension); 24040698f67SKlap-in $toc[] = array( 24184041991SKlap-in 'link' => wl($ID,array('do'=>'admin','page'=>'sqlite','db'=>$db,'version'=>$dbformat,'sectok'=>getSecurityToken())), 24240698f67SKlap-in 'title' => $this->getLang('db').' '.$db, 24340698f67SKlap-in 'level' => 2, 24440698f67SKlap-in 'type' => 'ul', 24540698f67SKlap-in ); 24640698f67SKlap-in } 24793d995e0SAndreas Gohr } 24893d995e0SAndreas Gohr 24993d995e0SAndreas Gohr return $toc; 25093d995e0SAndreas Gohr } 25193d995e0SAndreas Gohr} 25293d995e0SAndreas Gohr 253dd79791bSAndreas Gohr// vim:ts=4:sw=4:et: 254