blib/lib/Search/Circa/Url.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 9 | 151 | 5.9 |
branch | 0 | 86 | 0.0 |
condition | 0 | 24 | 0.0 |
subroutine | 3 | 16 | 18.7 |
pod | 11 | 13 | 84.6 |
total | 23 | 290 | 7.9 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Search::Circa::Url; | ||||||
2 | |||||||
3 | # module Circa::Url : Manage url of Circa. See Search::Circa | ||||||
4 | # Copyright 2000 A.Barbet alian@alianwebserver.com. All rights reserved. | ||||||
5 | |||||||
6 | 12 | 12 | 7810 | use strict; | |||
12 | 25 | ||||||
12 | 452 | ||||||
7 | 12 | 12 | 2791 | use DBI; | |||
12 | 21152 | ||||||
12 | 1285 | ||||||
8 | 12 | 12 | 78 | use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); | |||
12 | 22 | ||||||
12 | 65758 | ||||||
9 | require Exporter; | ||||||
10 | |||||||
11 | @ISA = qw(Exporter); | ||||||
12 | @EXPORT = qw(); | ||||||
13 | $VERSION = ('$Revision: 1.19 $ ' =~ /(\d+\.\d+)/)[0]; | ||||||
14 | |||||||
15 | |||||||
16 | #------------------------------------------------------------------------------ | ||||||
17 | # new | ||||||
18 | #------------------------------------------------------------------------------ | ||||||
19 | sub new | ||||||
20 | { | ||||||
21 | 0 | 0 | 1 | my $class = shift; | |||
22 | 0 | my $self = {}; | |||||
23 | 0 | my $indexer = shift; | |||||
24 | 0 | bless $self, $class; | |||||
25 | 0 | $self->{DBH} = $indexer->{DBH}; | |||||
26 | 0 | $self->{INDEXER} = $indexer; | |||||
27 | 0 | return $self; | |||||
28 | } | ||||||
29 | |||||||
30 | #------------------------------------------------------------------------------ | ||||||
31 | # add | ||||||
32 | #------------------------------------------------------------------------------ | ||||||
33 | sub add { | ||||||
34 | 0 | 0 | 1 | my ($self,$idMan,%url)=@_; | |||
35 | 0 | my $id; | |||||
36 | 0 | 0 | $idMan=1 if (!$idMan); | ||||
37 | 0 | 0 | $url{niveau}=0 if (!$url{niveau}); | ||||
38 | 0 | 0 | $url{titre}=~s/([^\\])'/$1\\'/g if ($url{titre}); | ||||
39 | 0 | 0 | $url{description}=~s/([^\\])'/$1\\'/g if ($url{description}); | ||||
40 | 0 | 0 | chop ($url{url}) if ($url{url}=~/\/$/); | ||||
41 | 0 | my $requete = "insert into ".$self->{INDEXER}->pre_tbl.$idMan."links set "; | |||||
42 | 0 | 0 | $requete.= "url = '$url{url}'" if ($url{url}); | ||||
43 | 0 | 0 | $requete.= ",local_url = '$url{urllocal}'" if ($url{urllocal}); | ||||
44 | 0 | 0 | $requete.= ",titre = '$url{titre}'" if ($url{titre}); | ||||
45 | 0 | 0 | $requete.= ",description = '$url{description}'" if ($url{description}); | ||||
46 | 0 | 0 | $requete.= ",langue = '$url{langue}'" if ($url{langue}); | ||||
47 | 0 | 0 | $requete.= ",categorie = $url{categorie}" if ($url{categorie}); | ||||
48 | 0 | 0 | $requete.= ",parse = '$url{parse}'" if ($url{parse}); | ||||
49 | 0 | 0 | $requete.= ",valide = $url{valide}" if ($url{valide}); | ||||
50 | 0 | 0 | $requete.= ",niveau = $url{niveau}" if ($url{niveau}); | ||||
51 | 0 | 0 | $requete.= ",last_check = $url{last_check}" if ($url{last_check}); | ||||
52 | 0 | 0 | $requete.= ",last_update = '$url{last_update}'" if ($url{last_update}); | ||||
53 | 0 | 0 | $requete.= ",browse_categorie ='$url{browse_categorie}'" | ||||
54 | if ($url{browse_categorie}); | ||||||
55 | #print $requete," \n"; |
||||||
56 | 0 | $self->{INDEXER}->trace(4, $requete."\n"); | |||||
57 | 0 | my $sth = $self->{DBH}->prepare($requete); | |||||
58 | 0 | 0 | if ($sth->execute) { | ||||
59 | 0 | $sth->finish; | |||||
60 | 0 | $id = $sth->{'mysql_insertid'}; | |||||
61 | } | ||||||
62 | else { | ||||||
63 | 0 | $self->{INDEXER}->trace(2, "Circa::Url->add $requete $DBI::errstr\n"); | |||||
64 | 0 | return undef; | |||||
65 | } | ||||||
66 | 0 | return $id; | |||||
67 | } | ||||||
68 | |||||||
69 | #------------------------------------------------------------------------------ | ||||||
70 | # update | ||||||
71 | #------------------------------------------------------------------------------ | ||||||
72 | sub update { | ||||||
73 | 0 | 0 | 1 | my ($self,$compte,%url)=@_; | |||
74 | 0 | 0 | return undef unless ($url{id}); | ||||
75 | 0 | 0 | if ($url{titre}) { | ||||
76 | 0 | $url{titre}=~s/'/\\'/g; | |||||
77 | 0 | $url{titre}=~s/\\\\'/\\'/g; | |||||
78 | } | ||||||
79 | 0 | 0 | if ($url{description}) { | ||||
80 | 0 | $url{description}=~s/'/\\'/g; | |||||
81 | 0 | $url{description}=~s/\\\\'/\\'/g; | |||||
82 | } | ||||||
83 | 0 | my $requete = | |||||
84 | "update ".$self->{INDEXER}->pre_tbl.$compte."links set \n"; | ||||||
85 | # $requete.= "\n\turl = '$url{url}'," if ($url{url}); | ||||||
86 | 0 | 0 | $requete.= "\n\tlocal_url = '$url{urllocal}'," if ($url{urllocal}); | ||||
87 | 0 | 0 | $requete.= "\n\ttitre = '$url{titre}'," if ($url{titre}); | ||||
88 | 0 | 0 | $requete.= "\n\tdescription ='$url{description}'," | ||||
89 | if ($url{description}); | ||||||
90 | 0 | 0 | $requete.= "\n\tlangue = '$url{langue}'," if ($url{langue}); | ||||
91 | 0 | 0 | $requete.= "\n\tcategorie = $url{categorie}," if ($url{categorie}); | ||||
92 | 0 | 0 | $requete.= "\n\tparse = '$url{parse}'," if ($url{parse}); | ||||
93 | 0 | 0 | $requete.= "\n\tvalide = $url{valide}," if ($url{valide}); | ||||
94 | 0 | 0 | $requete.= "\n\tniveau = $url{niveau}," if ($url{niveau}); | ||||
95 | 0 | 0 | if ($url{last_check}) | ||||
96 | { | ||||||
97 | 0 | 0 | if ($url{last_check} eq 'NOW()') | ||||
0 | |||||||
98 | {$requete.= "\n\tlast_check = NOW(),";} | ||||||
99 | 0 | else { $requete.= "\n\tlast_check = '$url{last_check}',"; } | |||||
100 | } | ||||||
101 | 0 | 0 | $requete.= "\n\tlast_update = '$url{last_update}'," | ||||
102 | if ($url{last_update}); | ||||||
103 | 0 | 0 | $requete.= "\n\tbrowse_categorie ='$url{browse_categorie}'," | ||||
104 | if ($url{browse_categorie}); | ||||||
105 | 0 | 0 | if ($requete=~/,$/) { chop($requete); } | ||||
0 | |||||||
106 | 0 | $requete.=" where id=$url{id}"; | |||||
107 | # print $requete; | ||||||
108 | |||||||
109 | 0 | $self->{INDEXER}->trace(4, $requete."\n"); | |||||
110 | 0 | 0 | my $r = $self->{DBH}->do($requete) || return undef; | ||||
111 | # print "$requete $DBI::errstr\n" if (!$r or $r eq '0E0'); | ||||||
112 | 0 | 0 | 0 | return ((!$r or $r eq '0E0') ? 0 : 1); | |||
113 | } | ||||||
114 | |||||||
115 | #------------------------------------------------------------------------------ | ||||||
116 | # load | ||||||
117 | #------------------------------------------------------------------------------ | ||||||
118 | sub load { | ||||||
119 | 0 | 0 | 1 | my ($self,$compte,$id)=@_; | |||
120 | 0 | my @l = $self->{INDEXER}->fetch_first | |||||
121 | ("select url,local_url,titre,description, | ||||||
122 | categorie,langue,parse,valide,niveau, | ||||||
123 | last_check,last_update,browse_categorie | ||||||
124 | from ".$self->{INDEXER}->pre_tbl.$compte."links | ||||||
125 | where id=".$id); | ||||||
126 | # print "load $id:", join(' ',@l),"\n"; | ||||||
127 | 0 | 0 | return 0 if (!@l); | ||||
128 | 0 | my %tab= | |||||
129 | ( url => $l[0], | ||||||
130 | local_url => $l[1], | ||||||
131 | titre => $l[2], | ||||||
132 | description => $l[3], | ||||||
133 | categorie => $l[4], | ||||||
134 | langue => $l[5], | ||||||
135 | parse => $l[6], | ||||||
136 | valide => $l[7], | ||||||
137 | niveau => $l[8], | ||||||
138 | last_check => $l[9], | ||||||
139 | last_update => $l[10], | ||||||
140 | browse_categorie => $l[11], | ||||||
141 | ); | ||||||
142 | 0 | return \%tab; | |||||
143 | } | ||||||
144 | |||||||
145 | #------------------------------------------------------------------------------ | ||||||
146 | # delete | ||||||
147 | #------------------------------------------------------------------------------ | ||||||
148 | sub delete { | ||||||
149 | 0 | 0 | 1 | my ($this,$compte,$id_url)=@_; | |||
150 | 0 | $this->{DBH}->do | |||||
151 | ("delete from ".$this->{INDEXER}->pre_tbl.$compte."relation". | ||||||
152 | "where id_site = $id_url"); | ||||||
153 | 0 | 0 | my $r = $this->{DBH}->do("delete from ".$this->{INDEXER}->pre_tbl.$compte. | ||||
154 | "links where id = $id_url") || return 0; | ||||||
155 | 0 | 0 | 0 | return ((!$r or $r eq '0E0') ? 0 : 1); | |||
156 | } | ||||||
157 | |||||||
158 | #------------------------------------------------------------------------------ | ||||||
159 | # delete_all_non_valid | ||||||
160 | #------------------------------------------------------------------------------ | ||||||
161 | sub delete_all_non_valid { | ||||||
162 | 0 | 0 | 1 | my ($self,$id)=@_; | |||
163 | 0 | my $tt = 0; | |||||
164 | 0 | 0 | my $tab = $self->a_valider($id) || return undef; | ||||
165 | 0 | foreach (keys %$tab) {$tt += $self->delete($id,$_);} | |||||
0 | |||||||
166 | 0 | return $tt; | |||||
167 | } | ||||||
168 | |||||||
169 | #------------------------------------------------------------------------------ | ||||||
170 | # valid_all_non_valid | ||||||
171 | #------------------------------------------------------------------------------ | ||||||
172 | sub valid_all_non_valid { | ||||||
173 | 0 | 0 | 1 | my ($self,$id)=@_; | |||
174 | 0 | my $tt = 0; | |||||
175 | 0 | 0 | my $tab = $self->a_valider($id) || return undef; | ||||
176 | 0 | foreach (keys %$tab) {$tt+= $self->valide($id,$_);} | |||||
0 | |||||||
177 | 0 | return $tt; | |||||
178 | } | ||||||
179 | |||||||
180 | #------------------------------------------------------------------------------ | ||||||
181 | # need_parser | ||||||
182 | #------------------------------------------------------------------------------ | ||||||
183 | sub need_parser { | ||||||
184 | 0 | 0 | 0 | my ($self,$idp)=@_; | |||
185 | 0 | my %tab; | |||||
186 | 0 | my $requete="select id,url,local_url,niveau,categorie ". | |||||
187 | "from ".$self->{INDEXER}->pre_tbl.$idp."links ". | ||||||
188 | "where parse='0' and valide=1 ". | ||||||
189 | "order by niveau,id"; | ||||||
190 | 0 | my $sth = $self->{DBH}->prepare($requete); | |||||
191 | 0 | 0 | if ($sth->execute()) { | ||||
0 | |||||||
192 | 0 | while (my @row=$sth->fetchrow_array) { | |||||
193 | 0 | my $id = shift @row; | |||||
194 | 0 | $tab{$id}[0]=$row[0]; # url | |||||
195 | 0 | $tab{$id}[1]=$row[1]; # local_url | |||||
196 | 0 | $tab{$id}[2]=$row[2]; # niveau | |||||
197 | 0 | $tab{$id}[3]=$row[3]; # categorie | |||||
198 | } | ||||||
199 | } | ||||||
200 | else {print "\nDid you call create before ?\n";} | ||||||
201 | 0 | $sth->finish; | |||||
202 | 0 | return \%tab; | |||||
203 | } | ||||||
204 | |||||||
205 | #------------------------------------------------------------------------------ | ||||||
206 | # liens | ||||||
207 | #------------------------------------------------------------------------------ | ||||||
208 | sub liens | ||||||
209 | { | ||||||
210 | 0 | 0 | 0 | my ($self,$id)=@_; | |||
211 | 0 | my %tab; | |||||
212 | 0 | my $sth = $self->{DBH}->prepare | |||||
213 | ("select id,url from ".$self->{INDEXER}->pre_tbl.$id."links"); | ||||||
214 | 0 | 0 | $sth->execute() || print $DBI::errstr," \n"; |
||||
215 | 0 | while (my @row=$sth->fetchrow_array) | |||||
216 | { | ||||||
217 | 0 | $self->{INDEXER}->set_host_indexed($row[1]); | |||||
218 | 0 | my $racine=$self->{INDEXER}->host_indexed; | |||||
219 | 0 | $tab{$row[0]}=$row[1]; | |||||
220 | 0 | $tab{$row[0]}=~s/www\.//g; | |||||
221 | } | ||||||
222 | 0 | $sth->finish; | |||||
223 | 0 | return \%tab; | |||||
224 | } | ||||||
225 | |||||||
226 | #------------------------------------------------------------------------------ | ||||||
227 | # need_update | ||||||
228 | #------------------------------------------------------------------------------ | ||||||
229 | sub need_update | ||||||
230 | { | ||||||
231 | 0 | 0 | 1 | my ($self,$idp,$xj)=@_; | |||
232 | 0 | my %tab; | |||||
233 | 0 | my $requete="select id,url,local_url,niveau,categorie, | |||||
234 | UNIX_TIMESTAMP(last_update) | ||||||
235 | from ".$self->{INDEXER}->pre_tbl.$idp."links | ||||||
236 | where TO_DAYS(NOW()) >= (TO_DAYS(last_check) + $xj) | ||||||
237 | and valide=1 order by niveau,last_update"; | ||||||
238 | 0 | my $sth = $self->{DBH}->prepare($requete); | |||||
239 | 0 | 0 | if ($sth->execute()) | ||||
240 | 0 | { | |||||
241 | 0 | while (my @row=$sth->fetchrow_array) | |||||
242 | { | ||||||
243 | 0 | my $id = shift @row; | |||||
244 | 0 | $tab{$id}[0]=$row[0]; # url | |||||
245 | 0 | $tab{$id}[1]=$row[1]; # local_url | |||||
246 | 0 | $tab{$id}[2]=$row[2]; # niveau | |||||
247 | 0 | $tab{$id}[3]=$row[3]; # categorie | |||||
248 | 0 | $tab{$id}[4]=$row[4]; # last_update | |||||
249 | } | ||||||
250 | } | ||||||
251 | else {print "\nDid you call create before ?\n";} | ||||||
252 | 0 | $sth->finish; | |||||
253 | 0 | return \%tab; | |||||
254 | } | ||||||
255 | |||||||
256 | #------------------------------------------------------------------------------ | ||||||
257 | # a_valider | ||||||
258 | #------------------------------------------------------------------------------ | ||||||
259 | sub a_valider | ||||||
260 | { | ||||||
261 | 0 | 0 | 1 | my ($self,$id)=@_; | |||
262 | 0 | my (%tab); | |||||
263 | 0 | my $sth = $self->{DBH}->prepare("select id,url from ". | |||||
264 | $self->{INDEXER}->pre_tbl.$id."links ". | ||||||
265 | "where valide=0"); | ||||||
266 | 0 | 0 | $sth->execute() || return undef; | ||||
267 | 0 | while (my @row=$sth->fetchrow_array) | |||||
268 | { | ||||||
269 | 0 | $self->{INDEXER}->set_host_indexed($row[1]); | |||||
270 | 0 | my $racine=$self->{INDEXER}->host_indexed; | |||||
271 | 0 | $tab{$row[0]}=$row[1]; | |||||
272 | 0 | $tab{$row[0]}=~s/www\.//g; | |||||
273 | } | ||||||
274 | 0 | $sth->finish; | |||||
275 | 0 | return \%tab; | |||||
276 | } | ||||||
277 | |||||||
278 | #------------------------------------------------------------------------------ | ||||||
279 | # valide | ||||||
280 | #------------------------------------------------------------------------------ | ||||||
281 | sub valide { | ||||||
282 | 0 | 0 | 1 | my ($this,$compte,$id_url)=@_; | |||
283 | 0 | 0 | my $r=$this->{DBH}->do("update ".$this->{INDEXER}->pre_tbl.$compte."links ". | ||||
284 | "set valide=1,parse='0' where id = $id_url") | ||||||
285 | || return 0; | ||||||
286 | 0 | 0 | 0 | return ((!$r or $r eq '0E0') ? 0 : 1); | |||
287 | } | ||||||
288 | |||||||
289 | #------------------------------------------------------------------------------ | ||||||
290 | # non_valide | ||||||
291 | #------------------------------------------------------------------------------ | ||||||
292 | sub non_valide { | ||||||
293 | 0 | 0 | 1 | my ($this,$compte,$id_url)=@_; | |||
294 | 0 | 0 | my $r=$this->{DBH}->do("update ".$this->{INDEXER}->pre_tbl.$compte."links". | ||||
295 | " set valide='0' where id=".$id_url) | ||||||
296 | || return 0; | ||||||
297 | 0 | 0 | 0 | return ((!$r or $r eq '0E0') ? 0 : 1); | |||
298 | } | ||||||
299 | |||||||
300 | #------------------------------------------------------------------------------ | ||||||
301 | # POD DOCUMENTATION | ||||||
302 | #------------------------------------------------------------------------------ | ||||||
303 | |||||||
304 | =head1 NAME | ||||||
305 | |||||||
306 | Search::Circa::Url - provide functions to manage url of Circa | ||||||
307 | |||||||
308 | =head1 VERSION | ||||||
309 | |||||||
310 | $Revision: 1.19 $ | ||||||
311 | |||||||
312 | =head1 SYNOPSIS | ||||||
313 | |||||||
314 | use Search::Circa::Indexer; | ||||||
315 | my $index = new Search::Circa::Indexer; | ||||||
316 | $index->connect(...); | ||||||
317 | $index->URL->add($account,%url) || | ||||||
318 | print "Can't add $url{url} : $DBI::errstr\n"; | ||||||
319 | $index->URL->del($account,$id_url); | ||||||
320 | |||||||
321 | =head1 DESCRIPTION | ||||||
322 | |||||||
323 | This module is used by Search::Circa::Indexer module to manage Url of Circa | ||||||
324 | |||||||
325 | |||||||
326 | =head1 Hash %url | ||||||
327 | |||||||
328 | Sometimes I use a hash call url as parameter. (update,add,load method). | ||||||
329 | Here are possible field: | ||||||
330 | |||||||
331 | =over | ||||||
332 | |||||||
333 | =item id | ||||||
334 | |||||||
335 | Id of url (use only on update) | ||||||
336 | |||||||
337 | =item url | ||||||
338 | |||||||
339 | Url use to get content if local_url isn't define | ||||||
340 | |||||||
341 | =item local_url | ||||||
342 | |||||||
343 | Url with file:// protocol. In search, url will be displayed, else in | ||||||
344 | indexer, url_local is used. | ||||||
345 | |||||||
346 | =item browse_categorie | ||||||
347 | |||||||
348 | 0 ou 1. (Apparait ou pas dans la navigation par categorie). Si non present, 0. | ||||||
349 | |||||||
350 | =item niveau | ||||||
351 | |||||||
352 | Profondeur de l'indexation pour ce document. Si non present, positionné ŕ 0. | ||||||
353 | |||||||
354 | =item categorie | ||||||
355 | |||||||
356 | Categorie de cet url. Si non present, positionné ŕ 0. | ||||||
357 | |||||||
358 | =item titre | ||||||
359 | |||||||
360 | Title of document | ||||||
361 | |||||||
362 | =item description | ||||||
363 | |||||||
364 | Description of document | ||||||
365 | |||||||
366 | =item langue | ||||||
367 | |||||||
368 | Langue of document | ||||||
369 | |||||||
370 | =item last_check | ||||||
371 | |||||||
372 | Last check of Indexer | ||||||
373 | |||||||
374 | =item last_update | ||||||
375 | |||||||
376 | Last update of document | ||||||
377 | |||||||
378 | =item valide | ||||||
379 | |||||||
380 | Is document reachable ? | ||||||
381 | |||||||
382 | =item parse | ||||||
383 | |||||||
384 | Does Circa already known this url ? | ||||||
385 | |||||||
386 | =back | ||||||
387 | |||||||
388 | |||||||
389 | |||||||
390 | =head1 Public Class Interface | ||||||
391 | |||||||
392 | =over | ||||||
393 | |||||||
394 | =item new($indexer_instance) | ||||||
395 | |||||||
396 | Create a new Circa::Url object with indexer instance properties | ||||||
397 | |||||||
398 | =item add($idMan,%url) | ||||||
399 | |||||||
400 | Add url %url for account $idMan. | ||||||
401 | If error (account undefined, no account, no url) return 0. You can ask | ||||||
402 | $DBI::errstr to know why) or 1 if ok. | ||||||
403 | |||||||
404 | =item load($compte,$id) | ||||||
405 | |||||||
406 | Return reference to hash %url for id $id, account $compte. | ||||||
407 | If error (id undefined, no id, no account) return 0. You can ask | ||||||
408 | $DBI::errstr to know why) or 1 if ok. | ||||||
409 | |||||||
410 | =item update($compte,%url) | ||||||
411 | |||||||
412 | Update url %url for account $compte. | ||||||
413 | If error (id undefined, no id, no account) return 0. You can ask | ||||||
414 | $DBI::errstr to know why) or 1 if ok. Field url can't be updated. | ||||||
415 | |||||||
416 | =item delete($compte,$id_url) | ||||||
417 | |||||||
418 | Delete url with id $id_url on account $compte (clean table links/releation) | ||||||
419 | If error (id undefined, no id, no account) return 0. You can ask | ||||||
420 | $DBI::errstr to know why) | ||||||
421 | |||||||
422 | =item delete_all_non_valid($id) | ||||||
423 | |||||||
424 | Delete all non valid url found for account $id | ||||||
425 | |||||||
426 | =item need_update($id,$xj) | ||||||
427 | |||||||
428 | Return reference of hash with id/url for url not parsed since $xj days | ||||||
429 | |||||||
430 | =item need _parser($id) | ||||||
431 | |||||||
432 | Return reference of hash with id/url for url never parser (column parser=0) | ||||||
433 | |||||||
434 | =item a_valider($compte) | ||||||
435 | |||||||
436 | Return reference of hash with id/url of url not valid | ||||||
437 | |||||||
438 | =item valid_all_non_valid($id) | ||||||
439 | |||||||
440 | Valid all non valid url found for account $id | ||||||
441 | |||||||
442 | =item valide($compte,$id_url) | ||||||
443 | |||||||
444 | Commit link $id_url on table $compte/links | ||||||
445 | |||||||
446 | Valide le lien $id_url | ||||||
447 | |||||||
448 | =item non_valide($compte,$id_url) | ||||||
449 | |||||||
450 | Set url $id_url as non valide. Ignore link $id_url on search (bad link). | ||||||
451 | |||||||
452 | =back | ||||||
453 | |||||||
454 | =head1 AUTHOR | ||||||
455 | |||||||
456 | Alain BARBET alian@alianwebserver.com | ||||||
457 | |||||||
458 | =cut |