From bc2957b22e54d9672e5a727468b029c490fd51dd Mon Sep 17 00:00:00 2001 From: Kieron Taylor <ktaylor@ebi.ac.uk> Date: Tue, 4 Oct 2016 15:28:31 +0100 Subject: [PATCH] Remove setting of extra_data column in DNAAlignFeature table, so that new attrib adaptor is used exclusively. Port retiring extra_data eval code into AnalysisAdaptor, so that web_data can still be accessed, but eval is localised to a single class and not the entire set of adaptors. --- modules/Bio/EnsEMBL/Analysis.pm | 2 +- modules/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm | 11 ++++++- .../EnsEMBL/DBSQL/DnaAlignFeatureAdaptor.pm | 33 +++++-------------- modules/t/analysis.t | 5 +-- 4 files changed, 22 insertions(+), 29 deletions(-) diff --git a/modules/Bio/EnsEMBL/Analysis.pm b/modules/Bio/EnsEMBL/Analysis.pm index e8a42dae7b..b326ace347 100755 --- a/modules/Bio/EnsEMBL/Analysis.pm +++ b/modules/Bio/EnsEMBL/Analysis.pm @@ -541,7 +541,7 @@ sub displayable { Status : Stable =cut - +# See also _objFromHashref in AnalysisAdaptor for context. sub web_data { my ($self,$arg) = @_; diff --git a/modules/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm index 978aa438af..0955db6fdd 100755 --- a/modules/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm +++ b/modules/Bio/EnsEMBL/DBSQL/AnalysisAdaptor.pm @@ -675,7 +675,16 @@ sub _objFromHashref { my $self = shift; my $h = shift; - my $web_data = $h->{web_data} ? $self->get_dumped_data($h->{web_data}) : ''; + ### This code moved here under protest. Web formatting does not belong with data ### + ### Web requires "web_data" for track configuration, but only uses the accessor once + ### meaning this eval can retire once the view has been removed. The column has to stay + ### but content is mostly accessed by SQL in web-code, not via accessor. + my $data = $h->{web_data}; + $data ||= ''; + $data =~ s/\n|\r|\f|(\\\\)//g; + my $web_data; + $web_data = eval($data); # :X execute semi-trustworthy strings on server. + ### Deprecation of generic dump_data and get_dumped_data methods from base class means AnalysisAdaptor now needs to supply that by itself return Bio::EnsEMBL::Analysis->new_fast({ dbID => $h->{analysis_id}, diff --git a/modules/Bio/EnsEMBL/DBSQL/DnaAlignFeatureAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/DnaAlignFeatureAdaptor.pm index 3ffb3a90f7..4f678a04dd 100644 --- a/modules/Bio/EnsEMBL/DBSQL/DnaAlignFeatureAdaptor.pm +++ b/modules/Bio/EnsEMBL/DBSQL/DnaAlignFeatureAdaptor.pm @@ -119,9 +119,9 @@ sub _columns { daf.score daf.external_db_id daf.hcoverage - daf.external_data - exdb.db_name - exdb.db_display_name); + daf.external_data + exdb.db_name + exdb.db_display_name); } @@ -162,23 +162,18 @@ sub store { hit_start, hit_end, hit_strand, hit_name, cigar_line, analysis_id, score, evalue, perc_ident, external_db_id, hcoverage, external_data) - VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" # 16 arguments + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NULL)" # 16 arguments, external data is being removed ); FEATURE: foreach my $feat (@feats) { if ( !ref $feat || !$feat->isa("Bio::EnsEMBL::DnaDnaAlignFeature") ) { - throw("feature must be a Bio::EnsEMBL::DnaDnaAlignFeature," - . " not a [" - . ref($feat) - . "]." ); + throw("feature must be a Bio::EnsEMBL::DnaDnaAlignFeature, not a [". ref($feat). "]." ); } if ( $feat->is_stored($db) ) { - warning( "DnaDnaAlignFeature [" - . $feat->dbID() - . "] is already stored in this database." ); + warning( "DnaDnaAlignFeature [".$feat->dbID()."] is already stored in this database." ); next FEATURE; } @@ -228,11 +223,6 @@ FEATURE: $sth->bind_param( 13, $feat->percent_id, SQL_FLOAT ); $sth->bind_param( 14, $feat->external_db_id, SQL_INTEGER ); $sth->bind_param( 15, $feat->hcoverage, SQL_DOUBLE ); - # Eagle change: also store the extra data, if available - my $extra_data; - $extra_data = $self->dump_data($feat->extra_data()) if ($feat->extra_data()); - $sth->bind_param( 16, $extra_data, SQL_LONGVARCHAR ); - $sth->execute(); my $dbId = $self->last_insert_id("${tablename}_id", undef, $tablename); @@ -312,7 +302,7 @@ sub save { my $db = $self->db(); my $analysis_adaptor = $db->get_AnalysisAdaptor(); - my $sql = qq{INSERT INTO $tablename (seq_region_id, seq_region_start, seq_region_end, seq_region_strand, hit_start, hit_end, hit_strand, hit_name, cigar_line, analysis_id, score, evalue, perc_ident, external_db_id, hcoverage, external_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}; + my $sql = qq{INSERT INTO $tablename (seq_region_id, seq_region_start, seq_region_end, seq_region_strand, hit_start, hit_end, hit_strand, hit_name, cigar_line, analysis_id, score, evalue, perc_ident, external_db_id, hcoverage, external_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)}; my %analyses = (); @@ -365,8 +355,6 @@ sub save { my $seq_region_id; ($feat, $seq_region_id) = $self->_pre_store_userdata($feat); - my $extra_data = $feat->extra_data ? $self->dump_data($feat->extra_data) : ''; - $sth->bind_param(1,$seq_region_id,SQL_INTEGER); $sth->bind_param(2,$feat->start,SQL_INTEGER); $sth->bind_param(3,$feat->end,SQL_INTEGER); @@ -383,8 +371,6 @@ sub save { $sth->bind_param(13,$feat->percent_id,SQL_FLOAT); $sth->bind_param(14,$feat->external_db_id,SQL_INTEGER); $sth->bind_param(15,$feat->hcoverage,SQL_DOUBLE); - $sth->bind_param(16,$extra_data,SQL_LONGVARCHAR); - $sth->execute(); $original->dbID($self->last_insert_id("${tablename}_id", undef, $tablename)); @@ -634,9 +620,6 @@ sub _objs_from_sth { $slice = $dest_slice; } - # Inlining the following in the hash causes major issues with 5.16 and messes up the hash - my $evalled_extra_data = $extra_data ? $self->get_dumped_data($extra_data) : ''; - # Finally, create the new DnaAlignFeature. push( @features, $self->_create_feature_fast( @@ -658,7 +641,7 @@ sub _objs_from_sth { 'dbID' => $dna_align_feature_id, 'external_db_id' => $external_db_id, 'hcoverage' => $hcoverage, - 'extra_data' => $evalled_extra_data, + 'extra_data' => undef, 'dbname' => $external_db_name, 'db_display_name' => $external_display_db_name } ) ); diff --git a/modules/t/analysis.t b/modules/t/analysis.t index 17a7e64bdc..c4f4f5ed05 100644 --- a/modules/t/analysis.t +++ b/modules/t/analysis.t @@ -56,7 +56,7 @@ $analysis->description( "some funny description" ); $analysis->display_label( "and a label" ); $analysis->displayable( 1 ); $analysis->created( "2005-10-28 10:28:29"); -$analysis->web_data("blah"); +$analysis->web_data({thing => 'blah'}); ok($analysis); @@ -71,6 +71,7 @@ my $analysis_out = $analysis_ad->fetch_by_logic_name('dummy_analysis'); ok($analysis_out); is($analysis_out->db, 'dummy', "Db matches"); +is($analysis_out->web_data->{thing}, 'blah', "Web data correctly extracted from DB via dirty eval"); ok( check_methods( $analysis_out, "db", "db_file", "dbID", "compare", "logic_name", "parameters", "gff_source", "gff_feature", @@ -93,7 +94,7 @@ is($analysis_updated->logic_name(), "new_dummy", "Logic name is correct"); is($analysis_updated->description(), "new description", "Description is correct"); is($analysis_updated->display_label(), "new label", "Label is correct"); is($analysis_updated->displayable(), 0, "Displayable is correct"); -is($analysis_updated->web_data(), "blahblah", "Web data is correct"); +is($analysis_updated->web_data(), "blahblah", "Web data is correct"); # Note this does not test the eval output, just the set value. # now try updating analysis that has no existing description $analysis = Bio::EnsEMBL::Analysis->new(); -- GitLab