# $Id$

#
# (c) Hilmar Lapp, hlapp at gnf.org, 2002.
# (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002.
#
# You may distribute this module under the same terms as perl itself.
# Refer to the Perl Artistic License (see the license accompanying this
# software package, or see http://www.perl.com/language/misc/Artistic.html)
# for the terms under which you may use, modify, and redistribute this module.
# 
# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#

=head1 NAME - BioSQL-base.pm

=head1 SYNOPSIS

    # synopsis goes here

=head1 DESCRIPTION

This modules provides methods to insert and remove the parent entities
needed by many (probably all) of the different tests for child
entities.

=head1 AUTHOR Hilmar Lapp 

Email hlapp at gnf.org

=cut

package BioSQLBase;

use lib 't';

use strict;
use vars qw(@ISA $VERSION);

use Bio::Root::Root;
use DBTestHarness;

@ISA = qw(Bio::Root::Root);

=head2 store_seq

 Title   : store_seq
 Usage   : $seq = $biosql->store_seq($stream, "rodent");
 Function: Reads the next sequence from the given Bio::SeqIO stream and
           stores it under the namespace given by 2nd argument.
 Returns : The sequence object that was stored, with the PK in
           $seq->primary_id(), and undef if there was no sequence in the stream
 Args    : SeqIO stream (object) and namespace (a string)

=cut

sub store_seq {
    my ($self, $seqio, $namespace) = @_;

    my $seq = $seqio->next_seq();
    return unless $seq;
    my $biodbadaptor = $self->db()->get_BioDatabaseAdaptor;
    my $bdbid = $biodbadaptor->fetch_by_name_store_if_needed($namespace);
    my $seqadaptor = $self->db()->get_SeqAdaptor;
    my $pk = $seqadaptor->store($bdbid, $seq);
    $seq->primary_id($pk);
    return $seq;
}

=head2 delete_seq

 Title   : delete_seq
 Usage   : $ok = $biosql->delete_seq($seq);
 Function: Deletes the given sequence from the database.
 Returns : True for success and false otherwise.
 Args    : A Bio::PrimarySeqI compliant object

=cut

sub delete_seq {
    my ($self, $seq) = @_;

    my $seqadaptor = $self->db()->get_SeqAdaptor;
    return $seqadaptor->remove_by_dbID($seq->primary_id());
}

=head2 delete_biodatabase

 Title   : delete_biodatabase
 Usage   : $ok = $biosql->delete_biodatabase($biodatabase);
 Function: Deletes the given biodatabase (namespace) from the database.
 Returns : True for success and false otherwise.
 Args    : namespace (a string)

=cut

sub delete_biodatabase {
    my ($self, $namespace) = @_;

    my $biodbadaptor = $self->db()->get_BioDatabaseAdaptor;
    return $biodbadaptor->remove_by_name($namespace);
}

=head2 db

 Title   : db
 Usage   : $dbadaptor = $biosql->db();
 Function: 
 Returns : The DBAdaptor object in use to wrap the BioSQL database.
 Args    : On set (optional), the DBAdaptor object to be used.

=cut

sub db {
    my ($self, $db) = @_;

    if($db) {
	$self->{'_db'} = $db;
    }
    if(! exists($self->{'_db'})) {
	$self->{'_db'} = $self->dbharness()->get_DBAdaptor(); # we cache this!
    }
    return $self->{'_db'};
}

=head2 dbharness

 Title   : dbharness
 Usage   : $dbharness = $biosql->dbharness();
 Function: 
 Returns : The DBTestHarness object in use.
 Args    : On set (optional), the DBTestHarness object to be used.

=cut

sub dbharness {
    my ($self, $dbharness) = @_;

    if($dbharness) {
	$self->{'_dbharness'} = $dbharness;
    }
    if(! exists($self->{'_dbharness'})) {
	$self->{'_dbharness'} = DBTestHarness->new("biosql");
    }
    return $self->{'_dbharness'};
}

1;

__END__