Commit 8f33be54 authored by webchick's avatar webchick

Issue #561422 follow-up by Damien Tournoud, lyricnz, chx: Fixed SQLite support...

Issue #561422 follow-up by Damien Tournoud, lyricnz, chx: Fixed SQLite support for faster db prefixes.
parent 95430f98
......@@ -273,16 +273,7 @@ abstract class DatabaseConnection extends PDO {
protected $schema = NULL;
/**
* The default prefix used by this database connection.
*
* Separated from the other prefixes for performance reasons.
*
* @var string
*/
protected $defaultPrefix = '';
/**
* The non-default prefixes used by this database connection.
* The prefixes used by this database connection.
*
* @var array
*/
......@@ -389,7 +380,7 @@ public function getConnectionOptions() {
}
/**
* Preprocess the prefixes used by this database connection.
* Set the list of prefixes used by this database connection.
*
* @param $prefix
* The prefixes, in any of the multiple forms documented in
......@@ -397,13 +388,10 @@ public function getConnectionOptions() {
*/
protected function setPrefix($prefix) {
if (is_array($prefix)) {
$this->defaultPrefix = isset($prefix['default']) ? $prefix['default'] : '';
unset($prefix['default']);
$this->prefixes = $prefix;
$this->prefixes = $prefix + array('default' => '');
}
else {
$this->defaultPrefix = $prefix;
$this->prefixes = array();
$this->prefixes = array('default' => $prefix);
}
// Set up variables for use in prefixTables(). Replace table-specific
......@@ -411,12 +399,14 @@ protected function setPrefix($prefix) {
$this->prefixSearch = array();
$this->prefixReplace = array();
foreach ($this->prefixes as $key => $val) {
$this->prefixSearch[] = '{' . $key . '}';
$this->prefixReplace[] = $val . $key;
if ($key != 'default') {
$this->prefixSearch[] = '{' . $key . '}';
$this->prefixReplace[] = $val . $key;
}
}
// Then replace remaining tables with the default prefix.
$this->prefixSearch[] = '{';
$this->prefixReplace[] = $this->defaultPrefix;
$this->prefixReplace[] = $this->prefixes['default'];
$this->prefixSearch[] = '}';
$this->prefixReplace[] = '';
}
......@@ -450,7 +440,7 @@ public function tablePrefix($table = 'default') {
return $this->prefixes[$table];
}
else {
return $this->defaultPrefix;
return $this->prefixes['default'];
}
}
......
......@@ -71,12 +71,8 @@ public function __construct(array $connection_options = array()) {
));
// Attach one database for each registered prefix.
$prefixes = &$this->prefixes;
if (!empty($this->defaultPrefix)) {
// Add in the default prefix, which is also attached.
$prefixes[] = &$this->defaultPrefix;
}
foreach ($this->prefixes as $table => &$prefix) {
$prefixes = $this->prefixes;
foreach ($prefixes as $table => &$prefix) {
// Empty prefix means query the main database -- no need to attach anything.
if (!empty($prefix)) {
// Only attach the database once.
......@@ -90,6 +86,8 @@ public function __construct(array $connection_options = array()) {
$prefix .= '.';
}
}
// Regenerate the prefixes replacement table.
$this->setPrefix($prefixes);
// Detect support for SAVEPOINT.
$version = $this->query('SELECT sqlite_version()')->fetchField();
......@@ -240,7 +238,9 @@ public function queryTemporary($query, array $args = array(), array $options = a
// Generate a new temporary table name and protect it from prefixing.
// SQLite requires that temporary tables to be non-qualified.
$tablename = $this->generateTemporaryTableName();
$this->prefixes[$tablename] = '';
$prefixes = $this->prefixes;
$prefixes[$tablename] = '';
$this->setPrefix($prefixes);
$this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE ' . $tablename . ' AS SELECT', $query), $args, $options);
return $tablename;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment