http://www.dmo.ca/blog/20080307124544/
Ruby on Rails Blog
Ruby on rails blog
Wednesday, November 23, 2011
copy command in postgres rails
Use copy SQL command instead of large insert query in postgres and also improved performance.
query=<<-SQL
SELECT brands1.id, #{self.id}
FROM brands brands1
LEFT OUTER JOIN brands brands2
ON brands1.parent_id = brands2.id
WHERE (#{name_conditions})
AND #{specialty_conditions}
SQL
search_contacts_bulk_insert_via_copy(query,"brands_searches (brand_id, search_id)")
private
def search_contacts_bulk_insert_via_copy(query,iquery)
search_contacts_path="#{RAILS_ROOT}/tmp/bulk_insert/search_contacts_#{self.id}.copy"
File.delete(search_contacts_path) if FileTest.exists?(search_contacts_path)
search_contacts_path1 = File.new(search_contacts_path, "w")
File.chmod(0777, search_contacts_path)
query ="COPY (#{query}) TO '#{search_contacts_path}'"
ActiveRecord::Base.connection.execute(query)
logger.error(query)
clinsert_query="COPY #{iquery} FROM '#{search_contacts_path}';"
connection.execute(clinsert_query)
logger.error(clinsert_query)
File.delete(search_contacts_path) if FileTest.exists?(search_contacts_path)
end
query=<<-SQL
SELECT brands1.id, #{self.id}
FROM brands brands1
LEFT OUTER JOIN brands brands2
ON brands1.parent_id = brands2.id
WHERE (#{name_conditions})
AND #{specialty_conditions}
SQL
search_contacts_bulk_insert_via_copy(query,"brands_searches (brand_id, search_id)")
private
def search_contacts_bulk_insert_via_copy(query,iquery)
search_contacts_path="#{RAILS_ROOT}/tmp/bulk_insert/search_contacts_#{self.id}.copy"
File.delete(search_contacts_path) if FileTest.exists?(search_contacts_path)
search_contacts_path1 = File.new(search_contacts_path, "w")
File.chmod(0777, search_contacts_path)
query ="COPY (#{query}) TO '#{search_contacts_path}'"
ActiveRecord::Base.connection.execute(query)
logger.error(query)
clinsert_query="COPY #{iquery} FROM '#{search_contacts_path}';"
connection.execute(clinsert_query)
logger.error(clinsert_query)
File.delete(search_contacts_path) if FileTest.exists?(search_contacts_path)
end
Tuesday, November 22, 2011
How can i download every attachment from gmail
Download attachments from gamil by using tmail.
#! /usr/bin/ruby
require 'net/imap'
require 'rubygems'
require 'tmail'
require 'fileutils'
require 'ftools'
# This is a convenience monkey patch
class Net::IMAP
def uid_move(uid, mailbox)
uid_copy(uid, mailbox)
uid_store(uid, "+FLAGS", [:Deleted])
end
end
server = 'imap.gmail.com'
username = 'gmail email id'
password = 'gmail password'
folder = 'INBOX'
movefolder = 'downloaded_resumes'
downloadfolder = "Folder_"
imap = Net::IMAP.new(server, 993, true)
imap.login(username, password)
imap.select(folder)
#puts imap.uid_search(["NOT", "SEEN"]).length
count=0
imap.uid_search(["NOT", "SEEN"]).reverse.each do |uid|
file_name="resume_"
no_of_resume=1
# save_attachment
mail = TMail::Mail.parse( imap.uid_fetch(uid, 'RFC822').first.attr['RFC822'])
if ! mail.attachments.blank?
#folder dynamic creation
if ((count%no_of_resume)==0 )
dirname="Resume/resume#{count/no_of_resume +1}"
File.makedirs(dirname)
else
dirname="Resume/resume#{count/no_of_resume +1}"
end
#folder dynamic creation
File.open(mail.attachments.first.original_filename,"w+") { |local_file|
local_file << mail.attachments.first.gets(nil)
#puts local_file.name.inspect
path=local_file.path
filename=File.basename(path)
extname=File.extname(filename)
loc="resume_#{count}#{extname}"
File.rename(filename, loc)
newfilename=File.basename(loc)
FileUtils.mv(newfilename, "Resume/resume#{count/no_of_resume +1}") # Move file one place to anouther place
count=count +1
}
end
# archive mail to mailbox
imap.uid_move(uid,movefolder)
end
imap.expunge
imap.logout
If you any quries mail me(palpandi26@gmail.com)
#! /usr/bin/ruby
require 'net/imap'
require 'rubygems'
require 'tmail'
require 'fileutils'
require 'ftools'
# This is a convenience monkey patch
class Net::IMAP
def uid_move(uid, mailbox)
uid_copy(uid, mailbox)
uid_store(uid, "+FLAGS", [:Deleted])
end
end
server = 'imap.gmail.com'
username = 'gmail email id'
password = 'gmail password'
folder = 'INBOX'
movefolder = 'downloaded_resumes'
downloadfolder = "Folder_"
imap = Net::IMAP.new(server, 993, true)
imap.login(username, password)
imap.select(folder)
#puts imap.uid_search(["NOT", "SEEN"]).length
count=0
imap.uid_search(["NOT", "SEEN"]).reverse.each do |uid|
file_name="resume_"
no_of_resume=1
# save_attachment
mail = TMail::Mail.parse( imap.uid_fetch(uid, 'RFC822').first.attr['RFC822'])
if ! mail.attachments.blank?
#folder dynamic creation
if ((count%no_of_resume)==0 )
dirname="Resume/resume#{count/no_of_resume +1}"
File.makedirs(dirname)
else
dirname="Resume/resume#{count/no_of_resume +1}"
end
#folder dynamic creation
File.open(mail.attachments.first.original_filename,"w+") { |local_file|
local_file << mail.attachments.first.gets(nil)
#puts local_file.name.inspect
path=local_file.path
filename=File.basename(path)
extname=File.extname(filename)
loc="resume_#{count}#{extname}"
File.rename(filename, loc)
newfilename=File.basename(loc)
FileUtils.mv(newfilename, "Resume/resume#{count/no_of_resume +1}") # Move file one place to anouther place
count=count +1
}
end
# archive mail to mailbox
imap.uid_move(uid,movefolder)
end
imap.expunge
imap.logout
If you any quries mail me(palpandi26@gmail.com)
Gmail scraping by using mechanize gem
require 'rubygems'
require 'mechanize'
agent = Mechanize.new
page = agent.get 'http://www.gmail.com'
form = page.forms.first
form.Email = 'your gmail id here'
form.Passwd = 'your gmail here'
page = agent.submit form
puts page.inspect
You will get gmail page html source.
Saturday, November 19, 2011
Searching in integer Arrays in postgres
SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter);
In addition, you can find rows where the array has all values equal to 10000 with:
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
Alter natively, the generate_subscripts function can be used. For example
SELECT * FROM
(SELECT pay_by_quarter,
generate_subscripts(pay_by_quarter, 1) AS s
FROM sal_emp) AS foo
WHERE pay_by_quarter[s] = 10000;
Real time example:
Structure
contactids, companyids,added_by_search_contactids,added_by_search_companyids => integer array
1. SELECT * FROM (SELECT contactids,generate_subscripts(contactids, 1) AS s
FROM lists limit 50000 ) AS foo
WHERE contactids[s] IN (select id from contacts where current_details_id IS NULL);
2. UPDATE lists SET contactids = coalesce(contactids,ARRAY[]::INT[]) - coalesce(ARRAY(select id
from contacts where current_details_id IS NULL),ARRAY[]::INT[]),
added_by_search_contactids = coalesce(added_by_search_contactids,ARRAY[]::INT[]) -
coalesce(ARRAY(select id from contacts where current_details_id IS NULL),ARRAY[]::INT[]),
companyids = coalesce(companyids,ARRAY[]::INT[]) - coalesce(ARRAY(select id from
companies where current_details_id IS NULL),ARRAY[]::INT[]),
added_by_search_companyids = coalesce(added_by_search_companyids,ARRAY[]::INT[]) -
coalesce(ARRAY(select id from companies where current_details_id IS NULL),ARRAY[]::INT[])
WHERE id IN (SELECT id FROM (SELECT id,contactids,generate_subscripts(contactids, 1)AS s FROM lists
WHERE current_step >= 4 AND folder_id IS NOT NULL and is_deleted IS FALSE LIMIT 20000 OFFSET 80000) AS foo
WHERE contactids[s] = ANY(select id from contacts where current_details_id IS NULL) UNION SELECT id
FROM (SELECT id,added_by_search_contactids,generate_subscripts(added_by_search_contactids, 1)AS s FROM lists WHERE
current_step >= 4 AND folder_id IS NOT NULL and is_deleted IS FALSE LIMIT 20000 OFFSET 80000) AS foo
WHERE added_by_search_contactids[s] = ANY(select id from contacts where current_details_id IS NULL)
UNION SELECT id FROM (SELECT id,companyids,generate_subscripts(companyids, 1)AS s FROM lists
WHERE current_step >= 4 AND folder_id IS NOT NULL and is_deleted IS FALSE LIMIT 20000 OFFSET 80000) AS foo WHERE
companyids[s] = ANY(select id from companies where current_details_id IS NULL) UNION SELECT id FROM
(SELECT id,added_by_search_companyids,generate_subscripts(added_by_search_companyids, 1)AS s FROM lists
WHERE current_step >= 4 AND folder_id IS NOT NULL and is_deleted IS FALSE LIMIT 20000 OFFSET 80000) AS foo
WHERE added_by_search_companyids[s] = ANY(select id from companies where current_details_id IS NULL))
RETURNING lists.id
More information here
http://www.postgresql.org/docs/current/static/arrays.html
http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SUBSCRIPTS.
If you have any quires please post your comments here.
Gmail SMTP setting in rails3
SMTP setting for rails3and put new gmail.rb then run.
require 'rubygems'
require 'action_mailer'
require 'tlsmail'
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.default_charset = "utf-8"
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => "domainname",
:authentication => :plain,
:user_name => "notifications@domainname",
:password => "password"
}
class Emailer < ActionMailer::Base
def test_email()
subject "Test message"
from "Test mail"
recipients 'recipients@domainname.com'
body "Test mail for gmail SMTP setting"
end
end
Emailer.deliver_test_email()
require 'rubygems'
require 'action_mailer'
require 'tlsmail'
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.default_charset = "utf-8"
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.gmail.com",
:port => 587,
:domain => "domainname",
:authentication => :plain,
:user_name => "notifications@domainname",
:password => "password"
}
class Emailer < ActionMailer::Base
def test_email()
subject "Test message"
from "Test mail"
recipients 'recipients@domainname.com'
body "Test mail for gmail SMTP setting"
end
end
Emailer.deliver_test_email()
Subscribe to:
Posts (Atom)