Verified Commit ceba7208 authored by Alexandre Morin's avatar Alexandre Morin
Browse files

feat (#11785) : merge branch feature/compressedStorage

parent 42cee766
......@@ -63,12 +63,11 @@ class Repository
}
}
// CONTAINER
/**
* Delete a container
* @param string $name The name of container
* @param mixed $metadata The object or array of metadata
*
*
* @return mixed The address/uri/identifier of created container on repository
*/
public function createContainer($name, $metadata=null)
......@@ -90,34 +89,34 @@ class Repository
* Update a container metadata
* @param string $name The name of container
* @param mixed $metadata The object or array of metadata
*
*
* @return bool
*/
public function updateContainer($name, $metadata)
{
}
/**
* Read a container metadata
* @param string $name The name of container
*
*
* @return mixed The object or array of metadata if available
*/
public function readContainer($name)
{
}
/**
* Delete a container
* @param string $name The name of container
*
*
* @return bool
*/
public function deleteContainer($name)
{
}
// OBJECTS
......@@ -142,21 +141,21 @@ class Repository
* Get a resource in repository
* @param mixed $path The path/uri/identifier of stored resource on repository
* @param integer $mode A bitmask of what to read 0=nothing - only touch | 1=data | 2=metadata | 3 data+metadata
*
*
* @return mixed The contents of resource
*/
public function readObject($path, $mode=1)
{
switch ($mode) {
case 0 :
case 0:
return $this->checkFile($path);
case 1 :
case 1:
return $this->readFile($path);
case 2 :
case 2:
return $this->readFile($path . '.metadata');
case 3 :
case 3:
$data = array();
$data[0] = $this->readFile($path);
if ($this->checkFile($path . ".metadata")) {
......@@ -167,17 +166,16 @@ class Repository
return $data;
default :
default:
throw new \Exception("This mode '$mode' isn't avalaible");
}
}
/**
/**
* Update a resource
* @param string $path The URI of the resource
* @param string $data The content
* @param object $metadata The new metadata to update or insert
* @param object $metadata The new metadata to update or insert
*
* @return bool
*/
......@@ -186,7 +184,7 @@ class Repository
if (!is_null($data)) {
$this->updateFile($path, $data);
}
if (!is_null($metadata)) {
if ($this->checkFile($path . ".metadata")) {
$this->updateFile($path . '.metadata', json_encode($metadata, \JSON_PRETTY_PRINT));
......@@ -198,7 +196,7 @@ class Repository
return true;
}
/**
/**
* Delete a resource
* @param string $path The URI of the resource
*
......@@ -207,11 +205,10 @@ class Repository
public function deleteObject($path)
{
$this->deleteFile($path);
if ($this->checkFile($path . ".metadata")) {
$this->deleteFile($path. ".metadata");
}
return true;
}
......@@ -221,7 +218,7 @@ class Repository
/**
* Get the directory to store
* @param string $pattern The name or pattern for the collection
*
*
* @return string The diretory name
*/
protected function getDir($pattern)
......@@ -237,7 +234,7 @@ class Repository
if (!is_dir($this->root . DIRECTORY_SEPARATOR . $dir)) {
mkdir($this->root . DIRECTORY_SEPARATOR . $dir, 0775, true);
}
}
}
return $dir;
......@@ -307,9 +304,7 @@ class Repository
return $package;
}
}
}
$package = str_pad('1', 8, "0", STR_PAD_LEFT);
//mkdir($this->root . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $package, 0775, true);
......@@ -324,7 +319,7 @@ class Repository
// Sanitize name
$name = basename($path);
$name = $this->getName($name, $dir);
$filename = $this->root . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $name;
if (!$fp = fopen($filename, 'x')) {
......@@ -349,7 +344,7 @@ class Repository
}
throw new \Exception("Error writing at path $path.");
}
return $dir . DIRECTORY_SEPARATOR . $name;
}
......@@ -358,18 +353,28 @@ class Repository
$filename = $this->root . DIRECTORY_SEPARATOR . $path;
if (!file_exists($filename)) {
return false;
return $this->checkCompressedFile($path);
}
return true;
}
protected function checkCompressedFile($path)
{
list ($zipfile, $filename) = $this->getCompressedPathinfo($path);
$zip = \laabs::newService('dependency/fileSystem/plugins/zip');
$compressedFiles = $zip->contents($zipfile);
return in_array($filename, $compressedFiles);
}
protected function readFile($path)
{
$filename = $this->root . DIRECTORY_SEPARATOR . $path;
if (!file_exists($filename)) {
throw new \Exception("Can not find resource at path $path");
return $this->readCompressedFile($path);
}
if (!$data = file_get_contents($filename)) {
......@@ -379,6 +384,51 @@ class Repository
return $data;
}
protected function readCompressedFile($path)
{
list ($zipfile, $filename) = $this->getCompressedPathinfo($path);
$tmpdir = \laabs::getTmpDir().DIRECTORY_SEPARATOR.str_replace(',', '.', microtime(true)).'.'.mt_rand();
$tmpfile = $tmpdir.DIRECTORY_SEPARATOR.basename($filename);
$zip = \laabs::newService('dependency/fileSystem/plugins/zip');
$zip->extract($zipfile, $tmpdir, $filename, null, 'e');
if (!$data = file_get_contents($tmpfile)) {
throw new \Exception("Can not read at path $path");
}
unlink($tmpfile);
return $data;
}
protected function getCompressedPathinfo($path)
{
$steps = \laabs\explode(DIRECTORY_SEPARATOR, $path);
$filename = $this->root;
while ($step = array_shift($steps)) {
$filename .= DIRECTORY_SEPARATOR.$step;
switch (true) {
case is_dir($filename):
continue;
case is_file($filename.'.7z'):
return [$filename.'.7z', $step.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $steps)];
case is_file($filename.'.zip'):
return [$filename.'.zip', $step.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $steps)];
default:
throw new \Exception("Can not find resource at path $path");
}
}
throw new \Exception("Can not find resource at path $path");
}
protected function updateFile($path, $data)
{
$filename = $this->root . DIRECTORY_SEPARATOR . $path;
......@@ -400,7 +450,12 @@ class Repository
if (!$wl = fwrite($fp, $data)) {
fclose($fp);
if (!unlink($filename)) {
throw new \Exception("Impossible to write at path $path - The backup " . $path . ".save" . " is available");
throw new \Exception(
"Impossible to write at path $path - The backup " .
$path .
".save" .
" is available"
);
}
rename($backup, $filename);
......@@ -410,9 +465,14 @@ class Repository
if ($wl != strlen($data)) {
fclose($fp);
if (!unlink($filename)) {
throw new \Exception("Error in writing the file $path and it's impossible to delete but a backup " . $path . ".save" . " is available");
throw new \Exception(
"Error in writing the file $path and it's impossible to delete but a backup " .
$path .
".save" .
" is available"
);
}
rename($backup, $filename);
throw new \Exception("Error in writing the file. The file doesn't have a modification");
}
......@@ -420,11 +480,18 @@ class Repository
if (!hash('md5', $data) != hash_file('md5', $filename)) {
fclose($fp);
if (!unlink($filename)) {
throw new \Exception("Error, the hash of data isn't equals at file hash and it's impossible to delete but a backup " . $path . ".save" . " is avaialble");
throw new \Exception(
"Error, the hash of data isn't equals at file hash and it's impossible to delete but a backup " .
$path .
".save" .
" is avaialble"
);
}
rename($backup, $filename);
throw new \Exception("Error, the hash of data isn't equals at file hash. The file doesn't have a modification");
throw new \Exception(
"Error, the hash of data isn't equals at file hash. The file doesn't have a modification"
);
}
if (!unlink($backup)) {
......@@ -435,49 +502,16 @@ class Repository
}
private function deleteFile($path)
{
{
$filename = $this->root . DIRECTORY_SEPARATOR . $path;
if (!file_exists($filename)) {
throw new \Exception("No resource found at path $path");
return $this->deleteCompressedFile($path);
}
if ($this->shred) {
$fp = fopen($filename, 'w');
$fileSize = filesize($filename);
$pass = 0;
//while ($pass != 6) {
$randNum = rand(0, 255);
$compNum = 255 - $randNum;
$lastNum = -1;
do {
$lastNum = rand(0, 255);
} while ($lastNum == $compNum);
// First pass with random num
$randContents = str_repeat(chr($randNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $randContents);
// Second pass with complement of random num
$compContents = str_repeat(chr($compNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $compContents);
// Third pass with a new random num
$lastContents = str_repeat(chr($lastNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $lastContents);
$pass++;
//}
fclose($fp);
$this->shred($filename);
}
if (!unlink($filename)) {
throw new \Exception("Can not delete at path $path");
......@@ -486,6 +520,52 @@ class Repository
return true;
}
protected function deleteCompressedFile($path)
{
list ($zipfile, $filename) = $this->getCompressedPathinfo($path);
$zip = \laabs::newService('dependency/fileSystem/plugins/zip');
return $zip->delete($zipfile, $filename);
}
protected function shred($filename)
{
$fp = fopen($filename, 'w');
$fileSize = filesize($filename);
$pass = 0;
//while ($pass != 6) {
$randNum = rand(0, 255);
$compNum = 255 - $randNum;
$lastNum = -1;
do {
$lastNum = rand(0, 255);
} while ($lastNum == $compNum);
// First pass with random num
$randContents = str_repeat(chr($randNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $randContents);
// Second pass with complement of random num
$compContents = str_repeat(chr($compNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $compContents);
// Third pass with a new random num
$lastContents = str_repeat(chr($lastNum), $fileSize);
fseek($fp, 0);
fwrite($fp, $lastContents);
$pass++;
//}
fclose($fp);
}
protected function writeMetadata($path, $metadata)
{
$dir = $this->root . DIRECTORY_SEPARATOR . dirname($path);
......@@ -551,7 +631,6 @@ class Repository
}
$jsonMetadata = $path . '=' . json_encode($metadata, \JSON_PRETTY_PRINT) . "\n";
$mdh = fopen($mdf, "r+");
$mdl = false;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment