salesforce-sql 0.0.1 → 0.0.3

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 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