Use json for migration data

This commit is contained in:
Tom Needham 2012-03-03 17:30:21 +00:00
parent 34f05ba180
commit 691103acd5
4 changed files with 178 additions and 90 deletions

View File

@ -4,69 +4,71 @@ class OC_Migrate_Provider_Bookmarks extends OC_Migrate_Provider{
// Create the xml for the user supplied
function export($uid){
$doc = new DOMDocument();
$doc->formatOutput = true;
$bookmarks = $doc->createElement('bookmarks');
$bookmarks = $doc->appendChild($bookmarks);
$bookmarks = array();
$query = OC_DB::prepare("SELECT * FROM *PREFIX*bookmarks WHERE *PREFIX*bookmarks.user_id = ?");
$bookmarksdata =& $query->execute(array($uid));
// Foreach bookmark
while ($row = $bookmarksdata->fetchRow()) {
$bookmark = $doc->createElement('bookmark');
$bookmark = $bookmarks->appendChild($bookmark);
$attr = $doc->createElement('title');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['title']);
$attr->appendChild($value);
$attr = $doc->createElement('url');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['url']);
$attr->appendChild($value);
$attr = $doc->createElement('added');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['added']);
$attr->appendChild($value);
$attr = $doc->createElement('lastmodified');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['lastmodified']);
$attr->appendChild($value);
$attr = $doc->createElement('public');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['public']);
$attr->appendChild($value);
$attr = $doc->createElement('clickcount');
$attr = $bookmark->appendChild($attr);
$value = $doc->createTextNode($row['clickcount']);
$attr->appendChild($value);
$attr = $doc->createElement('tags');
$tags = $bookmark->appendChild($attr);
// Get the tags
$query = OC_DB::prepare("SELECT * FROM *PREFIX*bookmarks_tags WHERE *PREFIX*bookmarks_tags.bookmark_id = ?");
$tagsdata =& $query->execute(array($row['id']));
$tags = array();
// Foreach tag
while ($row = $tagsdata->fetchRow()) {
$attr = $doc->createElement('tag');
$attr = $tags->appendChild($attr);
$value = $doc->createTextNode($row['tag']);
$attr->appendChild($value);
}
$tags[] = $row['tag'];
}
$bookmarks[] = array(
'url' => $row['url'],
'title' => $row['title'],
'public' => $row['public'],
'added' => $row['added'],
'lastmodified' => $row['lastmodified'],
'clickcount' => $row['clickcount'],
'tags' => $tags
);
}
return $doc;
return array('bookmarks' => $bookmarks);
}
// Import function for bookmarks
function import($data,$uid){
// Different import code for different versions of the app
switch($data['info']['version']){
default:
// Foreach bookmark
foreach($data['data']['bookmarks'] as $bookmark){
$query = OC_DB::prepare( "INSERT INTO `*PREFIX*bookmarks` ( `url`, `title`, `user_id`, `public`, `added`, `lastmodified`, `clickcount` ) VALUES( ?, ?, ?, ?, ?, ?, ? )" );
$result = $query->execute( array(
$bookmark['url'],
$bookmark['title'],
$uid,
$bookmark['public'],
$bookmark['added'],
$bookmark['lastmodified'],
$bookmark['clickcount']
) );
// Now add the tags
$id = OC_DB::insertid();
foreach($bookmark['tags'] as $tag){
$query = OC_DB::prepare( "INSERT INTO `*PREFIX*bookmarks_tags` ( `id`, `tag` ) VALUES( ?, ? )" );
$result = $query->execute( array( $id, $tag));
}
}
break;
}
// Finished import
}
}
new OC_Migrate_Provider_Bookmarks('bookmarks');

View File

@ -49,11 +49,11 @@ if (isset($_POST['user_migrate'])) {
// adding owncloud system files
OC_Log::write('user_migrate',"Adding app data to user export file",OC_Log::INFO);
// Call to OC_Migrate for the xml file.
$appdatafile = $tempdir . "/appdata.xml";
$appdatafile = $tempdir . "/userexport.json";
$appdata = OC_Migrate::export(OC_User::getUser());
file_put_contents($appdatafile, $appdata);
$zip->addFile($appdatafile, "appdata.xml");
$zip->addFile($appdatafile, "userexport.json");
}

View File

