KellyMahan-memcachedb-client 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/History.txt +10 -0
  2. data/README.rdoc +1 -1
  3. data/lib/memcache_db.rb +86 -0
  4. metadata +1 -1
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ = 1.1
2
+
3
+ added get_range method.
4
+
5
+ example:
6
+
7
+ CACHE.get_range(:a, :z, limit)
8
+
9
+ this will return all records between and including a through z with a limit on the records. The max is 100
10
+
1
11
  = 1.0
2
12
 
3
13
  derived from memcache-client 1.6.3 http://github.com/mperham for use with memcachedb
data/README.rdoc CHANGED
@@ -10,7 +10,7 @@ http://github.com/KellyMahan/memcachedb-client
10
10
 
11
11
  Just install the gem:
12
12
 
13
- $ sudo gem install memcachedb-client
13
+ $ sudo gem install KellyMahan-memcachedb-client
14
14
 
15
15
  == Using memcachedb-client
16
16
 
data/lib/memcache_db.rb CHANGED
@@ -221,6 +221,29 @@ class MemCacheDb
221
221
  # cache["b"] = 2
222
222
  # cache.get_multi "a", "b" # => { "a" => 1, "b" => 2 }
223
223
 
224
+
225
+ def get_range(key1, key2, limit=100)
226
+ raise MemCacheDbError, 'No active servers' unless active?
227
+
228
+ results = {}
229
+
230
+ begin
231
+ servers.each do |server|
232
+ values = cache_rget(server, key1, key2, limit)
233
+ values.each do |key, value|
234
+ results[key.gsub(/#{@namespace}\:/,'')] = Marshal.load value
235
+ end
236
+ end
237
+ rescue
238
+ logger.warn { "Unable to retrieve key range #{key1} to #{key2}"} if logger
239
+ end
240
+ return results
241
+ rescue TypeError => err
242
+ handle_error nil, err
243
+ end
244
+
245
+
246
+
224
247
  def get_multi(*keys)
225
248
  raise MemCacheDbError, 'No active servers' unless active?
226
249
 
@@ -576,6 +599,69 @@ class MemCacheDb
576
599
  raise MemCacheDbError, "lost connection to #{server.host}:#{server.port}" # TODO: retry here too
577
600
  end
578
601
  end
602
+
603
+ def cache_rget(server, start_key, end_key, max=100)
604
+
605
+ # rget <start key> <end key> <left openness flag> <right openness flag> <max items>\r\n
606
+ #
607
+ # - <start key> where the query starts.
608
+ # - <end key> where the query ends.
609
+ # - <left openness flag> indicates the openness of left side, 0 means the result includes <start key>, while 1 means not.
610
+ # - <right openness flag> indicates the openness of right side, 0 means the result includes <end key>, while 1 means not.
611
+ # - <max items> how many items at most return, max is 100.
612
+ #
613
+ # After this command, the client expects zero or more items, each of
614
+ # which is received as a text line followed by a data block. After all
615
+ # the items have been transmitted, the server sends the string
616
+ #
617
+ # "END\r\n"
618
+ #
619
+ # to indicate the end of response.
620
+ #
621
+ # Each item sent by the server looks like this:
622
+ #
623
+ # VALUE <key> <flags> <bytes>\r\n
624
+ # <data block>\r\n
625
+ #
626
+ # - <key> is the key for the item being sent
627
+ #
628
+ # - <flags> is the flags value set by the storage command
629
+ #
630
+ # - <bytes> is the length of the data block to follow, *not* including
631
+ # its delimiting \r\n
632
+ #
633
+ # - <data block> is the data for this item.
634
+ #
635
+ # Notice: all keys in MemcacheDB is sorted alphabetically, so is the return of query result.
636
+
637
+ with_socket_management(server) do |socket|
638
+ values = {}
639
+ socket.write "rget #{start_key} #{end_key} 0 0 #{max}\r\n"
640
+
641
+ while keyline = socket.gets do
642
+ return values if keyline == "END\r\n"
643
+ raise_on_error_response! keyline
644
+
645
+ unless keyline =~ /\AVALUE (.+) (.+) (.+)/ then
646
+ server.close
647
+ raise MemCacheDbError, "unexpected response #{keyline.inspect}"
648
+ end
649
+
650
+ key, data_length = $1, $3
651
+ values[$1] = socket.read data_length.to_i
652
+ socket.read(2) # "\r\n"
653
+ end
654
+
655
+ server.close
656
+ raise MemCacheDbError, "lost connection to #{server.host}:#{server.port}" # TODO: retry here too
657
+ end
658
+
659
+
660
+
661
+ end
662
+
663
+
664
+
579
665
 
580
666
  ##
581
667
  # Performs a raw incr for +cache_key+ from +server+. Returns nil if not
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: KellyMahan-memcachedb-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Mahan