|
|
@ -100,26 +100,30 @@ class rcube_db_sqlsrv extends rcube_db
|
|
|
|
{
|
|
|
|
{
|
|
|
|
$limit = intval($limit);
|
|
|
|
$limit = intval($limit);
|
|
|
|
$offset = intval($offset);
|
|
|
|
$offset = intval($offset);
|
|
|
|
|
|
|
|
$end = $offset + $limit;
|
|
|
|
|
|
|
|
|
|
|
|
$orderby = stristr($query, 'ORDER BY');
|
|
|
|
// query without OFFSET
|
|
|
|
if ($orderby !== false) {
|
|
|
|
if (!$offset) {
|
|
|
|
$sort = (stripos($orderby, ' desc') !== false) ? 'desc' : 'asc';
|
|
|
|
$query = preg_replace('/^SELECT\s/i', "SELECT TOP $limit ", $query);
|
|
|
|
$order = str_ireplace('ORDER BY', '', $orderby);
|
|
|
|
return $query;
|
|
|
|
$order = trim(preg_replace('/\bASC\b|\bDESC\b/i', '', $order));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$query = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($limit + $offset) . ' ', $query);
|
|
|
|
$orderby = stristr($query, 'ORDER BY');
|
|
|
|
|
|
|
|
$offset += 1;
|
|
|
|
|
|
|
|
|
|
|
|
$query = 'SELECT * FROM (SELECT TOP ' . $limit . ' * FROM (' . $query . ') AS inner_tbl';
|
|
|
|
|
|
|
|
if ($orderby !== false) {
|
|
|
|
if ($orderby !== false) {
|
|
|
|
$query .= ' ORDER BY ' . $order . ' ';
|
|
|
|
$query = trim(substr($query, 0, -1 * strlen($orderby)));
|
|
|
|
$query .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC';
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$query .= ') AS outer_tbl';
|
|
|
|
else {
|
|
|
|
if ($orderby !== false) {
|
|
|
|
// it shouldn't happen, paging without sorting has not much sense
|
|
|
|
$query .= ' ORDER BY ' . $order . ' ' . $sort;
|
|
|
|
// @FIXME: I don't know how to build paging query without ORDER BY
|
|
|
|
|
|
|
|
$orderby = "ORDER BY 1";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$query = preg_replace('/^SELECT\s/i', '', $query);
|
|
|
|
|
|
|
|
$query = "WITH paging AS (SELECT ROW_NUMBER() OVER ($orderby) AS [RowNumber], $query)"
|
|
|
|
|
|
|
|
. " SELECT * FROM paging WHERE [RowNumber] BETWEEN $offset AND $end ORDER BY [RowNumber]";
|
|
|
|
|
|
|
|
|
|
|
|
return $query;
|
|
|
|
return $query;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|