summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2010-11-29 19:57:57 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2010-11-29 19:57:57 +0000
commitc1ea227f529512739f80f16b33969532f4218049 (patch)
tree6d6a024c749f4df201155a5f009201ed4a0f3e09
parentb2c5a8c864f9abd26c5cff8eb2421713cfb25841 (diff)
downloadbrdo-c1ea227f529512739f80f16b33969532f4218049.tar.gz
brdo-c1ea227f529512739f80f16b33969532f4218049.tar.bz2
#851136: Committing missing files.
-rw-r--r--includes/database/pgsql/select.inc109
-rw-r--r--includes/database/sqlite/select.inc28
2 files changed, 137 insertions, 0 deletions
diff --git a/includes/database/pgsql/select.inc b/includes/database/pgsql/select.inc
new file mode 100644
index 000000000..98061c90a
--- /dev/null
+++ b/includes/database/pgsql/select.inc
@@ -0,0 +1,109 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Select builder for PostgreSQL database engine.
+ */
+
+/**
+ * @ingroup database
+ * @{
+ */
+
+class SelectQuery_pgsql extends SelectQuery {
+
+ public function orderRandom() {
+ $alias = $this->addExpression('RANDOM()', 'random_field');
+ $this->orderBy($alias);
+ return $this;
+ }
+
+ /**
+ * Overrides SelectQuery::orderBy().
+ *
+ * PostgreSQL adheres strictly to the SQL-92 standard and requires that when
+ * using DISTINCT or GROUP BY conditions, fields and expressions that are
+ * ordered on also need to be selected. This is a best effort implementation
+ * to handle the cases that can be automated by adding the field if it is not
+ * yet selected.
+ *
+ * @code
+ * $query = db_select('node', 'n');
+ * $query->join('node_revision', 'nr', 'n.vid = nr.vid');
+ * $query
+ * ->distinct()
+ * ->fields('n')
+ * ->orderBy('timestamp');
+ * @endcode
+ *
+ * In this query, it is not possible (without relying on the schema) to know
+ * whether timestamp belongs to node_revisions and needs to be added or
+ * belongs to node and is already selected. Queries like this will need to be
+ * corrected in the original query by adding an explicit call to
+ * SelectQuery::addField() or SelectQuery::fields().
+ *
+ * Since this has a small performance impact, both by the additional
+ * processing in this function and in the database that needs to return the
+ * additional fields, this is done as an override instead of implementing it
+ * directly in SelectQuery::orderBy().
+ */
+ public function orderBy($field, $direction = 'ASC') {
+ // Call parent function to order on this.
+ $return = parent::orderBy($field, $direction);
+
+ // If there is a table alias specified, split it up.
+ if (strpos($field, '.') !== FALSE) {
+ list($table, $table_field) = explode('.', $field);
+ }
+ // Figure out if the field has already been added.
+ foreach ($this->fields as $existing_field) {
+ if (!empty($table)) {
+ // If table alias is given, check if field and table exists.
+ if ($existing_field['table'] == $table && $existing_field['field'] == $table_field) {
+ return $return;
+ }
+ }
+ else {
+ // If there is no table, simply check if the field exists as a field or
+ // an aliased field.
+ if ($existing_field['alias'] == $field) {
+ return $return;
+ }
+ }
+ }
+
+ // Also check expression aliases.
+ foreach ($this->expressions as $expression) {
+ if ($expression['alias'] == $field) {
+ return $return;
+ }
+ }
+
+ // If a table loads all fields, it can not be added again. It would
+ // result in an ambigious alias error because that field would be loaded
+ // twice: Once through table_alias.* and once directly. If the field
+ // actually belongs to a different table, it must be added manually.
+ foreach ($this->tables as $table) {
+ if (!empty($table['all_fields'])) {
+ return $return;
+ }
+ }
+
+ // If $field contains an characters which are not allowed in a field name
+ // it is considered an expression, these can't be handeld automatically
+ // either.
+ if ($this->connection->escapeField($field) != $field) {
+ return $return;
+ }
+
+ // This is a case that can be handled automatically, add the field.
+ $this->addField(NULL, $field);
+ return $return;
+ }
+}
+
+/**
+ * @} End of "ingroup database".
+ */
+
diff --git a/includes/database/sqlite/select.inc b/includes/database/sqlite/select.inc
new file mode 100644
index 000000000..ee3d84dff
--- /dev/null
+++ b/includes/database/sqlite/select.inc
@@ -0,0 +1,28 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Select builder for SQLite embedded database engine.
+ */
+
+/**
+ * @ingroup database
+ * @{
+ */
+
+/**
+ * SQLite specific query builder for SELECT statements.
+ */
+class SelectQuery_sqlite extends SelectQuery {
+ public function forUpdate($set = TRUE) {
+ // SQLite does not support FOR UPDATE so nothing to do.
+ return $this;
+ }
+}
+
+/**
+ * @} End of "ingroup database".
+ */
+
+