mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-01-31 17:16:18 +00:00
Removing extra paging result that ends up because of SQLserver 10 workarounds.
This commit is contained in:
parent
3d2a732cd3
commit
4deedf6da2
2 changed files with 43 additions and 19 deletions
|
@ -114,6 +114,8 @@ class Sqlserver extends DboSource {
|
||||||
*/
|
*/
|
||||||
private $__lastQueryHadError = false;
|
private $__lastQueryHadError = false;
|
||||||
|
|
||||||
|
const ROW_COUNTER = '_cake_page_rownum_';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connects to the database using options in the given configuration array.
|
* Connects to the database using options in the given configuration array.
|
||||||
*
|
*
|
||||||
|
@ -522,13 +524,14 @@ class Sqlserver extends DboSource {
|
||||||
$order = 'ORDER BY (SELECT NULL)';
|
$order = 'ORDER BY (SELECT NULL)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$rowCounter = self::ROW_COUNTER;
|
||||||
$pagination = "
|
$pagination = "
|
||||||
SELECT {$limit} * FROM (
|
SELECT {$limit} * FROM (
|
||||||
SELECT {$fields}, ROW_NUMBER() OVER ({$order}) AS ssma\$rownum
|
SELECT {$fields}, ROW_NUMBER() OVER ({$order}) AS {$rowCounter}
|
||||||
FROM {$table} {$alias} {$joins} {$conditions} {$group}
|
FROM {$table} {$alias} {$joins} {$conditions} {$group}
|
||||||
) AS ssma\$sub1
|
) AS _cake_paging_
|
||||||
WHERE ssma\$sub1.[ssma\$rownum] > {$limit2}
|
WHERE _cake_paging_.{$rowCounter} > {$limit2}
|
||||||
ORDER BY ssma\$sub1.[ssma\$rownum]
|
ORDER BY _cake_paging_.{$rowCounter}
|
||||||
";
|
";
|
||||||
return $pagination;
|
return $pagination;
|
||||||
} else {
|
} else {
|
||||||
|
@ -602,7 +605,8 @@ class Sqlserver extends DboSource {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches the next row from the current result set
|
* Fetches the next row from the current result set.
|
||||||
|
* Eats the magic ROW_COUNTER variable.
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
|
@ -611,6 +615,9 @@ class Sqlserver extends DboSource {
|
||||||
$resultRow = array();
|
$resultRow = array();
|
||||||
foreach ($this->map as $col => $meta) {
|
foreach ($this->map as $col => $meta) {
|
||||||
list($table, $column, $type) = $meta;
|
list($table, $column, $type) = $meta;
|
||||||
|
if ($table === 0 && $column === self::ROW_COUNTER) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$resultRow[$table][$column] = $row[$col];
|
$resultRow[$table][$column] = $row[$col];
|
||||||
if ($type === 'boolean' && !is_null($row[$col])) {
|
if ($type === 'boolean' && !is_null($row[$col])) {
|
||||||
$resultRow[$table][$column] = $this->boolean($resultRow[$table][$column]);
|
$resultRow[$table][$column] = $this->boolean($resultRow[$table][$column]);
|
||||||
|
|
|
@ -170,19 +170,6 @@ class SqlserverTestModel extends Model {
|
||||||
public function find($conditions = null, $fields = null, $order = null, $recursive = null) {
|
public function find($conditions = null, $fields = null, $order = null, $recursive = null) {
|
||||||
return $conditions;
|
return $conditions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* findAll method
|
|
||||||
*
|
|
||||||
* @param mixed $conditions
|
|
||||||
* @param mixed $fields
|
|
||||||
* @param mixed $order
|
|
||||||
* @param mixed $recursive
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function findAll($conditions = null, $fields = null, $order = null, $recursive = null) {
|
|
||||||
return $conditions;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -259,7 +246,7 @@ class SqlserverTest extends CakeTestCase {
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
public $fixtures = array('core.category');
|
public $fixtures = array('core.category', 'core.post');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up a Dbo class instance for testing
|
* Sets up a Dbo class instance for testing
|
||||||
|
@ -575,4 +562,34 @@ class SqlserverTest extends CakeTestCase {
|
||||||
);
|
);
|
||||||
$this->assertEqual($expected, $result);
|
$this->assertEqual($expected, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SQL server < 11 doesn't have proper limit/offset support, test that our hack works.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLimitOffsetHack() {
|
||||||
|
$this->loadFixtures('Post');
|
||||||
|
$query = array(
|
||||||
|
'limit' => 1,
|
||||||
|
'page' => 1,
|
||||||
|
'order' => 'Post.title ASC',
|
||||||
|
);
|
||||||
|
$Post = ClassRegistry::init('Post');
|
||||||
|
$results = $Post->find('all', $query);
|
||||||
|
|
||||||
|
$this->assertEquals(1, count($results));
|
||||||
|
$this->assertEquals('First Post', $results[0]['Post']['title']);
|
||||||
|
|
||||||
|
$query = array(
|
||||||
|
'limit' => 1,
|
||||||
|
'page' => 2,
|
||||||
|
'order' => 'Post.title ASC',
|
||||||
|
);
|
||||||
|
$Post = ClassRegistry::init('Post');
|
||||||
|
$results = $Post->find('all', $query);
|
||||||
|
$this->assertEquals(1, count($results));
|
||||||
|
$this->assertFalse(isset($results[0][0]));
|
||||||
|
$this->assertEquals('Second Post', $results[0]['Post']['title']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue