#!/usr/bin/ruby -w ## GPL machin toussa ## ©®(tm) Aurélien DEHAY require "net/http"; require "rexml/document"; require "dbi"; require "date" include REXML; ## On inclu le fichier config pour la config^W^W^W require "./config"; configFilepath = "fossileBouchotConfig"; ## On remplit le tableau pages avec le contenu du fichier de conf. En ## dernière position de chaque ligne: le dernier timestamp du header ## last-modified. Pour pas recharger tout le remote.xml à chaque fois, ## mais uniquement quand il a changé. threads = Array.new; pages = Array.new; File.open(configFilepath, "r").each {|line| pages << line.chomp!.split(/;/); }.close for page in pages threads << Thread.new(page) { |myPage| begin ## Utiliser l'un ou l'autre selon s'il y a proxy ou pas. ## Ouvre la connection tcp if @config["use_proxy"] then h = Net::HTTP::Proxy(@config["proxy_host"], @config["proxy_port"], @config["proxy_user"], @config["proxy_pass"]).start(myPage[0]); else h = Net::HTTP.start(myPage[0], 80); end rescue print "Impossible d'ouvrir site #{myPage[0]}: #{$!}\n"; Thread.exit; end ## Une jolie U-A. headers = { 'User-Agent' => 'fossileBouchot 0.42' } puts "Fetching: #{myPage[0]}"; ## cf 1. body = h.get("#{myPage[1]}", headers); ## On ferme la connexion tcp. h.finish; ## On bourre le résultat dans un doc XML begin machin = Document.new(body.body); rescue print "Impossible de parser le document du site #{myPage[0]}: #{$!}\n"; Thread.exit; end tribuneName=machin.elements["/board"].attributes["site"]; ## Et maintenant, la base ## create table archive (id serial, site varchar, post_id int, post_time varchar, login varchar, info varchar, message varchar); ## create unique index archive_unique_idx on archive (site, post_id); begin DBI.connect(@config["db_url"], @config["db_user"], @config["db_pass"]) {|dbh| ## LA requête pour l'insertion, en mode «prepare» pour la ## reservir plusieurs fois après sql = "insert into archive (site, post_id, post_time, login, info, message) VALUES (?,?,?,?,?,?)" sth = dbh.prepare(sql) ## On on balaie les éléments dans /board/post machin.elements.each("/board/post") { |element| begin ## On lance la requête avec les paramètres kivonbien sth.execute(tribuneName, element.attributes['id'], DateTime.parse(element.attributes['time']).strftime('%F %T'), element.elements['login'].to_a.to_s, element.elements['info'].to_a.to_s, element.elements['message'].to_a.to_s); rescue ## Si y'a doublon, on a levé une exception, ça se termine ## icitte. Pas super propre. print "#{tribuneName} #{DateTime.parse(element.attributes['time']).strftime('%F %T')} non inséré, doublon: #{$!}"; end } } rescue DBI::OperationalError pint "Impossible de se connecter à la base: #{$!}\n"; end } end ## On lance les threads et on attends la fin. threads.each { |aThread| aThread.join } ## 1. Un bout de code qui fonctionne pas pour l'utilisation du ## last-modified # head = h.head("#{myPage[1]}"); # puts "Got #{myPage[0]}: #{head.message}"; # if head['last-modified'] then # lm = DateTime.parse(head['last-modified']); # if DateTime.parse(myPage[2]); then # prec = DateTime.parse(myPage[2]); # if lm > prec then # puts "Modified:!"; # body= h.get("#{myPage[1]}"); # puts "#{lm.year}"; # else # puts "Rien changé"; # end # end # else