1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/piwigo_ynh.git synced 2024-09-03 20:06:03 +02:00
piwigo_ynh/sources/tools/fill_history.pl
2014-07-06 13:21:10 +02:00

336 lines
7.5 KiB
Perl

#!/usr/bin/perl
use warnings;
use strict;
use Getopt::Long;
use DBI;
use File::Basename;
use Time::Local;
use List::Util qw/shuffle min/;
my %opt;
GetOptions(
\%opt,
qw/dbname=s dbuser=s dbpass=s prefix=s
total=i start_date=s end_date=s
help/
);
if (defined($opt{help}))
{
print <<FIN;
Fill the user comments table of Piwigo.
Usage: pwg_fill_comments.pl --dbname=<database_name>
--dbuser=<username>
--dbpass=<password>
--tagfile=<tags filename>
[--prefix=<tables prefix>]
[--help]
--dbname, --dbuser and --dbpass are connexion parameters.
--tagfile
--prefix : determines the prefix for your table names.
--help : show this help
FIN
exit(0);
}
my $usage = "\n\n".basename($0)." --help for help\n\n";
foreach my $option (qw/dbname dbuser dbpass start_date end_date/) {
if (not exists $opt{$option}) {
die 'Error: '.$option.' is a mandatory option', $usage;
}
}
$opt{prefix} = 'piwigo_' if (not defined $opt{prefix});
my $dbh = DBI->connect(
'DBI:mysql:'.$opt{dbname},
$opt{dbuser},
$opt{dbpass}
);
my $query;
my $sth;
# retrieve all available users
$query = '
SELECT id
FROM '.$opt{prefix}.'users
';
my @user_ids = keys %{ $dbh->selectall_hashref($query, 'id') };
# set a list of IP addresses for each users
my %user_IPs = ();
foreach my $user_id (@user_ids) {
for (1 .. 1 + int rand 5) {
push(
@{ $user_IPs{$user_id} },
join(
'.',
map {1 + int rand 255} 1..4
)
);
}
}
# use Data::Dumper; print Dumper(\%user_IPs); exit();
# start and end dates
my ($year,$month,$day,$hour,$min,$sec)
= ($opt{start_date} =~ m/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
my $start_unixtime = timelocal(0,0,0,$day,$month-1,$year);
($year,$month,$day,$hour,$min,$sec)
= ($opt{end_date} =~ m/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
my $end_unixtime = timelocal(0,0,0,$day,$month-1,$year);
# "tags from image" and "images from tag"
$query = '
SELECT image_id, tag_id
FROM '.$opt{prefix}.'image_tag
';
my %image_tags = ();
my %tag_images = ();
my %related_tag_of = ();
my @tags = ();
$sth = $dbh->prepare($query);
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
push(
@{$image_tags{$row->{image_id}}},
$row->{tag_id}
);
push(
@{$tag_images{$row->{tag_id}}},
$row->{image_id}
);
push (
@tags,
$row->{tag_id}
);
}
# foreach my $tag_id (keys %tag_images) {
# printf(
# "tag %5u: %5u images\n",
# $tag_id,
# scalar @{$tag_images{$tag_id}}
# );
# }
# exit();
# use Data::Dumper; print Dumper(\%tag_images); exit();
# categories from image_id
$query = '
SELECT image_id, category_id
FROM '.$opt{prefix}.'image_category
';
my %image_categories = ();
my %category_images =();
my %categories = ();
$sth = $dbh->prepare($query);
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
push(
@{$image_categories{$row->{image_id}}},
$row->{category_id}
);
push(
@{$category_images{$row->{category_id}}},
$row->{image_id}
);
$categories{ $row->{category_id} }++;
}
my @images = keys %image_categories;
my @categories = keys %categories;
# use Data::Dumper;
# print Dumper(\%image_categories);
my @sections = (
'categories',
# 'tags',
# 'search',
# 'list',
# 'favorites',
# 'most_visited',
# 'best_rated',
# 'recent_pics',
# 'recent_cats',
);
my @inserts = ();
USER : foreach my $user_id (@user_ids) {
print 'user_id: ', $user_id, "\n";
my $current_unixtime = $start_unixtime;
my @IPs = @{ $user_IPs{$user_id} };
VISIT : foreach my $visit_num (1..100_000) {
print 'visit: ', $visit_num, "\n";
my @temp_inserts = ();
my $IP = (@IPs)[int rand @IPs];
my $current_page = 0;
my $visit_size = 10 + int rand 90;
$current_unixtime+= 86_400 + int rand(86_400 * 30);
my $section = $sections[int rand scalar @sections];
# print 'section: ', $section, "\n";
push(
@temp_inserts,
{
section => $section,
}
);
if ($section eq 'categories') {
CATEGORY : foreach my $category_id (
(shuffle @categories)[1..int rand scalar @categories]
) {
# print 'category: ', $category_id, "\n";
push(
@temp_inserts,
{
category_id => $category_id,
}
);
my @images = @{$category_images{$category_id}};
IMAGE : foreach my $image_id (
(shuffle @images)[1..min(10, scalar @images)]
) {
push(
@temp_inserts,
{
category_id => $category_id,
image_id => $image_id,
}
);
}
}
}
if ($section eq 'tags') {
# TODO
}
# transfert @temp_inserts to @inserts
print 'temp_insert size: ', scalar @temp_inserts, "\n";
foreach my $temp_insert (@temp_inserts) {
$current_unixtime+= 5 + int rand 25;
next VISIT if ++$current_page == $visit_size;
last VISIT if $current_unixtime >= $end_unixtime;
my $date = unixtime_to_mysqldate($current_unixtime);
my $time = unixtime_to_mysqltime($current_unixtime);
my ($year, $month, $day) = split '-', $date;
my ($hour) = split ':', $time;
$temp_insert->{date} = $date;
$temp_insert->{time} = $time;
$temp_insert->{year} = $year;
$temp_insert->{month} = $month;
$temp_insert->{day} = $day;
$temp_insert->{hour} = $hour;
$temp_insert->{IP} = $IP;
$temp_insert->{section} = $section;
$temp_insert->{user_id} = $user_id;
push(@inserts, $temp_insert);
}
}
}
@inserts = sort {
$a->{date} cmp $b->{date}
or $a->{time} cmp $b->{time}
} @inserts;
if (scalar @inserts) {
my @columns =
qw/
date time year month day hour
user_id IP
section category_id image_id
/;
my $question_marks_string = '(';
$question_marks_string.= join(
',',
map {'?'} @columns
);
$question_marks_string.= ')';
my $query = '
INSERT INTO '.$opt{prefix}.'history
('.join(', ', @columns).')
VALUES
';
$query.= join(
',',
map {$question_marks_string} (1 .. scalar @inserts)
);
$query.= '
';
# print $query, "\n";
my @values = ();
foreach my $insert (@inserts) {
push(
@values,
map {
$insert->{$_}
} @columns
);
}
$sth = $dbh->prepare($query);
$sth->execute(@values)
or die 'cannot execute insert query';
}
sub unixtime_to_mysqldate {
my ($unixtime) = @_;
($sec,$min,$hour,$day,$month,$year) = localtime($unixtime);
return sprintf(
'%d-%02d-%02d',
$year+1900,
$month+1,
$day,
);
}
sub unixtime_to_mysqltime {
my ($unixtime) = @_;
($sec,$min,$hour,$day,$month,$year) = localtime($unixtime);
return sprintf(
'%d:%d:%d',
$hour,
$min,
$sec
);
}