Class: Tair::Protocol::TairObject

Inherits:
BinData::Record
  • Object
show all
Defined in:
lib/tair/protocol/tair_object.rb

Constant Summary collapse

TYPE_INT =
2
TYPE_STRING =
4
TYPE_BOOL =
6
TYPE_LONG =
8
TYPE_DATE =
10
TYPE_BYTE =
12
TYPE_FLOAT =
14
TYPE_DOUBLE =
16
TYPE_BYTEARRAY =
18
TYPE_SERIALIZE =
20
TYPE_INCDATA =
22
TYPE_MIXEDKEY =
24
MAX_INT32 =
0x7FFFFFFF

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.from(rb_value) ⇒ Object



59
60
61
62
63
# File 'lib/tair/protocol/tair_object.rb', line 59

def self.from(rb_value)
  new.tap do |o|
    o.value = rb_value
  end
end

Instance Method Details

#valueObject



24
25
26
27
28
29
30
31
32
# File 'lib/tair/protocol/tair_object.rb', line 24

def value
  case value_type
  when TYPE_LONG      then raw_value.unpack('Q').first
  when TYPE_STRING    then raw_value.to_s
  when TYPE_BOOL      then raw_value == "\x01"
  when TYPE_DOUBLE    then raw_value.unpack('D').first
  when TYPE_SERIALIZE then Marshal.load(raw_value)
  end
end

#value=(v) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/tair/protocol/tair_object.rb', line 36

def value=(v)
  case v
  when String
    [TYPE_STRING, v]
  when Fixnum
    # 数字暂时不能超过64位
    [TYPE_LONG, [v].pack('Q')]
  when TrueClass, FalseClass
    [TYPE_BOOL, v ? "\x01" : "\x00"]
  when Float
    # 浮点数字统一用 double 型
    [TYPE_DOUBLE, [v].pack('D')]
  else
    # serialize 类型仅限于 ruby 语言使用
    # 和其他语言共用时不方便,请谨慎选择
    [TYPE_SERIALIZE, Marshal.dump(v)]
  end.tap do |t, nv|
    self.value_type = t
    self.raw_value  = nv
  end
end