ali_ots 0.0.1

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ali_ots.rb +127 -0
  3. data/lib/ali_ots/client.rb +183 -0
  4. data/lib/ali_ots/connection.rb +118 -0
  5. data/lib/ali_ots/metas/batch_get_row_request.rb +17 -0
  6. data/lib/ali_ots/metas/batch_get_row_response.rb +17 -0
  7. data/lib/ali_ots/metas/batch_write_row_request.rb +17 -0
  8. data/lib/ali_ots/metas/batch_write_row_response.rb +17 -0
  9. data/lib/ali_ots/metas/capacity_unit.rb +19 -0
  10. data/lib/ali_ots/metas/column.rb +19 -0
  11. data/lib/ali_ots/metas/column_schema.rb +18 -0
  12. data/lib/ali_ots/metas/column_update.rb +21 -0
  13. data/lib/ali_ots/metas/column_value.rb +27 -0
  14. data/lib/ali_ots/metas/condition.rb +16 -0
  15. data/lib/ali_ots/metas/consumed_capacity.rb +17 -0
  16. data/lib/ali_ots/metas/create_table_request.rb +18 -0
  17. data/lib/ali_ots/metas/delete_row_in_batch_write_row_request.rb +19 -0
  18. data/lib/ali_ots/metas/delete_row_request.rb +21 -0
  19. data/lib/ali_ots/metas/delete_row_response.rb +17 -0
  20. data/lib/ali_ots/metas/delete_table_request.rb +17 -0
  21. data/lib/ali_ots/metas/describe_table_request.rb +16 -0
  22. data/lib/ali_ots/metas/describe_table_response.rb +18 -0
  23. data/lib/ali_ots/metas/enums/column_type.rb +32 -0
  24. data/lib/ali_ots/metas/enums/direction.rb +21 -0
  25. data/lib/ali_ots/metas/enums/operation_type.rb +22 -0
  26. data/lib/ali_ots/metas/enums/row_existence_expectation.rb +21 -0
  27. data/lib/ali_ots/metas/error.rb +19 -0
  28. data/lib/ali_ots/metas/get_range_request.rb +27 -0
  29. data/lib/ali_ots/metas/get_range_response.rb +21 -0
  30. data/lib/ali_ots/metas/get_row_request.rb +21 -0
  31. data/lib/ali_ots/metas/get_row_response.rb +18 -0
  32. data/lib/ali_ots/metas/list_table_request.rb +14 -0
  33. data/lib/ali_ots/metas/list_table_response.rb +16 -0
  34. data/lib/ali_ots/metas/put_row_in_batch_write_row_request.rb +21 -0
  35. data/lib/ali_ots/metas/put_row_request.rb +22 -0
  36. data/lib/ali_ots/metas/put_row_response.rb +17 -0
  37. data/lib/ali_ots/metas/reserved_throughput.rb +16 -0
  38. data/lib/ali_ots/metas/reserved_throughput_details.rb +22 -0
  39. data/lib/ali_ots/metas/row.rb +19 -0
  40. data/lib/ali_ots/metas/row_in_batch_get_row_request.rb +17 -0
  41. data/lib/ali_ots/metas/row_in_batch_get_row_response.rb +23 -0
  42. data/lib/ali_ots/metas/row_in_batch_write_row_response.rb +21 -0
  43. data/lib/ali_ots/metas/table_in_batch_get_row_request.rb +21 -0
  44. data/lib/ali_ots/metas/table_in_batch_get_row_response.rb +20 -0
  45. data/lib/ali_ots/metas/table_in_batch_write_row_request.rb +23 -0
  46. data/lib/ali_ots/metas/table_in_batch_write_row_response.rb +23 -0
  47. data/lib/ali_ots/metas/table_meta.rb +18 -0
  48. data/lib/ali_ots/metas/table_primary_key.rb +21 -0
  49. data/lib/ali_ots/metas/update_row_in_batch_write_row_request.rb +21 -0
  50. data/lib/ali_ots/metas/update_row_request.rb +22 -0
  51. data/lib/ali_ots/metas/update_row_response.rb +17 -0
  52. data/lib/ali_ots/metas/update_table_request.rb +18 -0
  53. data/lib/ali_ots/metas/update_table_response.rb +16 -0
  54. data/lib/ali_ots/version.rb +3 -0
  55. metadata +138 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8172fa691d991156c6d158a1213d8a6d7589f8aa
