-
Notifications
You must be signed in to change notification settings - Fork 27
/
banner.coretag
112 lines (108 loc) · 3 KB
/
banner.coretag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
UserTag banner Order category
UserTag banner addAttr
UserTag banner PosNumber 1
UserTag banner Routine <<EOR
sub {
my ($place, $opt) = @_;
sub initialize_banner_directory {
my ($dir, $category, $opt) = @_;
mkdir $dir, 0777 if ! -d $dir;
my $t = $opt->{table} || 'banner';
my $c_field;
my $append = '';
if($category) {
$append = ' AND ';
$append .= ($opt->{c_field} || 'category');
$category =~ s/'/''/g;
$append .= " = '$category'";
}
my $db = database_exists_ref($t);
if(! $db) {
my $weight_file = "$dir/total_weight";
return undef if -f $weight_file;
$t = "no banners db $t\n";
Vend::Util::writefile( $weight_file, $t, $opt);
::logError($t);
return undef;
}
my $w_field = $opt->{w_field} || 'weight';
my $b_field = $opt->{b_field} || 'banner';
my $q = "select $w_field, $b_field from $t where $w_field >= 1$append";
my $banners = $db->query({
query => $q,
st => 'db',
});
my $i = 0;
for(@$banners) {
my ($weight, $text) = @$_;
for(1 .. $weight) {
Vend::Util::writefile(">$dir/$i", $text, $opt);
$i++;
}
}
Vend::Util::writefile(">$dir/total_weight", $i, $opt);
}
sub tag_weighted_banner {
my ($category, $opt) = @_;
my $dir = catfile($Vend::Cfg->{ScratchDir}, 'Banners');
mkdir $dir, 0777 if ! -d $dir;
if($category) {
my $c = $category;
$c =~ s/\W//g;
$dir .= "/$c";
}
my $statfile = $Vend::Cfg->{ConfDir};
$statfile .= "/status.$Vend::Cat";
my $start_time;
if($opt->{once}) {
$start_time = 0;
}
elsif(! -f $statfile) {
Vend::Util::writefile( $statfile, "banners initialized " . time() . "\n");
$start_time = time();
}
else {
$start_time = (stat(_))[9];
}
my $weight_file = "$dir/total_weight";
initialize_banner_directory($dir, $category, $opt)
if (
! -f $weight_file
or
(stat(_))[9] < $start_time
);
my $n = int( rand( readfile($weight_file) ) );
return Vend::Util::readfile("$dir/$n");
}
return tag_weighted_banner($place, $opt) if $opt->{weighted};
my $table = $opt->{table} || 'banner';
my $r_field = $opt->{r_field} || 'rotate';
my $b_field = $opt->{b_field} || 'banner';
my $sep = $opt->{separator} || ':';
my $delim = $opt->{delimiter} || "{or}";
$place = 'default' if ! $place;
my $totrot;
do {
my $banner_data;
$totrot = tag_data($table, $r_field, $place);
if(! length $totrot) {
# No banner present
unless ($place =~ /$sep/ or $place eq 'default') {
$place = 'default';
redo;
}
}
elsif ($totrot) {
my $current = $::Scratch->{"rotate_$place"}++ || 0;
my $data = tag_data($table, $b_field, $place);
my(@banners) = split /\Q$delim/, $data;
return '' unless @banners;
return $banners[$current % scalar(@banners)];
}
else {
return tag_data($table, $b_field, $place);
}
} while $place =~ s/(.*)$sep.*/$1/;
return;
}
EOR