td-client 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ == 2011-09-13 version 0.8.2
3
+
4
+ * Added APIs for scheduled queries
5
+ * Set 'Content-Length: 0' header to POST request if no parameters are
6
+ provided
7
+
8
+
2
9
  == 2011-09-09 version 0.8.1
3
10
 
4
11
  * Added Client#kill method
@@ -105,10 +105,10 @@ class Client
105
105
  Job.new(self, job_id, :hive, q) # TODO url
106
106
  end
107
107
 
108
- # => [Job=]
108
+ # => [Job]
109
109
  def jobs(from=nil, to=nil)
110
- js = @api.list_jobs(from, to)
111
- js.map {|job_id,type,status,query,start_at,end_at|
110
+ result = @api.list_jobs(from, to)
111
+ result.map {|job_id,type,status,query,start_at,end_at|
112
112
  Job.new(self, job_id, type, query, status, nil, nil, start_at, end_at)
113
113
  }
114
114
  end
@@ -146,6 +146,35 @@ class Client
146
146
  @api.kill(job_id)
147
147
  end
148
148
 
149
+ # => first_time:Time
150
+ def create_schedule(name, opts)
151
+ raise ArgumentError, "'cron' option is required" unless opts[:cron] || opts['cron']
152
+ raise ArgumentError, "'query' option is required" unless opts[:query] || opts['query']
153
+ start = @api.create_schedule(name, opts)
154
+ return Time.parse(start)
155
+ end
156
+
157
+ # => true
158
+ def delete_schedule(name)
159
+ @api.delete_schedule(name)
160
+ end
161
+
162
+ # [Schedule]
163
+ def schedules
164
+ result = @api.list_schedules
165
+ result.map {|name,cron,query,database|
166
+ Schedule.new(self, name, cron, query, database)
167
+ }
168
+ end
169
+
170
+ # [ScheduledJob]
171
+ def history(name, from=nil, to=nil)
172
+ result = @api.history(name, from, to)
173
+ result.map {|scheduled_at,job_id,type,status,query,start_at,end_at|
174
+ ScheduledJob.new(self, scheduled_at, job_id, type, query, status, nil, nil, start_at, end_at)
175
+ }
176
+ end
177
+
149
178
  # => time:Flaot
150
179
  def import(db_name, table_name, format, stream, size)
151
180
  @api.import(db_name, table_name, format, stream, size)
@@ -297,6 +297,76 @@ class API
297
297
  end
298
298
 
299
299
 
300
+ ####
301
+ ## Schedule API
302
+ ##
303
+
304
+ # => start:String
305
+ def create_schedule(name, opts)
306
+ params = opts.update({'type'=>'hive'})
307
+ code, body, res = post("/v3/schedule/create/#{e name}", params)
308
+ if code != "200"
309
+ raise_error("Create schedule failed", res)
310
+ end
311
+ # TODO format check
312
+ js = JSON.load(body)
313
+ return js['start']
314
+ end
315
+
316
+ # => cron:String, query:String
317
+ def delete_schedule(name)
318
+ code, body, res = post("/v3/schedule/delete/#{e name}")
319
+ if code != "200"
320
+ raise_error("Delete schedule failed", res)
321
+ end
322
+ # TODO format check
323
+ js = JSON.load(body)
324
+ return js['cron'], js["query"]
325
+ end
326
+
327
+ def list_schedules
328
+ code, body, res = get("/v3/schedule/list")
329
+ if code != "200"
330
+ raise_error("List schedules failed", res)
331
+ end
332
+ # TODO format check
333
+ js = JSON.load(body)
334
+ result = []
335
+ js['schedules'].each {|m|
336
+ name = m['name']
337
+ cron = m['cron']
338
+ query = m['query']
339
+ database = m['database']
340
+ result << [name, cron, query, database]
341
+ }
342
+ return result
343
+ end
344
+
345
+ def history(name, from=0, to=nil)
346
+ params = {}
347
+ params['from'] = from.to_s if from
348
+ params['to'] = to.to_s if to
349
+ code, body, res = get("/v3/schedule/history/#{e name}", params)
350
+ if code != "200"
351
+ raise_error("List history failed", res)
352
+ end
353
+ # TODO format check
354
+ js = JSON.load(body)
355
+ result = []
356
+ js['history'].each {|m|
357
+ job_id = m['job_id']
358
+ type = (m['type'] || '?').to_sym
359
+ status = m['status']
360
+ query = m['query']
361
+ start_at = m['start_at']
362
+ end_at = m['end_at']
363
+ scheduled_at = m['scheduled_at']
364
+ result << [scheduled_at, job_id, type, status, query, start_at, end_at]
365
+ }
366
+ return result
367
+ end
368
+
369
+
300
370
  ####
301
371
  ## Import API
302
372
  ##
@@ -385,8 +455,13 @@ class API
385
455
 
386
456
  path = BASE_URL + url
387
457
 
388
- request = Net::HTTP::Post.new(path, header)
389
- request.set_form_data(params) if params
458
+ if params && !params.empty?
459
+ request = Net::HTTP::Post.new(path, header)
460
+ request.set_form_data(params)
461
+ else
462
+ header['Content-Length'] = 0.to_s
463
+ request = Net::HTTP::Post.new(path, header)
464
+ end
390
465
 
391
466
  response = http.request(request)
392
467
  return [response.code, response.body, response]
@@ -250,5 +250,30 @@ class Job < Model
250
250
  end
251
251
 
252
252
 
253
+ class ScheduledJob < Job
254
+ def initialize(client, scheduled_at, *super_args)
255
+ super(client, *super_args)
256
+ @scheduled_at = scheduled_at
257
+ end
258
+
259
+ def scheduled_at
260
+ @scheduled_at ? Time.parse(@scheduled_at) : nil
261
+ end
262
+ end
263
+
264
+
265
+ class Schedule < Model
266
+ def initialize(client, name, cron, query, database=nil)
267
+ super(client)
268
+ @name = name
269
+ @cron = cron
270
+ @query = query
271
+ @database = database
272
+ end
273
+
274
+ attr_reader :name, :cron, :query, :database
275
+ end
276
+
277
+
253
278
  end
254
279
 
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.8.1'
3
+ VERSION = '0.8.2'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 59
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 1
10
- version: 0.8.1
9
+ - 2
10
+ version: 0.8.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sadayuki Furuhashi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-09 00:00:00 +09:00
18
+ date: 2011-09-13 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency