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