tair 0.1.0.pre

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.
@@ -0,0 +1,5 @@
1
+ require 'tair/protocol/tair_object'
2
+ require 'tair/protocol/key_meta'
3
+ require 'tair/protocol/response_header'
4
+
5
+ Tair.send(:include, Tair::Protocol)
@@ -0,0 +1,9 @@
1
+ module Tair
2
+ module Protocol
3
+
4
+ class KeyMeta < BinData::Record
5
+ array :key_padding, type: :int8, initial_length: 36
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'tair_murmurhash'
2
+
3
+ module Tair
4
+ module Protocol
5
+ module Murmurhash
6
+ def self.digest(key, seed=97)
7
+ ::Tair::TairMurmurhash.new(key, seed).digest
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ require 'tair/protocol/socket_signature'
2
+
3
+ module Tair
4
+ module Protocol
5
+
6
+ class ResponseHeader < BinData::Record
7
+ socket_signature
8
+ int32be :req_id
9
+ int32be :packet_code
10
+ end
11
+ end
12
+ end
13
+
14
+
@@ -0,0 +1,12 @@
1
+ module Tair
2
+ module Protocol
3
+
4
+ TAIR_PACKET_FLAG = 0x6d426454
5
+
6
+ class SocketSignature < BinData::Record
7
+ int32be :flag, value: TAIR_PACKET_FLAG
8
+ virtual assert: lambda { flag == TAIR_PACKET_FLAG }
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,67 @@
1
+ module Tair
2
+ module Protocol
3
+
4
+ class TairObject < BinData::Record
5
+
6
+ int32be :value_len, value: lambda { raw_value.length + 2 }
7
+ int16be :value_type
8
+ string :raw_value, read_length: lambda { value_len - 2 }
9
+
10
+ TYPE_INT = 2
11
+ TYPE_STRING = 4
12
+ TYPE_BOOL = 6
13
+ TYPE_LONG = 8
14
+ TYPE_DATE = 10
15
+ TYPE_BYTE = 12
16
+ TYPE_FLOAT = 14
17
+ TYPE_DOUBLE = 16
18
+ TYPE_BYTEARRAY = 18
19
+ TYPE_SERIALIZE = 20
20
+ TYPE_INCDATA = 22
21
+ TYPE_MIXEDKEY = 24
22
+
23
+
24
+ def value
25
+ case value_type
26
+ when TYPE_LONG then raw_value.unpack('Q').first
27
+ when TYPE_STRING then raw_value.to_s
28
+ when TYPE_BOOL then raw_value == "\x01"
29
+ when TYPE_DOUBLE then raw_value.unpack('D').first
30
+ when TYPE_SERIALIZE then Marshal.load(raw_value)
31
+ end
32
+ end
33
+
34
+ MAX_INT32 = 0x7FFFFFFF
35
+
36
+ def value=(v)
37
+ case v
38
+ when String
39
+ [TYPE_STRING, v]
40
+ when Fixnum
41
+ # 数字暂时不能超过64位
42
+ [TYPE_LONG, [v].pack('Q')]
43
+ when TrueClass, FalseClass
44
+ [TYPE_BOOL, v ? "\x01" : "\x00"]
45
+ when Float
46
+ # 浮点数字统一用 double 型
47
+ [TYPE_DOUBLE, [v].pack('D')]
48
+ else
49
+ # serialize 类型仅限于 ruby 语言使用
50
+ # 和其他语言共用时不方便,请谨慎选择
51
+ [TYPE_SERIALIZE, Marshal.dump(v)]
52
+ end.tap do |t, nv|
53
+ self.value_type = t
54
+ self.raw_value = nv
55
+ end
56
+ end
57
+
58
+
59
+ def self.from(rb_value)
60
+ new.tap do |o|
61
+ o.value = rb_value
62
+ end
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,70 @@
1
+ module Tair
2
+
3
+ class Request
4
+
5
+ attr_accessor :namespace
6
+
7
+ def encode
8
+ body = self.body
9
+ header = self.header
10
+ header.body_len = body.do_num_bytes
11
+ header.to_binary_s << body.to_binary_s
12
+ end
13
+
14
+
15
+ def body
16
+ # implement in sub classes
17
+ BinData::Record.new
18
+ end
19
+
20
+
21
+ def header
22
+ @header ||= Header.new(req_id: req_id, packet_code: packet_code)
23
+ end
24
+
25
+
26
+ def packet_code
27
+ if self.class.const_defined? :PACKET_CODE
28
+ return self.class.const_get :PACKET_CODE
29
+ end
30
+
31
+ raise PacketCodeNotImplemented.new('you should implement packet code in sub classes')
32
+ end
33
+
34
+
35
+ TAIR_PACKET_FLAG = 0x6d426454
36
+
37
+ class Header < BinData::Record
38
+ int32be :tair_req_flag, value: TAIR_PACKET_FLAG
39
+ int32be :req_id
40
+ int32be :packet_code
41
+ int32be :body_len
42
+ end
43
+
44
+
45
+ def req_id
46
+ @req_id ||= _gen_req_id
47
+ end
48
+
49
+
50
+ MAX_INT32 = 0x7FFFFFFF
51
+
52
+ def _gen_req_id
53
+ @@_req_id ||= 0
54
+ @@_req_id = @@_req_id % MAX_INT32 + 1
55
+ end
56
+
57
+ private :_gen_req_id
58
+
59
+
60
+ def inspect
61
+ "[#{self.class.name}] #{encode.each_codepoint.to_a.map {|x| x.to_s(16) }.join(" ") }"
62
+ end
63
+
64
+
65
+ class PacketCodeNotImplemented < StandardError; end
66
+
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,19 @@
1
+ module Tair
2
+
3
+ class Response
4
+
5
+ attr_reader :raw_text, :body
6
+
7
+ def initialize(text)
8
+ @body = @raw_text = text
9
+ end
10
+
11
+
12
+ def decode
13
+ # implement this method in sub classes
14
+ end
15
+
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,12 @@
1
+ module Tair
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+ RELEASE = 'pre'
7
+
8
+ def self.to_s
9
+ [MAJOR, MINOR, PATCH, RELEASE].compact.join('.')
10
+ end
11
+ end
12
+ end
File without changes
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tair/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tair"
8
+ spec.version = Tair::Version
9
+ spec.authors = ["如彼"]
10
+ spec.email = ["hua.qiuh@alibaba-inc.com"]
11
+ spec.summary = %q{tair client for ruby.}
12
+ spec.description = %q{Tair client for ruby.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ # 这个 gem 暂时不开源,仅提供外部下载
17
+ # 去掉包含敏感配置信息的文件
18
+ spec.files = `git ls-files -z`.split("\x0").reject {|f| f.start_with? 'spec'} - ['README.md']
19
+
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+ spec.extensions = spec.files.grep(%r{extconf})
24
+
25
+ spec.add_dependency "bindata", "~> 2.1.0"
26
+ spec.add_dependency "rice", "~> 1.6.2"
27
+ spec.add_dependency "colored", "~> 1.2.0"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.7"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.1.0"
32
+ spec.add_development_dependency "rspec-core", "~> 3.1.0"
33
+ spec.add_development_dependency "rake-compiler" , '~> 0.9'
34
+ end
metadata ADDED
@@ -0,0 +1,189 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tair
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre
5
+ platform: ruby
6
+ authors:
7
+ - "如彼"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bindata
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rice
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.6.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: colored
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.1.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.1.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-core
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.1.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 3.1.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake-compiler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
125
+ description: Tair client for ruby.
126
+ email:
127
+ - hua.qiuh@alibaba-inc.com
128
+ executables: []
129
+ extensions:
130
+ - ext/tair/extconf.rb
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - Rakefile
138
+ - ext/tair/extconf.rb
139
+ - ext/tair/tair_murmurhash.cpp
140
+ - lib/tair.rb
141
+ - lib/tair/client.rb
142
+ - lib/tair/cluster.rb
143
+ - lib/tair/connection.rb
144
+ - lib/tair/error.rb
145
+ - lib/tair/key.rb
146
+ - lib/tair/log.rb
147
+ - lib/tair/operation/count.rb
148
+ - lib/tair/operation/decr.rb
149
+ - lib/tair/operation/delete.rb
150
+ - lib/tair/operation/fetch_data_servers.rb
151
+ - lib/tair/operation/get.rb
152
+ - lib/tair/operation/incr.rb
153
+ - lib/tair/operation/put.rb
154
+ - lib/tair/protocol.rb
155
+ - lib/tair/protocol/key_meta.rb
156
+ - lib/tair/protocol/murmurhash.rb
157
+ - lib/tair/protocol/response_header.rb
158
+ - lib/tair/protocol/socket_signature.rb
159
+ - lib/tair/protocol/tair_object.rb
160
+ - lib/tair/request.rb
161
+ - lib/tair/response.rb
162
+ - lib/tair/version.rb
163
+ - log/.gitkeep
164
+ - tair.gemspec
165
+ homepage: ''
166
+ licenses:
167
+ - MIT
168
+ metadata: {}
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">"
181
+ - !ruby/object:Gem::Version
182
+ version: 1.3.1
183
+ requirements: []
184
+ rubyforge_project:
185
+ rubygems_version: 2.4.4
186
+ signing_key:
187
+ specification_version: 4
188
+ summary: tair client for ruby.
189
+ test_files: []