Skip to content
Snippets Groups Projects
Commit cdd42360 authored by Tim van Dijen's avatar Tim van Dijen
Browse files

Convert TIMESTAMP to DATETIME; fixes #1155

parent d8379265
No related branches found
No related tags found
No related merge requests found
......@@ -26,9 +26,59 @@ class LogoutStore
private static function createLogoutTable(Store\SQL $store)
{
$tableVer = $store->getTableVersion('saml_LogoutStore');
if ($tableVer === 3) {
if ($tableVer === 4) {
return;
} elseif ($tableVer === 3) {
/**
* Table version 4 fixes the column type for the _expire column.
* We now use DATETIME instead of TIMESTAMP to support MSSQL.
*/
switch ($store->driver) {
case 'pgsql':
// This does not affect the NOT NULL constraint
$update = ['ALTER TABLE '.$store->prefix.
'_saml_LogoutStore ALTER COLUMN _expire DATETIME'];
break;
case 'sqlite':
/**
* TableVersion 2 increased the column size to 255 which is the maximum length of a FQDN
* Because SQLite does not support field alterations, the approach is to:
* Create a new table without the proper column size
* Copy the current data to the new table
* Drop the old table
* Rename the new table correctly
* Read the index
*/
$update = [
'CREATE TABLE '.$store->prefix.'_saml_LogoutStore_new (_authSource VARCHAR(255) NOT NULL,'.
'_nameId VARCHAR(40) NOT NULL, _sessionIndex VARCHAR(50) NOT NULL, _expire DATETIME NOT NULL,'.
'_sessionId VARCHAR(50) NOT NULL, UNIQUE (_authSource, _nameID, _sessionIndex))',
'INSERT INTO '.$store->prefix.'_saml_LogoutStore_new SELECT * FROM '.$store->prefix.'_saml_LogoutStore',
'DROP TABLE '.$store->prefix.'_saml_LogoutStore',
'ALTER TABLE '.$store->prefix.'_saml_LogoutStore_new RENAME TO '.$store->prefix.'_saml_LogoutStore',
'CREATE INDEX '.$store->prefix.'_saml_LogoutStore_expire ON '.$store->prefix.'_saml_LogoutStore (_expire)',
'CREATE INDEX '.$store->prefix.'_saml_LogoutStore_nameId ON '.$store->prefix.'_saml_LogoutStore (_authSource, _nameId)'
];
break;
default:
$update = ['ALTER TABLE '.$store->prefix.
'_saml_LogoutStore MODIFY _expire DATETIME NOT NULL'];
break;
}
try {
foreach ($update as $query) {
$store->pdo->exec($query);
}
} catch (\Exception $e) {
Logger::warning('Database error: '.var_export($store->pdo->errorInfo(), true));
return;
}
$store->setTableVersion('saml_LogoutStore', 4);
return;
} elseif ($tableVer === 2) {
// TableVersion 3 fixes the indexes that were set to 255 in version 2; they cannot be larger than 191
// Drop old indexes
$query = 'ALTER TABLE '.$store->prefix.'_saml_LogoutStore DROP INDEX '.$store->prefix.'_saml_LogoutStore_nameId';
$store->pdo->exec($query);
......@@ -96,7 +146,7 @@ class LogoutStore
_authSource VARCHAR(255) NOT NULL,
_nameId VARCHAR(40) NOT NULL,
_sessionIndex VARCHAR(50) NOT NULL,
_expire TIMESTAMP NOT NULL,
_expire DATETIME NOT NULL,
_sessionId VARCHAR(50) NOT NULL,
UNIQUE (_authSource(191), _nameID, _sessionIndex)
)';
......@@ -110,7 +160,7 @@ class LogoutStore
$query .= $store->prefix.'_saml_LogoutStore (_authSource(191), _nameId)';
$store->pdo->exec($query);
$store->setTableVersion('saml_LogoutStore', 3);
$store->setTableVersion('saml_LogoutStore', 4);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment