From 7f8c5ed4975524a8f7c65a0169cc3932c4a8dbf3 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Thu, 1 Sep 2016 12:30:05 +0200
Subject: [PATCH] Activate APCu on PHP 7

Fix an issue with APCus inc and dec methods on PHP 7

see https://github.com/krakjoe/apcu/issues/183#issuecomment-244038221 for details
---
 .drone.yml                    |  2 +-
 lib/private/Memcache/APCu.php | 32 ++++++++++++++++++++++++++++++--
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/.drone.yml b/.drone.yml
index 6016ebd6981..bbeb85df927 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -10,7 +10,7 @@ build:
       - git submodule update --init
       - NOCOVERAGE=true TEST_SELECTION=NODB ./autotest.sh sqlite
   nodb-php7.0:
-    image: nextcloudci/php7.0:1.0.9
+    image: nextcloudci/php7.0:php7.0-1
     commands:
       - rm -rf data/* config/config.php # TODO: remove this - temporary fix for CI issues
       - git submodule update --init
diff --git a/lib/private/Memcache/APCu.php b/lib/private/Memcache/APCu.php
index 713ed152648..70f0d73d2d4 100644
--- a/lib/private/Memcache/APCu.php
+++ b/lib/private/Memcache/APCu.php
@@ -88,7 +88,21 @@ class APCu extends Cache implements IMemcache {
 	 */
 	public function inc($key, $step = 1) {
 		$this->add($key, 0);
-		return apcu_inc($this->getPrefix() . $key, $step);
+		/**
+		 * TODO - hack around a PHP 7 specific issue in APCu
+		 *
+		 * on PHP 7 the apcu_inc method on a non-existing object will increment
+		 * "0" and result in "1" as value - therefore we check for existence
+		 * first
+		 *
+		 * on PHP 5.6 this is not the case
+		 *
+		 * see https://github.com/krakjoe/apcu/issues/183#issuecomment-244038221
+		 * for details
+		 */
+		return apcu_exists($this->getPrefix() . $key)
+			? apcu_inc($this->getPrefix() . $key, $step)
+			: false;
 	}
 
 	/**
@@ -99,7 +113,21 @@ class APCu extends Cache implements IMemcache {
 	 * @return int | bool
 	 */
 	public function dec($key, $step = 1) {
-		return apcu_dec($this->getPrefix() . $key, $step);
+		/**
+		 * TODO - hack around a PHP 7 specific issue in APCu
+		 *
+		 * on PHP 7 the apcu_dec method on a non-existing object will decrement
+		 * "0" and result in "-1" as value - therefore we check for existence
+		 * first
+		 *
+		 * on PHP 5.6 this is not the case
+		 *
+		 * see https://github.com/krakjoe/apcu/issues/183#issuecomment-244038221
+		 * for details
+		 */
+		return apcu_exists($this->getPrefix() . $key)
+			? apcu_dec($this->getPrefix() . $key, $step)
+			: false;
 	}
 
 	/**
-- 
GitLab