? deford.sql
? image.install.GOOD
? image_133436.patch
? image_133436_0.patch
Index: image.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/image/image.install,v
retrieving revision 1.1.4.5
diff -u -p -r1.1.4.5 image.install
--- image.install	2 Jul 2007 22:50:25 -0000	1.1.4.5
+++ image.install	3 Jul 2007 00:15:48 -0000
@@ -69,3 +69,61 @@ function image_update_3() {
   }
   return array();
 }
+
+/**
+ * Clean up all the records that aren't in the files directory.
+ */
+function image_update_4() {
+  $ret = array();
+
+  $result = db_query("SELECT f.nid, f.fid, f.filename, f.filepath FROM {files} f INNER JOIN {node} n ON f.nid = n.nid WHERE n.type = 'image' AND f.filename = '_original' AND NOT f.filepath LIKE '%s/%%'", rtrim(file_directory_path(), '\\/'));
+  while ($file = db_fetch_object($result)) {
+    $file->filepath = file_create_path($file->filepath);
+    if (file_exists($file->filepath)) {
+      if (db_result(db_query("SELECT COUNT(*) FROM {files} f INNER JOIN {node} n ON f.nid = n.nid WHERE n.type = 'image' AND filepath = '%s' AND fid <> %d", $file->filepath, $file->fid))) {
+        $ret[] = update_sql("DELETE FROM {files} WHERE fid = ". (int)$file->fid);
+        $ret[] = update_sql("DELETE FROM {file_revisions} WHERE fid = ". (int)$file->fid);
+      } else {
+        $ret[] = update_sql("UPDATE {files} SET filepath = '". db_escape_string($file->filepath) ."' WHERE fid = ". (int)$file->fid);
+      }
+    }
+    else {
+      $ret[] = update_sql("DELETE FROM {files} WHERE fid = ". (int)$file->fid);
+      $ret[] = update_sql("DELETE FROM {file_revisions} WHERE fid = ". (int)$file->fid);
+    }
+  }
+  return $ret;
+}
+
+/**
+ * Move image files into their own table.
+ */
+function image_update_5() {
+  $ret = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("CREATE TABLE {image} (
+          `vid` INTEGER UNSIGNED NOT NULL,
+          `size` VARCHAR(255) NOT NULL,
+          `fid` INTEGER UNSIGNED NOT NULL,
+          PRIMARY KEY (`vid`, `size`),
+          INDEX image_fid(`fid`)
+        ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      
+      // Copy image files records into the new table.
+      $args = array_keys(_image_get_sizes());
+      $cond = " IN ('". implode("', '", $args) ."')";
+      $ret[] = update_sql("INSERT INTO {image} SELECT DISTINCT f.nid, f.filename, f.fid FROM {files} f INNER JOIN {node} n ON f.nid = n.nid WHERE n.type='image' AND f.filename". $cond);
+
+      // Remove old file_revision records.
+      $ret[] = update_sql("DELETE FROM {file_revisions} WHERE EXISTS (SELECT * FROM {image} WHERE {image}.fid = {file_revisions}.fid)");
+
+      break;
+    case 'pgsql':
+      break;
+  }
+  
+  return $ret;
+}
Index: image.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/image/image.module,v
retrieving revision 1.209.2.34
diff -u -p -r1.209.2.34 image.module
--- image.module	1 Jul 2007 22:00:44 -0000	1.209.2.34
+++ image.module	3 Jul 2007 00:15:48 -0000
@@ -286,10 +286,23 @@ function image_operations_rebuild($nids)
 /**
  * Implementation of hook_prepare().
  */
-function image_prepare(&$node, $field_name) {
+function image_prepare(&$node, $field_name = NULL) {
+  // We need to be aware that a user may try to edit multiple image nodes at
+  // once. By using the $nid variable each node's files can be stored separately
+  // in the session.
+  $nid = ($node->nid) ? $node->nid : 'new_node';
+  // When you enter the edit view the first time we need to clear our files in
+  // session for this node. This is so if you upload a file, then decide you
+  // don't want it and reload the form (without posting), the files will be
+  // discarded.
+  if(count($_POST) == 0) {
+    unset($_SESSION['image_new_files'][$nid]);
+  }
+
   if (is_null($field_name)) {
     $field_name = 'image';
   }
+
   if ($file = file_check_upload($field_name)) {
     // Ensure the file is an image.
     $image_info = image_get_info($file->filepath);
@@ -320,11 +333,17 @@ function image_prepare(&$node, $field_na
     }
     // We're good to go.
     $node->images[IMAGE_ORIGINAL] = $file->filepath;
-    $node->new_file = TRUE;
 
     // Call hook to allow other modules to modify the original image.
     module_invoke_all('image_alter', $node, $file->filepath, IMAGE_ORIGINAL);
     _image_build_derivatives($node, TRUE);
+
+    // Store the new file into the session.
+    $_SESSION['image_new_files'][$nid] = $node->images;
+  }
+  // Reload new files uploaded in a previous preview.
+  else if (isset($_SESSION['image_new_files'][$nid])) {
+    $node->images = $_SESSION['image_new_files'][$nid];
   }
 }
 
@@ -409,15 +428,10 @@ function image_block($op = 'list', $delt
   }
 }
 
