salesforce_bulk

Overview

Salesforce Bulk is a simple Ruby gem for connecting to and using the Salesforce Bulk API.

Installation

Install SalesforceBulk from RubyGems:

gem install salesforce_bulk

Or include it in your project's Gemfile with Bundler:

gem 'salesforce_bulk'

Contribute

To contribute, fork this repo, create a topic branch, make changes, then send a pull request. Pull requests without accompanying tests will not be accepted. To run tests in your fork, just do:

bundle install
rake

Configuration and Initialization

Basic Configuration

require 'salesforce_bulk'

client = SalesforceBulk::Client.new(username: 'MyUsername', password: 'MyPassword', token: 'MySecurityToken')
client.authenticate

Optional keys include host (default: login.salesforce.com), version (default: 24.0) and debugging (default: false).

Configuring from a YAML file

The optional keys mentioned in the Basic Configuration section can also be used here.

---
username: MyUsername
password: MyPassword
token: MySecurityToken

Then in a Ruby script:

require 'salesforce_bulk'

client = SalesforceBulk::Client.new("config/salesforce_bulk.yml")
client.authenticate

Usage Examples

Some requirements if you are moving from an older version of the gem. You must specify every key even if it has no value for each hash in the data array for a batch.

Basic Example

data1 = [{:Name__c => 'Test 1'}, {:Name__c => 'Test 2'}]
data2 = [{:Name__c => 'Test 3'}, {:Name__c => 'Test 4'}]

job = client.add_job(:insert, :MyObject__c)

# easily add multiple batches to a job
batch = client.add_batch(job.id, data1)
batch = client.add_batch(job.id, data2)

job = client.close_job(job.id) # or use the abort_job(id) method

Adding a Job

When adding a job you can specify the following operations for the first argument:

  • :delete
  • :insert
  • :update
  • :upsert
  • :query

When using the :upsert operation you must specify an external ID field name:

job = client.add_job(:upsert, :MyObject__c, :external_id => :MyId__c)

For any operation you should be able to specify a concurrency mode. The default is Parallel. The other choice is Serial.

job = client.add_job(:upsert, :MyObject__c, :concurrency_mode => :Serial, :external_id => :MyId__c)

Retrieving Info for a Job

job = client.job_info(jobId) # returns a Job object

puts "Job #{job.id} is closed." if job.closed? # other: open?, aborted?

Retrieving Info for all Batches

batches = client.batch_info_list(jobId) # returns an Array of Batch objects

batches.each do |batch|
  puts "Batch #{batch.id} failed." if batch.failed? # other: completed?, failed?, in_progress?, queued?
end

Retrieving Info for a single Batch

batch = client.batch_info(jobId, batchId) # returns a Batch object

puts "Batch #{batch.id} is in progress." if batch.in_progress?

Retrieving Batch Results (for Delete, Insert, Update and Upsert)

To verify that a batch completed successfully or failed call the batch_info or batch_info_list methods first, otherwise if you call batch_result without verifying and the batch failed the method will raise an error.

The object returned from the following example only applies to the operations: delete, insert, update and upsert. Query results are handled differently.

results = client.batch_result(jobId, batchId) # returns an Array of BatchResult objects

results.each do |result|
  puts "Item #{result.id} had an error of: #{result.error}" if result.error?
end

Retrieving Query based Batch Results

To verify that a batch completed successfully or failed call the batch_info or batch_info_list methods first, otherwise if you call batch_result without verifying and the batch failed the method will raise an error.

Query results are handled differently as the response will not contain the full result set. You'll have to page through sets if you added multiple batches to a job.

# returns a QueryResultCollection object (an Array)
results = client.batch_result(jobId, batchId)

while results.any?

  # Assuming query was: SELECT Id, Name, CustomField__c FROM Account
  results.each do |result|
    puts result[:Id], result[:Name], result[:CustomField__c]
  end

  puts "Another set is available." if results.next?

  results.next

end

Copyright (c) 2011 Jorge Valdivia.

Copyright (c) 2012 Javier Julio.