From: Tim Starling Date: Tue, 17 Jan 2006 11:48:18 +0000 (+0000) Subject: Moved the bulk of dbsource() to Database.php. Added support for updating wikis with... X-Git-Tag: 1.6.0~500 X-Git-Url: http://git.cyclocoop.org/%28?a=commitdiff_plain;h=cf4f3da185dcbf096b4ea536abdf8414791ca99e;p=lhc%2Fweb%2Fwiklou.git Moved the bulk of dbsource() to Database.php. Added support for updating wikis with $wgSharedDB set (installing is still not supported) --- diff --git a/includes/Database.php b/includes/Database.php index 0a4b827ac5..0f6c212d97 100644 --- a/includes/Database.php +++ b/includes/Database.php @@ -1653,6 +1653,87 @@ class Database { function encodeBlob($b) { return $b; } + + /** + * Read and execute SQL commands from a file. + * Returns true on success, error string on failure + */ + function sourceFile( $filename ) { + $fp = fopen( $filename, 'r' ); + if ( false === $fp ) { + return "Could not open \"{$fname}\".\n"; + } + + $cmd = ""; + $done = false; + + while ( ! feof( $fp ) ) { + $line = trim( fgets( $fp, 1024 ) ); + $sl = strlen( $line ) - 1; + + if ( $sl < 0 ) { continue; } + if ( '-' == $line{0} && '-' == $line{1} ) { continue; } + + if ( ';' == $line{$sl} && ($sl < 2 || ';' != $line{$sl - 1})) { + $done = true; + $line = substr( $line, 0, $sl ); + } + + if ( '' != $cmd ) { $cmd .= ' '; } + $cmd .= "$line\n"; + + if ( $done ) { + $cmd = str_replace(';;', ";", $cmd); + $cmd = $this->replaceVars( $cmd ); + $res = $this->query( $cmd, 'dbsource', true ); + + if ( false === $res ) { + $err = $this->mLastError(); + return "Query \"{$cmd}\" failed with error code \"$err\".\n"; + } + + $cmd = ''; + $done = false; + } + } + fclose( $fp ); + return true; + } + + /** + * Replace variables in sourced SQL + */ + function replaceVars( $ins ) { + $varnames = array( + 'wgDBserver', 'wgDBname', 'wgDBintlname', 'wgDBuser', + 'wgDBpassword', 'wgDBsqluser', 'wgDBsqlpassword', + 'wgDBadminuser', 'wgDBadminpassword', + ); + + // Ordinary variables + foreach ( $varnames as $var ) { + if( isset( $GLOBALS[$var] ) ) { + $val = addslashes( $GLOBALS[$var] ); + $ins = str_replace( '{$' . $var . '}', $val, $ins ); + $ins = str_replace( '/*$' . $var . '*/`', '`' . $val, $ins ); + $ins = str_replace( '/*$' . $var . '*/', $val, $ins ); + } + } + + // Table prefixes + $ins = preg_replace_callback( '/\/\*(?:\$wgDBprefix|_)\*\/([a-z_]*)/', + array( &$this, 'tableNameCallback' ), $ins ); + return $ins; + } + + /** + * Table name callback + * @access private + */ + function tableNameCallback( $matches ) { + return $this->tableName( $matches[1] ); + } + } /** @@ -1716,8 +1797,10 @@ class ResultWrapper { function seek( $row ) { $this->db->dataSeek( $this->result, $row ); } + } + #------------------------------------------------------------------------------ # Global functions #------------------------------------------------------------------------------ diff --git a/install-utils.inc b/install-utils.inc index cacb8e590c..33109a68c7 100644 --- a/install-utils.inc +++ b/install-utils.inc @@ -87,71 +87,25 @@ function readconsole( $prompt = '' ) { } } -function replacevars( $ins ) { - $varnames = array( - 'wgDBserver', 'wgDBname', 'wgDBintlname', 'wgDBuser', - 'wgDBpassword', 'wgDBsqluser', 'wgDBsqlpassword', - 'wgDBadminuser', 'wgDBadminpassword', 'wgDBprefix' - ); - - foreach ( $varnames as $var ) { - if( isset( $GLOBALS[$var] ) ) { - $val = addslashes( $GLOBALS[$var] ); - $ins = str_replace( '{$' . $var . '}', $val, $ins ); - $ins = str_replace( '/*$' . $var . '*/`', '`' . $val, $ins ); - $ins = str_replace( '/*$' . $var . '*/', $val, $ins ); - } - } - return $ins; -} - # # Read and execute SQL commands from a file # -function dbsource( $fname, $database = false ) { - $fp = fopen( $fname, 'r' ); - if ( false === $fp ) { - print "Could not open \"{$fname}\".\n"; - exit(); - } - - $cmd = ""; - $done = false; - - while ( ! feof( $fp ) ) { - $line = trim( fgets( $fp, 1024 ) ); - $sl = strlen( $line ) - 1; - - if ( $sl < 0 ) { continue; } - if ( '-' == $line{0} && '-' == $line{1} ) { continue; } - - if ( ';' == $line{$sl} && ($sl < 2 || ';' != $line{$sl - 1})) { - $done = true; - $line = substr( $line, 0, $sl ); - } - - if ( '' != $cmd ) { $cmd .= ' '; } - $cmd .= "$line\n"; - - if ( $done ) { - $cmd = str_replace(';;', ";", $cmd); - $cmd = replacevars( $cmd ); - if( $database ) - $res = $database->query( $cmd, 'dbsource', true ); - else - $res = mysql_query( $cmd ); - - if ( false === $res ) { - $err = mysql_error(); - print "Query \"{$cmd}\" failed with error code \"$err\".\n"; - exit(); - } - - $cmd = ''; - $done = false; +function dbsource( $fname, $db = false ) { + if ( !$db ) { + // Try $wgDatabase, which is used in the install and update scripts + global $wgDatabase; + if ( isset( $wgDatabase ) ) { + $db =& $wgDatabase; + } else { + // No? Well, we must be outside of those scripts, so use the standard method + $db =& wfGetDB( DB_MASTER ); } } - fclose( $fp ); + $error = $db->sourceFile( $fname ); + if ( $error !== true ) { + print $error; + exit(1); + } } # Obsolete, use Database::fieldExists() diff --git a/maintenance/update.php b/maintenance/update.php index af0e6ca902..5c0d5746d2 100644 --- a/maintenance/update.php +++ b/maintenance/update.php @@ -32,7 +32,13 @@ if( !isset( $options['quick'] ) ) { echo "\n"; } -do_all_updates(); +if ( isset( $options['doshared'] ) ) { + $doShared = true; +} else { + $doShared = false; +} + +do_all_updates( $doShared ); print "Done.\n"; diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc index bb681d6d97..aeec62f4e0 100644 --- a/maintenance/updaters.inc +++ b/maintenance/updaters.inc @@ -738,8 +738,10 @@ function do_templatelinks_update() { echo "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n"; } -function do_all_updates() { - global $wgNewTables, $wgNewFields, $wgRenamedTables; +function do_all_updates( $doShared = false ) { + global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase; + + $doUser = !$wgSharedDB || $doShared; # Rename tables foreach ( $wgRenamedTables as $tableRecord ) { @@ -754,7 +756,9 @@ function do_all_updates() { # Add missing fields foreach ( $wgNewFields as $fieldRecord ) { - add_field( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2] ); + if ( $fieldRecord[0] != 'user' || $doUser ) { + add_field( $fieldRecord[0], $fieldRecord[1], $fieldRecord[2] ); + } flush(); } @@ -764,7 +768,9 @@ function do_all_updates() { do_old_links_update(); flush(); do_image_name_unique_update(); flush(); do_watchlist_update(); flush(); - do_user_update(); flush(); + if ( $doUser ) { + do_user_update(); flush(); + } ###### do_copy_newtalk_to_watchlist(); flush(); do_logging_encoding(); flush(); @@ -778,7 +784,9 @@ function do_all_updates() { do_drop_img_type(); flush(); - do_user_unique_update(); flush(); + if ( $doUser ) { + do_user_unique_update(); flush(); + } do_user_groups_update(); flush(); do_watchlist_null(); flush();