diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/common.inc | 2 | ||||
-rw-r--r-- | includes/database/database.inc | 235 | ||||
-rw-r--r-- | includes/database/mysql/database.inc | 13 | ||||
-rw-r--r-- | includes/database/pgsql/database.inc | 13 | ||||
-rw-r--r-- | includes/database/select.inc | 2 | ||||
-rw-r--r-- | includes/database/sqlite/database.inc | 13 | ||||
-rw-r--r-- | includes/pager.inc | 70 | ||||
-rw-r--r-- | includes/tablesort.inc | 31 | ||||
-rw-r--r-- | includes/update.inc | 8 |
9 files changed, 33 insertions, 354 deletions
diff --git a/includes/common.inc b/includes/common.inc index 8d6b8c6a1..30e585958 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -881,7 +881,7 @@ function _drupal_decode_exception($exception) { // The first element in the stack is the call, the second element gives us the caller. // We skip calls that occurred in one of the classes of the database layer // or in one of its global functions. - $db_functions = array('db_query', 'pager_query', 'db_query_range', 'db_query_temporary', 'update_sql'); + $db_functions = array('db_query', 'db_query_range', 'update_sql'); while (!empty($backtrace[1]) && ($caller = $backtrace[1]) && ((isset($caller['class']) && (strpos($caller['class'], 'Query') !== FALSE || strpos($caller['class'], 'Database') !== FALSE || strpos($caller['class'], 'PDO') !== FALSE)) || in_array($caller['function'], $db_functions))) { diff --git a/includes/database/database.inc b/includes/database/database.inc index f298376ff..cdadd89f2 100644 --- a/includes/database/database.inc +++ b/includes/database/database.inc @@ -23,9 +23,10 @@ * inherits much of its syntax and semantics. * * Most Drupal database SELECT queries are performed by a call to db_query() or - * db_query_range(). Module authors should also consider using pager_query() for - * queries that return results that need to be presented on multiple pages, and - * tablesort_sql() for generating appropriate queries for sortable tables. + * db_query_range(). Module authors should also consider using the PagerDefault + * Extender for queries that return results that need to be presented on + * multiple pages, and the Tablesort Extender for generating appropriate queries + * for sortable tables. * * For example, one might wish to return a list of the most recent 10 nodes * authored by a given user. Instead of directly issuing the SQL query @@ -943,7 +944,7 @@ abstract class DatabaseConnection extends PDO { * A database query result resource, or NULL if the query was not executed * correctly. */ - abstract public function queryRange($query, array $args, $from, $count, array $options = array()); + abstract public function queryRange($query, $from, $count, array $args = array(), array $options = array()); /** * Generate a temporary table name. @@ -977,7 +978,7 @@ abstract class DatabaseConnection extends PDO { * @return * The name of the temporary table. */ - abstract function queryTemporary($query, array $args, array $options = array()); + abstract function queryTemporary($query, array $args = array(), array $options = array()); /** * Returns the type of database driver. @@ -1812,12 +1813,10 @@ class DatabaseStatementBase extends PDOStatement implements DatabaseStatementInt * @return * A prepared statement object, already executed. */ -function db_query($query, $args = array(), $options = array()) { - if (!is_array($args)) { - $args = func_get_args(); - array_shift($args); +function db_query($query, array $args = array(), array $options = array()) { + if (empty($options['target'])) { + $options['target'] = 'default'; } - list($query, $args, $options) = _db_query_process_args($query, $args, $options); return Database::getConnection($options['target'])->query($query, $args, $options); } @@ -1830,30 +1829,26 @@ function db_query($query, $args = array(), $options = array()) { * The prepared statement query to run. Although it will accept both * named and unnamed placeholders, named placeholders are strongly preferred * as they are more self-documenting. + * @param $from + * The first record from the result set to return. + * @param $limit + * The number of records to return from the result set. * @param $args * An array of values to substitute into the query. If the query uses named * placeholders, this is an associative array in any order. If the query uses * unnamed placeholders (?), this is an indexed array and the order must match * the order of placeholders in the query string. - * @param $from - * The first record from the result set to return. - * @param $limit - * The number of records to return from the result set. * @param $options * An array of options to control how the query operates. * @return * A prepared statement object, already executed. */ -function db_query_range($query, $args, $from = 0, $count = 0, $options = array()) { - if (!is_array($args)) { - $args = func_get_args(); - array_shift($args); - $count = array_pop($args); - $from = array_pop($args); +function db_query_range($query, $from, $count, array $args = array(), array $options = array()) { + if (empty($options['target'])) { + $options['target'] = 'default'; } - list($query, $args, $options) = _db_query_process_args($query, $args, $options); - return Database::getConnection($options['target'])->queryRange($query, $args, $from, $count, $options); + return Database::getConnection($options['target'])->queryRange($query, $from, $count, $args, $options); } /** @@ -1874,12 +1869,10 @@ function db_query_range($query, $args, $from = 0, $count = 0, $options = array() * @return * The name of the temporary table. */ -function db_query_temporary($query, $args, $options = array()) { - if (!is_array($args)) { - $args = func_get_args(); - array_shift($args); +function db_query_temporary($query, array $args = array(), array $options = array()) { + if (empty($options['target'])) { + $options['target'] = 'default'; } - list($query, $args, $options) = _db_query_process_args($query, $args, $options); return Database::getConnection($options['target'])->queryTemporary($query, $args, $options); } @@ -2065,26 +2058,6 @@ function update_sql($sql) { } /** - * Wraps the given table.field entry with a DISTINCT(). The wrapper is added to - * the SELECT list entry of the given query and the resulting query is returned. - * This function only applies the wrapper if a DISTINCT doesn't already exist in - * the query. - * - * @todo Remove this. - * @param $table - * Table containing the field to set as DISTINCT - * @param $field - * Field to set as DISTINCT - * @param $query - * Query to apply the wrapper to - * @return - * SQL query with the DISTINCT wrapper surrounding the given table.field. - */ -function db_distinct_field($table, $field, $query) { - return Database::getConnection()->distinctField($table, $field, $query); -} - -/** * Retrieve the name of the currently active database driver, such as * "mysql" or "pgsql". * @@ -2476,24 +2449,6 @@ function db_ignore_slave() { } /** - * @ingroup database-legacy - * - * These functions are no longer necessary, as the DatabaseStatementInterface interface - * offers this and much more functionality. They are kept temporarily for backward - * compatibility during conversion and should be removed as soon as possible. - * - * @{ - */ - -function db_fetch_object(DatabaseStatementInterface $statement) { - return $statement->fetch(PDO::FETCH_OBJ); -} - -function db_result(DatabaseStatementInterface $statement) { - return $statement->fetchField(); -} - -/** * 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 file) and we are not already there. Otherwise, do nothing. @@ -2504,152 +2459,4 @@ function _db_check_install_needed() { include_once DRUPAL_ROOT . '/includes/install.inc'; install_goto('install.php'); } -} - -/** - * Backward-compatibility utility. - * - * This function should be removed after all queries have been converted - * to the new API. It is temporary only. - * - * @todo Remove this once the query conversion is complete. - */ -function _db_query_process_args($query, $args, $options) { - - if (!is_array($options)) { - $options = array(); - } - if (empty($options['target'])) { - $options['target'] = 'default'; - } - - // Temporary backward-compatibility hacks. Remove later. - $old_query = $query; - $query = str_replace(array('%n', '%d', '%f', '%b', "'%s'", '%s'), '?', $old_query); - if ($old_query !== $query) { - $args = array_values($args); // The old system allowed named arrays, but PDO doesn't if you use ?. - } - - return array($query, $args, $options); -} - -/** - * Helper function for db_rewrite_sql. - * - * Collects JOIN and WHERE statements via hook_db_rewrite_sql() - * Decides whether to select primary_key or DISTINCT(primary_key) - * - * @todo Remove this function when all code has been converted to query_alter. - * @param $query - * Query to be rewritten. - * @param $primary_table - * Name or alias of the table which has the primary key field for this query. - * Typical table names would be: {block}, {comment}, {forum}, {node}, - * {menu}, {taxonomy_term_data} or {taxonomy_vocabulary}. However, in most cases the usual - * table alias (b, c, f, n, m, t or v) is used instead of the table name. - * @param $primary_field - * Name of the primary field. - * @param $args - * Array of additional arguments. - * @return - * An array: join statements, where statements, field or DISTINCT(field). - */ -function _db_rewrite_sql($query = '', $primary_table = 'n', $primary_field = 'nid', $args = array()) { - $where = array(); - $join = array(); - $distinct = FALSE; - foreach (module_implements('db_rewrite_sql') as $module) { - $result = module_invoke($module, 'db_rewrite_sql', $query, $primary_table, $primary_field, $args); - if (isset($result) && is_array($result)) { - if (isset($result['where'])) { - $where[] = $result['where']; - } - if (isset($result['join'])) { - $join[] = $result['join']; - } - if (isset($result['distinct']) && $result['distinct']) { - $distinct = TRUE; - } - } - elseif (isset($result)) { - $where[] = $result; - } - } - - $where = empty($where) ? '' : '(' . implode(') AND (', $where) . ')'; - $join = empty($join) ? '' : implode(' ', $join); - - return array($join, $where, $distinct); -} - -/** - * Rewrites node, taxonomy and comment queries. Use it for listing queries. Do not - * use FROM table1, table2 syntax, use JOIN instead. - * - * @todo Remove this function when all code has been converted to query_alter. - * @param $query - * Query to be rewritten. - * @param $primary_table - * Name or alias of the table which has the primary key field for this query. - * Typical table names would be: {block}, {comment}, {forum}, {node}, - * {menu}, {taxonomy_term_data} or {taxonomy_vocabulary}. However, it is more common to use the - * the usual table aliases: b, c, f, n, m, t or v. - * @param $primary_field - * Name of the primary field. - * @param $args - * An array of arguments, passed to the implementations of hook_db_rewrite_sql. - * @return - * The original query with JOIN and WHERE statements inserted from - * hook_db_rewrite_sql implementations. nid is rewritten if needed. - */ -function db_rewrite_sql($query, $primary_table = 'n', $primary_field = 'nid', $args = array()) { - list($join, $where, $distinct) = _db_rewrite_sql($query, $primary_table, $primary_field, $args); - - if ($distinct) { - $query = db_distinct_field($primary_table, $primary_field, $query); - } - - if (!empty($where) || !empty($join)) { - $pattern = '{ - # Beginning of the string - ^ - ((?P<anonymous_view> - # Everything within this set of parentheses is named "anonymous view" - (?: - [^()]++ # anything not parentheses - | - \( (?P>anonymous_view) \) # an open parenthesis, more "anonymous view" and finally a close parenthesis. - )* - )[^()]+WHERE) - }x'; - preg_match($pattern, $query, $matches); - if ($where) { - $n = strlen($matches[1]); - $second_part = substr($query, $n); - $first_part = substr($matches[1], 0, $n - 5) . " $join WHERE $where AND ( "; - foreach (array('GROUP', 'ORDER', 'LIMIT') as $needle) { - $pos = strrpos($second_part, $needle); - if ($pos !== FALSE) { - // All needles are five characters long. - $pos += 5; - break; - } - } - if ($pos === FALSE) { - $query = $first_part . $second_part . ')'; - } - else { - $query = $first_part . substr($second_part, 0, -$pos) . ')' . substr($second_part, -$pos); - } - } - else { - $query = $matches[1] . " $join " . substr($query, strlen($matches[1])); - } - } - - return $query; -} - -/** - * @} End of "ingroup database-legacy". - */ +}
\ No newline at end of file diff --git a/includes/database/mysql/database.inc b/includes/database/mysql/database.inc index 27623a273..3f143cfe2 100644 --- a/includes/database/mysql/database.inc +++ b/includes/database/mysql/database.inc @@ -46,11 +46,11 @@ class DatabaseConnection_mysql extends DatabaseConnection { $this->exec("SET sql_mode='ANSI,TRADITIONAL'"); } - public function queryRange($query, array $args, $from, $count, array $options = array()) { + public function queryRange($query, $from, $count, array $args = array(), array $options = array()) { return $this->query($query . ' LIMIT ' . $from . ', ' . $count, $args, $options); } - public function queryTemporary($query, array $args, array $options = array()) { + public function queryTemporary($query, array $args = array(), array $options = array()) { $tablename = $this->generateTemporaryTableName(); $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE {' . $tablename . '} Engine=MEMORY SELECT', $query), $args, $options); return $tablename; @@ -68,15 +68,6 @@ class DatabaseConnection_mysql extends DatabaseConnection { // We don't want to override any of the defaults. return NULL; } - - /** - * @todo Remove this as soon as db_rewrite_sql() has been exterminated. - */ - public function distinctField($table, $field, $query) { - $field_to_select = 'DISTINCT(' . $table . '.' . $field . ')'; - // (?<!text) is a negative look-behind (no need to rewrite queries that already use DISTINCT). - return preg_replace('/(SELECT.*)(?:' . $table . '\.|\s)(?<!DISTINCT\()(?<!DISTINCT\(' . $table . '\.)' . $field . '(.*FROM )/AUsi', '\1 ' . $field_to_select . '\2', $query); - } } diff --git a/includes/database/pgsql/database.inc b/includes/database/pgsql/database.inc index ec68c3a39..6772471b6 100644 --- a/includes/database/pgsql/database.inc +++ b/includes/database/pgsql/database.inc @@ -99,11 +99,11 @@ class DatabaseConnection_pgsql extends DatabaseConnection { } } - public function queryRange($query, array $args, $from, $count, array $options = array()) { + public function queryRange($query, $from, $count, array $args = array(), array $options = array()) { return $this->query($query . ' LIMIT ' . $count . ' OFFSET ' . $from, $args, $options); } - public function queryTemporary($query, array $args, array $options = array()) { + public function queryTemporary($query, array $args = array(), array $options = array()) { $tablename = $this->generateTemporaryTableName(); $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE {' . $tablename . '} AS SELECT', $query), $args, $options); return $tablename; @@ -126,15 +126,6 @@ class DatabaseConnection_pgsql extends DatabaseConnection { return isset($specials[$operator]) ? $specials[$operator] : NULL; } - - /** - * @todo Remove this as soon as db_rewrite_sql() has been exterminated. - */ - public function distinctField($table, $field, $query) { - $field_to_select = 'DISTINCT(' . $table . '.' . $field . ')'; - // (?<!text) is a negative look-behind (no need to rewrite queries that already use DISTINCT). - return preg_replace('/(SELECT.*)(?:' . $table . '\.|\s)(?<!DISTINCT\()(?<!DISTINCT\(' . $table . '\.)' . $field . '(.*FROM )/AUsi', '\1 ' . $field_to_select . '\2', $query); - } } /** diff --git a/includes/database/select.inc b/includes/database/select.inc index 55eecf586..cebeef7ad 100644 --- a/includes/database/select.inc +++ b/includes/database/select.inc @@ -1084,7 +1084,7 @@ class SelectQuery extends Query implements SelectQueryInterface { $args = $this->getArguments(); if (!empty($this->range)) { - return $this->connection->queryRange((string)$this, $args, $this->range['start'], $this->range['length'], $this->queryOptions); + return $this->connection->queryRange((string)$this, $this->range['start'], $this->range['length'], $args, $this->queryOptions); } return $this->connection->query((string)$this, $args, $this->queryOptions); } diff --git a/includes/database/sqlite/database.inc b/includes/database/sqlite/database.inc index e4b8de67d..d210422b4 100644 --- a/includes/database/sqlite/database.inc +++ b/includes/database/sqlite/database.inc @@ -135,11 +135,11 @@ class DatabaseConnection_sqlite extends DatabaseConnection { return parent::prepare($query, $options); } - public function queryRange($query, array $args, $from, $count, array $options = array()) { + public function queryRange($query, $from, $count, array $args = array(), array $options = array()) { return $this->query($query . ' LIMIT ' . $from . ', ' . $count, $args, $options); } - public function queryTemporary($query, array $args, array $options = array()) { + public function queryTemporary($query, array $args = array(), array $options = array()) { $tablename = $this->generateTemporaryTableName(); $this->query(preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE {' . $tablename . '} AS SELECT', $query), $args, $options); return $tablename; @@ -164,15 +164,6 @@ class DatabaseConnection_sqlite extends DatabaseConnection { // DatabaseStatement_sqlite::execute() and cannot be cached. return $this->prepare($this->prefixTables($query)); } - - /** - * @todo Remove this as soon as db_rewrite_sql() has been exterminated. - */ - public function distinctField($table, $field, $query) { - $field_to_select = 'DISTINCT(' . $table . '.' . $field . ')'; - // (?<!text) is a negative look-behind (no need to rewrite queries that already use DISTINCT). - return preg_replace('/(SELECT.*)(?:' . $table . '\.|\s)(?<!DISTINCT\()(?<!DISTINCT\(' . $table . '\.)' . $field . '(.*FROM )/AUsi', '\1 ' . $field_to_select . '\2', $query); - } } /** diff --git a/includes/pager.inc b/includes/pager.inc index e9e6ea257..554282b49 100644 --- a/includes/pager.inc +++ b/includes/pager.inc @@ -171,76 +171,6 @@ class PagerDefault extends SelectQueryExtender { } /** - * Perform a paged database query. - * - * Use this function when doing select queries you wish to be able to page. The - * pager uses LIMIT-based queries to fetch only the records required to render a - * certain page. However, it has to learn the total number of records returned - * by the query to compute the number of pages (the number of records / records - * per page). This is done by inserting "COUNT(*)" in the original query. For - * example, the query "SELECT nid, type FROM node WHERE status = '1' ORDER BY - * sticky DESC, created DESC" would be rewritten to read "SELECT COUNT(*) FROM - * node WHERE status = '1' ORDER BY sticky DESC, created DESC". Rewriting the - * query is accomplished using a regular expression. - * - * Unfortunately, the rewrite rule does not always work as intended for queries - * that already have a "COUNT(*)" or a "GROUP BY" clause, and possibly for - * other complex queries. In those cases, you can optionally pass a query that - * will be used to count the records. - * - * For example, if you want to page the query "SELECT COUNT(*), TYPE FROM node - * GROUP BY TYPE", pager_query() would invoke the incorrect query "SELECT - * COUNT(*) FROM node GROUP BY TYPE". So instead, you should pass "SELECT - * COUNT(DISTINCT(TYPE)) FROM node" as the optional $count_query parameter. - * - * @param $query - * The SQL query that needs paging. - * @param $limit - * The number of query results to display per page. - * @param $element - * An optional integer to distinguish between multiple pagers on one page. - * @param $count_query - * An SQL query used to count matching records. - * @param ... - * A variable number of arguments which are substituted into the query (and - * the count query) using printf() syntax. Instead of a variable number of - * query arguments, you may also pass a single array containing the query - * arguments. - * @return - * A database query result resource, or FALSE if the query was not executed - * correctly. - * - * @ingroup database - */ -function pager_query($query, $limit = 10, $element = 0, $count_query = NULL) { - global $pager_page_array, $pager_total, $pager_total_items, $pager_limits; - $page = isset($_GET['page']) ? $_GET['page'] : ''; - - // Substitute in query arguments. - $args = func_get_args(); - $args = array_slice($args, 4); - // Alternative syntax for '...' - if (isset($args[0]) && is_array($args[0])) { - $args = $args[0]; - } - - // Construct a count query if none was given. - if (!isset($count_query)) { - $count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query); - } - - // Convert comma-separated $page to an array, used by other functions. - $pager_page_array = explode(',', $page); - - // We calculate the total of pages as ceil(items / limit). - $pager_total_items[$element] = db_query($count_query, $args)->fetchField(); - $pager_total[$element] = ceil($pager_total_items[$element] / $limit); - $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1)); - $pager_limits[$element] = $limit; - return db_query_range($query, $args, $pager_page_array[$element] * $limit, $limit); -} - -/** * Compose a query string to append to pager requests. * * @return diff --git a/includes/tablesort.inc b/includes/tablesort.inc index 5b17f9c94..1a6c9f2f3 100644 --- a/includes/tablesort.inc +++ b/includes/tablesort.inc @@ -146,37 +146,6 @@ function tablesort_init($header) { } /** - * Create an SQL sort clause. - * - * This function produces the ORDER BY clause to insert in your SQL queries, - * assuring that the returned database table rows match the sort order chosen - * by the user. - * - * @param $header - * An array of column headers in the format described in theme_table(). - * @param $before - * An SQL string to insert after ORDER BY and before the table sorting code. - * Useful for sorting by important attributes like "sticky" first. - * @return - * An SQL string to append to the end of a query. - * - * @ingroup database - */ -function tablesort_sql($header, $before = '') { - $ts = tablesort_init($header); - if ($ts['sql']) { - // Based on code from db_escape_table(), but this can also contain a dot. - $field = preg_replace('/[^A-Za-z0-9_.]+/', '', $ts['sql']); - - // Sort order can only be ASC or DESC. - $sort = drupal_strtoupper($ts['sort']); - $sort = in_array($sort, array('ASC', 'DESC')) ? $sort : ''; - - return " ORDER BY $before $field $sort"; - } -} - -/** * Format a column header. * * If the cell in question is the column header for the current sort criterion, diff --git a/includes/update.inc b/includes/update.inc index f7427a8d3..f199784ff 100644 --- a/includes/update.inc +++ b/includes/update.inc @@ -131,10 +131,10 @@ function db_change_column(&$ret, $table, $column, $column_new, $type, $attribute function update_fix_compatibility() { $ret = array(); $incompatible = array(); - $query = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')"); - while ($result = db_fetch_object($query)) { - if (update_check_incompatibility($result->name, $result->type)) { - $incompatible[] = $result->name; + $result = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')"); + foreach ($result as $row) { + if (update_check_incompatibility($row->name, $row->type)) { + $incompatible[] = $row->name; } } if (!empty($incompatible)) { |