### Eclipse Workspace Patch 1.0
#P Drupal HEAD #2
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.234
diff -u -r1.234 block.module
--- modules/block/block.module	8 Nov 2006 19:49:13 -0000	1.234
+++ modules/block/block.module	8 Nov 2006 20:28:46 -0000
@@ -78,7 +78,7 @@
     $items[] = array('path' => 'admin/build/block/configure', 'title' => t('Configure block'),
       'access' => user_access('administer blocks'),
       'callback' => 'drupal_get_form',
-      'callback arguments' => array('block_admin_configure'),
+      'callback arguments' => array('block_admin_configure', 'configure'),
       'type' => MENU_CALLBACK);
     $items[] = array('path' => 'admin/build/block/delete', 'title' => t('Delete block'),
       'access' => user_access('administer blocks'),
@@ -88,7 +88,7 @@
     $items[] = array('path' => 'admin/build/block/add', 'title' => t('Add block'),
       'access' => user_access('administer blocks'),
       'callback' => 'drupal_get_form',
-      'callback arguments' => array('block_box_form'),
+      'callback arguments' => array('block_admin_configure', 'add'),
       'type' => MENU_LOCAL_TASK);
     $default = variable_get('theme_default', 'garland');
     foreach (list_themes() as $key => $theme) {
@@ -138,7 +138,7 @@
       break;
 
     case 'save':
-      block_box_save($edit, $delta);
+      return block_box_save($edit, $delta);
       break;
 
     case 'view':
@@ -373,13 +373,29 @@
 /**
  * Menu callback; displays the block configuration form.
  */
-function block_admin_configure($module = NULL, $delta = 0) {
+function block_admin_configure($type, $module = NULL, $delta = 0) {
+  if ($type == 'configure') {
+    if (!($edit = db_fetch_array(db_query("SELECT pages, visibility, custom, title FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta)))) {
+      drupal_not_found();
+      return;
+    }
+    
+    // Get the block subject for the page title.
+    $info = module_invoke($module, 'block', 'list');
+    drupal_set_title(t("'%name' block", array('%name' => $info[$delta]['info'])));
+  }
+  else {
+    // Otherwise, this is an 'add' form and we are adding a new block.
+    if (!isset($module)) {
+      $module = 'block';
+    }
+    $delta = NULL;
+    $edit = array('pages' => '', 'visibility' => '', 'custom' => '', 'title' => '');
+  }
 
   $form['module'] = array('#type' => 'value', '#value' => $module);
   $form['delta'] = array('#type' => 'value', '#value' => $delta);
 
-  $edit = db_fetch_array(db_query("SELECT pages, visibility, custom, title FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta));
-
   $form['block_settings'] = array(
     '#type' => 'fieldset',
     '#title' => t('Block specific settings'),
@@ -402,10 +418,6 @@
     }
   }
 
-  // Get the block subject for the page title.
-  $info = module_invoke($module, 'block', 'list');
-  drupal_set_title(t("'%name' block", array('%name' => $info[$delta]['info'])));
-
   // Standard block configurations.
   $form['user_vis_settings'] = array(
     '#type' => 'fieldset',
@@ -492,7 +504,7 @@
 
 function block_admin_configure_validate($form_id, $form_values) {
   if ($form_values['module'] == 'block') {
-    if (empty($form_values['info']) || db_num_rows(db_query("SELECT bid FROM {boxes} WHERE bid != %d AND info = '%s'", $form_values['delta'], $form_values['info']))) {
+    if (empty($form_values['info']) || ((isset($form_values['delta']) && db_num_rows(db_query("SELECT bid FROM {boxes} WHERE bid != %d AND info = '%s'", $form_values['delta'], $form_values['info']))) || (!isset($form_values['delta']) && db_num_rows(db_query("SELECT info FROM {boxes} WHERE info = '%s'", $form_values['info']))))) {
       form_set_error('info', t('Please ensure that each block description is unique.'));
     }
   }
@@ -500,33 +512,26 @@
 
 function block_admin_configure_submit($form_id, $form_values) {
   if (!form_get_errors()) {
+    // The hook will return a new delta when adding a new block.
+    $possible_new_delta = module_invoke($form_values['module'], 'block', 'save', $form_values['delta'], $form_values);
+    if (!isset($form_values['delta'])) {
+      $form_values['delta'] = $possible_new_delta;
+    }
+
+    // Update blocks so any manually added blocks can be 'updated' as well.
+    _block_rehash();
     db_query("UPDATE {blocks} SET visibility = %d, pages = '%s', custom = %d, title = '%s' WHERE module = '%s' AND delta = '%s'", $form_values['visibility'], trim($form_values['pages']), $form_values['custom'], $form_values['title'], $form_values['module'], $form_values['delta']);
     db_query("DELETE FROM {blocks_roles} WHERE module = '%s' AND delta = '%s'", $form_values['module'], $form_values['delta']);
     foreach (array_filter($form_values['roles']) as $rid) {
       db_query("INSERT INTO {blocks_roles} (rid, module, delta) VALUES (%d, '%s', '%s')", $rid, $form_values['module'], $form_values['delta']);
     }
-    module_invoke($form_values['module'], 'block', 'save', $form_values['delta'], $form_values);
+
     drupal_set_message(t('The block configuration has been saved.'));
     cache_clear_all();
     return 'admin/build/block';
   }
 }
 
-function block_box_form_validate($form_id, $form_values) {
-  if (empty($form_values['info']) || db_num_rows(db_query("SELECT info FROM {boxes} WHERE info = '%s'", $form_values['info']))) {
-    form_set_error('info', t('Please ensure that each block description is unique.'));
-  }
-}
-
-function block_box_form_submit($form_id, $form_values) {
-  if (!form_get_errors()) {
-    if (block_box_save($form_values)) {
-      drupal_set_message(t('The block has been created.'));
-      return 'admin/build/block';
-    }
-  }
-}
-
 /**
  * Menu callback; confirm deletion of custom blocks.
  */
@@ -549,6 +554,9 @@
   return 'admin/build/block';
 };
 
+/**
+ * Helper function to return form additions for 'block' type blocks.
+ */
 function block_box_form($edit = array()) {
   $form['info'] = array(
     '#type' => 'textfield',
@@ -572,7 +580,6 @@
     $edit['format'] = FILTER_FORMAT_DEFAULT;
   }
   $form['body_filter']['format'] = filter_form($edit['format'], -16);
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Save block'));
 
   return $form;
 }
@@ -584,11 +591,13 @@
 
   if (isset($delta)) {
     db_query("UPDATE {boxes} SET body = '%s', info = '%s', format = %d WHERE bid = %d", $edit['body'], $edit['info'], $edit['format'], $delta);
+    return TRUE;
   }
   else {
-    db_query("INSERT INTO {boxes} (body, info, format) VALUES  ('%s', '%s', %d)", $edit['body'], $edit['info'], $edit['format']);
+    $delta = db_next_id('{boxes}_bid');
+    db_query("INSERT INTO {boxes} (bid, body, info, format) VALUES  (%d, '%s', '%s', %d)", $delta, $edit['body'], $edit['info'], $edit['format']);
+    return $delta;
   }
-  return TRUE;
 }
 
 /**
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.40
diff -u -r1.40 system.install
--- modules/system/system.install	8 Nov 2006 19:24:11 -0000	1.40
+++ modules/system/system.install	8 Nov 2006 20:28:49 -0000
@@ -153,7 +153,7 @@
       ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
 
       db_query("CREATE TABLE {boxes} (
-        bid tinyint NOT NULL auto_increment,
+        bid tinyint NOT NULL,
         body longtext,
         info varchar(128) NOT NULL default '',
         format int NOT NULL default '0',
@@ -615,7 +615,7 @@
       )");
 
       db_query("CREATE TABLE {boxes} (
-        bid serial,
+        bid int NOT NULL,
         title varchar(64) NOT NULL default '',
         body text,
         info varchar(128) NOT NULL default '',
@@ -3375,6 +3375,21 @@
   return array();
 }
 
+function system_update_1015() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql('ALTER TABLE {boxes} CHANGE COLUMN bid bid tinyint NOT NULL');
+      break;
+    case 'pgsql':
+      $ret[] = update_sql('ALTER TABLE {boxes} ALTER COLUMN bid TYPE int');
+      $ret[] = update_sql('ALTER TABLE {boxes} ALTER COLUMN bid SET NOT NULL');
+      break;
+  }
+  return $ret;
+}
+
 /**
  * @} End of "defgroup updates-4.7-to-x.x"
  * The next series of updates should start at 2000.
