* Backup: backing up bool columns now for all databases as 1 or 0, but understanding PostgreSQL "t" or "f" too

This commit is contained in:
Ralf Becker 2015-01-30 12:48:13 +00:00
parent 4cd8d64130
commit baae7ff596

View File

@ -7,12 +7,14 @@
* @package api * @package api
* @subpackage db * @subpackage db
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de> * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2003-14 by Ralf Becker <RalfBecker-AT-outdoor-training.de> * @copyright (c) 2003-15 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @version $Id$ * @version $Id$
*/ */
/** /**
* DB independent backup and restore of EGroupware database * DB independent backup and restore of EGroupware database
*
* Backing up bool columns now for all databases as 1 or 0, but understanding PostgreSQL 't' or 'f' too.
*/ */
class db_backup class db_backup
{ {
@ -589,6 +591,14 @@ class db_backup
{ {
if ($data['type'] == 'blob') $blobs[] = $col; if ($data['type'] == 'blob') $blobs[] = $col;
} }
// check if we have an old PostgreSQL backup useing '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)
{
if ($def['type'] === 'bool') $bools[] = $col;
}
if ($table == 'egw_cal_dates') error_log(__METHOD__."() $table: bools=".array2string($bools).", schema[fd]=".array2string($this->schemas[$table]['fd']));
if (feof($f)) break; if (feof($f)) break;
continue; continue;
@ -606,7 +616,7 @@ class db_backup
if ($table) // do we already reached the data part if ($table) // do we already reached the data part
{ {
$import = true; $import = true;
$data = self::csv_split($line, $cols, $blobs); $data = self::csv_split($line, $cols, $blobs, $bools);
if ($table == 'egw_async' && in_array('##last-check-run##',$data)) if ($table == 'egw_async' && in_array('##last-check-run##',$data))
{ {
@ -742,9 +752,10 @@ class db_backup
* @param string $line line to split * @param string $line line to split
* @param array $keys =null keys to use or null to use numeric ones * @param array $keys =null keys to use or null to use numeric ones
* @param array $blobs =array() blob columns * @param array $blobs =array() blob columns
* @param array $bools =array() bool columns, values might be 't'/'f' for old PostgreSQL backups
* @return array * @return array
*/ */
public static function csv_split($line, $keys=null, $blobs=array()) public static function csv_split($line, $keys=null, $blobs=array(), $bools=array())
{ {
if (function_exists('str_getcsv')) // php5.3+ if (function_exists('str_getcsv')) // php5.3+
{ {
@ -783,6 +794,11 @@ class db_backup
$fields[$key] = $tmp; $fields[$key] = $tmp;
} }
} }
// decode bool columns, they might be 't'/'f' for old PostgreSQL backups
foreach($bools as $key)
{
$fields[$key] = egw_db::from_bool($fields[$key]);
}
} }
return $fields; return $fields;
} }
@ -813,6 +829,10 @@ class db_backup
{ {
$arr[$key] = base64_decode($field); $arr[$key] = base64_decode($field);
} }
elseif (in_array($key, $bools))
{
$arr[$key] = egw_db::from_bool($field);
}
else else
{ {
$arr[$key] = $field == 'NULL' ? NULL : $field; $arr[$key] = $field == 'NULL' ? NULL : $field;
@ -844,6 +864,9 @@ class db_backup
case 'blob': case 'blob':
$data = base64_encode($data); $data = base64_encode($data);
break; break;
case 'bool': // we use MySQL 0, 1 in csv, not PostgreSQL 't', 'f'
$data = (int)egw_db::from_bool($data);
break;
default: default:
$data = '"'.str_replace(array('\\',"\n","\r",'"'),array('\\\\','\\n','\\r','\\"'),$data).'"'; $data = '"'.str_replace(array('\\',"\n","\r",'"'),array('\\\\','\\n','\\r','\\"'),$data).'"';
break; break;