Analizo
view release on metacpan or search on metacpan
lib/Analizo/Batch/Output/DB.pm view on Meta::CPAN
package Analizo::Batch::Output::DB;
use strict;
use warnings;
use parent qw( Analizo::Batch::Output );
use DBI;
use Digest::SHA qw(sha1_hex);
sub database($) {
my ($self) = @_;
my $db = $self->file || 'output.sqlite3';
if ($db =~ /^dbi:/) {
return $db;
} else {
return 'dbi:SQLite:' . $db;
}
}
sub push($$) {
my ($self, $job) = @_;
my $project_id = $self->_add_project($job->project_name);
my $developer_id = $self->_add_developer($job);
my $commit_id = $self->_add_commit($job, $project_id, $developer_id);
$self->_add_modules($job, $commit_id, $project_id);
}
sub flush($) {
my ($self) = @_;
$self->{dbh}->disconnect();
}
sub _find_row_id($$@) {
my ($self, $sql, @data) = @_;
my $statement_id = 'st_find_' . sha1_hex($sql); # is this SHA1 needed at all?
$self->{$statement_id} ||= $self->{dbh}->prepare($sql);
my $list = $self->{dbh}->selectall_arrayref($self->{$statement_id}, {}, @data);
if (scalar(@$list) == 0) {
return undef;
} else {
return $list->[0]->[0];
}
}
sub _add_project($$) {
my ($self, $project) = @_;
$self->{st_add_project} ||= $self->{dbh}->prepare('INSERT INTO projects (name) values(?)');
my $project_id = $self->_find_project($project);
if (! $project_id) {
$self->{st_add_project}->execute($project);
$project_id = $self->_find_project($project);
}
return $project_id;
}
sub _find_project($$) {
my ($self, $project) = @_;
return $self->_find_row_id('SELECT id from projects where name = ?', $project);
}
sub _add_developer($$) {
my ($self, $job) = @_;
my $metadata = $job->metadata_hashref();
my $name = $metadata->{author_name};
my $email = $metadata->{author_email};
# FIXME unstested
if (!$name || !$email) {
return undef;
}
$self->{st_add_developer} ||= $self->{dbh}->prepare('INSERT INTO developers (name,email) VALUES (?,?)');
my $developer_id = $self->_find_developer($name, $email);
if (! $developer_id) {
$self->{st_add_developer}->execute($name, $email);
$developer_id = $self->_find_developer($name, $email);
}
return $developer_id;
}
sub _find_developer($$$) {
my ($self, $name, $email) = @_;
return $self->_find_row_id('SELECT id FROM developers WHERE name = ? AND email = ?', $name, $email);
}
sub _add_commit($$$$) {
my ($self, $job, $project_id, $developer_id) = @_;
unless ($self->_find_row_id('SELECT id FROM commits where id = ?', $job->id)) {
my $metadata = $job->metadata_hashref;
my $previous_commit_id = $metadata->{previous_commit_id};
my $date = $metadata->{author_date};
my ($summary, $details) = ({}, {});
( run in 4.080 seconds using v1.01-cache-2.11-cpan-98e64b0badf )