PageRenderTime 23ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/b2b/core/model/system/mdl.backup.php

http://phpfor.googlecode.com/
PHP | 209 lines | 188 code | 19 blank | 2 comment | 32 complexity | 3e3343530387174237333307b3736e33 MD5 | raw file
  1. <?php
  2. class mdl_backup extends modelFactory{
  3. function getList($dir=null,$type=null){
  4. if(!$dir)$dir = HOME_DIR.'/upload';
  5. $handle=opendir($dir);
  6. if ($handle = opendir($dir)) {
  7. while (false !== ($file = readdir($handle))) {
  8. if(is_file($dir.'/'.$file) && strtolower(strstr($file,'.'))=='.tgz'){
  9. $pkgInfo = $this->getInfo($dir.'/'.$file);
  10. if($type && $type==$pkgInfo['type']){
  11. $return[filemtime($dir.'/'.$file)] = $pkgInfo;
  12. }else{
  13. $return[filemtime($dir.'/'.$file)] = $pkgInfo;
  14. }
  15. }
  16. }
  17. krsort($return);
  18. closedir($handle);
  19. }
  20. return $return;
  21. }
  22. function getInfo($pkgName){
  23. $pkgName = realpath($pkgName);
  24. if(!$this->_pkgTypes){
  25. foreach(get_class_methods($this) as $method){
  26. if(strtolower(substr($method,0,9))=='_pkginfo_'){
  27. $this->_pkgTypes[]=strtolower(substr($method,9));
  28. }
  29. }
  30. $this->_xml = $this->system->loadModel('utility/xml');
  31. $this->_tar = $this->system->loadModel('utility/tar');
  32. }
  33. $this->_tar->openTAR($pkgName);
  34. foreach($this->_pkgTypes as $type){
  35. if($this->_tar->containsFile($type.'.xml')){
  36. $method = '_pkgInfo_'.$type;
  37. $file = $this->_tar->getFile($type.'.xml');
  38. return array_merge(
  39. $this->_xml->xml2array($this->_tar->getContents($file)),
  40. array(
  41. 'type'=>$type,
  42. 'file'=>$pkgName,
  43. 'size'=>filesize($pkgName),
  44. 'mtime'=>filemtime($pkgName),
  45. ));
  46. }
  47. }
  48. $this->_tar->closeTAR();
  49. }
  50. function _pkgInfo_archive($infoArray){
  51. return $infoArray;
  52. }
  53. function startBackup($params,&$nexturl){
  54. set_time_limit(0);
  55. header("Content-type:text/html;charset=utf-8");
  56. $sizelimit = $params['sizelimit'];
  57. $filename = $params['filename'];
  58. $fileid = $params['fileid'];
  59. $tableid = $params['tableid'];
  60. $startid = $params['startid'];
  61. include_once(CORE_DIR.'/lib/mysqldumper.class.php');
  62. $dumper = new Mysqldumper(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
  63. $dumper->setDroptables(true);
  64. $dumper->tableid = $tableid;
  65. $dumper->startid = $startid;
  66. $backdir = HOME_DIR.'/backup';
  67. $finished = $dumper->multiDump($filename,$fileid,$sizelimit,$backdir);
  68. $fileid++;
  69. if(!$finished){
  70. $nexturl = "index.php?ctl=system/backup&act=backup&sizelimit=$sizelimit&filename=$filename&fileid=$fileid&tableid=".$dumper->tableid."&startid=".$dumper->startid;
  71. }else{
  72. $dir = HOME_DIR.'/backup';
  73. $tar = $this->system->loadModel('utility/tar');
  74. chdir($dir);
  75. for($i=1;$i<=$fileid;$i++){
  76. $tar->addFile('multibak_'.$filename.'_'.$i.'.sql');
  77. }
  78. //Add archive xml
  79. $verInfo = $this->system->version();
  80. $backupdata['app'] = $verInfo['app'];
  81. $backupdata['rev'] = $verInfo['rev'];
  82. $backupdata['vols'] = $fileid;
  83. $xml = $this->system->loadModel('utility/xml');
  84. $xmldata = $xml->array2xml($backupdata,'backup');
  85. file_put_contents('archive.xml',$xmldata);
  86. $tar->addFile('archive.xml');
  87. $tar->filename = 'multibak_'.$filename.'.tgz';
  88. $tar->saveTar();
  89. for($i=1;$i<=$fileid;$i++){
  90. @unlink('multibak_'.$filename.'_'.$i.'.sql');
  91. }
  92. @unlink('archive.xml');
  93. }
  94. return $finished;
  95. }
  96. function recover($sTgz,$vols,$fileid){
  97. $prefix = substr($sTgz,0,23);
  98. $sTmpDir=HOME_DIR.'/tmp/'.md5($sTgz).'/';
  99. if($fileid==1){
  100. $rTar=$this->system->loadModel('utility/tar');
  101. mkdir_p($sTmpDir);
  102. if($rTar->openTAR(HOME_DIR.'/backup/'.$sTgz)){
  103. foreach($rTar->files as $id => $aFile) {
  104. if(substr($aFile['name'],-4)=='.sql'){
  105. $sPath=$sTmpDir.$aFile['name'];
  106. file_put_contents($sPath,$rTar->getContents($aFile));
  107. }
  108. }
  109. }
  110. $rTar->closeTAR();
  111. $this->comeback($sTmpDir.$prefix.'_1.sql');
  112. }else{
  113. $this->comeback($sTmpDir.$prefix.'_'.$fileid.'.sql');
  114. }
  115. if($vols==$fileid){
  116. //do updatescripts
  117. $info = $this->getInfo(HOME_DIR.'/backup/'.$sTgz);
  118. $pkgRev = $info['backup']['rev'];
  119. $ver = $this->system->version();
  120. $appRev = $ver['rev'];
  121. $sDir = realpath(CORE_DIR.'/updatescripts');
  122. if($pkgRev<$appRev){
  123. $upgrade = &$this->system->loadModel('system/upgrade');
  124. echo '<pre>';
  125. $scripts = $upgrade->scripts($pkgRev,$appRev);
  126. foreach($scripts as $sqlFile){
  127. if(false !== ($sql = file_get_contents(CORE_DIR.'/updatescripts/'.$sqlFile[0]))){
  128. foreach($this->db->splitSql($sql) as $line){
  129. $this->db->exec($line);
  130. }
  131. }
  132. }
  133. $this->db->exec("drop table if exists sdb_dbver");
  134. $this->db->exec("create table sdb_dbver(`{$appRev}` varchar(255)) type = MYISAM");
  135. }
  136. $this->__finish($sTmpDir);
  137. }
  138. }
  139. function comeback($sFile){
  140. $rFile=fopen($sFile,'r');
  141. if(mysql_get_server_info() > '5.0.1') {
  142. $this->db->query("SET sql_mode=''",true);
  143. }
  144. while($sTmp=fgetline($rFile)){
  145. $sTmp = trim($sTmp);
  146. if($sTmp!='' && substr($sTmp,0,1)!='#' && substr($sTmp,0,2)!='/*'){
  147. if(strpos($sTmp,'cachemgr') && strpos($sTmp,'INSERT INTO')===0){
  148. continue;
  149. }
  150. $sTmp = str_replace('{shopexdump_table_prefix}',DB_PREFIX,$sTmp);
  151. if(!defined("DB_OLDVERSION")||!DB_OLDVERSION)
  152. $sTmp = str_replace('{shopexdump_create_specification}',' DEFAULT CHARACTER SET utf8',$sTmp);
  153. else
  154. $sTmp = str_replace('{shopexdump_create_specification}','',$sTmp);
  155. if($this->db->query($sTmp,true)){
  156. continue;
  157. }else{
  158. echo 'Error:'.$sTmp.'<br>';
  159. }
  160. }
  161. }
  162. fclose($rFile);
  163. }
  164. function removeTgz($aTgz){
  165. foreach($aTgz as $sFile){
  166. @unlink(HOME_DIR.'/backup/'.$sFile);
  167. }
  168. return '';
  169. }
  170. function __finish($sDir){
  171. $this->__removeDir($sDir);
  172. return $sDir;
  173. }
  174. function __removeDir($sDir){
  175. if($rHandle=opendir($sDir)){
  176. while(false!==($sItem=readdir($rHandle))){
  177. if ($sItem!='.' && $sItem!='..'){
  178. if(is_dir($sDir.'/'.$sItem)){
  179. $this->__removeDir($sDir.'/'.$sItem);
  180. }else{
  181. unlink($sDir.'/'.$sItem);
  182. }
  183. }
  184. }
  185. closedir($rHandle);
  186. rmdir($sDir);
  187. }
  188. }
  189. }
  190. ?>