activesalesforce 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -25,6 +25,15 @@
25
25
 
26
26
  5. proceed using standard Rails development techniques!
27
27
 
28
+ == Advanced Features
29
+
30
+ 1. Session ID based Authentication: Add the following to /app/controllers/application.rb to enable SID auth for all controllers
31
+
32
+ class ApplicationController < ActionController::Base
33
+ before_filter ActiveSalesforce::SessionIDAuthenticationFilter
34
+ end
35
+
36
+ 2. Boxcar'ing of updates, inserts, and deletes. Use <YourModel>.transaction() to demark boxcar boundaries.
28
37
 
29
38
  == Description of contents
30
39
 
data/lib/asf_adapter.rb CHANGED
@@ -27,6 +27,8 @@ require File.dirname(__FILE__) + '/relationship_definition'
27
27
  require File.dirname(__FILE__) + '/boxcar_command'
28
28
  require File.dirname(__FILE__) + '/entity_definition'
29
29
  require File.dirname(__FILE__) + '/asf_active_record'
30
+ require File.dirname(__FILE__) + '/id_resolver'
31
+ require File.dirname(__FILE__) + '/sid_authentication_filter'
30
32
 
31
33
 
32
34
  class ResultArray < Array
@@ -118,7 +120,7 @@ module ActiveRecord
118
120
  MAX_BOXCAR_SIZE = 200
119
121
 
120
122
  attr_accessor :batch_size
121
- attr_reader :entity_def_map, :config
123
+ attr_reader :entity_def_map, :keyprefix_to_entity_def_map, :config
122
124
 
123
125
  def initialize(connection, logger, connection_options, config)
124
126
  super(connection, logger)
@@ -126,6 +128,7 @@ module ActiveRecord
126
128
  @connection_options, @config = connection_options, config
127
129
 
128
130
  @entity_def_map = {}
131
+ @keyprefix_to_entity_def_map = {}
129
132
 
130
133
  @command_boxcar = []
131
134
  @class_to_entity_map = {}
@@ -424,6 +427,24 @@ module ActiveRecord
424
427
  end
425
428
 
426
429
 
430
+ def retrieve_field_values(object_type, fields, ids, name = nil)
431
+ msg = "retrieve(#{object_type}, [#{ids.to_a.join(', ')}])"
432
+ log(msg, name) {
433
+ retrieve_element = []
434
+ retrieve_element << :fieldList << fields.to_a.join(", ")
435
+ retrieve_element << 'type { :xmlns => "urn:sobject.partner.soap.sforce.com" }' << object_type
436
+ ids.to_a.each { |id| retrieve_element << :ids << id }
437
+
438
+ result = get_result(@connection.retrieve(retrieve_element), :retrieve)
439
+
440
+ result = [ result ] unless result.is_a?(Array)
441
+
442
+ # Remove unwanted :type and normalize :Id if required
443
+ result.map { |v| v.delete(:type); v[:Id] = v[:Id][0] if v[:Id].is_a? Array; v }
444
+ }
445
+ end
446
+
447
+
427
448
  def get_fields(columns, names, values, access_check)
428
449
  fields = {}
429
450
  names.each_with_index do | name, n |
@@ -512,8 +533,13 @@ module ActiveRecord
512
533
  end
513
534
  end
514
535
 
515
- entity_def = ActiveSalesforce::EntityDefinition.new(self, entity_name, cached_columns, cached_relationships, custom)
536
+ key_prefix = metadata[:keyPrefix]
537
+
538
+ entity_def = ActiveSalesforce::EntityDefinition.new(self, entity_name,
539
+ cached_columns, cached_relationships, custom, key_prefix)
540
+
516
541
  @entity_def_map[entity_name] = entity_def
542
+ @keyprefix_to_entity_def_map[key_prefix] = entity_def
517
543
 
518
544
  configure_active_record entity_def
519
545
 
@@ -63,5 +63,6 @@ module ActiveSalesforce
63
63
  end
64
64
  end
65
65
 
66
+
66
67
  end
67
68
  end
@@ -41,6 +41,7 @@ module ActiveRecord
41
41
  @type = get_type(field[:type])
42
42
  @limit = field[:length]
43
43
  @label = field[:label]
44
+ @name_field = field[:nameField] == "true"
44
45
 
45
46
  @text = [:string, :text].include? @type
46
47
  @number = [:float, :integer].include? @type
@@ -57,6 +58,10 @@ module ActiveRecord
57
58
  end
