? 753426_19.patch
? 828000-feeds_node_item_primary-2.patch
? 828000-feeds_node_item_primary.patch
Index: feeds.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/feeds.install,v
retrieving revision 1.7
diff -u -r1.7 feeds.install
--- feeds.install	23 Feb 2010 04:59:06 -0000	1.7
+++ feeds.install	16 Jun 2010 18:53:07 -0000
@@ -178,7 +178,7 @@
         'description' => t('The hash of the item.'),
       ),
     ),
-    'primary key' => array('nid'),
+    'primary key' => array('nid', 'id', 'feed_nid'),
     'indexes' => array(
       'id' => array('id'),
       'feed_nid' => array('feed_nid'),
@@ -492,3 +492,14 @@
   db_create_table($ret, 'feeds_push_subscriptions', $table);
   return $ret;
 }
+
+/**
+ * Change the primary key of {feeds_node_item} from nid to nid, id, feed_nid
+ * to support multiple feeds updating a node.
+ */
+function feeds_update_6010() {
+  $ret = array();
+  db_drop_primary_key($ret, 'feeds_node_item');
+  db_add_primary_key($ret, 'feeds_node_item', array('nid', 'id', 'feed_nid'));
+  return $ret;
+}
\ No newline at end of file
Index: feeds.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/feeds.module,v
retrieving revision 1.46
diff -u -r1.46 feeds.module
--- feeds.module	16 May 2010 20:59:13 -0000	1.46
+++ feeds.module	16 Jun 2010 18:53:07 -0000
@@ -328,26 +328,27 @@
 function _feeds_nodeapi_node_processor($node, $op) {
   switch ($op) {
     case 'load':
-      if ($result = db_fetch_object(db_query("SELECT imported, guid, url, feed_nid FROM {feeds_node_item} WHERE nid = %d", $node->nid))) {
-        $node->feeds_node_item = $result;
+      $result = db_query("SELECT imported, guid, url, feed_nid FROM {feeds_node_item} WHERE nid = %d", $node->nid);
+      while ($row = db_fetch_object($result)) {
+        $node->feeds_node_item[$row->feed_nid] = $row;
       }
       break;
     case 'insert':
-      if (isset($node->feeds_node_item)) {
-        $node->feeds_node_item->nid = $node->nid;
-        drupal_write_record('feeds_node_item', $node->feeds_node_item);
+      if (isset($node->feeds_feed_nid) && isset($node->feeds_node_item[$node->feeds_feed_nid])) {
+        $node->feeds_node_item[$node->feeds_feed_nid]->nid = $node->nid;
+        drupal_write_record('feeds_node_item', $node->feeds_node_item[$node->feeds_feed_nid]);
       }
       break;
     case 'update':
-      if (isset($node->feeds_node_item)) {
-        $node->feeds_node_item->nid = $node->nid;
-        drupal_write_record('feeds_node_item', $node->feeds_node_item, 'nid');
+      if (isset($node->feeds_feed_nid) && isset($node->feeds_node_item[$node->feeds_feed_nid])) {
+        $node->feeds_node_item[$node->feeds_feed_nid]->nid = $node->nid;
+        drupal_write_record('feeds_node_item', $node->feeds_node_item[$node->feeds_feed_nid], array('nid', 'feed_nid', 'id'));
       }
       break;
     case 'delete':
-      if (isset($node->feeds_node_item)) {
-        db_query("DELETE FROM {feeds_node_item} WHERE nid = %d", $node->nid);
-      }
+      // If the node is being deleted we need to remove all associated records
+      // from all feed sources.
+      db_query("DELETE FROM {feeds_node_item} WHERE nid = %d", $node->nid);
       break;
   }
 }
Index: plugins/FeedsNodeProcessor.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/plugins/FeedsNodeProcessor.inc,v
retrieving revision 1.34
diff -u -r1.34 FeedsNodeProcessor.inc
--- plugins/FeedsNodeProcessor.inc	16 May 2010 21:24:50 -0000	1.34
+++ plugins/FeedsNodeProcessor.inc	16 Jun 2010 18:53:07 -0000
@@ -33,7 +33,7 @@
         // If updating check whether item actually has changed and if so,
         // retrieve its nid and vid.
         if (!empty($nid)) {
-          if ($hash == $this->getHash($nid)) {
+          if ($hash == $this->getHash($nid, $source->feed_nid)) {
             continue;
           }
           $node->nid = $nid;
@@ -46,11 +46,14 @@
         // Populate and prepare node object.
         $node->type = $this->config['content_type'];
         $node->changed = FEEDS_REQUEST_TIME;
-        $node->feeds_node_item = new stdClass();
-        $node->feeds_node_item->hash = $hash;
-        $node->feeds_node_item->id = $this->id;
-        $node->feeds_node_item->imported = FEEDS_REQUEST_TIME;
-        $node->feeds_node_item->feed_nid = $source->feed_nid;
+        // Stuff the feed_nid in $node so _feeds_nodeapi_node_processor() knows
+        // which feed source to work on.
+        $node->feeds_feed_nid = (int)$source->feed_nid;
+        $node->feeds_node_item[$node->feeds_feed_nid] = new stdClass();
+        $node->feeds_node_item[$node->feeds_feed_nid]->hash = $hash;
+        $node->feeds_node_item[$node->feeds_feed_nid]->id = $this->id;
+        $node->feeds_node_item[$node->feeds_feed_nid]->imported = FEEDS_REQUEST_TIME;
+        $node->feeds_node_item[$node->feeds_feed_nid]->feed_nid = $source->feed_nid;
         static $included;
         if (!$included) {
           module_load_include('inc', 'node', 'node.pages');
@@ -209,8 +212,8 @@
    * Override setTargetElement to operate on a target item that is a node.
    */
   public function setTargetElement($target_node, $target_element, $value) {
-    if (in_array($target_element, array('url', 'guid'))) {
-      $target_node->feeds_node_item->$target_element = $value;
+    if (isset($target_node->feeds_node_item[$target_node->feeds_feed_nid]) && in_array($target_element, array('url', 'guid'))) {
+      $target_node->feeds_node_item[$target_node->feeds_feed_nid]->$target_element = $value;
     }
     elseif ($target_element == 'body') {
       $target_node->teaser = node_teaser($value);
@@ -325,11 +328,11 @@
   }
 
   /**
-   * Retrieve MD5 hash of $nid from DB.
+   * Retrieve MD5 hash of the imported feed item from DB.
    * @return Empty string if no item is found, hash otherwise.
    */
-  protected function getHash($nid) {
-    $hash = db_result(db_query("SELECT hash FROM {feeds_node_item} WHERE nid = %d", $nid));
+  protected function getHash($nid, $feed_nid) {
+    $hash = db_result(db_query("SELECT hash FROM {feeds_node_item} WHERE nid = %d AND feed_nid = %d AND id = '%s'", $nid, $feed_nid, $this->id));
     if ($hash) {
       // Return with the hash.
       return $hash;
Index: tests/feeds.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feeds/tests/feeds.test,v
retrieving revision 1.16
diff -u -r1.16 feeds.test
--- tests/feeds.test	16 May 2010 21:35:08 -0000	1.16
+++ tests/feeds.test	16 Jun 2010 18:53:07 -0000
@@ -928,8 +928,8 @@
     $this->assertEqual($node->title, 'monthly', 'Feed item 1 changefreq is correct.');
     $this->assertEqual($node->body, '0.8', 'Feed item 1 priority is correct.');
     $this->assertEqual($node->created, strtotime('2005-01-01'), 'Feed item 1 lastmod is correct.');
-    $this->assertEqual($node->feeds_node_item->url, 'http://www.example.com/', 'Feed item 1 url is correct.');
-    $this->assertEqual($node->feeds_node_item->url, $node->feeds_node_item->guid, 'Feed item 1 guid is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, 'http://www.example.com/', 'Feed item 1 url is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, $node->feeds_node_item[key($node->feeds_node_item)]->guid, 'Feed item 1 guid is correct.');
 
     // Check second item.
     $item = db_fetch_object($result);
@@ -937,8 +937,8 @@
     $this->assertEqual($node->title, 'weekly', 'Feed item 2 changefreq is correct.');
     $this->assertEqual($node->body, '', 'Feed item 2 priority is correct.');
     // $node->created is... recently
-    $this->assertEqual($node->feeds_node_item->url, 'http://www.example.com/catalog?item=12&desc=vacation_hawaii', 'Feed item 2 url is correct.');
-    $this->assertEqual($node->feeds_node_item->url, $node->feeds_node_item->guid, 'Feed item 2 guid is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, 'http://www.example.com/catalog?item=12&desc=vacation_hawaii', 'Feed item 2 url is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, $node->feeds_node_item[key($node->feeds_node_item)]->guid, 'Feed item 2 guid is correct.');
 
     // Check third item.
     $item = db_fetch_object($result);
@@ -946,8 +946,8 @@
     $this->assertEqual($node->title, 'weekly', 'Feed item 3 changefreq is correct.');
     $this->assertEqual($node->body, '', 'Feed item 3 priority is correct.');
     $this->assertEqual($node->created, strtotime('2004-12-23'), 'Feed item 3 lastmod is correct.');
-    $this->assertEqual($node->feeds_node_item->url, 'http://www.example.com/catalog?item=73&desc=vacation_new_zealand', 'Feed item 3 url is correct.');
-    $this->assertEqual($node->feeds_node_item->url, $node->feeds_node_item->guid, 'Feed item 3 guid is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, 'http://www.example.com/catalog?item=73&desc=vacation_new_zealand', 'Feed item 3 url is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, $node->feeds_node_item[key($node->feeds_node_item)]->guid, 'Feed item 3 guid is correct.');
 
     // Check fourth item.
     $item = db_fetch_object($result);
@@ -955,8 +955,8 @@
     $this->assertEqual($node->title, '', 'Feed item 4 changefreq is correct.');
     $this->assertEqual($node->body, '0.3', 'Feed item 4 priority is correct.');
     $this->assertEqual($node->created, strtotime('2004-12-23T18:00:15+00:00'), 'Feed item 4 lastmod is correct.');
-    $this->assertEqual($node->feeds_node_item->url, 'http://www.example.com/catalog?item=74&desc=vacation_newfoundland', 'Feed item 4 url is correct.');
-    $this->assertEqual($node->feeds_node_item->url, $node->feeds_node_item->guid, 'Feed item 1 guid is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, 'http://www.example.com/catalog?item=74&desc=vacation_newfoundland', 'Feed item 4 url is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, $node->feeds_node_item[key($node->feeds_node_item)]->guid, 'Feed item 1 guid is correct.');
 
     // Check fifth item.
     $item = db_fetch_object($result);
@@ -964,8 +964,8 @@
     $this->assertEqual($node->title, '', 'Feed item 5 changefreq is correct.');
     $this->assertEqual($node->body, '', 'Feed item 5 priority is correct.');
     $this->assertEqual($node->created, strtotime('2004-11-23'), 'Feed item 5 lastmod is correct.');
-    $this->assertEqual($node->feeds_node_item->url, 'http://www.example.com/catalog?item=83&desc=vacation_usa', 'Feed item 5 url is correct.');
-    $this->assertEqual($node->feeds_node_item->url, $node->feeds_node_item->guid, 'Feed item 5 guid is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, 'http://www.example.com/catalog?item=83&desc=vacation_usa', 'Feed item 5 url is correct.');
+    $this->assertEqual($node->feeds_node_item[key($node->feeds_node_item)]->url, $node->feeds_node_item[key($node->feeds_node_item)]->guid, 'Feed item 5 guid is correct.');
 
     // Check for more items.
     $item = db_fetch_object($result);
