Index: xmlsitemap_node.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/xmlsitemap/xmlsitemap_node/xmlsitemap_node.install,v
retrieving revision 1.1.2.11
diff -u -r1.1.2.11 xmlsitemap_node.install
--- xmlsitemap_node.install	9 Dec 2007 15:10:45 -0000	1.1.2.11
+++ xmlsitemap_node.install	19 Feb 2008 05:06:00 -0000
@@ -117,27 +117,42 @@
 function _xmlsitemap_node_insert_query() {
   $query = "
     INSERT INTO {xmlsitemap_node} (nid, pid, last_changed, last_comment, previous_comment)
-    SELECT n.nid, ua.pid, n.changed, s.last_comment_timestamp, MAX(c.timestamp) FROM {node} n
+    SELECT n.nid, 0, n.changed, s.last_comment_timestamp, MAX(c.timestamp) FROM {node} n
     LEFT JOIN {node_comment_statistics} s ON s.nid = n.nid
     LEFT OUTER JOIN {comments} c ON c.nid = n.nid AND c.timestamp < s.last_comment_timestamp
-    LEFT JOIN {xmlsitemap_node} xn ON xn.nid = n.nid";
+    LEFT JOIN {xmlsitemap_node} xn ON xn.nid = n.nid
+    WHERE xn.nid IS NULL
+    GROUP BY n.nid, ua.pid, n.changed, s.last_comment_timestamp
+  ";
+  return $query;
+}
+
+/**
+ * Build SQL query for updating pids in xmlsitemap_node table.
+ * @return Query string
+ */
+function _xmlsitemap_node_updatepid_query() {
   switch ($GLOBALS['db_type']) {
     case 'mysql':
     case 'mysqli':
-      $query .= "
-        LEFT JOIN {url_alias} ua ON ua.src = CONCAT('node/', n.nid)";
+      $query = "
+        UPDATE {xmlsitemap_node} xn INNER JOIN {url_alias} ua ON
+        ua.src = CONCAT('node/', xn.nid)
+        SET xn.pid = ua.pid
+        WHERE xn.pid = 0
+      ";
       break;
     case 'pgsql':
-      $query .= "
-        LEFT JOIN {url_alias} ua ON ua.src = 'node/' || n.nid";
+      $query = "
+        UPDATE {xmlsitemap_node} xn
+        SET pid = {url_alias}.pid
+        FROM {url_alias} ua
+        WHERE ua.src = 'node/' || xn.nid AND xn.pid = 0
+      ";
       break;
-  }
-  $query .= "
-    WHERE xn.nid IS NULL
-    GROUP BY n.nid, ua.pid, n.changed, s.last_comment_timestamp
-  ";
-  return $query;
-}
+   }
+   return $query;
+ }
 
 /**
  * Implementation of hook_disable().
Index: xmlsitemap_node.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/xmlsitemap/xmlsitemap_node/xmlsitemap_node.module,v
retrieving revision 1.1.2.14
diff -u -r1.1.2.14 xmlsitemap_node.module
--- xmlsitemap_node.module	10 Dec 2007 03:15:12 -0000	1.1.2.14
+++ xmlsitemap_node.module	19 Feb 2008 05:53:44 -0000
@@ -257,50 +257,27 @@
     case 'insert':
       $node->priority_override = isset($node->priority_override) ? $node->priority_override : 'NULL';
       $query = "
-        INSERT INTO {xmlsitemap_node} (nid, pid, last_changed, priority_override)
-        SELECT %d, ua.pid, %d, %s
-        FROM {node} n";
-      switch ($GLOBALS['db_type']) {
-        case 'mysql':
-        case 'mysqli':
-          $query .= "
-            LEFT JOIN {url_alias} ua ON ua.src = CONCAT('node/', %d)";
-          break;
-        case 'pgsql':
-          $query .= "
-            LEFT JOIN {url_alias} ua ON ua.src = 'node/' || %d";
-          break;
-      }
-      $query .= "
-        LIMIT 1
-      ";
+      INSERT INTO {xmlsitemap_node} (nid, pid, last_changed, priority_override)
+        SELECT %d, 0, %d, %s
+        FROM {node} n
+        WHERE nid = %d";
       db_query($query, $node->nid, $node->changed, $node->priority_override, $node->nid);
       if ($node->status) {
         xmlsitemap_update_sitemap();
       }
+      _xmlsitemap_node_updatepid($node->nid);
       break;
     case 'update':
       if (!isset($node->priority_override)) {
         $priority = db_result(db_query("SELECT priority_override FROM {xmlsitemap_node} WHERE nid = %d", $node->nid));
         $node->priority_override = isset($priority) && $priority !== FALSE ? $priority : 'NULL';
       }
-      switch ($GLOBALS['db_type']) {
-        case 'mysql':
-        case 'mysqli':
-          db_query("
-            UPDATE {xmlsitemap_node} xn LEFT JOIN {url_alias} ua ON ua.src = CONCAT('node/', xn.nid)
-            SET xn.pid = ua.pid, xn.previously_changed = xn.last_changed, xn.last_changed = %d, xn.priority_override = %s
-            WHERE xn.nid = %d
-          ", $node->changed, $node->priority_override, $node->nid);
-          break;
-        case 'pgsql':
-          db_query("
-            UPDATE {xmlsitemap_node}
-            SET pid = {url_alias}.pid, previously_changed = last_changed, last_changed = %d, priority_override = %s
-            FROM {url_alias} WHERE nid = %d AND ({url_alias}.src = 'node/' || nid OR {url_alias}.src IS NULL)
-          ", $node->changed, $node->priority_override, $node->nid);
-          break;
-      }
+      db_query("
+        UPDATE {xmlsitemap_node} xn 
+        SET xn.pid = 0, xn.previously_changed = xn.last_changed, xn.last_changed = %d, xn.priority_override = %s
+        WHERE xn.nid = %d
+      ", $node->changed, $node->priority_override, $node->nid);
+      _xmlsitemap_node_updatepid($node->nid);
       if ($node->status || $node->xmlsitemap_node_status) {
         xmlsitemap_update_sitemap();
       }
@@ -366,27 +343,48 @@
   if (db_result(db_query_range("SELECT COUNT(*) FROM {node} n LEFT JOIN {xmlsitemap_node} xn ON xn.nid = n.nid WHERE xn.nid IS NULL", 0, 1))) {
     $query = "
       INSERT INTO {xmlsitemap_node} (nid, pid, last_changed, last_comment, previous_comment)
-      SELECT n.nid, ua.pid, n.changed, s.last_comment_timestamp, MAX(c.timestamp) FROM {node} n
+      SELECT n.nid, 0, n.changed, s.last_comment_timestamp, MAX(c.timestamp) FROM {node} n
       LEFT JOIN {node_comment_statistics} s ON s.nid = n.nid
       LEFT OUTER JOIN {comments} c ON c.nid = n.nid AND c.timestamp < s.last_comment_timestamp
       LEFT JOIN {xmlsitemap_node} xn ON xn.nid = n.nid";
-    switch ($GLOBALS['db_type']) {
-      case 'mysql':
-      case 'mysqli':
-        $query .= "
-          LEFT JOIN {url_alias} ua ON ua.src = CONCAT('node/', n.nid)";
-        break;
-      case 'pgsql':
-        $query .= "
-          LEFT JOIN {url_alias} ua ON ua.src = 'node/' || n.nid";
-        break;
-    }
     $query .= "
       WHERE xn.nid IS NULL
-      GROUP BY n.nid, ua.pid, n.changed, s.last_comment_timestamp
+      GROUP BY n.nid, n.changed, s.last_comment_timestamp
     ";
     db_query($query);
+    // Update the pids
+    _xmlsitemap_node_updatepids();
+    // Update sitemap
     xmlsitemap_update_sitemap();
   }
 }
 
+/**
+ * @author Earnest Berry III <earnest dot berry at gmail dot com>
+ * Build SQL query for updating pids in xmlsitemap_node table.
+ * @return Query string
+ * Doing a join on a function is bad practice and very inefficient.
+ * There are 2 options:
+ * 1. Create a Temporary table
+ * 2. Run the query, and update each row individually.
+ */
+function _xmlsitemap_node_updatepids() {
+  $update_rs = db_query("SELECT nid FROM {xmlsitemap_node} WHERE pid = 0");
+  while($row = db_fetch_object($update_rs)) {
+    db_query("UPDATE {xmlsitemap_node} xn SET xn.pid = (
+                SELECT ua.pid FROM {url_alias} ua WHERE ua.src = '%s'
+              )", 'node/' . $row->nid);
+  }
+  return;
+}
+/**
+ * @author Earnest Berry III <earnest dot berry at gmail dot com>
+ * Updates the pid for one node.
+ */
+function _xmlsitemap_node_updatepid($nid) {
+  db_query("UPDATE {xmlsitemap_node} xn SET xn.pid = (
+              SELECT ua.pid FROM {url_alias} ua WHERE ua.src = '%s'
+            )", 'node/' . $nid);
+  return;
+}
+

