PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.6
VikBooking Hotel Booking Engine & PMS v1.8.6
1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 All 36 releases
vikbooking / admin / helpers / src / backup / export / archive.php

archive.php in VikBooking Hotel Booking Engine & PMS 1.8.6, at admin/helpers/src/backup/export/archive.php

176 lines 3.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage core
5 * @author E4J s.r.l.
6 * @copyright Copyright (C) 2021 E4J s.r.l. All Rights Reserved.
7 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
8 * @link https://vikwp.com
9 */
10
11 // No direct access
12 defined('ABSPATH') or die('No script kiddies please!');
13
14 /**
15 * Manager used to handle the backup archive into the file system.
16 *
17 * @since 1.5
18 */
19 class VBOBackupExportArchive
20 {
21 /**
22 * The archive path.
23 *
24 * @var string
25 */
26 private $path;
27
28 /**
29 * Class constructor.
30 *
31 * @param $path The relative path in which the archive should be created.
32 */
33 public function __construct($path)
34 {
35 $this->path = $path;
36
37 if (JFolder::exists($this->path))
38 {
39 // clean path if already occupied
40 JFolder::delete($this->path);
41 }
42
43 // create archive folder
44 if (!JFolder::create($this->path))
45 {
46 throw new Exception(sprintf('Unable to create the backup folder: %s', $this->path), 500);
47 }
48 }
49
50 /**
51 * Returns the archive path.
52 *
53 * @return string
54 */
55 public function getPath()
56 {
57 return $this->path;
58 }
59
60 /**
61 * Creates a new empty folder, only if not exists.
62 *
63 * @return boolean
64 */
65 public function addEmptyFolder($folder)
66 {
67 if (!JFolder::exists($folder))
68 {
69 // in case the folder doesn't exist, create it
70 return JFolder::create($folder);
71 }
72
73 // the folder already exists
74 return true;
75 }
76
77 /**
78 * Copies the specified file into the archive.
79 *
80 * @param string $src The source absolute path.
81 * @param string $dest The destination relative path.
82 *
83 * @return boolean True on success, false otherwise.
84 */
85 public function addFile($src, $dest)
86 {
87 // build the destination path
88 $dest = JPath::clean($this->path . '/' . $dest);
89
90 // create directory in which the file should be placed
91 if (!$this->addEmptyFolder(dirname($dest)))
92 {
93 throw new Exception(sprintf('Cannot create folder: %s', $folder), 500);
94 }
95
96 // copy the source file into the archive
97 return JFile::copy($src, $dest);
98 }
99
100 /**
101 * Opens a new file in append mode and writes there the given buffer.
102 *
103 * @param string $buffer The buffer to write.
104 * @param string $dest The destination relative path.
105 *
106 * @return mixed The written bytes on success, false otherwise.
107 */
108 public function addBuffer($buffer, $dest)
109 {
110 // build the destination path
111 $dest = JPath::clean($this->path . '/' . $dest);
112
113 // create directory in which the file should be placed
114 if (!$this->addEmptyFolder(dirname($dest)))
115 {
116 throw new Exception(sprintf('Cannot create folder: %s', $folder), 500);
117 }
118
119 $bytes = 0;
120
121 // open file in append mode
122 $fp = fopen($dest, 'a');
123
124 // divide the whole string in chunks of 2^12 bytes
125 $chunks = str_split($buffer, 4096);
126
127 // copy chunks one by one
128 foreach ($chunks as $chunk)
129 {
130 // attempt to write the buffer into the file
131 $bytes += fwrite($fp, $chunk, strlen($chunk));
132 }
133
134 // close file pointer
135 fclose($fp);
136
137 return $bytes;
138 }
139
140 /**
141 * Compresses the archive.
142 *
143 * @param string $name An optional name to use for the archive. If not specified, it will be
144 * equals to the folder to compress.
145 *
146 * @return string The archive path.
147 */
148 public function compress($name = null)
149 {
150 $destination = $this->path;
151
152 if ($name)
153 {
154 // in case a name is specified, go to the parent folder and
155 // append the file name at the end
156 $destination = dirname($destination) . DIRECTORY_SEPARATOR . $name;
157 }
158
159 if (!preg_match("/\.zip$/i", $destination))
160 {
161 // concatenate the file extension if missing
162 $destination .= '.zip';
163 }
164
165 // try to compress the archive
166 $status = VBOArchiveFactory::compress($this->path, $destination);
167
168 if (!$status)
169 {
170 throw new Exception(sprintf('Unable to compress the archive: %s', $destination), 500);
171 }
172
173 return $destination;
174 }
175 }
176