Commit 23c0a8a1 authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 381640: abstract_schema hook is broken--it prevents modification of the extension's own tables

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
parent 4d5504d6
...@@ -1331,22 +1331,26 @@ sub _initialize { ...@@ -1331,22 +1331,26 @@ sub _initialize {
my $self = shift; my $self = shift;
my $abstract_schema = shift; my $abstract_schema = shift;
$abstract_schema ||= ABSTRACT_SCHEMA; if (!$abstract_schema) {
# While ABSTRACT_SCHEMA cannot be modified, $abstract_schema can be.
# So, we dclone it to prevent anything from mucking with the constant.
$abstract_schema = dclone(ABSTRACT_SCHEMA);
# Let extensions add tables, but make sure they can't modify existing # Let extensions add tables, but make sure they can't modify existing
# tables. If we don't lock/unlock keys, lock_value complains. # tables. If we don't lock/unlock keys, lock_value complains.
lock_keys(%$abstract_schema); lock_keys(%$abstract_schema);
lock_value(%$abstract_schema, $_) foreach (keys %$abstract_schema); foreach my $table (keys %{ABSTRACT_SCHEMA()}) {
lock_value(%$abstract_schema, $table)
if exists $abstract_schema->{$table};
}
unlock_keys(%$abstract_schema); unlock_keys(%$abstract_schema);
Bugzilla::Hook::process('db_schema-abstract_schema', Bugzilla::Hook::process('db_schema-abstract_schema',
{ schema => $abstract_schema }); { schema => $abstract_schema });
unlock_hash(%$abstract_schema); unlock_hash(%$abstract_schema);
}
$self->{schema} = dclone($abstract_schema); $self->{schema} = dclone($abstract_schema);
# While ABSTRACT_SCHEMA cannot be modified, $self->{abstract_schema} = $abstract_schema;
# $self->{abstract_schema} can be. So, we dclone it to prevent
# anything from mucking with the constant.
$self->{abstract_schema} = dclone($abstract_schema);
return $self; return $self;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment