ruby-redis 0.0.1

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 (48) hide show
  1. data/LICENSE +9 -0
  2. data/README +90 -0
  3. data/bin/ruby-redis +12 -0
  4. data/bin/ruby-redis.compiled.rbc +243 -0
  5. data/lib/redis/bin.rb +74 -0
  6. data/lib/redis/bin.rbc +1325 -0
  7. data/lib/redis/buftok.rbc +2658 -0
  8. data/lib/redis/config.rb +46 -0
  9. data/lib/redis/config.rbc +1009 -0
  10. data/lib/redis/connection.rb +69 -0
  11. data/lib/redis/connection.rbc +1354 -0
  12. data/lib/redis/database.rb +109 -0
  13. data/lib/redis/database.rbc +2275 -0
  14. data/lib/redis/hashes.rb +72 -0
  15. data/lib/redis/hashes.rbc +1843 -0
  16. data/lib/redis/hiredis.rbc +658 -0
  17. data/lib/redis/keys.rb +165 -0
  18. data/lib/redis/keys.rbc +3386 -0
  19. data/lib/redis/lists.rb +227 -0
  20. data/lib/redis/lists.rbc +5241 -0
  21. data/lib/redis/logger.rb +81 -0
  22. data/lib/redis/logger.rbc +2106 -0
  23. data/lib/redis/protocol.rb +170 -0
  24. data/lib/redis/protocol.rbc +3735 -0
  25. data/lib/redis/pubsub.rb +153 -0
  26. data/lib/redis/pubsub.rbc +3447 -0
  27. data/lib/redis/reader.rb +164 -0
  28. data/lib/redis/reader.rbc +2769 -0
  29. data/lib/redis/send.rbc +1268 -0
  30. data/lib/redis/sender.rb +49 -0
  31. data/lib/redis/sender.rbc +1057 -0
  32. data/lib/redis/server.rb +62 -0
  33. data/lib/redis/server.rbc +1177 -0
  34. data/lib/redis/sets.rb +105 -0
  35. data/lib/redis/sets.rbc +2800 -0
  36. data/lib/redis/strict.rb +67 -0
  37. data/lib/redis/strict.rbc +1419 -0
  38. data/lib/redis/strings.rb +144 -0
  39. data/lib/redis/strings.rbc +3338 -0
  40. data/lib/redis/synchrony.rb +58 -0
  41. data/lib/redis/synchrony.rbc +1397 -0
  42. data/lib/redis/version.rb +7 -0
  43. data/lib/redis/version.rbc +180 -0
  44. data/lib/redis/zsets.rb +281 -0
  45. data/lib/redis/zsets.rbc +6596 -0
  46. data/lib/redis.rb +215 -0
  47. data/lib/redis.rbc +4391 -0
  48. metadata +117 -0
@@ -0,0 +1,164 @@
1
+ require File.expand_path '../redis', File.dirname(__FILE__)
2
+
3
+ class Redis
4
+
5
+ # This is almost as fast as hiredis/reader plus it supports servers
6
+ class Reader < Array
7
+
8
+ # Minimize the amount of memory copying. The primary
9
+ # performance trick is to String#split and work with that.
10
+
11
+ #TODO configurable limits
12
+ #TODO max buffer size based on limits
13
+
14
+ def initialize
15
+ super()
16
+ flush
17
+ end
18
+
19
+ alias :feed :push
20
+
21
+ def gets
22
+ if @completed.empty?
23
+ unshift_split if @split
24
+ frame do |str|
25
+ @elements << str
26
+ if @remaining > 0
27
+ @remaining -= 1
28
+ if @remaining == 0 and !@stack.empty?
29
+ elements = @elements
30
+ @elements, @remaining = @stack.pop
31
+ @elements << elements
32
+ @remaining -= 1
33
+ end
34
+ next unless @remaining == 0
35
+ @completed << @elements
36
+ elsif @remaining < 0
37
+ @completed << nil
38
+ elsif !@elements.empty?
39
+ @completed << @elements[0]
40
+ end
41
+ @elements = []
42
+ @remaining = 0
43
+ end
44
+ end
45
+ return false if @completed.empty?
46
+ @completed.shift
47
+ end
48
+
49
+ private
50
+
51
+ def flush
52
+ @split = nil
53
+ @pending = nil
54
+ @binary_size = nil
55
+ @remaining = 0
56
+ @elements = []
57
+ @stack = []
58
+ @completed = []
59
+ clear
60
+ end
61
+
62
+ def unshift_split
63
+ unshift @split.join "\n"
64
+ @split = nil
65
+ end
66
+
67
+ # yields redis data until no more found in buffer
68
+ def frame
69
+ while true
70
+ if @binary_size
71
+ s = read_binary @binary_size
72
+ break unless s
73
+ @binary_size = nil
74
+ yield s
75
+ else
76
+ line = read_line
77
+ break unless line
78
+ case line[0..0]
79
+ when '-'
80
+ yield RuntimeError.new line[1..-1]
81
+ when '+'
82
+ yield line[1..-1]
83
+ when ':'
84
+ yield line[1..-1].to_i
85
+ when '*'
86
+ prev_remaining = @remaining
87
+ @remaining = line[1..-1].to_i
88
+ if @remaining == -1
89
+ yield nil
90
+ elsif @remaining > 1024*1024
91
+ flush
92
+ raise 'invalid multibulk length'
93
+ elsif prev_remaining > 0
94
+ @stack << [@elements, prev_remaining]
95
+ @elements = []
96
+ end
97
+ when '$'
98
+ @binary_size = line[1..-1].to_i
99
+ if @binary_size == -1
100
+ @binary_size = nil
101
+ yield nil
102
+ elsif (@binary_size == 0 and line[1..1] != '0') or @binary_size < 0 or @binary_size > 512*1024*1024
103
+ flush
104
+ raise 'invalid bulk length'
105
+ end
106
+ else
107
+ if @remaining > 0
108
+ flush
109
+ raise "expected '$', got '#{line[0].chr}'"
110
+ end
111
+ parts = line.split(' ')
112
+ @remaining = parts.size
113
+ parts.each {|l| yield l}
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ # Read a binary redis token, nil if none available
120
+ def read_binary length
121
+ if @split
122
+ if @split.first.size >= length
123
+ result = @split.shift[0...length]
124
+ unshift_split if @split.size == 1
125
+ return result
126
+ end
127
+ unshift_split
128
+ end
129
+ unless @pending
130
+ size = reduce(0){|x,y|x+y.size}
131
+ return nil unless size >= length
132
+ @pending = dup
133
+ clear
134
+ remainder = size - length
135
+ if remainder > 0
136
+ last_string = @pending[-1]
137
+ @pending[-1] = last_string[0...-remainder]
138
+ push last_string[-remainder..-1]
139
+ end
140
+ end
141
+ # eat newline
142
+ return nil unless read_line
143
+ result = @pending.join
144
+ @pending = nil
145
+ result
146
+ end
147
+
148
+ # Read a newline terminated redis token, nil if none available
149
+ def read_line
150
+ unless @split
151
+ @split = join.split "\n", -1
152
+ clear
153
+ end
154
+ if @split.size > 1
155
+ result = @split.shift.chomp "\n"
156
+ else
157
+ result = nil
158
+ end
159
+ unshift_split if @split.size == 1
160
+ result
161
+ end
162
+
163
+ end
164
+ end