* Guacamole/Backup/Restore: fix not working restore for Guacamole

disabling constraints and only truncate Guacamole tables, not dropping and creating them again
This commit is contained in:
Ralf Becker 2021-11-30 21:56:17 +02:00
parent 5cd4fc0612
commit 0685005f41

View File

@ -67,6 +67,10 @@ class Backup
* @var string|boolean
*/
var $egw_tables = false;
/**
* Regular expression to identify a Guacamole table OR view
*/
const GUACAMOLE_REGEXP = '/^guacamole_/';
/**
* Backup directory.
*
@ -360,6 +364,8 @@ class Backup
if (substr($this->db->Type,0,5) == 'mysql')
{
$this->db->query("SET SESSION sql_mode=(SELECT REPLACE(REPLACE(@@sql_mode,'STRICT_ALL_TABLES',''),'STRICT_TRANS_TABLES',''))", __LINE__, __FILE__);
// disable foreign key checks, in case Guacamole is installed
$this->db->query('SET FOREIGN_KEY_CHECKS = 0');
}
else
{
@ -371,7 +377,9 @@ class Backup
foreach($this->adodb->MetaTables('TABLES') as $table)
{
if ($this->system_tables && preg_match($this->system_tables,$table) ||
$this->egw_tables && !preg_match($this->egw_tables,$table))
$this->egw_tables && !preg_match($this->egw_tables,$table) ||
// do NOT drop Guacamole tables and views
preg_match(self::GUACAMOLE_REGEXP, $table))
{
continue;
}
@ -513,7 +521,7 @@ class Backup
if (substr($line,0,9) == 'version: ')
{
// currenty not used: $api_version = trim(substr($line,9));
// currently not used: $api_version = trim(substr($line,9));
continue;
}
if (substr($line,0,9) == 'charset: ')
@ -536,6 +544,12 @@ class Backup
$this->schemas = json_php_unserialize(trim(substr($line,8)));
foreach($this->schemas as $table_name => $schema)
{
// do NOT create GUACAMOLE tables, just truncate them (as we have no abstraction to create the foreign keys)
if (preg_match(self::GUACAMOLE_REGEXP, $table_name))
{
$this->db->query('TRUNCATE TABLE '.$this->db->name_quote($table_name));
continue;
}
// if column is longtext in current schema, convert text to longtext, in case user already updated column
foreach($schema['fd'] as $col => &$def)
{
@ -566,7 +580,7 @@ class Backup
{
if ($data['type'] == 'blob') $blobs[] = $col;
}
// check if we have an old PostgreSQL backup useing 't'/'f' for bool values
// check if we have an old PostgreSQL backup using 't'/'f' for bool values
// --> convert them to MySQL and our new PostgreSQL format of 1/0
$bools = array();
foreach($this->schemas[$table]['fd'] as $col => $def)