summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2010-04-15 11:53:26 +0000
committerDries Buytaert <dries@buytaert.net>2010-04-15 11:53:26 +0000
commitc27d66307c2d395a5e071d2b9c1d8665f6dc952d (patch)
tree92a5aba8f743f266d5379202fb2a28da9f9df101
parent00deb1df3e63cb6cd4f76272f318d5704b79b4f3 (diff)
downloadbrdo-c27d66307c2d395a5e071d2b9c1d8665f6dc952d.tar.gz
brdo-c27d66307c2d395a5e071d2b9c1d8665f6dc952d.tar.bz2
- Patch #770838 by sdboyer: optimize DatabaseConnection::ExpandArguments.
-rw-r--r--includes/database/database.inc57
1 files changed, 27 insertions, 30 deletions
diff --git a/includes/database/database.inc b/includes/database/database.inc
index 20a312886..91547a5b8 100644
--- a/includes/database/database.inc
+++ b/includes/database/database.inc
@@ -213,7 +213,7 @@ abstract class DatabaseConnection extends PDO {
/**
* Index of what driver-specific class to use for various operations.
- *
+ *
* @var array
*/
protected $driverClasses = array();
@@ -592,36 +592,33 @@ abstract class DatabaseConnection extends PDO {
protected function expandArguments(&$query, &$args) {
$modified = FALSE;
- foreach ($args as $key => $data) {
- // If the placeholder value to insert is an array, assume that we need
- // to expand it out into a comma-delimited set of placeholders.
- if (is_array($data)) {
- $new_keys = array();
- foreach ($data as $i => $value) {
- // This assumes that there are no other placeholders that use the same
- // name. For example, if the array placeholder is defined as :example
- // and there is already an :example_2 placeholder, this will generate
- // a duplicate key. We do not account for that as the calling code
- // is already broken if that happens.
- $new_keys[$key . '_' . $i] = $value;
- }
-
- // Update the query with the new placeholders.
- // preg_replace is a little bit slower than str_replace, but it is
- // necessary to ensure the replacement does not affect placeholders
- // that start with the same exact text. For example, if the query
- // contains the placeholders :foo and :foobar, and :foo has an array
- // of values, using str_replace would affect both placeholders, but
- // using the following preg_replace would only affect :foo because it
- // is followed by a non-word character.
- $query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);
-
- // Update the args array with the new placeholders.
- unset($args[$key]);
- $args += $new_keys;
-
- $modified = TRUE;
+ // If the placeholder value to insert is an array, assume that we need
+ // to expand it out into a comma-delimited set of placeholders.
+ foreach (array_filter($args, 'is_array') as $key => $data) {
+ $new_keys = array();
+ foreach ($data as $i => $value) {
+ // This assumes that there are no other placeholders that use the same
+ // name. For example, if the array placeholder is defined as :example
+ // and there is already an :example_2 placeholder, this will generate
+ // a duplicate key. We do not account for that as the calling code
+ // is already broken if that happens.
+ $new_keys[$key . '_' . $i] = $value;
}
+
+ // Update the query with the new placeholders.
+ // preg_replace is necessary to ensure the replacement does not affect
+ // placeholders that start with the same exact text. For example, if the
+ // query contains the placeholders :foo and :foobar, and :foo has an
+ // array of values, using str_replace would affect both placeholders,
+ // but using the following preg_replace would only affect :foo because
+ // it is followed by a non-word character.
+ $query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);
+
+ // Update the args array with the new placeholders.
+ unset($args[$key]);
+ $args += $new_keys;
+
+ $modified = TRUE;
}
return $modified;