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	20 Feb 2008 05:23:09 -0000
@@ -106,7 +106,10 @@
       ");
       break;
   }
+
   db_query(_xmlsitemap_node_insert_query());
+  _xmlsitemap_node_updatepids(10000);
+  drupal_set_message(t('Paths have been updated for all nodes for your XML Sitemap.'));
   xmlsitemap_update_sitemap();
 }
 
@@ -117,28 +120,17 @@
 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";
-  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 .= "
+    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
+    GROUP BY n.nid, n.changed, s.last_comment_timestamp
   ";
   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	20 Feb 2008 05:22:19 -0000
@@ -5,6 +5,86 @@
  * @file Adds nodes to the site map.
  */
 
+
+function xmlsitemap_node_menu($maycache) {
+  $items = array();
+  $access_config = user_access('administer site configuration');
+  $items[] = array(
+    'path' => 'admin/settings/xmlsitemap/node',
+    'title' => t('XML Node'),
+    'description' => t('XML Node settings'),
+    'access' => $access_config,
+    'callback' => 'drupal_get_form',
+    'callback arguments' => array('xmlsitemap_node_admin_form'),
+  );
+  
+  return $items;
+}
+
+/**
+ * Settings page
+ */
+function xmlsitemap_node_admin_form() {
+  $form = array();
+  $batch_range = drupal_map_assoc(range(1000,10000, 1000));
+  $batch_range += drupal_map_assoc(range(10000,100000, 10000));
+  // Get the status information
+  $total_nodes = db_result(db_query("SELECT COUNT(*) FROM {xmlsitemap_node}"));
+  $to_process = db_result(db_query("SELECT COUNT(*) FROM {xmlsitemap_node} WHERE pid = 0"));
+  $form['info'] = array(
+    '#type' => 'fieldset',
+  );
+  $form['info']['status'] = array(
+    '#value' => t('There are currently !proc out of !total (!perc %) left to proccess.',
+    array('!proc' => "<strong>$to_process</strong>",
+          '!total' => "<strong>$total_nodes</strong>",
+          '!perc' => sprintf("%.2f", $to_process/$total_nodes) * 100)
+    ),
+  );
+  $form['info']['run_update'] = array(
+    '#prefix' => '<br />',
+    '#type' => 'submit',
+    '#value' => t('Run Batch Update'),
+  );
+  
+  $form['xn_batch_size'] = array(
+    '#title' => t('Batch Update Size'),
+    '#type' => 'select',
+    '#options' => $batch_range,
+    '#default_value' => variable_get('xn_batch_size', 10000),
+  );
+  $form['save'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save Configuration'),
+  );
+  
+  return $form;
+}
+
+/**
+ * hook_submit for xmlsitemap_node_admin_form
+ */
+function xmlsitemap_node_admin_form_submit($form_id, $form_values) {
+  switch($form_values['op']) {
+    case t('Run Batch Update'):
+      $timer = "xn_pid_update";
+      timer_start($timer);
+      _xmlsitemap_node_updatepids($form_values['xn_batch_size']);
+      $stop = timer_read($timer);
+      timer_stop($timer);
+      drupal_set_message(t('!proc node proccessed in !time seconds.',
+        array('!proc' => $form_values['xn_batch_size'],
+              '!time' => sprintf("%.2f", $stop/1000))
+      ));
+      break;
+    case t('Save Configuration'):
+      variable_set('xn_batch_size', $form_values['xn_batch_size']);
+      drupal_set_message(t('You settings have been updated.'));
+      break;
+  }
+  return 'admin/settings/xmlsitemap/node';
+}
+
 /**
  * Implementation of hook_xmlsitemap_links().
  */
@@ -257,50 +337,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 +423,57 @@
   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($batch_size = null) {
+  if($batch_size != null) {
+    $update_rs = db_query_range("SELECT nid FROM {xmlsitemap_node} WHERE pid = 0", $batch_size);
+  }
+  else {
+    $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'
+              )
+              WHERE nid = %d", 'node/' . $row->nid, $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) {
+  $path = drupal_lookup_path('alias', 'node/' . $node->nid);
+  db_query("UPDATE {xmlsitemap_node} xn SET xn.pid = (
+              SELECT ua.pid FROM {url_alias} ua WHERE ua.src = '%s'
+            )
+            WHERE nid = %d", 'node/' . $nid, $nid);
+  return;
 }
 

