kyototycoon-client 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,9 +29,11 @@ module Kyototycoon
29
29
  header_entries = [Magic::SET_BULK, Flag::RESERVED, records.length]
30
30
  request = header_entries.pack("CNN")
31
31
 
32
- records.each do |r|
33
- request << [r.db_id, r.key.length, r.value.length, r.expire.to_i >> 32, r.expire.to_i & 0x00000000FFFFFFFF].pack("nNNNN") <<
34
- r.key << r.value
32
+ records.each do |r|
33
+ k = r.key.dup.force_encoding("binary")
34
+ v = r.value.force_encoding("binary")
35
+ request << [r.db_id, k.length, v.length, r.expire.to_i >> 32,
36
+ r.expire.to_i & 0x00000000FFFFFFFF].pack("nN*") << k << v
35
37
  end
36
38
 
37
39
  @socket.write(request)
@@ -49,7 +51,8 @@ module Kyototycoon
49
51
  request = header_entries.pack("CNN")
50
52
 
51
53
  records.each do |r|
52
- request << [r.db_id, r.key.length].pack("nN") << r.key
54
+ k = r.key.dup.force_encoding('binary')
55
+ request << [r.db_id, k.length].pack("nN") << k
53
56
  end
54
57
 
55
58
  @socket.write(request)
@@ -63,14 +66,13 @@ module Kyototycoon
63
66
  count.times do |i|
64
67
  res_body = @socket.read(18)
65
68
 
66
- dbid, keysize, valuesize, ext_expire, expire = res_body.unpack("nNNNN")
69
+ dbid, keysize, valuesize, ext_expire, expire = res_body.unpack("nN*")
67
70
  expire = ext_expire << 32 | expire
68
71
 
69
72
  key = @socket.read(keysize)
70
73
  value = @socket.read(valuesize)
71
- results.push(Record.new(key, value, dbid, expire))
74
+ results.push(Record.new(key.dup.force_encoding('UTF-8'), value.force_encoding('UTF-8'), expire, dbid))
72
75
  end
73
-
74
76
  results
75
77
  end
76
78
 
@@ -79,7 +81,8 @@ module Kyototycoon
79
81
  request = header_entries.pack("CNN")
80
82
 
81
83
  records.each do |r|
82
- request << [r.db_id, r.key.length].pack("nN") << r.key
84
+ k = r.key.dup.force_encoding('binary')
85
+ request << [r.db_id, k.length].pack("nN") << k
83
86
  end
84
87
 
85
88
  @socket.write(request)
@@ -97,7 +100,9 @@ module Kyototycoon
97
100
  request = header_entries.pack("CNN")
98
101
 
99
102
  records.each do |r|
100
- request << [r.key.length, r.value.length].pack("NN") << r.key << r.value
103
+ k = r.key.dup.force_encoding("binary")
104
+ v = r.value.force_encoding("binary")
105
+ request << [k.length, v.length].pack("NN") << k << v
101
106
  end
102
107
 
103
108
  @socket.write(request)
@@ -113,7 +118,7 @@ module Kyototycoon
113
118
  keysize, valuesize = res_body.unpack("NN")
114
119
  key = @socket.read(keysize)
115
120
  value = @socket.read(valuesize)
116
- results.push(Record.new(key, value, 0, 0))
121
+ results.push(Record.new(key.dup.force_encoding('UTF-8'), value.force_encoding('UTF-8'), 0, 0))
117
122
  end
118
123
 
119
124
  results
@@ -1,5 +1,5 @@
1
1
  module Kyototycoon
2
2
  class Client
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require "helper"
2
3
 
3
4
  class ClientTest < Test::Unit::TestCase
@@ -26,6 +27,16 @@ class ClientTest < Test::Unit::TestCase
26
27
  @client.close
27
28
  end
28
29
 
