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