|
|
|
|
@ -38,7 +38,7 @@ class OC_Migrate{ |
|
|
|
|
// Array of temp files to be deleted after zip creation |
|
|
|
|
static private $tmpfiles=array(); |
|
|
|
|
// Holds the db object |
|
|
|
|
static private $MDB2=false; |
|
|
|
|
static private $migration_database=false; |
|
|
|
|
// Schema db object |
|
|
|
|
static private $schema=false; |
|
|
|
|
// Path to the sqlite db |
|
|
|
|
@ -131,7 +131,7 @@ class OC_Migrate{ |
|
|
|
|
if( !self::connectDB() ) { |
|
|
|
|
return json_encode( array( 'success' => false ) ); |
|
|
|
|
} |
|
|
|
|
self::$content = new OC_Migration_Content( self::$zip, self::$MDB2 ); |
|
|
|
|
self::$content = new OC_Migration_Content( self::$zip, self::$migration_database ); |
|
|
|
|
// Export the app info |
|
|
|
|
$exportdata = self::exportAppData(); |
|
|
|
|
// Add the data dir to the zip |
|
|
|
|
@ -358,24 +358,6 @@ class OC_Migrate{ |
|
|
|
|
return $to; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @brief connects to a MDB2 database scheme |
|
|
|
|
* @returns bool |
|
|
|
|
*/ |
|
|
|
|
static private function connectScheme() { |
|
|
|
|
// We need a mdb2 database connection |
|
|
|
|
self::$MDB2->loadModule( 'Manager' ); |
|
|
|
|
self::$MDB2->loadModule( 'Reverse' ); |
|
|
|
|
|
|
|
|
|
// Connect if this did not happen before |
|
|
|
|
if( !self::$schema ) { |
|
|
|
|
require_once 'MDB2/Schema.php'; |
|
|
|
|
self::$schema=MDB2_Schema::factory( self::$MDB2 ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @brief creates a migration.db in the users data dir with their app data in |
|
|
|
|
* @return bool whether operation was successfull |
|
|
|
|
@ -463,47 +445,15 @@ class OC_Migrate{ |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// Already connected |
|
|
|
|
if(!self::$MDB2) { |
|
|
|
|
require_once 'MDB2.php'; |
|
|
|
|
|
|
|
|
|
if(!self::$migration_database) { |
|
|
|
|
$datadir = OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" ); |
|
|
|
|
|
|
|
|
|
// DB type |
|
|
|
|
if( class_exists( 'SQLite3' ) ) { |
|
|
|
|
$dbtype = 'sqlite3'; |
|
|
|
|
} else if( is_callable( 'sqlite_open' ) ) { |
|
|
|
|
$dbtype = 'sqlite'; |
|
|
|
|
} else { |
|
|
|
|
OC_Log::write( 'migration', 'SQLite not found', OC_Log::ERROR ); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Prepare options array |
|
|
|
|
$options = array( |
|
|
|
|
'portability' => MDB2_PORTABILITY_ALL & (!MDB2_PORTABILITY_FIX_CASE), |
|
|
|
|
'log_line_break' => '<br>', |
|
|
|
|
'idxname_format' => '%s', |
|
|
|
|
'debug' => true, |
|
|
|
|
'quote_identifier' => true |
|
|
|
|
); |
|
|
|
|
$dsn = array( |
|
|
|
|
'phptype' => $dbtype, |
|
|
|
|
'database' => self::$dbpath, |
|
|
|
|
'mode' => '0644' |
|
|
|
|
$connectionParams = array( |
|
|
|
|
'path' => self::$dbpath, |
|
|
|
|
'driver' => 'pdo_sqlite', |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// Try to establish connection |
|
|
|
|
self::$MDB2 = MDB2::factory( $dsn, $options ); |
|
|
|
|
// Die if we could not connect |
|
|
|
|
if( PEAR::isError( self::$MDB2 ) ) { |
|
|
|
|
die( self::$MDB2->getMessage() ); |
|
|
|
|
OC_Log::write( 'migration', 'Failed to create/connect to migration.db', OC_Log::FATAL ); |
|
|
|
|
OC_Log::write( 'migration', self::$MDB2->getUserInfo(), OC_Log::FATAL ); |
|
|
|
|
OC_Log::write( 'migration', self::$MDB2->getMessage(), OC_Log::FATAL ); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// We always, really always want associative arrays |
|
|
|
|
self::$MDB2->setFetchMode(MDB2_FETCHMODE_ASSOC); |
|
|
|
|
self::$migration_database = \Doctrine\DBAL\DriverManager::getConnection($connectionParams); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
@ -515,10 +465,7 @@ class OC_Migrate{ |
|
|
|
|
* @return bool whether the operation was successful |
|
|
|
|
*/ |
|
|
|
|
static private function createAppTables( $appid ) { |
|
|
|
|
|
|
|
|
|
if( !self::connectScheme() ) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
$schema_manager = new OC\DB\MDB2SchemaManager(self::$migration_database); |
|
|
|
|
|
|
|
|
|
// There is a database.xml file |
|
|
|
|
$content = file_get_contents(OC_App::getAppPath($appid) . '/appinfo/database.xml' ); |
|
|
|
|
@ -538,29 +485,16 @@ class OC_Migrate{ |
|
|
|
|
file_put_contents( $file2, $content ); |
|
|
|
|
|
|
|
|
|
// Try to create tables |
|
|
|
|
$definition = self::$schema->parseDatabaseDefinitionFile( $file2 ); |
|
|
|
|
|
|
|
|
|
unlink( $file2 ); |
|
|
|
|
|
|
|
|
|
// Die in case something went wrong |
|
|
|
|
if( $definition instanceof MDB2_Schema_Error ) { |
|
|
|
|
OC_Log::write( 'migration', 'Failed to parse database.xml for: '.$appid, OC_Log::FATAL ); |
|
|
|
|
OC_Log::write( 'migration', $definition->getMessage().': '.$definition->getUserInfo(), OC_Log::FATAL ); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$definition['overwrite'] = true; |
|
|
|
|
|
|
|
|
|
$ret = self::$schema->createDatabase( $definition ); |
|
|
|
|
|
|
|
|
|
// Die in case something went wrong |
|
|
|
|
if( $ret instanceof MDB2_Error ) { |
|
|
|
|
try { |
|
|
|
|
$schema_manager->createDbFromStructure($file2); |
|
|
|
|
} catch(Exception $e) { |
|
|
|
|
unlink( $file2 ); |
|
|
|
|
OC_Log::write( 'migration', 'Failed to create tables for: '.$appid, OC_Log::FATAL ); |
|
|
|
|
OC_Log::write( 'migration', $ret->getMessage().': '.$ret->getUserInfo(), OC_Log::FATAL ); |
|
|
|
|
OC_Log::write( 'migration', $e->getMessage(), OC_Log::FATAL ); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return $tables; |
|
|
|
|
|
|
|
|
|
return $tables; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -646,7 +580,7 @@ class OC_Migrate{ |
|
|
|
|
if( !self::connectDB( $db ) ) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
$content = new OC_Migration_Content( self::$zip, self::$MDB2 ); |
|
|
|
|
$content = new OC_Migration_Content( self::$zip, self::$migration_database ); |
|
|
|
|
$provider->setData( self::$uid, $content, $info ); |
|
|
|
|
// Then do the import |
|
|
|
|
if( !$appsstatus[$id] = $provider->import( $info->apps->$id, $importinfo ) ) { |
|
|
|
|
|