From 5e5715dffe4e217ab4bc669e7e6489e003704920 Mon Sep 17 00:00:00 2001 From: "lpsolit%gmail.com" <> Date: Mon, 26 Sep 2005 03:37:51 +0000 Subject: Bug 301392: Storable crashes checksetup with byte order error when moving databases - Patch by Dennis Melentyev r=mkanat a=justdave --- Bugzilla/DB/Schema.pm | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'Bugzilla') diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index ccbef9834..6abe41cdd 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -21,6 +21,7 @@ # Edward J. Sabol # Max Kanat-Alexander # Lance Larsh +# Dennis Melentyev package Bugzilla::DB::Schema; @@ -36,8 +37,13 @@ use strict; use Bugzilla::Error; use Bugzilla::Util; +use Safe; +# Historical, needed for SCHEMA_VERSION = '1.00' use Storable qw(dclone freeze thaw); +# New SCHEMA_VERSION (2.00) use this +use Data::Dumper; + =head1 NAME Bugzilla::DB::Schema - Abstract database schema for Bugzilla @@ -142,7 +148,7 @@ which can be used to specify the type of index such as UNIQUE or FULLTEXT. =cut -use constant SCHEMA_VERSION => '1.00'; +use constant SCHEMA_VERSION => '2.00'; use constant ABSTRACT_SCHEMA => { # BUG-RELATED TABLES @@ -1976,18 +1982,24 @@ sub columns_equal { Do not attempt to manipulate this data directly, as the format may change at any time in the future. The only thing you should do with the returned value - is either store it somewhere or deserialize it. + is either store it somewhere (coupled with appropriate + SCHEMA_VERSION) or deserialize it. =cut sub serialize_abstract { my ($self) = @_; - # We do this so that any two stored Schemas will have the - # same byte representation if they are identical. - # We don't need it currently, but it might make things - # easier in the future. - local $Storable::canonical = 1; - return freeze($self->{abstract_schema}); + + # Make it ok to eval + local $Data::Dumper::Purity = 1; + + # Avoid cross-refs + local $Data::Dumper::Deepcopy = 1; + + # Always sort keys to allow textual compare + local $Data::Dumper::Sortkeys = 1; + + return Dumper($self->{abstract_schema}); } =item C @@ -2007,12 +2019,16 @@ sub serialize_abstract { sub deserialize_abstract { my ($class, $serialized, $version) = @_; - my $thawed_hash = thaw($serialized); - - # At this point, we have no backwards-compatibility - # code to write, so $version is ignored. - # For what $version ought to be used for, see the - # "private" section of the SCHEMA_VERSION docs. + my $thawed_hash; + if (int($version) < 2) { + $thawed_hash = thaw($serialized); + } + else { + my $cpt = new Safe; + $cpt->reval($serialized) || + die "Unable to restore cached schema: " . $@; + $thawed_hash = ${$cpt->varglob('VAR1')}; + } return $class->new(undef, $thawed_hash); } @@ -2043,7 +2059,7 @@ object. sub get_empty_schema { my ($class) = @_; - return $class->deserialize_abstract(freeze({})); + return $class->deserialize_abstract(Dumper({}), SCHEMA_VERSION); } 1; -- cgit v1.2.3-24-g4f1b