30
+ def test_clud_multibyte_characters
31
+ @client.open
32
+ assert_equal(@client.set("あ", "あいのまち"), true)
33
+ assert_equal(@client.get("あ"), "あいのまち")
34
+ assert_nil(@client.get("ん"))
35
+ assert_equal(@client.remove("あ"), true)
36
+ assert_nil(@client.get("あ"))
37
+ @client.close
38
+ end
39
+
29
40
  def test_clud_bulk
30
41
  @client.open
31
42
  @client.remove_bulk(["key1", "key2", "key3", "key4"])
@@ -39,6 +50,19 @@ class ClientTest < Test::Unit::TestCase
39
50
  @client.close
40
51
  end
41
52
 
53
+ def test_clud_bulk_multibyte_charactors
54
+ @client.open
55
+ @client.remove_bulk(["あ", "い", "う", "え"])
56
+
57
+ assert_equal( @client.set_bulk( {"あ" => "あいのまち", "い" => "いしかずちょう", "う" => "ういろうのちょう"} ), 3)
58
+ assert_equal( @client.get_bulk( ["あ", "い", "う", "え"] ),
59
+ {"あ" => "あいのまち", "い" => "いしかずちょう", "う" => "ういろうのちょう"} )
60
+ assert_equal( @client.remove_bulk( ["あ", "い"] ), 2 )
61
+ assert_equal( @client.get_bulk( ["あ", "い", "う", "え"] ),
62
+ {"う" => "ういろうのちょう"} )
63
+ @client.close
64
+ end
65
+
42
66
  def test_expire
43
67
  @client.open
44
68
  assert_equal(@client.set_bulk( {"key1" => ["value1", 1]} ), 1) # expire after 1 second
@@ -55,15 +79,36 @@ class ClientTest < Test::Unit::TestCase
55
79
  assert_equal(@client.get("key2"), "value2")
56
80
  assert_equal(@client.get("key3"), "value3")
57
81
  assert_equal(@client.get("key4"), nil)
82
+ @client.remove_bulk( ["key2", "key3"] )
83
+ @client.close
84
+ end
85
+
86
+ def test_expire_multibyte_characters
87
+ @client.open
88
+ assert_equal(@client.set_bulk( {"あ" => ["あいのまち", 1]} ), 1) # expire after 1 second
89
+ assert_equal(@client.set_bulk( {"い" => "いしかずちょう"} ), 1) # not expire
90
+ assert_equal(@client.set("う", "ういろうのちょう"), true) # not expire
91
+ assert_equal(@client.set("え", "えびすがわ", 1), true) # expire after 1 second
92
+
93
+ assert_equal(@client.get("あ"), "あいのまち")
94
+ assert_equal(@client.get("い"), "いしかずちょう")
95
+ assert_equal(@client.get("う"), "ういろうのちょう")
96
+ assert_equal(@client.get("え"), "えびすがわ")
97
+ sleep 3
98
+ assert_equal(@client.get("あ"), nil)
99
+ assert_equal(@client.get("い"), "いしかずちょう")
100
+ assert_equal(@client.get("う"), "ういろうのちょう")
101
+ assert_equal(@client.get("え"), nil)
102
+ @client.remove_bulk( ["い", "う"] )
58
103
  @client.close
59
104
  end
60
105
 
61
106
  def test_dbid
62
107
  @client.open
63
- assert_equal(@client.set_bulk( {"key1" => "value1"}, 0 ), 1)
64
- assert_equal(@client.set_bulk( {"key1" => "value1"}, 1 ), 0)
65
- assert_equal(@client.get("key1", 0), "value1")
66
- assert_equal(@client.get("key1", 1), nil)
108
+ assert_equal(@client.set_bulk( {"" => "あいのまち"}, 0 ), 1)
109
+ assert_equal(@client.set_bulk( {"" => "あいのまち"}, 1 ), 0)
110
+ assert_equal(@client.get("", 0), "あいのまち")
111
+ assert_equal(@client.get("", 1), nil)
67
112
  @client.close
68
113
  end
69
114
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kyototycoon-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-21 00:00:00.000000000 Z
12
+ date: 2014-02-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler