| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#$Id: filelist.pm 1001 2014-05-07 13:08:30Z pro $ $URL: svn://svn.setun.net/dcppp/trunk/lib/Net/DirectConnect/filelist.pm $ |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
generate dc++ xml filelist |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
perl filelist.pm /path/to/dir |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
=cut |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
package # no cpan |
|
12
|
|
|
|
|
|
|
Net::DirectConnect::filelist; |
|
13
|
1
|
|
|
1
|
|
1636
|
use 5.10.0; |
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
55
|
|
|
14
|
1
|
|
|
1
|
|
6
|
use strict; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
42
|
|
|
15
|
1
|
|
|
1
|
|
6
|
no strict qw(refs); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
27
|
|
|
16
|
1
|
|
|
1
|
|
5
|
use warnings "NONFATAL" => "all"; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
141
|
|
|
17
|
1
|
|
|
1
|
|
7
|
no warnings qw(uninitialized); |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
47
|
|
|
18
|
1
|
|
|
1
|
|
5
|
no if $] >= 5.017011, warnings => 'experimental::smartmatch'; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
9
|
|
|
19
|
1
|
|
|
1
|
|
60
|
use utf8; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
10
|
|
|
20
|
1
|
|
|
1
|
|
29
|
use Encode; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
100
|
|
|
21
|
1
|
|
|
1
|
|
5
|
use Data::Dumper; #dev only |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
72
|
|
|
22
|
|
|
|
|
|
|
$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1; |
|
23
|
|
|
|
|
|
|
#use Net::DirectConnect; |
|
24
|
1
|
|
|
1
|
|
7
|
use Net::DirectConnect::adc; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
129
|
|
|
25
|
|
|
|
|
|
|
our $VERSION = ( split( ' ', '$Revision: 1001 $' ) )[1]; |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
=tofix |
|
28
|
|
|
|
|
|
|
$0 =~ m|^(.+)[/\\].+?$|; #v0 |
|
29
|
|
|
|
|
|
|
our $root_path ||= $1 . '/' if $1; |
|
30
|
|
|
|
|
|
|
$root_path =~ s|\\|/|g; |
|
31
|
|
|
|
|
|
|
warn "rp[$root_path]"; |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
eval "use lib '$root_path./stat/pslib'"; |
|
34
|
|
|
|
|
|
|
eval "use lib '$root_path./../../../examples/stat/pslib'; |
|
35
|
|
|
|
|
|
|
use psmisc; use pssql; |
|
36
|
|
|
|
|
|
|
use Net::DirectConnect; |
|
37
|
|
|
|
|
|
|
use base 'Net::DirectConnect'; |
|
38
|
|
|
|
|
|
|
"; #use Net::DirectConnect; |
|
39
|
|
|
|
|
|
|
#psmisc::use_try ('Net::DirectConnect'); |
|
40
|
|
|
|
|
|
|
=cut |
|
41
|
|
|
|
|
|
|
|
|
42
|
1
|
|
|
1
|
|
20
|
use base 'Net::DirectConnect'; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
115
|
|
|
43
|
|
|
|
|
|
|
#use lib '../../../examples/stat/pslib'; # REMOVE |
|
44
|
|
|
|
|
|
|
#use lib 'stat/pslib'; # REMOVE |
|
45
|
1
|
|
|
1
|
|
7
|
use lib::abs('pslib'); |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
11
|
|
|
46
|
1
|
|
|
1
|
|
816
|
use psmisc; # REMOVE |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
58
|
|
|
47
|
1
|
|
|
1
|
|
1921
|
use pssql; # REMOVE |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
5679
|
|
|
48
|
|
|
|
|
|
|
our %config; |
|
49
|
|
|
|
|
|
|
*config = *main::config; |
|
50
|
|
|
|
|
|
|
$config{ 'log_' . $_ } //= 0 for qw (dmp dcdmp dcdbg trace); |
|
51
|
|
|
|
|
|
|
$config{ 'log_' . $_ } //= 1 for qw (screen default); |
|
52
|
|
|
|
|
|
|
Net::DirectConnect::use_try 'Sys::Sendfile' unless $^O =~ /win/i; |
|
53
|
|
|
|
|
|
|
Net::DirectConnect::use_try 'Sys::Sendfile::FreeBSD' if $^O =~ /freebsd/i; |
|
54
|
|
|
|
|
|
|
#Net::DirectConnect::use_try 'IO::AIO'; |
|
55
|
|
|
|
|
|
|
my ( $tq, $rq, $vq ); |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
sub skip ($$) { |
|
58
|
0
|
|
|
0
|
0
|
|
my ( $file, $match ) = @_; |
|
59
|
0
|
0
|
|
|
|
|
return unless length $match; |
|
60
|
|
|
|
|
|
|
#say join ' ', ('skptst', $file, $match,); |
|
61
|
0
|
0
|
|
|
|
|
for my $m ( ref $match eq 'ARRAY' ? @$match : $match ) { |
|
62
|
0
|
0
|
0
|
|
|
|
return 1 if ref $m eq 'Regexp' and $file =~ $m; |
|
63
|
0
|
0
|
0
|
|
|
|
return 1 if !ref $m and $file eq $m; |
|
64
|
|
|
|
|
|
|
} |
|
65
|
|
|
|
|
|
|
} |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
sub new { |
|
68
|
0
|
|
|
0
|
0
|
|
my $standalone = !ref $_[0]; |
|
69
|
0
|
0
|
|
|
|
|
my $self = ref $_[0] ? shift() : bless {}, $_[0]; |
|
70
|
0
|
0
|
|
|
|
|
shift if $_[0] eq __PACKAGE__; |
|
71
|
|
|
|
|
|
|
#local %_ = @_; |
|
72
|
|
|
|
|
|
|
#$self->{$_} = $_{$_} for keys %_; |
|
73
|
0
|
|
|
|
|
|
$self->func(@_); |
|
74
|
0
|
|
|
|
|
|
$self->init_main(@_); |
|
75
|
|
|
|
|
|
|
$self->{'log'} //= sub (@) { |
|
76
|
0
|
0
|
0
|
0
|
|
|
my $dc = ref $_[0] ? shift : $self || {}; |
|
77
|
|
|
|
|
|
|
#print "PL[$_[0]]"; |
|
78
|
0
|
|
|
|
|
|
psmisc::printlog shift(), "[$dc->{'number'}]", @_,; |
|
79
|
0
|
|
0
|
|
|
|
},; |
|
80
|
0
|
|
0
|
|
|
|
$self->{no_sql} //= 0; |
|
81
|
|
|
|
|
|
|
# |
|
82
|
|
|
|
|
|
|
# adjustable |
|
83
|
|
|
|
|
|
|
# |
|
84
|
0
|
|
0
|
|
|
|
$self->{files} //= 'files.xml'; |
|
85
|
0
|
|
0
|
|
|
|
$self->{tth_cheat} //= 1_000_000; #try find file with same name-size-date |
|
86
|
0
|
|
0
|
|
|
|
$self->{tth_cheat_no_date} //= 0; #--//-- only name-size |
|
87
|
0
|
|
0
|
|
|
|
$self->{file_min} //= 0; #skip files smaller |
|
88
|
0
|
|
0
|
|
|
|
$self->{filelist_scan} //= 3600 * 1; #every seconds, 0 to disable |
|
89
|
0
|
|
0
|
|
|
|
$self->{filelist_reload} //= 300; #check and load filelist if new, every seconds |
|
90
|
0
|
|
0
|
|
|
|
$self->{filelist_fork} //= 1; |
|
91
|
0
|
|
0
|
|
|
|
$self->{file_send_by} //= 1024 * 1024 * 1; |
|
92
|
0
|
|
0
|
|
|
|
$self->{skip_hidden} //= 1; |
|
93
|
0
|
|
0
|
|
|
|
$self->{skip_symlink} //= 0; |
|
94
|
0
|
0
|
0
|
|
|
|
$self->{skip_dir} //= [ qr'(?:^|/)Incomplete(?:/|$)', ( !$self->{skip_hidden} ? () : qr{(?:^|/)\.} ), ]; |
|
95
|
0
|
0
|
0
|
|
|
|
$self->{skip_file} //= |
|
96
|
|
|
|
|
|
|
[ qr/\.(?:partial|(?:dc)tmp)$/i, qr/^~uTorrentPartFile_/i, ( !$self->{skip_hidden} ? () : qr{(?:^|/)\.} ), ]; |
|
97
|
|
|
|
|
|
|
# $self->{sharesize_mul} //= 3; # make share bigger * sharefiles_mul |
|
98
|
|
|
|
|
|
|
# $self->{sharesize_add} //= 10_000_000_000; #add to share size virtual bytes |
|
99
|
|
|
|
|
|
|
# $self->{sharefiles_mul} //=3; #same for files for keeping size/files rate |
|
100
|
|
|
|
|
|
|
# $self->{sharefiles_add} //= 10_000; |
|
101
|
|
|
|
|
|
|
# $self->{no_auto_load_partial} //= 1; |
|
102
|
|
|
|
|
|
|
# |
|
103
|
|
|
|
|
|
|
# ========== |
|
104
|
|
|
|
|
|
|
# |
|
105
|
|
|
|
|
|
|
#$self->{share_full} //= {}; |
|
106
|
|
|
|
|
|
|
#$self->{share_tth} //= {}; |
|
107
|
|
|
|
|
|
|
##$config{share_root} //= ''; |
|
108
|
0
|
0
|
|
|
|
|
$self->{'share'} = [ $self->{'share'} ] unless ref $self->{'share'}; |
|
109
|
0
|
0
|
|
|
|
|
tr{\\}{/} for @{ $self->{'share'} || [] }; |
|
|
0
|
|
|
|
|
|
|
|
110
|
0
|
|
|
|
|
|
Net::DirectConnect::adc::func($self); |
|
111
|
0
|
|
|
|
|
|
$self->ID_get(); |
|
112
|
|
|
|
|
|
|
#$self->log('idr:', $self->{'INF'}{'ID'}); |
|
113
|
|
|
|
|
|
|
#$self->ID_get(); |
|
114
|
0
|
0
|
|
|
|
|
unless ( $self->{no_sql} ) { |
|
115
|
|
|
|
|
|
|
local %_ = ( |
|
116
|
|
|
|
|
|
|
'driver' => 'sqlite', |
|
117
|
|
|
|
|
|
|
#'dbname' => 'files', |
|
118
|
|
|
|
|
|
|
'database' => 'files', |
|
119
|
|
|
|
|
|
|
#'auto_connect' => 1, |
|
120
|
|
|
|
|
|
|
#'log' => sub { shift if ref $_[0]; $self->log(@_) if $self }, |
|
121
|
|
|
|
|
|
|
'log' => $self->{'log'}, |
|
122
|
|
|
|
|
|
|
#'cp_in' => 'cp1251', |
|
123
|
|
|
|
|
|
|
'connect_tries' => 0, 'connect_chain_tries' => 0, 'error_tries' => 0, 'error_chain_tries' => 0, |
|
124
|
|
|
|
|
|
|
#insert_by => 1000, |
|
125
|
|
|
|
|
|
|
#nav_all => 1, |
|
126
|
|
|
|
|
|
|
#{} |
|
127
|
|
|
|
|
|
|
#}, |
|
128
|
|
|
|
|
|
|
'upgrade' => sub { |
|
129
|
0
|
0
|
|
0
|
|
|
my $db = shift if ref $_[0]; |
|
130
|
|
|
|
|
|
|
$db->do("ALTER TABLE filelist ADD COLUMN $_") |
|
131
|
0
|
|
|
|
|
|
for 'hit INTEGER UNSIGNED NOT NULL DEFAULT 0 ', 'sch INTEGER UNSIGNED NOT NULL DEFAULT 0 '; |
|
132
|
|
|
|
|
|
|
#$db->do("UPDATE filelist SET hit=0, sch=0 WHERE hit IS NULL"); |
|
133
|
|
|
|
|
|
|
}, |
|
134
|
0
|
|
|
|
|
|
); |
|
135
|
0
|
|
0
|
|
|
|
$self->{sql}{$_} //= $_{$_} for keys %_; |
|
136
|
0
|
|
|
|
|
|
my ($short) = $self->{sql}{'driver'} =~ /mysql/; |
|
137
|
0
|
0
|
|
|
|
|
my %table = ( |
|
|
|
0
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
'filelist' => { |
|
139
|
|
|
|
|
|
|
'path' => pssql::row( |
|
140
|
|
|
|
|
|
|
undef, |
|
141
|
|
|
|
|
|
|
'type' => 'VARCHAR', |
|
142
|
|
|
|
|
|
|
'length' => ( $short ? 150 : 255 ), |
|
143
|
|
|
|
|
|
|
'default' => '', |
|
144
|
|
|
|
|
|
|
'index' => 1, |
|
145
|
|
|
|
|
|
|
'primary' => 1 |
|
146
|
|
|
|
|
|
|
), |
|
147
|
|
|
|
|
|
|
'file' => pssql::row( |
|
148
|
|
|
|
|
|
|
undef, |
|
149
|
|
|
|
|
|
|
'type' => 'VARCHAR', |
|
150
|
|
|
|
|
|
|
'length' => ( $short ? 150 : 255 ), |
|
151
|
|
|
|
|
|
|
'default' => '', |
|
152
|
|
|
|
|
|
|
'index' => 1, |
|
153
|
|
|
|
|
|
|
'primary' => 1 |
|
154
|
|
|
|
|
|
|
), |
|
155
|
|
|
|
|
|
|
'tth' => pssql::row( undef, 'type' => 'VARCHAR', 'length' => 40, 'default' => '', 'index' => 1 ), |
|
156
|
|
|
|
|
|
|
'size' => pssql::row( undef, 'type' => 'BIGINT', 'index' => 1, ), |
|
157
|
|
|
|
|
|
|
'time' => pssql::row( 'time', ), #'index' => 1, |
|
158
|
|
|
|
|
|
|
#'added' => pssql::row( 'added', ), |
|
159
|
|
|
|
|
|
|
#'exists' => pssql::row( undef, 'type' => 'SMALLINT', 'index' => 1, ), |
|
160
|
|
|
|
|
|
|
'hit' => pssql::row( undef, 'type' => 'INTEGER UNSIGNED NOT NULL DEFAULT 0 ', ), |
|
161
|
|
|
|
|
|
|
'sch' => pssql::row( undef, 'type' => 'INTEGER UNSIGNED NOT NULL DEFAULT 0', ), |
|
162
|
|
|
|
|
|
|
}, |
|
163
|
|
|
|
|
|
|
); |
|
164
|
0
|
0
|
|
|
|
|
if ( $self->{db} ) { |
|
165
|
|
|
|
|
|
|
#warn 'preFL',Dumper $self->{db}{table}; #$config{'sql'}; |
|
166
|
0
|
|
|
|
|
|
$self->{db}{table}{$_} = $table{$_} for keys %table; |
|
167
|
0
|
|
|
|
|
|
$self->{db}{upgrade} = $_{upgrade}; |
|
168
|
|
|
|
|
|
|
} |
|
169
|
0
|
|
|
|
|
|
local %_ = ( 'table' => \%table, ); |
|
170
|
0
|
|
0
|
|
|
|
$self->{sql}{$_} //= $_{$_} for keys %_; |
|
171
|
|
|
|
|
|
|
#warn ('sqlore:',Data::Dumper::Dumper $self->{'sql'}, \%_), |
|
172
|
0
|
0
|
0
|
|
|
|
$self->{db} ||= pssql->new( %{ $self->{'sql'} || {} }, ); |
|
|
0
|
|
|
|
|
|
|
|
173
|
0
|
|
|
|
|
|
( $tq, $rq, $vq ) = $self->{db}->quotes(); |
|
174
|
|
|
|
|
|
|
#$self->log('db', Dumper $self->{db}); |
|
175
|
|
|
|
|
|
|
#$self->log('db', 'flist', $self->{db}); |
|
176
|
|
|
|
|
|
|
} |
|
177
|
|
|
|
|
|
|
$self->{filelist_make} //= sub { |
|
178
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
179
|
0
|
|
|
|
|
|
my $notth; |
|
180
|
0
|
0
|
|
|
|
|
return unless psmisc::lock( 'sharescan', timeout => 0, old => 86400 ); |
|
181
|
|
|
|
|
|
|
#$self->log( 'err', "sorry, cant load Net::DirectConnect::TigerHash for hashing" ), $notth = 1, |
|
182
|
|
|
|
|
|
|
# unless Net::DirectConnect::use_try 'Net::DirectConnect::TigerHash'; #( $INC{"Net/DirectConnect/TigerHash.pm"} ); |
|
183
|
|
|
|
|
|
|
#$self->log( 'info',"ntth=[$notth]"); exit; |
|
184
|
0
|
0
|
|
|
|
|
$self->log( 'err', 'forced db upgrade on make' ), $self->{db}->upgrade() if $self->{upgrade_force}; |
|
185
|
0
|
|
|
|
|
|
my $stopscan; |
|
186
|
0
|
|
|
|
|
|
my $level = 0; |
|
187
|
0
|
|
|
|
|
|
my $levelreal = 0; |
|
188
|
0
|
|
|
|
|
|
my ( $sharesize, $sharefiles ); |
|
189
|
0
|
|
|
|
|
|
my $interrupted; |
|
190
|
|
|
|
|
|
|
my $printinfo = sub () { |
|
191
|
0
|
|
|
|
|
|
$self->log( 'sharesize', psmisc::human( 'size', $sharesize ), $sharefiles, scalar keys %{ $self->{share_full} } ); |
|
|
0
|
|
|
|
|
|
|
|
192
|
0
|
|
|
|
|
|
}; |
|
193
|
0
|
|
|
|
|
|
local $SIG{INT} = sub { ++$stopscan; ++$interrupted; $self->log( 'warn', "INT rec, stopscan" ) }; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
194
|
0
|
|
|
|
|
|
local $SIG{INFO} = sub { $printinfo->(); }; |
|
|
0
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
#$self->{'INF'}{'ID'} |
|
196
|
0
|
0
|
|
|
|
|
psmisc::file_rewrite $self->{files}, qq{ |
|
197
|
|
|
|
|
|
|
{'INF'}{'ID'} ? () : qq{CID="$self->{'INF'}{'ID'}" } ), |
|
198
|
|
|
|
|
|
|
qq{Base="/" Generator="Net::DirectConnect $Net::DirectConnect::VERSION"> |
|
199
|
|
|
|
|
|
|
}; |
|
200
|
|
|
|
|
|
|
# |
|
201
|
|
|
|
|
|
|
#}; |
|
202
|
0
|
|
|
|
|
|
my %o; |
|
203
|
0
|
|
|
|
|
|
my $o = sub { our $n; $o{ $_[0] } = ++$n; @_ }; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
204
|
0
|
|
|
|
|
|
our %table2filelist = ( |
|
205
|
|
|
|
|
|
|
$o->( file => 'Name' ), |
|
206
|
|
|
|
|
|
|
$o->( size => 'Size' ), |
|
207
|
|
|
|
|
|
|
$o->( tth => 'TTH' ), |
|
208
|
|
|
|
|
|
|
$o->( time => 'TS' ), |
|
209
|
|
|
|
|
|
|
$o->( hit => 'HIT' ), |
|
210
|
|
|
|
|
|
|
$o->( sch => 'SCH' ) |
|
211
|
|
|
|
|
|
|
); |
|
212
|
|
|
|
|
|
|
#warn Dumper \%o, \%table2filelist; |
|
213
|
|
|
|
|
|
|
my $filelist_line = sub($) { |
|
214
|
0
|
|
|
|
|
|
for my $f (@_) { |
|
215
|
0
|
0
|
0
|
|
|
|
next if !length $f->{file} or !length $f->{'tth'}; |
|
216
|
|
|
|
|
|
|
#$f = {%$f}; |
|
217
|
0
|
|
|
|
|
|
$sharesize += $f->{size}; |
|
218
|
0
|
0
|
|
|
|
|
++$sharefiles if $f->{size}; |
|
219
|
|
|
|
|
|
|
#$f->{file} = Encode::encode( 'utf8', Encode::decode( $self->{charset_fs}, $f->{file} ) ) if $self->{charset_fs}; |
|
220
|
0
|
|
|
|
|
|
psmisc::file_append $self->{files}, "\t" x $level, |
|
221
|
|
|
|
|
|
|
#qq{\n}; |
|
222
|
|
|
|
|
|
|
qq{
|
|
223
|
0
|
|
|
|
|
|
map { qq{ $table2filelist{$_}="} . psmisc::html_chars( $a = $f->{$_} ) . qq{"} } |
|
224
|
0
|
0
|
|
|
|
|
sort { $o{$a} <=> $o{$b} } grep { $table2filelist{$_} and $f->{$_} } keys %$f |
|
|
0
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
), |
|
226
|
|
|
|
|
|
|
qq{/>\n}; |
|
227
|
|
|
|
|
|
|
#$self->{share_full}{ $f->{tth} } = $f->{full} if $f->{tth}; $self->{share_full}{ $f->{file} } ||= $f->{full}; |
|
228
|
0
|
|
0
|
|
|
|
$f->{'full'} ||= $f->{'path'} . '/' . $f->{'file'}; |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
=cu |
|
231
|
|
|
|
|
|
|
$self->{share_full}{ $f->{'tth'} } = $f->{'full_local'}, $self->{share_tth}{ $f->{'full_local'} } = $f->{'tth'}, |
|
232
|
|
|
|
|
|
|
$self->{share_tth}{ $f->{'file'} } = $f->{'tth'}, |
|
233
|
|
|
|
|
|
|
if $f->{'tth'}; |
|
234
|
|
|
|
|
|
|
$self->{share_full}{ $f->{'file'} } ||= $f->{'full_local'}; |
|
235
|
|
|
|
|
|
|
=cut |
|
236
|
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
#$self->log 'set share', "[$f->{file}], [$f->{tth}] = [$self->{share_full}{ $f->{tth} }],[$self->{share_full}{ $f->{file} }]"; |
|
238
|
|
|
|
|
|
|
#$self->log Dumper $self->{share_full}; |
|
239
|
|
|
|
|
|
|
} |
|
240
|
0
|
|
|
|
|
|
}; |
|
241
|
0
|
|
|
|
|
|
my $scandir; |
|
242
|
|
|
|
|
|
|
$scandir = sub (@) { |
|
243
|
0
|
|
|
|
|
|
for my $dir (@_) { |
|
244
|
|
|
|
|
|
|
#$self->log( 'scandir', $dir, 'charset', $self->{charset_fs} ); |
|
245
|
|
|
|
|
|
|
#$self->log( 'warn', 'stopscan', $stopscan), |
|
246
|
0
|
0
|
|
|
|
|
last if $stopscan; |
|
247
|
0
|
|
|
|
|
|
$dir =~ tr{\\}{/}; |
|
248
|
0
|
|
|
|
|
|
$dir =~ s{/+$}{}; |
|
249
|
0
|
0
|
|
|
|
|
opendir( my $dh, $dir ) or ( $self->log( 'err', "can't opendir [$dir]: $!\n" ), next ); |
|
250
|
|
|
|
|
|
|
#$self->log( 'dev','sd', __LINE__,$dh); |
|
251
|
|
|
|
|
|
|
#@dots = |
|
252
|
0
|
|
|
|
|
|
( my $dirname = $dir ); |
|
253
|
0
|
0
|
|
|
|
|
$dirname = |
|
254
|
|
|
|
|
|
|
#Encode::encode 'utf8', |
|
255
|
|
|
|
|
|
|
Encode::decode $self->{charset_fs}, $dirname, Encode::FB_WARN if $self->{charset_fs}; |
|
256
|
|
|
|
|
|
|
#$self->log( 'dev','sd', __LINE__,$dh); |
|
257
|
0
|
0
|
0
|
|
|
|
next if skip( $dirname, $self->{skip_dir} ) or ( $self->{skip_symlink} and -l $dirname ); |
|
|
|
|
0
|
|
|
|
|
|
258
|
0
|
0
|
|
|
|
|
unless ($level) { |
|
259
|
0
|
|
|
|
|
|
for ( split '/', $dirname ) { |
|
260
|
0
|
0
|
|
|
|
|
psmisc::file_append( $self->{files}, "\t" x $level, qq{\n} ), ++$level, if length $_; |
|
261
|
|
|
|
|
|
|
} |
|
262
|
|
|
|
|
|
|
} else { |
|
263
|
0
|
|
|
|
|
|
$dirname =~ |
|
264
|
|
|
|
|
|
|
#W s/^\w://; |
|
265
|
|
|
|
|
|
|
#$dirname =~ |
|
266
|
|
|
|
|
|
|
s{.*/}{}; |
|
267
|
0
|
0
|
|
|
|
|
psmisc::file_append( $self->{files}, "\t" x $level, qq{\n} ), ++$level, ++$levelreal, |
|
268
|
|
|
|
|
|
|
if length $dirname; |
|
269
|
|
|
|
|
|
|
} |
|
270
|
|
|
|
|
|
|
#$self->log( 'dev','sd', __LINE__,$dh); |
|
271
|
|
|
|
|
|
|
#Net::DirectConnect:: |
|
272
|
0
|
|
0
|
|
|
|
psmisc::schedule( [ 10, 10 ], our $my_every_10sec_sub__ ||= sub { $printinfo->() } ); |
|
|
0
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
#$self->log( 'readdir', ); |
|
274
|
0
|
|
|
|
|
|
FILE: for my $file ( readdir($dh) ) { |
|
275
|
|
|
|
|
|
|
#$self->log( 'scanfile', $file, ); |
|
276
|
|
|
|
|
|
|
#$self->log( 'warn', 'stopscan', $stopscan), |
|
277
|
0
|
0
|
|
|
|
|
last if $stopscan; |
|
278
|
0
|
0
|
|
|
|
|
next if $file =~ /^\.\.?$/; |
|
279
|
|
|
|
|
|
|
#$file = Encode::encode( 'utf8', Encode::decode( $self->{charset_fs}, $file ) ) if $self->{charset_fs}; |
|
280
|
0
|
|
|
|
|
|
my $f = { path => $dir, path_local => $dir, file => $file, file_local => $file, full_local => "$dir/$file", }; |
|
281
|
|
|
|
|
|
|
#$f->{full_local} = "$f->{path_local}/$f->{file_local}"; |
|
282
|
|
|
|
|
|
|
#print("d $f->{full}:\n"), |
|
283
|
0
|
|
|
|
|
|
$f->{dir} = -d $f->{full_local}; |
|
284
|
|
|
|
|
|
|
#filelist_line($f), |
|
285
|
0
|
0
|
|
|
|
|
if ( $f->{dir} ) { |
|
286
|
|
|
|
|
|
|
#next FILE if skip ($f->{file}, $self->{skip_dir}); |
|
287
|
0
|
|
|
|
|
|
$scandir->( $f->{full_local} ); |
|
288
|
0
|
|
|
|
|
|
next; |
|
289
|
|
|
|
|
|
|
} |
|
290
|
0
|
0
|
|
|
|
|
$f->{size} = -s $f->{full_local} if -f $f->{full_local}; |
|
291
|
0
|
0
|
|
|
|
|
next if $f->{size} < $self->{file_min}; |
|
292
|
0
|
0
|
|
|
|
|
$f->{file} = #Encode::encode 'utf8', |
|
293
|
|
|
|
|
|
|
Encode::decode $self->{charset_fs}, $f->{file}, Encode::FB_WARN if $self->{charset_fs}; |
|
294
|
0
|
0
|
|
|
|
|
$f->{path} = #Encode::encode 'utf8', |
|
295
|
|
|
|
|
|
|
Encode::decode $self->{charset_fs}, $f->{path}, Encode::FB_WARN if $self->{charset_fs}; |
|
296
|
0
|
0
|
0
|
|
|
|
next FILE if skip( $f->{file}, $self->{skip_file} ) or ( $self->{skip_symlink} and -l $f->{file} ); |
|
|
|
|
0
|
|
|
|
|
|
297
|
|
|
|
|
|
|
#$self->log( 'encfile', $f->{file} , "chs:$self->{charset_fs}"); |
|
298
|
0
|
|
|
|
|
|
$f->{full} = "$f->{path}/$f->{file}"; |
|
299
|
0
|
|
|
|
|
|
$f->{time} = int( $^T - 86400 * -M $f->{full_local} ); #time() - |
|
300
|
|
|
|
|
|
|
#$self->log 'timed', $f->{time}, psmisc::human('date_time', $f->{time}), -M $f->{full_local}, int (86400 * -M $f->{full_local}), $^T; |
|
301
|
|
|
|
|
|
|
#'res=', |
|
302
|
|
|
|
|
|
|
#join "\n", grep { !/^\.\.?/ and |
|
303
|
|
|
|
|
|
|
#/^\./ && -f "$dir/$_" } |
|
304
|
|
|
|
|
|
|
#print " ", $file; |
|
305
|
|
|
|
|
|
|
#todo - select not all cols |
|
306
|
|
|
|
|
|
|
# $self->log('preselect', $self->{no_sql}); |
|
307
|
0
|
0
|
|
|
|
|
unless ( $self->{no_sql} ) { |
|
308
|
|
|
|
|
|
|
#$self->log('select go',);# Dumper $f); |
|
309
|
0
|
|
|
|
|
|
my $indb = |
|
310
|
|
|
|
|
|
|
$self->{db}->line( "SELECT * FROM ${tq}filelist${tq} WHERE" |
|
311
|
|
|
|
|
|
|
. " ${rq}path${rq}=" |
|
312
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{path} ) |
|
313
|
|
|
|
|
|
|
. " AND ${rq}file${rq}=" |
|
314
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{file} ) |
|
315
|
|
|
|
|
|
|
. " AND ${rq}size${rq}=" |
|
316
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{size} ) |
|
317
|
|
|
|
|
|
|
. " AND ${rq}time${rq}=" |
|
318
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{time} ) |
|
319
|
|
|
|
|
|
|
. " LIMIT 1" ); |
|
320
|
|
|
|
|
|
|
#$self->log('select', Dumper $indb); |
|
321
|
|
|
|
|
|
|
#$self->log ('dev', 'already scaned', $indb->{size}), |
|
322
|
0
|
0
|
|
|
|
|
$filelist_line->( { %$f, %$indb } ), next, if $indb->{size} ~~ $f->{size}; |
|
323
|
|
|
|
|
|
|
#$db->select('filelist', {path=>$f->{path},file=>$f->{file}, }); |
|
324
|
|
|
|
|
|
|
#$self->log Dumper ; |
|
325
|
|
|
|
|
|
|
#print "\n"; |
|
326
|
|
|
|
|
|
|
#my $tth; |
|
327
|
0
|
0
|
|
|
|
|
if ( $f->{size} > $self->{tth_cheat} ) { |
|
328
|
0
|
0
|
|
|
|
|
my $indb = |
|
329
|
|
|
|
|
|
|
$self->{db}->line( "SELECT * FROM ${tq}filelist${tq} WHERE " |
|
330
|
|
|
|
|
|
|
. "${rq}file${rq}=" |
|
331
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{file} ) |
|
332
|
|
|
|
|
|
|
. " AND ${rq}size${rq}=" |
|
333
|
|
|
|
|
|
|
. $self->{db}->quote( $f->{size} ) |
|
334
|
|
|
|
|
|
|
. ( $self->{tth_cheat_no_date} ? () : " AND ${rq}time${rq}=" . $self->{db}->quote( $f->{time} ) ) |
|
335
|
|
|
|
|
|
|
. " LIMIT 1" ); |
|
336
|
|
|
|
|
|
|
#$self->log 'sel', Dumper $indb; |
|
337
|
0
|
0
|
|
|
|
|
if ( $indb->{tth} ) { |
|
338
|
0
|
|
|
|
|
|
$self->log( 'dev', "already summed", %$f, ' as ', %$indb ); |
|
339
|
0
|
|
0
|
|
|
|
$f->{$_} ||= $indb->{$_} for keys %$indb; |
|
340
|
|
|
|
|
|
|
#filelist_line($f); |
|
341
|
|
|
|
|
|
|
#next; |
|
342
|
|
|
|
|
|
|
} |
|
343
|
|
|
|
|
|
|
} |
|
344
|
|
|
|
|
|
|
} |
|
345
|
0
|
0
|
0
|
|
|
|
if ( !$notth and !$f->{tth} ) { |
|
346
|
|
|
|
|
|
|
#$self->log 'calc', $f->{full}, "notth=[$notth]"; |
|
347
|
0
|
|
|
|
|
|
my $time = time(); |
|
348
|
0
|
|
|
|
|
|
$f->{tth} = $self->hash_file( $f->{full_local} ); |
|
349
|
0
|
|
|
|
|
|
my $per = time - $time; |
|
350
|
0
|
0
|
0
|
|
|
|
$self->log( |
|
351
|
|
|
|
|
|
|
'time', $f->{full}, psmisc::human( 'size', $f->{size} ), |
|
352
|
|
|
|
|
|
|
'per', psmisc::human( 'time_period', $per ), |
|
353
|
|
|
|
|
|
|
'speed ps', psmisc::human( 'size', $f->{size} / ( $per or 1 ) ), |
|
354
|
|
|
|
|
|
|
'total', psmisc::human( 'size', $sharesize ) |
|
355
|
|
|
|
|
|
|
) |
|
356
|
|
|
|
|
|
|
if |
|
357
|
|
|
|
|
|
|
#$f->{size} > 100_000 or |
|
358
|
|
|
|
|
|
|
$per > 1; |
|
359
|
|
|
|
|
|
|
} |
|
360
|
|
|
|
|
|
|
#$f->{tth} = $f->{size} > 1_000_000 ? 'bigtth' : tthfile( $f->{full} ); #if -f $full; |
|
361
|
|
|
|
|
|
|
#print Dumper $self->{share_full}; |
|
362
|
|
|
|
|
|
|
#next; |
|
363
|
|
|
|
|
|
|
#print ' ', tthfile($full) if -f $full ; #and -s $full < 1_000_000; |
|
364
|
|
|
|
|
|
|
#print ' ', $f->{tth}; |
|
365
|
|
|
|
|
|
|
#print ' ', $f->{size}; #if -f $f->{full}; |
|
366
|
|
|
|
|
|
|
#print join ':',-M $f->{full}, $^T + 86400 * -M $f->{full},$f->{time}; |
|
367
|
|
|
|
|
|
|
#print "\n"; |
|
368
|
0
|
|
|
|
|
|
$filelist_line->($f); |
|
369
|
0
|
0
|
0
|
|
|
|
$self->{db}->insert_hash( 'filelist', $f ) if !$self->{no_sql} and $f->{tth}; |
|
370
|
|
|
|
|
|
|
} |
|
371
|
0
|
|
|
|
|
|
--$level; |
|
372
|
0
|
|
|
|
|
|
--$levelreal; |
|
373
|
0
|
|
|
|
|
|
psmisc::file_append $self->{files}, "\t" x $level, qq{\n}; # |
|
374
|
0
|
|
|
|
|
|
closedir $dh; |
|
375
|
|
|
|
|
|
|
} |
|
376
|
0
|
0
|
|
|
|
|
if ( $levelreal < 0 ) { |
|
377
|
|
|
|
|
|
|
#psmisc::file_append $self->{files}, "\n"; |
|
378
|
0
|
|
|
|
|
|
psmisc::file_append $self->{files}, "\t" x $level, qq{\n} while --$level >= 0; |
|
379
|
0
|
|
|
|
|
|
$levelreal = $level = 0; |
|
380
|
|
|
|
|
|
|
} |
|
381
|
|
|
|
|
|
|
#$level |
|
382
|
0
|
|
|
|
|
|
}; |
|
383
|
|
|
|
|
|
|
#else { |
|
384
|
0
|
0
|
|
|
|
|
$self->log( |
|
385
|
|
|
|
|
|
|
'info', "making filelist $self->{files} from", |
|
386
|
0
|
|
|
|
|
|
@_, @{ $self->{'share'} || [] }, |
|
387
|
|
|
|
|
|
|
'EXISTS=', |
|
388
|
0
|
0
|
|
|
|
|
grep { -d } @_, |
|
389
|
0
|
|
|
|
|
|
@{ $self->{'share'} || [] }, |
|
390
|
|
|
|
|
|
|
); |
|
391
|
|
|
|
|
|
|
#$self->{db}->do('ANALYZE filelist') unless $self->{no_sql}; |
|
392
|
0
|
0
|
|
|
|
|
$self->{db}->analyze('filelist') unless $self->{no_sql}; |
|
393
|
0
|
|
|
|
|
|
local %_; |
|
394
|
0
|
0
|
|
|
|
|
$scandir->($_) for ( grep { !$_{$_}++ and -d } @_, @{ $self->{'share'} || [] }, ); |
|
|
0
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
#undef $SIG{INT}; |
|
396
|
|
|
|
|
|
|
#undef $SIG{INFO}; |
|
397
|
0
|
|
|
|
|
|
psmisc::file_append $self->{files}, qq{}; |
|
398
|
0
|
|
|
|
|
|
psmisc::file_append $self->{files}; |
|
399
|
0
|
0
|
|
|
|
|
$self->{db}->flush_insert() unless $self->{no_sql}; |
|
400
|
0
|
|
|
|
|
|
local $_; |
|
401
|
0
|
0
|
0
|
|
|
|
if ( |
|
|
|
|
0
|
|
|
|
|
|
402
|
|
|
|
|
|
|
psmisc::use_try 'IO::Compress::Bzip2' |
|
403
|
|
|
|
|
|
|
and ($_ = !IO::Compress::Bzip2::bzip2( $self->{files} => $self->{files} . '.bz2' ) |
|
404
|
|
|
|
|
|
|
or $self->log( "bzip2 failed: ", $IO::Compress::Bzip2::Bzip2Error ) and 0 ) |
|
405
|
|
|
|
|
|
|
) |
|
406
|
|
|
|
|
|
|
{ |
|
407
|
|
|
|
|
|
|
#$self->log('bzip',$self->{files} => $self->{files} . '.bz2'); |
|
408
|
0
|
|
|
|
|
|
() = $IO::Compress::Bzip2::Bzip2Error; #no warning |
|
409
|
|
|
|
|
|
|
} else { |
|
410
|
0
|
|
|
|
|
|
$self->log( 'dev', 'using system bzip2', $_, $!, ':', `bzip2 --force --keep "$self->{files}"` ); |
|
411
|
|
|
|
|
|
|
} |
|
412
|
|
|
|
|
|
|
#unless $interrupted; |
|
413
|
|
|
|
|
|
|
#$self->{share_full}{ $self->{files} . '.bz2' } = $self->{files} . '.bz2'; $self->{share_full}{ $self->{files} } = $self->{files}; |
|
414
|
|
|
|
|
|
|
#} |
|
415
|
0
|
|
|
|
|
|
psmisc::unlock('sharescan'); |
|
416
|
0
|
|
|
|
|
|
$printinfo->(); |
|
417
|
|
|
|
|
|
|
#$SIG{INT} = $SIG{KILL} = undef; |
|
418
|
0
|
|
|
|
|
|
return ( $sharesize, $sharefiles ); |
|
419
|
0
|
|
0
|
|
|
|
}; |
|
420
|
|
|
|
|
|
|
$self->{share_add_file} //= sub { |
|
421
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
422
|
0
|
|
|
|
|
|
my ( $full_local, $tth, $file ) = @_; |
|
423
|
0
|
0
|
|
|
|
|
$full_local =~ m{([^/\\]+)$} unless $file; |
|
424
|
0
|
|
0
|
|
|
|
$file //= $1; # unless length $file; |
|
425
|
|
|
|
|
|
|
#$full_local = Encode::encode $self->{charset_fs}, Encode::decode 'utf8', $full_local; |
|
426
|
0
|
0
|
|
|
|
|
$self->{share_full}{$tth} = $full_local, $self->{share_tth}{$full_local} = $tth, $self->{share_tth}{$file} = $tth, if $tth; |
|
427
|
0
|
0
|
0
|
|
|
|
$self->{share_full}{$file} ||= $full_local if $file; |
|
428
|
|
|
|
|
|
|
#$self->share_changed(); |
|
429
|
0
|
|
0
|
|
|
|
}; |
|
430
|
|
|
|
|
|
|
$self->{share_changed} //= sub { |
|
431
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
432
|
|
|
|
|
|
|
#$self->log('dev', "share_changed"); |
|
433
|
0
|
0
|
|
|
|
|
if ( $self->{'status'} eq 'connected' ) { |
|
434
|
0
|
0
|
|
|
|
|
if ( $self->{adc} ) { $self->cmd( 'I', 'INF', undef, 'SS', 'SF' ); } |
|
|
0
|
|
|
|
|
|
|
|
435
|
0
|
|
|
|
|
|
else { $self->cmd('MyINFO'); } |
|
436
|
|
|
|
|
|
|
} |
|
437
|
0
|
|
0
|
|
|
|
}; |
|
438
|
|
|
|
|
|
|
$self->{filelist_load} //= sub { #{'cmd'} |
|
439
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
440
|
0
|
0
|
|
|
|
|
$self->log( 'err', 'forced db upgrade on load' ), $self->{db}->upgrade() if $self->{upgrade_force}; |
|
441
|
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
=old |
|
443
|
|
|
|
|
|
|
if ( $config{filelist} and open my $f, '<', $config{filelist} ) { |
|
444
|
|
|
|
|
|
|
$self->log "loading filelist.."; |
|
445
|
|
|
|
|
|
|
local $/ = '<'; |
|
446
|
|
|
|
|
|
|
while (<$f>) { |
|
447
|
|
|
|
|
|
|
if ( my ( $file, $time, $tiger ) = /^File Name="([^"]+)" TimeStamp="(\d+)" Root="([^"]+)"/i ) { |
|
448
|
|
|
|
|
|
|
#$self->{'share_tth'}{ $params->{TR} } |
|
449
|
|
|
|
|
|
|
$file =~ tr{\\}{/}; |
|
450
|
|
|
|
|
|
|
$self->{share_full}{$tiger} = $file; |
|
451
|
|
|
|
|
|
|
$self->{share_tth}{$file} = $tiger; |
|
452
|
|
|
|
|
|
|
} |
|
453
|
|
|
|
|
|
|
# |
|
454
|
|
|
|
|
|
|
} |
|
455
|
|
|
|
|
|
|
close $f; |
|
456
|
|
|
|
|
|
|
$self->log ".done:", ( scalar keys %{ $self->{share_full} } ), "\n"; |
|
457
|
|
|
|
|
|
|
} |
|
458
|
|
|
|
|
|
|
=cut |
|
459
|
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
#$self->log( "filelist_load try", $global{shareloaded}, -s $self->{files}, ); #ref $_[0] |
|
461
|
|
|
|
|
|
|
return |
|
462
|
0
|
0
|
0
|
|
|
|
if !$self->{files} |
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
463
|
|
|
|
|
|
|
or $Net::DirectConnect::global{shareloaded} == -s $self->{files} |
|
464
|
|
|
|
|
|
|
or |
|
465
|
|
|
|
|
|
|
( $Net::DirectConnect::global{shareloaded} and !psmisc::lock( 'sharescan', readonly => 1, timeout => 0, old => 86400 ) ) |
|
466
|
|
|
|
|
|
|
or !open my $f, '<:encoding(utf8)', $self->{files}; |
|
467
|
0
|
|
|
|
|
|
my ( $sharesize, $sharefiles ); |
|
468
|
|
|
|
|
|
|
#$self->log( 'info', "loading filelist", -s $f ); |
|
469
|
0
|
|
|
|
|
|
$Net::DirectConnect::global{shareloaded} = -s $f; |
|
470
|
0
|
|
|
|
|
|
local $/ = '<'; |
|
471
|
0
|
|
|
|
|
|
%{ $self->{share_full} } = %{ $self->{share_tth} } = (); |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
472
|
0
|
|
|
|
|
|
my $dir; |
|
473
|
0
|
|
|
|
|
|
while (<$f>) { |
|
474
|
|
|
|
|
|
|
# |
|
475
|
|
|
|
|
|
|
# |
|
476
|
0
|
0
|
|
|
|
|
if ( my ( $file, $size, $tth, $ts ) = m{^File Name="([^"]+)" Size="(\d+)" TTH="([^"]+)"}i ) { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
477
|
0
|
|
|
|
|
|
my $full_local = ( my $full = "$dir/$file" ); |
|
478
|
|
|
|
|
|
|
#$self->log 'loaded', $dir, $file , $full; |
|
479
|
|
|
|
|
|
|
#$full_local = Encode::encode $self->{charset_fs}, $full if $self->{charset_fs}; |
|
480
|
0
|
|
|
|
|
|
$full_local = Encode::encode $self->{charset_fs}, |
|
481
|
|
|
|
|
|
|
#Encode::decode 'utf8', |
|
482
|
|
|
|
|
|
|
$full_local, Encode::FB_WARN; |
|
483
|
0
|
|
|
|
|
|
$self->share_add_file( $full_local, $tth, $file ); |
|
484
|
0
|
|
|
|
|
|
++$sharefiles; |
|
485
|
0
|
|
|
|
|
|
$sharesize += $size; |
|
486
|
|
|
|
|
|
|
#$self->{'share_tth'}{ $params->{TR} } |
|
487
|
|
|
|
|
|
|
#$file =~ tr{\\}{/}; |
|
488
|
|
|
|
|
|
|
} elsif ( my ($curdir) = m{^Directory Name="([^"]+)">}i ) { #"mcedit |
|
489
|
0
|
0
|
0
|
|
|
|
$dir .= ( ( !length $dir and $^O ~~ [ 'MSWin32', 'cygwin' ] ) ? () : '/' ) . $curdir; |
|
490
|
|
|
|
|
|
|
#$self->log 'now in', $dir; |
|
491
|
|
|
|
|
|
|
#$self->{files} |
|
492
|
|
|
|
|
|
|
} elsif (m{^/Directory>}i) { |
|
493
|
0
|
|
|
|
|
|
$dir =~ s{(?:^|/)[^/]+$}{}; |
|
494
|
|
|
|
|
|
|
#$self->log 'now ba', $dir; |
|
495
|
|
|
|
|
|
|
} |
|
496
|
|
|
|
|
|
|
} |
|
497
|
0
|
|
|
|
|
|
$self->{share_full}{ $self->{files} . '.bz2' } = $self->{files} . '.bz2'; |
|
498
|
0
|
|
|
|
|
|
$self->{share_full}{ $self->{files} } = $self->{files}; |
|
499
|
|
|
|
|
|
|
# $self->{'INF'}{'SS'} = $self->{'sharesize'} = $sharesize; |
|
500
|
|
|
|
|
|
|
# $self->{'INF'}{'SF'} = $sharefiles; |
|
501
|
0
|
|
|
|
|
|
$self->log( |
|
502
|
|
|
|
|
|
|
'info', |
|
503
|
|
|
|
|
|
|
"loaded filelist size", |
|
504
|
|
|
|
|
|
|
$Net::DirectConnect::global{shareloaded}, |
|
505
|
|
|
|
|
|
|
' : files=', $sharefiles, 'bytes=', |
|
506
|
|
|
|
|
|
|
psmisc::human( 'size', $sharesize ), |
|
507
|
0
|
|
|
|
|
|
scalar keys %{ $self->{share_full} }, |
|
508
|
|
|
|
|
|
|
"bzsize=", -s $self->{files} . '.bz2', |
|
509
|
|
|
|
|
|
|
); |
|
510
|
0
|
|
|
|
|
|
psmisc::unlock('sharescan'); |
|
511
|
|
|
|
|
|
|
#$_[0]->( $sharesize, $sharefiles ) if ref $_[0] ~~ 'CODE'; |
|
512
|
|
|
|
|
|
|
#( $self->{share_size} , $self->{share_files} ) = ( $sharesize, $sharefiles ); |
|
513
|
0
|
0
|
|
|
|
|
$sharefiles *= $self->{sharefiles_mul} if $self->{sharefiles_mul}; |
|
514
|
0
|
|
|
|
|
|
$sharefiles += $self->{sharefiles_add}; |
|
515
|
0
|
0
|
|
|
|
|
$sharesize *= $self->{sharesize_mul} if $self->{sharesize_mul}; |
|
516
|
0
|
|
|
|
|
|
$sharesize += $self->{sharesize_add}; |
|
517
|
0
|
0
|
|
|
|
|
$self->{sharefiles} = $self->{INF}{SF} = $sharefiles, $self->{INF}{SS} = $self->{sharesize} = $sharesize, if $sharesize; |
|
518
|
0
|
|
|
|
|
|
$self->share_changed(); |
|
519
|
0
|
|
|
|
|
|
return ( $sharesize, $sharefiles ); |
|
520
|
0
|
|
0
|
|
|
|
}; |
|
521
|
|
|
|
|
|
|
$self->{search_stat_update} = sub { |
|
522
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
523
|
0
|
0
|
|
|
|
|
my $tth = shift or return; |
|
524
|
0
|
|
0
|
|
|
|
my $field = shift || 'hit'; |
|
525
|
0
|
0
|
|
|
|
|
my $updated = $self->{db}->do( |
|
526
|
|
|
|
|
|
|
"UPDATE ${tq}filelist${tq} SET ${rq}$field${rq}=${rq}$field${rq}+${vq}1${vq} WHERE " |
|
527
|
|
|
|
|
|
|
#$self->{db}->do( "UPDATE ${tq}filelist${tq} SET ${rq}$field${rq}=${rq}$field${rq}+1 WHERE " |
|
528
|
|
|
|
|
|
|
#$self->{db}->do( "UPDATE ${tq}filelist${tq} SET $field=$field+1 WHERE " |
|
529
|
|
|
|
|
|
|
. "${rq}tth${rq}=" . $self->{db}->quote($tth) |
|
530
|
|
|
|
|
|
|
#. ( $self->{db}{no_update_limit} ? () : " LIMIT ${vq}2${vq}" ) ); |
|
531
|
|
|
|
|
|
|
. ( $self->{db}{no_update_limit} ? () : " LIMIT 1" ) |
|
532
|
|
|
|
|
|
|
); |
|
533
|
0
|
0
|
|
|
|
|
$self->log( 'dev', "counter $field increased[$updated] on [$tth]" ) if $updated; |
|
534
|
0
|
|
|
|
|
|
}; |
|
535
|
|
|
|
|
|
|
$self->{handler_int}{Search} //= sub { |
|
536
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
537
|
|
|
|
|
|
|
#$self->log ( 'dev', 'Search stat', Dumper @_) ; |
|
538
|
|
|
|
|
|
|
#$self->log ( 'dev', 'Search stat', Dumper $_[1]{tth}) ; |
|
539
|
0
|
|
|
|
|
|
$self->search_stat_update( $_[1]{tth}, 'sch' ); |
|
540
|
0
|
|
0
|
|
|
|
}; |
|
541
|
|
|
|
|
|
|
$self->{handler_int}{SCH} //= sub { |
|
542
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
543
|
|
|
|
|
|
|
#$self->log ( 'dev', 'SCH stat', Dumper @_) ; |
|
544
|
0
|
|
|
|
|
|
$self->search_stat_update( $_[-1]{TR}, 'sch' ); |
|
545
|
0
|
|
0
|
|
|
|
}; |
|
546
|
|
|
|
|
|
|
$self->{'periodic'}{ __FILE__ . __LINE__ } = sub { |
|
547
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
548
|
|
|
|
|
|
|
#$self->log ( 'periodic in filelist', $self->{filelist_scan}, caller ); |
|
549
|
|
|
|
|
|
|
psmisc::schedule( |
|
550
|
|
|
|
|
|
|
#[10, $self->{filelist_scan}], |
|
551
|
|
|
|
|
|
|
$self->{filelist_scan}, |
|
552
|
|
|
|
|
|
|
our $sharescan_sub__ ||= sub { |
|
553
|
0
|
|
|
|
|
|
my $self = shift; |
|
554
|
0
|
|
|
|
|
|
$self->log( |
|
555
|
|
|
|
|
|
|
'info', |
|
556
|
|
|
|
|
|
|
'filelist actual age seconds:', |
|
557
|
|
|
|
|
|
|
( time - $^T + 86400 * -M $self->{files} ), |
|
558
|
|
|
|
|
|
|
'<', $self->{filelist_scan} |
|
559
|
|
|
|
|
|
|
); |
|
560
|
|
|
|
|
|
|
return |
|
561
|
0
|
0
|
0
|
|
|
|
if -e $self->{files} |
|
|
|
|
0
|
|
|
|
|
|
562
|
|
|
|
|
|
|
and -s $self->{files} > 200 |
|
563
|
|
|
|
|
|
|
and $self->{filelist_scan} > time - $^T + 86400 * -M $self->{files}; |
|
564
|
|
|
|
|
|
|
#$self->log( 'starter==','$0=',$0, $INC{'Net/DirectConnect/filelist.pm'}, $^X, 'share=', @{ $self->{'share'} } ); |
|
565
|
|
|
|
|
|
|
#$0 !~ m{(.*\W)?share.pl$} |
|
566
|
0
|
|
|
|
|
|
!$self->{'filelist_fork'} |
|
567
|
|
|
|
|
|
|
? $self->filelist_make() |
|
568
|
0
|
|
|
|
|
|
: $self->{'filelist_builder'} ? psmisc::start $self->{'filelist_builder'}, @{ $self->{'share'} } : psmisc::start $^X, |
|
569
|
0
|
0
|
|
|
|
|
$INC{'Net/DirectConnect/filelist.pm'}, @{ $self->{'share'} }; |
|
|
|
0
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
#: psmisc::startme( 'filelist', grep { -d } @ARGV ); |
|
571
|
|
|
|
|
|
|
}, |
|
572
|
0
|
0
|
0
|
|
|
|
$self |
|
573
|
|
|
|
|
|
|
) if $self->{filelist_scan}; |
|
574
|
|
|
|
|
|
|
#Net::DirectConnect:: |
|
575
|
|
|
|
|
|
|
psmisc::schedule( |
|
576
|
|
|
|
|
|
|
#10, #dev! 300! |
|
577
|
|
|
|
|
|
|
$self->{filelist_reload}, |
|
578
|
|
|
|
|
|
|
#our $filelist_load_sub__ ||= |
|
579
|
|
|
|
|
|
|
sub { |
|
580
|
0
|
|
|
|
|
|
my $self = shift; |
|
581
|
|
|
|
|
|
|
#psmisc::startme( 'filelist', grep { -d } @ARGV ); |
|
582
|
|
|
|
|
|
|
#my($sharesize,$sharefiles) = |
|
583
|
0
|
|
|
|
|
|
$self->filelist_load( |
|
584
|
|
|
|
|
|
|
#sub { |
|
585
|
|
|
|
|
|
|
#my ( $sharesize, $sharefiles ) = @_; |
|
586
|
|
|
|
|
|
|
#$dc->{INF}{SS} = $sharesize, $dc->{INF}{SF} = $sharefiles, $dc->{sharesize} = $sharesize, if $sharesize; |
|
587
|
|
|
|
|
|
|
##todo! change INF cmd or myinfo |
|
588
|
|
|
|
|
|
|
#} |
|
589
|
|
|
|
|
|
|
); |
|
590
|
|
|
|
|
|
|
}, |
|
591
|
0
|
0
|
|
|
|
|
$self |
|
592
|
|
|
|
|
|
|
) if $self->{filelist_scan}; |
|
593
|
|
|
|
|
|
|
}, |
|
594
|
|
|
|
|
|
|
#psmisc::startme( 'filelist', grep { -d } @ARGV ) if !-e $config{files} or !-e $config{files}.'.bz2'; |
|
595
|
|
|
|
|
|
|
$self->{handler_int}{file_recieved} = sub { |
|
596
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
|
597
|
0
|
|
|
|
|
|
my ( $full, $filename ) = @_; |
|
598
|
|
|
|
|
|
|
#$self->{'file_recv_tth'} = |
|
599
|
0
|
|
|
|
|
|
my ($tth) = $filename =~ m{^TTH/(\w+)}; |
|
600
|
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
=z |
|
602
|
|
|
|
|
|
|
return unless $tth; |
|
603
|
|
|
|
|
|
|
$self->{share_full}{$tth} = $as; |
|
604
|
|
|
|
|
|
|
my ($name) = $as =~ m{^([^/\\]+)$}; |
|
605
|
|
|
|
|
|
|
return unless $name; |
|
606
|
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
$self->{share_full}{$tth} = $full_local, $self->{share_tth}{$full_local} = $tth, $self->{share_tth}{$file} = $tth, |
|
608
|
|
|
|
|
|
|
if $tth; |
|
609
|
|
|
|
|
|
|
$self->{share_full}{$file} ||= $full_local; |
|
610
|
|
|
|
|
|
|
=cut |
|
611
|
|
|
|
|
|
|
|
|
612
|
0
|
0
|
0
|
|
|
|
$self->log( 'dev', 'adding downloaded file to share', $full, $tth ), |
|
613
|
|
|
|
|
|
|
$self->share_add_file( $full, $tth ), $self->share_changed() |
|
614
|
|
|
|
|
|
|
if !$self->{'file_recv_filelist'} and !$self->{'no_auto_share_downloaded'}; # unless $self->{'no_auto_share_downloaded'}; |
|
615
|
|
|
|
|
|
|
#TODO $self->{db}->insert_hash( 'filelist', $f ) if !$self->{no_sql} and $f->{tth}; |
|
616
|
|
|
|
|
|
|
; |
|
617
|
0
|
|
|
|
|
|
}; |
|
618
|
0
|
0
|
|
|
|
|
$self->filelist_load() unless $standalone; # (caller)[0] ~~ __PACKAGE__; |
|
619
|
|
|
|
|
|
|
#$self->log('initok'); |
|
620
|
0
|
|
|
|
|
|
return $self; |
|
621
|
|
|
|
|
|
|
} |
|
622
|
|
|
|
|
|
|
eval q{ #do |
|
623
|
|
|
|
|
|
|
use lib '../..'; |
|
624
|
|
|
|
|
|
|
use Net::DirectConnect; |
|
625
|
|
|
|
|
|
|
print "making\n"; |
|
626
|
|
|
|
|
|
|
__PACKAGE__->new(@ARGV)->{db}->upgrade(), exit if $ARGV[0] eq 'upgrade'; |
|
627
|
|
|
|
|
|
|
__PACKAGE__->new(@ARGV)->filelist_make(@ARGV),; |
|
628
|
|
|
|
|
|
|
}, print $@ unless caller; |
|
629
|
|
|
|
|
|
|
1; |