@ -42,49 +42,134 @@ class OC_Migrate{
*/
public static function export($uid){
$doc = new DOMDocument();
$doc->formatOutput = true;
OC_Log::write('user_migrate','App data export started for user: '.$uid,OC_Log::INFO);
foreach(self::$providers as $provider){
// Only export database users, otherwise we get chaos
if(OC_User_Database::userExists($uid)){
$data = array();
$data['userid'] = OC_User::getUser();
OC_Log::write('user_migrate','Getting app data for app:'.$provider->appid,OC_Log::INFO);
$app = $doc->createElement('app');
$app = $doc->appendChild($app);
$app->setAttribute('id',$provider->appid);
// Append app info
$appinfo = $doc->importNode( self::appInfoXML( $provider->appid )->documentElement, true );
$app->appendChild( $appinfo );
$query = OC_DB::prepare( "SELECT uid, password FROM *PREFIX*users WHERE uid LIKE ?" );
$result = $query->execute( array( $uid));
$row = $result->fetchRow();
if($row){
$data['hash'] = $row['password'];
} else {
return false;
exit();
}
$appdata = $doc->createElement('appdata');
$appdata = $app->appendChild($appdata);
// Add the app data
$appdatanode = $doc->importNode( $provider->export($uid)->documentElement, true );
$appdata->appendChild( $appdatanode );
foreach(self::$providers as $provider){
$data['apps'][$prodider->appid]['info'] = OC_App::getAppInfo($provider->appid);
$data['apps'][$provider->appid]['data'] = $provider->export($uid);
}
return self::indent(json_encode($data));
} else {
return false;
}
return $doc->saveXML();
}
/**
* generates the app info xml
* @param string appid
* @return string xml app info
*/
public static function appInfoXML($appid){
* @breif imports a new user
* @param $data json data for the user
* @param $uid optional uid to use
* @return json reply
*/
public function import($data,$uid=null){
// Import the data
$data = json_decode($data);
if(is_null($data)){
// TODO LOG
return false;
exit();
}
// Specified user or use original
$uid = !is_null($uid) ? $uid : $data['userid'];
// Check if userid exists
if(OC_User::userExists($uid)){
// TODO LOG
return false;
exit();
}
// Create the user
$query = OC_DB::prepare( "INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )" );
$result = $query->execute( array( $uid, $data['hash']));
if(!$result){
// TODO LOG
return false;
exit();
}
foreach($data['app'] as $app){
// Check if supports migration and is enabled
if(in_array($app, self::$providers)){
if(OC_App::isEnabled($app)){
$provider->import($data['app'][$app],$uid);
}
}
}
}
private static function indent($json){
$result = '';
$pos = 0;
$strLen = strlen($json);
$indentStr = ' ';
$newLine = "\n";
$prevChar = '';
$outOfQuotes = true;
$info = OC_App::getAppInfo($appid);
for ($i=0; $i<=$strLen; $i++) {
$doc = new DOMDocument();
$appinfo = $doc->createElement('appinfo');
$appinfo = $doc->appendChild($appinfo);
$version = $doc->createElement('version');
$appinfo->appendChild($version);
$versionval = $doc->createTextNode($info['version']);
$version->appendChild($versionval);
// Grab the next character in the string.
$char = substr($json, $i, 1);
return $doc;
}
// Are we inside a quoted string?
if ($char == '"' && $prevChar != '\\') {
$outOfQuotes = !$outOfQuotes;
// If this character is the end of an element,
// output a new line and indent the next line.
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
$result .= $newLine;
$pos --;
for ($j=0; $j<$pos; $j++) {
$result .= $indentStr;
}
}
// Add the character to the result string.
$result .= $char;
// If the last character was the beginning of an element,
// output a new line and indent the next line.
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
$result .= $newLine;
if ($char == '{' || $char == '[') {
$pos ++;
}
for ($j = 0; $j < $pos; $j++) {
$result .= $indentStr;
}
}
$prevChar = $char;
}
return $result;
}
}

View File

@ -13,14 +13,15 @@ abstract class OC_Migrate_Provider{
/**
* exports data for apps
* @param string $uid
* @return string xml data for that app
* @return array appdata to be exported
*/
abstract function export($uid);
/**
* imports data for the app
* @param string $query
* @return array An array of OC_Search_Result's
* @param $data array of data. eg: array('info'=> APPINFO, 'data'=>APPDATA ARRAY)
* @param $info array of info of the source install
* @return void
*/
//abstract function import($data);
abstract function import($data,$uid);
}