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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bdbae01f13b8d65322ceee413d9fe5fda6414ae0
4
- data.tar.gz: 20dea60817eeeea2686de725bb2ce985304c2615
3
+ metadata.gz: 1790e91d97f5e6f542dc845c22533f4c7f0d1446
4
+ data.tar.gz: aec8b677980f1d3f323ca9fc669992ffa589793c
5
5
  SHA512:
6
- metadata.gz: 619f77b5a3941790c970aa083441c425f4dc5e66f858e9eaa13b07c134a37c3385fe2de577946dc48f6fd4b888734dfcb18a46b831b9cae57848827876c28a6a
7
- data.tar.gz: 19848c066cf11ca33edc1099997a4c059aa27b78271ae61605158286ce1801f18ace3e074c424aed4c2f6e1dd63519d2036b5a8d80f00db658ca7c2e7d0c31ed
6
+ metadata.gz: d2d4d5acdf9ce0227fd4b5a9ce7385f08c9bb413a7c072cef0719e3be059364fe721b8a7ba828e5c94576d756c08fe7a365e814706772aba8d4d0eef3d2c9f9f
7
+ data.tar.gz: 0452c8f96f46abd2d21aa1e0058650d25bce606d836bfdd45534d692b80a2ec2677222031f6058cc31082a8cb2b9bb56acbf4c4874f72088b747ae39f24a5a6f
data/.gitignore CHANGED
@@ -20,3 +20,8 @@ tmp
20
20
  *.o
21
21
  *.a
22
22
  mkmf.log
23
+ *.swp
24
+ test_data
25
+ credentials.yaml
26
+ envvars
27
+ cucumber-config.yaml
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
+
@@ -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
- source_object.each do |row|
137
- source_id = row['Id']
138
- target_id = target_object.select{|r| r[dep[:dependency_object_pk]] == row[dep[:dependency_object_pk]]}.first['Id']
139
- bulk_import_records.each {|r| r[dep[:object_fk_field]] = target_id if r[dep[:object_fk_field]] == source_id}
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
- :username => credentials[:username],
201
- :password => credentials[:password],
202
- :client_id => credentials[:client_id],
203
- :client_secret => credentials[:client_secret]
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
- puts "Error trying to login rest API using: #{credentials[:username]} "
208
- puts e
209
- exit 1
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
 
@@ -1,5 +1,5 @@
1
1
  module Salesforce
2
2
  module Sql
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -3,6 +3,7 @@ require 'salesforce/sql/app'
3
3
  require 'salesforce_bulk'
4
4
  require 'restforce'
5
5
  require 'terminfo'
6
+ require 'base64'
6
7
  require 'pry'
7
8
 
8
9
  module Salesforce
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.1
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-18 00:00:00.000000000 Z
11
+ date: 2015-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler