0
+require "#{File.dirname(__FILE__)}/types"
0
+require "#{File.dirname(__FILE__)}/typecast"
0
+# DataMapper.setup(:default, "imap://wycats%40gmail.com:pass@imap.gmail.com/INBOX")
0
+ class ImapAdapter < AbstractAdapter
0
+ @imap = Net::IMAP.new(@uri.host, 993, true)
0
+ @imap.send(:send_command, "authenticate", "login")
0
+ @imap.send(:send_command, "login", URI.unescape(@uri.user), @uri.password)
0
+ @imap.select(@uri.path.gsub(%r{^/}, ""))
0
+ def read(repository, resource, key)
0
+ properties = resource.properties(name).defaults
0
+ properties_with_indexes = Hash[*properties.zip((0...properties.size).to_a).flatten]
0
+ set = Collection.new(repository, resource, properties_with_indexes)
0
+ imap_results = @imap.uid_fetch(key, imap_props(properties))
0
+ materialize_imap_results(set, imap_results, properties_with_indexes)
0
+ def read_set(repository, query, one = false)
0
+ properties = query.fields
0
+ properties_with_indexes = Hash[*properties.zip((0...properties.size).to_a).flatten]
0
+ set = Collection.new(repository, query.model, properties_with_indexes)
0
+ query_array = query_to_array(query)
0
+ query_array.unshift "ALL"
0
+ imap_results = @imap.fetch(1, imap_props(properties))
0
+ imap_seqs = @imap.search(query_array)
0
+ puts "@imap.fetch(#{imap_seqs.inspect}, #{imap_props(properties).inspect})"
0
+ imap_results = @imap.fetch(imap_seqs, imap_props(properties))
0
+ rescue Net::IMAP::NoResponseError
0
+ materialize_imap_results(set, imap_results, properties_with_indexes, query.reload?)
0
+ def read_one(repository, query)
0
+ read_set(repository, query, true).first
0
+ def query_to_array(query)
0
+ query.conditions.each do |op, prop, val|
0
+ result += (prop.type.query_details[op] + [typecast_dump(val)])
0
+ def materialize_imap_results(set, results, properties_with_indexes, reload = false)
0
+ results.each do |result|
0
+ props = properties_with_indexes.inject([]) do |accum, prop_idx|
0
+ prop_result = result.attr[prop.field.upcase]
0
+ prop_result = prop_result.send(prop.type.envelope_name) if prop.type.envelope?
0
+ accum[idx] = typecast_load(prop_result, prop)
0
+ set.load props, reload
0
+ def imap_props(properties)
0
+ properties.map {|prop| prop.field.upcase}.uniq
0
+ImapTypes = DataMapper::Adapters::Imap
0
+ include DataMapper::Resource
0
+ property :id, ImapTypes::Uid, :key => true
0
+ property :subject, ImapTypes::Subject
0
+ property :sender, ImapTypes::Sender
0
+ property :date, ImapTypes::InternalDate
0
+ property :body, ImapTypes::Body, :lazy => true
0
+ self.class.properties(:default).inject({}) {|s,x| s.merge(x.name => self.instance_variable_get("@#{x.name}"))}.inspect
0
\ No newline at end of file
Comments
No one has commented yet.