X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fdb%2FDatabase.php;h=7248bb99856908c969b1c391f2a182b70baa31da;hb=692ad26f682ae09805c0aafdbb86faafab555c72;hp=bffde85db1b6b87888b8cfd4d97628f384dc854f;hpb=22ab89938f35eab6ab723c6efc120fb8e6f521ea;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/db/Database.php b/includes/db/Database.php index bffde85db1..7248bb9985 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -1576,12 +1576,14 @@ abstract class DatabaseBase implements DatabaseType { } /** - * Get an aliased table name. + * Get an aliased table name + * e.g. tableName AS newTableName + * * @param $name string Table name, see tableName() * @param $alias string Alias (optional) * @return string SQL name for aliased table. Will not alias a table to its own name */ - public function tableNameWithAlias( $name, $alias ) { + public function tableNameWithAlias( $name, $alias = false ) { if ( !$alias || $alias == $name ) { return $this->tableName( $name ); } else { @@ -1590,6 +1592,8 @@ abstract class DatabaseBase implements DatabaseType { } /** + * Gets an array of aliased table names + * * @param $tables array( [alias] => table ) * @return array of strings, see tableNameWithAlias() */ @@ -1690,6 +1694,26 @@ abstract class DatabaseBase implements DatabaseType { } } + /** + * Quotes a string using `backticks` for things like database, table, and field + * names, other databases which use something other than backticks can replace + * this with something else + */ + public function addIdentifierQuotes( $s ) { + return "`" . $this->strencode( $s ) . "`"; + } + + /** + * Backwards compatibility, identifier quoting originated in DatabasePostgres + * which used quote_ident which does not follow our naming conventions + * was renamed to addIdentifierQuotes. + * @deprecated use addIdentifierQuotes + */ + function quote_ident( $s ) { + wfDeprecated( __METHOD__ ); + return $this->addIdentifierQuotes( $s ); + } + /** * Escape string for safe LIKE usage. * WARNING: you should almost never use this function directly, @@ -2496,6 +2520,32 @@ abstract class DatabaseBase implements DatabaseType { return true; } + /** + * Database independent variable replacement, replaces a set of named variables + * in a sql statement with the contents of their global variables. + * Supports '{$var}' `{$var}` and / *$var* / (without the spaces) style variables + * + * '{$var}' should be used for text and is passed through the database's addQuotes method + * `{$var}` should be used for identifiers (eg: table and database names), it is passed through + * the database's addIdentifierQuotes method which can be overridden if the database + * uses something other than backticks. + * / *$var* / is just encoded, besides traditional dbprefix and tableoptions it's use should be avoided + * + * @param $ins String: SQL statement to replace variables in + * @param $varnames Array: Array of global variable names to replace + * @return String The new SQL statement with variables replaced + */ + protected function replaceGlobalVars( $ins, $varnames ) { + foreach ( $varnames as $var ) { + if ( isset( $GLOBALS[$var] ) ) { + $ins = str_replace( '\'{$' . $var . '}\'', $this->addQuotes( $GLOBALS[$var] ), $ins ); // replace '{$var}' + $ins = str_replace( '`{$' . $var . '}`', $this->addIdentifierQuotes( $GLOBALS[$var] ), $ins ); // replace `{$var}` + $ins = str_replace( '/*$' . $var . '*/', $this->strencode( $GLOBALS[$var] ) , $ins ); // replace /*$var*/ + } + } + return $ins; + } + /** * Replace variables in sourced SQL */ @@ -2506,15 +2556,7 @@ abstract class DatabaseBase implements DatabaseType { 'wgDBadminuser', 'wgDBadminpassword', 'wgDBTableOptions', ); - // Ordinary variables - foreach ( $varnames as $var ) { - if ( isset( $GLOBALS[$var] ) ) { - $val = $this->addQuotes( $GLOBALS[$var] ); // FIXME: safety check? - $ins = str_replace( '{$' . $var . '}', $val, $ins ); - $ins = str_replace( '/*$' . $var . '*/`', '`' . $val, $ins ); - $ins = str_replace( '/*$' . $var . '*/', $val, $ins ); - } - } + $ins = $this->replaceGlobalVars( $ins, $varnames ); // Table prefixes $ins = preg_replace_callback( '!/\*(?:\$wgDBprefix|_)\*/([a-zA-Z_0-9]*)!',