]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 381640: abstract_schema hook is broken--it prevents modification of the extension...
authormkanat%bugzilla.org <>
Sat, 26 May 2007 01:18:03 +0000 (01:18 +0000)
committermkanat%bugzilla.org <>
Sat, 26 May 2007 01:18:03 +0000 (01:18 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat

Bugzilla/DB/Schema.pm

index e9205ba0b4f10e1f52a0fdedec93732bc233a7c2..35e786c51b4459a00d843f0a210cb5a1f964ba0e 100644 (file)
@@ -1331,22 +1331,26 @@ sub _initialize {
     my $self = shift;
     my $abstract_schema = shift;
 
-    $abstract_schema ||= ABSTRACT_SCHEMA;
-
-    # Let extensions add tables, but make sure they can't modify existing 
-    # tables. If we don't lock/unlock keys, lock_value complains.
-    lock_keys(%$abstract_schema);
-    lock_value(%$abstract_schema, $_) foreach (keys %$abstract_schema);
-    unlock_keys(%$abstract_schema);
-    Bugzilla::Hook::process('db_schema-abstract_schema', 
-                            { schema => $abstract_schema });
-    unlock_hash(%$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
+        # tables. If we don't lock/unlock keys, lock_value complains.
+        lock_keys(%$abstract_schema);
+        foreach my $table (keys %{ABSTRACT_SCHEMA()}) {
+            lock_value(%$abstract_schema, $table) 
+                if exists $abstract_schema->{$table};
+        }
+        unlock_keys(%$abstract_schema);
+        Bugzilla::Hook::process('db_schema-abstract_schema', 
+                                { schema => $abstract_schema });
+        unlock_hash(%$abstract_schema);
+    }
 
     $self->{schema} = dclone($abstract_schema);
-    # While ABSTRACT_SCHEMA cannot be modified, 
-    # $self->{abstract_schema} can be. So, we dclone it to prevent
-    # anything from mucking with the constant.
-    $self->{abstract_schema} = dclone($abstract_schema);
+    $self->{abstract_schema} = $abstract_schema;
 
     return $self;