use Mysql; use URI; use strict; use vars qw($dbh); $dbh = Mysql->connect("", "ngbot", "aas") or die; sub new_link { my($uri, $ref_id, $type) = @_; $uri = URI->new($uri) unless ref($uri); my $scheme = $uri->scheme || die "Not absolute URI"; my $host = $uri->host; $scheme = $dbh->quote(lc($scheme)); $host = $dbh->quote(lc($host)); my $port = $uri->port || 0; my $abs_path = $dbh->quote($uri->path_query); $abs_path = "/" unless length($abs_path); my $server_id; my $sth = $dbh->query("select id from server where scheme = $scheme and host=$host and port = $port") or die $dbh->errmsg; if ($sth->numrows) { ($server_id) = $sth->fetchrow; } else { $sth = $dbh->query("insert into server (scheme,host,port) values($scheme,$host,$port)") or die $dbh->errmsg; $server_id = $sth->insertid; } my($uri_id, $last_visit, $status_code); $sth = $dbh->query("select id, last_visit, status_code from uri where server=$server_id and abs_path=$abs_path") or die $dbh->errmsg; if ($sth->numrows) { ($uri_id, $last_visit, $status_code) = $sth->fetchrow; } else { $sth = $dbh->query("insert into uri(server,abs_path) values($server_id,$abs_path)") or die $dbh->errmsg; $uri_id = $sth->insertid; } if ($ref_id) { $type = $dbh->quote($type || "a"); $sth = $dbh->query("insert into links(src,dest,type) values($ref_id,$uri_id,$type)") or die $dbh->errmsg; } $uri_id; } sub forget_links_from { my($ref_id) = @_; my $sth = $dbh->query("delete from links where src=$ref_id") or die $dbh->errmsg; return $sth->affectedrows; } sub visit { my($uri_id, $code, $mess, $ct, $last_mod, $etag, $fresh, $size, $md5) = @_; # Find the server_id (and validate uri_id) my $sth = $dbh->query("select server from uri where id=$uri_id") or die $dbh->errmsg; die "No uri identified by $uri_id" unless $sth->numrows; my($server_id) = $sth->fetchrow; #print "server_id=$server_id\n"; # Obtains appropriate content_type id my $ct_id; if (defined $ct and length $ct) { $ct = $dbh->quote(lc($ct)); $sth = $dbh->query("select id from media_types where name=$ct") or die $dbh->errmsg; if ($sth->numrows) { ($ct_id) = $sth->fetchrow; } else { $sth = $dbh->query("insert into media_types(name) values($ct)") or die $dbh->errmsg; $ct_id = $sth->insertid; } } else { $ct_id = "NULL"; } #print "ct_id=$ct_id\n"; my $e_id; if ($md5 && $size) { $md5 = $dbh->quote($md5); $sth = $dbh->query("select id from entity where size=$size and md5=$md5") or die $dbh->errmsg; if ($sth->numrows) { ($e_id) = $sth->fetchrow; } else { $sth = $dbh->query("insert into entity(size,md5) values($size,$md5)") or die $dbh->errmsg; $e_id = $sth->insertid; } } else { $e_id = "NULL"; } #print "e_id=$e_id\n"; for ($mess, $etag) { $_ = $dbh->quote($_); } for ($code, $last_mod, $fresh, $size) { $_ = "NULL" unless $_; } my $last_visit = time; # Now we are ready to start updating $sth = $dbh->query("update server set last_visit=$last_visit where id=$server_id") or die $dbh->errmsg; $sth = $dbh->query("update uri set last_visit=$last_visit, status_code=$code,message=$mess,last_mod=$last_mod,etag=$etag,fresh_until=$fresh,content_length=$size,entity=$e_id,content_type=$ct_id where id=$uri_id") or die $dbh->errmsg; return $sth->affectedrows; } 1;