OSDN Git Service

Plugin::KeyValueStore: add hash_set() and hash_get()
authorhylom <hylom@users.sourceforge.jp>
Thu, 28 Feb 2019 12:52:00 +0000 (21:52 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 28 Feb 2019 12:52:00 +0000 (21:52 +0900)
src/newslash_web/lib/Newslash/Plugin/KeyValueStore.pm
src/newslash_web/t/plugins/key_value_store.t [new file with mode: 0644]

index e297304..1a198a9 100644 (file)
@@ -93,7 +93,7 @@ sub cache {
 
     my $value = $self->get($key);
 
-    if ($value && !$self->{test_mode}) {
+    if ($value) {
         # cache hit!
         return $value;
     }
@@ -143,7 +143,6 @@ sub hset {
 
 sub hget {
     my ($self, $key, $field) = @_;
-    return if $self->{test_mode};
 
     my $r = $self->_connect;
     my $result = $r->hget($key, $field);
@@ -164,6 +163,54 @@ sub hdel {
     return $result;
 }
 
+sub hash_set {
+    my ($self, $key, $hash, $expire) = @_;
+    if (ref($hash) ne "HASH") {
+        return;
+    }
+
+    my $r = $self->_connect;
+    my $result;
+
+    my @args;
+    push @args, $key;
+    for my $item (%$hash) {
+        if (ref($item)) {
+            push @args, $self->_encode($item);
+        }
+        else {
+            push @args, $item;
+        }
+    }
+    $result = $r->hmset(@args);
+
+    if (!$result) {
+        $self->_quit;
+        return $result;
+    }
+    if ($expire) {
+        $r->expire($key, $expire);
+    }
+    $self->_quit;
+    return $result;
+}
+
+sub hash_get {
+    my ($self, $key) = @_;
+
+    my $r = $self->_connect;
+    my $result;
+    if ($r->exists($key)) {
+        $result = $r->hgetall($key);
+    }
+    $self->_quit;
+
+    if ($result) {
+        return {@$result};
+    }
+    return;
+}
+
 sub set {
     my ($self, $key, $value, $expire, $flag, @rest) = @_;
     my $option = {@rest};
@@ -189,8 +236,6 @@ sub get {
     my $self = shift;
     my $key = shift;
 
-    return if $self->{test_mode};
-
     my $r = $self->_connect;
     my $result = $r->get($key);
     $self->_quit;
@@ -231,14 +276,9 @@ sub register {
     my $cnf = $app->config->{KeyValueStore} ||= {};
     $cnf->{type} ||= "redis";
     $cnf->{host} ||= "localhost:6379";
-    $cnf->{test_mode} ||= 0;
     $cnf->{index_number} ||= 0;
 
     $self->{conf} = {%$conf, %$cnf};
-    if ($self->{conf}->{test_mode}) {
-        # if test_mode == 1, already yield cache miss
-        $self->{test_mode} = 1;
-    }
     $self->{index_number} = $self->{conf}->{index_number} || 0;
 
     $self->{app} = $app;
diff --git a/src/newslash_web/t/plugins/key_value_store.t b/src/newslash_web/t/plugins/key_value_store.t
new file mode 100644 (file)
index 0000000..8a5a1da
--- /dev/null
@@ -0,0 +1,62 @@
+# -*-Perl-*-
+use Mojo::Base -strict;
+
+use Test::More;
+use Test::Mojo;
+
+use IO::Compress::Gzip qw(gzip);
+use IO::Uncompress::Gunzip qw(gunzip);
+
+my $t = Test::Mojo->new('Newslash::Web');
+my $app = $t->app;
+
+my $kvs = $app->kvs;
+ok($kvs, "KeyValueStore enabled");
+
+use constant EXPIRE => 10;
+
+subtest 'KeyValueStore test' => sub {
+    plan skip_all => "KeyValueStore is not enabled" if !$kvs;
+
+    # simple cache
+    my $testvalue = "testvalue";
+    ok($kvs->set(".testkey1", $testvalue, EXPIRE), "cache testvalue");
+    is($kvs->get(".testkey1"), $testvalue, "get testvalue");
+    ok($kvs->del(".testkey1"), "delete cache");
+
+    my $testvalue2 = { foo => "bar", hoge => 1 };
+    ok($kvs->set(".testkey2", $testvalue2, EXPIRE), "cache hashvalue");
+    is_deeply($kvs->get(".testkey2"), $testvalue2, "get hashvalue");
+    ok($kvs->del(".testkey2"), "delete cache");
+
+    # hash cache
+    my $testvalue3 = { foo => "bar", hoge => 1 };
+    ok($kvs->hash_set(".testkey3", $testvalue3, EXPIRE), "kvs cache hashvalue");
+    is_deeply($kvs->hash_get(".testkey3"), $testvalue3, "kvs get hashvalue");
+    ok($kvs->del(".testkey3"), "delete kvs cache");
+
+    # binary data caching
+    my $test_text = "あいうえおかきくけこ";
+    my $test_text_bin = Encode::encode_utf8($test_text);
+    gzip(\$test_text_bin, \my $compressed);
+    my $testvalue4 = { foo => "bar", gzipped => $compressed };
+    ok($kvs->hash_set(".testkey4", $testvalue4, EXPIRE), "kvs cache binary value");
+    is_deeply($kvs->hash_get(".testkey4"), $testvalue4, "kvs get binary value");
+
+    my $gunzipped;
+    my $c = $kvs->hash_get(".testkey4")->{gzipped};
+    is($c, $compressed, "get gzipped item");
+
+    gunzip(\$compressed, \$gunzipped);
+    is($gunzipped, $test_text_bin, "gunzip succeeded (not cached item)");
+    is(Encode::decode_utf8($gunzipped), $test_text, "gunzipped item is valid text");
+
+    gunzip(\$c, \$gunzipped);
+    is($gunzipped, $test_text_bin, "gunzip succeeded (cached item)");
+    is(Encode::decode_utf8($gunzipped), $test_text, "gunzipped item is valid text");
+
+    ok($kvs->del(".testkey4"), "delete kvs cache");
+
+};
+
+done_testing;