### Eclipse Workspace Patch 1.0
#P Drupal HEAD (Core)
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.229
diff -u -r1.229 block.module
--- modules/block/block.module	8 Oct 2006 06:34:12 -0000	1.229
+++ modules/block/block.module	11 Oct 2006 20:52:38 -0000
@@ -154,55 +154,43 @@
  */
 function _block_rehash() {
   global $theme_key;
+  $blocks = array();
 
   init_theme();
 
-  $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $theme_key);
-  while ($old_block = db_fetch_object($result)) {
-    $old_blocks[$old_block->module][$old_block->delta] = $old_block;
-  }
-
-  $blocks = array();
-
   foreach (module_list() as $module) {
     $module_blocks = module_invoke($module, 'block', 'list');
     if ($module_blocks) {
       foreach ($module_blocks as $delta => $block) {
         $block['module'] = $module;
         $block['delta']  = $delta;
-        // If previously written to database, load values.
-        if ($old_blocks[$module][$delta]) {
-          $block['status'] = $old_blocks[$module][$delta]->status;
-          $block['weight'] = $old_blocks[$module][$delta]->weight;
-          $block['region'] = $old_blocks[$module][$delta]->region;
-          $block['visibility'] = $old_blocks[$module][$delta]->visibility;
-          $block['pages'] = $old_blocks[$module][$delta]->pages;
-          $block['custom'] = $old_blocks[$module][$delta]->custom;
-          $block['throttle'] = $old_blocks[$module][$delta]->throttle;
-          $block['title'] = $old_blocks[$module][$delta]->title;
-        }
-        // Otherwise, use any set values, or else substitute defaults.
-        else {
-          $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0, 'title' => '');
-          foreach ($properties as $property => $default) {
-            if (!isset($block[$property])) {
-              $block[$property] = $default;
-            }
+        $block_list[$module .'-'. $delta] = TRUE;
+        $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0);
+        foreach ($properties as $property => $default) {
+          if (!isset($block[$property])) {
+            $block[$property] = $default;
           }
         }
-
-        $blocks[] = $block;
+        $blocks[$module .'-'. $delta] = $block;
       }
     }
   }
 
   db_lock_table('blocks');
-  // Remove all blocks from table.
-  db_query("DELETE FROM {blocks} WHERE theme = '%s'", $theme_key);
+  $result = db_query("SELECT * FROM {blocks} WHERE theme = '%s'", $theme_key);
+  while ($block = db_fetch_array($result)) {
+    $key = $block['module'] .'-'. $block['delta'];
+    if (isset($blocks[$key])) {
+      unset($block_list[$key]);
+      $blocks[$key] = array_merge($blocks[$key], $block);
+    }
+    else {
+      db_query("DELETE FROM {blocks} WHERE theme = '%s' AND module = '%s' AND delta = '%s'", $theme_key, $block['module'], $block['delta']);
+    }
+  }
 
-  // Reinsert new set of blocks into table.
-  foreach ($blocks as $block) {
-    db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle, title) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d, '%s')", $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle'], $block['title']);
+  foreach (array_keys($block_list) as $key) {
+    db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)", $blocks[$key]['module'], $blocks[$key]['delta'], $theme_key, $blocks[$key]['status'], $blocks[$key]['weight'], $blocks[$key]['region'], $blocks[$key]['visibility'], $blocks[$key]['pages'], $blocks[$key]['custom'], $blocks[$key]['throttle']);
   }
   db_unlock_tables();
 
