using data cache

This commit is contained in:
Yuri Kuznetsov
2020-09-20 20:44:09 +03:00
parent ca969ee79b
commit e7b51ef61d
5 changed files with 63 additions and 78 deletions
+2
View File
@@ -44,6 +44,7 @@ use Espo\Core\{
Loaders\FileManager as FileManagerLoader,
Loaders\DataManager as DataManagerLoader,
Loaders\Metadata as MetadataLoader,
Loaders\DataCache as DataCacheLoader,
};
use ReflectionClass;
@@ -60,6 +61,7 @@ class Application
'log' => LogLoader::class,
'fileManager' => FileManagerLoader::class,
'dataManager' => DataManagerLoader::class,
'dataCache' => DataCacheLoader::class,
'metadata' => MetadataLoader::class,
];
+10 -9
View File
@@ -32,27 +32,28 @@ namespace Espo\Core\Loaders;
use Espo\Core\{
Utils\Metadata as MetadataService,
InjectableFactory,
Utils\File\Manager as FileManager,
Utils\DataCache,
Utils\Config,
};
class Metadata implements Loader
{
protected $injectableFactory;
protected $fileManager;
protected $dataCache;
protected $config;
public function __construct(InjectableFactory $injectableFactory, Config $config)
public function __construct(FileManager $fileManager, DataCache $dataCache, Config $config)
{
$this->injectableFactory = $injectableFactory;
$this->fileManager = $fileManager;
$this->dataCache = $dataCache;
$this->config = $config;
}
public function load() : MetadataService
{
return $this->injectableFactory->createWith(
MetadataService::class,
[
'useCache' => $this->config->get('useCache'),
]
);
$useCache = $this->config->get('useCache');
return new MetadataService($this->fileManager, $this->dataCache, $useCache);
}
}
+17 -34
View File
@@ -35,6 +35,7 @@ use Espo\Core\{
Utils\File\Unifier,
Utils\Module,
Utils\Metadata\Helper,
Utils\DataCache,
};
class Metadata
@@ -49,17 +50,15 @@ class Metadata
private $objUnifier;
private $fileManager;
private $module;
private $metadataHelper;
protected $pathToModules = 'application/Espo/Modules';
protected $cacheFile = 'data/cache/application/metadata.php';
protected $cacheKey = 'metadata';
protected $objCacheFile = 'data/cache/application/objMetadata.php';
protected $objCacheKey = 'objMetadata';
protected $paths = [
'corePath' => 'application/Espo/Resources/metadata',
@@ -75,10 +74,15 @@ class Metadata
private $changedData = [];
public function __construct(FileManager $fileManager, bool $useCache = false)
private $fileManager;
private $dataCache;
public function __construct(FileManager $fileManager, DataCache $dataCache, bool $useCache = false)
{
$this->useCache = $useCache;
$this->fileManager = $fileManager;
$this->dataCache = $dataCache;
$this->useCache = $useCache;
}
protected function getObjUnifier()
@@ -93,7 +97,7 @@ class Metadata
protected function getModule()
{
if (!isset($this->module)) {
$this->module = new Module($this->fileManager, $this->useCache);
$this->module = new Module($this->fileManager, $this->dataCache, $this->useCache);
}
return $this->module;
@@ -108,19 +112,6 @@ class Metadata
return $this->metadataHelper;
}
public function isCached()
{
if (!$this->useCache) {
return false;
}
if (file_exists($this->cacheFile)) {
return true;
}
return false;
}
/**
* Init metadata.
*/
@@ -130,8 +121,8 @@ class Metadata
$reload = true;
}
if (file_exists($this->cacheFile) && !$reload) {
$this->data = $this->fileManager->getPhpContents($this->cacheFile);
if ($this->dataCache->has($this->cacheKey) && !$reload) {
$this->data = $this->dataCache->get($this->cacheKey);
return;
}
@@ -143,11 +134,7 @@ class Metadata
$this->data = Util::objectToArray($objData);
if ($this->useCache) {
$isSaved = $this->fileManager->putPhpContents($this->cacheFile, $this->data);
if ($isSaved === false) {
$GLOBALS['log']->emergency('Metadata:init() - metadata has not been saved to a cache file');
}
$this->dataCache->store($this->cacheKey, $this->data);
}
}
@@ -207,8 +194,8 @@ class Metadata
$reload = true;
}
if (file_exists($this->objCacheFile) && !$reload) {
$this->objData = $this->fileManager->getPhpContents($this->objCacheFile);
if ($this->dataCache->has($this->objCacheKey) && !$reload) {
$this->objData = $this->dataCache->get($this->objCacheKey);
return;
}
@@ -217,11 +204,7 @@ class Metadata
$this->objData = $this->addAdditionalFieldsObj($this->objData);
if ($this->useCache) {
$isSaved = $this->fileManager->putPhpContents($this->objCacheFile, $this->objData, true);
if ($isSaved === false) {
$GLOBALS['log']->emergency('Metadata:objInit() - metadata has not been saved to a cache file');
}
$this->dataCache->store($this->objCacheKey, $this->objData);
}
}
+10 -11
View File
@@ -33,6 +33,7 @@ use Espo\Core\{
Exceptions\Error,
Utils\File\Manager as FileManager,
Utils\File\FileUnifier,
Utils\DataCache,
};
/**
@@ -40,15 +41,13 @@ use Espo\Core\{
*/
class Module
{
private $fileManager;
private $useCache;
private $unifier;
protected $data = null;
protected $cacheFile = 'data/cache/application/modules.php';
protected $cacheKey = 'modules';
protected $paths = [
'corePath' => 'application/Espo/Resources/module.json',
@@ -56,9 +55,13 @@ class Module
'customPath' => 'custom/Espo/Custom/Resources/module.json',
];
public function __construct(FileManager $fileManager, bool $useCache = false)
private $fileManager;
private $dataCache;
public function __construct(FileManager $fileManager, DataCache $dataCache, bool $useCache = false)
{
$this->fileManager = $fileManager;
$this->dataCache = $dataCache;
$this->unifier = new FileUnifier($this->fileManager);
@@ -91,8 +94,8 @@ class Module
protected function init()
{
if (file_exists($this->cacheFile) && $this->useCache) {
$this->data = $this->fileManager->getPhpContents($this->cacheFile);
if ($this->dataCache->has($this->cacheKey) && $this->useCache) {
$this->data = $this->dataCache->get($this->cacheKey);
return;
}
@@ -100,11 +103,7 @@ class Module
$this->data = $this->unifier->unify($this->paths, true);
if ($this->useCache) {
$result = $this->fileManager->putPhpContents($this->cacheFile, $this->data, false, true);
if ($result === false) {
throw new Error('Module: Could not save unified module data.');
}
$this->dataCache->store($this->cacheKey, $this->data);
}
}
}
+24 -24
View File
@@ -31,6 +31,11 @@ namespace tests\unit\Espo\Core\Utils;
use tests\unit\ReflectionHelper;
use Espo\Core\Utils\Metadata;
use Espo\Core\Utils\File\Manager as FileManager;
use Espo\Core\Utils\Log;
use Espo\Core\Utils\DataCache;
class MetadataTest extends \PHPUnit\Framework\TestCase
{
protected $object;
@@ -39,33 +44,19 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
protected $reflection;
protected $defaultCacheFile = 'tests/unit/testData/Utils/Metadata/metadata.php';
protected $defaultObjCacheFile = 'tests/unit/testData/Utils/Metadata/metadata.php';
protected $cacheFile = 'tests/unit/testData/cache/metadata.php';
protected $objCacheFile = 'tests/unit/testData/cache/objMetadata.php';
protected function setUp() : void
{
/*copy defaultCacheFile file to cache*/
if (!file_exists($this->cacheFile)) {
copy($this->defaultCacheFile, $this->cacheFile);
}
$this->fileManager = new FileManager();
if (!file_exists($this->objCacheFile)) {
copy($this->defaultObjCacheFile, $this->objCacheFile);
}
$this->dataCache = $this->getMockBuilder(DataCache::class)->disableOriginalConstructor()->getMock();
$this->objects['fileManager'] = new \Espo\Core\Utils\File\Manager();
$this->log = $this->getMockBuilder(Log::class)->disableOriginalConstructor()->getMock();
$this->objects['log'] = $this->getMockBuilder('\\Espo\\Core\\Utils\\Log')->disableOriginalConstructor()->getMock();
$GLOBALS['log'] = $this->objects['log'];
$GLOBALS['log'] = $this->log;
$this->object = new \Espo\Core\Utils\Metadata($this->objects['fileManager'], true);
$this->object = new Metadata($this->fileManager, $this->dataCache, true);
$this->reflection = new ReflectionHelper($this->object);
$this->reflection->setProperty('cacheFile', $this->cacheFile);
$this->reflection->setProperty('objCacheFile', $this->objCacheFile);
}
protected function tearDown() : void
@@ -96,7 +87,9 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
),
),
);
$this->object->set('entityDefs', 'Attachment', $data);
$this->assertEquals('Views.Test.Custom', $this->object->get('entityDefs.Attachment.fields.name.view'));
$this->assertEquals(150, $this->object->get('entityDefs.Attachment.fields.name.maxLength'));
@@ -116,6 +109,7 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
),
),
);
$this->object->set('entityDefs', 'Attachment', $data);
$this->assertEquals(200, $this->object->get('entityDefs.Attachment.fields.name.maxLength'));
$this->assertEquals('Views.Test.Custom', $this->object->get('entityDefs.Attachment.fields.name.view'));
@@ -158,6 +152,7 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
),
),
);
$this->assertEquals($result, $this->reflection->getProperty('deletedData'));
$data = array (
@@ -182,15 +177,16 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
$this->assertNotNull($this->object->get('entityDefs.Attachment.fields.name.required'));
$this->object->clearChanges();
$this->assertEquals(array(), $this->reflection->getProperty('deletedData'));
$this->assertEquals([], $this->reflection->getProperty('deletedData'));
}
public function testUndelete()
{
$data = array (
$data = [
'fields.name.type',
'fields.name.required',
);
];
$this->object->delete('entityDefs', 'Attachment', $data);
$this->assertNull($this->object->get('entityDefs.Attachment.fields.name.type'));
@@ -242,11 +238,13 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
$paths = $this->reflection->getProperty('paths');
$paths['customPath'] = $customPath;
$this->reflection->setProperty('paths', $paths);
$this->assertNull($this->object->getCustom('entityDefs', 'Lead'));
$customData = $this->object->getCustom('entityDefs', 'Lead', (object) []);
$this->assertTrue(is_object($customData));
$data = (object) [
@@ -257,6 +255,7 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
],
],
];
$this->object->saveCustom('entityDefs', 'Lead', $data);
$this->assertEquals($data, $this->object->getCustom('entityDefs', 'Lead'));
@@ -286,7 +285,8 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
$this->object->saveCustom('entityDefs', 'Lead', $data);
$savedFile = $customPath . '/entityDefs/Lead.json';
$fileContent = $this->objects['fileManager']->getContents($savedFile);
$fileContent = $this->fileManager->getContents($savedFile);
$savedData = \Espo\Core\Utils\Json::decode($fileContent);
$this->assertEquals($data, $savedData);
@@ -324,7 +324,7 @@ class MetadataTest extends \PHPUnit\Framework\TestCase
$this->object->saveCustom('entityDefs', 'Lead', $customData);
$savedFile = $customPath . '/entityDefs/Lead.json';
$fileContent = $this->objects['fileManager']->getContents($savedFile);
$fileContent = $this->fileManager->getContents($savedFile);
$savedData = \Espo\Core\Utils\Json::decode($fileContent);
$expectedData = (object) [