Module: Remix::Stash::Protocol

Extended by:
Protocol
Included in:
Protocol
Defined in:
lib/remix/stash/protocol.rb

Constant Summary collapse

HEADER_FORMAT =
"CCnCCnNNQ"
REQUEST =

Magic codes

0x80
RESPONSE =
0x81
GET =

Command codes

0x00
SET =
0x01
ADD =
0x02
REPLACE =
0x03
DELETE =
0x04
INCREMENT =
0x05
DECREMENT =
0x06
QUIT =
0x07
FLUSH =
0x08
GET_Q =
0x09
NO_OP =
0x0A
VERSION =
0x0B
GET_K =
0x0C
GET_K_Q =
0x0D
APPEND =
0x0E
PREPEND =
0x0F
STAT =
0x10
SET_Q =
0x11
ADD_Q =
0x12
REPLACE_Q =
0x13
DELETE_Q =
0x14
INCREMENT_Q =
0x15
DECREMENT_Q =
0x16
QUIT_Q =
0x17
FLUSH_Q =
0x18
APPEND_Q =
0x19
PREPEND_Q =
0x20
NO_ERROR =

Response codes

0x0000
KEY_NOT_FOUND =
0x0001
KEY_EXISTS =
0x0002
VALUE_TOO_LARGE =
0x0003
INVALID_ARGUMENTS =
0x0004
ITEM_NOT_STORED =
0x0005
INCR_ON_NON_NUMERIC_VALUE =
0x0006
UNKNOWN_COMMAND =
0x0081
OUT_OF_MEMORY =
0x0082
COUNTER_FAULT_EXPIRATION =

Extras

0xFFFFFFFF
ADD_PACKET =
HEADER_FORMAT + 'NNa*a*'
DECR_PACKET =
HEADER_FORMAT + 'NNQNa*'
DELETE_PACKET =
HEADER_FORMAT + 'a*'
FLUSH_PACKET =
HEADER_FORMAT + 'N'
GET_PACKET =
HEADER_FORMAT + 'a*'
GET_BODY =
4..-1
INCR_PACKET =
HEADER_FORMAT + 'NNQNa*'
SET_PACKET =
HEADER_FORMAT + 'NNa*a*'

Instance Method Summary collapse

Instance Method Details

#add(io, key, data, ttl = 0) ⇒ Object



54
55
56
57
58
59
# File 'lib/remix/stash/protocol.rb', line 54

def add(io, key, data, ttl = 0)
  header = [REQUEST, ADD, key.size, 8, 0, 0, data.size + key.size + 8, 0, 0, 0, ttl, key, data].pack(ADD_PACKET)
  io.write(header)
  resp = read_resp(io)
  resp[:status] == NO_ERROR
end

#decr(io, key, step) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/remix/stash/protocol.rb', line 62

def decr(io, key, step)
  low, high = split64(step)
  header = [REQUEST, DECREMENT, key.size, 20, 0, 0, key.size + 20, 0, 0, high, low, 0, COUNTER_FAULT_EXPIRATION, key].pack(DECR_PACKET)
  io.write(header)
  resp = read_resp(io)
  if resp[:status] == NO_ERROR
    parse_counter(resp[:body])
  end
end

#delete(io, key, ttl = 0) ⇒ Object



73
74
75
76
77
78
# File 'lib/remix/stash/protocol.rb', line 73

def delete(io, key, ttl = 0)
  header = [REQUEST, DELETE, key.size, 0, 0, 0, key.size, 0, 0, key].pack(DELETE_PACKET)
  io.write(header)
  resp = read_resp(io)
  resp[:status] == NO_ERROR
end

#flush(io) ⇒ Object



81
82
83
84
85
86
# File 'lib/remix/stash/protocol.rb', line 81

def flush(io)
  header = [REQUEST, FLUSH, 0, 4, 0, 0, 4, 0, 0, 0].pack(FLUSH_PACKET)
  io.write(header)
  resp = read_resp(io)
  resp[:status] == NO_ERROR
end

#get(io, key) ⇒ Object



90
91
92
93
94
95
# File 'lib/remix/stash/protocol.rb', line 90

def get(io, key)
  header = [REQUEST, GET, key.size, 0, 0, 0, key.size, 0, 0, key].pack(GET_PACKET)
  io.write(header)
  resp = read_resp(io)
  resp[:status] == NO_ERROR ? resp[:body][GET_BODY] : nil
end

#incr(io, key, step) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/remix/stash/protocol.rb', line 98

def incr(io, key, step)
  low, high = split64(step)
  header = [REQUEST, INCREMENT, key.size, 20, 0, 0, key.size + 20, 0, 0, high, low, 0, COUNTER_FAULT_EXPIRATION, key].pack(INCR_PACKET)
  io.write(header)
  resp = read_resp(io)
  if resp[:status] == NO_ERROR
    parse_counter(resp[:body])
  end
end

#set(io, key, data, ttl = 0) ⇒ Object



109
110
111
112
113
114
# File 'lib/remix/stash/protocol.rb', line 109

def set(io, key, data, ttl = 0)
  header = [REQUEST, SET, key.size, 8, 0, 0, data.size + key.size + 8, 0, 0, 0, ttl, key, data].pack(SET_PACKET)
  io << header
  resp = read_resp(io)
  resp[:status] == NO_ERROR
end