Merge branch 'develop-olympus' into develop

* develop-olympus:
  [ticket/10858] Move generic row seeking to DBAL
  [ticket/10858] Tests for row seeking with fetchfield()
  [ticket/10858] Fix MSSQL Native's row seeking behavior

Conflicts:
	tests/dbal/select_test.php
This commit is contained in:
Andreas Fischer 2012-05-09 12:55:58 +02:00
commit 1a9b30b871
5 changed files with 70 additions and 105 deletions

View file

@ -193,6 +193,49 @@ class dbal
return false; return false;
} }
/**
* Seek to given row number
* rownum is zero-based
*/
function sql_rowseek($rownum, &$query_id)
{
global $cache;
if ($query_id === false)
{
$query_id = $this->query_result;
}
if (isset($cache->sql_rowset[$query_id]))
{
return $cache->sql_rowseek($rownum, $query_id);
}
if ($query_id === false)
{
return false;
}
$this->sql_freeresult($query_id);
$query_id = $this->sql_query($this->last_query_text);
if ($query_id === false)
{
return false;
}
// We do not fetch the row for rownum == 0 because then the next resultset would be the second row
for ($i = 0; $i < $rownum; $i++)
{
if (!$this->sql_fetchrow($query_id))
{
return false;
}
}
return true;
}
/** /**
* Fetch field * Fetch field
* if rownum is false, the current row is used, else it is pointing to the row (zero-based) * if rownum is false, the current row is used, else it is pointing to the row (zero-based)

View file

@ -358,49 +358,6 @@ class dbal_firebird extends dbal
return (sizeof($row)) ? $row : false; return (sizeof($row)) ? $row : false;
} }
/**
* Seek to given row number
* rownum is zero-based
*/
function sql_rowseek($rownum, &$query_id)
{
global $cache;
if ($query_id === false)
{
$query_id = $this->query_result;
}
if (isset($cache->sql_rowset[$query_id]))
{
return $cache->sql_rowseek($rownum, $query_id);
}
if ($query_id === false)
{
return;
}
$this->sql_freeresult($query_id);
$query_id = $this->sql_query($this->last_query_text);
if ($query_id === false)
{
return false;
}
// We do not fetch the row for rownum == 0 because then the next resultset would be the second row
for ($i = 0; $i < $rownum; $i++)
{
if (!$this->sql_fetchrow($query_id))
{
return false;
}
}
return true;
}
/** /**
* Get last inserted id after insert statement * Get last inserted id after insert statement
*/ */

View file

@ -254,49 +254,6 @@ class dbal_mssql_odbc extends dbal
return ($query_id !== false) ? @odbc_fetch_array($query_id) : false; return ($query_id !== false) ? @odbc_fetch_array($query_id) : false;
} }
/**
* Seek to given row number
* rownum is zero-based
*/
function sql_rowseek($rownum, &$query_id)
{
global $cache;
if ($query_id === false)
{
$query_id = $this->query_result;
}
if (isset($cache->sql_rowset[$query_id]))
{
return $cache->sql_rowseek($rownum, $query_id);
}
if ($query_id === false)
{
return false;
}
$this->sql_freeresult($query_id);
$query_id = $this->sql_query($this->last_query_text);
if ($query_id === false)
{
return false;
}
// We do not fetch the row for rownum == 0 because then the next resultset would be the second row
for ($i = 0; $i < $rownum; $i++)
{
if (!$this->sql_fetchrow($query_id))
{
return false;
}
}
return true;
}
/** /**
* Get last inserted id after insert statement * Get last inserted id after insert statement
*/ */

View file

@ -438,24 +438,6 @@ class dbal_mssqlnative extends dbal
return $row; return $row;
} }
/**
* Seek to given row number
* rownum is zero-based
*/
function sql_rowseek($rownum, &$query_id)
{
global $cache;
if (isset($cache->sql_rowset[$query_id]))
{
return $cache->sql_rowseek($rownum, $query_id);
}
$seek = new result_mssqlnative($query_id);
$row = $seek->seek($rownum);
return ($row = $seek->fetch()) ? $row : false;
}
/** /**
* Get last inserted id after insert statement * Get last inserted id after insert statement
*/ */

View file

@ -125,7 +125,33 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
$this->assertEquals($expected, $ary); $this->assertEquals($expected, $ary);
} }
public function query_limit_data() public static function fetchfield_seek_data()
{
return array(
array(1, 'foobar'),
array(0, 'barfoo'),
array(2, 'bertie'),
);
}
/**
* @dataProvider fetchfield_seek_data
*/
public function test_fetchfield_seek($rownum, $expected)
{
$db = $this->new_dbal();
$result = $db->sql_query('SELECT username_clean
FROM phpbb_users
ORDER BY user_id ASC');
$field = $db->sql_fetchfield('username_clean', $rownum, $result);
$db->sql_freeresult($result);
$this->assertEquals($expected, $field);
}
public static function query_limit_data()
{ {
return array( return array(
array(0, 0, array(array('username_clean' => 'barfoo'), array(0, 0, array(array('username_clean' => 'barfoo'),