class XMLFetcher include Net include REXML def initialize(host,ssl = true) @http = HTTP.new(host, 443) @http.use_ssl = ssl end def fetch_groups(cid) @http.start do |http| req = HTTP::Get.new("/XML/partner/xml.x?partner=31af78b22fdsfsdfd90128f392bab6ca405eba817&type=group&cid=#{cid}") response = http.request(req) doc = Document.new(response.body) return doc end end def fetch_subcategories(cid,gid) @http.start do |http| req = HTTP::Get.new("/XML/partner/xml.x?partner=31af7228fdsfdsbd90128ffdsf392bab6ca405eba817&type=subcategory&cid=#{cid}&gid=#{gid}") response = http.request(req) doc = Document.new(response.body) return doc end end end class StatusDisplay def initialize(name) @counter = 0 @counter2 = 0 @name = name @lastup = Time.now end def add_node @counter2 += 1 show end def add_tick @counter += 1 show end def show if (Time.now - @lastup) > 1 @lastup = Time.now puts "#{@name} - node: #{@counter2}, task: #{@counter}" end end end # load all database classes in app/models :-) class_dir = Pathname.new("prisguideweb/app/models") class_dir.children.each do |child| require child end # connect to db ActiveRecord::Base.establish_connection({ :adapter => 'postgresql', :database => 'prispartner', :username => 'pgsql', :password => '', :host => 'localhost', }) dsp = StatusDisplay.new("categories") dsp.show remote_xml = XMLFetcher.new('www.dinpris.no') categories = Category.find(:all) categories.each do |cat| dsp.add_node xml_doc = remote_xml.fetch_groups(cat.category_id) xml_doc.root.each_element('//group') do |node| dsp.add_tick group = Group.find(:first, :conditions => ['group_id = ? AND category_id = ? and language_id = 1', node.text('id'), cat.category_id]) unless group.nil? group.name = node.text('name') unless group.name == node.text('name') else group = Group.create(:group_id => node.text('id'), :category_id => cat.category_id, :language_id => 1, :name => node.text('name')) end end end dsp = StatusDisplay.new("groups") groups = Group.find(:all) groups.each do |grp| dsp.add_node xml_doc = remote_xml.fetch_subcategories(grp.category_id, grp.group_id) xml_doc.root.each_element('//subcategory') do |node| dsp.add_tick subcategory = Subcategory.find(:first, :conditions => ['subcategory_id = ? AND group_id = ? and language_id = 1', node.text('id'), grp.group_id]) unless subcategory.nil? subcategory.name = node.text('name') unless subcategory.name == node.text('name') else subcategory = Subcategory.create(:subcategory_id => node.text('id'), :group_id => grp.group_id, :language_id => 1, :name => node.text('name')) end end end