diff options
Diffstat (limited to 'application/FileUtils.php')
-rw-r--r-- | application/FileUtils.php | 81 |
1 files changed, 71 insertions, 10 deletions
diff --git a/application/FileUtils.php b/application/FileUtils.php index 6cac9825..918cb83b 100644 --- a/application/FileUtils.php +++ b/application/FileUtils.php | |||
@@ -1,21 +1,82 @@ | |||
1 | <?php | 1 | <?php |
2 | |||
3 | require_once 'exceptions/IOException.php'; | ||
4 | |||
2 | /** | 5 | /** |
3 | * Exception class thrown when a filesystem access failure happens | 6 | * Class FileUtils |
7 | * | ||
8 | * Utility class for file manipulation. | ||
4 | */ | 9 | */ |
5 | class IOException extends Exception | 10 | class FileUtils |
6 | { | 11 | { |
7 | private $path; | 12 | /** |
13 | * @var string | ||
14 | */ | ||
15 | protected static $phpPrefix = '<?php /* '; | ||
8 | 16 | ||
9 | /** | 17 | /** |
10 | * Construct a new IOException | 18 | * @var string |
19 | */ | ||
20 | protected static $phpSuffix = ' */ ?>'; | ||
21 | |||
22 | /** | ||
23 | * Write data into a file (Shaarli database format). | ||
24 | * The data is stored in a PHP file, as a comment, in compressed base64 format. | ||
25 | * | ||
26 | * The file will be created if it doesn't exist. | ||
27 | * | ||
28 | * @param string $file File path. | ||
29 | * @param mixed $content Content to write. | ||
11 | * | 30 | * |
12 | * @param string $path path to the resource that cannot be accessed | 31 | * @return int|bool Number of bytes written or false if it fails. |
13 | * @param string $message Custom exception message. | 32 | * |
33 | * @throws IOException The destination file can't be written. | ||
14 | */ | 34 | */ |
15 | public function __construct($path, $message = '') | 35 | public static function writeFlatDB($file, $content) |
16 | { | 36 | { |
17 | $this->path = $path; | 37 | if (is_file($file) && !is_writeable($file)) { |
18 | $this->message = empty($message) ? 'Error accessing' : $message; | 38 | // The datastore exists but is not writeable |
19 | $this->message .= PHP_EOL . $this->path; | 39 | throw new IOException($file); |
40 | } else if (!is_file($file) && !is_writeable(dirname($file))) { | ||
41 | // The datastore does not exist and its parent directory is not writeable | ||
42 | throw new IOException(dirname($file)); | ||
43 | } | ||
44 | |||
45 | return file_put_contents( | ||
46 | $file, | ||
47 | self::$phpPrefix.base64_encode(gzdeflate(serialize($content))).self::$phpSuffix | ||
48 | ); | ||
49 | } | ||
50 | |||
51 | /** | ||
52 | * Read data from a file containing Shaarli database format content. | ||
53 | * | ||
54 | * If the file isn't readable or doesn't exist, default data will be returned. | ||
55 | * | ||
56 | * @param string $file File path. | ||
57 | * @param mixed $default The default value to return if the file isn't readable. | ||
58 | * | ||
59 | * @return mixed The content unserialized, or default if the file isn't readable, or false if it fails. | ||
60 | */ | ||
61 | public static function readFlatDB($file, $default = null) | ||
62 | { | ||
63 | // Note that gzinflate is faster than gzuncompress. | ||
64 | // See: http://www.php.net/manual/en/function.gzdeflate.php#96439 | ||
65 | if (! is_readable($file)) { | ||
66 | return $default; | ||
67 | } | ||
68 | |||
69 | $data = file_get_contents($file); | ||
70 | if ($data == '') { | ||
71 | return $default; | ||
72 | } | ||
73 | |||
74 | return unserialize( | ||
75 | gzinflate( | ||
76 | base64_decode( | ||
77 | substr($data, strlen(self::$phpPrefix), -strlen(self::$phpSuffix)) | ||
78 | ) | ||
79 | ) | ||
80 | ); | ||
20 | } | 81 | } |
21 | } | 82 | } |