Skip to content
Browse files

MS SQL pagination

git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@1485 7c3ca157-0c34-0410-bff1-cbf682f78f5c
  • Loading branch information...
1 parent 341362a commit 1b144a12ddfcadcdbc3c29321d9143c4376f321f jakubvrana committed Apr 23, 2010
Showing with 35 additions and 10 deletions.
  1. +25 −5 adminer/drivers/mssql.inc.php
  2. +10 −5 adminer/select.inc.php
View
30 adminer/drivers/mssql.inc.php
@@ -125,6 +125,12 @@ function fetch_field() {
$return->type = ($field["Type"] == 1 ? 254 : 0);
return $return;
}
+
+ function seek($offset) {
+ for ($i=0; $i < $offset; $i++) {
+ sqlsrv_fetch($this->_result); // SQLSRV_SCROLL_ABSOLUTE added in sqlsrv 1.1
+ }
+ }
function __destruct() {
sqlsrv_free_stmt($this->_result);
@@ -216,6 +222,10 @@ function fetch_field() {
return $return;
}
+ function seek($offset) {
+ mssql_data_seek($this->_result, $offset);
+ }
+
function __destruct() {
mssql_free_result($this->_result);
}
@@ -242,10 +252,10 @@ function get_databases() {
}
function limit($query, $limit, $offset = 0) {
- return (isset($limit) ? " TOP ($limit)" : "") . " $query"; //! offset
+ return (isset($limit) ? " TOP (" . ($limit + $offset) . ")" : "") . " $query"; // seek later
}
- function limit1($query, $limit, $offset = 0) {
+ function limit1($query) {
return limit($query, 1);
}
@@ -297,7 +307,11 @@ function fk_support($table_status) {
function fields($table) {
global $connection;
$return = array();
- $result = $connection->query("SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = " . $connection->quote($table));
+ $result = $connection->query("SELECT i.*, c.is_identity
+FROM information_schema.COLUMNS i
+JOIN sys.columns c ON OBJECT_NAME(c.object_id) = i.TABLE_NAME AND c.name = i.COLUMN_NAME
+WHERE i.TABLE_NAME = " . $connection->quote($table)
+ );
while ($row = $result->fetch_assoc()) {
$return[$row["COLUMN_NAME"]] = array(
"field" => $row["COLUMN_NAME"],
@@ -306,9 +320,10 @@ function fields($table) {
"length" => $row["CHARACTER_MAXIMUM_LENGTH"], //! NUMERIC_, DATETIME_?
"default" => $row["COLUMN_DEFAULT"],
"null" => ($row["IS_NULLABLE"] == "YES"),
+ "auto_increment" => $row["is_identity"],
"collation" => $row["COLLATION_NAME"],
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
- //! primary - is_identity in sys.columns
+ "primary" => $row["is_identity"], //! or indexes.is_primary_key
);
}
return $return;
@@ -371,13 +386,18 @@ function rename_database($name, $collation) {
if ($collation) {
queries("ALTER DATABASE " . idf_escape(DB) . " COLLATE " . idf_escape($collation));
}
- return queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name)); //! false negative "The database name 'test2' has been set."
+ queries("ALTER DATABASE " . idf_escape(DB) . " MODIFY NAME = " . idf_escape($name));
+ return true; //! false negative "The database name 'test2' has been set."
}
function auto_increment() {
return " IDENTITY";
}
+ function insert_into($table, $set) {
+ return queries("INSERT INTO " . idf_escape($table) . ($set ? " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")" : "DEFAULT VALUES"));
+ }
+
function explain($connection, $query) {
$connection->query("SET SHOWPLAN_ALL ON");
$return = $connection->query($query);
View
15 adminer/select.inc.php
@@ -189,17 +189,22 @@
if (!$result) {
echo "<p class='error'>" . error() . "\n";
} else {
+ if ($driver == "mssql") {
+ $result->seek($limit * $page);
+ }
$email_fields = array();
echo "<form action='' method='post' enctype='multipart/form-data'>\n";
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
// use count($rows) without LIMIT, COUNT(*) without grouping, FOUND_ROWS otherwise (slowest)
- $found_rows = (intval($limit) && $group && count($group) < count($select)
- ? ($driver == "sql" ? $connection->result(" SELECT FOUND_ROWS()") : $connection->result("SELECT COUNT(*) FROM ($query) x")) // space to allow mysql.trace_mode
- : count($rows)
- );
+ if ($_GET["page"] != "last") {
+ $found_rows = (intval($limit) && $group && count($group) < count($select)
+ ? ($driver == "sql" ? $connection->result(" SELECT FOUND_ROWS()") : $connection->result("SELECT COUNT(*) FROM ($query) x")) // space to allow mysql.trace_mode
+ : count($rows)
+ );
+ }
if (!$rows) {
echo "<p class='message'>" . lang('No rows.') . "\n";
@@ -296,7 +301,7 @@
if ($rows || $page) {
$exact_count = true;
- if (intval($limit) && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
+ if ($_GET["page"] != "last" && intval($limit) && count($group) >= count($select) && ($found_rows >= $limit || $page)) {
$found_rows = $table_status["Rows"];
if (!isset($found_rows) || $where || 2 * $page * $limit > $found_rows || ($table_status["Engine"] == "InnoDB" && $found_rows < 1e4)) {
// slow with big tables

0 comments on commit 1b144a1

Please sign in to comment.
Something went wrong with that request. Please try again.