Transfer announce to the php7-optimized database layer

This commit is contained in:
Yuriy Pikhtarev 2017-02-04 00:20:38 +03:00
commit 54693c00b8
No known key found for this signature in database
GPG key ID: 3A9B5A757B48ECC6
4 changed files with 184 additions and 463 deletions

View file

@ -27,10 +27,13 @@ if (!defined('SQL_DEBUG')) {
die(basename(__FILE__));
}
/**
* Class sql_db
*/
class sql_db
{
public $cfg = array();
public $cfg_keys = array('dbhost', 'dbname', 'dbuser', 'dbpasswd', 'charset', 'persist');
public $cfg = [];
public $cfg_keys = ['dbhost', 'dbname', 'dbuser', 'dbpasswd', 'charset', 'persist'];
private $link = null;
public $result = null;
public $db_server = '';
@ -38,7 +41,7 @@ class sql_db
public $inited = false;
public $locked = false;
public $locks = array();
public $locks = [];
public $num_queries = 0;
public $sql_starttime = 0;
@ -47,7 +50,7 @@ class sql_db
public $cur_query_time = 0;
public $slow_time = 0;
public $dbg = array();
public $dbg = [];
public $dbg_id = 0;
public $dbg_enabled = false;
public $cur_query = null;
@ -56,12 +59,13 @@ class sql_db
public $explain_hold = '';
public $explain_out = '';
public $shutdown = array();
public $shutdown = [];
public $DBS = array();
public $DBS = [];
/**
* Constructor
* sql_db constructor.
* @param $cfg_values
*/
public function __construct($cfg_values)
{
@ -120,7 +124,7 @@ class sql_db
die("Could not connect to mysql server $server");
}
register_shutdown_function(array(&$this, 'close'));
register_shutdown_function([&$this, 'close']);
$this->debug('stop');
$this->cur_query = null;
@ -128,6 +132,10 @@ class sql_db
/**
* Base query method
*
* @param $query
*
* @return bool|mysqli_result|null
*/
public function sql_query($query)
{
@ -160,6 +168,10 @@ class sql_db
/**
* Execute query WRAPPER (with error handling)
*
* @param $query
*
* @return bool|mysqli_result|null
*/
public function query($query)
{
@ -172,6 +184,10 @@ class sql_db
/**
* Return number of rows
*
* @param bool $result
*
* @return bool|int
*/
public function num_rows($result = false)
{
@ -186,6 +202,8 @@ class sql_db
/**
* Return number of affected rows
*
* @return int
*/
public function affected_rows()
{
@ -194,6 +212,12 @@ class sql_db
/**
* Fetch current field
*
* @param $field
* @param int $rownum
* @param int $query_id
*
* @return bool
*/
public function sql_fetchfield($field, $rownum = -1, $query_id = 0)
{
@ -222,6 +246,13 @@ class sql_db
}
}
/**
* @param mysqli_result $res
* @param $row
* @param int $field
*
* @return mixed
*/
private function sql_result(mysqli_result $res, $row, $field = 0)
{
$res->data_seek($row);
@ -231,6 +262,11 @@ class sql_db
/**
* Fetch current row
*
* @param $result
* @param string $field_name
*
* @return array|bool|null
*/
public function sql_fetchrow($result, $field_name = '')
{
@ -245,6 +281,9 @@ class sql_db
/**
* Alias of sql_fetchrow()
* @param $result
*
* @return array|bool|null
*/
public function fetch_next($result)
{
@ -253,6 +292,10 @@ class sql_db
/**
* Fetch row WRAPPER (with error handling)
* @param $query
* @param string $field_name
*
* @return array|bool|null
*/
public function fetch_row($query, $field_name = '')
{
@ -265,10 +308,15 @@ class sql_db
/**
* Fetch all rows
*
* @param $result
* @param string $field_name
*
* @return array
*/
public function sql_fetchrowset($result, $field_name = '')
{
$rowset = array();
$rowset = [];
while ($row = mysqli_fetch_assoc($result)) {
$rowset[] = ($field_name) ? $row[$field_name] : $row;
@ -279,6 +327,11 @@ class sql_db
/**
* Fetch all rows WRAPPER (with error handling)
*
* @param $query
* @param string $field_name
*
* @return array
*/
public function fetch_rowset($query, $field_name = '')
{
@ -291,6 +344,11 @@ class sql_db
/**
* Fetch all rows WRAPPER (with error handling)
*
* @param $query
* @param string $field_name
*
* @return array
*/
public function fetch_all($query, $field_name = '')
{
@ -303,6 +361,8 @@ class sql_db
/**
* Get last inserted id after insert statement
*
* @return int|string
*/
public function sql_nextid()
{
@ -311,6 +371,8 @@ class sql_db
/**
* Free sql result
*
* @param bool $result
*/
public function sql_freeresult($result = false)
{
@ -325,6 +387,12 @@ class sql_db
/**
* Escape data used in sql query
*
* @param $v
* @param bool $check_type
* @param bool $dont_escape
*
* @return string
*/
public function escape($v, $check_type = false, $dont_escape = false)
{
@ -353,6 +421,10 @@ class sql_db
/**
* Escape string
*
* @param $str
*
* @return string
*/
public function escape_string($str)
{
@ -364,13 +436,19 @@ class sql_db
}
/**
* Build SQL statement from array (based on same method from phpBB3, idea from Ikonboard)
*
* Build SQL statement from array.
* Possible $query_type values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT
*
* @param $query_type
* @param $input_ary
* @param bool $data_already_escaped
* @param bool $check_data_type_in_escape
*
* @return string
*/
public function build_array($query_type, $input_ary, $data_already_escaped = false, $check_data_type_in_escape = true)
{
$fields = $values = $ary = $query = array();
$fields = $values = $ary = $query = [];
$dont_escape = $data_already_escaped;
$check_type = $check_data_type_in_escape;
@ -400,7 +478,7 @@ class sql_db
$values[] = $this->escape($val, $check_type, $dont_escape);
}
$ary[] = '(' . join(', ', $values) . ')';
$values = array();
$values = [];
}
$fields = join(', ', array_keys($input_ary[0]));
$values = join(",\n", $ary);
@ -420,22 +498,29 @@ class sql_db
return "\n" . $query . "\n";
}
/**
* @return array
*/
public function get_empty_sql_array()
{
return array(
'SELECT' => array(),
'select_options' => array(),
'FROM' => array(),
'INNER JOIN' => array(),
'LEFT JOIN' => array(),
'WHERE' => array(),
'GROUP BY' => array(),
'HAVING' => array(),
'ORDER BY' => array(),
'LIMIT' => array(),
);
return [
'SELECT' => [],
'select_options' => [],
'FROM' => [],
'INNER JOIN' => [],
'LEFT JOIN' => [],
'WHERE' => [],
'GROUP BY' => [],
'HAVING' => [],
'ORDER BY' => [],
'LIMIT' => [],
];
}
/**
* @param $sql_ary
* @return string
*/
public function build_sql($sql_ary)
{
$sql = '';
@ -478,13 +563,15 @@ class sql_db
/**
* Return sql error array
*
* @return array
*/
public function sql_error()
{
if ($this->link) {
return array('code' => mysqli_errno($this->link), 'message' => mysqli_error($this->link));
return ['code' => mysqli_errno($this->link), 'message' => mysqli_error($this->link)];
} else {
return array('code' => '', 'message' => 'not connected');
return ['code' => '', 'message' => 'not connected'];
}
}
@ -512,6 +599,8 @@ class sql_db
/**
* Add shutdown query
*
* @param $sql
*/
public function add_shutdown_query($sql)
{
@ -541,14 +630,15 @@ class sql_db
/**
* Lock tables
*
* @param $tables
* @param string $lock_type
*
* @return bool|mysqli_result|null
*/
public function lock($tables, $lock_type = 'WRITE')
{
if ($this->cfg['persist']) {
# return true;
}
$tables_sql = array();
$tables_sql = [];
foreach ((array)$tables as $table_name) {
$tables_sql[] = "$table_name $lock_type";
@ -562,6 +652,8 @@ class sql_db
/**
* Unlock tables
*
* @return bool
*/
public function unlock()
{
@ -574,6 +666,11 @@ class sql_db
/**
* Obtain user level lock
*
* @param $name
* @param int $timeout
*
* @return mixed
*/
public function get_lock($name, $timeout = 0)
{
@ -590,6 +687,10 @@ class sql_db
/**
* Obtain user level lock status
*
* @param $name
*
* @return mixed
*/
public function release_lock($name)
{
@ -605,6 +706,10 @@ class sql_db
/**
* Release user level lock
*
* @param $name
*
* @return mixed
*/
public function is_free_lock($name)
{
@ -615,6 +720,10 @@ class sql_db
/**
* Make per db unique lock name
*
* @param $name
*
* @return string
*/
public function get_lock_name($name)
{
@ -627,10 +736,12 @@ class sql_db
/**
* Get info about last query
*
* @return mixed
*/
public function query_info()
{
$info = array();
$info = [];
if ($num = $this->num_rows($this->result)) {
$info[] = "$num rows";
@ -647,6 +758,8 @@ class sql_db
/**
* Get server version
*
* @return mixed
*/
public function server_version()
{
@ -655,8 +768,11 @@ class sql_db
}
/**
* Set slow query marker for xx seconds
* This will disable counting other queries as "slow" during this time
* Set slow query marker for xx seconds.
* This will disable counting other queries as "slow" during this time.
*
* @param int $ignoring_time
* @param int $new_priority
*/
public function expect_slow_query($ignoring_time = 60, $new_priority = 10)
{
@ -672,6 +788,8 @@ class sql_db
/**
* Store debug info
*
* @param $mode
*/
public function debug($mode)
{
@ -727,6 +845,8 @@ class sql_db
/**
* Trigger error
*
* @param string $msg
*/
public function trigger_error($msg = 'DB Error')
{
@ -744,6 +864,10 @@ class sql_db
/**
* Find caller source
*
* @param string $mode
*
* @return string
*/
public function debug_find_source($mode = '')
{
@ -764,6 +888,8 @@ class sql_db
/**
* Prepare for logging
* @param int $queries_count
* @param string $log_file
*/
public function log_next_query($queries_count = 1, $log_file = 'sql_queries')
{
@ -773,11 +899,13 @@ class sql_db
/**
* Log query
*
* @param string $log_file
*/
public function log_query($log_file = 'sql_queries')
{
$q_time = ($this->cur_query_time >= 10) ? round($this->cur_query_time, 0) : sprintf('%.4f', $this->cur_query_time);
$msg = array();
$msg = [];
$msg[] = round($this->sql_starttime);
$msg[] = date('m-d H:i:s', $this->sql_starttime);
$msg[] = sprintf('%-6s', $q_time);
@ -794,6 +922,8 @@ class sql_db
/**
* Log slow query
*
* @param string $log_file
*/
public function log_slow_query($log_file = 'sql_slow_bb')
{
@ -812,7 +942,7 @@ class sql_db
return;
}
$msg = array();
$msg = [];
$err = $this->sql_error();
$msg[] = str_compact(sprintf('#%06d %s', $err['code'], $err['message']));
$msg[] = '';
@ -832,7 +962,13 @@ class sql_db
}
/**
* Explain queries (based on code from phpBB3)
* Explain queries
*
* @param $mode
* @param string $html_table
* @param string $row
*
* @return bool|string
*/
public function explain($mode, $html_table = '', $row = '')
{
@ -843,7 +979,7 @@ class sql_db
switch ($mode) {
case 'start':
$this->explain_hold = '';
// TODO: добавить поддержку многотабличных запросов
if (preg_match('#UPDATE ([a-z0-9_]+).*?WHERE(.*)/#', $query, $m)) {
$query = "SELECT * FROM $m[1] WHERE $m[2]";
} elseif (preg_match('#DELETE FROM ([a-z0-9_]+).*?WHERE(.*)#s', $query, $m)) {
@ -897,7 +1033,7 @@ class sql_db
$this->explain_hold .= '<tr>';
foreach (array_values($row) as $i => $val) {
$class = !($i % 2) ? 'row1' : 'row2';
$this->explain_hold .= '<td class="' . $class . ' gen">' . str_replace(array("{$this->selected_db}.", ',', ';'), array('', ', ', ';<br />'), $val) . '</td>';
$this->explain_hold .= '<td class="' . $class . ' gen">' . str_replace(["{$this->selected_db}.", ',', ';'], ['', ', ', ';<br />'], $val) . '</td>';
}
$this->explain_hold .= '</tr>';