GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: DataMapper Adapters
Homepage: http://www.yehudakatz.com
Clone URL: git://github.com/wycats/dm-adapters.git
Add support for all CRUD operations and #read
wycats (author)
Sun May 11 16:29:44 -0700 2008
commit  a7c22d4ab214e153a23cd21ec6f5ef8ebc61e776
tree    2dfca19cfb5e4fdb3a0621c5a2ad036b80333528
parent  e55d42197728bf459e0beaf89303e2513ed01a2b
...
4
5
6
 
 
 
 
 
 
 
7
8
9
...
41
42
43
44
45
 
 
 
 
 
 
 
 
 
46
47
48
...
109
110
111
112
 
 
 
 
 
 
113
114
115
...
123
124
125
 
 
 
 
 
126
127
128
129
130
131
132
133
134
135
136
137
138
 
139
140
141
142
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
 
 
 
 
 
 
 
 
 
145
146
147
...
4
5
6
7
8
9
10
11
12
13
14
15
16
...
48
49
50
 
 
51
52
53
54
55
56
57
58
59
60
61
62
...
123
124
125
 
126
127
128
129
130
131
132
133
134
...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 
 
 
 
 
 
 
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
0
@@ -4,6 +4,13 @@ gem "dm-core"
0
 require "data_mapper"
0
 require "fileutils"
0
 
0
+module SalesforceAPI
0
+ class CreateError < StandardError; end
0
+ class ReadError < StandardError; end
0
+ class DeleteError < StandardError; end
0
+ class UpdateError < StandardError; end
0
+end
0
+
0
 module DataMapper
0
   module Adapters
0
     
0
@@ -41,8 +48,15 @@ module DataMapper
0
         private
0
         def equality_operator(value)
0
           case value
0
- when Array then " IN #{quote_value(value)}"
0
- else " = #{quote_value(value)}"
0
+ when Array then "IN #{quote_value(value)}"
0
+ else "= #{quote_value(value)}"
0
+ end
0
+ end
0
+
0
+ def inequality_operator(value)
0
+ case value
0
+ when Array then "NOT IN #{quote_value(value)}"
0
+ else "!= #{quote_value(value)}"
0
           end
0
         end
0
         
0
@@ -109,7 +123,12 @@ module DataMapper
0
 
0
         DataMapper.logger.debug query_string
0
         
0
- results = @connection.query(:queryString => query_string).result
0
+ begin
0
+ results = @connection.query(:queryString => query_string).result
0
+ rescue SOAP::FaultError => e
0
+ raise SalesforceAPI::ReadError, e.message
0
+ end
0
+
0
         results = results.size > 0 ? results.records : []
0
         
0
         results.each do |result|
0
@@ -123,25 +142,62 @@ module DataMapper
0
         set
0
       end
0
       
0
+ def read(repository, resource, key)
0
+ read_set(repository, DataMapper::Query.new(repository, resource,
0
+ {resource.key(repository.name)[0].name.eql => key[0]})).first
0
+ end
0
+
0
       def update(repository, resource)
0
         properties = resource.dirty_attributes
0
 
0
         if properties.empty?
0
           return false
0
         else
0
- klass = SalesforceAPI.const_get(resource.class.storage_name(resource.repository.name))
0
- obj = klass.new
0
- obj.id = resource.key.first
0
- properties.each do |prop|
0
- obj.send("#{soap_attr(prop)}=", resource.instance_variable_get(prop.instance_variable_name))
0
- end
0
-
0
+ obj = make_salesforce_obj(resource, properties, resource.key.first)
0
           result = @connection.update([obj])
0
           result[0].success == true
0
         end
0
       end
0
       
0
+ def create(repository, resource)
0
+ properties = resource.dirty_attributes
0
+
0
+ obj = make_sforce_obj(resource, properties, nil)
0
+
0
+ results = @connection.create([obj])
0
+
0
+ if results[0].success
0
+ key = resource.class.key(repository.name).first
0
+ resource.instance_variable_set(key.instance_variable_name, results[0].id)
0
+ else
0
+ raise SalesforceAPI::CreateError, results[0].errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
+ end
0
+
0
+ true
0
+ end
0
+
0
+ def delete(repository, resource)
0
+ key = resource.key.first
0
+
0
+ results = @connection.delete([key])
0
+ if results[0].success
0
+ true
0
+ else
0
+ raise SalesforceAPI::DeleteError, results[0].errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
+ end
0
+ end
0
+
0
       private
0
+ def make_sforce_obj(resource, props, key = nil)
0
+ klass = SalesforceAPI.const_get(resource.class.storage_name(resource.repository.name))
0
+ obj = klass.new
0
+ obj.id = key if key
0
+ props.each do |prop|
0
+ obj.send("#{soap_attr(prop)}=", resource.instance_variable_get(prop.instance_variable_name))
0
+ end
0
+ obj
0
+ end
0
+
0
       def soap_attr(prop)
0
         prop.field.gsub(/^[A-Z]/) {|m| m.downcase}
0
       end

Comments

    No one has commented yet.