$data) { if (is_array($data)) { $new_keys = array(); // $data can't have keys that are a prefix of other keys to // prevent a corrupted result in the below calls to str_replace(). // To avoid this we will use a zero padded indexed array of the values of $data. $pad_length = strlen((string)count(array_values($data))); foreach (array_values($data) as $i => $value) { if (!is_numeric($value)) { $value = "'".$value."'"; } $new_keys[$key . '_' . str_pad($i, $pad_length, '0', STR_PAD_LEFT)] = $value; } $where = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $where); unset($args[$key]); $args += $new_keys; } else if (!is_numeric($data)) { $args[$key] = "'".$data."'"; } } foreach ($args as $key => $data) { $where = str_replace($key, $data, $where); } return $where; } /** * A db_select() that works for any version of Drupal. * * @param $table * String. The table to operate on. * @param $fields * Array or string. Fields affected in this operation. Valid string values are '*' or a single column name. * @param $where * String. WHERE snippet for the operation. It uses named placeholders. see @_drush_replace_query_placeholders() * @param $args * Array. Arguments for the WHERE snippet. * @param $start * Int. Value for OFFSET. * @param $length * Int. Value for LIMIT. * @param $order_by_field * String. Database column to order by. * @param $order_by_direction * ('ASC', 'DESC'). Ordering direction. * @return * A database resource. */ function drush_db_select($table, $fields = '*', $where = NULL, $args = NULL, $start = NULL, $length = NULL, $order_by_field = NULL, $order_by_direction = 'ASC') { if (drush_drupal_major_version() >= 7) { if (!is_array($fields)) { if ($fields == '*') { $fields = array(); } else { $fields = array($fields); } } $query = db_select($table, $table) ->fields($table, $fields); if (!empty($where)) { $query = $query->where($where, $args); } if (isset($order_by_field)) { $query = $query->orderBy($order_by_field, $order_by_direction); } if (isset($length)) { $query = $query->range($start, $length); } return $query->execute(); } else { if (is_array($fields)) { $fields = implode(', ', $fields); } $query = "SELECT $fields FROM {{$table}}"; if (!empty($where)) { $where = _drush_replace_query_placeholders($where, $args); $query .= " WHERE ".$where; } if (isset($order_by_field)) { $query .= " ORDER BY $order_by_field $order_by_direction"; } if (isset($length)) { $sql = drush_sql_get_class(); $db_scheme = $sql->scheme(); if ($db_scheme == 'oracle') return db_query_range($query, $start, $length); else { $limit = " LIMIT $length"; if (isset($start)) { $limit .= " OFFSET $start"; } $query .= $limit; } } return db_query($query, $args); } } /** * A db_delete() that works for any version of Drupal. * * @param $table * String. The table to operate on. * @param $where * String. WHERE snippet for the operation. It uses named placeholders. see @_drush_replace_query_placeholders() * @param $args * Array. Arguments for the WHERE snippet. * @return * Affected rows (except on D7+mysql without a WHERE clause - returns TRUE) or FALSE. */ function drush_db_delete($table, $where = NULL, $args = NULL) { if (drush_drupal_major_version() >= 7) { if (!empty($where)) { $query = db_delete($table)->where($where, $args); return $query->execute(); } else { return db_truncate($table)->execute(); } } else { $query = "DELETE FROM {{$table}}"; if (!empty($where)) { $where = _drush_replace_query_placeholders($where, $args); $query .= ' WHERE '.$where; } if (!db_query($query, $args)) { return FALSE; } return db_affected_rows(); } } /** * A db_result() that works consistently for any version of Drupal. * * @param * A Database result object. */ function drush_db_result($result) { switch (drush_drupal_major_version()) { case 6: return db_result($result); case 7: default: return $result->fetchField(); } } /** * A db_fetch_object() that works for any version of Drupal. * * @param * A Database result object. */ function drush_db_fetch_object($result) { return drush_drupal_major_version() >= 7 ? $result->fetchObject() : db_fetch_object($result); } /** * @} End of "defgroup dbfunctions". */