salesforce-sql 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/Rakefile +18 -0
- data/lib/salesforce/sql/app.rb +69 -17
- data/lib/salesforce/sql/version.rb +1 -1
- data/lib/salesforce/sql.rb +1 -0
- 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: 1790e91d97f5e6f542dc845c22533f4c7f0d1446
|
4
|
+
data.tar.gz: aec8b677980f1d3f323ca9fc669992ffa589793c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2d4d5acdf9ce0227fd4b5a9ce7385f08c9bb413a7c072cef0719e3be059364fe721b8a7ba828e5c94576d756c08fe7a365e814706772aba8d4d0eef3d2c9f9f
|
7
|
+
data.tar.gz: 0452c8f96f46abd2d21aa1e0058650d25bce606d836bfdd45534d692b80a2ec2677222031f6058cc31082a8cb2b9bb56acbf4c4874f72088b747ae39f24a5a6f
|
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,20 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
|
3
|
+
# extracted from https://github.com/grosser/project_template
|
4
|
+
rule /^version:bump:.*/ do |t|
|
5
|
+
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
6
|
+
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
7
|
+
file = 'lib/salesforce/sql/version.rb'
|
8
|
+
|
9
|
+
version_file = File.read(file)
|
10
|
+
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
11
|
+
version_parts[index] = version_parts[index].to_i + 1
|
12
|
+
version_parts[2] = 0 if index < 2
|
13
|
+
version_parts[1] = 0 if index < 1
|
14
|
+
new_version = version_parts * '.'
|
15
|
+
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
16
|
+
|
17
|
+
sh "bundle && git add #{file} && git commit -m 'bump version to #{new_version}'"
|
18
|
+
end
|
19
|
+
|
20
|
+
|
data/lib/salesforce/sql/app.rb
CHANGED
@@ -25,6 +25,7 @@ module Salesforce
|
|
25
25
|
'ParentId',
|
26
26
|
'OwnerId',
|
27
27
|
'CreatedById',
|
28
|
+
'SetupOwnerId',
|
28
29
|
'CreatedDate',
|
29
30
|
'LastModifiedDate',
|
30
31
|
'LastModifiedById',
|
@@ -85,12 +86,17 @@ module Salesforce
|
|
85
86
|
|
86
87
|
def delete object
|
87
88
|
|
89
|
+
count_before = self.query("Select count(Id) from #{object}").first['expr0']
|
90
|
+
|
88
91
|
query = "Select Id FROM #{object}"
|
89
92
|
bulk_delete_records = normalize_query @restforce_client.query(query)
|
90
93
|
|
91
94
|
print_debug "#{bulk_delete_records.size} #{object} records added to delete on #{self.username}"
|
92
95
|
|
93
96
|
bulk_delete object, bulk_delete_records if !bulk_delete_records.empty?
|
97
|
+
count_after = self.query("Select count(Id) from #{object}").first['expr0']
|
98
|
+
|
99
|
+
count_before - count_after
|
94
100
|
|
95
101
|
end
|
96
102
|
|
@@ -106,6 +112,8 @@ module Salesforce
|
|
106
112
|
|
107
113
|
def copy_object source:, object:, object_ids: [], ignore_fields: [], dependencies: []
|
108
114
|
|
115
|
+
count_before = self.query("Select count(Id) from #{object}").first['expr0']
|
116
|
+
|
109
117
|
# Remove well known problematic fields and merge them with user requirements:
|
110
118
|
ignore_fields = (ignore_fields + @default_ignore_fields).uniq
|
111
119
|
|
@@ -123,7 +131,7 @@ module Salesforce
|
|
123
131
|
dependencies.each do |dep|
|
124
132
|
|
125
133
|
# Export the dependency object ids from the source sandbox
|
126
|
-
dependency_ids = bulk_import_records.map{|row| row[dep[:object_fk_field]]}.sort.uniq
|
134
|
+
dependency_ids = bulk_import_records.map{|row| row[dep[:object_fk_field]]}.compact.sort.uniq
|
127
135
|
|
128
136
|
# Use those Ids to get the object records from source including the dependency_object_pk
|
129
137
|
source_object = source.query "Select Id,#{dep[:dependency_object_pk]} FROM #{dep[:dependency_object]}", dependency_ids
|
@@ -133,12 +141,46 @@ module Salesforce
|
|
133
141
|
target_object = self.query_select_in "Select Id,#{dep[:dependency_object_pk]} FROM #{dep[:dependency_object]} WHERE #{dep[:dependency_object_pk]}", dependency_object_pk_values
|
134
142
|
|
135
143
|
# Now we have source_object and target_object ids and values, we can do the mapping on bulk_import_records
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
144
|
+
bulk_import_records.map! do |record|
|
145
|
+
|
146
|
+
# If the :object_fk_field is nil, then there is no reference to map and we import the record as itis
|
147
|
+
next record if record[dep[:object_fk_field]].nil?
|
148
|
+
|
149
|
+
# Grab the source dependency item for this record using the :object_fk_field id, if the source item doesn't exist, don't insert the record
|
150
|
+
source_item = source_object.select {|row| row['Id'] == record[dep[:object_fk_field]] }
|
151
|
+
next if source_item.empty?
|
152
|
+
|
153
|
+
# Grab the target dependency item for this record using the :dependency_object_pk, if the target item doesnt exist, don't insert the record
|
154
|
+
target_item = target_object.select {|row| row[dep[:dependency_object_pk]] == source_item.first[dep[:dependency_object_pk]]}
|
155
|
+
next if target_item.empty?
|
156
|
+
|
157
|
+
# The actual mapping
|
158
|
+
record[dep[:object_fk_field]] = target_item.first['Id']
|
159
|
+
record
|
140
160
|
end
|
141
161
|
|
162
|
+
bulk_import_records.compact!
|
163
|
+
end
|
164
|
+
|
165
|
+
# If the object is an attachment, then we can't use bulk api:w
|
166
|
+
if object == "Attachment"
|
167
|
+
|
168
|
+
attachment_ignore_fields = ignore_fields.clone
|
169
|
+
attachment_ignore_fields.delete 'isPrivate'
|
170
|
+
attachment_ignore_fields.delete 'ParentId'
|
171
|
+
attachment_ignore_fields << 'BodyLength'
|
172
|
+
|
173
|
+
print_debug "Importing #{bulk_import_records.size} attachments"
|
174
|
+
|
175
|
+
bulk_import_records.each do |att|
|
176
|
+
att['Body'] = Base64::encode64(att.Body)
|
177
|
+
attachment_ignore_fields.each {|f| att.delete f}
|
178
|
+
@restforce_client.create('Attachment',att)
|
179
|
+
end
|
180
|
+
count_after = self.query("Select count(Id) from #{object}").first['expr0']
|
181
|
+
|
182
|
+
return count_after - count_before
|
183
|
+
|
142
184
|
end
|
143
185
|
|
144
186
|
# Remove ignored fields
|
@@ -152,7 +194,17 @@ module Salesforce
|
|
152
194
|
if !bulk_import_records.empty?
|
153
195
|
bulk_insert object, bulk_import_records
|
154
196
|
end
|
197
|
+
count_after = self.query("Select count(Id) from #{object}").first['expr0']
|
155
198
|
|
199
|
+
count_after - count_before
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
def insert object, records
|
204
|
+
count_before = self.query("Select count(Id) from #{object}").first['expr0']
|
205
|
+
bulk_insert object, records
|
206
|
+
count_after = self.query("Select count(Id) from #{object}").first['expr0']
|
207
|
+
count_after - count_before
|
156
208
|
end
|
157
209
|
|
158
210
|
private
|
@@ -194,19 +246,21 @@ module Salesforce
|
|
194
246
|
puts "DEBUG: #{message[0..TermInfo.screen_size.last]}" if @debug
|
195
247
|
end
|
196
248
|
|
249
|
+
|
197
250
|
def restforce_rest_login credentials
|
251
|
+
grace = 0
|
198
252
|
begin
|
199
253
|
client = Restforce.new :host => credentials[:host],
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
client.authenticate!
|
205
|
-
client
|
254
|
+
:username => credentials[:username],
|
255
|
+
:password => credentials[:password],
|
256
|
+
:client_id => credentials[:client_id],
|
257
|
+
:client_secret => credentials[:client_secret]
|
258
|
+
client.authenticate! && client
|
206
259
|
rescue => e
|
207
|
-
|
208
|
-
puts e
|
209
|
-
|
260
|
+
grace += 10
|
261
|
+
puts "INFO: Unable to login REST API, sleeping #{grace}, #{e}"
|
262
|
+
sleep grace
|
263
|
+
retry
|
210
264
|
end
|
211
265
|
end
|
212
266
|
|
@@ -215,9 +269,7 @@ module Salesforce
|
|
215
269
|
sandbox = host.match(/login/) ? nil : true
|
216
270
|
SalesforceBulk::Api.new(user,pass,sandbox)
|
217
271
|
rescue => e
|
218
|
-
puts "Error trying to login bulk API using: #{user} "
|
219
|
-
puts e
|
220
|
-
exit 1
|
272
|
+
puts "ERROR: Error trying to login bulk API using: #{user}, #{e}"
|
221
273
|
end
|
222
274
|
end
|
223
275
|
|
data/lib/salesforce/sql.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: salesforce-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Breinlinger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|