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",
"InterWikiMap" => "InterWikiMap",
);
$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 (!$dbh->_backend->isSQL()) 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 $DBAuthParams;
$dbh = $request->getDbh();
if (!$dbh->_backend->isSQL()) return;
echo "",_("check for necessary database updates"), " - ", DATABASE_TYPE, "
\n";
$dbadmin = $request->getArg('dbadmin');
_upgrade_db_init($dbh);
if (isset($dbadmin['cancel'])) {
echo _("CANCEL"),"
\n";
return;
}
$tables = $dbh->_backend->listOfTables();
$backend_type = $dbh->_backend->backendType();
echo "",_("Backend type: "),$backend_type,"
\n";
$prefix = isset($DBParams['prefix']) ? $DBParams['prefix'] : '';
foreach (explode(':','session: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";
}
}
if ((class_exists("RatingsUserFactory") or $dbh->isWikiPage(_("RateIt")))) {
$table = "rating";
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;
extract($dbh->_backend->_table_names);
// 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 (!$sess_fields) {
echo _("SKIP");
} elseif (!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";
if (substr($backend_type,0,5) == 'mysql') {
// upgrade to 4.1.8 destroyed my session table:
// sess_id => varchar(10), sess_data => varchar(5). For others obviously also.
echo _("check for mysql session.sess_id sanity")," ... ";
$result = $dbh->genericSqlQuery("DESCRIBE $session_tbl");
if (DATABASE_TYPE == 'SQL') {
$iter = new WikiDB_backend_PearDB_generic_iter($backend, $result);
} elseif (DATABASE_TYPE == 'ADODB') {
$iter = new WikiDB_backend_ADODB_generic_iter($backend, $result,
array("Field", "Type", "Null", "Key", "Default", "Extra"));
} elseif (DATABASE_TYPE == 'PDO') {
$iter = new WikiDB_backend_PDO_generic_iter($backend, $result);
}
while ($col = $iter->next()) {
if ($col["Field"] == 'sess_id' and !strstr(strtolower($col["Type"]), 'char(32)')) {
$dbh->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_id"
." sess_id CHAR(32) NOT NULL");
echo "sess_id ", $col["Type"], " ", _("fixed"), " => CHAR(32) ";
}
if ($col["Field"] == 'sess_ip' and !strstr(strtolower($col["Type"]), 'char(15)')) {
$dbh->genericSqlQuery("ALTER TABLE $session_tbl CHANGE sess_ip"
." sess_ip CHAR(15) NOT NULL");
echo "sess_ip ", $col["Type"], " ", _("fixed"), " => CHAR(15) ";
}
}
echo _("OK"), "
\n";
}
}
/* TODO:
ALTER TABLE link ADD relation INT DEFAULT 0;
CREATE INDEX linkrelation ON link (relation);
*/
// mysql >= 4.0.4 requires LOCK TABLE privileges
if (0 and substr($backend_type,0,5) == 'mysql') {
echo _("check for mysql LOCK TABLE privilege")," ...";
$mysql_version = $dbh->_backend->_serverinfo['version'];
if ($mysql_version > 400.40) {
if (!empty($dbh->_backend->_parsedDSN))
$parseDSN = $dbh->_backend->_parsedDSN;
elseif (function_exists('parseDSN')) // ADODB or PDO
$parseDSN = parseDSN($DBParams['dsn']);
else // pear
$parseDSN = DB::parseDSN($DBParams['dsn']);
$username = $dbh->_backend->qstr($parseDSN['username']);
// on db level
$query = "SELECT lock_tables_priv FROM mysql.db WHERE user='$username'";
//mysql_select_db("mysql", $dbh->_backend->connection());
$db_fields = $dbh->_backend->listOfFields("mysql", "db");
if (!strstr(strtolower(join(':', $db_fields)), "lock_tables_priv")) {
echo join(':', $db_fields);
die("lock_tables_priv missing. The DB Admin must run mysql_fix_privilege_tables");
}
$row = $dbh->_backend->getRow($query);
if (isset($row[0]) and $row[0] == 'N') {
$dbh->genericSqlQuery("UPDATE mysql.db SET lock_tables_priv='Y'"
." WHERE mysql.user='$username'");
$dbh->genericSqlQuery("FLUSH PRIVILEGES");
echo "mysql.db user='$username'", _("fixed"), "
\n";
} elseif (!$row) {
// or on user level
$query = "SELECT lock_tables_priv FROM mysql.user WHERE user='$username'";
$row = $dbh->_backend->getRow($query);
if ($row and $row[0] == 'N') {
$dbh->genericSqlQuery("UPDATE mysql.user SET lock_tables_priv='Y'"
." WHERE mysql.user='$username'");
$dbh->genericSqlQuery("FLUSH PRIVILEGES");
echo "mysql.user user='$username'", _("fixed"), "
\n";
} elseif (!$row) {
echo " ", _("FAILED"), ": ",
"Neither mysql.db nor mysql.user has a user='$username'"
." or the lock_tables_priv field",
"
\n";
} else {
echo _("OK"), "
\n";
}
} else {
echo _("OK"), "
\n";
}
//mysql_select_db($dbh->_backend->database(), $dbh->_backend->connection());
} else {
echo sprintf(_("version %s not affected"), $mysql_version),"
\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'
and DATABASE_TYPE != 'PDO') {
echo _("check for mysql page.id auto_increment flag")," ...";
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,
// On windows only, though utf8 would be useful elsewhere also.
// Illegal mix of collations (latin1_bin,IMPLICIT) and
// (utf8_general_ci, COERCIBLE) for operation '='])
if (isWindows() and substr($backend_type,0,5) == 'mysql') {
echo _("check for mysql 4.1.x/5.0.0 binary search on windows problem")," ...";
$mysql_version = $dbh->_backend->_serverinfo['version'];
if ($mysql_version < 401.0) {
echo sprintf(_("version %s"), $mysql_version)," ",
_("not affected"),"
\n";
} elseif ($mysql_version >= 401.6) { // FIXME: since which version?
$row = $dbh->_backend->getRow("SHOW CREATE TABLE $page_tbl");
$result = join(" ", $row);
if (strstr(strtolower($result), "character set")
and strstr(strtolower($result), "collate"))
{
echo _("OK"), "
\n";
} else {
//SET CHARACTER SET latin1
$charset = CHARSET;
if ($charset == 'iso-8859-1') $charset = 'latin1';
$dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename "
."pagename VARCHAR(100) "
."CHARACTER SET '$charset' COLLATE '$charset"."_bin' NOT NULL");
echo sprintf(_("version %s"), $mysql_version),
" ",_("FIXED"),"",
"
\n";
}
} elseif (DATABASE_TYPE != 'PDO') {
// check if already fixed
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) == 'pagename') {
$flags = mysql_field_flags($fields, $i);
// I think it was fixed with 4.1.6, but I tested it only with 4.1.8
if ($mysql_version > 401.0 and $mysql_version < 401.6) {
// remove the binary flag
if (strstr(strtolower($flags), "binary")) {
// FIXME: on duplicate pagenames this will fail!
$dbh->genericSqlQuery("ALTER TABLE $page_tbl CHANGE pagename"
." pagename VARCHAR(100) NOT NULL");
echo sprintf(_("version %s"), $mysql_version),
"",_("FIXED"),""
,"
\n";
}
}
break;
}
}
}
}
if ((ACCESS_LOG_SQL & 2)) {
echo _("check for ACCESS_LOG_SQL passwords in POST requests")," ...";
// Don't display passwords in POST requests (up to 2005-02-04 12:03:20)
$result = $dbh->genericSqlQuery(
"UPDATE ".$prefix."accesslog"
.' SET request_args=CONCAT(left(request_args, LOCATE("s:6:\"passwd\"",request_args)+12),"...")'
.' WHERE LOCATE("s:6:\"passwd\"", request_args)'
.' AND NOT(LOCATE("s:6:\"passwd\";s:15:\"\"", request_args))'
.' AND request_method="POST"');
if ((DATABASE_TYPE == 'SQL' and $backend->AffectedRows())
or (DATABASE_TYPE == 'ADODB' and $backend->Affected_Rows())
or (DATABASE_TYPE == 'PDO' and $result))
echo "",_("FIXED"),"", "
\n";
else
echo _("OK"),"
\n";
}
_upgrade_cached_html($dbh);
return;
}
function _upgrade_db_init (&$dbh) {
global $request, $DBParams, $DBAuthParams;
if (!$dbh->_backend->isSQL()) return;
if (DBADMIN_USER) {
// if need to connect as the root user, for CREATE and ALTER privileges
$AdminParams = $DBParams;
if (DATABASE_TYPE == 'SQL')
$dsn = DB::parseDSN($AdminParams['dsn']);
else // ADODB or PDO
$dsn = parseDSN($AdminParams['dsn']);
$AdminParams['dsn'] = sprintf("%s://%s:%s@%s/%s",
$dsn['phptype'],
DBADMIN_USER,
DBADMIN_PASSWD,
$dsn['hostspec'],
$dsn['database']);
if (DEBUG & _DEBUG_SQL and DATABASE_TYPE == 'PDO') {
echo "
\nDBParams['dsn']: '", $DBParams['dsn'], "'";
echo "
\ndsn: '", print_r($dsn), "'";
echo "
\nAdminParams['dsn']: '", $AdminParams['dsn'], "'";
}
$dbh = WikiDB::open($AdminParams);
} elseif ($dbadmin = $request->getArg('dbadmin')) {
if (empty($dbadmin['user']) or isset($dbadmin['cancel']))
$dbh = &$request->_dbi;
else {
$AdminParams = $DBParams;
if (DATABASE_TYPE == '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 {
// Check if the privileges are enough. Need CREATE and ALTER perms.
// And on windows: SELECT FROM mysql, possibly: UPDATE mysql.
$form = HTML::form(array("method" => "post",
"action" => $request->getPostURL(),
"accept-charset"=>$GLOBALS['charset']),
HTML::p(_("Upgrade requires database privileges to CREATE and ALTER the phpwiki database."),
HTML::br(),
_("And on windows at least the privilege to SELECT FROM mysql, and possibly UPDATE mysql")),
HiddenInputs(array('action' => 'upgrade')),
HTML::table(array("cellspacing"=>4),
HTML::tr(HTML::td(array('align'=>'right'),
_("DB admin user:")),
HTML::td(HTML::input(array('name'=>"dbadmin[user]",
'size'=>12,
'maxlength'=>256,
'value'=>'root')))),
HTML::tr(HTML::td(array('align'=>'right'),
_("DB admin password:")),
HTML::td(HTML::input(array('name'=>"dbadmin[passwd]",
'type'=>'password',
'size'=>12,
'maxlength'=>256)))),
HTML::tr(HTML::td(array('align'=>'center', 'colspan' => 2),
Button("submit:", _("Submit"), 'wikiaction'),
HTML::raw(' '),
Button("submit:dbadmin[cancel]", _("Cancel"),
'button')))));
$form->printXml();
echo "\n";
echo asXML(Template("bottom"));
echo "