0
@@ -131,7 +131,7 @@ module DataMapper
0
results.each do |result|
0
props = properties_with_indexes.inject([]) do |accum, (prop, idx)|
0
- accum[idx] = result.send(soap_attr(prop
))
0
+ accum[idx] = result.send(soap_attr(prop
, repository))
0
@@ -141,62 +141,99 @@ module DataMapper
0
- read_many(query).first
0
+ repository = query.repository
0
+ properties = query.fields
0
+ properties_with_indexes = Hash[*properties.zip((0...properties.size).to_a).flatten]
0
+ conditions = query.conditions.map {|c| SQL.from_condition(c, repository)}.compact.join(") AND (")
0
- def update(repository, resource)
0
- properties = resource.dirty_attributes
0
+ query_string = "SELECT #{query.fields.map {|f| f.field}.join(", ")} from #{query.model.storage_name(repository.name)}"
0
+ query_string << " WHERE (#{conditions})" unless conditions.empty?
0
+ query_string << " ORDER BY #{SQL.order(query.order[0])}" unless query.order.empty?
0
+ query_string << " LIMIT #{query.limit}" if query.limit
0
- obj = make_sforce_obj(resource, properties, resource.key.first)
0
- result = @connection.update([obj])
0
- result[0].success == true
0
+ DataMapper.logger.debug query_string
0
- def create(repository, resource)
0
- properties = resource.dirty_attributes
0
+ results = @connection.query(:queryString => query_string).result
0
+ rescue SOAP::FaultError => e
0
+ raise SalesforceAPI::ReadError, e.message
0
- obj = make_sforce_obj(resource, properties, nil)
0
+ results = results.size > 0 ? results.records : []
0
+ result = results.first
0
+ return nil unless result
0
- results = @connection.create([obj])
0
+ props = properties_with_indexes.inject([]) do |accum, (prop, idx)|
0
+ accum[idx] = result.send(soap_attr(prop, repository))
0
+ return query.model.load(props, query)
0
- key = resource.class.key(repository.name).first
0
- resource.instance_variable_set(key.instance_variable_name, results[0].id)
0
+ def update(attributes, query)
0
+ arr = if key_condition = query.conditions.find {|op,prop,val| prop.key?}
0
+ [ make_sforce_obj(query, attributes, key_condition.last) ]
0
- raise SalesforceAPI::CreateError, results[0].errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
+ read_many(query).map do |obj|
0
+ obj = make_salesforce_obj(query, attributes, x.key)
0
+ results = @connection.update(arr)
0
+ results.select {|r| r.success == true}.size
0
+ arr = resources.map do |resource|
0
+ obj = make_sforce_obj(resource, resource.dirty_attributes, nil)
0
+ @connection.create(arr).each_with_index do |result, i|
0
+ resource = resources[i]
0
+ key = resource.class.key(repository.name).first
0
+ resource.instance_variable_set(key.instance_variable_name, result.id)
0
+ raise SalesforceAPI::CreateError,
0
+ results.errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
- def delete(repository, resource)
0
- key = resource.key.first
0
+ keys = if key_condition = query.conditions.find {|op,prop,val| prop.key?}
0
+ query.read_many.map {|r| r.key}
0
+ results = @connection.delete(keys)
0
- results = @connection.delete([key])
0
+ if results.all? {|r| r.success}
0
- raise SalesforceAPI::DeleteError, results[0].errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
+ raise SalesforceAPI::DeleteError,
0
+ results.find {|r| r.success == false}.errors.map {|e| "#{e.statusCode}: #{e.message}"}.join(", ")
0
- def make_sforce_obj(resource, props, key = nil)
0
- klass = SalesforceAPI.const_get(resource.class.storage_name(resource.repository.name))
0
+ def make_sforce_obj(query, attrs, key = nil)
0
+ klass = SalesforceAPI.const_get(query.model.storage_name(query.repository.name))
0
- obj.send("#{soap_attr(prop)}=", resource.instance_variable_get(prop.instance_variable_name))
0
+ obj.id = query.conditions.find {|op,prop,val| prop.key?}.last if key
0
+ attrs.each do |prop,val|
0
+ obj.send("#{soap_attr(prop, query.repository)}=", val)
0
- prop.field.gsub(/^[A-Z]/) {|m| m.downcase}
0
+ def soap_attr(prop, repository)
0
+ prop.field(repository.name).gsub(/^[A-Z]/) {|m| m.downcase}
Comments
No one has commented yet.