Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/DBSQL/DBEntryAdaptor.pm view on Meta::CPAN
if ( defined($ensID) ) {
if ( $ensID =~ /^\d+$/ ) {
$ensembl_id = $ensID;
} elsif ( ref($ensID) eq 'Bio::EnsEMBL::Gene'
or ref($ensID) eq 'Bio::EnsEMBL::Transcript'
or ref($ensID) eq 'Bio::EnsEMBL::Translation'
or ref($ensID) eq 'Bio::EnsEMBL::OperonTranscript'
or ref($ensID) eq 'Bio::EnsEMBL::Operon'
)
{
warning( "You should pass DBEntryAdaptor->store() "
. "a dbID rather than an ensembl object "
. "to store the xref on" );
if ( defined( $ensID->dbID() ) ) {
$ensembl_id = $ensID->dbID();
} else {
throw( sprintf( "%s %s doesn't have a dbID, can't store xref",
$ensType, $ensID->display_id() ) );
}
} else {
throw("Invalid dbID passed to DBEntryAdaptor->store()");
}
}
# Ensure external_db contains a record of the intended xref source
my $dbRef;
$dbRef = $self->_check_external_db($dbEntry,$ignore_release);
# Attempt to insert DBEntry
my $xref_id = $self->_store_or_fetch_xref($dbEntry,$dbRef);
$dbEntry->dbID($xref_id); #keeps DBEntry in sync with database
### Attempt to create an object->xref mapping
my $object_xref_id;
if ($ensembl_id) { $object_xref_id = $self->_store_object_xref_mapping($ensembl_id,$dbEntry,$ensType, $ignore_release)};
if (defined $master_xref && defined $object_xref_id) { $self->_store_dependent_xref_mapping($object_xref_id, $dbEntry, $master_xref); }
return $xref_id;
}
=head2 update
Arg [1] : Bio::EnsEMBL::DBEntry $dbentry
The dbentry to update
Example : $dbentry_adaptor->update($dbentry);
Description: Updates the dbprimary_acc, display_label, version, description, info_type
and info_text of a dbentry in the database.
Returntype : None
Exceptions : thrown if the $dbentry is not a Bio::EnsEMBL::DBEntry
Caller : general
Status : Stable
=cut
sub update {
my ($self, $dbEntry) = @_;
if (!defined $dbEntry || !ref $dbEntry || !$dbEntry->isa('Bio::EnsEMBL::DBEntry')) {
throw("Must update a dbentry object, not a $dbEntry");
}
my $update_dbentry_sql = qq(
UPDATE xref
SET dbprimary_acc = ?,
display_label = ?,
version = ?,
description = ?,
external_db_id = ?,
info_type = ?,
info_text = ?
WHERE xref_id = ?
);
my $dbRef = $self->_check_external_db($dbEntry);
my $display_id = $dbEntry->display_id;
$display_id = '' unless defined $display_id; # SQLite doesn't ignore NOT NULL errors
my $sth = $self->prepare($update_dbentry_sql);
$sth->bind_param(1, $dbEntry->primary_id,SQL_VARCHAR);
$sth->bind_param(2, $display_id,SQL_VARCHAR);
$sth->bind_param(3, ($dbEntry->version || q{0}),SQL_VARCHAR);
$sth->bind_param(4, $dbEntry->description,SQL_VARCHAR);
$sth->bind_param(5, $dbRef,SQL_INTEGER);
$sth->bind_param(6, ($dbEntry->info_type || 'NONE'), SQL_VARCHAR);
$sth->bind_param(7, ($dbEntry->info_text || ''), SQL_VARCHAR);
$sth->bind_param(8, $dbEntry->dbID(), SQL_INTEGER);
$sth->execute();
} ## end sub update
sub _store_object_xref_mapping {
my $self = shift;
my $ensembl_id = shift;
my $dbEntry = shift;
my $ensembl_type = shift;
my $ignore_release = shift;
my $dbc = $self->dbc();
my $sql_helper = $dbc->sql_helper();
if (not defined ($ensembl_type)) { warning("No Ensembl data type provided for new xref");}
my $analysis_id;
if ( $dbEntry->analysis() ) {
$analysis_id = $self->db()->get_AnalysisAdaptor->store( $dbEntry->analysis() );
}
my $insert_ignore = $self->insert_ignore_clause();
my $insert_params = [
[$dbEntry->dbID(), SQL_INTEGER],
[$ensembl_type, SQL_VARCHAR],
[$ensembl_id, SQL_INTEGER],
[$dbEntry->linkage_annotation(),SQL_VARCHAR],
[$analysis_id, SQL_INTEGER],
];
my $base_object_xref_insert_sql = qq(
${insert_ignore} INTO object_xref
( xref_id,
ensembl_object_type,
ensembl_id,
linkage_annotation,
analysis_id )
VALUES ( ?, ?, ?, ?, ? )
);
my $object_xref_id;
#If MySQL we can optimise into a single insert query to deal with object_xref_id retrieval on insert ignore
if($dbc->driver() eq 'mysql') {
my $sql = $base_object_xref_insert_sql.'ON DUPLICATE KEY UPDATE object_xref_id=LAST_INSERT_ID(object_xref_id)';
$sql_helper->execute_update(-SQL => $sql, -PARAMS => $insert_params);
$object_xref_id = $self->last_insert_id('object_xref_id', undef, 'object_xref');
}
#Otherwise we attempt & retrieve on failure
else {
my $updated_rows = $sql_helper->execute_update(-SQL => $base_object_xref_insert_sql, -PARAMS => $insert_params);
if($updated_rows == 1) {
$object_xref_id = $self->last_insert_id('object_xref_id', undef, 'object_xref');
}
else {
my $sql = 'select object_xref_id from object_xref where xref_id =? and ensembl_object_type =? and ensembl_id =?';
my $params = [
[$dbEntry->dbID(), SQL_INTEGER],
[$ensembl_type, SQL_VARCHAR],
[$ensembl_id, SQL_INTEGER],
];
$object_xref_id = $sql_helper->execute_single_result(-SQL => $sql, -PARAMS => $params);
}
}
( run in 0.847 second using v1.01-cache-2.11-cpan-f56aa216473 )