fixed "There's NO ADOdb object!" error in DB backup/restore via

setup-cli.php
This commit is contained in:
Ralf Becker 2008-07-21 09:40:58 +00:00
parent 667eb5eb82
commit 16c5ce05ac
2 changed files with 496 additions and 464 deletions

View File

@ -1,58 +1,87 @@
<?php
/**************************************************************************\
* eGroupWare - Setup - db-backups *
* http://www.egroupware.org *
* -------------------------------------------- *
* Written and copyright by Ralf Becker <RalfBecker@outdoor-training.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
define('BACKSLASH_TOKEN','##!!**bAcKsLaSh**!!##'); // used in cvs_split
/**
* DB independent backup and restore of eGW's DB
/**
* eGroupWare API: Database backups
*
* @package phpgwapi
* @link http://www.egroupware.org
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package api
* @subpackage db
* @author RalfBecker-AT-outdoor-training.de
* @license GPL
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2003-8 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @version $Id$
*/
class db_backup
{
var $schema_proc; /** schema_proc class */
var $schemas = array(); /** array tablename => schema */
var $exclude_tables = array( /** exclude from backup */
/**
* DB independent backup and restore of eGW's DB
*/
class db_backup
{
/**
* replaces backslashes, used in cvs_split
*/
const BACKSLASH_TOKEN = '##!!**bAcKsLaSh**!!##';
/**
* Reference to schema_proc
*
* @var schema_proc
*/
var $schema_proc;
/**
* Reference to ADOdb (connection) object
*
* @var ADOConnection
*/
var $adodb;
/**
* DB schemas, as array tablename => schema
*
* @var array
*/
var $schemas = array();
/**
* Tables to exclude from the backup: sessions, diverse caches which get automatic rebuild
*
* @var array
*/
var $exclude_tables = array(
'egw_sessions','egw_app_sessions','phpgw_sessions','phpgw_app_sessions', // eGW's session-tables
'phpgw_anglemail', // email's cache
'egw_felamimail_cache','egw_felamimail_folderstatus','phpgw_felamimail_cache','phpgw_felamimail_folderstatus', // felamimail's cache
);
var $system_tables = false; /** regular expression to identify system-tables => ignored for schema+backup */
var $egw_tables = false; /** regurar expression to identify eGW tables => if set only they are used */
/**
* regular expression to identify system-tables => ignored for schema+backup
*
* @var string|boolean
*/
var $system_tables = false;
/**
* regurar expression to identify eGW tables => if set only they are used
*
* @var string|boolean
*/
var $egw_tables = false;
/**
* Constructor
*/
function db_backup()
function __construct()
{
if (is_object($GLOBALS['egw_setup']->oProc)) // schema_proc already instanciated, use it
if (isset($GLOBALS['egw_setup']) && is_object($GLOBALS['egw_setup']) && !isset($GLOBALS['egw_setup']->db))
{
$GLOBALS['egw_setup']->loaddb(); // we run inside setup, but db object is not loaded
}
if (isset($GLOBALS['egw_setup']->oProc) && is_object($GLOBALS['egw_setup']->oProc)) // schema_proc already instanciated, use it
{
$this->schema_proc = $GLOBALS['egw_setup']->oProc;
}
else
{
$this->schema_proc = CreateObject('phpgwapi.schema_proc');
$this->schema_proc = new schema_proc();
}
$this->db = $this->schema_proc->m_odb;
$this->adodb = &$GLOBALS['egw']->ADOdb;
if (is_object($GLOBALS['egw_setup'])) // called from setup
$this->adodb = $this->db->Link_ID;
if (isset($GLOBALS['egw_setup']) && is_object($GLOBALS['egw_setup'])) // called from setup
{
if ($GLOBALS['egw_setup']->config_table && $GLOBALS['egw_setup']->table_exist(array($GLOBALS['egw_setup']->config_table)))
{
@ -276,9 +305,8 @@
/**
* Split one line of a csv file into an array and does all unescaping
* @internal
*/
function csv_split($line,$keys=False)
private function csv_split($line,$keys=False)
{
$fields = explode(',',trim($line));
@ -300,7 +328,7 @@
$str_pending = $field;
continue;
}
$arr[$key] = str_replace(BACKSLASH_TOKEN,'\\',str_replace(array('\\\\','\\n','\\r','\\"'),array(BACKSLASH_TOKEN,"\n","\r",'"'),substr($field,1,-1)));
$arr[$key] = str_replace(self::BACKSLASH_TOKEN,'\\',str_replace(array('\\\\','\\n','\\r','\\"'),array(self::BACKSLASH_TOKEN,"\n","\r",'"'),substr($field,1,-1)));
}
elseif ($keys && strlen($field) > 24)
{
@ -316,9 +344,9 @@
}
/**
* @internal
* escape data for csv
*/
function escape_data(&$data,$col,$defs)
private function escape_data(&$data,$col,$defs)
{
if (is_null($data))
{
@ -399,7 +427,7 @@
/**
* Backup all schemas in the form of a setup/tables_current.inc.php file
*
* @param f resource/boolean
* @param resource|boolean $f
*/
function schema_backup($f=False)
{
@ -436,7 +464,7 @@
{
if (!is_object($this->browser))
{
$this->browser = CreateObject('phpgwapi.browser');
$this->browser = new browser();
}
$this->browser->content_header('schema-backup-'.date('YmdHi').'.inc.php','text/plain',bytes($def));
echo "<?php\n\t/* eGroupWare schema-backup from ".date('Y-m-d H:i:s')." */\n\n".$def;
@ -444,9 +472,11 @@
}
/**
* @internal copied from etemplate/inc/class.db_tools.inc.php
* Dump an array as php source
*
* copied from etemplate/inc/class.db_tools.inc.php
*/
function write_array($arr,$depth,$parent='')
private function write_array($arr,$depth,$parent='')
{
if (in_array($parent,array('pk','fk','ix','uc')))
{
@ -495,7 +525,7 @@
return $def;
}
}
}
/*
$line = '"de","ranking","use \\"yes\\", or \\"no, prefession\\"","benützen Sie \\"yes\\" oder \\"no, Beruf\\""';

View File

@ -100,18 +100,20 @@ class schema_proc
if(is_object($db))
{
$this->m_odb = $db;
$this->adodb = &$this->m_odb->Link_ID;
}
else
{
$this->m_odb = is_object($GLOBALS['egw']->db) ? $GLOBALS['egw']->db : $GLOBALS['egw_setup']->db;
$this->adodb = &$GLOBALS['egw']->ADOdb;
$this->m_odb = isset($GLOBALS['egw']->db) && is_object($GLOBALS['egw']->db) ? $GLOBALS['egw']->db : $GLOBALS['egw_setup']->db;
}
if (!($this->m_odb instanceof egw_db))
{
throw new egw_exception_assertion_failed('no egw_db object!');
}
$this->m_odb->connect();
$this->capabilities =& $this->m_odb->capabilities;
$this->sType = $dbms ? $dmbs : $this->m_odb->Type;
$this->adodb = &$this->m_odb->Link_ID;
$this->dict = NewDataDictionary($this->adodb);
// enable the debuging in ADOdb's datadictionary if the debug-level is greater then 1