Parcourir la source

simplest implementation of kv support on gcs

Mark van Holsteijn il y a 5 ans
Parent
commit
55efc858b5
2 fichiers modifiés avec 54 ajouts et 30 suppressions
  1. 32 27
      lib/Data/GoogleCloudStorage.php
  2. 22 3
      tst/Data/GoogleCloudStorageTest.php

+ 32 - 27
lib/Data/GoogleCloudStorage.php

@@ -218,43 +218,48 @@ class GoogleCloudStorage extends AbstractData
     }
     }
 
 
     /**
     /**
-     * Save a value.
-     *
-     * @access public
-     * @param  string $value
-     * @param  string $namespace
-     * @param  string $key
-     * @return bool
+     * This is the simplest thing that could possibly work.
+     * will be to tested for runtime performance.
+     * @inheritDoc
      */
      */
     public function setValue($value, $namespace, $key = '')
     public function setValue($value, $namespace, $key = '')
     {
     {
-        switch ($namespace) {
-            case 'purge_limiter':
-                ;
-                break;
-            case 'salt':
-                ;
-                break;
-            case 'traffic_limiter':
-                ;
-                break;
-            default:
-                return false;
-                break;
+        $key  = 'config/' . $namespace . '/' . $key;
+        $data = Json::encode($value);
+
+        try {
+            $this->_bucket->upload($data, array(
+                'name'          => $key,
+                'chunkSize'     => 262144,
+                'predefinedAcl' => 'private',
+                'metadata'      => array(
+                    'content-type' => 'application/json',
+                    'metadata'     => array('namespace' => $namespace),
+                ),
+            ));
+        } catch (Exception $e) {
+            error_log('failed to set key ' . $key . ' to ' . $this->_bucket->name() . ', ' .
+                trim(preg_replace('/\s\s+/', ' ', $e->getMessage())));
+            return false;
         }
         }
+        return true;
     }
     }
 
 
     /**
     /**
-     * Load a value.
-     *
-     * @access public
-     * @param  string $namespace
-     * @param  string $key
-     * @return string
+     * This is the simplest thing that could possibly work.
+     * will be to tested for runtime performance.
+     * @inheritDoc
      */
      */
     public function getValue($namespace, $key = '')
     public function getValue($namespace, $key = '')
     {
     {
-
+        $key = 'config/' . $namespace . '/' . $key;
+        try {
+            $o    = $this->_bucket->object($key);
+            $data = $o->downloadAsString();
+            return Json::decode($data);
+        } catch (NotFoundException $e) {
+            return false;
+        }
     }
     }
 
 
     /**
     /**

+ 22 - 3
tst/Data/GoogleCloudStorageTest.php

@@ -31,9 +31,6 @@ class GoogleCloudStorageTest extends PHPUnit_Framework_TestCase
 
 
     public function setUp()
     public function setUp()
     {
     {
-        // do not report E_NOTICE as fsouza/fake-gcs-server does not return a `generation` value in the response
-        // which the Google Cloud Storage PHP library expects.
-        error_reporting(E_ERROR | E_WARNING | E_PARSE);
         ini_set('error_log', stream_get_meta_data(tmpfile())['uri']);
         ini_set('error_log', stream_get_meta_data(tmpfile())['uri']);
         $this->_model = GoogleCloudStorage::getInstance(array(
         $this->_model = GoogleCloudStorage::getInstance(array(
             'bucket' => self::$_bucket->name(),
             'bucket' => self::$_bucket->name(),
@@ -138,6 +135,28 @@ class GoogleCloudStorageTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($this->_model->createComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId(), $comment), 'unable to store broken comment');
         $this->assertFalse($this->_model->createComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId(), $comment), 'unable to store broken comment');
         $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment does still not exist');
         $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment does still not exist');
     }
     }
+
+    /**
+     * @throws Exception
+     */
+    public function testKeyValueStore()
+    {
+        $salt = bin2hex(random_bytes(256));
+        $this->_model->setValue($salt, 'salt', 'master');
+        $storedSalt = $this->_model->getValue('salt', 'master');
+        $this->assertEquals($salt, $storedSalt);
+
+        $client = hash_hmac('sha512', '127.0.0.1', $salt);
+        $expire = time();
+        $this->_model->setValue($expire, 'traffic_limiter', $client);
+        $storedExpired = $this->_model->getValue('traffic_limiter', $client);
+        $this->assertEquals($expire, $storedExpired);
+
+        $purgeAt = $expire + (15 * 60);
+        $this->_model->setValue($purgeAt, 'purge_limiter', 'at');
+        $storedPurgedAt = $this->_model->getValue('purge_limiter', 'at');
+        $this->assertEquals($purgeAt, $storedPurgedAt);
+    }
 }
 }
 
 
 /**
 /**