4
+ data.tar.gz: bb245a29a197ae6a62ffc848249c158cc98185f2
5
+ SHA512:
6
+ metadata.gz: f1391e81b061da8aa5dc0bcd618debc5c49e492e4be2d0b99ef6158d4e4ddb067c2cea4658e40e7a212c5bc8f0a8a033470f250414fd99d53f014e89ff2d06c6
7
+ data.tar.gz: 0b4d76743dc888383116c86fbfbfef6a64e6be01f51c7d1742f222a3b4e159f9f96c7a21a17e48b7891e8d7e3174d6616a3f8b9f21357adfb1cb940c5e4d50aa
data/lib/ali_ots.rb ADDED
@@ -0,0 +1,127 @@
1
+ require 'logger'
2
+ require 'protobuf'
3
+ require 'faraday'
4
+ require 'addressable/uri'
5
+
6
+ require 'ali_ots/client'
7
+ require 'ali_ots/connection'
8
+ require 'ali_ots/version'
9
+ require 'ali_ots/metas/enums/column_type'
10
+ require 'ali_ots/metas/enums/direction'
11
+ require 'ali_ots/metas/enums/operation_type'
12
+ require 'ali_ots/metas/enums/row_existence_expectation'
13
+ require 'ali_ots/metas/error'
14
+ require 'ali_ots/metas/condition'
15
+ require 'ali_ots/metas/column_schema'
16
+ require 'ali_ots/metas/column_value'
17
+ require 'ali_ots/metas/column_update'
18
+ require 'ali_ots/metas/column'
19
+ require 'ali_ots/metas/table_meta'
20
+ require 'ali_ots/metas/row_in_batch_get_row_request'
21
+ require 'ali_ots/metas/table_in_batch_get_row_request'
22
+ require 'ali_ots/metas/batch_get_row_request'
23
+ require 'ali_ots/metas/capacity_unit'
24
+ require 'ali_ots/metas/consumed_capacity'
25
+ require 'ali_ots/metas/row'
26
+ require 'ali_ots/metas/row_in_batch_get_row_response'
27
+ require 'ali_ots/metas/table_in_batch_get_row_response'
28
+ require 'ali_ots/metas/batch_get_row_response'
29
+ require 'ali_ots/metas/put_row_in_batch_write_row_request'
30
+ require 'ali_ots/metas/put_row_request'
31
+ require 'ali_ots/metas/put_row_response'
32
+ require 'ali_ots/metas/delete_row_in_batch_write_row_request'
33
+ require 'ali_ots/metas/update_row_in_batch_write_row_request'
34
+ require 'ali_ots/metas/table_in_batch_write_row_request'
35
+ require 'ali_ots/metas/row_in_batch_write_row_response'
36
+ require 'ali_ots/metas/table_in_batch_write_row_response'
37
+ require 'ali_ots/metas/batch_write_row_request'
38
+ require 'ali_ots/metas/batch_write_row_response'
39
+ require 'ali_ots/metas/reserved_throughput'
40
+ require 'ali_ots/metas/reserved_throughput_details'
41
+ require 'ali_ots/metas/create_table_request'
42
+ require 'ali_ots/metas/delete_row_request'
43
+ require 'ali_ots/metas/delete_row_response'
44
+ require 'ali_ots/metas/delete_table_request'
45
+ require 'ali_ots/metas/describe_table_request'
46
+ require 'ali_ots/metas/describe_table_response'
47
+ require 'ali_ots/metas/get_range_request'
48
+ require 'ali_ots/metas/get_range_response'
49
+ require 'ali_ots/metas/get_row_request'
50
+ require 'ali_ots/metas/get_row_response'
51
+ require 'ali_ots/metas/list_table_request'
52
+ require 'ali_ots/metas/list_table_response'
53
+ require 'ali_ots/metas/table_primary_key'
54
+ require 'ali_ots/metas/update_row_request'
55
+ require 'ali_ots/metas/update_row_response'
56
+ require 'ali_ots/metas/update_table_request'
57
+ require 'ali_ots/metas/update_table_response'
58
+
59
+
60
+ module AliOts
61
+
62
+ AliOts::CONFIG = {
63
+ DEBUG_LEVEL: ::Logger::DEBUG,
64
+ END_POSITION: nil,
65
+ ACCESS_ID: nil,
66
+ ACCESS_KEY: nil,
67
+ INSTANCE_NAME: nil,
68
+ APIVERSION: "2014-08-08"
69
+ }
70
+
71
+ extend self
72
+ def configure
73
+ yield(AliOts::CONFIG)
74
+ end
75
+
76
+ end
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
@@ -0,0 +1,183 @@
1
+ module AliOts
2
+ class Client
3
+ attr_accessor :conn
4
+
5
+ def initialize
6
+ self.conn = AliOts::Connection.new
7
+ end
8
+
9
+ # 创建表
10
+ # example:
11
+ # schema_of_primary_keys = [AliOts::Metas::ColumnSchema.new(name: 'id', type: AliOts::Metas::Enums::ColumnType::INTEGER)]
12
+ #
13
+ # client.create_table("myTable", schema_of_primary_keys, 9, 9)
14
+ def create_table(table_name, schema_of_primary_keys, capacity_read, capacity_write)
15
+ reserved_throughput_meta = ::AliOts::Metas::ReservedThroughput.new(capacity_unit: ::AliOts::Metas::CapacityUnit.new(read: capacity_read, write: capacity_write))
16
+ table_meta = AliOts::Metas::TableMeta.new(table_name: table_name, primary_key: schema_of_primary_keys)
17
+ request_meta = AliOts::Metas::CreateTableRequest.new(table_meta: table_meta, reserved_throughput: reserved_throughput_meta)
18
+
19
+ self.conn.request("CreateTable", request_meta)
20
+ end
21
+
22
+ # 删除
23
+ # example:
24
+ # client.delete_table("myTable")
25
+ def delete_table(table_name)
26
+ request_meta = AliOts::Metas::DeleteTableRequest.new(table_name: table_name)
27
+
28
+ self.conn.request("DeleteTable", request_meta)
29
+ end
30
+
31
+ # 列出所有表
32
+ # example:
33
+ # client.list_table()
34
+ def list_table
35
+ request_meta = AliOts::Metas::ListTableRequest.new()
36
+
37
+ status, body, response_status = self.conn.request("ListTable", request_meta)
38
+ body = AliOts::Metas::ListTableResponse.decode(body) if status == "OK"
39
+ return status, body, response_status
40
+ end
41
+
42
+ # 更新表
43
+ # example:
44
+ # schema_of_primary_keys = [AliOts::Metas::ColumnSchema.new(name: 'id', type: AliOts::Metas::Enums::ColumnType::INTEGER)]
45
+ #
46
+ # client.update_table("myTable", 9, 9)
47
+ def update_table(table_name, capacity_read, capacity_write)
48
+ reserved_throughput_meta = ::AliOts::Metas::ReservedThroughput.new(capacity_unit: ::AliOts::Metas::CapacityUnit.new(read: capacity_read, write: capacity_write))
49
+ request_meta = AliOts::Metas::UpdateTableRequest.new(table_name: table_name, reserved_throughput: reserved_throughput_meta)
50
+
51
+ status, body, response_status = self.conn.request("UpdateTable", request_meta)
52
+ body = AliOts::Metas::UpdateTableResponse.decode(body) if status == "OK"
53
+ return status, body, response_status
54
+ end
55
+
56
+ # 查询指定表的结构信息和预留读写吞吐量设置信息
57
+ # example:
58
+ # client.describe_table("myTable")
59
+ def describe_table(table_name)
60
+ request_meta = AliOts::Metas::DescribeTableRequest.new(table_name: table_name)
61
+
62
+ status, body, response_status = self.conn.request("DescribeTable", request_meta)
63
+ body = AliOts::Metas::DescribeTableResponse.decode(body) if status == "OK"
64
+ return status, body, response_status
65
+ end
66
+
67
+ # 插入数据到指定的行,如果该行不存在,则新增一行;若该行存在,则覆盖原有行
68
+ # example:
69
+ # #IGNORE 表示不做行存在性检查。 EXPECT_EXIST 表示期待该行存在。 EXPECT_NOT_EXIST 表示期待该行不存在。
70
+ # condition_type = AliOts::Metas::Enums::RowExistenceExpectation::EXPECT_NOT_EXIST
71
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
72
+ # user_name_column = AliOts::Metas::Column.new(name: "user_name", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::STRING, v_string: "zhao"))
73
+ # age_column = AliOts::Metas::Column.new(name: "age", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 27))
74
+ # attribute_columns = [user_name_column, age_column]
75
+ #
76
+ # client.put_row("myTable", condition_type, primary_keys, attribute_columns)
77
+ def put_row(table_name, condition_type, primary_keys, attribute_columns = [])
78
+ return ["ERROR", "primary_keys is empty", 0] unless primary_keys.present?
79
+ condition = AliOts::Metas::Condition.new(row_existence: condition_type)
80
+ request_meta = AliOts::Metas::PutRowRequest.new(table_name: table_name, condition: condition, primary_key: primary_keys, attribute_columns: attribute_columns)
81
+
82
+ status, body, response_status = self.conn.request("PutRow", request_meta)
83
+ body = AliOts::Metas::PutRowResponse.decode(body) if status == "OK"
84
+ return status, body, response_status
85
+ end
86
+
87
+ # 根据给定的主键读取单行数据。
88
+ # example:
89
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
90
+ # columns = ["user_name", "age"]
91
+ #
92
+ # client.get_row("myTable", primary_keys, columns)
93
+ def get_row(table_name, primary_keys, columns = [])
94
+ request_meta = AliOts::Metas::GetRowRequest.new(table_name: table_name, primary_key: primary_keys, columns_to_get: columns)
95
+
96
+ status, body, response_status = self.conn.request("GetRow", request_meta)
97
+ body = AliOts::Metas::GetRowResponse.decode(body) if status == "OK"
98
+ return status, body, response_status
99
+ end
100
+
101
+ # 更新指定行的数据,如果该行不存在,则新增一行;若该行存在,则根据请求的内容在这一行中新增、修改或者删除指定列的值。
102
+ # example:
103
+ # condition_type = AliOts::Metas::Enums::RowExistenceExpectation::IGNORE
104
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
105
+ # user_name_column = AliOts::Metas::Column.new(name: "user_name", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::STRING, v_string: "zhao"))
106
+ # age_column = AliOts::Metas::Column.new(name: "age", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 27))
107
+ # attribute_columns = [user_name_column, age_column]
108
+ #
109
+ # client.update_row("myTable", condition_type, primary_keys, attribute_columns)
110
+ def update_row(table_name, condition_type, primary_keys, attribute_columns = [])
111
+ condition = AliOts::Metas::Condition.new(row_existence: condition_type)
112
+ request_meta = AliOts::Metas::UpdateRowRequest.new(table_name: table_name, conditon: condition, primary_key: primary_keys, attribute_columns: attribute_columns)
113
+
114
+ status, body, response_status = self.conn.request("UpdateRow", request_meta)
115
+ body = AliOts::Metas::UpdateRowResponse.decode(body) if status == "OK"
116
+ return status, body, response_status
117
+ end
118
+
119
+ # 删除一行数据
120
+ # example:
121
+ # condition_type = AliOts::Metas::Enums::RowExistenceExpectation::IGNORE
122
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
123
+ #
124
+ # client.delete_row("myTable", condition_type, primary_keys)
125
+ def delete_row(table_name, condition_type, primary_keys = [])
126
+ return ["ERROR", "primary_keys is empty", 0] unless primary_keys.present?
127
+ condition = AliOts::Metas::Condition.new(row_existence: condition_type)
128
+ request_meta = AliOts::Metas::DeleteRowRequest.new(table_name: table_name, condition: condition, primary_key: primary_keys)
129
+
130
+ status, body, response_status = self.conn.request("DeleteRow", request_meta)
131
+ body = AliOts::Metas::DeleteRowResponse.decode(body) if status == "OK"
132
+ return status, body, response_status
133
+ end
134
+
135
+ # 读取指定主键范围内的数据
136
+ # example:
137
+ # direction = AliOts::Metas::Enums::Direction::FORWARD #FORWARD 表示此次查询按照主键由小到大的顺序进行, BACKWARD 表示此次查询按照主键由大到小的顺序进行
138
+ # inclusive_start_primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
139
+ # exclusive_end_primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 999))]
140
+ #
141
+ # client.get_range("myTable", direction, inclusive_start_primary_keys, exclusive_end_primary_keys)
142
+ def get_range(table_name, inclusive_start_primary_keys, exclusive_end_primary_keys, direction = AliOts::Metas::Enums::Direction::FORWARD, columns = [], limit = nil)
143
+ request_meta = AliOts::Metas::GetRangeRequest.new(table_name: table_name, direction: direction, inclusive_start_primary_key: inclusive_start_primary_keys, exclusive_end_primary_key: exclusive_end_primary_keys, columns_to_get: columns, limit: limit)
144
+
145
+ status, body, response_status = self.conn.request("GetRange", request_meta)
146
+ body = AliOts::Metas::GetRangeResponse.decode(body) if status == "OK"
147
+ return status, body, response_status
148
+ end
149
+
150
+ # 批量读取一个或多个表中的若干行数据
151
+ # example:
152
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 1))]
153
+ # row1 = AliOts::Metas::RowInBatchGetRowRequest.new(primary_key: primary_keys)
154
+ # rows = [row]
155
+ # table1 = AliOts::Metas::TableInBatchGetRowRequest.new(table_name: "myTable", rows: rows, columns_to_get: ['name', 'age'])
156
+ # tables = [table1]
157
+ # client.batch_get_row(tables)
158
+ def batch_get_row(tables)
159
+ request_meta = AliOts::Metas::BatchGetRowRequest.new(tables: tables)
160
+
161
+ status, body, response_status = self.conn.request("BatchGetRow", request_meta)
162
+ body = AliOts::Metas::BatchGetRowResponse.decode(body) if status == "OK"
163
+ return status, body, response_status
164
+ end
165
+
166
+ # 批量插入,修改或删除一个或多个表中的若干行数据。
167
+ # example:
168
+ # condition = AliOts::Metas::Condition.new(row_existence: AliOts::Metas::Enums::RowExistenceExpectation::EXPECT_NOT_EXIST)
169
+ # primary_keys = [AliOts::Metas::Column.new(name: "id", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 100))]
170
+ # columns = [AliOts::Metas::Column.new(name: "name", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::STRING, v_string: 'liu')), AliOts::Metas::Column.new(name: "age", value: AliOts::Metas::ColumnValue.new(type: AliOts::Metas::Enums::ColumnType::INTEGER, v_int: 93))]
171
+ # row1 = AliOts::Metas::PutRowInBatchWriteRowRequest.new(condition: condition, primary_key: primary_keys, attribute_columns: columns)
172
+ # rows = [row1]
173
+ # tables = [AliOts::Metas::TableInBatchWriteRowRequest.new(table_name: 'myTable', put_rows: rows)]
174
+ # client.batch_write_row(tables)
175
+ def batch_write_row(tables)
176
+ request_meta = AliOts::Metas::BatchWriteRowRequest.new(tables: tables)
177
+
178
+ status, body, response_status = self.conn.request("BatchWriteRow", request_meta)
179
+ body = AliOts::Metas::BatchWriteRowResponse.decode(body) if status == "OK"
180
+ return status, body, response_status
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,118 @@
1
+ module AliOts
2
+ class Connection
3
+ attr_accessor :conn
4
+ attr_accessor :logger
5
+
6
+ def initialize(base_url = AliOts::CONFIG[:END_POSITION])
7
+ self.conn = Faraday.new(:url => base_url) do |faraday|
8
+ faraday.request :url_encoded # form-encode POST params
9
+ faraday.response :logger # log requests to STDOUT
10
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
11
+ end
12
+ self.logger = Logger.new(STDOUT)
13
+ self.logger.level = AliOts::CONFIG[:DEBUG_LEVEL]
14
+ end
15
+
16
+ def request(action, body, headers = {})
17
+ self.logger.info "body:==========================================================="
18
+ self.logger.info body.to_json
19
+
20
+ headers ||= {}
21
+ url = AliOts::END_POSITION + "/" + action
22
+ serialize_body = body.serialize_to_string
23
+ ots_headers = make_headers(url, serialize_body)
24
+ headers.merge!(ots_headers)
25
+
26
+ response = conn.post do |req|
27
+ req.url action
28
+ req.headers.merge!(headers)
29
+ req.body = serialize_body
30
+ end
31
+
32
+ self.logger.info "response:==========================================================="
33
+ self.logger.info response
34
+
35
+ return parse_response(response.status, response.headers, response.body)
36
+ end
37
+
38
+ def make_headers(query, body)
39
+ md5 = Base64.encode64(Digest::MD5.digest(body)).gsub("\n", "")
40
+ date = Time.now.gmtime.strftime('%a, %d %b %Y %H:%M:%S GMT')
41
+
42
+ headers = {
43
+ 'x-ots-date' => date,
44
+ 'x-ots-apiversion' => AliOts::CONFIG[:APIVERSION],
45
+ 'x-ots-accesskeyid' => AliOts::CONFIG[:ACCESS_ID],
46
+ 'x-ots-instancename' => AliOts::CONFIG[:INSTANCE_NAME],
47
+ 'x-ots-contentmd5' => md5,
48
+ }
49
+
50
+ signature = make_request_signature(query, headers)
51
+ headers['x-ots-signature'] = signature
52
+
53
+ return headers
54
+ end
55
+
56
+ def make_request_signature(query, headers)
57
+ require "addressable/uri"
58
+ uri = URI.parse(query)
59
+ path = uri.path
60
+ query_string = uri.query
61
+
62
+ addr_uri = Addressable::URI.new
63
+ addr_uri.query = query_string
64
+ addr_uri.query_values = addr_uri.query_values.sort_by{|q| q[0]} rescue {}
65
+ sorted_query = addr_uri.query
66
+ signature_string = path + "\n" + 'POST' + "\n" + sorted_query + "\n"
67
+
68
+ headers_string = make_headers_string(headers)
69
+ signature_string += headers_string + "\n"
70
+
71
+ signature = call_signature_method(signature_string)
72
+ return signature
73
+ end
74
+
75
+ def make_headers_string(headers)
76
+ headers.sort_by{|k,v| k}.map{|k,v| "#{k}:#{v}"}.join("\n")
77
+ end
78
+
79
+ def call_signature_method(signature_string)
80
+ digest = OpenSSL::Digest.new('sha1')
81
+ hmac = OpenSSL::HMAC.digest(digest, AliOts::CONFIG[:ACCESS_KEY], signature_string)
82
+ Base64.encode64(hmac).gsub("\n", "")
83
+ end
84
+
85
+ def parse_response(status, headers, body)
86
+ check_headers(headers, body)
87
+
88
+ return ["OK", body, status] if status >= 200 && status < 300
89
+ return ["ERR", body, status]
90
+ end
91
+
92
+ def check_headers(headers, body)
93
+ # 1, check headers
94
+ header_names = [
95
+ 'x-ots-contentmd5',
96
+ 'x-ots-requestid',
97
+ 'x-ots-date',
98
+ 'x-ots-contenttype',
99
+ ]
100
+ raise AliOts::Exceptions::ResponseException.new("Missing Parameter: #{(header_names-headers.symbolize_keys.keys).join(", ")}") unless header_names == header_names&&headers.symbolize_keys.keys
101
+
102
+ # 2, check md5
103
+ md5 = Base64.encode64(Digest::MD5.digest(body)).gsub("\n", "")
104
+ raise AliOts::Exceptions::ResponseException.new("MD5 mismatch in response") unless md5 == headers['x-ots-contentmd5']
105
+
106
+ # 3, check date
107
+ raise AliOts::Exceptions::ResponseException.new("Invalid date format in response") unless server_time = (Time.parse(headers['x-ots-date']) rescue nil)
108
+
109
+ # 4, check date range
110
+ raise AliOts::Exceptions::ResponseException.new("The difference between date in response and system time is more than 15 minutes") unless (Time.now - server_time).abs < 15.minute
111
+ end
112
+ end
113
+ end
114
+
115
+
116
+
117
+
118
+
@@ -0,0 +1,17 @@
1
+ module AliOts
2
+ module Metas
3
+ #批量读取一个或多个表中的若干行数据。
4
+ class BatchGetRowRequest < ::Protobuf::Message
5
+ repeated AliOts::Metas::TableInBatchGetRowRequest, :tables, 1
6
+ end
7
+ end
8
+ end
9
+
10
+
11
+
12
+ =begin
13
+ message BatchGetRowRequest {
14
+ repeated TableInBatchGetRowRequest tables = 1;
15
+ }
16
+
17
+ =end