mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-12 22:38:52 +00:00
[ticket/10653] Add ability to count table rows to database abstraction layer.
PHPBB3-10653
This commit is contained in:
parent
97cf433dea
commit
f9953fc339
4 changed files with 177 additions and 44 deletions
|
@ -900,6 +900,41 @@ class dbal
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the estimated number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Number of rows in $table_name.
|
||||||
|
* Prefixed with ~ if estimated (otherwise exact).
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_estimated_row_count($table_name)
|
||||||
|
{
|
||||||
|
return $this->get_row_count($table_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the exact number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Exact number of rows in $table_name.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_row_count($table_name)
|
||||||
|
{
|
||||||
|
$sql = 'SELECT COUNT(*) AS rows_total
|
||||||
|
FROM ' . $this->sql_escape($table_name);
|
||||||
|
$result = $this->sql_query($sql);
|
||||||
|
$rows_total = $this->sql_fetchfield('rows_total');
|
||||||
|
$this->sql_freeresult($result);
|
||||||
|
|
||||||
|
return $rows_total;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -318,6 +318,76 @@ class dbal_mysql extends dbal
|
||||||
return @mysql_real_escape_string($msg, $this->db_connect_id);
|
return @mysql_real_escape_string($msg, $this->db_connect_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the estimated number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Number of rows in $table_name.
|
||||||
|
* Prefixed with ~ if estimated (otherwise exact).
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_estimated_row_count($table_name)
|
||||||
|
{
|
||||||
|
$table_status = $this->get_table_status($table_name);
|
||||||
|
|
||||||
|
if (isset($table_status['Engine']))
|
||||||
|
{
|
||||||
|
if ($table_status['Engine'] === 'MyISAM')
|
||||||
|
{
|
||||||
|
return $table_status['Rows'];
|
||||||
|
}
|
||||||
|
else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
|
||||||
|
{
|
||||||
|
return '~' . $table_status['Rows'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->get_row_count($table_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the exact number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Exact number of rows in $table_name.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_row_count($table_name)
|
||||||
|
{
|
||||||
|
$table_status = $this->get_table_status($table_name);
|
||||||
|
|
||||||
|
if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM')
|
||||||
|
{
|
||||||
|
return $table_status['Rows'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::get_row_count($table_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets some information about the specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
function get_table_status($table_name)
|
||||||
|
{
|
||||||
|
$sql = "SHOW TABLE STATUS
|
||||||
|
LIKE '" . $this->sql_escape($table_name) . "'";
|
||||||
|
$result = $this->sql_query($sql);
|
||||||
|
$table_status = $this->sql_fetchrow($result);
|
||||||
|
$this->sql_freeresult($result);
|
||||||
|
|
||||||
|
return $table_status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build LIKE expression
|
* Build LIKE expression
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -315,6 +315,76 @@ class dbal_mysqli extends dbal
|
||||||
return @mysqli_real_escape_string($this->db_connect_id, $msg);
|
return @mysqli_real_escape_string($this->db_connect_id, $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the estimated number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Number of rows in $table_name.
|
||||||
|
* Prefixed with ~ if estimated (otherwise exact).
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_estimated_row_count($table_name)
|
||||||
|
{
|
||||||
|
$table_status = $this->get_table_status($table_name);
|
||||||
|
|
||||||
|
if (isset($table_status['Engine']))
|
||||||
|
{
|
||||||
|
if ($table_status['Engine'] === 'MyISAM')
|
||||||
|
{
|
||||||
|
return $table_status['Rows'];
|
||||||
|
}
|
||||||
|
else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
|
||||||
|
{
|
||||||
|
return '~' . $table_status['Rows'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->get_row_count($table_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the exact number of rows in a specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return string Exact number of rows in $table_name.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function get_row_count($table_name)
|
||||||
|
{
|
||||||
|
$table_status = $this->get_table_status($table_name);
|
||||||
|
|
||||||
|
if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM')
|
||||||
|
{
|
||||||
|
return $table_status['Rows'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::get_row_count($table_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets some information about the specified table.
|
||||||
|
*
|
||||||
|
* @param string $table_name Table name
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
*/
|
||||||
|
function get_table_status($table_name)
|
||||||
|
{
|
||||||
|
$sql = "SHOW TABLE STATUS
|
||||||
|
LIKE '" . $this->sql_escape($table_name) . "'";
|
||||||
|
$result = $this->sql_query($sql);
|
||||||
|
$table_status = $this->sql_fetchrow($result);
|
||||||
|
$this->sql_freeresult($result);
|
||||||
|
|
||||||
|
return $table_status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build LIKE expression
|
* Build LIKE expression
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -1458,53 +1458,11 @@ class fulltext_native extends search_backend
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_stats()
|
function get_stats()
|
||||||
{
|
|
||||||
$this->stats['total_words'] = $this->get_table_row_count(SEARCH_WORDLIST_TABLE);
|
|
||||||
$this->stats['total_matches'] = $this->get_table_row_count(SEARCH_WORDMATCH_TABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets statistics for a specific database table.
|
|
||||||
*
|
|
||||||
* @param string $table_name Table name
|
|
||||||
*
|
|
||||||
* @return string Row count. Prefixed with ~ if estimated.
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
*/
|
|
||||||
function get_table_row_count($table_name)
|
|
||||||
{
|
{
|
||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
if (stripos($db->sql_layer, 'mysql') === 0)
|
$this->stats['total_words'] = $db->get_estimated_row_count(SEARCH_WORDLIST_TABLE);
|
||||||
{
|
$this->stats['total_matches'] = $db->get_estimated_row_count(SEARCH_WORDMATCH_TABLE);
|
||||||
$sql = "SHOW TABLE STATUS
|
|
||||||
LIKE '" . $table_name . "'";
|
|
||||||
$result = $db->sql_query($sql);
|
|
||||||
$table_status = $db->sql_fetchrow($result);
|
|
||||||
$db->sql_freeresult($result);
|
|
||||||
|
|
||||||
if (isset($table_status['Engine']))
|
|
||||||
{
|
|
||||||
if ($table_status['Engine'] === 'MyISAM')
|
|
||||||
{
|
|
||||||
return $table_status['Rows'];
|
|
||||||
}
|
|
||||||
else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000)
|
|
||||||
{
|
|
||||||
return '~' . $table_status['Rows'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get exact row count by actually counting rows
|
|
||||||
$sql = 'SELECT COUNT(*) AS rows_total
|
|
||||||
FROM ' . $table_name;
|
|
||||||
$result = $db->sql_query($sql);
|
|
||||||
$rows_total = $db->sql_fetchfield('rows_total');
|
|
||||||
$db->sql_freeresult($result);
|
|
||||||
|
|
||||||
return $rows_total;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue