diff options
author | lpsolit%gmail.com <> | 2005-09-26 05:37:51 +0200 |
---|---|---|
committer | lpsolit%gmail.com <> | 2005-09-26 05:37:51 +0200 |
commit | 5e5715dffe4e217ab4bc669e7e6489e003704920 (patch) | |
tree | 3fa35954c492fa6f245e5606d84a0e2d3e7af1e5 | |
parent | 882d039556a75fd7f6bd2a605d91c8f3e616e98a (diff) | |
download | bugzilla-5e5715dffe4e217ab4bc669e7e6489e003704920.tar.gz bugzilla-5e5715dffe4e217ab4bc669e7e6489e003704920.tar.xz |
Bug 301392: Storable crashes checksetup with byte order error when moving databases - Patch by Dennis Melentyev <dennis.melentyev@infopulse.com.ua> r=mkanat a=justdave
-rw-r--r-- | Bugzilla/DB/Schema.pm | 46 |
1 files changed, 31 insertions, 15 deletions
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 <edwardjsabol@iname.com> # Max Kanat-Alexander <mkanat@bugzilla.org> # Lance Larsh <lance.larsh@oracle.com> +# Dennis Melentyev <dennis.melentyev@infopulse.com.ua> 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<deserialize_abstract($serialized, $version)> @@ -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; |