diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php
index 9d1bd9f6..0306083a 100644
--- a/adminer/include/adminer.inc.php
+++ b/adminer/include/adminer.inc.php
@@ -358,6 +358,7 @@ class Adminer {
* @return string
*/
function messageQuery($query) {
+ session_start();
$id = "sql-" . count($_SESSION["messages"]);
$_SESSION["history"][$_GET["server"]][DB][] = $query;
return " " . lang('SQL command') . "
';
diff --git a/adminer/include/bootstrap.inc.php b/adminer/include/bootstrap.inc.php
index 2b738dde..2e742f56 100644
--- a/adminer/include/bootstrap.inc.php
+++ b/adminer/include/bootstrap.inc.php
@@ -91,6 +91,11 @@ include "./include/connect.inc.php";
include "./include/editing.inc.php";
include "./include/export.inc.php";
+session_cache_limiter(""); // to allow restarting session
+if (@ini_set("session.use_cookies", false) !== false) { // @ - may be disabled
+ session_write_close(); // improves concurrency, may be restarted later
+}
+
$confirm = " onclick=\"return confirm('" . lang('Are you sure?') . "');\"";
$token = $_SESSION["tokens"][$_GET["server"]];
$error = ($_POST
diff --git a/adminer/include/design.inc.php b/adminer/include/design.inc.php
index a17bcf2a..4f8aa1ed 100644
--- a/adminer/include/design.inc.php
+++ b/adminer/include/design.inc.php
@@ -40,6 +40,7 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
echo "$title\n";
}
echo "$title_all
\n";
+ restart_session();
if ($_SESSION["messages"]) {
echo "" . implode("
\n", $_SESSION["messages"]) . "
\n";
$_SESSION["messages"] = array();
@@ -51,7 +52,7 @@ function page_header($title, $error = "", $breadcrumb = array(), $title2 = "") {
if (strlen(DB) && $databases && !in_array(DB, $databases, true)) {
$databases = null;
}
- if (isset($databases) && !isset($_GET["sql"])) {
+ if ((isset($databases) && !isset($_GET["sql"])) || !ini_get("session.use_cookies")) {
// improves concurrency if a user opens several pages at once
session_write_close();
}
diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php
index dc12234a..47c3d685 100644
--- a/adminer/include/editing.inc.php
+++ b/adminer/include/editing.inc.php
@@ -351,6 +351,7 @@ function drop_create($drop, $create, $location, $message_drop, $message_alter, $
$dropped = strlen($name) && ($_POST["dropped"] || queries($drop));
$created = queries($create);
if (!queries_redirect($location, (strlen($name) ? $message_alter : $message_create), $created) && $dropped) {
+ session_start();
$_SESSION["messages"][] = $message_drop;
}
return $dropped;
diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php
index 8a6b4402..590d0f14 100644
--- a/adminer/include/functions.inc.php
+++ b/adminer/include/functions.inc.php
@@ -204,6 +204,15 @@ function cookie($name, $value) {
return setcookie($name, $value, time() + 2592000, preg_replace('~\\?.*~', '', $_SERVER["REQUEST_URI"])); // 2592000 = 30 * 24 * 60 * 60
}
+/** Restart stopped session
+* @return null
+*/
+function restart_session() {
+ if (!ini_get("session.use_cookies")) {
+ session_start();
+ }
+}
+
/** Send Location header and exit
* @param string
* @param string
@@ -211,6 +220,7 @@ function cookie($name, $value) {
*/
function redirect($location, $message = null) {
if (isset($message)) {
+ session_start();
$_SESSION["messages"][] = $message;
}
header("Location: " . (strlen($location) ? $location : "."));
@@ -228,13 +238,13 @@ function redirect($location, $message = null) {
*/
function query_redirect($query, $location, $message, $redirect = true, $execute = true, $failed = false) {
global $connection, $error, $adminer;
+ if ($execute) {
+ $failed = !$connection->query($query);
+ }
$sql = "";
if ($query) {
$sql = $adminer->messageQuery($query);
}
- if ($execute) {
- $failed = !$connection->query($query);
- }
if ($failed) {
$error = h($connection->error) . $sql;
return false;
diff --git a/adminer/include/mysql.inc.php b/adminer/include/mysql.inc.php
index 9fc827e7..5ec6c87a 100644
--- a/adminer/include/mysql.inc.php
+++ b/adminer/include/mysql.inc.php
@@ -168,6 +168,7 @@ function get_databases($flush = true) {
// SHOW DATABASES can take a very long time so it is cached
$return = &$_SESSION["databases"][$_GET["server"]];
if (!isset($return)) {
+ restart_session();
$return = get_vals("SHOW DATABASES");
if ($flush) {
ob_flush();
diff --git a/adminer/sql.inc.php b/adminer/sql.inc.php
index c58ee7f1..e047c4fc 100644
--- a/adminer/sql.inc.php
+++ b/adminer/sql.inc.php
@@ -27,8 +27,8 @@ if (!$error && $_POST) {
$space = "(\\s|/\\*.*\\*/|(#|-- )[^\n]*\n|--\n)";
$alter_database = "(CREATE|DROP)$space+(DATABASE|SCHEMA)\\b~isU";
$databases = &$_SESSION["databases"][$_GET["server"]];
- if (isset($databases) && !preg_match("~\\b$alter_database", $query)) { // quick check - may be inside string
- //! false positive with $fp
+ if ((isset($databases) && !preg_match("~\\b$alter_database", $query)) || !ini_get("session.use_cookies")) { // quick check - may be inside string
+ //! false positive with $fp and disabled ini_set() and enabled session.use_cookies
session_write_close();
}
$delimiter = ";";
diff --git a/changes.txt b/changes.txt
index f0669461..f4554249 100644
--- a/changes.txt
+++ b/changes.txt
@@ -1,4 +1,5 @@
Adminer 2.2.1-dev:
+Improve concurrency
Link new item in backward keys (Editor)
Adminer 2.2.0 (released 2009-10-20):