-function image_form_add_thumbnail($form_id, $edit) {
-  if ($edit['images']['thumbnail']) {
-    $node = (object)($edit);
-    $form = array(
-      '#type' => 'item',
-      '#title' => t('Thumbnail'),
-      '#value' => image_display($node, IMAGE_THUMBNAIL),
-      '#weight' => -10,
-    );
+function image_form_add_thumbnail($form, $form_values) {
+  if ($form_values['images']['thumbnail']) {
+    $node = (object)($form_values);
+    $form['#value'] = image_display($node, IMAGE_THUMBNAIL);
   }
   return $form;
 }
@@ -439,27 +453,21 @@ function image_form(&$node, &$param) {
     '#default_value' => $node->title
   );
 
-  if ($node->new_file) {
-    $form['new_file'] = array('#type' => 'value', '#value' => TRUE);
-  }
-
   $form['images']['#tree'] = TRUE;
   foreach (_image_get_sizes() as $key => $size) {
-    if ($node->new_file) {
-      $form['images'][$key] = array(
-        '#type' => 'hidden',
-        '#value' => $node->images[$key]
-      );
-    }
-    else {
-      $form['images'][$key] = array(
-        '#type' => 'hidden',
-        '#default_value' => $node->images[$key]
-      );
-    }
+    $form['images'][$key] = array(
+      '#type' => 'value',
+      '#value' => $node->images[$key]
+    );
   }
 
-  $form['thumbnail']['#after_build'][] = 'image_form_add_thumbnail';
+  $form['thumbnail'] = array(
+    '#type' => 'item',
+    '#title' => t('Thumbnail'),
+    '#value' => image_display($node, IMAGE_THUMBNAIL),
+    '#weight' => -10,
+    '#after_build' => array('image_form_add_thumbnail'),
+  );
 
   $form['#attributes'] = array("enctype" => "multipart/form-data");
   $form['image'] = array(
@@ -483,15 +491,18 @@ function image_form(&$node, &$param) {
 }
 
 function image_validate($node) {
-  if (empty($node->images[IMAGE_ORIGINAL])) {
+  $nid = ($node->nid) ? $node->nid : 'new_node';
+  if (!isset($node->images[IMAGE_ORIGINAL]) && !isset($_SESSION['image_new_files'][$nid])) {
     form_set_error('image', t('You must upload an image.'));
   }
 }
 
-function image_submit(&$node) {
-  if ($node->new_file) {
-    _image_remove_derivatives($node);
-    _image_build_derivatives($node, FALSE);
+function image_submit($node) {
+  $nid = ($node->nid) ? $node->nid : 'new_node';
+  if (isset($_SESSION['image_new_files'][$nid])) {
+    $node->new_file = TRUE;
+    $node->images = $_SESSION['image_new_files'][$nid];
+    unset($_SESSION['image_new_files'][$nid]);
   }
 }
 
@@ -513,10 +524,10 @@ function image_view($node, $teaser = 0, 
  * Implementation of hook_load
  */
 function image_load(&$node) {
-  $result = db_query("SELECT filename, filepath FROM {files} WHERE nid=%d", $node->nid);
   $node->images = array();
+  $result = db_query("SELECT i.size, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d", $node->nid);
   while ($file = db_fetch_object($result)) {
-    $node->images[$file->filename] = $file->filepath;
+    $node->images[$file->size] = $file->filepath;
   }
   // If the image is smaller than the thumbnail and prevew images, we just use
   // original image rather than creating new deriviatives.
@@ -532,25 +543,25 @@ function image_load(&$node) {
  * Implementation of hook_insert
  */
 function image_insert($node) {
-  foreach (_image_get_sizes() as $key => $size_info) {
-    _image_insert($node, $key, $node->images[$key]);
-  }
+  _image_save($node);
 }
 
 /**
  * Implementation of hook_update
  */
 function image_update($node) {
-  foreach (_image_get_sizes() as $key => $size) {
-    $old_file = db_fetch_object(db_query("SELECT fid, filepath FROM {files} WHERE filename='%s' AND nid=%d", $key, $node->nid));
-
-    // This is a new image.
-    if (!isset($node->images[$key]) || $old_file->filepath != $node->images[$key]) {
-      file_delete(file_create_path($old_file->filepath));
-      db_query("DELETE FROM {files} WHERE fid = %d", $old_file->fid);
-      db_query("DELETE FROM {file_revisions} WHERE fid = %d", $old_file->fid);
-      _image_insert($node, $key, $node->images[$key]);
+  if ($node->new_file) {
+    _image_remove_derivatives($node);
+    
+    // Remove the original.
+    $file = db_fetch_object(db_query("SELECT i.fid, i.size, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d AND size = '%s'", $node->nid, IMAGE_ORIGINAL));
+    if ($file) {
+      file_delete(file_create_path($file->filepath));
+      db_query("DELETE FROM {files} WHERE fid = %d", $file->fid);
+      db_query("DELETE FROM {image} WHERE fid = %d", $file->fid);
     }
+    
+    _image_save($node);
   }
 }
 
@@ -558,12 +569,12 @@ function image_update($node) {
  * Implementation of hook_delete.
  */
 function image_delete($node) {
-  $result = db_query('SELECT fid, filepath FROM {files} WHERE nid = %d', $node->nid);
+  $result = db_query('SELECT i.fid, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d', $node->nid);
   while ($file = db_fetch_object($result)) {
     file_delete(file_create_path($file->filepath));
-    db_query("DELETE FROM {file_revisions} WHERE fid = %d", $file->fid);
+    db_query('DELETE FROM {files} WHERE fid = %d', $file->fid);
   }
-  db_query('DELETE FROM {files} WHERE nid = %d', $node->nid);
+  db_query("DELETE FROM {image} WHERE nid = %d", $node->nid);
 }
 
 /**
@@ -766,6 +777,11 @@ function _image_build_derivatives(&$node
   }
 
   foreach (_image_get_sizes() as $key => $size) {
+    // Skip over the original.
+    if ($key == IMAGE_ORIGINAL) {
+      continue;
+    }
+
     if (empty($size['width']) || empty($size['height'])) {
       $aspect = $info['height'] / $info['width'];
       if (empty($size['height']) && !empty($size['width'])) {
@@ -796,16 +812,15 @@ function _image_build_derivatives(&$node
 }
 
 function _image_remove_derivatives($node) {
-  $result = db_query("SELECT * FROM {files} WHERE nid=%d AND filename <> '%s'", $node->nid, IMAGE_ORIGINAL);
+  $result = db_query("SELECT i.fid, i.size, f.filepath FROM {image} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.nid = %d AND size <> '%s'", $node->nid, IMAGE_ORIGINAL);
   while ($file = db_fetch_object($result)) {
     // Never delete the original!
     if ($file->filepath != $node->images[IMAGE_ORIGINAL]) {
       file_delete(file_create_path($file->filepath));
     }
+    db_query("DELETE FROM {files} WHERE fid = %d", $file->fid);
   }
-  $original_fid = db_result(db_query("SELECT fid FROM {files} WHERE nid=%d AND filename = '%s'", $node->nid, IMAGE_ORIGINAL));
-  db_query("DELETE FROM {files} WHERE nid = %d AND filename <> '%s'", $node->nid, IMAGE_ORIGINAL);
-  db_query("DELETE FROM {file_revisions} WHERE vid = %d AND fid <> %d", $node->vid, $original_fid);
+  db_query("DELETE FROM {image} WHERE nid = %d AND size <> '%s'", $node->nid, IMAGE_ORIGINAL);
 }
 
 /**
@@ -872,33 +887,35 @@ function _image_required_sizes() {
 }
 
 /**
- * Moves temporary (working) images to the final directory and stores
- * relevant information in the files table
+ * Moves temporary images to the final directory and stores relevant 
+ * information in the image and files tables.
  */
-function _image_insert(&$node, $size, $image_path) {
-  // Make sure there's an image.
-  if (empty($image_path)) {
-    return;
-  }
-
+function _image_save(&$node) {
   $original_path = $node->images[IMAGE_ORIGINAL];
-
-  // Don't duplicate images when a derivative == _original
-  if (($size != IMAGE_ORIGINAL) && (realpath($image_path) == realpath($original_path))) {
-    return;
-  }
-
-  if (file_move($image_path, _image_filename($original_path, $size))) {
-    // Update the node to reflect the actual filename, it may have been changed
-    // if a file of the same name already existed.
-    $node->images[$size] = $image_path;
-
-    $info = image_get_info($image_path);
-    $fid = db_next_id('{files}_fid');
-    db_query("INSERT INTO {files} (fid, nid, filename, filepath, filemime, filesize) VALUES (%d, %d, '%s', '%s', '%s', '%s')",
+var_dump(array_keys(_image_get_sizes()));
+  foreach (array_keys(_image_get_sizes()) as $size) {
+    // Make sure there's an image.
+    if (empty($node->images[$size])) {
+      continue;
+    }
+    $image_path = $node->images[$size];
+    // Don't duplicate images when a derivative == _original
+    if ($size != IMAGE_ORIGINAL && $image_path == $original_path) {
+      continue;
+    }
+
+    if (file_move($image_path, _image_filename($original_path, $size))) {
+      // Update the node to reflect the actual filename, it may have been changed
+      // if a file of the same name already existed.
+      $node->images[$size] = $image_path;
+
+      $info = image_get_info($image_path);
+      $fid = db_next_id('{files}_fid');
+      db_query("INSERT INTO {files} (fid, nid, filename, filepath, filemime, filesize) VALUES (%d, %d, '%s', '%s', '%s', '%s')",
              $fid, $node->nid, $size, $image_path, $info['mime_type'], $info['file_size']);
-    db_query("INSERT INTO {file_revisions} (fid, vid, description, list) VALUES (%d, %d, '%s', %d)",
-             $fid, $node->vid, '', 0);
+      db_query("INSERT INTO {image} (nid, size, fid) VALUES (%d, '%s', %d)",
+             $node->nid, $size, $fid);
+    }
   }
 }
 
