From 6f04aba061be1202b7f987db6bac03014cf01aeb Mon Sep 17 00:00:00 2001 From: mistic100 Date: Wed, 30 Jan 2013 11:12:22 +0000 Subject: feature:65 Add support for PHP mysqli extension, activated by default, remove returns of link_identifier git-svn-id: http://piwigo.org/svn/trunk@20462 68402e56-0260-453c-a942-63ccdbb3a9ee --- include/dblayer/functions_mysql.inc.php | 14 +- include/dblayer/functions_mysqli.inc.php | 798 +++++++++++++++++++++++++++++++ 2 files changed, 803 insertions(+), 9 deletions(-) create mode 100644 include/dblayer/functions_mysqli.inc.php (limited to 'include/dblayer') diff --git a/include/dblayer/functions_mysql.inc.php b/include/dblayer/functions_mysql.inc.php index 0b2c35195..f8182bdf4 100644 --- a/include/dblayer/functions_mysql.inc.php +++ b/include/dblayer/functions_mysql.inc.php @@ -40,11 +40,7 @@ function pwg_db_connect($host, $user, $password, $database) { throw new Exception("Can't connect to server"); } - if (mysql_select_db($database, $link)) - { - return $link; - } - else + if (!mysql_select_db($database, $link)) { throw new Exception('Connection to server succeed, but it was impossible to connect to database'); } @@ -138,7 +134,7 @@ SELECT IF(MAX('.$column.')+1 IS NULL, 1, MAX('.$column.')+1) return $next; } -function pwg_db_changes($result) +function pwg_db_changes() { return mysql_affected_rows(); } @@ -173,14 +169,14 @@ function pwg_db_real_escape_string($s) return mysql_real_escape_string($s); } -function pwg_db_insert_id($table=null, $column='id') +function pwg_db_insert_id() { return mysql_insert_id(); } -function pwg_db_close($link=null) +function pwg_db_close() { - return mysql_close($link); + return mysql_close(); } /** diff --git a/include/dblayer/functions_mysqli.inc.php b/include/dblayer/functions_mysqli.inc.php new file mode 100644 index 000000000..af42b865b --- /dev/null +++ b/include/dblayer/functions_mysqli.inc.php @@ -0,0 +1,798 @@ +select_db($database)) + { + throw new Exception('Connection to server succeed, but it was impossible to connect to database'); + } +} + +function pwg_db_check_charset() +{ + $db_charset = 'utf8'; + if (defined('DB_CHARSET') and DB_CHARSET != '') + { + $db_charset = DB_CHARSET; + } + pwg_query('SET NAMES "'.$db_charset.'"'); +} + +function pwg_db_check_version() +{ + $current_mysql = pwg_get_db_version(); + if (version_compare($current_mysql, REQUIRED_MYSQL_VERSION, '<')) + { + fatal_error( + sprintf( + 'your MySQL version is too old, you have "%s" and you need at least "%s"', + $current_mysql, + REQUIRED_MYSQL_VERSION + ) + ); + } +} + +function pwg_get_db_version() +{ + global $mysqli; + + return $mysqli->server_info; +} + +function pwg_query($query) +{ + global $mysqli, $conf, $page, $debug, $t2; + + $start = microtime(true); + ($result = $mysqli->query($query)) or my_error($query, $conf['die_on_sql_error']); + + $time = microtime(true) - $start; + + if (!isset($page['count_queries'])) + { + $page['count_queries'] = 0; + $page['queries_time'] = 0; + } + + $page['count_queries']++; + $page['queries_time']+= $time; + + if ($conf['show_queries']) + { + $output = ''; + $output.= '
['.$page['count_queries'].'] ';
+    $output.= "\n".$query;
+    $output.= "\n".'(this query time : ';
+    $output.= ''.number_format($time, 3, '.', ' ').' s)';
+    $output.= "\n".'(total SQL time  : ';
+    $output.= number_format($page['queries_time'], 3, '.', ' ').' s)';
+    $output.= "\n".'(total time      : ';
+    $output.= number_format( ($time+$start-$t2), 3, '.', ' ').' s)';
+    if ( $result!=null and preg_match('/\s*SELECT\s+/i',$query) )
+    {
+      $output.= "\n".'(num rows        : ';
+      $output.= pwg_db_num_rows($result).' )';
+    }
+    elseif ( $result!=null
+      and preg_match('/\s*INSERT|UPDATE|REPLACE|DELETE\s+/i',$query) )
+    {
+      $output.= "\n".'(affected rows   : ';
+      $output.= pwg_db_changes().' )';
+    }
+    $output.= "
\n"; + + $debug .= $output; + } + + return $result; +} + +function pwg_db_nextval($column, $table) +{ + $query = ' +SELECT IF(MAX('.$column.')+1 IS NULL, 1, MAX('.$column.')+1) + FROM '.$table; + list($next) = pwg_db_fetch_row(pwg_query($query)); + + return $next; +} + +function pwg_db_changes() +{ + global $mysqli; + + return $mysqli->affected_rows; +} + +function pwg_db_num_rows($result) +{ + return $result->num_rows; +} + +function pwg_db_fetch_assoc($result) +{ + return $result->fetch_assoc(); +} + +function pwg_db_fetch_row($result) +{ + return $result->fetch_row(); +} + +function pwg_db_fetch_object($result) +{ + return $result->fetch_object(); +} + +function pwg_db_free_result($result) +{ + return $result->free_result(); +} + +function pwg_db_real_escape_string($s) +{ + global $mysqli; + + return $mysqli->real_escape_string($s); +} + +function pwg_db_insert_id() +{ + global $mysqli; + + return $mysqli->insert_id; +} + +function pwg_db_close() +{ + global $mysqli; + + return $mysqli->close(); +} + +/** + * + * complex functions + * + */ + +/** + * creates an array based on a query, this function is a very common pattern + * used here + * + * @param string $query + * @param string $fieldname optional + * @return array + */ +function array_from_query($query, $fieldname=false) +{ + $array = array(); + + $result = pwg_query($query); + if (false === $fieldname) + { + while ($row = pwg_db_fetch_assoc($result)) + { + $array[] = $row; + } + } + else + { + while ($row = pwg_db_fetch_assoc($result)) + { + $array[] = $row[$fieldname]; + } + } + return $array; +} + +define('MASS_UPDATES_SKIP_EMPTY', 1); +/** + * updates multiple lines in a table + * + * @param string table_name + * @param array dbfields + * @param array datas + * @param int flags - if MASS_UPDATES_SKIP_EMPTY - empty values do not overwrite existing ones + * @return void + */ +function mass_updates($tablename, $dbfields, $datas, $flags=0) +{ + if (count($datas) == 0) + return; + + // depending on the MySQL version, we use the multi table update or N update queries + if (count($datas) < 10) + { + foreach ($datas as $data) + { + $query = ' +UPDATE '.$tablename.' + SET '; + $is_first = true; + foreach ($dbfields['update'] as $key) + { + $separator = $is_first ? '' : ",\n "; + + if (isset($data[$key]) and $data[$key] != '') + { + $query.= $separator.$key.' = \''.$data[$key].'\''; + } + else + { + if ( $flags & MASS_UPDATES_SKIP_EMPTY ) + continue; // next field + $query.= "$separator$key = NULL"; + } + $is_first = false; + } + if (!$is_first) + {// only if one field at least updated + $query.= ' + WHERE '; + $is_first = true; + foreach ($dbfields['primary'] as $key) + { + if (!$is_first) + { + $query.= ' AND '; + } + if ( isset($data[$key]) ) + { + $query.= $key.' = \''.$data[$key].'\''; + } + else + { + $query.= $key.' IS NULL'; + } + $is_first = false; + } + pwg_query($query); + } + } // foreach update + } // if mysqli_ver or count $value) + { + $separator = $is_first ? '' : ",\n "; + + if (isset($value) and $value !== '') + { + $query.= $separator.$key.' = \''.$value.'\''; + } + else + { + if ( $flags & MASS_UPDATES_SKIP_EMPTY ) + continue; // next field + $query.= "$separator$key = NULL"; + } + $is_first = false; + } + if (!$is_first) + {// only if one field at least updated + $query.= ' + WHERE '; + $is_first = true; + foreach ($where_fields as $key => $value) + { + if (!$is_first) + { + $query.= ' AND '; + } + if ( isset($value) ) + { + $query.= $key.' = \''.$value.'\''; + } + else + { + $query.= $key.' IS NULL'; + } + $is_first = false; + } + pwg_query($query); + } +} + + +/** + * inserts multiple lines in a table + * + * @param string table_name + * @param array dbfields + * @param array inserts + * @return void + */ +function mass_inserts($table_name, $dbfields, $datas, $options=array()) +{ + $ignore = ''; + if (isset($options['ignore']) and $options['ignore']) + { + $ignore = 'IGNORE'; + } + + if (count($datas) != 0) + { + $first = true; + + $query = 'SHOW VARIABLES LIKE \'max_allowed_packet\''; + list(, $packet_size) = pwg_db_fetch_row(pwg_query($query)); + $packet_size = $packet_size - 2000; // The last list of values MUST not exceed 2000 character*/ + $query = ''; + + foreach ($datas as $insert) + { + if (strlen($query) >= $packet_size) + { + pwg_query($query); + $first = true; + } + + if ($first) + { + $query = ' +INSERT '.$ignore.' INTO '.$table_name.' + ('.implode(',', $dbfields).') + VALUES'; + $first = false; + } + else + { + $query .= ' + , '; + } + + $query .= '('; + foreach ($dbfields as $field_id => $dbfield) + { + if ($field_id > 0) + { + $query .= ','; + } + + if (!isset($insert[$dbfield]) or $insert[$dbfield] === '') + { + $query .= 'NULL'; + } + else + { + $query .= "'".$insert[$dbfield]."'"; + } + } + $query .= ')'; + } + pwg_query($query); + } +} + +/** + * inserts one line in a table + * + * @param string table_name + * @param array dbfields + * @param array insert + * @return void + */ +function single_insert($table_name, $data) +{ + if (count($data) != 0) + { + $query = ' +INSERT INTO '.$table_name.' + ('.implode(',', array_keys($data)).') + VALUES'; + + $query .= '('; + $is_first = true; + foreach ($data as $key => $value) + { + if (!$is_first) + { + $query .= ','; + } + else + { + $is_first = false; + } + + if ($value === '') + { + $query .= 'NULL'; + } + else + { + $query .= "'".$value."'"; + } + } + $query .= ')'; + + pwg_query($query); + } +} + +/** + * Do maintenance on all PWG tables + * + * @return none + */ +function do_maintenance_all_tables() +{ + global $prefixeTable, $page; + + $all_tables = array(); + + // List all tables + $query = 'SHOW TABLES LIKE \''.$prefixeTable.'%\''; + $result = pwg_query($query); + while ($row = pwg_db_fetch_row($result)) + { + array_push($all_tables, $row[0]); + } + + // Repair all tables + $query = 'REPAIR TABLE '.implode(', ', $all_tables); + $mysqli_rc = pwg_query($query); + + // Re-Order all tables + foreach ($all_tables as $table_name) + { + $all_primary_key = array(); + + $query = 'DESC '.$table_name.';'; + $result = pwg_query($query); + while ($row = pwg_db_fetch_assoc($result)) + { + if ($row['Key'] == 'PRI') + { + array_push($all_primary_key, $row['Field']); + } + } + + if (count($all_primary_key) != 0) + { + $query = 'ALTER TABLE '.$table_name.' ORDER BY '.implode(', ', $all_primary_key).';'; + $mysqli_rc = $mysqli_rc && pwg_query($query); + } + } + + // Optimize all tables + $query = 'OPTIMIZE TABLE '.implode(', ', $all_tables); + $mysqli_rc = $mysqli_rc && pwg_query($query); + if ($mysqli_rc) + { + array_push( + $page['infos'], + l10n('All optimizations have been successfully completed.') + ); + } + else + { + array_push( + $page['errors'], + l10n('Optimizations have been completed with some errors.') + ); + } +} + +function pwg_db_concat($array) +{ + $string = implode($array, ','); + return 'CONCAT('. $string.')'; +} + +function pwg_db_concat_ws($array, $separator) +{ + $string = implode($array, ','); + return 'CONCAT_WS(\''.$separator.'\','. $string.')'; +} + +function pwg_db_cast_to_text($string) +{ + return $string; +} + +/** + * returns an array containing the possible values of an enum field + * + * @param string tablename + * @param string fieldname + */ +function get_enums($table, $field) +{ + // retrieving the properties of the table. Each line represents a field : + // columns are 'Field', 'Type' + $result = pwg_query('desc '.$table); + while ($row = pwg_db_fetch_assoc($result)) + { + // we are only interested in the the field given in parameter for the + // function + if ($row['Field'] == $field) + { + // retrieving possible values of the enum field + // enum('blue','green','black') + $options = explode(',', substr($row['Type'], 5, -1)); + foreach ($options as $i => $option) + { + $options[$i] = str_replace("'", '',$option); + } + } + } + pwg_db_free_result($result); + return $options; +} + +/** + * Smartly checks if a variable is equivalent to true or false + * + * @param mixed input + * @return bool + */ +function get_boolean($input) +{ + if ('false' === strtolower($input)) + { + return false; + } + + return (bool)$input; +} + +/** + * returns boolean string 'true' or 'false' if the given var is boolean + * + * @param mixed $var + * @return mixed + */ +function boolean_to_string($var) +{ + if (is_bool($var)) + { + return $var ? 'true' : 'false'; + } + else + { + return $var; + } +} + +/** + * + * interval and date functions + * + */ + +function pwg_db_get_recent_period_expression($period, $date='CURRENT_DATE') +{ + if ($date!='CURRENT_DATE') + { + $date = '\''.$date.'\''; + } + + return 'SUBDATE('.$date.',INTERVAL '.$period.' DAY)'; +} + +function pwg_db_get_recent_period($period, $date='CURRENT_DATE') +{ + $query = ' +SELECT '.pwg_db_get_recent_period_expression($period); + list($d) = pwg_db_fetch_row(pwg_query($query)); + + return $d; +} + +function pwg_db_get_flood_period_expression($seconds) +{ + return 'SUBDATE(now(), INTERVAL '.$seconds.' SECOND)'; +} + +function pwg_db_get_hour($date) +{ + return 'hour('.$date.')'; +} + +function pwg_db_get_date_YYYYMM($date) +{ + return 'DATE_FORMAT('.$date.', \'%Y%m\')'; +} + +function pwg_db_get_date_MMDD($date) +{ + return 'DATE_FORMAT('.$date.', \'%m%d\')'; +} + +function pwg_db_get_year($date) +{ + return 'YEAR('.$date.')'; +} + +function pwg_db_get_month($date) +{ + return 'MONTH('.$date.')'; +} + +function pwg_db_get_week($date, $mode=null) +{ + if ($mode) + { + return 'WEEK('.$date.', '.$mode.')'; + } + else + { + return 'WEEK('.$date.')'; + } +} + +function pwg_db_get_dayofmonth($date) +{ + return 'DAYOFMONTH('.$date.')'; +} + +function pwg_db_get_dayofweek($date) +{ + return 'DAYOFWEEK('.$date.')'; +} + +function pwg_db_get_weekday($date) +{ + return 'WEEKDAY('.$date.')'; +} + +function pwg_db_date_to_ts($date) +{ + return 'UNIX_TIMESTAMP('.$date.')'; +} + +// my_error returns (or send to standard output) the message concerning the +// error occured for the last mysql query. +function my_error($header, $die) +{ + global $mysqli; + + $error = "[mysql error ".$mysqli->errno.'] '.$mysqli->error."\n"; + $error .= $header; + + if ($die) + { + fatal_error($error); + } + echo("
");
+  trigger_error($error, E_USER_WARNING);
+  echo("
"); +} + +?> \ No newline at end of file -- cgit v1.2.3