Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm view on Meta::CPAN
}
if($cs->is_sequence_level() && !$not_dna) {
if(!$seqref) {
throw("Must provide sequence for sequence level coord system.");
}
if(ref($seqref) ne 'SCALAR') {
throw("Sequence must be a scalar reference.");
}
my $seq_len = length($$seqref);
if($seq_len != $sr_len) {
throw("Sequence length ($seq_len) must match slice length ($sr_len).");
}
} else {
if($seqref) {
throw("Cannot provide sequence for non-sequence level seq regions.");
}
}
#store the seq_region
my $sth = $db->dbc->prepare("INSERT INTO seq_region " .
" ( name, length, coord_system_id ) " .
" VALUES ( ?, ?, ? )"
);
$sth->bind_param(1,$sr_name,SQL_VARCHAR);
$sth->bind_param(2,$sr_len,SQL_INTEGER);
$sth->bind_param(3,$cs->dbID,SQL_INTEGER);
$sth->execute();
my $seq_region_id = $self->last_insert_id('seq_region_id', undef, 'seq_region');
if(!$seq_region_id) {
throw("Database seq_region insertion failed.");
}
if($cs->is_sequence_level() && !$not_dna) {
#store sequence if it was provided
my $seq_adaptor = $db->get_SequenceAdaptor();
$seq_adaptor->store($seq_region_id, $$seqref);
}
#synonyms
if(defined($slice->{'synonym'})){
foreach my $syn (@{$slice->{'synonym'}} ){
$syn->seq_region_id($seq_region_id); # set the seq_region_id
$syn->adaptor->store($syn);
}
}
$slice->adaptor($self);
return $seq_region_id;
}
sub update {
my $self = shift;
my $slice = shift;
#
# Get all of the sanity checks out of the way before storing anything
#
if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice'))) {
throw('Slice argument is required');
}
my $cs = $slice->coord_system();
throw("Slice must have attached CoordSystem.") if(!$cs);
my $db = $self->db();
if($slice->start != 1 || $slice->strand != 1) {
throw("Slice must have start==1 and strand==1.");
}
if($slice->end() != $slice->seq_region_length()) {
throw("Slice must have end==seq_region_length");
}
my $sr_len = $slice->length();
my $sr_name = $slice->seq_region_name();
if(!$sr_name) {
throw("Slice must have valid seq region name.");
}
#update the seq_region
my $seq_region_id = $slice->get_seq_region_id();
my $update_sql = qq(
UPDATE seq_region
SET name = ?,
length = ?,
coord_system_id = ?
WHERE seq_region_id = ?
);
my $sth = $db->dbc->prepare($update_sql);
$sth->bind_param(1,$sr_name,SQL_VARCHAR);
$sth->bind_param(2,$sr_len,SQL_INTEGER);
$sth->bind_param(3,$cs->dbID,SQL_INTEGER);
$sth->bind_param(4, $seq_region_id, SQL_INTEGER);
$sth->execute();
#synonyms
if(defined($slice->{'synonym'})){
foreach my $syn (@{$slice->{'synonym'}} ){
$syn->seq_region_id($seq_region_id); # set the seq_region_id
my $syn_adaptor = $db->get_SeqRegionSynonymAdaptor();
$syn_adaptor->store($syn);
}
}
( run in 1.020 second using v1.01-cache-2.11-cpan-f56aa216473 )