diff options
author | David M <davidmj@users.sourceforge.net> | 2006-05-05 22:06:17 +0000 |
---|---|---|
committer | David M <davidmj@users.sourceforge.net> | 2006-05-05 22:06:17 +0000 |
commit | 3d2a45ab049606701172c11552aa0c1006d2fbf1 (patch) | |
tree | ea65a291ac3901d723f33446c54e449e3218ea13 /phpBB/includes/db | |
parent | b6ffae82b938eb3c40395234f14d79b53ba003c4 (diff) | |
download | forums-3d2a45ab049606701172c11552aa0c1006d2fbf1.tar forums-3d2a45ab049606701172c11552aa0c1006d2fbf1.tar.gz forums-3d2a45ab049606701172c11552aa0c1006d2fbf1.tar.bz2 forums-3d2a45ab049606701172c11552aa0c1006d2fbf1.tar.xz forums-3d2a45ab049606701172c11552aa0c1006d2fbf1.zip |
I hope nothing broke!
- Added a query builder, it is currently only used for complex queries that involve a FROM clause with two tables and a left join
- Changed some function calls in the DBAL
- Made the viewtopic queries nicer
git-svn-id: file:///svn/phpbb/trunk@5885 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/includes/db')
-rw-r--r-- | phpBB/includes/db/dbal.php | 61 | ||||
-rw-r--r-- | phpBB/includes/db/firebird.php | 13 | ||||
-rw-r--r-- | phpBB/includes/db/mssql.php | 10 | ||||
-rw-r--r-- | phpBB/includes/db/mssql_odbc.php | 10 | ||||
-rw-r--r-- | phpBB/includes/db/mysql.php | 15 | ||||
-rw-r--r-- | phpBB/includes/db/mysql4.php | 15 | ||||
-rw-r--r-- | phpBB/includes/db/mysqli.php | 15 | ||||
-rw-r--r-- | phpBB/includes/db/oracle.php | 6 | ||||
-rw-r--r-- | phpBB/includes/db/postgres.php | 15 | ||||
-rw-r--r-- | phpBB/includes/db/sqlite.php | 10 |
10 files changed, 159 insertions, 11 deletions
diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php index acc64da799..1a8b8a4ddf 100644 --- a/phpBB/includes/db/dbal.php +++ b/phpBB/includes/db/dbal.php @@ -192,6 +192,67 @@ class dbal } /** + * Build sql statement from array for select and select distinct statements + * + * Possible query values: SELECT, SELECT_DISTINCT + */ + function sql_build_query($query, $array) + { + $sql = ''; + switch ($query) + { + case 'SELECT': + case 'SELECT_DISTINCT'; + + if ($query == 'SELECT_DISTINCT') + { + $sql .= 'SELECT DISTINCT'; + } + else + { + $sql .= 'SELECT'; + } + + $sql .= ' ' . $array['SELECT']; + $sql .= ' FROM '; + + $table_array = array(); + foreach ($array['FROM'] as $table_name => $alias) + { + $table_array[] = $table_name . ' ' . $alias; + } + + $sql .= $this->_sql_custom_build('FROM', implode(', ', $table_array)); + + if (!empty($array['LEFT_JOIN'])) + { + foreach ($array['LEFT_JOIN'] as $join) + { + $sql .= ' LEFT JOIN ' . key($join['FROM']) . ' ' . current($join['FROM']) . ' ON (' . $join['ON'] . ')'; + } + } + + if (!empty($array['WHERE'])) + { + $sql .= ' WHERE ' . $this->_sql_custom_build('WHERE', $array['WHERE']); + } + + if (!empty($array['GROUP_BY'])) + { + $sql .= ' GROUP BY ' . $array['GROUP_BY']; + } + + if (!empty($array['ORDER_BY'])) + { + $sql .= ' ORDER BY ' . $array['ORDER_BY']; + } + + break; + } + return $sql; + } + + /** * display sql error page */ function sql_error($sql = '') diff --git a/phpBB/includes/db/firebird.php b/phpBB/includes/db/firebird.php index c94fd00882..e4eca60772 100644 --- a/phpBB/includes/db/firebird.php +++ b/phpBB/includes/db/firebird.php @@ -56,6 +56,7 @@ class dbal_firebird extends dbal switch ($status) { case 'begin': + $result = true; $this->transaction = true; break; @@ -90,7 +91,6 @@ class dbal_firebird extends dbal { global $cache; - $query = preg_replace('#FROM \(([^)]*)\)(,|[\n\r\t ]+(?:WHERE|LEFT JOIN)) #', 'FROM \1\2 ', $query); $this->last_query_text = $query; $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false; @@ -320,6 +320,15 @@ class dbal_firebird extends dbal } /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + return $data; + } + + /** * return sql error array * @private */ @@ -360,7 +369,7 @@ class dbal_firebird extends dbal { // Take the time spent on parsing rows into account } - @ibase_freeresult($result); + @ibase_free_result($result); $splittime = explode(' ', microtime()); $splittime = $splittime[0] + $splittime[1]; diff --git a/phpBB/includes/db/mssql.php b/phpBB/includes/db/mssql.php index 0e7ee89196..e1082d282c 100644 --- a/phpBB/includes/db/mssql.php +++ b/phpBB/includes/db/mssql.php @@ -98,7 +98,6 @@ class dbal_mssql extends dbal { global $cache; - $query = preg_replace('#FROM \(([^)]*)\)(,|[\n\r\t ]+(?:WHERE|LEFT JOIN)) #', 'FROM \1\2 ', $query); // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) @@ -334,6 +333,15 @@ class dbal_mssql extends dbal } /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + return $data; + } + + /** * Close sql connection * @private */ diff --git a/phpBB/includes/db/mssql_odbc.php b/phpBB/includes/db/mssql_odbc.php index 1e219f985e..a31c6074bc 100644 --- a/phpBB/includes/db/mssql_odbc.php +++ b/phpBB/includes/db/mssql_odbc.php @@ -101,7 +101,6 @@ class dbal_mssql_odbc extends dbal $this->sql_report('start', $query); } - $query = preg_replace('#FROM \(([^)]*)\)(,|[\n\r\t ]+(?:WHERE|LEFT JOIN)) #', 'FROM \1\2 ', $query); $this->last_query_text = $query; $this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false; @@ -318,6 +317,15 @@ class dbal_mssql_odbc extends dbal } /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + return $data; + } + + /** * return sql error array * @private */ diff --git a/phpBB/includes/db/mysql.php b/phpBB/includes/db/mysql.php index 625c6876ee..d9369f3a75 100644 --- a/phpBB/includes/db/mysql.php +++ b/phpBB/includes/db/mysql.php @@ -290,6 +290,21 @@ class dbal_mysql extends dbal return @mysql_real_escape_string($msg, $this->db_connect_id); } + + /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + switch ($stage) + { + case 'FROM': + $data = '(' . $data . ')'; + break; + } + return $data; + } /** * return sql error array diff --git a/phpBB/includes/db/mysql4.php b/phpBB/includes/db/mysql4.php index c388987e40..47c1ebc41f 100644 --- a/phpBB/includes/db/mysql4.php +++ b/phpBB/includes/db/mysql4.php @@ -293,6 +293,21 @@ class dbal_mysql4 extends dbal return @mysql_real_escape_string($msg, $this->db_connect_id); } + + /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + switch ($stage) + { + case 'FROM': + $data = '(' . $data . ')'; + break; + } + return $data; + } /** * return sql error array diff --git a/phpBB/includes/db/mysqli.php b/phpBB/includes/db/mysqli.php index 137ca39591..0233c7092f 100644 --- a/phpBB/includes/db/mysqli.php +++ b/phpBB/includes/db/mysqli.php @@ -284,6 +284,21 @@ class dbal_mysqli extends dbal { return @mysqli_real_escape_string($this->db_connect_id, $msg); } + + /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + switch ($stage) + { + case 'FROM': + $data = '(' . $data . ')'; + break; + } + return $data; + } /** * return sql error array diff --git a/phpBB/includes/db/oracle.php b/phpBB/includes/db/oracle.php index 2a4898ca0d..72732d2a50 100644 --- a/phpBB/includes/db/oracle.php +++ b/phpBB/includes/db/oracle.php @@ -90,7 +90,6 @@ class dbal_oracle extends dbal { global $cache; - $query = preg_replace('#FROM \(([^)]*)\)(,|[\n\r\t ]+(?:WHERE|LEFT JOIN)) #', 'FROM \1\2 ', $query); // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) @@ -361,6 +360,11 @@ class dbal_oracle extends dbal return str_replace("'", "''", str_replace('\\', '\\\\', $msg)); } + function _sql_custom_build($stage, $data) + { + return $data; + } + /** * return sql error array * @private diff --git a/phpBB/includes/db/postgres.php b/phpBB/includes/db/postgres.php index d9e8bc2bfa..eb5f2d17e8 100644 --- a/phpBB/includes/db/postgres.php +++ b/phpBB/includes/db/postgres.php @@ -127,10 +127,6 @@ class dbal_postgres extends dbal { global $cache; - if (strpos($query, 'SELECT') === 0 && strpos($query, 'FROM (') !== false) - { - $query = preg_replace('#FROM \(([^)]+)\)\s#', 'FROM \1 ', $query); - } // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) @@ -145,7 +141,7 @@ class dbal_postgres extends dbal { $this->num_queries++; - if (($this->query_result = @pg_exec($this->db_connect_id, $query)) === false) + if (($this->query_result = @pg_query($this->db_connect_id, $query)) === false) { $this->sql_error($query); } @@ -179,6 +175,15 @@ class dbal_postgres extends dbal } /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + return $data; + } + + /** * Build LIMIT query */ function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0) diff --git a/phpBB/includes/db/sqlite.php b/phpBB/includes/db/sqlite.php index 16319aec83..f2f3ceb1f1 100644 --- a/phpBB/includes/db/sqlite.php +++ b/phpBB/includes/db/sqlite.php @@ -94,7 +94,6 @@ class dbal_sqlite extends dbal { global $cache; - $query = preg_replace('#FROM \(([^)]*)\)(,|[\n\r\t ]+(?:WHERE|LEFT JOIN)) #', 'FROM \1\2 ', $query); // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) @@ -286,6 +285,15 @@ class dbal_sqlite extends dbal } /** + * Build db-specific query data + * @private + */ + function _sql_custom_build($stage, $data) + { + return $data; + } + + /** * Close sql connection * @private */ |