From e2f6aa3a57c641c4fe4bebea9497f3801d7d74bc Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Thu, 14 Apr 2016 15:41:04 +0200
Subject: [PATCH] factor out redis configuration into it's own factory

---
 lib/private/Memcache/Redis.php | 31 +------------
 lib/private/RedisFactory.php   | 85 ++++++++++++++++++++++++++++++++++
 lib/private/Server.php         | 14 ++++++
 3 files changed, 101 insertions(+), 29 deletions(-)
 create mode 100644 lib/private/RedisFactory.php

diff --git a/lib/private/Memcache/Redis.php b/lib/private/Memcache/Redis.php
index b3444a2b4e9..5b6955823c4 100644
--- a/lib/private/Memcache/Redis.php
+++ b/lib/private/Memcache/Redis.php
@@ -37,33 +37,7 @@ class Redis extends Cache implements IMemcacheTTL {
 	public function __construct($prefix = '') {
 		parent::__construct($prefix);
 		if (is_null(self::$cache)) {
-			// TODO allow configuring a RedisArray, see https://github.com/nicolasff/phpredis/blob/master/arrays.markdown#redis-arrays
-			self::$cache = new \Redis();
-			$config = \OC::$server->getSystemConfig()->getValue('redis', array());
-			if (isset($config['host'])) {
-				$host = $config['host'];
-			} else {
-				$host = '127.0.0.1';
-			}
-			if (isset($config['port'])) {
-				$port = $config['port'];
-			} else {
-				$port = 6379;
-			}
-			if (isset($config['timeout'])) {
-				$timeout = $config['timeout'];
-			} else {
-				$timeout = 0.0; // unlimited
-			}
-
-			self::$cache->connect($host, $port, $timeout);
-			if(isset($config['password']) && $config['password'] !== '') {
-				self::$cache->auth($config['password']);
-			}
-
-			if (isset($config['dbindex'])) {
-				self::$cache->select($config['dbindex']);
-			}
+			self::$cache = \OC::$server->getGetRedisFactory()->getInstance();
 		}
 	}
 
@@ -201,8 +175,7 @@ class Redis extends Cache implements IMemcacheTTL {
 	}
 
 	static public function isAvailable() {
-		return extension_loaded('redis')
-		&& version_compare(phpversion('redis'), '2.2.5', '>=');
+		return \OC::$server->getGetRedisFactory()->isAvailable();
 	}
 }
 
diff --git a/lib/private/RedisFactory.php b/lib/private/RedisFactory.php
new file mode 100644
index 00000000000..d286c0167b2
--- /dev/null
+++ b/lib/private/RedisFactory.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC;
+
+class RedisFactory {
+	/** @var  \Redis */
+	private $instance;
+
+	/** @var  SystemConfig */
+	private $config;
+
+	/**
+	 * RedisFactory constructor.
+	 *
+	 * @param SystemConfig $config
+	 */
+	public function __construct(SystemConfig $config) {
+		$this->config = $config;
+	}
+
+	private function create() {
+		$this->instance = new \Redis();
+		// TODO allow configuring a RedisArray, see https://github.com/nicolasff/phpredis/blob/master/arrays.markdown#redis-arrays
+		$config = $this->config->getValue('redis', array());
+		if (isset($config['host'])) {
+			$host = $config['host'];
+		} else {
+			$host = '127.0.0.1';
+		}
+		if (isset($config['port'])) {
+			$port = $config['port'];
+		} else {
+			$port = 6379;
+		}
+		if (isset($config['timeout'])) {
+			$timeout = $config['timeout'];
+		} else {
+			$timeout = 0.0; // unlimited
+		}
+
+		$this->instance->connect($host, $port, $timeout);
+		if (isset($config['password']) && $config['password'] !== '') {
+			$this->instance->auth($config['password']);
+		}
+
+		if (isset($config['dbindex'])) {
+			$this->instance->select($config['dbindex']);
+		}
+	}
+
+	public function getInstance() {
+		if (!$this->isAvailable()) {
+			throw new \Exception('Redis support is not available');
+		}
+		if (!$this->instance instanceof \Redis) {
+			$this->create();
+		}
+
+		return $this->instance;
+	}
+
+	public function isAvailable() {
+		return extension_loaded('redis')
+		&& version_compare(phpversion('redis'), '2.2.5', '>=');
+	}
+}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index bbe6b88876f..f8e7ecfbe14 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -312,6 +312,10 @@ class Server extends ServerContainer implements IServerContainer {
 				'\\OC\\Memcache\\ArrayCache'
 			);
 		});
+		$this->registerService('RedisFactory', function (Server $c) {
+			$systemConfig = $c->getSystemConfig();
+			return new RedisFactory($systemConfig);
+		});
 		$this->registerService('ActivityManager', function (Server $c) {
 			return new \OC\Activity\Manager(
 				$c->getRequest(),
@@ -905,6 +909,16 @@ class Server extends ServerContainer implements IServerContainer {
 		return $this->query('MemCacheFactory');
 	}
 
+	/**
+	 * Returns an \OC\RedisFactory instance
+	 *
+	 * @return \OC\RedisFactory
+	 */
+	public function getGetRedisFactory() {
+		return $this->query('RedisFactory');
+	}
+
+
 	/**
 	 * Returns the current session
 	 *
-- 
GitLab