DROP TYPE ext._domena CASCADE; CREATE TYPE ext._domena AS ( domena varchar, popis varchar, stav varchar, glue varchar[], klic varchar, registrovano date, expirace date, registrator varchar[][], drzitel varchar[][], techspr varchar[][] ); CREATE OR REPLACE FUNCTION ext.read_nic(varchar) RETURNS ext._domena AS $$ use WWW::Mechanize; use HTML::TreeBuilder; use locale; my $agent = WWW::Mechanize->new(); my $start = qq|http://www.nic.cz/prohlizeni/prohlizeni_domeny.php|; $agent->get($start); if (!$agent->success) { elog ERROR, "Nepodařilo se odeslat data.\n" . $agent->response->status_line; } $agent->field('_domjme',$_[0]); $agent->field('_hist','Ano'); $agent->field('_prime', 'Ne'); my $result = $agent->submit(); if (!$agent->success) { elog ERROR, "Nepodařilo se odeslat data.\n" . $agent->response->status_line; } my $tree = HTML::TreeBuilder->new_from_content($agent->{content}); my %fields = ("doména" => "domena", 'popis' => "popis", "stavdoménovéhojména" => "stav", "platnost-dns-glue" =>"glue", "veřejnýklíč" => "klic", "registraceod" => "registrovano", "expirace" => "expirace", "registrátor"=>"registrator","držitel"=>"drzitel","technickýsprávce"=>"techspr"); my %fields_value = (); foreach my $o_table ($tree->look_down( _tag => 'table', class=>'dataset')) { $o_table->traverse( sub{ if (ref $_[0]) { @rows = () if $_[0]->tag eq 'table' && $_[1] eq "1"; if ($_[0]->tag eq 'tr' && $_[1] eq "0") {push @rows, [@line]; } if ($_[0]->tag eq 'tr' && $_[1] eq "1") {@line = (); } } else { push @line, $_[0]; } 1; }); if ($rows[0][0] eq "Doména") { my $last_field; for $array_ref (@rows) { my $field = lc(@$array_ref[0]); $field =~ s/\240|\s//g; $field = $last_field if $field eq ""; $last_field = $field; my $fieldname = $fields{$field}; if ($field ne "" && defined($fieldname)) { my $isodate = @$array_ref[1]; $isodate =~ s/(\d{2})\.(\d{2})\.(\d{4})/$3-$2-$1/g; $isodate =~ s/^(\240|\s)+//g; $isodate =~ s/(\240|\s)+$//g; if ($fieldname =~ /glue/) { @{$fields_value{$fieldname}} = () if !@{$fields_value{$fieldname}}; push @{$fields_value{$fieldname}}, $isodate; print "$fieldname={" . join(",",@{$fields_value{$fieldname}})."}\n"; } else { if (!@{$fields_value{$fieldname}}) { $fields_value{$fieldname} = $isodate; print "$fieldname=" . $fields_value{$fieldname} . "\n"; } } } } } elsif ($rows[0][1] =~ /registrátor|držitel|technický správce/i) { my $field = lc($rows[0][1]); $field =~ s/\240|\s//g; my $fieldname = $fields{$field}; @{$fields_value{$fieldname}} = () if !@{$fields_value{$fieldname}}; for $i (1 .. $#rows) { $rows[$i][1] =~ s/,/\\,/g; $rows[$i][2] =~ s/(\d{2})\.(\d{2})\.(\d{4})/$3-$2-$1/g; $rows[$i][3] =~ s/(\d{2})\.(\d{2})\.(\d{4})/$3-$2-$1/g; push @{$fields_value{$fieldname}}, '{'.join(',', @{$rows[$i]}).'}'; } } } foreach $field (('glue','registrator','drzitel','techspr')) { if (@{$fields_value{$field}}) { {$fields_value{$field} = '{'. join(',', @{$fields_value{$field}}) . '}'}; } } $tree->delete; return \%fields_value; $$ LANGUAGE plperlu; select * from ext.read_nic('jetspeed.cz');