58
59
  end
59
60
 
61
+ def is_name?
62
+ @name_field
63
+ end
64
+
60
65
  def get_type(field_type)
61
66
  case field_type
62
67
  when /int/i
@@ -23,14 +23,15 @@ require 'pp'
23
23
 
24
24
  module ActiveSalesforce
25
25
  class EntityDefinition
26
- attr_reader :name, :columns, :column_name_to_column, :api_name_to_column, :relationships
26
+ attr_reader :name, :columns, :column_name_to_column, :api_name_to_column, :relationships, :key_prefix
27
27
 
28
- def initialize(connection, name, columns, relationships, custom)
28
+ def initialize(connection, name, columns, relationships, custom, key_prefix)
29
29
  @connection = connection
30
30
  @name = name
31
31
  @columns = columns
32
32
  @relationships = relationships
33
33
  @custom = custom
34
+ @key_prefix = key_prefix
34
35
 
35
36
  @column_name_to_column = {}
36
37
  @columns.each { |column| @column_name_to_column[column.name] = column }
@@ -0,0 +1,92 @@
1
+ =begin
2
+ ActiveSalesforce
3
+ Copyright 2006 Doug Chasman
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ =end
17
+
18
+ require 'rubygems'
19
+ require_gem 'rails', ">= 1.0.0"
20
+
21
+ require 'pp'
22
+
23
+
24
+ module ActiveSalesforce
25
+ class IdResolver
26
+
27
+ def initialize(connection)
28
+ @connection = connection
29
+ @object_type_to_ids = {}
30
+ end
31
+
32
+
33
+ def add(record, columns = nil)
34
+ if columns
35
+ columns = columns.to_a.map { |column_name| record.column_for_attribute(column_name) }
36
+ else
37
+ columns = record.class.columns
38
+ end
39
+
40
+ columns.each do |column|
41
+ reference_to = column.reference_to
42
+ next unless reference_to
43
+
44
+ value = record.send(column.name)
45
+ if value
46
+ ids = @object_type_to_ids[reference_to]
47
+
48
+ unless ids
49
+ ids = Set.new
50
+ @object_type_to_ids[reference_to] = ids
51
+ end
52
+
53
+ ids << value
54
+ end
55
+ end
56
+ end
57
+
58
+
59
+ def resolve
60
+ result = {}
61
+
62
+ @object_type_to_ids.each do |object_type, ids|
63
+ entity_def = @connection.get_entity_def(object_type)
64
+
65
+ fields = (entity_def.columns.reject { |column| not column.is_name? }).map { |column| column.api_name }
66
+
67
+ # DCHASMAN TODO Boxcar into requests of no more than 200 retrieves per request
68
+ puts "Resolving references to #{object_type}"
69
+ field_values = @connection.retrieve_field_values(object_type, fields, ids.to_a, "#{self}.resolve()")
70
+
71
+ field_values.each do |field_value|
72
+ id = field_value.delete(:Id)
73
+ result[id] = field_value
74
+ end
75
+ end
76
+
77
+ result
78
+ end
79
+
80
+
81
+ def serialize
82
+ YAML.dump @object_type_to_ids
83
+ end
84
+
85
+
86
+ def deserialize(source)
87
+ @object_type_to_ids = YAML.load(source)
88
+ end
89
+
90
+ end
91
+
92
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: activesalesforce
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.8
7
- date: 2006-02-28 00:00:00 -05:00
6
+ version: 0.3.9
7
+ date: 2006-03-02 00:00:00 -05:00
8
8
  summary: ActiveSalesforce (ASF) is a Rails connection adapter that provides direct access to Salesforce.com hosted data and metadata via the ActiveRecord model layer. Objects, fields, and relationships are all auto surfaced as active record attributes and rels.
9
9
  require_paths:
10
10
  - lib
@@ -37,6 +37,7 @@ files:
37
37
  - lib/asf_adapter.rb
38
38
  - lib/sid_authentication_filter.rb
39
39
  - lib/relationship_definition.rb
40
+ - lib/id_resolver.rb
40
41
  - lib/asf_active_record.rb
41
42
  - test/unit
42
43
  - test/unit/recorded_test_case.rb
@@ -98,5 +99,5 @@ dependencies:
98
99
  requirements:
99
100
  - - ">="
100
101
  - !ruby/object:Gem::Version
101
- version: 0.0.8
102
+ version: 0.0.9
102
103
  version: