|
|
@@ -0,0 +1,119 @@
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
|
|
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
|
+ *
|
|
|
+ * Licensed under The MIT License
|
|
|
+ * For full copyright and license information, please see the LICENSE.txt
|
|
|
+ * Redistributions of files must retain the above copyright notice.
|
|
|
+ *
|
|
|
+ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
|
+ * @link https://cakephp.org CakePHP(tm) Project
|
|
|
+ * @since 3.5.0
|
|
|
+ * @license https://opensource.org/licenses/mit-license.php MIT License
|
|
|
+ */
|
|
|
+namespace Cake\Shell;
|
|
|
+
|
|
|
+use Cake\Console\Shell;
|
|
|
+use Cake\Database\SchemaCache;
|
|
|
+use RuntimeException;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ORM Cache Shell.
|
|
|
+ *
|
|
|
+ * Provides a CLI interface to the ORM metadata caching features.
|
|
|
+ * This tool is intended to be used by deployment scripts so that you
|
|
|
+ * can prevent thundering herd effects on the metadata cache when new
|
|
|
+ * versions of your application are deployed, or when migrations
|
|
|
+ * requiring updated metadata are required.
|
|
|
+ */
|
|
|
+class SchemaCacheShell extends Shell
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Schema Cache
|
|
|
+ *
|
|
|
+ * @var \Cake\Database\SchemaCache
|
|
|
+ */
|
|
|
+ protected $_schemaCache;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Build metadata.
|
|
|
+ *
|
|
|
+ * @param string|null $name The name of the table to build cache data for.
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function build($name = null)
|
|
|
+ {
|
|
|
+ $cache = $this->_getOrmCache();
|
|
|
+ $tables = $cache->build($name);
|
|
|
+
|
|
|
+ foreach ($tables as $table) {
|
|
|
+ $this->verbose(sprintf('Cached "%s"', $table));
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->out('<success>Cache build complete</success>');
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Clear metadata.
|
|
|
+ *
|
|
|
+ * @param string|null $name The name of the table to clear cache data for.
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function clear($name = null)
|
|
|
+ {
|
|
|
+ $cache = $this->_getOrmCache();
|
|
|
+ $tables = $cache->clear($name);
|
|
|
+
|
|
|
+ foreach ($tables as $table) {
|
|
|
+ $this->verbose(sprintf('Cleared "%s"', $table));
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->out('<success>Cache clear complete</success>');
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets the Schema Cache instance
|
|
|
+ *
|
|
|
+ * @return \Cake\ORM\OrmCache
|
|
|
+ */
|
|
|
+ protected function _getOrmCache()
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ return new SchemaCache($this->params['connection']);
|
|
|
+ } catch (RuntimeException $e) {
|
|
|
+ $this->abort($e->getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get the option parser for this shell.
|
|
|
+ *
|
|
|
+ * @return \Cake\Console\ConsoleOptionParser
|
|
|
+ */
|
|
|
+ public function getOptionParser()
|
|
|
+ {
|
|
|
+ $parser = parent::getOptionParser();
|
|
|
+ $parser->addSubcommand('clear', [
|
|
|
+ 'help' => 'Clear all metadata caches for the connection. If a ' .
|
|
|
+ 'table name is provided, only that table will be removed.',
|
|
|
+ ])->addSubcommand('build', [
|
|
|
+ 'help' => 'Build all metadata caches for the connection. If a ' .
|
|
|
+ 'table name is provided, only that table will be cached.',
|
|
|
+ ])->addOption('connection', [
|
|
|
+ 'help' => 'The connection to build/clear metadata cache data for.',
|
|
|
+ 'short' => 'c',
|
|
|
+ 'default' => 'default',
|
|
|
+ ])->addArgument('name', [
|
|
|
+ 'help' => 'A specific table you want to clear/refresh cached data for.',
|
|
|
+ 'optional' => true,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return $parser;
|
|
|
+ }
|
|
|
+}
|