blob: 4e640f0c62ea83f68ff842f4d47049918679d642 [file] [log] [blame]
############################################################################
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
package Insert2Mysql;
##############################################################################
#This package works with MySQL "testharness" database.
#It provides next functions:
# * select list from DB - selectFromDB($query, $fieldsnames, $numfields);
# * insert info to testrun_results table - insertTestRun($test_type, $start_time, $end_time);
# * insert info to testcases_results table - insertTestCase($testrun_id, $cols);
# * update end_time for a test suite - updateEndTime($testrun_id, $end_time);
# The constructor requires the database server and name be passed in. The
# database user will be assumed to be the logged in user, with password set
# to login name.
use strict;
use DBI;
##############################################################################
# @param dbServer - hostname of database server
# @param dbDatabase - database name
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
bless($self, $class);
$self->{'dbServer'} = shift;
$self->{'dbDatabase'} = shift;
$self->{'dbUser'} = getlogin;
$self->connect();
return $self;
}
##############################################################################
# Need an explicit destructor to disconnect from the database.
sub DESTROY
{
my $self = shift;
# disconnect from database here
$self->{'dbh'}->disconnect() if defined $self->{'dbh'};
}
##############################################################################
# Select a row from the database.
# @param query - query statement
# @param fieldsnames - reference to array of field names
# @param numfields - reference to var with number of fields
# @returns reference to array with arrays of field value
sub selectFromDB
{
my ($self, $query, $fieldsnames, $numfields) = @_;
$self->checkDbConnection();
my $sth = $self->{'dbh'}->prepare($query);
$sth->execute();
# Fill out the pass by reference stuff.
@$fieldsnames = @{$sth->{NAME}};
$$numfields = $sth->{NUM_OF_FIELDS};
# return the results.
return $sth->fetchall_arrayref();
}
##############################################################################
# Record the beginning of a test run.
# @params testrun_desc - Description of test run.
# @returns testrun id created for this test
sub startTestRun
{
my ($self, $testrun_desc) = @_;
$self->checkDbConnection();
# Insert into the table
$self->{'dbh'}->do("insert into testrun_results (start_time, testrun_desc) values (now(), '$testrun_desc');")
|| die ("Insert failed, $self->{'dbh'}->err");
# Find out the testrun id we got.
my $row = $self->{'dbh'}->selectrow_arrayref("select last_insert_id();");
return $row->[0];
}
##############################################################################
# Record the ending of a test run.
# @param testrun_id - id o the test run that has been completed.
# @returns nothing
sub endTestRun
{
my ($self, $testrun_id) = @_;
$self->checkDbConnection();
# Update the table
$self->{'dbh'}->do("update testrun_results set end_time = now() where testrun_id = $testrun_id;")
|| die ("Insert failed, $self->{'dbh'}->err");
# Update the dev_comment field inserting blank space
$self->{'dbh'}->do("update testcase_results set dev_comment = ' ' where testrun_id = $testrun_id;")
|| die ("Insert failed, $self->{'dbh'}->err");
}
##############################################################################
# Record the log file of a test run.
# @param testrun_id - id o the test run that has been completed.
# @param log_path - path to the log file
# @returns nothing
sub logTestRun
{
my ($self, $testrun_id, $logpath) = @_;
$self->checkDbConnection();
# insert a path to the log file
my $host = `hostname`;
chomp $host;
$logpath = "$host/$logpath";
$self->{'dbh'}->do("update testrun_results set log_path = '$logpath' WHERE testrun_id = $testrun_id;")
|| die ("Insert failed, $self->{'dbh'}->err");
}
##############################################################################
# Record the results of executing a test case.
# @param results - reference to a hash. The hash must have keys for
# testrun_id, test_type, test_file, test_group, test_num, status, and
# duration. It may have entries for cmd, cmd_id, expected_results, and
# actual_results. If these values have entries they will be inserted as well.
# @returns nothing
sub insertTestCase
{
my ($self, $results) = @_;
$self->checkDbConnection();
# build statement with columns we know we'll need.
my $query = "insert into testcase_results (testrun_id, test_type, test_file, test_group, test_num, status, duration";
my $values = "values ($results->{testrun_id}, '$results->{test_type}',
'$results->{test_file}', '$results->{test_group}', $results->{test_num},
'$results->{status}', $results->{duration}";
# Build in whathever option columns we find.
foreach my $opt ('cmd', 'cmd_id', 'expected_results', 'actual_results') {
if (defined $results->{$opt}) {
$query .= ", $opt";
$results->{$opt} =~ s/'/'/g;
$values .= ", '$results->{$opt}'";
}
}
$query .= ")" . $values . ");";
$self->{'dbh'}->do($query) || die ("Insert failed, $self->{'dbh'}->err");
}
###################
# PRIVATE MEMBERS #
###################
##############################################################################
# Check that we are still connected to the database. Intended only for usage
# by this class and it's children.
# @returns nothing
sub checkDbConnection
{
my ($self) = @_;
if (!$self->{'dbh'}->ping()) {
$self->{'dbh'}->disconnect();
$self->connect();
}
}
##############################################################################
# Connect to the database
# @returns nothing
sub connect
{
my ($self) = @_;
$self->{'dbh'} =
DBI->connect("DBI:mysql:$self->{dbDatabase}:$self->{dbServer}",
$self->{'dbUser'}, "",
{ RaiseError => 1, AutoCommit => 1 }) ||
die ("Unable to connect to database");;
}
1;