diff -r 5e1f1e916419 -r 98bbc533541c punbb/include/dblayer/mysqli.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/punbb/include/dblayer/mysqli.php Sun Apr 06 00:28:50 2008 -0400 @@ -0,0 +1,315 @@ +prefix = $db_prefix; + + // Was a custom port supplied with $db_host? + if (strpos($db_host, ':') !== false) + list($db_host, $db_port) = explode(':', $db_host); + + if (isset($db_port)) + $this->link_id = @mysqli_connect($db_host, $db_username, $db_password, $db_name, $db_port); + else + $this->link_id = @mysqli_connect($db_host, $db_username, $db_password, $db_name); + + if (!$this->link_id) + error('Unable to connect to MySQL and select database. MySQL reported: '.mysqli_connect_error(), __FILE__, __LINE__); + + // Setup the client-server character set (UTF-8) + if (!defined('PUN_NO_SET_NAMES')) + mysqli_query($this->link_id, 'SET NAMES \'utf8\'') or error(__FILE__, __LINE__); + } + + + function start_transaction() + { + return; + } + + + function end_transaction() + { + return; + } + + + function query($sql, $unbuffered = false) + { + if (strlen($sql) > 140000) + exit('Insane query. Aborting.'); + + if (defined('PUN_SHOW_QUERIES')) + $q_start = get_microtime(); + + $this->query_result = @mysqli_query($this->link_id, $sql); + + if ($this->query_result) + { + if (defined('PUN_SHOW_QUERIES')) + $this->saved_queries[] = array($sql, sprintf('%.5f', get_microtime() - $q_start)); + + ++$this->num_queries; + + return $this->query_result; + } + else + { + if (defined('PUN_SHOW_QUERIES')) + $this->saved_queries[] = array($sql, 0); + + return false; + } + } + + + function query_build($query, $unbuffered = false) + { + $sql = ''; + + if (isset($query['SELECT'])) + { + $sql = 'SELECT '.$query['SELECT'].' FROM '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['FROM']; + + if (isset($query['JOINS'])) + { + foreach ($query['JOINS'] as $cur_join) + $sql .= ' '.key($cur_join).' '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).current($cur_join).' ON '.$cur_join['ON']; + } + + if (!empty($query['WHERE'])) + $sql .= ' WHERE '.$query['WHERE']; + if (!empty($query['GROUP BY'])) + $sql .= ' GROUP BY '.$query['GROUP BY']; + if (!empty($query['HAVING'])) + $sql .= ' HAVING '.$query['HAVING']; + if (!empty($query['ORDER BY'])) + $sql .= ' ORDER BY '.$query['ORDER BY']; + if (!empty($query['LIMIT'])) + $sql .= ' LIMIT '.$query['LIMIT']; + } + else if (isset($query['INSERT'])) + { + $sql = 'INSERT INTO '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['INTO']; + + if (!empty($query['INSERT'])) + $sql .= ' ('.$query['INSERT'].')'; + + $sql .= ' VALUES('.$query['VALUES'].')'; + } + else if (isset($query['UPDATE'])) + { + $query['UPDATE'] = (isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['UPDATE']; + + if (isset($query['PARAMS']['LOW_PRIORITY'])) + $query['UPDATE'] = 'LOW_PRIORITY '.$query['UPDATE']; + + $sql = 'UPDATE '.$query['UPDATE'].' SET '.$query['SET']; + + if (!empty($query['WHERE'])) + $sql .= ' WHERE '.$query['WHERE']; + } + else if (isset($query['DELETE'])) + { + $sql = 'DELETE FROM '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['DELETE']; + + if (!empty($query['WHERE'])) + $sql .= ' WHERE '.$query['WHERE']; + } + else if (isset($query['REPLACE'])) + { + $sql = 'REPLACE INTO '.(isset($query['PARAMS']['NO_PREFIX']) ? '' : $this->prefix).$query['INTO']; + + if (!empty($query['REPLACE'])) + $sql .= ' ('.$query['REPLACE'].')'; + + $sql .= ' VALUES('.$query['VALUES'].')'; + } + + return $this->query($sql, $unbuffered); + } + + + function result($query_id = 0, $row = 0) + { + if ($query_id) + { + if ($row) + @mysqli_data_seek($query_id, $row); + + $cur_row = @mysqli_fetch_row($query_id); + return $cur_row[0]; + } + else + return false; + } + + + function fetch_assoc($query_id = 0) + { + return ($query_id) ? @mysqli_fetch_assoc($query_id) : false; + } + + + function fetch_row($query_id = 0) + { + return ($query_id) ? @mysqli_fetch_row($query_id) : false; + } + + + function num_rows($query_id = 0) + { + return ($query_id) ? @mysqli_num_rows($query_id) : false; + } + + + function affected_rows() + { + return ($this->link_id) ? @mysqli_affected_rows($this->link_id) : false; + } + + + function insert_id() + { + return ($this->link_id) ? @mysqli_insert_id($this->link_id) : false; + } + + + function get_num_queries() + { + return $this->num_queries; + } + + + function get_saved_queries() + { + return $this->saved_queries; + } + + + function free_result($query_id = false) + { + return ($query_id) ? @mysqli_free_result($query_id) : false; + } + + + function escape($str) + { + return is_array($str) ? '' : mysqli_real_escape_string($this->link_id, $str); + } + + + function error() + { + $result['error_sql'] = @current(@end($this->saved_queries)); + $result['error_no'] = @mysqli_errno($this->link_id); + $result['error_msg'] = @mysqli_error($this->link_id); + + return $result; + } + + + function close() + { + if ($this->link_id) + { + if ($this->query_result) + @mysqli_free_result($this->query_result); + + return @mysqli_close($this->link_id); + } + else + return false; + } + + + function table_exists($table_name) + { + $result = $this->query('SHOW TABLES LIKE \''.$this->escape($table_name).'\''); + return $this->num_rows($result) > 0; + } + + + function field_exists($table_name, $field_name) + { + $result = $this->query('SHOW COLUMNS FROM '.$table_name.' LIKE \''.$this->escape($field_name).'\''); + return $this->num_rows($result) > 0; + } + + + function index_exists($table_name, $index_name) + { + $exists = false; + + $result = $this->query('SHOW INDEX FROM '.$table_name); + while ($cur_index = $this->fetch_assoc($result)) + { + if ($cur_index['Key_name'] == $index_name) + { + $exists = true; + break; + } + } + + return $exists; + } + + + function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null) + { + if ($this->field_exists($table_name, $field_name)) + return; + + if ($default_value !== null && !is_int($default_value) && !is_float($default_value)) + $default_value = '\''.$this->escape($default_value).'\''; + + $this->query('ALTER TABLE '.$table_name.' ADD '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) or error(__FILE__, __LINE__); + } + + + function drop_field($table_name, $field_name) + { + if (!$this->field_exists($table_name, $field_name)) + return; + + $this->query('ALTER TABLE '.$table_name.' DROP '.$field_name) or error(__FILE__, __LINE__); + } +}