00001 <?php
00002
00003
00009
00010
00011
00017
00018 require_once './includes/database.mysql-common.inc';
00019
00023 function db_status_report($phase) {
00024 $t = get_t();
00025
00026 $version = db_version();
00027
00028 $form['mysql'] = array(
00029 'title' => $t('MySQL database'),
00030 'value' => ($phase == 'runtime') ? l($version, 'admin/reports/status/sql') : $version,
00031 );
00032
00033 if (version_compare($version, DRUPAL_MINIMUM_MYSQL) < 0) {
00034 $form['mysql']['severity'] = REQUIREMENT_ERROR;
00035 $form['mysql']['description'] = $t('Your MySQL Server is too old. Drupal requires at least MySQL %version.', array('%version' => DRUPAL_MINIMUM_MYSQL));
00036 }
00037
00038 return $form;
00039 }
00040
00046 function db_version() {
00047 global $active_db;
00048 list($version) = explode('-', mysqli_get_server_info($active_db));
00049 return $version;
00050 }
00051
00057 function db_connect($url) {
00058
00059 if (!function_exists('mysqli_init') && !extension_loaded('mysqli')) {
00060 _db_error_page('Unable to use the MySQLi database because the MySQLi extension for PHP is not installed. Check your <code>php.ini</code> to see how you can enable it.');
00061 }
00062
00063 $url = parse_url($url);
00064
00065
00066 $url['user'] = urldecode($url['user']);
00067
00068 $url['pass'] = isset($url['pass']) ? urldecode($url['pass']) : '';
00069 $url['host'] = urldecode($url['host']);
00070 $url['path'] = urldecode($url['path']);
00071 if (!isset($url['port'])) {
00072 $url['port'] = NULL;
00073 }
00074
00075 $connection = mysqli_init();
00076 @mysqli_real_connect($connection, $url['host'], $url['user'], $url['pass'], substr($url['path'], 1), $url['port'], NULL, MYSQLI_CLIENT_FOUND_ROWS);
00077
00078 if (mysqli_connect_errno() > 0) {
00079 _db_error_page(mysqli_connect_error());
00080 }
00081
00082
00083 mysqli_query($connection, 'SET NAMES "utf8"');
00084
00085 mysqli_query($connection, "SET SESSION sql_mode='ANSI'");
00086
00087 return $connection;
00088 }
00089
00093 function _db_query($query, $debug = 0) {
00094 global $active_db, $queries, $user;
00095
00096 if (variable_get('dev_query', 0)) {
00097 list($usec, $sec) = explode(' ', microtime());
00098 $timer = (float)$usec + (float)$sec;
00099
00100
00101
00102 $bt = debug_backtrace();
00103
00104 $name = $user->uid ? $user->name : variable_get('anonymous', 'Anonymous');
00105
00106 $name = str_replace(array('*', '/'), '', $name);
00107 $query = '/* ' . $name . ' : ' . $bt[2]['function'] . ' */ ' . $query;
00108 }
00109
00110 $result = mysqli_query($active_db, $query);
00111
00112 if (variable_get('dev_query', 0)) {
00113 $query = $bt[2]['function'] . "\n" . $query;
00114 list($usec, $sec) = explode(' ', microtime());
00115 $stop = (float)$usec + (float)$sec;
00116 $diff = $stop - $timer;
00117 $queries[] = array($query, $diff);
00118 }
00119
00120 if ($debug) {
00121 print '<p>query: ' . $query . '<br />error:' . mysqli_error($active_db) . '</p>';
00122 }
00123
00124 if (!mysqli_errno($active_db)) {
00125 return $result;
00126 }
00127 else {
00128
00129 ${DB_ERROR} = TRUE;
00130 trigger_error(check_plain(mysqli_error($active_db) . "\nquery: " . $query), E_USER_WARNING);
00131 return FALSE;
00132 }
00133 }
00134
00144 function db_fetch_object($result) {
00145 if ($result) {
00146 $object = mysqli_fetch_object($result);
00147 return isset($object) ? $object : FALSE;
00148 }
00149 }
00150
00161 function db_fetch_array($result) {
00162 if ($result) {
00163 $array = mysqli_fetch_array($result, MYSQLI_ASSOC);
00164 return isset($array) ? $array : FALSE;
00165 }
00166 }
00167
00179 function db_result($result) {
00180 if ($result && mysqli_num_rows($result) > 0) {
00181
00182
00183 $array = mysqli_fetch_row($result);
00184 return $array[0];
00185 }
00186 return FALSE;
00187 }
00188
00192 function db_error() {
00193 global $active_db;
00194 return mysqli_errno($active_db);
00195 }
00196
00200 function db_affected_rows() {
00201 global $active_db;
00202 return mysqli_affected_rows($active_db);
00203 }
00204
00233 function db_query_range($query) {
00234 $args = func_get_args();
00235 $count = array_pop($args);
00236 $from = array_pop($args);
00237 array_shift($args);
00238
00239 $query = db_prefix_tables($query);
00240 if (isset($args[0]) and is_array($args[0])) {
00241 $args = $args[0];
00242 }
00243 _db_query_callback($args, TRUE);
00244 $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
00245 $query .= ' LIMIT ' . (int)$from . ', ' . (int)$count;
00246 return _db_query($query);
00247 }
00248
00281 function db_query_temporary($query) {
00282 $args = func_get_args();
00283 $tablename = array_pop($args);
00284 array_shift($args);
00285
00286 $query = preg_replace('/^SELECT/i', 'CREATE TEMPORARY TABLE ' . $tablename . ' Engine=HEAP SELECT', db_prefix_tables($query));
00287 if (isset($args[0]) and is_array($args[0])) {
00288 $args = $args[0];
00289 }
00290 _db_query_callback($args, TRUE);
00291 $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query);
00292 return _db_query($query);
00293 }
00294
00303 function db_encode_blob($data) {
00304 global $active_db;
00305 return "'" . mysqli_real_escape_string($active_db, $data) . "'";
00306 }
00307
00316 function db_decode_blob($data) {
00317 return $data;
00318 }
00319
00323 function db_escape_string($text) {
00324 global $active_db;
00325 return mysqli_real_escape_string($active_db, $text);
00326 }
00327
00331 function db_lock_table($table) {
00332 db_query('LOCK TABLES {' . db_escape_table($table) . '} WRITE');
00333 }
00334
00338 function db_unlock_tables() {
00339 db_query('UNLOCK TABLES');
00340 }
00341
00345 function db_table_exists($table) {
00346 return (bool) db_fetch_object(db_query("SHOW TABLES LIKE '{" . db_escape_table($table) . "}'"));
00347 }
00348
00352 function db_column_exists($table, $column) {
00353 return (bool) db_fetch_object(db_query("SHOW COLUMNS FROM {" . db_escape_table($table) . "} LIKE '" . db_escape_table($column) . "'"));
00354 }
00355
00367 function db_distinct_field($table, $field, $query) {
00368 $field_to_select = 'DISTINCT(' . $table . '.' . $field . ')';
00369
00370 return preg_replace('/(SELECT.*)(?:' . $table . '\.|\s)(?<!DISTINCT\()(?<!DISTINCT\(' . $table . '\.)' . $field . '(.*FROM )/AUsi', '\1 ' . $field_to_select . '\2', $query);
00371 }
00372