tablestore-ruby-sdk 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/protobuf/table_store.pb.rb +684 -0
- data/lib/protobuf/{ots.proto → table_store.proto} +108 -115
- data/lib/protobuf/table_store_filiter.pb.rb +96 -0
- data/lib/protobuf/{ots_filiter.proto → table_store_filiter.proto} +10 -14
- data/lib/tablestore-ruby-sdk.rb +18 -18
- data/lib/tablestore/error.rb +1 -1
- data/lib/tablestore/metadata.rb +1 -1
- data/lib/tablestore/plain_buffer_coded_output_stream.rb +6 -19
- data/lib/tablestore/protocol.rb +1 -1
- data/lib/tablestore/{ots.rb → table_store_client.rb} +100 -56
- metadata +7 -7
- data/lib/protobuf/ots_filiter_pb.rb +0 -55
- data/lib/protobuf/ots_pb.rb +0 -307
@@ -1,14 +1,11 @@
|
|
1
|
-
syntax = "proto3";
|
2
1
|
|
3
2
|
enum FilterType {
|
4
|
-
FT_DEFAULT = 0;
|
5
3
|
FT_SINGLE_COLUMN_VALUE = 1;
|
6
4
|
FT_COMPOSITE_COLUMN_VALUE = 2;
|
7
5
|
FT_COLUMN_PAGINATION = 3;
|
8
6
|
}
|
9
7
|
|
10
8
|
enum ComparatorType {
|
11
|
-
CT_DEFAULT = 0;
|
12
9
|
CT_EQUAL = 1;
|
13
10
|
CT_NOT_EQUAL = 2;
|
14
11
|
CT_GREATER_THAN = 3;
|
@@ -18,31 +15,30 @@ enum ComparatorType {
|
|
18
15
|
}
|
19
16
|
|
20
17
|
message SingleColumnValueFilter {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
required ComparatorType comparator = 1;
|
19
|
+
required string column_name = 2;
|
20
|
+
required bytes column_value = 3; // Serialized SQLVariant
|
21
|
+
required bool filter_if_missing = 4;
|
22
|
+
required bool latest_version_only = 5;
|
26
23
|
}
|
27
24
|
|
28
25
|
enum LogicalOperator {
|
29
|
-
LO_DEFAULT = 0;
|
30
26
|
LO_NOT = 1;
|
31
27
|
LO_AND = 2;
|
32
28
|
LO_OR = 3;
|
33
29
|
}
|
34
30
|
|
35
31
|
message CompositeColumnValueFilter {
|
36
|
-
LogicalOperator combinator = 1;
|
32
|
+
required LogicalOperator combinator = 1;
|
37
33
|
repeated Filter sub_filters = 2;
|
38
34
|
}
|
39
35
|
|
40
36
|
message ColumnPaginationFilter {
|
41
|
-
|
42
|
-
|
37
|
+
required int32 offset = 1;
|
38
|
+
required int32 limit = 2;
|
43
39
|
}
|
44
40
|
|
45
41
|
message Filter {
|
46
|
-
|
47
|
-
|
42
|
+
required FilterType type = 1;
|
43
|
+
required bytes filter = 2; // Serialized string of filter of the type
|
48
44
|
}
|
data/lib/tablestore-ruby-sdk.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rest-client'
|
|
2
2
|
require 'openssl'
|
3
3
|
require 'base64'
|
4
4
|
require 'tablestore/error'
|
5
|
-
require 'tablestore/
|
5
|
+
require 'tablestore/table_store_client'
|
6
6
|
require 'tablestore/metadata'
|
7
7
|
|
8
8
|
class TableStore
|
@@ -13,12 +13,12 @@ class TableStore
|
|
13
13
|
|
14
14
|
|
15
15
|
def initialize(end_point, access_key_id, access_key_secret, instance_name, **kwargs)
|
16
|
-
# 初始化
|
17
|
-
# end_point是
|
18
|
-
# access_key_id是访问
|
19
|
-
# access_key_secret是访问
|
16
|
+
# 初始化TableStoreClient实例。
|
17
|
+
# end_point是TableStoreClient服务的地址(例如 'http://instance.cn-hangzhou.TableStoreClient.aliyun.com'),必须以'http://'或'https://'开头。
|
18
|
+
# access_key_id是访问TableStoreClient服务的accessid,通过官方网站申请或通过管理员获取。
|
19
|
+
# access_key_secret是访问TableStoreClient服务的accesskey,通过官方网站申请或通过管理员获取。
|
20
20
|
# instance_name是要访问的实例名,通过官方网站控制台创建或通过管理员获取。
|
21
|
-
# sts_token是访问
|
21
|
+
# sts_token是访问TableStoreClient服务的STS token,从STS服务获取,具有有效期,过期后需要重新获取。
|
22
22
|
# encoding请求参数的字符串编码类型,默认是utf8。
|
23
23
|
# socket_timeout是连接池中每个连接的Socket超时,单位为秒,可以为int或float。默认值为50。
|
24
24
|
# max_connection是连接池的最大连接数。默认为50,
|
@@ -28,21 +28,21 @@ class TableStore
|
|
28
28
|
#self.validate_parameter(end_point, access_key_id, access_key_secret, instance_name)
|
29
29
|
#sts_token = kwargs.get('sts_token')
|
30
30
|
|
31
|
-
#示例:创建一个
|
32
|
-
# from tablestore.client import
|
33
|
-
# client =
|
31
|
+
#示例:创建一个TableStoreClient实例
|
32
|
+
# from tablestore.client import TableStoreClient
|
33
|
+
# client = TableStoreClient('your_instance_endpoint', 'your_user_id', 'your_user_key', 'your_instance_name')
|
34
34
|
end
|
35
35
|
|
36
36
|
def _get_range(request)
|
37
37
|
api_name = 'GetRange'
|
38
|
-
body =
|
38
|
+
body = TableStoreClient.new.encode_get_range_request(request)
|
39
39
|
response = post_request(body, api_name)
|
40
|
-
|
40
|
+
TableStoreClient.new.decode_get_range_request(api_name, response.headers, response.body)
|
41
41
|
end
|
42
42
|
|
43
43
|
def _put_row(table_name, row, condition)
|
44
44
|
api_name = 'PutRow'
|
45
|
-
body =
|
45
|
+
body = TableStoreClient.new.encode_put_row(table_name, row, condition)
|
46
46
|
response = post_request(body, api_name)
|
47
47
|
if response.code == 200
|
48
48
|
'write succeed!'
|
@@ -51,21 +51,21 @@ class TableStore
|
|
51
51
|
|
52
52
|
def _get_row(table_name, primary_key, columns_to_get=nil, column_filter=nil, max_version=1)
|
53
53
|
api_name = 'GetRow'
|
54
|
-
body =
|
54
|
+
body = TableStoreClient.new.encode_get_row(table_name, primary_key, columns_to_get, column_filter, max_version)
|
55
55
|
response = post_request(body, api_name)
|
56
|
-
|
56
|
+
TableStoreClient.new.decode_get_row(response.body)
|
57
57
|
end
|
58
58
|
|
59
59
|
def _batch_get_row(request)
|
60
60
|
api_name = 'BatchGetRow'
|
61
|
-
body =
|
61
|
+
body = TableStoreClient.new.make_batch_get_row(request)
|
62
62
|
response = post_request(body, api_name)
|
63
|
-
|
63
|
+
TableStoreClient.new.decode_batch_get_row(response.body)
|
64
64
|
end
|
65
65
|
|
66
66
|
def _batch_write_row(request)
|
67
67
|
api_name = 'BatchWriteRow'
|
68
|
-
body =
|
68
|
+
body = TableStoreClient.new.make_batch_write_row(request)
|
69
69
|
response = post_request(body, api_name)
|
70
70
|
if response.code == 200
|
71
71
|
'write succeed!'
|
@@ -82,7 +82,7 @@ class TableStore
|
|
82
82
|
|
83
83
|
def get_headers(md5, api_name)
|
84
84
|
headers = {
|
85
|
-
"x-ots-date": Time.now.getutc.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
|
85
|
+
"x-ots-date": '2018-01-09T14:48:12.000Z',#Time.now.getutc.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
|
86
86
|
"x-ots-apiversion": '2015-12-31',
|
87
87
|
"x-ots-accesskeyid": UserID,
|
88
88
|
"x-ots-contentmd5": md5,
|
data/lib/tablestore/error.rb
CHANGED
data/lib/tablestore/metadata.rb
CHANGED
@@ -110,7 +110,7 @@ module Metadata
|
|
110
110
|
|
111
111
|
set_row_existence_expectation(row_existence_expectation)
|
112
112
|
|
113
|
-
set_column_condition(column_condition) if @column_condition
|
113
|
+
set_column_condition(column_condition) if @column_condition
|
114
114
|
end
|
115
115
|
|
116
116
|
def set_row_existence_expectation(row_existence_expectation)
|
@@ -156,38 +156,25 @@ class PlainBufferCodedOutputStream
|
|
156
156
|
write_tag(TAG_CELL)
|
157
157
|
cell_check_sum = write_cell_name(column_name, cell_check_sum)
|
158
158
|
timestamp = nil
|
159
|
-
if column_value
|
159
|
+
if column_value
|
160
160
|
if column_value.is_a?(Array)
|
161
|
-
if column_value[0]
|
161
|
+
if column_value[0]
|
162
162
|
cell_check_sum = write_column_value_with_checksum(column_value[0], cell_check_sum)
|
163
163
|
end
|
164
|
-
if column_value[1]
|
164
|
+
if column_value[1]
|
165
165
|
timestamp = column_value[1]
|
166
166
|
end
|
167
167
|
else
|
168
168
|
cell_check_sum = write_column_value_with_checksum(column_value, cell_check_sum)
|
169
169
|
end
|
170
170
|
end
|
171
|
-
if
|
172
|
-
write_tag(TAG_CELL_TYPE)
|
173
|
-
@output_stream.write_raw_byte(const.DELETE_ONE_VERSION)
|
174
|
-
elsif update_type == UpdateType.DELETE_ALL
|
175
|
-
write_tag(TAG_CELL_TYPE)
|
176
|
-
@output_stream.write_raw_byte(const.DELETE_ALL_VERSION)
|
177
|
-
end
|
178
|
-
if timestamp.present?
|
171
|
+
if timestamp
|
179
172
|
write_tag(TAG_CELL_TIMESTAMP)
|
180
173
|
@output_stream.write_raw_little_endian64(timestamp)
|
181
174
|
end
|
182
|
-
if timestamp
|
175
|
+
if timestamp
|
183
176
|
cell_check_sum = PlainBufferCrc8.crc_int64(cell_check_sum, timestamp)
|
184
177
|
end
|
185
|
-
if update_type == UpdateType.DELETE
|
186
|
-
cell_check_sum = PlainBufferCrc8.crc_int8(cell_check_sum, const.DELETE_ONE_VERSION)
|
187
|
-
end
|
188
|
-
if update_type == UpdateType.DELETE_ALL
|
189
|
-
cell_check_sum = PlainBufferCrc8.crc_int8(cell_check_sum, const.DELETE_ALL_VERSION)
|
190
|
-
end
|
191
178
|
write_tag(TAG_CELL_CHECKSUM)
|
192
179
|
@output_stream.write_raw_byte(cell_check_sum)
|
193
180
|
PlainBufferCrc8.crc_int8(row_check_sum, cell_check_sum)
|
@@ -202,7 +189,7 @@ class PlainBufferCodedOutputStream
|
|
202
189
|
end
|
203
190
|
|
204
191
|
def write_columns(columns, row_check_sum)
|
205
|
-
if columns
|
192
|
+
if columns and columns.length != 0
|
206
193
|
write_tag(TAG_ROW_DATA)
|
207
194
|
columns.each do |column|
|
208
195
|
if column.length == 2
|
data/lib/tablestore/protocol.rb
CHANGED
@@ -62,7 +62,7 @@ class OTSProtocol
|
|
62
62
|
'x-ots-contentmd5': md5,
|
63
63
|
}
|
64
64
|
|
65
|
-
headers['x-ots-ststoken'] = @sts_token if @sts_token
|
65
|
+
headers['x-ots-ststoken'] = @sts_token if @sts_token
|
66
66
|
|
67
67
|
signature = make_request_signature(query, headers)
|
68
68
|
headers['x-ots-signature'] = signature
|
@@ -1,14 +1,13 @@
|
|
1
|
-
require 'protobuf'
|
2
1
|
require 'os'
|
3
|
-
require 'protobuf/
|
4
|
-
require 'protobuf/
|
2
|
+
require 'protobuf/table_store.pb'
|
3
|
+
require 'protobuf/table_store_filiter.pb'
|
5
4
|
require 'consts'
|
6
5
|
require 'tablestore/plain_buffer_coded_output_stream'
|
7
6
|
require 'tablestore/plain_buffer_output_stream'
|
8
7
|
require 'tablestore/plain_buffer_coded_input_stream'
|
9
8
|
require 'tablestore/plain_buffer_input_stream'
|
10
9
|
|
11
|
-
class
|
10
|
+
class TableStoreClient
|
12
11
|
def encode_get_range_request(request)
|
13
12
|
proto = GetRangeRequest.new
|
14
13
|
proto.table_name = request[:table_name]
|
@@ -17,15 +16,12 @@ class OTS
|
|
17
16
|
proto.exclusive_end_primary_key = serialize_primary_key(request[:exclusive_end_primary_key])
|
18
17
|
proto.max_versions = request[:max_version]
|
19
18
|
proto.limit = request[:limit]
|
20
|
-
|
21
|
-
if proto_string.match("#{request[:table_name]}\x10\x02")
|
22
|
-
proto_string.sub("#{request[:table_name]}\x10\x02", "#{request[:table_name]}\x10\x00")
|
23
|
-
end
|
24
|
-
proto_string.sub("#{request[:table_name]}\x10\x02", "#{request[:table_name]}\x10\x00")
|
19
|
+
proto.serialize_to_string
|
25
20
|
end
|
26
21
|
|
27
22
|
def decode_get_range_request(api_name, headers, body)
|
28
|
-
proto = GetRangeResponse.
|
23
|
+
proto = GetRangeResponse.new
|
24
|
+
proto.parse_from_string(body)
|
29
25
|
#capacity_unit = parse_capacity_unit(proto.consumed.capacity_unit)
|
30
26
|
|
31
27
|
next_start_pk = nil
|
@@ -55,26 +51,24 @@ class OTS
|
|
55
51
|
contion_proto = Condition.new
|
56
52
|
proto.condition = make_condition(contion_proto, condition)
|
57
53
|
proto.row = serialize_for_put_row(row.primary_key, row.attribute_columns)
|
58
|
-
|
59
|
-
proto_string = proto_string[0..-2] + [0].pack('C') if proto_string[-1] == "\x03"
|
60
|
-
proto_string
|
54
|
+
proto.serialize_to_string
|
61
55
|
end
|
62
56
|
|
63
57
|
def encode_get_row(table_name, primary_key, columns_to_get, column_filter, max_version)
|
64
58
|
proto = GetRowRequest.new
|
65
59
|
proto.table_name = table_name
|
66
60
|
make_repeated_column_names(proto.columns_to_get, columns_to_get)
|
67
|
-
if column_filter
|
68
|
-
|
69
|
-
proto.filter = Filter.encode(pb_filter)
|
61
|
+
if column_filter
|
62
|
+
proto.filter = make_column_condition(column_filter).serialize_to_string
|
70
63
|
end
|
71
64
|
proto.primary_key = serialize_primary_key(primary_key)
|
72
|
-
proto.max_versions = max_version if max_version
|
73
|
-
|
65
|
+
proto.max_versions = max_version if max_version
|
66
|
+
proto.serialize_to_string
|
74
67
|
end
|
75
68
|
|
76
69
|
def decode_get_row(body)
|
77
|
-
proto = GetRowResponse.
|
70
|
+
proto = GetRowResponse.new
|
71
|
+
proto.parse_from_string(body)
|
78
72
|
|
79
73
|
return_row = nil
|
80
74
|
if proto.row.length > 0
|
@@ -86,7 +80,8 @@ class OTS
|
|
86
80
|
end
|
87
81
|
|
88
82
|
def decode_put_row(body)
|
89
|
-
proto = PutRowResponse.
|
83
|
+
proto = PutRowResponse.new
|
84
|
+
proto.parse_from_string(body)
|
90
85
|
return_row = nil
|
91
86
|
if proto.row.length != 0
|
92
87
|
inputStream = PlainBufferInputStream.new(proto.row)
|
@@ -104,24 +99,23 @@ class OTS
|
|
104
99
|
table_item.table_name = table_value.table_name
|
105
100
|
make_repeated_column_names(table_item.columns_to_get, table_value.columns_to_get)
|
106
101
|
|
107
|
-
if table_value.column_filter
|
108
|
-
|
109
|
-
table_item.filter = Filter.encode(pb_filter)
|
102
|
+
if table_value.column_filter
|
103
|
+
table_item.filter = make_column_condition(table_value.column_filter).serialize_to_string
|
110
104
|
end
|
111
105
|
|
112
106
|
table_value.primary_keys.each do |pk|
|
113
107
|
table_item.primary_key << serialize_primary_key(pk)
|
114
108
|
end
|
115
109
|
|
116
|
-
if table_value.token
|
110
|
+
if table_value.token
|
117
111
|
table_value.token.each do |tk|
|
118
112
|
table_item.token << tk
|
119
113
|
end
|
120
114
|
end
|
121
|
-
if table_value.max_version
|
115
|
+
if table_value.max_version
|
122
116
|
table_item.max_versions = table_value.max_version
|
123
117
|
end
|
124
|
-
if table_value.time_range
|
118
|
+
if table_value.time_range
|
125
119
|
if table_value.time_range.is_a?(Array)
|
126
120
|
table_item.time_range.start_time = table_value.time_range[0]
|
127
121
|
table_item.time_range.end_time = table_value.time_range[1]
|
@@ -129,19 +123,20 @@ class OTS
|
|
129
123
|
table_item.time_range.specific_time = table_value.time_range
|
130
124
|
end
|
131
125
|
end
|
132
|
-
if table_value.start_column
|
126
|
+
if table_value.start_column
|
133
127
|
table_item.start_column = table_value.start_column
|
134
128
|
end
|
135
|
-
if table_value.end_column
|
129
|
+
if table_value.end_column
|
136
130
|
table_item.end_column = table_value.end_column
|
137
131
|
end
|
138
132
|
proto.tables << table_item
|
139
133
|
end
|
140
|
-
|
134
|
+
proto.serialize_to_string
|
141
135
|
end
|
142
136
|
|
143
137
|
def decode_batch_get_row(body)
|
144
|
-
proto = BatchGetRowResponse.
|
138
|
+
proto = BatchGetRowResponse.new
|
139
|
+
proto.parse_from_string(body)
|
145
140
|
rows = []
|
146
141
|
proto.tables.each do |table_item|
|
147
142
|
rows << parse_get_row_item(table_item.rows)
|
@@ -168,8 +163,7 @@ class OTS
|
|
168
163
|
end
|
169
164
|
proto.tables << table_item
|
170
165
|
end
|
171
|
-
|
172
|
-
batch_string.gsub("\x08\x03", "\x08\x00")
|
166
|
+
proto.serialize_to_string
|
173
167
|
end
|
174
168
|
|
175
169
|
def make_put_row_item(proto, put_row_item)
|
@@ -180,28 +174,28 @@ class OTS
|
|
180
174
|
condition_proto = Condition.new
|
181
175
|
proto.condition = make_condition(condition_proto, condition)
|
182
176
|
if put_row_item.return_type == ReturnType::RT_PK
|
183
|
-
proto.return_content.return_type =
|
177
|
+
proto.return_content.return_type = RT_PK
|
184
178
|
end
|
185
179
|
|
186
180
|
proto.row_change = serialize_for_put_row(put_row_item.row.primary_key, put_row_item.row.attribute_columns)
|
187
|
-
proto.type =
|
181
|
+
proto.type = PUT
|
188
182
|
proto
|
189
183
|
end
|
190
184
|
|
191
185
|
def make_update_row_item(proto, update_row_item)
|
192
186
|
condition = update_row_item.condition
|
193
187
|
if condition.nil?
|
194
|
-
condition =
|
188
|
+
condition = Condition.new(RowExistenceExpectation::IGNORE, nil)
|
195
189
|
end
|
190
|
+
condition_proto = Condition.new
|
191
|
+
proto.condition = make_condition(condition_proto, condition)
|
196
192
|
|
197
|
-
|
198
|
-
|
199
|
-
if update_row_item.return_type == Metadata::ReturnType::RT_PK
|
200
|
-
proto.return_content.return_type = :RT_PK
|
193
|
+
if update_row_item.return_type == ReturnType::RT_PK
|
194
|
+
proto.return_content.return_type = RT_PK
|
201
195
|
end
|
202
196
|
|
203
197
|
proto.row_change = serialize_for_update_row(update_row_item.row.primary_key, update_row_item.row.attribute_columns)
|
204
|
-
proto.type =
|
198
|
+
proto.type = UPDATE
|
205
199
|
proto
|
206
200
|
end
|
207
201
|
|
@@ -221,9 +215,8 @@ class OTS
|
|
221
215
|
proto.row_existence = expectation_str
|
222
216
|
raise TableStoreClientError.new("row_existence_expectation should be one of [#{join(', ')}], not #{expectation_str}") if proto.row_existence.nil?
|
223
217
|
|
224
|
-
if condition.get_column_condition
|
225
|
-
|
226
|
-
proto.column_condition = Filter.encode(pb_filter)
|
218
|
+
if condition.get_column_condition
|
219
|
+
proto.column_condition = make_column_condition(condition.column_condition).serialize_to_string
|
227
220
|
end
|
228
221
|
proto
|
229
222
|
end
|
@@ -252,7 +245,7 @@ class OTS
|
|
252
245
|
proto.sub_filters << make_column_condition(sub)
|
253
246
|
end
|
254
247
|
|
255
|
-
|
248
|
+
proto.serialize_to_string
|
256
249
|
end
|
257
250
|
|
258
251
|
def make_relation_condition(condition)
|
@@ -263,17 +256,8 @@ class OTS
|
|
263
256
|
proto.column_value = serialize_column_value(condition.get_column_value)
|
264
257
|
proto.filter_if_missing = !condition.pass_if_missing
|
265
258
|
proto.latest_version_only = condition.latest_version_only
|
266
|
-
|
267
|
-
|
268
|
-
if proto.filter_if_missing.blank? && proto.latest_version_only.blank?
|
269
|
-
filter_string += [32, 0, 40, 0].pack("C*")
|
270
|
-
elsif proto.filter_if_missing.blank?
|
271
|
-
filter_string.insert(-3, [32, 0].pack("C*"))
|
272
|
-
elsif proto.latest_version_only.blank?
|
273
|
-
filter_string += [40, 0].pack("C*")
|
274
|
-
end
|
259
|
+
proto.serialize_to_string
|
275
260
|
|
276
|
-
filter_string
|
277
261
|
end
|
278
262
|
|
279
263
|
def parse_get_row_item(proto)
|
@@ -302,7 +286,7 @@ class OTS
|
|
302
286
|
# end
|
303
287
|
end
|
304
288
|
|
305
|
-
row_list << {pk: primary_key_columns, attr: attribute_columns} if primary_key_columns
|
289
|
+
row_list << {pk: primary_key_columns, attr: attribute_columns} if primary_key_columns
|
306
290
|
end
|
307
291
|
row_list
|
308
292
|
end
|
@@ -365,6 +349,34 @@ class OTS
|
|
365
349
|
stream.get_buffer.join('')
|
366
350
|
end
|
367
351
|
|
352
|
+
def serialize_for_update_row(primary_key, attribute_columns)
|
353
|
+
unless attribute_columns.is_a?(Hash)
|
354
|
+
raise TableStoreClientError.new("the attribute columns of UpdateRow is not hash, but is #{attribute_columns.class}")
|
355
|
+
end
|
356
|
+
|
357
|
+
attribute_columns.keys.each do |key|
|
358
|
+
if attribute_columns[key] && !attribute_columns[key].is_a?(Hash)
|
359
|
+
raise TableStoreClientError.new("the columns value of update-row must be hash, but is #{attribute_columns[key].class}")
|
360
|
+
end
|
361
|
+
attribute_columns[key].each do |cell|
|
362
|
+
# if cell.is_a?(Array)
|
363
|
+
# raise TableStoreClientError.new("the cell of update-row must be array, but is #{cell.class}")
|
364
|
+
# end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
buf_size = compute_update_row_size(primary_key, attribute_columns)
|
369
|
+
output_stream = PlainBufferOutputStream.new(buf_size)
|
370
|
+
coded_output_stream = PlainBufferCodedOutputStream.new(output_stream)
|
371
|
+
row_checksum = 0
|
372
|
+
coded_output_stream.write_header
|
373
|
+
row_checksum = coded_output_stream.write_primary_key(primary_key, row_checksum)
|
374
|
+
row_checksum = coded_output_stream.write_update_columns(attribute_columns, row_checksum)
|
375
|
+
row_checksum = PlainBufferCrc8.crc_int8(row_checksum, 0)
|
376
|
+
coded_output_stream.write_row_checksum(row_checksum)
|
377
|
+
output_stream.get_buffer.join('')
|
378
|
+
end
|
379
|
+
|
368
380
|
def compute_variant_value_size(value)
|
369
381
|
compute_primary_key_value_size(value) - LITTLE_ENDIAN_SIZE - 1
|
370
382
|
end
|
@@ -474,8 +486,40 @@ class OTS
|
|
474
486
|
elsif value.is_a?(Float)
|
475
487
|
size += LITTLE_ENDIAN_64_SIZE
|
476
488
|
else
|
477
|
-
raise TableStoreClientError("Unsupported column type: " + value.class)
|
489
|
+
raise TableStoreClientError.new("Unsupported column type: " + value.class)
|
490
|
+
end
|
491
|
+
size
|
492
|
+
end
|
493
|
+
|
494
|
+
def compute_update_row_size(primary_key, attribute_columns)
|
495
|
+
size = LITTLE_ENDIAN_SIZE
|
496
|
+
size += compute_primary_key_size(primary_key)
|
497
|
+
|
498
|
+
if attribute_columns.length != 0
|
499
|
+
size += 1
|
500
|
+
attribute_columns.keys.each do |update_type|
|
501
|
+
columns = attribute_columns[update_type]
|
502
|
+
if columns.is_a?(String)
|
503
|
+
size += compute_column_size2(column, nil, update_type)
|
504
|
+
elsif columns.is_a?(Array)
|
505
|
+
columns.each do |column|
|
506
|
+
if column.length == 1
|
507
|
+
size += compute_column_size2(column[0], nil, update_type)
|
508
|
+
elsif columns.length >= 2
|
509
|
+
compute_column_size2(column[0], column[1], update_type)
|
510
|
+
else
|
511
|
+
#raise OTSClientError("Unsupported column type:" + str(type(columns)))
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
478
516
|
end
|
517
|
+
size += 2
|
479
518
|
size
|
480
519
|
end
|
520
|
+
|
521
|
+
def compute_column_size2(column_name, column_value, update_type)
|
522
|
+
compute_column_size(column_name, column_value)
|
523
|
+
end
|
524
|
+
|
481
525
|
end
|