getDbh();
$page = $dbi->getPage($pagename);
if ($page->exists()) {
// check mtime: update automatically if pgsrc is newer
$rev = $page->getCurrentRevision();
$page_mtime = $rev->get('mtime');
$data = implode("", file($path."/".$filename));
if (($parts = ParseMimeifiedPages($data))) {
usort($parts, 'SortByPageVersion');
reset($parts);
$pageinfo = $parts[0];
$stat = stat($path."/".$filename);
$new_mtime = @$pageinfo['versiondata']['mtime'];
if (!$new_mtime)
$new_mtime = @$pageinfo['versiondata']['lastmodified'];
if (!$new_mtime)
$new_mtime = @$pageinfo['pagedata']['date'];
if (!$new_mtime)
$new_mtime = $stat[9];
if ($new_mtime > $page_mtime) {
echo "$path/$pagename: ",_("newer than the existing page."),
_(" replace "),"($new_mtime > $page_mtime)","
\n";
LoadAny($request,$path."/".$filename);
echo "
\n";
} else {
echo "$path/$pagename: ",_("older than the existing page."),
_(" skipped"),".
\n";
}
} else {
echo "$path/$pagename: ",("unknown format."),
_(" skipped"),".
\n";
}
} else {
echo sprintf(_("%s does not exist"),$pagename),"
\n";
LoadAny($request,$path."/".$filename);
echo "
\n";
}
}
/** need the english filename (required precondition: urlencode == urldecode)
* returns the plugin name.
*/
function isActionPage($filename) {
static $special = array("DebugInfo" => "_BackendInfo",
"PhpWikiRecentChanges" => "RssFeed",
"ProjectSummary" => "RssFeed",
"RecentReleases" => "RssFeed",
);
$base = preg_replace("/\..{1,4}$/","",basename($filename));
if (isset($special[$base])) return $special[$base];
if (FindFile("lib/plugin/".$base.".php",true)) return $base;
else return false;
}
function CheckActionPageUpdate(&$request) {
echo "
",_("check for necessary ActionPage updates"),"
\n";
$dbi = $request->getDbh();
$path = FindFile('pgsrc');
$pgsrc = new fileSet($path);
// most actionpages have the same name as the plugin
$loc_path = FindLocalizedFile('pgsrc');
foreach ($pgsrc->getFiles() as $filename) {
if (substr($filename,-1,1) == '~') continue;
$pagename = urldecode($filename);
if (isActionPage($filename)) {
$translation = gettext($pagename);
if ($translation == $pagename)
doPgsrcUpdate($request, $pagename, $path, $filename);
elseif (FindLocalizedFile('pgsrc/'.urlencode($translation),1))
doPgsrcUpdate($request, $translation, $loc_path,
urlencode($translation));
else
doPgsrcUpdate($request, $pagename, $path, $filename);
}
}
}
// see loadsave.php for saving new pages.
function CheckPgsrcUpdate(&$request) {
echo "",_("check for necessary pgsrc updates"),"
\n";
$dbi = $request->getDbh();
$path = FindLocalizedFile(WIKI_PGSRC);
$pgsrc = new fileSet($path);
// fixme: verification, ...
$isHomePage = false;
foreach ($pgsrc->getFiles() as $filename) {
if (substr($filename,-1,1) == '~') continue;
$pagename = urldecode($filename);
// don't ever update the HomePage
if (defined(HOME_PAGE))
if ($pagename == HOME_PAGE) $isHomePage = true;
else
if ($pagename == _("HomePage")) $isHomePage = true;
if ($pagename == "HomePage") $isHomePage = true;
if ($isHomePage) {
echo "$path/$pagename: ",_("always skip the HomePage."),
_(" skipped"),".
\n";
$isHomePage = false;
continue;
}
if (!isActionPage($filename)) {
doPgsrcUpdate($request,$pagename,$path,$filename);
}
}
return;
}
/**
* TODO: Search table definition in appropriate schema
* and create it.
* Supported: mysql and generic SQL, for ADODB and PearDB.
*/
function installTable(&$dbh, $table, $backend_type) {
global $DBParams;
if (!in_array($DBParams['dbtype'],array('SQL','ADODB'))) return;
echo _("MISSING")," ... \n";
$backend = &$dbh->_backend->_dbh;
/*
$schema = findFile("schemas/${backend_type}.sql");
if (!$schema) {
echo " ",_("FAILED"),": ",sprintf(_("no schema %s found"),"schemas/${backend_type}.sql")," ...
\n";
return false;
}
*/
extract($dbh->_backend->_table_names);
$prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : '';
switch ($table) {
case 'session':
assert($session_tbl);
if ($backend_type == 'mysql') {
$dbh->genericSqlQuery("
CREATE TABLE $session_tbl (
sess_id CHAR(32) NOT NULL DEFAULT '',
sess_data BLOB NOT NULL,
sess_date INT UNSIGNED NOT NULL,
sess_ip CHAR(15) NOT NULL,
PRIMARY KEY (sess_id),
INDEX (sess_date)
)");
} else {
$dbh->genericSqlQuery("
CREATE TABLE $session_tbl (
sess_id CHAR(32) NOT NULL DEFAULT '',
sess_data ".($backend_type == 'pgsql'?'TEXT':'BLOB')." NOT NULL,
sess_date INT,
sess_ip CHAR(15) NOT NULL
)");
$dbh->genericSqlQuery("CREATE UNIQUE INDEX sess_id ON $session_tbl (sess_id)");
}
$dbh->genericSqlQuery("CREATE INDEX sess_date on session (sess_date)");
echo " ",_("CREATED");
break;
case 'user':
$user_tbl = $prefix.'user';
if ($backend_type == 'mysql') {
$dbh->genericSqlQuery("
CREATE TABLE $user_tbl (
userid CHAR(48) BINARY NOT NULL UNIQUE,
passwd CHAR(48) BINARY DEFAULT '',
PRIMARY KEY (userid)
)");
} else {
$dbh->genericSqlQuery("
CREATE TABLE $user_tbl (
userid CHAR(48) NOT NULL,
passwd CHAR(48) DEFAULT ''
)");
$dbh->genericSqlQuery("CREATE UNIQUE INDEX userid ON $user_tbl (userid)");
}
echo " ",_("CREATED");
break;
case 'pref':
$pref_tbl = $prefix.'pref';
if ($backend_type == 'mysql') {
$dbh->genericSqlQuery("
CREATE TABLE $pref_tbl (
userid CHAR(48) BINARY NOT NULL UNIQUE,
prefs TEXT NULL DEFAULT '',
PRIMARY KEY (userid)
)");
} else {
$dbh->genericSqlQuery("
CREATE TABLE $pref_tbl (
userid CHAR(48) NOT NULL,
prefs TEXT NULL DEFAULT '',
)");
$dbh->genericSqlQuery("CREATE UNIQUE INDEX userid ON $pref_tbl (userid)");
}
echo " ",_("CREATED");
break;
case 'member':
$member_tbl = $prefix.'member';
if ($backend_type == 'mysql') {
$dbh->genericSqlQuery("
CREATE TABLE $member_tbl (
userid CHAR(48) BINARY NOT NULL,
groupname CHAR(48) BINARY NOT NULL DEFAULT 'users',
INDEX (userid),
INDEX (groupname)
)");
} else {
$dbh->genericSqlQuery("
CREATE TABLE $member_tbl (
userid CHAR(48) NOT NULL,
groupname CHAR(48) NOT NULL DEFAULT 'users',
)");
$dbh->genericSqlQuery("CREATE INDEX userid ON $member_tbl (userid)");
$dbh->genericSqlQuery("CREATE INDEX groupname ON $member_tbl (groupname)");
}
echo " ",_("CREATED");
break;
case 'rating':
$rating_tbl = $prefix.'rating';
if ($backend_type == 'mysql') {
$dbh->genericSqlQuery("
CREATE TABLE $rating_tbl (
dimension INT(4) NOT NULL,
raterpage INT(11) NOT NULL,
rateepage INT(11) NOT NULL,
ratingvalue FLOAT NOT NULL,
rateeversion INT(11) NOT NULL,
tstamp TIMESTAMP(14) NOT NULL,
PRIMARY KEY (dimension, raterpage, rateepage)
)");
} else {
$dbh->genericSqlQuery("
CREATE TABLE $rating_tbl (
dimension INT(4) NOT NULL,
raterpage INT(11) NOT NULL,
rateepage INT(11) NOT NULL,
ratingvalue FLOAT NOT NULL,
rateeversion INT(11) NOT NULL,
tstamp TIMESTAMP(14) NOT NULL,
)");
$dbh->genericSqlQuery("CREATE UNIQUE INDEX rating ON $rating_tbl (dimension, raterpage, rateepage)");
}
echo " ",_("CREATED");
break;
case 'accesslog':
$log_tbl = $prefix.'accesslog';
// fields according to http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/#id2756178
/*
A User Agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
a CGi request arguments request_args varchar(255) user=Smith&cart=1231&item=532
b Bytes transfered bytes_sent int unsigned 32561
c??? Text of cookie cookie varchar(255) Apache=sdyn.fooonline.net 1300102700823
f Local filename requested request_file varchar(255) /var/www/html/books-cycroad.html
H HTTP request_protocol request_protocol varchar(10) HTTP/1.1
h Name of remote host remote_host varchar(50) blah.foobar.com
I Request ID (from modd_unique_id) id char(19) POlFcUBRH30AAALdBG8
l Ident user info remote_logname varcgar(50) bobby
M Machine ID??? machine_id varchar(25) web01
m HTTP request method request_method varchar(10) GET
P httpd cchild PID child_pid smallint unsigned 3215
p http port server_port smallint unsigned 80
R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
S Time of request in UNIX time_t format time_stamp int unsigned 1005598029
T Seconds to service request request_duration smallint unsigned 2
t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
U Request in simple form request_uri varchar(255) /books-cycroad.html
u User info from HTTP auth remote_user varchar(50) bobby
v Virtual host servicing the request virtual_host varchar(255)
*/
$dbh->genericSqlQuery("
CREATE TABLE $log_tbl (
time_stamp int unsigned,
remote_host varchar(50),
remote_user varchar(50),
request_method varchar(10),
request_line varchar(255),
request_args varchar(255),
request_uri varchar(255),
request_time char(28),
status smallint unsigned,
bytes_sent smallint unsigned,
referer varchar(255),
agent varchar(255),
request_duration float
)");
$dbh->genericSqlQuery("CREATE INDEX log_time ON $log_tbl (time_stamp)");
$dbh->genericSqlQuery("CREATE INDEX log_host ON $log_tbl (remote_host)");
echo " ",_("CREATED");
break;
}
echo "
\n";
}
/**
* update from ~1.3.4 to current.
* only session, user, pref and member
* jeffs-hacks database api (around 1.3.2) later:
* people should export/import their pages if using that old versions.
*/
function CheckDatabaseUpdate(&$request) {
global $DBParams, $DBAuthParams;
if (!in_array($DBParams['dbtype'], array('SQL','ADODB'))) return;
echo "",_("check for necessary database updates"),"
\n";
_upgrade_db_init($dbh);
$tables = $dbh->_backend->listOfTables();
$backend_type = $dbh->_backend->backendType();
$prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : '';
foreach (explode(':','session:user:pref:member') as $table) {
echo sprintf(_("check for table %s"), $table)," ...";
if (!in_array($prefix.$table, $tables)) {
installTable($dbh, $table, $backend_type);
} else {
echo _("OK"),"
\n";
}
}
if (ACCESS_LOG_SQL) {
$table = "accesslog";
echo sprintf(_("check for table %s"), $table)," ...";
if (!in_array($prefix.$table, $tables)) {
installTable($dbh, $table, $backend_type);
} else {
echo _("OK"),"
\n";
}
}
$backend = &$dbh->_backend->_dbh;
// 1.3.8 added session.sess_ip
if (phpwiki_version() >= 1030.08 and USE_DB_SESSION and isset($request->_dbsession)) {
echo _("check for new session.sess_ip column")," ... ";
$database = $dbh->_backend->database();
assert(!empty($DBParams['db_session_table']));
$session_tbl = $prefix . $DBParams['db_session_table'];
$sess_fields = $dbh->_backend->listOfFields($database, $session_tbl);
if (!strstr(strtolower(join(':', $sess_fields)),"sess_ip")) {
// TODO: postgres test (should be able to add columns at the end, but not in between)
echo "",_("ADDING"),""," ... ";
$dbh->genericSqlQuery("ALTER TABLE $session_tbl ADD sess_ip CHAR(15) NOT NULL");
$dbh->genericSqlQuery("CREATE INDEX sess_date ON $session_tbl (sess_date)");
} else {
echo _("OK");
}
echo "
\n";
}
// 1.3.10 mysql requires page.id auto_increment
// mysql, mysqli or mysqlt
if (phpwiki_version() >= 1030.099 and substr($backend_type,0,5) == 'mysql') {
echo _("check for page.id auto_increment flag")," ...";
extract($dbh->_backend->_table_names);
assert(!empty($page_tbl));
$database = $dbh->_backend->database();
$fields = mysql_list_fields($database, $page_tbl, $dbh->_backend->connection());
$columns = mysql_num_fields($fields);
for ($i = 0; $i < $columns; $i++) {
if (mysql_field_name($fields, $i) == 'id') {
$flags = mysql_field_flags($fields, $i);
//DONE: something was wrong with ADODB here.
if (!strstr(strtolower($flags), "auto_increment")) {
echo "",_("ADDING"),""," ... ";
// MODIFY col_def valid since mysql 3.22.16,
// older mysql's need CHANGE old_col col_def
$dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE id id INT NOT NULL AUTO_INCREMENT");
$fields = mysql_list_fields($database, $page_tbl);
if (!strstr(strtolower(mysql_field_flags($fields, $i)), "auto_increment"))
echo " ", _("FAILED"), "
\n";
else
echo _("OK"), "
\n";
} else {
echo _("OK"), "
\n";
}
break;
}
}
mysql_free_result($fields);
}
// check for mysql 4.1.x/5.0.0a binary search problem.
// http://bugs.mysql.com/bug.php?id=4398
// "select * from page where LOWER(pagename) like '%search%'" does not apply LOWER!
// confirmed for 4.1.0alpha,4.1.3-beta,5.0.0a; not yet tested for 4.1.2alpha,
// TODO: there's another known workaround, not yet applied. On windows only.
if (isWindows() and substr($backend_type,0,5) == 'mysql') {
echo _("check for mysql 4.1.x/5.0.0 binary search on windows problem")," ...";
$result = mysql_query("SELECT VERSION()", $dbh->_backend->connection());
$row = mysql_fetch_row($result);
$mysql_version = $row[0];
$arr = explode('.', $mysql_version);
$version = (string)(($arr[0] * 100) + $arr[1]) . "." . (integer)$arr[2];
if ($version >= 401.0) {
$dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename pagename VARCHAR(100) NOT NULL");
echo sprintf(_("version %s FIXED"), $mysql_version),"
\n";
} else {
echo sprintf(_("version %s not affected"), $mysql_version),"
\n";
}
}
_upgrade_cached_html($dbh);
return;
}
function _upgrade_db_init (&$dbh) {
global $DBParams, $DBAuthParams;
if (!in_array($DBParams['dbtype'], array('SQL','ADODB'))) return;
if (defined('DBADMIN_USER') and DBADMIN_USER) {
// if need to connect as the root user, for alter permissions
$AdminParams = $DBParams;
if ($DBParams['dbtype'] == 'SQL')
$dsn = DB::parseDSN($AdminParams['dsn']);
else
$dsn = parseDSN($AdminParams['dsn']);
$AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s",
$dsn['phptype'],
DBADMIN_USER,
DBADMIN_PASSWD,
$dsn['hostspec'],
$dsn['database']);
$dbh = WikiDB::open($AdminParams);
} else {
$dbh = &$request->_dbi;
}
}
/**
* if page.cached_html does not exists:
* put _cached_html from pagedata into a new seperate blob, not huge serialized string.
*
* it is only rarelely needed: for current page only, if-not-modified
* but was extracetd for every simple page iteration.
*/
function _upgrade_cached_html (&$dbh) {
global $DBParams;
if (!in_array($DBParams['dbtype'], array('SQL','ADODB'))) return;
if (phpwiki_version() >= 1030.10) {
echo _("check for extra page.cached_html column")," ... ";
$database = $dbh->_backend->database();
extract($dbh->_backend->_table_names);
$fields = $dbh->_backend->listOfFields($database, $page_tbl);
if (!strstr(strtolower(join(':', $fields)), "cached_html")) {
echo "",_("ADDING"),""," ... ";
if (substr($backend_type,0,5) == 'mysql')
$dbh->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html MEDIUMBLOB");
else
$dbh->genericSqlQuery("ALTER TABLE $page_tbl ADD cached_html BLOB");
echo "",_("CONVERTING"),""," ... ";
_convert_cached_html($dbh);
echo _("OK"), "
\n";
} else {
echo _("OK"), "
\n";
}
}
}
/**
* move _cached_html for all pages from pagedata into a new seperate blob.
* decoupled from action=upgrade, so that it can be used by a WikiAdminUtils button also.
*/
function _convert_cached_html (&$dbh) {
global $DBParams;
if (!in_array($DBParams['dbtype'], array('SQL','ADODB'))) return;
$pages = $dbh->getAllPages();
$cache =& $dbh->_cache;
while ($page = $pages->next()) {
$pagename = $page->getName();
$data = $dbh->_backend->get_pagedata($pagename);
if (!empty($data['_cached_html'])) {
$cached_html = $data['_cached_html'];
$data['_cached_html'] = '';
$cache->update_pagedata($pagename, $data);
// store as blob, not serialized
$dbh->genericSqlQuery("UPDATE $page_tbl SET cached_html=? WHERE pagename=?",
array($cached_html, $pagename));
}
}
}
function fixConfigIni($match, $new) {
$file = FindFile("config/config.ini");
$found = false;
if (is_writable($file)) {
$in = fopen($file,"rb");
$out = fopen($tmp = tempnam(FindFile("uploads"),"cfg"),"wb");
if (isWindows())
$tmp = str_replace("/","\\",$tmp);
while ($s = fgets($in)) {
if (preg_match($match, $s)) {
$s = $new . (isWindows() ? "\r\n" : "\n");
$found = true;
}
fputs($out, $s);
}
fclose($in);
fclose($out);
if (!$found) {
echo " ",_("FAILED"),": ",
sprintf(_("%s not found"), $match);
unlink($out);
} else {
@unlink("$file.bak");
@rename($file,"$file.bak");
if (rename($tmp, $file))
echo " ",_("FIXED"),"";
else {
echo " ",_("FAILED"),": ";
sprintf(_("couldn't move %s to %s"), $tmp, $file);
return false;
}
}
return $found;
} else {
echo " ",_("FAILED"),": ",
sprintf(_("%s is not writable"), $file);
return false;
}
}
function CheckConfigUpdate(&$request) {
echo "",_("check for necessary config updates"),"
\n";
echo _("check for old CACHE_CONTROL = NONE")," ... ";
if (defined('CACHE_CONTROL') and CACHE_CONTROL == '') {
echo "
",_("CACHE_CONTROL is set to 'NONE', and must be changed to 'NO_CACHE'")," ...";
fixConfigIni("/^\s*CACHE_CONTROL\s*=\s*NONE/","CACHE_CONTROL = NO_CACHE");
} else {
echo _("OK");
}
echo "
\n";
echo _("check for GROUP_METHOD = NONE")," ... ";
if (defined('GROUP_METHOD') and GROUP_METHOD == '') {
echo "
",_("GROUP_METHOD is set to NONE, and must be changed to \"NONE\"")," ...";
fixConfigIni("/^\s*GROUP_METHOD\s*=\s*NONE/","GROUP_METHOD = \"NONE\"");
} else {
echo _("OK");
}
echo "
\n";
}
/**
* TODO:
*
* Upgrade: Base class for multipage worksteps
* identify, validate, display options, next step
*/
class Upgrade {
}
class Upgrade_CheckPgsrc extends Upgrade {
}
class Upgrade_CheckDatabaseUpdate extends Upgrade {
}
// TODO: At which step are we?
// validate and do it again or go on with next step.
/** entry function from lib/main.php
*/
function DoUpgrade($request) {
if (!$request->_user->isAdmin()) {
$request->_notAuthorized(WIKIAUTH_ADMIN);
$request->finish(
HTML::div(array('class' => 'disabled-plugin'),
fmt("Upgrade disabled: user != isAdmin")));
return;
}
StartLoadDump($request, _("Upgrading this PhpWiki"));
//CheckOldIndexUpdate($request); // to upgrade from < 1.3.10
CheckActionPageUpdate($request);
CheckDatabaseUpdate($request);
CheckPgsrcUpdate($request);
//CheckThemeUpdate($request);
CheckConfigUpdate($request);
EndLoadDump($request);
}
/**
$Log: not supported by cvs2svn $
Revision 1.31 2004/12/10 02:45:26 rurban
SQL optimization:
put _cached_html from pagedata into a new seperate blob, not huge serialized string.
it is only rarelely needed: for current page only, if-not-modified
but was extracted for every simple page iteration.
Revision 1.30 2004/11/29 17:58:57 rurban
just aesthetics
Revision 1.29 2004/11/29 16:08:31 rurban
added missing nl
Revision 1.28 2004/11/16 16:25:14 rurban
fix accesslog tablename, print CREATED only if really done
Revision 1.27 2004/11/07 16:02:52 rurban
new sql access log (for spam prevention), and restructured access log class
dbh->quote (generic)
pear_db: mysql specific parts seperated (using replace)
Revision 1.26 2004/10/14 19:19:34 rurban
loadsave: check if the dumped file will be accessible from outside.
and some other minor fixes. (cvsclient native not yet ready)
Revision 1.25 2004/09/06 08:28:00 rurban
rename genericQuery to genericSqlQuery
Revision 1.24 2004/07/05 13:56:22 rurban
sqlite autoincrement fix
Revision 1.23 2004/07/04 10:28:06 rurban
DBADMIN_USER fix
Revision 1.22 2004/07/03 17:21:28 rurban
updated docs: submitted new mysql bugreport (#1491 did not fix it)
Revision 1.21 2004/07/03 16:51:05 rurban
optional DBADMIN_USER:DBADMIN_PASSWD for action=upgrade (if no ALTER permission)
added atomic mysql REPLACE for PearDB as in ADODB
fixed _lock_tables typo links => link
fixes unserialize ADODB bug in line 180
Revision 1.20 2004/07/03 14:48:18 rurban
Tested new mysql 4.1.3-beta: binary search bug as fixed.
=> fixed action=upgrade,
=> version check in PearDB also (as in ADODB)
Revision 1.19 2004/06/19 12:19:09 rurban
slightly improved docs
Revision 1.18 2004/06/19 11:47:17 rurban
added CheckConfigUpdate: CACHE_CONTROL = NONE => NO_CACHE
Revision 1.17 2004/06/17 11:31:50 rurban
check necessary localized actionpages
Revision 1.16 2004/06/16 10:38:58 rurban
Disallow refernces in calls if the declaration is a reference
("allow_call_time_pass_reference clean").
PhpWiki is now allow_call_time_pass_reference = Off clean,
but several external libraries may not.
In detail these libs look to be affected (not tested):
* Pear_DB odbc
* adodb oracle
Revision 1.15 2004/06/07 19:50:40 rurban
add owner field to mimified dump
Revision 1.14 2004/06/07 18:38:18 rurban
added mysql 4.1.x search fix
Revision 1.13 2004/06/04 20:32:53 rurban
Several locale related improvements suggested by Pierrick Meignen
LDAP fix by John Cole
reanable admin check without ENABLE_PAGEPERM in the admin plugins
Revision 1.12 2004/05/18 13:59:15 rurban
rename simpleQuery to genericSqlQuery
Revision 1.11 2004/05/15 13:06:17 rurban
skip the HomePage, at first upgrade the ActionPages, then the database, then the rest
Revision 1.10 2004/05/15 01:19:41 rurban
upgrade prefix fix by Kai Krakow
Revision 1.9 2004/05/14 11:33:03 rurban
version updated to 1.3.11pre
upgrade stability fix
Revision 1.8 2004/05/12 10:49:55 rurban
require_once fix for those libs which are loaded before FileFinder and
its automatic include_path fix, and where require_once doesn't grok
dirname(__FILE__) != './lib'
upgrade fix with PearDB
navbar.tmpl: remove spaces for IE button alignment
Revision 1.7 2004/05/06 17:30:38 rurban
CategoryGroup: oops, dos2unix eol
improved phpwiki_version:
pre -= .0001 (1.3.10pre: 1030.099)
-p1 += .001 (1.3.9-p1: 1030.091)
improved InstallTable for mysql and generic SQL versions and all newer tables so far.
abstracted more ADODB/PearDB methods for action=upgrade stuff:
backend->backendType(), backend->database(),
backend->listOfFields(),
backend->listOfTables(),
Revision 1.6 2004/05/03 15:05:36 rurban
+ table messages
Revision 1.4 2004/05/02 21:26:38 rurban
limit user session data (HomePageHandle and auth_dbi have to invalidated anyway)
because they will not survive db sessions, if too large.
extended action=upgrade
some WikiTranslation button work
revert WIKIAUTH_UNOBTAINABLE (need it for main.php)
some temp. session debug statements
Revision 1.3 2004/04/29 22:33:30 rurban
fixed sf.net bug #943366 (Kai Krakow)
couldn't load localized url-undecoded pagenames
Revision 1.2 2004/03/12 15:48:07 rurban
fixed explodePageList: wrong sortby argument order in UnfoldSubpages
simplified lib/stdlib.php:explodePageList
*/
// For emacs users
// Local Variables:
// mode: php
// tab-width: 8
// c-basic-offset: 4
// c-hanging-comment-ender-p: nil
// indent-tabs-mode: nil
// End:
?>