summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/DB/Schema.pm46
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;