1
+ var TableStore = require ( './core' ) ;
2
+ var inherit = TableStore . util . inherit ;
3
+
4
+ var capitalizeFirstLetter = function ( string ) {
5
+ return string . charAt ( 0 ) . toUpperCase ( ) + string . slice ( 1 ) ;
6
+ } ;
7
+
8
+ TableStore . Client = inherit ( {
9
+ constructor : function Client ( config ) {
10
+ this . config = new TableStore . Config ( config ) ;
11
+ } ,
12
+
13
+ setupRequestListeners : function setupRequestListeners ( request ) {
14
+ request . addListener ( 'build' , this . populateHeader ) ;
15
+ request . addListener ( 'build' , this . populateURI ) ;
16
+ request . addListener ( 'build' , this . buildContent ) ;
17
+ request . addListener ( 'build' , this . computeContentMd5 ) ;
18
+ request . addListener ( 'extractError' , this . extractError ) ;
19
+ request . addListener ( 'extractData' , this . extractData ) ;
20
+ } ,
21
+
22
+ populateURI : function populateURI ( req ) {
23
+ var httpRequest = req . httpRequest ;
24
+ httpRequest . endpoint . host = httpRequest . endpoint . hostname ;
25
+ httpRequest . path = '/' + TableStore . util . string . upperFirst ( req . operation ) ;
26
+ } ,
27
+
28
+ populateHeader : function populateHeader ( req ) {
29
+ var httpRequest = req . httpRequest ;
30
+ httpRequest . headers [ 'x-ots-apiversion' ] = '2015-12-31' ;
31
+ httpRequest . headers [ 'x-ots-instancename' ] = req . config . instancename ;
32
+ } ,
33
+
34
+ buildContent : function buildContent ( req ) {
35
+ var request = TableStore . encoder . encode ( req . operation , req . params ) ;
36
+ var buffer = request . encode ( ) ;
37
+ req . httpRequest . body = buffer . toBuffer ( ) ;
38
+ } ,
39
+
40
+ computeContentMd5 : function computeContentMd5 ( req ) {
41
+ var md5 = TableStore . util . crypto . md5 ( req . httpRequest . body , 'base64' ) ;
42
+ req . httpRequest . headers [ 'x-ots-contentmd5' ] = md5 ;
43
+ } ,
44
+
45
+ /**
46
+ * Provides a specialized parser for getBucketLocation -- all other
47
+ * operations are parsed by the super class.
48
+ *
49
+ * @api private
50
+ */
51
+ extractData : function extractData ( resp ) {
52
+ resp . data = TableStore . decoder . decode ( resp . request . operation , resp . httpResponse . body ) ;
53
+
54
+ // extract request id
55
+ resp . data . RequestId = resp . httpResponse . headers [ 'x-ots-request-id' ] ||
56
+ resp . httpResponse . headers [ 'x-ots-requestid' ] ;
57
+ } ,
58
+
59
+ /**
60
+ * Extracts an error object from the http response.
61
+ *
62
+ * @api private
63
+ */
64
+ extractError : function extractError ( resp ) {
65
+ var codes = {
66
+ 304 : 'NotModified' ,
67
+ 403 : 'Forbidden' ,
68
+ 400 : 'BadRequest' ,
69
+ 404 : 'NotFound'
70
+ } ;
71
+
72
+ var code = resp . httpResponse . statusCode ;
73
+ var body = resp . httpResponse . body ;
74
+ if ( codes [ code ] && body . length === 0 ) {
75
+ resp . error = TableStore . util . error ( new Error ( ) , {
76
+ code : codes [ resp . httpResponse . statusCode ] ,
77
+ message : null ,
78
+ headers : resp . httpResponse . headers
79
+ } ) ;
80
+ } else {
81
+ var data ;
82
+ try {
83
+ data = new TableStore . XML . Parser ( { } ) . parse ( body . toString ( ) ) ;
84
+ resp . error = TableStore . util . error ( new Error ( ) , {
85
+ code : data . Code || code ,
86
+ message : data . Message || null ,
87
+ headers : resp . httpResponse . headers
88
+ } ) ;
89
+ }
90
+ catch ( e ) {
91
+ data = body . toString ( ) ;
92
+ resp . error = TableStore . util . error ( new Error ( ) , {
93
+ code : code ,
94
+ message : data ,
95
+ headers : resp . httpResponse . headers
96
+ } ) ;
97
+ }
98
+ }
99
+ } ,
100
+
101
+ /**
102
+ * @api private
103
+ */
104
+ defaultRetryCount : 3 ,
105
+ /**
106
+ * Calls an operation on a service with the given input parameters.
107
+ *
108
+ * @param operation [String] the name of the operation to call on the service.
109
+ * @param params [map] a map of input options for the operation
110
+ * @callback callback function(err, data)
111
+ * If a callback is supplied, it is called when a response is returned
112
+ * from the service.
113
+ * @param err [Error] the error object returned from the request.
114
+ * Set to `null` if the request is successful.
115
+ * @param data [Object] the de-serialized data returned from
116
+ * the request. Set to `null` if a request error occurs.
117
+ */
118
+ makeRequest : function makeRequest ( operation , params , callback ) {
119
+ if ( typeof params === 'function' ) {
120
+ callback = params ;
121
+ params = null ;
122
+ }
123
+
124
+ var request = new TableStore . Request ( this . config , operation , params ) ;
125
+ this . addAllRequestListeners ( request ) ;
126
+
127
+ if ( callback ) request . send ( callback ) ;
128
+ return request ;
129
+ } ,
130
+
131
+ /**
132
+ * @api private
133
+ */
134
+ addAllRequestListeners : function addAllRequestListeners ( request ) {
135
+ var list = [ TableStore . events , TableStore . EventListeners . Core ] ;
136
+ for ( var i = 0 ; i < list . length ; i ++ ) {
137
+ if ( list [ i ] ) request . addListeners ( list [ i ] ) ;
138
+ }
139
+
140
+ if ( this . config . logger ) { // add logging events
141
+ request . addListeners ( TableStore . EventListeners . Logger ) ;
142
+ }
143
+
144
+ this . setupRequestListeners ( request ) ;
145
+ } ,
146
+
147
+ /**
148
+ * How many times a failed request should be retried before giving up.
149
+ * the defaultRetryCount can be overriden by service classes.
150
+ *
151
+ * @api private
152
+ */
153
+ numRetries : function numRetries ( ) {
154
+ if ( this . config . maxRetries !== undefined ) {
155
+ return this . config . maxRetries ;
156
+ } else {
157
+ return this . defaultRetryCount ;
158
+ }
159
+ } ,
160
+
161
+ /**
162
+ * @api private
163
+ */
164
+ retryDelays : function retryDelays ( ) {
165
+ var retryCount = this . numRetries ( ) ;
166
+ var delays = [ ] ;
167
+ for ( var i = 0 ; i < retryCount ; ++ i ) {
168
+ delays [ i ] = Math . pow ( 2 , i ) * 30 ;
169
+ }
170
+ return delays ;
171
+ } ,
172
+
173
+ /**
174
+ * @api private
175
+ */
176
+ retryableError : function retryableError ( error ) {
177
+ if ( this . networkingError ( error ) ) return true ;
178
+ if ( this . throttledError ( error ) ) return true ;
179
+ if ( error . statusCode >= 500 ) return true ;
180
+ return false ;
181
+ } ,
182
+
183
+ /**
184
+ * @api private
185
+ */
186
+ networkingError : function networkingError ( error ) {
187
+ return error . code == 'NetworkingError' ;
188
+ } ,
189
+
190
+ /**
191
+ * @api private
192
+ */
193
+ throttledError : function throttledError ( error ) {
194
+ // this logic varies between services
195
+ return ( error . code == 'ProvisionedThroughputExceededException' ) ;
196
+ } ,
197
+
198
+ /********************************** 表操作 开始 ******************************************/
199
+ /**
200
+ * 根据给定的表结构信息创建相应的表。
201
+ */
202
+ createTable ( params , callback ) {
203
+ return this . makeRequest ( 'createTable' , params , callback ) ;
204
+ } ,
205
+
206
+ /**
207
+ * 获取当前实例下已创建的所有表的表名。
208
+ */
209
+ listTable ( params , callback ) {
210
+ return this . makeRequest ( 'listTable' , params , callback ) ;
211
+ } ,
212
+
213
+ /**
214
+ * 删除本实例下指定的表。
215
+ */
216
+ deleteTable ( params , callback ) {
217
+ return this . makeRequest ( 'deleteTable' , params , callback ) ;
218
+ } ,
219
+
220
+ /**
221
+ * 更新指定表的预留读吞吐量或预留写吞吐量设置。
222
+ */
223
+ updateTable ( params , callback ) {
224
+ return this . makeRequest ( 'updateTable' , params , callback ) ;
225
+ } ,
226
+
227
+ /**
228
+ * 查询指定表的结构信息和预留读/写吞吐量设置信息。
229
+ */
230
+ describeTable ( params , callback ) {
231
+ return this . makeRequest ( 'describeTable' , params , callback ) ;
232
+ } ,
233
+
234
+ /********************************** 表操作 结束 ******************************************/
235
+
236
+
237
+ /********************************** 数据操作 开始 ******************************************/
238
+
239
+ /**
240
+ * 根据给定的主键读取单行数据。
241
+ */
242
+ getRow ( params , callback ) {
243
+ return this . makeRequest ( 'getRow' , params , callback ) ;
244
+ } ,
245
+
246
+ /**
247
+ * 插入数据到指定的行,如果该行不存在,则新增一行;若该行存在,则覆盖原有行。
248
+ */
249
+ putRow ( params , callback ) {
250
+ return this . makeRequest ( 'putRow' , params , callback ) ;
251
+ } ,
252
+
253
+ /**
254
+ * 更新指定行的数据。如果该行不存在,则新增一行;若该行存在,则根据请求的内容在这一行中新增、修改或者删除指定列的值。
255
+ */
256
+ updateRow ( params , callback ) {
257
+ return this . makeRequest ( 'updateRow' , params , callback ) ;
258
+ } ,
259
+
260
+ /**
261
+ * 删除一行数据。
262
+ */
263
+ deleteRow ( params , callback ) {
264
+ return this . makeRequest ( 'deleteRow' , params , callback ) ;
265
+ } ,
266
+
267
+ /**
268
+ * 读取指定主键范围内的数据。
269
+ */
270
+ getRange ( params , callback ) {
271
+ return this . makeRequest ( 'getRange' , params , callback ) ;
272
+ } ,
273
+
274
+ /**
275
+ * 批量读取一个或多个表中的若干行数据。
276
+ */
277
+ batchGetRow ( params , callback ) {
278
+ return this . makeRequest ( 'batchGetRow' , params , callback ) ;
279
+ } ,
280
+
281
+ /**
282
+ * 批量修改行
283
+ */
284
+ batchWriteRow ( params , callback ) {
285
+ return this . makeRequest ( 'batchWriteRow' , params , callback ) ;
286
+ }
287
+
288
+ /********************************** 数据操作 结束 ******************************************/
289
+ } ) ;
0 commit comments