summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
Diffstat (limited to 'includes')
-rw-r--r--includes/database/mysql/query.inc10
-rw-r--r--includes/database/pgsql/query.inc6
-rw-r--r--includes/database/query.inc69
-rw-r--r--includes/database/select.inc5
-rw-r--r--includes/database/sqlite/query.inc12
5 files changed, 88 insertions, 14 deletions
diff --git a/includes/database/mysql/query.inc b/includes/database/mysql/query.inc
index 843e22dfd..63c0fe8e7 100644
--- a/includes/database/mysql/query.inc
+++ b/includes/database/mysql/query.inc
@@ -43,6 +43,8 @@ class InsertQuery_mysql extends InsertQuery {
}
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
// Default fields are always placed first for consistency.
$insert_fields = array_merge($this->defaultFields, $this->insertFields);
@@ -50,10 +52,10 @@ class InsertQuery_mysql extends InsertQuery {
// If we're selecting from a SelectQuery, finish building the query and
// pass it back, as any remaining options are irrelevant.
if (!empty($this->fromQuery)) {
- return "INSERT INTO {" . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
}
- $query = "INSERT INTO {" . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
+ $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
$max_placeholder = 0;
$values = array();
@@ -143,6 +145,8 @@ class MergeQuery_mysql extends MergeQuery {
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
// Set defaults.
if ($this->updateFields) {
@@ -164,7 +168,7 @@ class MergeQuery_mysql extends MergeQuery {
$insert_fields = $this->insertFields + $this->keyFields;
- $query = "INSERT INTO {" . $this->table . '} (' . implode(', ', array_keys($insert_fields)) . ') VALUES ';
+ $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', array_keys($insert_fields)) . ') VALUES ';
$max_placeholder = 0;
$values = array();
diff --git a/includes/database/pgsql/query.inc b/includes/database/pgsql/query.inc
index 0420f4aad..cb1b94ba2 100644
--- a/includes/database/pgsql/query.inc
+++ b/includes/database/pgsql/query.inc
@@ -71,6 +71,8 @@ class InsertQuery_pgsql extends InsertQuery {
}
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
// Default fields are always placed first for consistency.
$insert_fields = array_merge($this->defaultFields, $this->insertFields);
@@ -78,10 +80,10 @@ class InsertQuery_pgsql extends InsertQuery {
// If we're selecting from a SelectQuery, finish building the query and
// pass it back, as any remaining options are irrelevant.
if (!empty($this->fromQuery)) {
- return "INSERT INTO {" . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
}
- $query = "INSERT INTO {" . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
+ $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
$max_placeholder = 0;
$values = array();
diff --git a/includes/database/query.inc b/includes/database/query.inc
index 2e775bea5..3e6987235 100644
--- a/includes/database/query.inc
+++ b/includes/database/query.inc
@@ -240,6 +240,13 @@ abstract class Query implements QueryPlaceholderInterface {
*/
protected $nextPlaceholder = 0;
+ /**
+ * An array of comments that can be prepended to a query.
+ *
+ * @var array
+ */
+ protected $comments = array();
+
public function __construct(DatabaseConnection $connection, $options) {
$this->connection = $connection;
$this->queryOptions = $options;
@@ -263,6 +270,44 @@ abstract class Query implements QueryPlaceholderInterface {
public function nextPlaceholder() {
return $this->nextPlaceholder++;
}
+
+ /**
+ * Adds a comment to the query.
+ *
+ * By adding a comment to a query, you can more easily find it in your
+ * query log or the list of active queries on an sql server. This allows
+ * for easier debugging and allows you to more easily find where a query
+ * with a performance problem is being generated.
+ *
+ * @param $comment
+ * The comment string to be inserted into the query.
+ * @return Query
+ * The called object.
+ */
+ public function comment($comment) {
+ $this->comments[] = $comment;
+ return $this;
+ }
+
+ /**
+ * Returns a reference to the comments array for the query.
+ *
+ * Because this method returns by reference, alter hooks may edit the comments
+ * array directly to make their changes. If just adding comments, however, the
+ * use of comment() is preferred.
+ *
+ * Note that this method must be called by reference as well:
+ *
+ * @code
+ * $comments =& $query->getComments();
+ * @endcode
+ *
+ * @return
+ * A reference to the comments array structure.
+ */
+ public function &getComments() {
+ return $this->comments;
+ }
}
/**
@@ -468,11 +513,14 @@ class InsertQuery extends Query {
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
// Default fields are always placed first for consistency.
$insert_fields = array_merge($this->defaultFields, $this->insertFields);
if (!empty($this->fromQuery)) {
- return "INSERT INTO {" . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') ' . $this->fromQuery;
}
// For simplicity, we will use the $placeholders array to inject
@@ -482,7 +530,7 @@ class InsertQuery extends Query {
$placeholders = array_pad($placeholders, count($this->defaultFields), 'default');
$placeholders = array_pad($placeholders, count($this->insertFields), '?');
- return 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES (' . implode(', ', $placeholders) . ')';
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES (' . implode(', ', $placeholders) . ')';
}
/**
@@ -900,7 +948,11 @@ class DeleteQuery extends Query implements QueryConditionInterface {
}
public function __toString() {
- $query = 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
+
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
+ $query = $comments . 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
if (count($this->condition)) {
@@ -940,7 +992,10 @@ class TruncateQuery extends Query {
}
public function __toString() {
- return 'TRUNCATE {' . $this->connection->escapeTable($this->table) . '} ';
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
+ return $comments . 'TRUNCATE {' . $this->connection->escapeTable($this->table) . '} ';
}
}
@@ -1100,6 +1155,10 @@ class UpdateQuery extends Query implements QueryConditionInterface {
}
public function __toString() {
+
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
// Expressions take priority over literal fields, so we process those first
// and remove any literal fields that conflict.
$fields = $this->fields;
@@ -1114,7 +1173,7 @@ class UpdateQuery extends Query implements QueryConditionInterface {
$update_fields[] = $field . '=:db_update_placeholder_' . ($max_placeholder++);
}
- $query = 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
+ $query = $comments . 'UPDATE {' . $this->connection->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
if (count($this->condition)) {
$this->condition->compile($this->connection, $this);
diff --git a/includes/database/select.inc b/includes/database/select.inc
index ddb78c69d..5cb4c04f4 100644
--- a/includes/database/select.inc
+++ b/includes/database/select.inc
@@ -1317,8 +1317,11 @@ class SelectQuery extends Query implements SelectQueryInterface {
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
// SELECT
- $query = 'SELECT ';
+ $query = $comments . 'SELECT ';
if ($this->distinct) {
$query .= 'DISTINCT ';
}
diff --git a/includes/database/sqlite/query.inc b/includes/database/sqlite/query.inc
index de8f7f212..08c929bf3 100644
--- a/includes/database/sqlite/query.inc
+++ b/includes/database/sqlite/query.inc
@@ -33,16 +33,19 @@ class InsertQuery_sqlite extends InsertQuery {
}
public function __toString() {
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
// Produce as many generic placeholders as necessary.
$placeholders = array_fill(0, count($this->insertFields), '?');
// If we're selecting from a SelectQuery, finish building the query and
// pass it back, as any remaining options are irrelevant.
if (!empty($this->fromQuery)) {
- return "INSERT INTO {" . $this->table . '} (' . implode(', ', $this->insertFields) . ') ' . $this->fromQuery;
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $this->insertFields) . ') ' . $this->fromQuery;
}
- return 'INSERT INTO {' . $this->table . '} (' . implode(', ', $this->insertFields) . ') VALUES (' . implode(', ', $placeholders) . ')';
+ return $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $this->insertFields) . ') VALUES (' . implode(', ', $placeholders) . ')';
}
}
@@ -143,7 +146,10 @@ class DeleteQuery_sqlite extends DeleteQuery {
*/
class TruncateQuery_sqlite extends TruncateQuery {
public function __toString() {
- return 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
+ // Create a comments string to prepend to the query.
+ $comments = (!empty($this->comments)) ? '/* ' . implode('; ', $this->comments) . ' */ ' : '';
+
+ return $comments . 'DELETE FROM {' . $this->connection->escapeTable($this->table) . '} ';
}
}