diff --git a/DataStorage/Cache/CacheFactory.php b/DataStorage/Cache/CacheFactory.php index 6760ba8fb..eb126955e 100644 --- a/DataStorage/Cache/CacheFactory.php +++ b/DataStorage/Cache/CacheFactory.php @@ -13,7 +13,8 @@ * @version 1.0.0 * @link http://orange-management.com */ -namespace phpOMS\DataStorage\Database\Connection; +namespace phpOMS\DataStorage\Cache; + use phpOMS\DataStorage\Cache\CacheInterface; use phpOMS\DataStorage\Cache\FileCache; diff --git a/DataStorage/Cache/CachePool.php b/DataStorage/Cache/CachePool.php index 915432811..3f578bfef 100644 --- a/DataStorage/Cache/CachePool.php +++ b/DataStorage/Cache/CachePool.php @@ -17,7 +17,7 @@ namespace phpOMS\DataStorage\Cache; use phpOMS\Config\OptionsInterface; use phpOMS\Config\OptionsTrait; -use phpOMS\DataStorage\Database\Connection\CacheFactory; +use phpOMS\DataStorage\Cache\CacheFactory; /** diff --git a/DataStorage/Cache/FileCache.php b/DataStorage/Cache/FileCache.php index 582d20115..44657bda5 100644 --- a/DataStorage/Cache/FileCache.php +++ b/DataStorage/Cache/FileCache.php @@ -142,9 +142,9 @@ class FileCache implements CacheInterface return false; } - $path = File::sanitize($key); + $path = File::sanitize($key, '~'); - file_put_contents($this->cachePath . '/' . $path, $this->build($value, $expire)); + file_put_contents($this->cachePath . '/' . $path . '.cache', $this->build($value, $expire)); return false; } @@ -158,10 +158,11 @@ class FileCache implements CacheInterface return false; } - $path = File::sanitize($key); + $name = File::sanitize($key, '~'); + $path = $this->cachePath . '/' . $path . '.cache'; - if (!file_exists($this->cachePath . '/' . $path)) { - file_put_contents($this->cachePath . '/' . $path, $this->build($value, $expire)); + if (!file_exists($path)) { + file_put_contents($path, $this->build($value, $expire)); return true; } @@ -260,9 +261,9 @@ class FileCache implements CacheInterface private function getExpire(string $raw) : int { $expireStart = strpos($raw, self::DELIM); - $expireEnd = strpos($raw, self::DELIM, $expireStart); + $expireEnd = strpos($raw, self::DELIM, $expireStart+1); - return (int) substr($raw, $expireStart, $expireEnd); + return (int) substr($raw, $expireStart+1, $expireEnd - ($expireStart+1)); } /** @@ -274,11 +275,17 @@ class FileCache implements CacheInterface return null; } - $name = Directory::sanitize($key); - $created = Directory::created($path = $this->cachePath . '/' . $name)->getTimestamp(); + $name = File::sanitize($key, '~'); + $path = $this->cachePath . '/' . $name . '.cache'; + + if(!file_exists($path)) { + return null; + } + + $created = Directory::created($path)->getTimestamp(); $now = time(); - if ($expire >= 0 && $created + $expire > $now) { + if ($expire >= 0 && $created + $expire < $now) { return null; } @@ -286,10 +293,10 @@ class FileCache implements CacheInterface $type = $raw[0]; $expireStart = strpos($raw, self::DELIM); - $expireEnd = strpos($raw, self::DELIM, $expireStart); - $cacheExpire = substr($raw, $expireStart, $expireEnd); + $expireEnd = strpos($raw, self::DELIM, $expireStart+1); + $cacheExpire = substr($raw, $expireStart+1, $expireEnd - ($expireStart+1)); - if ($cacheExpire >= 0 && $created + $cacheExpire > $now) { + if ($cacheExpire >= 0 && $created + $cacheExpire < $now) { $this->delete($key); return null; @@ -316,7 +323,7 @@ class FileCache implements CacheInterface case CacheType::_SERIALIZABLE: case CacheType::_JSONSERIALIZABLE: $namespaceStart = strpos($raw, self::DELIM, $expireEnd); - $namespaceEnd = strpos($raw, self::DELIM, $namespaceStart); + $namespaceEnd = strpos($raw, self::DELIM, $namespaceStart+1); $namespace = substr($raw, $namespaceStart, $namespaceEnd); $value = $namespace::unserialize(substr($raw, $namespaceEnd + 1)); @@ -335,8 +342,8 @@ class FileCache implements CacheInterface return false; } - $name = File::sanitize($key); - $path = $this->cachePath . '/' . $name; + $name = File::sanitize($key, '~'); + $path = $this->cachePath . '/' . $name . '.cache'; if ($expire < 0 && file_exists($path)) { unlink($path); @@ -349,8 +356,8 @@ class FileCache implements CacheInterface $now = time(); $raw = file_get_contents($path); $expireStart = strpos($raw, self::DELIM); - $expireEnd = strpos($raw, self::DELIM, $expireStart); - $cacheExpire = substr($raw, $expireStart, $expireEnd); + $expireEnd = strpos($raw, self::DELIM, $expireStart+1); + $cacheExpire = substr($raw, $expireStart+1, $expireEnd - ($expireStart+1)); if ($cacheExpire >= 0 && $created + $cacheExpire > $now) { unlink($path); @@ -398,10 +405,11 @@ class FileCache implements CacheInterface return false; } - $path = File::sanitize($key); + $name = File::sanitize($key, '~'); + $path = $this->cachePath . '/' . $path . '.cache'; - if (file_exists($this->cachePath . '/' . $path)) { - file_put_contents($this->cachePath . '/' . $path, $this->build($value, $expire)); + if (file_exists($path)) { + file_put_contents($path, $this->build($value, $expire)); return true; } diff --git a/System/File/ContainerInterface.php b/System/File/ContainerInterface.php index 640665651..a95e9da62 100644 --- a/System/File/ContainerInterface.php +++ b/System/File/ContainerInterface.php @@ -197,13 +197,14 @@ interface ContainerInterface * Make name/path operating system safe. * * @param string $path Path of the resource + * @param string $replace Replace invalid chars with * * @return string * * @since 1.0.0 * @author Dennis Eichhorn */ - public static function sanitize(string $path) : string; + public static function sanitize(string $path, string $replace = '') : string; /** * Get amount of sub-resources. diff --git a/System/File/Local/Directory.php b/System/File/Local/Directory.php index 140094950..65d116a8d 100644 --- a/System/File/Local/Directory.php +++ b/System/File/Local/Directory.php @@ -192,10 +192,21 @@ class Directory extends FileAbstract implements DirectoryInterface /** * {@inheritdoc} + * todo: move to fileAbastract since it should be the same for file and directory? */ public static function created(string $path) : \DateTime { - // TODO: Implement created() method. + if(!file_exists($path)) { + $created = new \DateTime(); + $created->setTimestamp(0); + + return $created; + } + + $created = new \DateTime('now'); + $created->setTimestamp(filemtime($path)); + + return $created; } /** @@ -249,9 +260,9 @@ class Directory extends FileAbstract implements DirectoryInterface /** * {@inheritdoc} */ - public static function sanitize(string $path) : string + public static function sanitize(string $path, string $replace = '') : string { - return preg_replace('[^\w\s\d\.\-_~,;:\[\]\(\]\/]', '', $path); + return preg_replace('[^\w\s\d\.\-_~,;:\[\]\(\]\/]', $replace, $path); } /** diff --git a/System/File/Local/File.php b/System/File/Local/File.php index 38a3737bf..62d0199fa 100644 --- a/System/File/Local/File.php +++ b/System/File/Local/File.php @@ -143,9 +143,9 @@ class File extends FileAbstract implements FileInterface /** * {@inheritdoc} */ - public static function sanitize(string $path) : string + public static function sanitize(string $path, string $replace = '') : string { - return preg_replace('[^\w\s\d\.\-_~,;:\[\]\(\]]', '', $path); + return preg_replace('/[^\w\s\d\.\-_~,;\[\]\(\]]/', $replace, $path); } /**