xref: /plugin/sqlite/admin.php (revision a34ef33354f4df1030568693cc77a63fbac0f190)
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