seiun 0.0.2 → 0.1.0
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.
- checksums.yaml +4 -4
- data/lib/seiun/callback/wrapper.rb +16 -8
- data/lib/seiun/client.rb +11 -18
- data/lib/seiun/connection.rb +5 -1
- data/lib/seiun/job.rb +90 -23
- data/lib/seiun/version.rb +1 -1
- data/lib/seiun/xml_parsers/result_xml.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd4d5b8aaf37821bb1efec1af1fb64efe71ef7d0
|
4
|
+
data.tar.gz: 8aef3925e79e43429f865114a63a09dccbd40165
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fd8129d8785ea5914db0649e597cc04bbcaa56555ba9b472a62644acb48338d6f2b10d9c5340bcfbb7359987524cf4c6033cc668c133e4962fd6bec4f26e48f
|
7
|
+
data.tar.gz: 96917774a6a228ad1c1f1acf880582a50d2e0c8b6473f3d0c2991a889ae72199c58a1473ea0179e6ce13bffd198b2838c23025ee540b64cbb2d5182e7b7d93c3
|
@@ -5,6 +5,10 @@ module Seiun
|
|
5
5
|
@class = callback_class
|
6
6
|
end
|
7
7
|
|
8
|
+
def job=(job)
|
9
|
+
@job = job
|
10
|
+
end
|
11
|
+
|
8
12
|
def after_build_xml(xml)
|
9
13
|
return unless callback_defined?(:after_build_xml)
|
10
14
|
@class.__send__(callbacks[:after_build_xml], xml)
|
@@ -27,46 +31,50 @@ module Seiun
|
|
27
31
|
|
28
32
|
def mock_response_create_job
|
29
33
|
return unless callback_defined?(:mock_response_create_job)
|
30
|
-
@class.__send__(callbacks[:mock_response_create_job])
|
34
|
+
@class.__send__(callbacks[:mock_response_create_job], operation: operation)
|
31
35
|
end
|
32
36
|
|
33
37
|
def mock_response_close_job
|
34
38
|
return unless callback_defined?(:mock_response_close_job)
|
35
|
-
@class.__send__(callbacks[:mock_response_close_job])
|
39
|
+
@class.__send__(callbacks[:mock_response_close_job], operation: operation)
|
36
40
|
end
|
37
41
|
|
38
42
|
def mock_response_add_query
|
39
43
|
return unless callback_defined?(:mock_response_add_query)
|
40
|
-
@class.__send__(callbacks[:mock_response_add_query])
|
44
|
+
@class.__send__(callbacks[:mock_response_add_query], operation: operation)
|
41
45
|
end
|
42
46
|
|
43
47
|
def mock_response_add_batch
|
44
48
|
return unless callback_defined?(:mock_response_add_batch)
|
45
|
-
@class.__send__(callbacks[:mock_response_add_batch])
|
49
|
+
@class.__send__(callbacks[:mock_response_add_batch], operation: operation)
|
46
50
|
end
|
47
51
|
|
48
52
|
def mock_response_get_job_details
|
49
53
|
return unless callback_defined?(:mock_response_get_job_details)
|
50
|
-
@class.__send__(callbacks[:mock_response_get_job_details])
|
54
|
+
@class.__send__(callbacks[:mock_response_get_job_details], operation: operation)
|
51
55
|
end
|
52
56
|
|
53
57
|
def mock_response_get_batch_details
|
54
58
|
return unless callback_defined?(:mock_response_get_batch_details)
|
55
|
-
@class.__send__(callbacks[:mock_response_get_batch_details])
|
59
|
+
@class.__send__(callbacks[:mock_response_get_batch_details], operation: operation)
|
56
60
|
end
|
57
61
|
|
58
62
|
def mock_response_get_result
|
59
63
|
return unless callback_defined?(:mock_response_get_result)
|
60
|
-
@class.__send__(callbacks[:mock_response_get_result])
|
64
|
+
@class.__send__(callbacks[:mock_response_get_result], operation: operation)
|
61
65
|
end
|
62
66
|
|
63
67
|
def mock_response_get_query_result
|
64
68
|
return unless callback_defined?(:mock_response_get_query_result)
|
65
|
-
@class.__send__(callbacks[:mock_response_get_query_result])
|
69
|
+
@class.__send__(callbacks[:mock_response_get_query_result], operation: operation)
|
66
70
|
end
|
67
71
|
|
68
72
|
private
|
69
73
|
|
74
|
+
def operation
|
75
|
+
@job.operation(get: false)
|
76
|
+
end
|
77
|
+
|
70
78
|
def callback_defined?(name)
|
71
79
|
!!callbacks[name]
|
72
80
|
end
|
data/lib/seiun/client.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
module Seiun
|
2
2
|
class Client
|
3
|
-
SEC_TO_WAIT_ASYNC = 60*10
|
4
|
-
private_constant :SEC_TO_WAIT_ASYNC
|
5
|
-
|
6
3
|
def initialize(databasedotcom: nil, batch_size: 10_000)
|
7
4
|
@batch_size = batch_size
|
8
5
|
@connection = Seiun::Connection.new(databasedotcom)
|
@@ -57,30 +54,26 @@ module Seiun
|
|
57
54
|
operate(:query, table_name, soql: soql, callback: callback_class)
|
58
55
|
end
|
59
56
|
|
57
|
+
def find_job(id, callback_class: nil)
|
58
|
+
callback_class = wrap_callback(callback_class)
|
59
|
+
Seiun::Job.new(@connection, id: id, callback: callback_class)
|
60
|
+
end
|
61
|
+
|
60
62
|
private
|
61
63
|
|
62
64
|
def operate(operation, object, records: [], soql: "", ext_field_name: nil, callback: nil, async: true)
|
63
|
-
callback =
|
65
|
+
callback = wrap_callback(callback)
|
64
66
|
records = records.map{|r| Seiun::Callback::RecordWrapper.new(r) }
|
65
|
-
job = Seiun::Job.new(@connection, operation, object, ext_field_name: ext_field_name, callback: callback)
|
67
|
+
job = Seiun::Job.new(@connection, operation: operation, object_name: object, ext_field_name: ext_field_name, callback: callback)
|
66
68
|
job.post_creation
|
67
69
|
operation == :query ? job.add_query(soql) : records.each_slice(@batch_size).each{|chunk| job.add_batch(chunk) }
|
68
70
|
job.post_closing
|
69
|
-
|
70
|
-
operation == :query ? job.
|
71
|
-
end
|
72
|
-
|
73
|
-
def wait_asyc(job)
|
74
|
-
Timeout.timeout(sec_to_wait_async) do
|
75
|
-
until job.all_batch_finished?
|
76
|
-
job.get_batch_details
|
77
|
-
sleep 1
|
78
|
-
end
|
79
|
-
end
|
71
|
+
job.wait_finish if async == false
|
72
|
+
operation == :query ? job.get_results : job
|
80
73
|
end
|
81
74
|
|
82
|
-
def
|
83
|
-
|
75
|
+
def wrap_callback(callback)
|
76
|
+
Seiun::Callback::Wrapper.new(callback) if callback
|
84
77
|
end
|
85
78
|
end
|
86
79
|
end
|
data/lib/seiun/connection.rb
CHANGED
@@ -20,6 +20,10 @@ module Seiun
|
|
20
20
|
connect(:add_batch, data: data, job_id: job_id, callback: callback)
|
21
21
|
end
|
22
22
|
|
23
|
+
def get_job_details(job_id, callback: nil)
|
24
|
+
connect(:get_job_details, job_id: job_id, callback: callback)
|
25
|
+
end
|
26
|
+
|
23
27
|
def get_batch_details(job_id, callback: nil)
|
24
28
|
connect(:get_batch_details, job_id: job_id, callback: callback)
|
25
29
|
end
|
@@ -67,7 +71,7 @@ module Seiun
|
|
67
71
|
case type
|
68
72
|
when :create_job
|
69
73
|
"/services/async/#{api_version}/job"
|
70
|
-
when :close_job
|
74
|
+
when :close_job, :get_job_details
|
71
75
|
"/services/async/#{api_version}/job/#{job_id}"
|
72
76
|
when :add_query, :add_batch, :get_batch_details
|
73
77
|
"/services/async/#{api_version}/job/#{job_id}/batch"
|
data/lib/seiun/job.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
module Seiun
|
2
2
|
class Job
|
3
|
-
|
3
|
+
SEC_TO_WAIT = 60*10 # 10 minutes
|
4
|
+
private_constant :SEC_TO_WAIT
|
4
5
|
|
5
|
-
|
6
|
+
attr_reader :id
|
7
|
+
|
8
|
+
def initialize(connection, operation: nil, object_name: nil, id: nil, ext_field_name: nil, callback: nil)
|
6
9
|
@connection = connection
|
7
|
-
@operation = operation
|
8
|
-
@object_name = object_name
|
9
|
-
@id = id
|
10
|
-
@ext_field_name = ext_field_name
|
11
|
-
|
10
|
+
@operation = operation.to_sym if operation
|
11
|
+
@object_name = object_name.to_s if object_name
|
12
|
+
@id = id
|
13
|
+
@ext_field_name = ext_field_name
|
14
|
+
if callback
|
15
|
+
callback.job = self
|
16
|
+
@callback = callback
|
17
|
+
end
|
12
18
|
@batches = []
|
13
19
|
end
|
14
20
|
|
@@ -32,32 +38,72 @@ module Seiun
|
|
32
38
|
parse_batch_xml(response_body)
|
33
39
|
end
|
34
40
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def get_query_result
|
41
|
-
result = []
|
42
|
-
@batches.each do |batch|
|
41
|
+
def each_result
|
42
|
+
wait_finish
|
43
|
+
batches.each do |batch|
|
43
44
|
result_response_body = @connection.get_result(@id, batch.id, callback: @callback)
|
44
45
|
Seiun::XMLParsers::ResultXML.each(result_response_body) do |result_response|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
if query?
|
47
|
+
response_body = @connection.get_query_result(@id, batch.id, result_response.result_id, callback: @callback)
|
48
|
+
Seiun::XMLParsers::RecordXML.each(response_body) do |response|
|
49
|
+
yield(response.to_hash)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
yield(result_response.to_hash)
|
48
53
|
end
|
49
54
|
end
|
50
55
|
end
|
51
|
-
result
|
52
56
|
end
|
53
57
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
58
|
+
def get_results
|
59
|
+
results = []
|
60
|
+
each_result{|res| results << res }
|
61
|
+
results
|
62
|
+
end
|
63
|
+
|
64
|
+
def operation(get: true)
|
65
|
+
return @operation if @operation || get == false
|
66
|
+
get_job_details
|
67
|
+
@operation
|
68
|
+
end
|
69
|
+
|
70
|
+
def sf_state(get: true)
|
71
|
+
return @sf_state if @sf_state || get == false
|
72
|
+
get_job_details
|
73
|
+
@sf_state
|
74
|
+
end
|
75
|
+
|
76
|
+
def batches(get: true)
|
77
|
+
return @batches if !@batches.empty? || get == false
|
78
|
+
get_batch_details
|
79
|
+
@batches
|
80
|
+
end
|
81
|
+
|
82
|
+
def wait_finish
|
83
|
+
Timeout.timeout(sec_to_wait_finish) do
|
84
|
+
until closed?
|
85
|
+
get_job_details
|
86
|
+
sleep 1
|
87
|
+
end
|
88
|
+
until all_batch_finished?
|
89
|
+
get_batch_details
|
90
|
+
sleep 1
|
91
|
+
end
|
92
|
+
end
|
57
93
|
end
|
58
94
|
|
59
95
|
private
|
60
96
|
|
97
|
+
def get_job_details
|
98
|
+
response_body = @connection.get_job_details(@id, callback: @callback)
|
99
|
+
parse_job_xml(response_body)
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_batch_details
|
103
|
+
response_body = @connection.get_batch_details(@id, callback: @callback)
|
104
|
+
parse_batch_xml(response_body)
|
105
|
+
end
|
106
|
+
|
61
107
|
def create_job_xml
|
62
108
|
Seiun::XMLGenerators::JobXML.create_job(@operation, @object_name, ext_field_name: @ext_field_name, callback: @callback)
|
63
109
|
end
|
@@ -72,7 +118,9 @@ module Seiun
|
|
72
118
|
|
73
119
|
def parse_job_xml(response_body)
|
74
120
|
Seiun::XMLParsers::JobXML.each(response_body) do |response|
|
75
|
-
@id
|
121
|
+
@id ||= response.id
|
122
|
+
@operation = ( @operation || response.operation ).to_sym
|
123
|
+
@object_name ||= response.object
|
76
124
|
@sf_created_at = response.created_date || @sf_created_at
|
77
125
|
@sf_updated_at = response.system_modstamp || @sf_updated_at
|
78
126
|
@sf_state = response.state || @sf_state
|
@@ -94,6 +142,25 @@ module Seiun
|
|
94
142
|
end
|
95
143
|
end
|
96
144
|
|
145
|
+
def sec_to_wait_finish
|
146
|
+
SEC_TO_WAIT
|
147
|
+
end
|
148
|
+
|
149
|
+
def closed?
|
150
|
+
sf_state == "Closed"
|
151
|
+
end
|
152
|
+
|
153
|
+
[ :insert, :update, :upsert, :delete, :query ].each do |symbol|
|
154
|
+
define_method "#{symbol}?" do
|
155
|
+
@operation == symbol
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def all_batch_finished?
|
160
|
+
return true if batches.empty?
|
161
|
+
batches.all?{|batch| !["Queued", "InProgress"].include?(batch.sf_state) }
|
162
|
+
end
|
163
|
+
|
97
164
|
class Batch
|
98
165
|
attr_reader :id
|
99
166
|
attr_accessor :job_id, :sf_state, :sf_state_message, :sf_created_at, :sf_updated_at, :number_records_processed
|
data/lib/seiun/version.rb
CHANGED
@@ -2,8 +2,8 @@ module Seiun
|
|
2
2
|
module XMLParsers
|
3
3
|
class ResultXML < Base
|
4
4
|
class << self
|
5
|
-
def each(xml_str, &block)
|
6
|
-
parse(xml_str,
|
5
|
+
def each(xml_str, find_tag: "result", &block)
|
6
|
+
parse(xml_str, find_tag, block)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -12,7 +12,7 @@ module Seiun
|
|
12
12
|
result
|
13
13
|
end
|
14
14
|
|
15
|
-
[ :id, :success ].each do |name|
|
15
|
+
[ :id, :success, :created ].each do |name|
|
16
16
|
define_method name do
|
17
17
|
return unless result.is_a?(Hash)
|
18
18
|
result[Seiun::Utils.camelize(name)]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seiun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naoki Watanabe
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: databasedotcom
|