* @package backup * @version $Id$ * @link http://www.zentao.net */ class backupModel extends model { /** * Backup SQL * * @param string $backupFile * @access public * @return object */ public function backSQL($backupFile) { $zdb = $this->app->loadClass('zdb'); return $zdb->dump($backupFile); } /** * Backup file. * * @param string $backupFile * @access public * @return object */ public function backFile($backupFile) { $return = new stdclass(); $return->result = true; $return->error = ''; $this->app->loadClass('pclzip', true); $zip = new pclzip($backupFile); $zip->create($this->app->getAppRoot() . 'www/data/', PCLZIP_OPT_REMOVE_PATH, $this->app->getAppRoot() . 'www/data/'); if($zip->errorCode != 0) { $return->result = false; $return->error = $zip->errorInfo(); } return $return; } /** * Restore SQL * * @param string $backupFile * @access public * @return object */ public function restoreSQL($backupFile) { $zdb = $this->app->loadClass('zdb'); return $zdb->import($backupFile); } /** * Restore File * * @param string $backupFile * @access public * @return object */ public function restoreFile($backupFile) { $return = new stdclass(); $return->result = true; $return->error = ''; $this->app->loadClass('pclzip', true); $zip = new pclzip($backupFile); if($zip->extract(PCLZIP_OPT_PATH, $this->app->getAppRoot() . 'www/data/') == 0) { $return->result = false; $return->error = $zip->errorInfo(); } return $return; } /** * Add file header. * * @param string $fileName * @access public * @return bool */ public function addFileHeader($fileName) { $firstline = false; $die = "\n"; $fileSize = filesize($fileName); $fh = fopen($fileName, 'c+'); $delta = strlen($die); while(true) { $offset = ftell($fh); $line = fread($fh, 1024 * 1024); if(!$firstline) { $line = $die . $line; $firstline = true; } else { $line = $compensate . $line; } $compensate = fread($fh, $delta); fseek($fh, $offset); fwrite($fh, $line); if(ftell($fh) >= $fileSize) { fwrite($fh, $compensate); break; } } fclose($fh); return true; } /** * Remove file header. * * @param string $fileName * @access public * @return bool */ public function removeFileHeader($fileName) { $firstline = false; $die = "\n"; $fileSize = filesize($fileName); $fh = fopen($fileName, 'c+'); while(true) { $offset = ftell($fh); if($firstline and $delta) fseek($fh, $offset + $delta); $line = fread($fh, 1024 * 1024); if(!$firstline) { $firstline = true; $beforeLength = strlen($line); $line = str_replace($die, '', $line); $afterLength = strlen($line); $delta = $beforeLength - $afterLength; if($delta == 0) { fclose($fh); return true; } } fseek($fh, $offset); fwrite($fh, $line); if(ftell($fh) >= $fileSize - $delta) break; } ftruncate($fh, ($fileSize - $delta)); fclose($fh); return true; } }