2 rcs_id('$Id: upgrade.php,v 1.30 2004-11-29 17:58:57 rurban Exp $');
4 Copyright 2004 $ThePhpWikiProgrammingTeam
6 This file is part of PhpWiki.
8 PhpWiki is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 PhpWiki is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with PhpWiki; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * Upgrade the WikiDB and config settings after installing a new
26 * Status: experimental, no queries for verification yet,
27 * no merge conflict resolution (patch?), just overwrite.
29 * Installation on an existing PhpWiki database needs some
30 * additional worksteps. Each step will require multiple pages.
33 * 1. Check for new or changed database schema and update it
34 * according to some predefined upgrade tables. (medium, complete)
35 * 2. Check for new or changed (localized) pgsrc/ pages and ask
36 * for upgrading these. Check timestamps, upgrade silently or
37 * show diffs if existing. Overwrite or merge (easy, complete)
38 * 3. Check for new or changed or deprecated index.php/config.ini settings
39 * and help in upgrading these. (hard)
40 * 3a Convert old-style index.php into config/config.ini. (easy)
41 * 4. Check for changed plugin invocation arguments. (hard)
42 * 5. Check for changed theme variables. (hard)
43 * 6. Convert the single-request upgrade to a class-based multi-page
46 * Done: overwrite=1 link on edit conflicts at first occurence "Overwrite all".
48 * @author: Reini Urban
50 require_once("lib/loadsave.php");
53 * TODO: check for the pgsrc_version number, not the revision mtime only
55 function doPgsrcUpdate(&$request,$pagename,$path,$filename) {
56 $dbi = $request->getDbh();
57 $page = $dbi->getPage($pagename);
58 if ($page->exists()) {
59 // check mtime: update automatically if pgsrc is newer
60 $rev = $page->getCurrentRevision();
61 $page_mtime = $rev->get('mtime');
62 $data = implode("", file($path."/".$filename));
63 if (($parts = ParseMimeifiedPages($data))) {
64 usort($parts, 'SortByPageVersion');
66 $pageinfo = $parts[0];
67 $stat = stat($path."/".$filename);
68 $new_mtime = @$pageinfo['versiondata']['mtime'];
70 $new_mtime = @$pageinfo['versiondata']['lastmodified'];
72 $new_mtime = @$pageinfo['pagedata']['date'];
74 $new_mtime = $stat[9];
75 if ($new_mtime > $page_mtime) {
76 echo "$path/$pagename: ",_("newer than the existing page."),
77 _(" replace "),"($new_mtime > $page_mtime)","<br />\n";
78 LoadAny($request,$path."/".$filename);
81 echo "$path/$pagename: ",_("older than the existing page."),
82 _(" skipped"),".<br />\n";
85 echo "$path/$pagename: ",("unknown format."),
86 _(" skipped"),".<br />\n";
89 echo sprintf(_("%s does not exist"),$pagename),"<br />\n";
90 LoadAny($request,$path."/".$filename);
95 /** need the english filename (required precondition: urlencode == urldecode)
96 * returns the plugin name.
98 function isActionPage($filename) {
99 static $special = array("DebugInfo" => "_BackendInfo",
100 "PhpWikiRecentChanges" => "RssFeed",
101 "ProjectSummary" => "RssFeed",
102 "RecentReleases" => "RssFeed",
104 $base = preg_replace("/\..{1,4}$/","",basename($filename));
105 if (isset($special[$base])) return $special[$base];
106 if (FindFile("lib/plugin/".$base.".php",true)) return $base;
110 function CheckActionPageUpdate(&$request) {
111 echo "<h3>",_("check for necessary ActionPage updates"),"</h3>\n";
112 $dbi = $request->getDbh();
113 $path = FindFile('pgsrc');
114 $pgsrc = new fileSet($path);
115 // most actionpages have the same name as the plugin
116 $loc_path = FindLocalizedFile('pgsrc');
117 foreach ($pgsrc->getFiles() as $filename) {
118 if (substr($filename,-1,1) == '~') continue;
119 $pagename = urldecode($filename);
120 if (isActionPage($filename)) {
121 $translation = gettext($pagename);
122 if ($translation == $pagename)
123 doPgsrcUpdate($request, $pagename, $path, $filename);
124 elseif (FindLocalizedFile('pgsrc/'.urlencode($translation),1))
125 doPgsrcUpdate($request, $translation, $loc_path,
126 urlencode($translation));
128 doPgsrcUpdate($request, $pagename, $path, $filename);
133 // see loadsave.php for saving new pages.
134 function CheckPgsrcUpdate(&$request) {
135 echo "<h3>",_("check for necessary pgsrc updates"),"</h3>\n";
136 $dbi = $request->getDbh();
137 $path = FindLocalizedFile(WIKI_PGSRC);
138 $pgsrc = new fileSet($path);
139 // fixme: verification, ...
141 foreach ($pgsrc->getFiles() as $filename) {
142 if (substr($filename,-1,1) == '~') continue;
143 $pagename = urldecode($filename);
144 // don't ever update the HomePage
145 if (defined(HOME_PAGE))
146 if ($pagename == HOME_PAGE) $isHomePage = true;
148 if ($pagename == _("HomePage")) $isHomePage = true;
149 if ($pagename == "HomePage") $isHomePage = true;
151 echo "$path/$pagename: ",_("always skip the HomePage."),
152 _(" skipped"),".<br />\n";
156 if (!isActionPage($filename)) {
157 doPgsrcUpdate($request,$pagename,$path,$filename);
164 * TODO: Search table definition in appropriate schema
166 * Supported: mysql and generic SQL, for ADODB and PearDB.
168 function installTable(&$dbh, $table, $backend_type) {
170 if (!in_array($DBParams['dbtype'],array('SQL','ADODB'))) return;
171 echo _("MISSING")," ... \n";
172 $backend = &$dbh->_backend->_dbh;
174 $schema = findFile("schemas/${backend_type}.sql");
176 echo " ",_("FAILED"),": ",sprintf(_("no schema %s found"),"schemas/${backend_type}.sql")," ... <br />\n";
180 extract($dbh->_backend->_table_names);
181 $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : '';
184 assert($session_tbl);
185 if ($backend_type == 'mysql') {
186 $dbh->genericSqlQuery("
187 CREATE TABLE $session_tbl (
188 sess_id CHAR(32) NOT NULL DEFAULT '',
189 sess_data BLOB NOT NULL,
190 sess_date INT UNSIGNED NOT NULL,
191 sess_ip CHAR(15) NOT NULL,
192 PRIMARY KEY (sess_id),
196 $dbh->genericSqlQuery("
197 CREATE TABLE $session_tbl (
198 sess_id CHAR(32) NOT NULL DEFAULT '',
199 sess_data ".($backend_type == 'pgsql'?'TEXT':'BLOB')." NOT NULL,
201 sess_ip CHAR(15) NOT NULL
203 $dbh->genericSqlQuery("CREATE UNIQUE INDEX sess_id ON $session_tbl (sess_id)");
205 $dbh->genericSqlQuery("CREATE INDEX sess_date on session (sess_date)");
206 echo " ",_("CREATED");
209 $user_tbl = $prefix.'user';
210 if ($backend_type == 'mysql') {
211 $dbh->genericSqlQuery("
212 CREATE TABLE $user_tbl (
213 userid CHAR(48) BINARY NOT NULL UNIQUE,
214 passwd CHAR(48) BINARY DEFAULT '',
218 $dbh->genericSqlQuery("
219 CREATE TABLE $user_tbl (
220 userid CHAR(48) NOT NULL,
221 passwd CHAR(48) DEFAULT ''
223 $dbh->genericSqlQuery("CREATE UNIQUE INDEX userid ON $user_tbl (userid)");
225 echo " ",_("CREATED");
228 $pref_tbl = $prefix.'pref';
229 if ($backend_type == 'mysql') {
230 $dbh->genericSqlQuery("
231 CREATE TABLE $pref_tbl (
232 userid CHAR(48) BINARY NOT NULL UNIQUE,
233 prefs TEXT NULL DEFAULT '',
237 $dbh->genericSqlQuery("
238 CREATE TABLE $pref_tbl (
239 userid CHAR(48) NOT NULL,
240 prefs TEXT NULL DEFAULT '',
242 $dbh->genericSqlQuery("CREATE UNIQUE INDEX userid ON $pref_tbl (userid)");
244 echo " ",_("CREATED");
247 $member_tbl = $prefix.'member';
248 if ($backend_type == 'mysql') {
249 $dbh->genericSqlQuery("
250 CREATE TABLE $member_tbl (
251 userid CHAR(48) BINARY NOT NULL,
252 groupname CHAR(48) BINARY NOT NULL DEFAULT 'users',
257 $dbh->genericSqlQuery("
258 CREATE TABLE $member_tbl (
259 userid CHAR(48) NOT NULL,
260 groupname CHAR(48) NOT NULL DEFAULT 'users',
262 $dbh->genericSqlQuery("CREATE INDEX userid ON $member_tbl (userid)");
263 $dbh->genericSqlQuery("CREATE INDEX groupname ON $member_tbl (groupname)");
265 echo " ",_("CREATED");
268 $rating_tbl = $prefix.'rating';
269 if ($backend_type == 'mysql') {
270 $dbh->genericSqlQuery("
271 CREATE TABLE $rating_tbl (
272 dimension INT(4) NOT NULL,
273 raterpage INT(11) NOT NULL,
274 rateepage INT(11) NOT NULL,
275 ratingvalue FLOAT NOT NULL,
276 rateeversion INT(11) NOT NULL,
277 tstamp TIMESTAMP(14) NOT NULL,
278 PRIMARY KEY (dimension, raterpage, rateepage)
281 $dbh->genericSqlQuery("
282 CREATE TABLE $rating_tbl (
283 dimension INT(4) NOT NULL,
284 raterpage INT(11) NOT NULL,
285 rateepage INT(11) NOT NULL,
286 ratingvalue FLOAT NOT NULL,
287 rateeversion INT(11) NOT NULL,
288 tstamp TIMESTAMP(14) NOT NULL,
290 $dbh->genericSqlQuery("CREATE UNIQUE INDEX rating ON $rating_tbl (dimension, raterpage, rateepage)");
292 echo " ",_("CREATED");
295 $log_tbl = $prefix.'accesslog';
296 // fields according to http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/#id2756178
298 A User Agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
299 a CGi request arguments request_args varchar(255) user=Smith&cart=1231&item=532
300 b Bytes transfered bytes_sent int unsigned 32561
301 c??? Text of cookie cookie varchar(255) Apache=sdyn.fooonline.net 1300102700823
302 f Local filename requested request_file varchar(255) /var/www/html/books-cycroad.html
303 H HTTP request_protocol request_protocol varchar(10) HTTP/1.1
304 h Name of remote host remote_host varchar(50) blah.foobar.com
305 I Request ID (from modd_unique_id) id char(19) POlFcUBRH30AAALdBG8
306 l Ident user info remote_logname varcgar(50) bobby
307 M Machine ID??? machine_id varchar(25) web01
308 m HTTP request method request_method varchar(10) GET
309 P httpd cchild PID child_pid smallint unsigned 3215
310 p http port server_port smallint unsigned 80
311 R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
312 r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
313 S Time of request in UNIX time_t format time_stamp int unsigned 1005598029
314 T Seconds to service request request_duration smallint unsigned 2
315 t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
316 U Request in simple form request_uri varchar(255) /books-cycroad.html
317 u User info from HTTP auth remote_user varchar(50) bobby
318 v Virtual host servicing the request virtual_host varchar(255)
320 $dbh->genericSqlQuery("
321 CREATE TABLE $log_tbl (
322 time_stamp int unsigned,
323 remote_host varchar(50),
324 remote_user varchar(50),
325 request_method varchar(10),
326 request_line varchar(255),
327 request_args varchar(255),
328 request_uri varchar(255),
329 request_time char(28),
330 status smallint unsigned,
331 bytes_sent smallint unsigned,
332 referer varchar(255),
334 request_duration float
336 $dbh->genericSqlQuery("CREATE INDEX log_time ON $log_tbl (time_stamp)");
337 $dbh->genericSqlQuery("CREATE INDEX log_host ON $log_tbl (remote_host)");
338 echo " ",_("CREATED");
345 * currently update only session, user, pref and member
346 * jeffs-hacks database api (around 1.3.2) later
347 * people should export/import their pages if using that old versions.
349 function CheckDatabaseUpdate(&$request) {
350 global $DBParams, $DBAuthParams;
351 if (!in_array($DBParams['dbtype'], array('SQL','ADODB'))) return;
352 echo "<h3>",_("check for necessary database updates"),"</h3>\n";
353 if (defined('DBADMIN_USER') and DBADMIN_USER) {
354 // if need to connect as the root user, for alter permissions
355 $AdminParams = $DBParams;
356 if ($DBParams['dbtype'] == 'SQL')
357 $dsn = DB::parseDSN($AdminParams['dsn']);
359 $dsn = parseDSN($AdminParams['dsn']);
360 $AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s",
366 $dbh = WikiDB::open($AdminParams);
368 $dbh = &$request->_dbi;
370 $tables = $dbh->_backend->listOfTables();
371 $backend_type = $dbh->_backend->backendType();
372 $prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : '';
373 foreach (explode(':','session:user:pref:member') as $table) {
374 echo sprintf(_("check for table %s"), $table)," ...";
375 if (!in_array($prefix.$table, $tables)) {
376 installTable($dbh, $table, $backend_type);
378 echo _("OK")," <br />\n";
381 if (ACCESS_LOG_SQL) {
382 $table = "accesslog";
383 echo sprintf(_("check for table %s"), $table)," ...";
384 if (!in_array($prefix.$table, $tables)) {
385 installTable($dbh, $table, $backend_type);
387 echo _("OK")," <br />\n";
390 $backend = &$dbh->_backend->_dbh;
391 // 1.3.8 added session.sess_ip
392 if (phpwiki_version() >= 1030.08 and USE_DB_SESSION and isset($request->_dbsession)) {
393 echo _("check for new session.sess_ip column")," ... ";
394 $database = $dbh->_backend->database();
395 assert(!empty($DBParams['db_session_table']));
396 $session_tbl = $prefix . $DBParams['db_session_table'];
397 $sess_fields = $dbh->_backend->listOfFields($database, $session_tbl);
398 if (!strstr(strtolower(join(':', $sess_fields)),"sess_ip")) {
399 // TODO: postgres test (should be able to add columns at the end, but not in between)
400 echo "<b>",_("ADDING"),"</b>"," ... ";
401 $dbh->genericSqlQuery("ALTER TABLE $session_tbl ADD sess_ip CHAR(15) NOT NULL");
402 $dbh->genericSqlQuery("CREATE INDEX sess_date ON $session_tbl (sess_date)");
408 // 1.3.10 mysql requires page.id auto_increment
409 // mysql, mysqli or mysqlt
410 if (phpwiki_version() >= 1030.099 and substr($backend_type,0,5) == 'mysql') {
411 echo _("check for page.id auto_increment flag")," ...";
412 extract($dbh->_backend->_table_names);
413 assert(!empty($page_tbl));
414 $database = $dbh->_backend->database();
415 $fields = mysql_list_fields($database, $page_tbl, $dbh->_backend->connection());
416 $columns = mysql_num_fields($fields);
417 for ($i = 0; $i < $columns; $i++) {
418 if (mysql_field_name($fields, $i) == 'id') {
419 $flags = mysql_field_flags($fields, $i);
420 //DONE: something was wrong with ADODB here.
421 if (!strstr(strtolower($flags), "auto_increment")) {
422 echo "<b>",_("ADDING"),"</b>"," ... ";
423 // MODIFY col_def valid since mysql 3.22.16,
424 // older mysql's need CHANGE old_col col_def
425 $dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE id id INT NOT NULL AUTO_INCREMENT");
426 $fields = mysql_list_fields($database, $page_tbl);
427 if (!strstr(strtolower(mysql_field_flags($fields, $i)), "auto_increment"))
428 echo " <b><font color=\"red\">", _("FAILED"), "</font></b><br />\n";
430 echo _("OK"), "<br />\n";
432 echo _("OK"), "<br />\n";
437 mysql_free_result($fields);
439 // check for mysql 4.1.x/5.0.0a binary search problem.
440 // http://bugs.mysql.com/bug.php?id=4398
441 // "select * from page where LOWER(pagename) like '%search%'" does not apply LOWER!
442 // confirmed for 4.1.0alpha,4.1.3-beta,5.0.0a; not yet tested for 4.1.2alpha,
443 // TODO: there's another known workaround, not yet applied. On windows only.
444 if (isWindows() and substr($backend_type,0,5) == 'mysql') {
445 echo _("check for mysql 4.1.x/5.0.0 binary search on windows problem")," ...";
446 $result = mysql_query("SELECT VERSION()", $dbh->_backend->connection());
447 $row = mysql_fetch_row($result);
448 $mysql_version = $row[0];
449 $arr = explode('.', $mysql_version);
450 $version = (string)(($arr[0] * 100) + $arr[1]) . "." . (integer)$arr[2];
451 if ($version >= 401.0) {
452 $dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename pagename VARCHAR(100) NOT NULL;");
453 echo sprintf(_("version <em>%s</em> <b>FIXED</b>"), $mysql_version),"<br />\n";
455 echo sprintf(_("version <em>%s</em> not affected"), $mysql_version),"<br />\n";
461 function fixConfigIni($match, $new) {
462 $file = FindFile("config/config.ini");
464 if (is_writable($file)) {
465 $in = fopen($file,"rb");
466 $out = fopen($tmp = tempnam(FindFile("uploads"),"cfg"),"wb");
468 $tmp = str_replace("/","\\",$tmp);
469 while ($s = fgets($in)) {
470 if (preg_match($match, $s)) {
471 $s = $new . (isWindows() ? "\r\n" : "\n");
479 echo " <b><font color=\"red\">",_("FAILED"),"</font></b>: ",
480 sprintf(_("%s not found"), $match);
483 @unlink("$file.bak");
484 @rename($file,"$file.bak");
485 if (rename($tmp, $file))
486 echo " <b>",_("FIXED"),"</b>";
488 echo " <b>",_("FAILED"),"</b>: ";
489 sprintf(_("couldn't move %s to %s"), $tmp, $file);
495 echo " <b><font color=\"red\">",_("FAILED"),"</font></b>: ",
496 sprintf(_("%s is not writable"), $file);
501 function CheckConfigUpdate(&$request) {
502 echo "<h3>",_("check for necessary config updates"),"</h3>\n";
503 echo _("check for old CACHE_CONTROL = NONE")," ... ";
504 if (defined('CACHE_CONTROL') and CACHE_CONTROL == '') {
505 echo "<br /> ",_("CACHE_CONTROL is set to 'NONE', and must be changed to 'NO_CACHE'")," ...";
506 fixConfigIni("/^\s*CACHE_CONTROL\s*=\s*NONE/","CACHE_CONTROL = NO_CACHE");
511 echo _("check for GROUP_METHOD = NONE")," ... ";
512 if (defined('GROUP_METHOD') and GROUP_METHOD == '') {
513 echo "<br /> ",_("GROUP_METHOD is set to NONE, and must be changed to \"NONE\"")," ...";
514 fixConfigIni("/^\s*GROUP_METHOD\s*=\s*NONE/","GROUP_METHOD = \"NONE\"");
524 * Upgrade: Base class for multipage worksteps
525 * identify, validate, display options, next step
530 class Upgrade_CheckPgsrc extends Upgrade {
533 class Upgrade_CheckDatabaseUpdate extends Upgrade {
536 // TODO: At which step are we?
537 // validate and do it again or go on with next step.
539 /** entry function from lib/main.php
541 function DoUpgrade($request) {
543 if (!$request->_user->isAdmin()) {
544 $request->_notAuthorized(WIKIAUTH_ADMIN);
546 HTML::div(array('class' => 'disabled-plugin'),
547 fmt("Upgrade disabled: user != isAdmin")));
551 StartLoadDump($request, _("Upgrading this PhpWiki"));
552 //CheckOldIndexUpdate($request); // to upgrade from < 1.3.10
553 CheckActionPageUpdate($request);
554 CheckDatabaseUpdate($request);
555 CheckPgsrcUpdate($request);
556 //CheckThemeUpdate($request);
557 CheckConfigUpdate($request);
558 EndLoadDump($request);
563 $Log: not supported by cvs2svn $
564 Revision 1.29 2004/11/29 16:08:31 rurban
567 Revision 1.28 2004/11/16 16:25:14 rurban
568 fix accesslog tablename, print CREATED only if really done
570 Revision 1.27 2004/11/07 16:02:52 rurban
571 new sql access log (for spam prevention), and restructured access log class
573 pear_db: mysql specific parts seperated (using replace)
575 Revision 1.26 2004/10/14 19:19:34 rurban
576 loadsave: check if the dumped file will be accessible from outside.
577 and some other minor fixes. (cvsclient native not yet ready)
579 Revision 1.25 2004/09/06 08:28:00 rurban
580 rename genericQuery to genericSqlQuery
582 Revision 1.24 2004/07/05 13:56:22 rurban
583 sqlite autoincrement fix
585 Revision 1.23 2004/07/04 10:28:06 rurban
588 Revision 1.22 2004/07/03 17:21:28 rurban
589 updated docs: submitted new mysql bugreport (#1491 did not fix it)
591 Revision 1.21 2004/07/03 16:51:05 rurban
592 optional DBADMIN_USER:DBADMIN_PASSWD for action=upgrade (if no ALTER permission)
593 added atomic mysql REPLACE for PearDB as in ADODB
594 fixed _lock_tables typo links => link
595 fixes unserialize ADODB bug in line 180
597 Revision 1.20 2004/07/03 14:48:18 rurban
598 Tested new mysql 4.1.3-beta: binary search bug as fixed.
599 => fixed action=upgrade,
600 => version check in PearDB also (as in ADODB)
602 Revision 1.19 2004/06/19 12:19:09 rurban
603 slightly improved docs
605 Revision 1.18 2004/06/19 11:47:17 rurban
606 added CheckConfigUpdate: CACHE_CONTROL = NONE => NO_CACHE
608 Revision 1.17 2004/06/17 11:31:50 rurban
609 check necessary localized actionpages
611 Revision 1.16 2004/06/16 10:38:58 rurban
612 Disallow refernces in calls if the declaration is a reference
613 ("allow_call_time_pass_reference clean").
614 PhpWiki is now allow_call_time_pass_reference = Off clean,
615 but several external libraries may not.
616 In detail these libs look to be affected (not tested):
620 Revision 1.15 2004/06/07 19:50:40 rurban
621 add owner field to mimified dump
623 Revision 1.14 2004/06/07 18:38:18 rurban
624 added mysql 4.1.x search fix
626 Revision 1.13 2004/06/04 20:32:53 rurban
627 Several locale related improvements suggested by Pierrick Meignen
628 LDAP fix by John Cole
629 reanable admin check without ENABLE_PAGEPERM in the admin plugins
631 Revision 1.12 2004/05/18 13:59:15 rurban
632 rename simpleQuery to genericSqlQuery
634 Revision 1.11 2004/05/15 13:06:17 rurban
635 skip the HomePage, at first upgrade the ActionPages, then the database, then the rest
637 Revision 1.10 2004/05/15 01:19:41 rurban
638 upgrade prefix fix by Kai Krakow
640 Revision 1.9 2004/05/14 11:33:03 rurban
641 version updated to 1.3.11pre
642 upgrade stability fix
644 Revision 1.8 2004/05/12 10:49:55 rurban
645 require_once fix for those libs which are loaded before FileFinder and
646 its automatic include_path fix, and where require_once doesn't grok
647 dirname(__FILE__) != './lib'
648 upgrade fix with PearDB
649 navbar.tmpl: remove spaces for IE button alignment
651 Revision 1.7 2004/05/06 17:30:38 rurban
652 CategoryGroup: oops, dos2unix eol
653 improved phpwiki_version:
654 pre -= .0001 (1.3.10pre: 1030.099)
655 -p1 += .001 (1.3.9-p1: 1030.091)
656 improved InstallTable for mysql and generic SQL versions and all newer tables so far.
657 abstracted more ADODB/PearDB methods for action=upgrade stuff:
658 backend->backendType(), backend->database(),
659 backend->listOfFields(),
660 backend->listOfTables(),
662 Revision 1.6 2004/05/03 15:05:36 rurban
665 Revision 1.4 2004/05/02 21:26:38 rurban
666 limit user session data (HomePageHandle and auth_dbi have to invalidated anyway)
667 because they will not survive db sessions, if too large.
668 extended action=upgrade
669 some WikiTranslation button work
670 revert WIKIAUTH_UNOBTAINABLE (need it for main.php)
671 some temp. session debug statements
673 Revision 1.3 2004/04/29 22:33:30 rurban
674 fixed sf.net bug #943366 (Kai Krakow)
675 couldn't load localized url-undecoded pagenames
677 Revision 1.2 2004/03/12 15:48:07 rurban
678 fixed explodePageList: wrong sortby argument order in UnfoldSubpages
679 simplified lib/stdlib.php:explodePageList
688 // c-hanging-comment-ender-p: nil
689 // indent-tabs-mode: nil