Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
D
drupal
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Custom Issue Tracker
Custom Issue Tracker
Labels
Merge Requests
225
Merge Requests
225
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
project
drupal
Commits
17645df7
Commit
17645df7
authored
Feb 27, 2014
by
alexpott
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "Issue
#2176621
by sun, alexpott: Remove global $databases." Broke testbots
This reverts commit
06e6e923
.
parent
56aba1e3
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
130 additions
and
126 deletions
+130
-126
core/includes/bootstrap.inc
core/includes/bootstrap.inc
+2
-5
core/includes/install.core.inc
core/includes/install.core.inc
+30
-29
core/lib/Drupal/Core/Database/Database.php
core/lib/Drupal/Core/Database/Database.php
+87
-83
core/modules/migrate/lib/Drupal/migrate/Tests/MigrateTestBase.php
...ules/migrate/lib/Drupal/migrate/Tests/MigrateTestBase.php
+1
-1
core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
+8
-7
core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
.../modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+0
-1
core/modules/system/lib/Drupal/system/Tests/Database/ConnectionUnitTest.php
...m/lib/Drupal/system/Tests/Database/ConnectionUnitTest.php
+2
-0
No files found.
core/includes/bootstrap.inc
View file @
17645df7
...
...
@@ -491,8 +491,7 @@ function drupal_valid_http_host($host) {
*/
function
drupal_settings_initialize
()
{
// Export these settings.php variables to the global namespace.
global
$base_url
,
$cookie_domain
,
$config_directories
,
$config
;
$databases
=
array
();
global
$base_url
,
$databases
,
$cookie_domain
,
$config_directories
,
$config
;
$settings
=
array
();
$config
=
array
();
...
...
@@ -501,8 +500,6 @@ function drupal_settings_initialize() {
if
(
is_readable
(
DRUPAL_ROOT
.
'/'
.
$conf_path
.
'/settings.php'
))
{
require
DRUPAL_ROOT
.
'/'
.
$conf_path
.
'/settings.php'
;
}
// Initialize Database.
Database
::
setMultipleConnectionInfo
(
$databases
);
// Initialize Settings.
new
Settings
(
$settings
);
}
...
...
@@ -1774,7 +1771,7 @@ function _drupal_bootstrap_configuration() {
// Redirect the user to the installation script if Drupal has not been
// installed yet (i.e., if no $databases array has been defined in the
// settings.php file) and we are not already installing.
if
(
!
Database
::
getConnectionInfo
(
)
&&
!
drupal_installation_attempted
()
&&
!
drupal_is_cli
())
{
if
(
empty
(
$GLOBALS
[
'databases'
]
)
&&
!
drupal_installation_attempted
()
&&
!
drupal_is_cli
())
{
include_once
__DIR__
.
'/install.inc'
;
install_goto
(
'core/install.php'
);
}
...
...
core/includes/install.core.inc
View file @
17645df7
...
...
@@ -511,7 +511,7 @@ function install_begin_request(&$install_state) {
$task
=
NULL
;
// Do not install over a configured settings.php.
if
(
Database
::
getConnectionInfo
(
))
{
if
(
!
empty
(
$GLOBALS
[
'databases'
]
))
{
throw
new
Exception
(
install_already_done_error
());
}
}
...
...
@@ -1075,8 +1075,9 @@ function install_verify_completed_task() {
* Verifies that settings.php specifies a valid database connection.
*/
function
install_verify_database_settings
()
{
if
(
$database
=
Database
::
getConnectionInfo
())
{
$database
=
$database
[
'default'
];
global
$databases
;
if
(
!
empty
(
$databases
))
{
$database
=
$databases
[
'default'
][
'default'
];
$settings_file
=
'./'
.
conf_path
(
FALSE
)
.
'/settings.php'
;
$errors
=
install_database_errors
(
$database
,
$settings_file
);
if
(
empty
(
$errors
))
{
...
...
@@ -1097,6 +1098,8 @@ function install_verify_database_settings() {
* @ingroup forms
*/
function
install_settings_form
(
$form
,
&
$form_state
,
&
$install_state
)
{
global
$databases
;
$conf_path
=
'./'
.
conf_path
(
FALSE
);
$settings_file
=
$conf_path
.
'/settings.php'
;
...
...
@@ -1105,33 +1108,25 @@ function install_settings_form($form, &$form_state, &$install_state) {
$drivers
=
drupal_get_database_types
();
$drivers_keys
=
array_keys
(
$drivers
);
// Unless there is input for this form (for a non-interactive installation,
// input originates from the $settings array passed into install_drupal()),
// check whether database connection settings have been prepared in
// settings.php already.
// If database connection settings have been prepared in settings.php already,
// then the existing values need to be taken over.
// Note: The installer even executes this form if there is a valid database
// connection already, since the submit handler of this form is responsible
// for writing all $settings to settings.php (not limited to $databases).
if
(
!
isset
(
$form_state
[
'input'
][
'driver'
])
&&
$database
=
Database
::
getConnectionInfo
())
{
$form_state
[
'input'
][
'driver'
]
=
$database
[
'default'
][
'driver'
];
$form_state
[
'input'
][
$database
[
'default'
][
'driver'
]]
=
$database
[
'default'
];
}
if
(
isset
(
$form_state
[
'input'
][
'driver'
]))
{
if
(
isset
(
$databases
[
'default'
][
'default'
]))
{
$default_driver
=
$databases
[
'default'
][
'default'
][
'driver'
];
$default_options
=
$databases
[
'default'
][
'default'
];
}
// Otherwise, use the database connection settings from the form input.
// For a non-interactive installation, this is derived from the original
// $settings array passed into install_drupal().
elseif
(
isset
(
$form_state
[
'input'
][
'driver'
]))
{
$default_driver
=
$form_state
[
'input'
][
'driver'
];
// In case of database connection info from settings.php, as well as for a
// programmed form submission (non-interactive installer), the table prefix
// information is usually normalized into an array already, but the form
// element only allows to configure one default prefix for all tables.
$prefix
=
&
$form_state
[
'input'
][
$default_driver
][
'prefix'
];
if
(
isset
(
$prefix
)
&&
is_array
(
$prefix
))
{
$prefix
=
$prefix
[
'default'
];
}
$default_options
=
$form_state
[
'input'
][
$default_driver
];
}
// If there is no database information
yet, suggest the first available driver
// a
s default value, so that its settings form is made visible via #states
// when JavaScript is enabled (see below).
// If there is no database information
at all yet, just suggest the first
// a
vailable driver as default value, so that its settings form is made
//
visible via #states
when JavaScript is enabled (see below).
else
{
$default_driver
=
current
(
$drivers_keys
);
$default_options
=
array
();
...
...
@@ -1207,6 +1202,7 @@ function install_settings_form_validate($form, &$form_state) {
* Checks a database connection and returns any errors.
*/
function
install_database_errors
(
$database
,
$settings_file
)
{
global
$databases
;
$errors
=
array
();
// Check database type.
...
...
@@ -1218,13 +1214,18 @@ function install_database_errors($database, $settings_file) {
else
{
// Run driver specific validation
$errors
+=
$database_types
[
$driver
]
->
validateDatabaseSettings
(
$database
);
if
(
!
empty
(
$errors
))
{
// No point to try further.
return
$errors
;
}
// Run tasks associated with the database type. Any errors are caught in the
// calling function.
Database
::
addConnectionInfo
(
'default'
,
'default'
,
$database
);
$databases
[
'default'
][
'default'
]
=
$database
;
// Just changing the global doesn't get the new information processed.
// We need to close any active connections and tell the Database class to
// re-parse $databases.
if
(
Database
::
isActiveConnection
())
{
Database
::
closeConnection
();
}
Database
::
parseConnectionInfo
();
try
{
db_run_tasks
(
$driver
);
}
...
...
core/lib/Drupal/Core/Database/Database.php
View file @
17645df7
...
...
@@ -52,7 +52,7 @@ abstract class Database {
*
* @var array
*/
static
protected
$databaseInfo
=
array
()
;
static
protected
$databaseInfo
=
NULL
;
/**
* A list of key/target credentials to simply ignore.
...
...
@@ -85,9 +85,9 @@ abstract class Database {
/**
* Starts logging a given logging key on the specified connection.
*
* @param
string
$logging_key
* @param $logging_key
* The logging key to log.
* @param
string
$key
* @param $key
* The database connection key for which we want to log.
*
* @return \Drupal\Core\Database\Log
...
...
@@ -122,9 +122,9 @@ abstract class Database {
* it again (which does nothing to an open log key) and call methods on it as
* desired.
*
* @param
string
$logging_key
* @param $logging_key
* The logging key to log.
* @param
string
$key
* @param $key
* The database connection key for which we want to log.
*
* @return array
...
...
@@ -144,9 +144,9 @@ abstract class Database {
/**
* Gets the connection object for the specified database key and target.
*
* @param
string
$target
* @param $target
* The database target name.
* @param
string
$key
* @param $key
* The database connection key. Defaults to NULL which means the active key.
*
* @return \Drupal\Core\Database\Connection
...
...
@@ -179,7 +179,7 @@ abstract class Database {
* Note that this method will return FALSE if no connection has been
* established yet, even if one could be.
*
* @return
bool
* @return
* TRUE if there is at least one database connection established, FALSE
* otherwise.
*/
...
...
@@ -190,10 +190,14 @@ abstract class Database {
/**
* Sets the active connection to the specified key.
*
* @return
string|null
* @return
* The previous database connection key.
*/
final
public
static
function
setActiveConnection
(
$key
=
'default'
)
{
if
(
empty
(
self
::
$databaseInfo
))
{
self
::
parseConnectionInfo
();
}
if
(
!
empty
(
self
::
$databaseInfo
[
$key
]))
{
$old_key
=
self
::
$activeKey
;
self
::
$activeKey
=
$key
;
...
...
@@ -203,40 +207,56 @@ abstract class Database {
/**
* Process the configuration file for database information.
*
* @param array $info
* The database connection information, as defined in settings.php. The
* structure of this array depends on the database driver it is connecting
* to.
*/
final
public
static
function
parseConnectionInfo
(
array
$info
)
{
// If there is no "driver" property, then we assume it's an array of
// possible connections for this target. Pick one at random. That allows
// us to have, for example, multiple slave servers.
if
(
empty
(
$info
[
'driver'
]))
{
$info
=
$info
[
mt_rand
(
0
,
count
(
$info
)
-
1
)];
final
public
static
function
parseConnectionInfo
()
{
global
$databases
;
$database_info
=
is_array
(
$databases
)
?
$databases
:
array
();
foreach
(
$database_info
as
$index
=>
$info
)
{
foreach
(
$database_info
[
$index
]
as
$target
=>
$value
)
{
// If there is no "driver" property, then we assume it's an array of
// possible connections for this target. Pick one at random. That allows
// us to have, for example, multiple slave servers.
if
(
empty
(
$value
[
'driver'
]))
{
$database_info
[
$index
][
$target
]
=
$database_info
[
$index
][
$target
][
mt_rand
(
0
,
count
(
$database_info
[
$index
][
$target
])
-
1
)];
}
// Parse the prefix information.
if
(
!
isset
(
$database_info
[
$index
][
$target
][
'prefix'
]))
{
// Default to an empty prefix.
$database_info
[
$index
][
$target
][
'prefix'
]
=
array
(
'default'
=>
''
,
);
}
elseif
(
!
is_array
(
$database_info
[
$index
][
$target
][
'prefix'
]))
{
// Transform the flat form into an array form.
$database_info
[
$index
][
$target
][
'prefix'
]
=
array
(
'default'
=>
$database_info
[
$index
][
$target
][
'prefix'
],
);
}
}
}
// Parse the prefix information.
if
(
!
isset
(
$info
[
'prefix'
]))
{
// Default to an empty prefix.
$info
[
'prefix'
]
=
array
(
'default'
=>
''
,
);
if
(
!
is_array
(
self
::
$databaseInfo
))
{
self
::
$databaseInfo
=
$database_info
;
}
elseif
(
!
is_array
(
$info
[
'prefix'
]))
{
// Transform the flat form into an array form.
$info
[
'prefix'
]
=
array
(
'default'
=>
$info
[
'prefix'
],
);
// Merge the new $database_info into the existing.
// array_merge_recursive() cannot be used, as it would make multiple
// database, user, and password keys in the same database array.
else
{
foreach
(
$database_info
as
$database_key
=>
$database_values
)
{
foreach
(
$database_values
as
$target
=>
$target_values
)
{
self
::
$databaseInfo
[
$database_key
][
$target
]
=
$target_values
;
}
}
}
return
$info
;
}
/**
* Adds database connection information for a given key/target.
*
* This method allows to add new connections at runtime.
*
* This method allows the addition of new connection credentials at runtime.
* Under normal circumstances the preferred way to specify database
* credentials is via settings.php. However, this method allows them to be
* added at arbitrary times, such as during unit tests, when connecting to
...
...
@@ -244,71 +264,52 @@ abstract class Database {
*
* If the given key/target pair already exists, this method will be ignored.
*
* @param
string
$key
* @param $key
* The database key.
* @param
string
$target
* @param $target
* The database target name.
* @param
array
$info
* The database connection information, as
defined in settings.php. The
* s
tructure of this array depends on the database driver it is connecting
* to.
* @param $info
* The database connection information, as
it would be defined in
* s
ettings.php. Note that the structure of this array will depend on the
*
database driver it is connecting
to.
*/
final
public
static
function
addConnectionInfo
(
$key
,
$target
,
array
$info
)
{
public
static
function
addConnectionInfo
(
$key
,
$target
,
$info
)
{
if
(
empty
(
self
::
$databaseInfo
[
$key
][
$target
]))
{
self
::
$databaseInfo
[
$key
][
$target
]
=
self
::
parseConnectionInfo
(
$info
)
;
self
::
$databaseInfo
[
$key
][
$target
]
=
$info
;
}
}
/**
* Gets information on the specified database connection.
*
* @param string $key
* (optional) The connection key for which to return information.
*
* @return array|null
* @param $connection
* The connection key for which we want information.
*/
final
public
static
function
getConnectionInfo
(
$key
=
'default'
)
{
if
(
!
empty
(
self
::
$databaseInfo
[
$key
]
))
{
return
self
::
$databaseInfo
[
$key
]
;
if
(
empty
(
self
::
$databaseInfo
))
{
self
::
parseConnectionInfo
()
;
}
}
/**
* Gets connection information for all available databases.
*
* @return array
*/
final
public
static
function
getAllConnectionInfo
()
{
return
self
::
$databaseInfo
;
}
/**
* Sets connection information for multiple databases.
*
* @param array $databases
* A multi-dimensional array specifying database connection parameters, as
* defined in settings.php.
*/
final
public
static
function
setMultipleConnectionInfo
(
array
$databases
)
{
foreach
(
$databases
as
$key
=>
$targets
)
{
foreach
(
$targets
as
$target
=>
$info
)
{
self
::
addConnectionInfo
(
$key
,
$target
,
$info
);
}
if
(
!
empty
(
self
::
$databaseInfo
[
$key
]))
{
return
self
::
$databaseInfo
[
$key
];
}
}
/**
* Rename a connection and its corresponding connection information.
*
* @param
string
$old_key
* @param $old_key
* The old connection key.
* @param
string
$new_key
* @param $new_key
* The new connection key.
*
* @return bool
* @return
* TRUE in case of success, FALSE otherwise.
*/
final
public
static
function
renameConnection
(
$old_key
,
$new_key
)
{
if
(
empty
(
self
::
$databaseInfo
))
{
self
::
parseConnectionInfo
();
}
if
(
!
empty
(
self
::
$databaseInfo
[
$old_key
])
&&
empty
(
self
::
$databaseInfo
[
$new_key
]))
{
// Migrate the database connection information.
self
::
$databaseInfo
[
$new_key
]
=
self
::
$databaseInfo
[
$old_key
];
...
...
@@ -330,10 +331,9 @@ abstract class Database {
/**
* Remove a connection and its corresponding connection information.
*
* @param
string
$key
* @param $key
* The connection key.
*
* @return bool
* @return
* TRUE in case of success, FALSE otherwise.
*/
final
public
static
function
removeConnection
(
$key
)
{
...
...
@@ -350,16 +350,20 @@ abstract class Database {
/**
* Opens a connection to the server specified by the given key and target.
*
* @param
string
$key
* @param $key
* The database connection key, as specified in settings.php. The default is
* "default".
* @param
string
$target
* @param $target
* The database target to open.
*
* @throws \Drupal\Core\Database\ConnectionNotDefinedException
* @throws \Drupal\Core\Database\DriverNotSpecifiedException
*/
final
protected
static
function
openConnection
(
$key
,
$target
)
{
if
(
empty
(
self
::
$databaseInfo
))
{
self
::
parseConnectionInfo
();
}
// If the requested database does not exist then it is an unrecoverable
// error.
if
(
!
isset
(
self
::
$databaseInfo
[
$key
]))
{
...
...
@@ -395,10 +399,10 @@ abstract class Database {
/**
* Closes a connection to the server specified by the given key and target.
*
* @param
string
$target
* @param $target
* The database target name. Defaults to NULL meaning that all target
* connections will be closed.
* @param
string
$key
* @param $key
* The database connection key. Defaults to NULL which means the active key.
*/
public
static
function
closeConnection
(
$target
=
NULL
,
$key
=
NULL
)
{
...
...
@@ -435,9 +439,9 @@ public static function closeConnection($target = NULL, $key = NULL) {
* method with the database key and the target to disable. That database key
* will then always fall back to 'default' for that key, even if it's defined.
*
* @param
string
$key
* @param $key
* The database connection key.
* @param
string
$target
* @param $target
* The target of the specified key to ignore.
*/
public
static
function
ignoreTarget
(
$key
,
$target
)
{
...
...
core/modules/migrate/lib/Drupal/migrate/Tests/MigrateTestBase.php
View file @
17645df7
...
...
@@ -40,7 +40,7 @@ protected function prepare(MigrationInterface $migration, array $files = array()
$database
=
SqlBase
::
getDatabaseConnection
(
$migration
->
id
(),
array
(
'database'
=>
$connection_info
[
'default'
]));
foreach
(
array
(
'source'
,
'destination'
,
'idMap'
)
as
$key
)
{
$configuration
=
$migration
->
get
(
$key
);
$configuration
[
'database'
]
=
$
connection_info
[
'default'
]
;
$configuration
[
'database'
]
=
$
database
;
$migration
->
set
(
$key
,
$configuration
);
}
...
...
core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
View file @
17645df7
...
...
@@ -933,11 +933,7 @@ private function changeDatabasePrefix() {
$connection_info
=
Database
::
getConnectionInfo
(
'default'
);
Database
::
renameConnection
(
'default'
,
'simpletest_original_default'
);
foreach
(
$connection_info
as
$target
=>
$value
)
{
// Replace the full table prefix definition to ensure that no table
// prefixes of the test runner leak into the test.
$connection_info
[
$target
][
'prefix'
]
=
array
(
'default'
=>
$value
[
'prefix'
][
'default'
]
.
$this
->
databasePrefix
,
);
$connection_info
[
$target
][
'prefix'
]
=
$value
[
'prefix'
][
'default'
]
.
$this
->
databasePrefix
;
}
Database
::
addConnectionInfo
(
'default'
,
'default'
,
$connection_info
[
'default'
]);
}
...
...
@@ -1172,10 +1168,11 @@ private function restoreEnvironment() {
usleep
(
50000
);
// Remove all prefixed tables.
// @todo Connection prefix info is not normalized into an array.
$original_connection_info
=
Database
::
getConnectionInfo
(
'simpletest_original_default'
);
$original_prefix
=
$original_connection_info
[
'default'
][
'prefix'
][
'default
'
];
$original_prefix
=
is_array
(
$original_connection_info
[
'default'
][
'prefix'
])
?
$original_connection_info
[
'default'
][
'prefix'
][
'default'
]
:
$original_connection_info
[
'default'
][
'prefix
'
];
$test_connection_info
=
Database
::
getConnectionInfo
(
'default'
);
$test_prefix
=
$test_connection_info
[
'default'
][
'prefix'
][
'default
'
];
$test_prefix
=
is_array
(
$test_connection_info
[
'default'
][
'prefix'
])
?
$test_connection_info
[
'default'
][
'prefix'
][
'default'
]
:
$test_connection_info
[
'default'
][
'prefix
'
];
if
(
$original_prefix
!=
$test_prefix
)
{
$tables
=
Database
::
getConnection
()
->
schema
()
->
findTables
(
$test_prefix
.
'%'
);
$prefix_length
=
strlen
(
$test_prefix
);
...
...
@@ -1196,6 +1193,10 @@ private function restoreEnvironment() {
// Restore original database connection.
Database
::
removeConnection
(
'default'
);
Database
::
renameConnection
(
'simpletest_original_default'
,
'default'
);
// @see TestBase::changeDatabasePrefix()
global
$databases
;
$connection_info
=
Database
::
getConnectionInfo
(
'default'
);
$databases
[
'default'
][
'default'
]
=
$connection_info
[
'default'
];
// Restore original globals.
if
(
isset
(
$this
->
originalThemeKey
))
{
...
...
core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
View file @
17645df7
...
...
@@ -892,7 +892,6 @@ protected function setUp() {
protected
function
installParameters
()
{
$connection_info
=
Database
::
getConnectionInfo
();
$driver
=
$connection_info
[
'default'
][
'driver'
];
$connection_info
[
'default'
][
'prefix'
]
=
$connection_info
[
'default'
][
'prefix'
][
'default'
];
unset
(
$connection_info
[
'default'
][
'driver'
]);
unset
(
$connection_info
[
'default'
][
'namespace'
]);
unset
(
$connection_info
[
'default'
][
'pdo'
]);
...
...
core/modules/system/lib/Drupal/system/Tests/Database/ConnectionUnitTest.php
View file @
17645df7
...
...
@@ -52,6 +52,8 @@ function setUp() {
// and closed in this test.
// @see TestBase::changeDatabasePrefix()
Database
::
addConnectionInfo
(
'default'
,
'monitor'
,
$connection_info
[
'default'
]);
global
$databases
;
$databases
[
'default'
][
'monitor'
]
=
$connection_info
[
'default'
];
$this
->
monitor
=
Database
::
getConnection
(
'monitor'
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment