tarantool 0.4.2.1 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tarantool/request.rb +19 -19
- data/lib/tarantool/response.rb +18 -18
- data/lib/tarantool/util.rb +4 -122
- data/lib/tarantool/version.rb +2 -2
- data/test/shared_record.rb +9 -6
- metadata +18 -2
data/lib/tarantool/request.rb
CHANGED
@@ -83,7 +83,7 @@ module Tarantool
|
|
83
83
|
if index_no != :space && nili = key.index(nil)
|
84
84
|
key = key.slice(0, nili)
|
85
85
|
end
|
86
|
-
body
|
86
|
+
::BinUtils.append_int32_le!(body, key_size = key.size)
|
87
87
|
i = 0
|
88
88
|
while i < key_size
|
89
89
|
field = types[i] || get_tail_item(types, i, tail)
|
@@ -110,50 +110,50 @@ module Tarantool
|
|
110
110
|
when :int, :integer
|
111
111
|
value = value.to_i
|
112
112
|
_raise_integer_overflow(value, MIN_INT, MAX_INT32) if value > MAX_INT32 or value < 0
|
113
|
-
|
113
|
+
::BinUtils.append_bersize_int32_le!(body, value)
|
114
114
|
when :string, :bytes, :str
|
115
115
|
value = value.to_s
|
116
116
|
value = ZERO + value if value < ONE
|
117
117
|
raise StringTooLong if value.bytesize >= MAX_BYTE_SIZE
|
118
|
-
body
|
118
|
+
::BinUtils.append_bersize_string!(body, value)
|
119
119
|
when :bytes
|
120
120
|
value = value.to_s
|
121
121
|
raise StringTooLong if value.bytesize >= MAX_BYTE_SIZE
|
122
|
-
body
|
122
|
+
::BinUtils.append_bersize_string!(body, value)
|
123
123
|
when :int64
|
124
124
|
value = value.to_i
|
125
125
|
_raise_integer_overflow(value, MIN_INT, MAX_INT64) if value > MAX_INT64 or value < 0
|
126
|
-
|
126
|
+
::BinUtils.append_bersize_int64_le!(body, value)
|
127
127
|
when :int16
|
128
128
|
value = value.to_i
|
129
129
|
_raise_integer_overflow(value, MIN_INT, MAX_INT16) if value > MAX_INT16 or value < 0
|
130
|
-
|
130
|
+
::BinUtils.append_bersize_int16_le!(body, value)
|
131
131
|
when :int8
|
132
132
|
value = value.to_i
|
133
133
|
_raise_integer_overflow(value, MIN_INT, MAX_INT8) if value > MAX_INT8 or value < 0
|
134
|
-
|
134
|
+
::BinUtils.append_bersize_int8!(body, value)
|
135
135
|
when :sint
|
136
136
|
value = value.to_i
|
137
137
|
_raise_integer_overflow(value, MIN_SINT32, MAX_SINT32) if value > MAX_SINT32 or value < MIN_SINT32
|
138
|
-
|
138
|
+
::BinUtils.append_bersize_sint32_le!(body, value)
|
139
139
|
when :sint64
|
140
140
|
value = value.to_i
|
141
141
|
_raise_integer_overflow(value, MIN_SINT64, MAX_SINT64) if value > MAX_SINT64 or value < MIN_SINT64
|
142
|
-
|
142
|
+
::BinUtils.append_bersize_sint64_le!(body, value)
|
143
143
|
when :sint16
|
144
144
|
value = value.to_i
|
145
145
|
_raise_integer_overflow(value, MIN_SINT16, MAX_SINT16) if value > MAX_SINT16 or value < MIN_SINT16
|
146
|
-
|
146
|
+
::BinUtils.append_bersize_sint16_le!(body, value)
|
147
147
|
when :sint8
|
148
148
|
value = value.to_i
|
149
149
|
_raise_integer_overflow(value, MIN_SINT8, MAX_SINT8) if value > MAX_SINT8 or value < MIN_SINT8
|
150
|
-
|
150
|
+
::BinUtils.append_bersize_sint8!(body, value)
|
151
151
|
when :varint
|
152
152
|
value = value.to_i
|
153
153
|
if 0 <= value && value < MAX_INT32
|
154
|
-
|
154
|
+
::BinUtils.append_bersize_int32_le!(body, value)
|
155
155
|
else
|
156
|
-
|
156
|
+
::BinUtils.append_bersize_sint64_le!(body, value)
|
157
157
|
end
|
158
158
|
when :error
|
159
159
|
raise IndexIndexError
|
@@ -171,7 +171,7 @@ module Tarantool
|
|
171
171
|
else
|
172
172
|
value = get_serializer(field_kind).encode(value).to_s
|
173
173
|
raise StringTooLong if value.bytesize > MAX_BYTE_SIZE
|
174
|
-
body
|
174
|
+
::BinUtils.append_bersize_string!(body, value)
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
@@ -206,7 +206,7 @@ module Tarantool
|
|
206
206
|
|
207
207
|
body = [space_no, flags].pack(UPDATE_HEADER)
|
208
208
|
pack_tuple(body, pk, pk_fields, 0)
|
209
|
-
|
209
|
+
::BinUtils.append_int32_le!(body, operations.size)
|
210
210
|
|
211
211
|
_pack_operations(body, operations, fields)
|
212
212
|
|
@@ -276,10 +276,10 @@ module Tarantool
|
|
276
276
|
end
|
277
277
|
|
278
278
|
str = operation[4].to_s
|
279
|
-
body
|
280
|
-
|
281
|
-
|
282
|
-
body
|
279
|
+
::BinUtils.append_ber!(body, 10 + ber_size(str.bytesize) + str.bytesize)
|
280
|
+
::BinUtils.append_bersize_sint32_le!(body, operation[2].to_i)
|
281
|
+
::BinUtils.append_bersize_sint32_le!(body, operation[3].to_i)
|
282
|
+
::BinUtils.append_bersize_string!(body, str.to_s)
|
283
283
|
when 7
|
284
284
|
old_field_no = field_no +
|
285
285
|
(inserted ||= []).count{|i| i <= field_no} -
|
data/lib/tarantool/response.rb
CHANGED
@@ -8,7 +8,7 @@ module Tarantool
|
|
8
8
|
def _parse_iproto(data)
|
9
9
|
if Exception === data || data == ''
|
10
10
|
data
|
11
|
-
elsif (ret =
|
11
|
+
elsif (ret = ::BinUtils.slice_int32_le!(data)) == 0
|
12
12
|
data
|
13
13
|
else
|
14
14
|
data.gsub!("\x00", "")
|
@@ -47,7 +47,7 @@ module Tarantool
|
|
47
47
|
def parse_response(data)
|
48
48
|
return data if Exception === data
|
49
49
|
unless get_tuples
|
50
|
-
|
50
|
+
::BinUtils.get_int32_le(data)
|
51
51
|
else
|
52
52
|
tuples = unpack_tuples(data)
|
53
53
|
if translators
|
@@ -60,7 +60,7 @@ module Tarantool
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def unpack_tuples(data)
|
63
|
-
tuples_affected =
|
63
|
+
tuples_affected = ::BinUtils.slice_int32_le!(data)
|
64
64
|
tuples = []
|
65
65
|
fields = fields()
|
66
66
|
if Integer === fields.last
|
@@ -70,13 +70,13 @@ module Tarantool
|
|
70
70
|
end
|
71
71
|
|
72
72
|
while tuples_affected > 0
|
73
|
-
byte_size =
|
74
|
-
fields_num =
|
73
|
+
byte_size = ::BinUtils.slice_int32_le!(data)
|
74
|
+
fields_num = ::BinUtils.slice_int32_le!(data)
|
75
75
|
tuple_str = data.slice!(0, byte_size)
|
76
76
|
i = 0
|
77
77
|
tuple = []
|
78
78
|
while i < fields_num
|
79
|
-
field_size =
|
79
|
+
field_size = ::BinUtils.slice_ber!(tuple_str)
|
80
80
|
|
81
81
|
field = fields[i] || get_tail_item(fields, i, tail)
|
82
82
|
|
@@ -86,7 +86,7 @@ module Tarantool
|
|
86
86
|
if field_size != 4
|
87
87
|
raise ValueError, "Bad field size #{field_size} for integer field ##{i}"
|
88
88
|
end
|
89
|
-
|
89
|
+
::BinUtils.slice_int32_le!(tuple_str)
|
90
90
|
when :string, :str
|
91
91
|
str = tuple_str.slice!(0, field_size)
|
92
92
|
str[0,1] = EMPTY if str < ONE
|
@@ -95,47 +95,47 @@ module Tarantool
|
|
95
95
|
if field_size != 8
|
96
96
|
raise ValueError, "Bad field size #{field_size} for 64bit integer field ##{i}"
|
97
97
|
end
|
98
|
-
|
98
|
+
::BinUtils.slice_int64_le!(tuple_str)
|
99
99
|
when :bytes
|
100
100
|
tuple_str.slice!(0, field_size)
|
101
101
|
when :int16
|
102
102
|
if field_size != 2
|
103
103
|
raise ValueError, "Bad field size #{field_size} for 16bit integer field ##{i}"
|
104
104
|
end
|
105
|
-
|
105
|
+
::BinUtils.slice_int16_le!(tuple_str)
|
106
106
|
when :int8
|
107
107
|
if field_size != 1
|
108
108
|
raise ValueError, "Bad field size #{field_size} for 8bit integer field ##{i}"
|
109
109
|
end
|
110
|
-
|
110
|
+
::BinUtils.slice_int8!(tuple_str)
|
111
111
|
when :sint
|
112
112
|
if field_size != 4
|
113
113
|
raise ValueError, "Bad field size #{field_size} for integer field ##{i}"
|
114
114
|
end
|
115
|
-
|
115
|
+
::BinUtils.slice_sint32_le!(tuple_str)
|
116
116
|
when :sint64
|
117
117
|
if field_size != 8
|
118
118
|
raise ValueError, "Bad field size #{field_size} for 64bit integer field ##{i}"
|
119
119
|
end
|
120
|
-
|
120
|
+
::BinUtils.slice_sint64_le!(tuple_str)
|
121
121
|
when :sint16
|
122
122
|
if field_size != 2
|
123
123
|
raise ValueError, "Bad field size #{field_size} for 16bit integer field ##{i}"
|
124
124
|
end
|
125
|
-
|
125
|
+
::BinUtils.slice_sint16_le!(tuple_str)
|
126
126
|
when :sint8
|
127
127
|
if field_size != 1
|
128
128
|
raise ValueError, "Bad field size #{field_size} for 8bit integer field ##{i}"
|
129
129
|
end
|
130
|
-
|
130
|
+
::BinUtils.slice_sint8!(tuple_str)
|
131
131
|
when :varint
|
132
132
|
case field_size
|
133
133
|
when 8
|
134
|
-
|
134
|
+
::BinUtils.slice_int64_le!(tuple_str)
|
135
135
|
when 4
|
136
|
-
|
136
|
+
::BinUtils.slice_int32_le!(tuple_str)
|
137
137
|
when 2
|
138
|
-
|
138
|
+
::BinUtils.slice_int16_le!(tuple_str)
|
139
139
|
else
|
140
140
|
raise ValueError, "Bad field size #{field_size} for integer field ##{i}"
|
141
141
|
end
|
@@ -159,7 +159,7 @@ module Tarantool
|
|
159
159
|
end
|
160
160
|
|
161
161
|
def return_code(data)
|
162
|
-
|
162
|
+
::BinUtils.slice_int32_le!(data)
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
data/lib/tarantool/util.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'bin_utils'
|
1
2
|
module Tarantool
|
2
3
|
module Util
|
3
4
|
module Packer
|
@@ -25,131 +26,12 @@ module Tarantool
|
|
25
26
|
private
|
26
27
|
EMPTY = ''.freeze
|
27
28
|
ONE = "\x01".freeze
|
28
|
-
def unpack_int8!(data)
|
29
|
-
int = data.getbyte(0)
|
30
|
-
data[0, 1] = EMPTY
|
31
|
-
int
|
32
|
-
end
|
33
|
-
|
34
|
-
def unpack_int16(data)
|
35
|
-
data.getbyte(0) + data.getbyte(1) * 256
|
36
|
-
end
|
37
|
-
|
38
|
-
def unpack_int16!(data)
|
39
|
-
int = data.getbyte(0) + data.getbyte(1) * 256
|
40
|
-
data[0, 2] = EMPTY
|
41
|
-
int
|
42
|
-
end
|
43
|
-
|
44
|
-
def unpack_int32(int)
|
45
|
-
(int.getbyte(0) + int.getbyte(1) * 256 +
|
46
|
-
int.getbyte(2) * 65536 + int.getbyte(3) * 16777216)
|
47
|
-
end
|
48
|
-
|
49
|
-
def unpack_int32!(data)
|
50
|
-
int = (data.getbyte(0) + data.getbyte(1) * 256 +
|
51
|
-
data.getbyte(2) * 65536 + data.getbyte(3) * 16777216)
|
52
|
-
data[0, 4] = EMPTY
|
53
|
-
int
|
54
|
-
end
|
55
|
-
|
56
|
-
def unpack_int64!(data)
|
57
|
-
int = data.unpack(INT64)[0]
|
58
|
-
data[0, 8] = EMPTY
|
59
|
-
int
|
60
|
-
end
|
61
|
-
|
62
|
-
def unpack_int64(data)
|
63
|
-
data.unpack(INT64)[0]
|
64
|
-
end
|
65
|
-
|
66
|
-
def unpack_sint8!(data)
|
67
|
-
i = unpack_int8!(data)
|
68
|
-
i - ((i & 128) << 1)
|
69
|
-
end
|
70
|
-
|
71
|
-
def unpack_sint16!(data)
|
72
|
-
i = unpack_int16!(data)
|
73
|
-
i - ((i & 32768) << 1)
|
74
|
-
end
|
75
|
-
|
76
|
-
def unpack_sint32!(data)
|
77
|
-
i = unpack_int32!(data)
|
78
|
-
i - ((i >> 31) << 32)
|
79
|
-
end
|
80
|
-
|
81
|
-
def unpack_sint64!(data)
|
82
|
-
i = unpack_int64!(data)
|
83
|
-
i - ((i >> 63) << 64)
|
84
|
-
end
|
85
|
-
|
86
29
|
def ber_size(int)
|
87
30
|
int < 128 ? 1 :
|
88
31
|
int < 16384 ? 2 :
|
89
32
|
int < 2097153 ? 3 :
|
90
33
|
int < 268435456 ? 4 : 5
|
91
34
|
end
|
92
|
-
|
93
|
-
def unpack_ber!(data)
|
94
|
-
res = 0
|
95
|
-
pos = 0
|
96
|
-
while true
|
97
|
-
if (byte = data.getbyte(pos)) <= 127
|
98
|
-
res += byte
|
99
|
-
break
|
100
|
-
else
|
101
|
-
res = (res + (byte - 128)) * 128
|
102
|
-
pos += 1
|
103
|
-
end
|
104
|
-
end
|
105
|
-
data[0, pos+1] = EMPTY
|
106
|
-
res
|
107
|
-
end
|
108
|
-
|
109
|
-
def append_int8!(str, int)
|
110
|
-
str << (int & 255)
|
111
|
-
end
|
112
|
-
|
113
|
-
def append_int16!(str, int)
|
114
|
-
str << (int & 255) << ((int>>8) & 255)
|
115
|
-
end
|
116
|
-
|
117
|
-
def append_int32!(str, int)
|
118
|
-
str << (int & 255) << ((int>>8) & 255) <<
|
119
|
-
((int>>16) & 255) << ((int>>24) & 255)
|
120
|
-
end
|
121
|
-
|
122
|
-
def append_int64!(str, int)
|
123
|
-
str << [int].pack(INT64)
|
124
|
-
end
|
125
|
-
|
126
|
-
alias append_sint8! append_int8!
|
127
|
-
alias append_sint16! append_int16!
|
128
|
-
alias append_sint32! append_int32!
|
129
|
-
alias append_sint64! append_int64!
|
130
|
-
|
131
|
-
def append_ber_int8!(str, int)
|
132
|
-
str << 1 << (int & 255)
|
133
|
-
end
|
134
|
-
|
135
|
-
def append_ber_int16!(str, int)
|
136
|
-
str << 2 << (int & 255) << ((int>>8) & 255)
|
137
|
-
end
|
138
|
-
|
139
|
-
def append_ber_int32!(str, int)
|
140
|
-
str << 4 <<
|
141
|
-
(int & 255) << ((int>>8) & 255) <<
|
142
|
-
((int>>16) & 255) << ((int>>24) & 255)
|
143
|
-
end
|
144
|
-
|
145
|
-
def append_ber_int64!(str, int)
|
146
|
-
str << 8 << [int].pack(INT64)
|
147
|
-
end
|
148
|
-
|
149
|
-
alias append_ber_sint8! append_ber_int8!
|
150
|
-
alias append_ber_sint16! append_ber_int16!
|
151
|
-
alias append_ber_sint32! append_ber_int32!
|
152
|
-
alias append_ber_sint64! append_ber_int64!
|
153
35
|
end
|
154
36
|
|
155
37
|
module TailGetter
|
@@ -179,11 +61,11 @@ module Tarantool
|
|
179
61
|
def to_int
|
180
62
|
case @data.bytesize
|
181
63
|
when 8
|
182
|
-
|
64
|
+
::BinUtils.get_int64_le(@data)
|
183
65
|
when 4
|
184
|
-
|
66
|
+
::BinUtils.get_int32_le(@data)
|
185
67
|
when 2
|
186
|
-
|
68
|
+
::BinUtils.get_int16_le(@data)
|
187
69
|
else
|
188
70
|
raise ValueError, "Bad field size #{field_size} for integer field ##{i}"
|
189
71
|
end
|
data/lib/tarantool/version.rb
CHANGED
data/test/shared_record.rb
CHANGED
@@ -3,12 +3,13 @@ require 'yajl'
|
|
3
3
|
require 'tarantool/serializers/bson'
|
4
4
|
|
5
5
|
shared_examples_for :record do
|
6
|
-
|
6
|
+
let(:db){ Tarantool.new(TCONFIG.merge(type: :block)) }
|
7
7
|
before{ truncate }
|
8
8
|
|
9
9
|
let(:user_class) do
|
10
|
+
db = db()
|
10
11
|
Class.new(base_class) do
|
11
|
-
set_tarantool
|
12
|
+
set_tarantool db
|
12
13
|
set_space_no 0
|
13
14
|
|
14
15
|
def self.name # For naming
|
@@ -24,8 +25,9 @@ shared_examples_for :record do
|
|
24
25
|
end
|
25
26
|
|
26
27
|
let(:second_class) do
|
28
|
+
db = db()
|
27
29
|
Class.new(base_class) do
|
28
|
-
set_tarantool
|
30
|
+
set_tarantool db
|
29
31
|
set_space_no 1
|
30
32
|
|
31
33
|
def self.name # For naming
|
@@ -360,13 +362,13 @@ shared_examples_for :record do
|
|
360
362
|
second_class.insert(id: 100).must_equal 1
|
361
363
|
obj = second_class.by_pk(100)
|
362
364
|
obj.attributes.must_equal({id: 100, count1: nil, count2: nil})
|
363
|
-
tuple =
|
365
|
+
tuple = db.space(1, [:int, :int, :int], keys: 0).by_pk(100)
|
364
366
|
tuple.must_equal([100, nil, nil])
|
365
367
|
|
366
368
|
second_class.insert(id: 101, count2: 102).must_equal 1
|
367
369
|
obj = second_class.by_pk(101)
|
368
370
|
obj.attributes.must_equal({id: 101, count1: nil, count2: 102})
|
369
|
-
tuple =
|
371
|
+
tuple = db.space(1, [:int, :int, :int], keys: 0).by_pk(101)
|
370
372
|
tuple.must_equal([101, nil, 102])
|
371
373
|
end
|
372
374
|
|
@@ -474,8 +476,9 @@ shared_examples_for :record do
|
|
474
476
|
|
475
477
|
describe "composite primary key" do
|
476
478
|
let(:address_class) do
|
479
|
+
db = db()
|
477
480
|
Class.new(base_class) do
|
478
|
-
set_tarantool
|
481
|
+
set_tarantool db
|
479
482
|
set_space_no 2
|
480
483
|
|
481
484
|
def self.name # For naming
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tarantool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: iproto
|
@@ -60,6 +60,22 @@ dependencies:
|
|
60
60
|
- - ! '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 0.0.2
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: bin_utils
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.0.1
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 0.0.1
|
63
79
|
description: Tarantool KV-storage client.
|
64
80
|
email:
|
65
81
|
- ceo@prepor.ru
|