Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.70.2.30.2.91.2.53
diff -u -p -r1.70.2.30.2.91.2.53 privatemsg.module
--- privatemsg.module	8 Jun 2009 14:27:53 -0000	1.70.2.30.2.91.2.53
+++ privatemsg.module	8 Jun 2009 18:26:48 -0000
@@ -261,14 +261,15 @@ function privatemsg_thread_load($thread_
       global $user;
       $account = drupal_clone($user);
     }
-    // load messages returned by the messages query with _privatemsg_load().
     $query = _privatemsg_assemble_query('messages', array($thread_id), $account);
     $conversation = db_query($query['query']);
+    $mids = array();
     while ($result = db_fetch_array($conversation)) {
-      if ($message = _privatemsg_load($result['mid'], $account)) {
-        $thread['messages'][$result['mid']] = $message;
-      }
+      $mids[] = $result['mid'];
     }
+    // load messages returned by the messages query with privatemsg_message_load_multiple().
+    $thread['messages'] = privatemsg_message_load_multiple($mids, $account);
+
     // if there are no messages, don't allow access to the thread.
     if (empty($thread['messages'])) {
       return FALSE;
@@ -863,9 +864,16 @@ function privatemsg_sql_list(&$fragments
  */
 
 /**
- * Query function for load.
+ * Query function for loading a single or multiple messages.
+ *
+ * @param $fragments
+ *   Query fragments array.
+ * @param $pmids
+ *   Array of pmids.
+ * @param $account
+ *   Account for which the messages should be loaded.
  */
-function privatemsg_sql_load(&$fragments, $pmid, $account) {
+function privatemsg_sql_load(&$fragments, $pmids, $account) {
 //  drupal_set_message('<pre>'. print_r(func_get_args(), 1) . '</pre>');
   $fragments['primary_table'] = '{pm_message} pm'; // Our primary table
 
@@ -877,8 +885,8 @@ function privatemsg_sql_load(&$fragments
   $fragments['select'][]      = "pmi.is_new";
 
   $fragments['inner_join'][]  = 'INNER JOIN {pm_index} pmi ON pm.mid = pmi.mid';
-  $fragments['where'][]       = 'pmi.mid = %d';
-  $fragments['query_args']['where'][]  = $pmid;
+  $fragments['where'][]       = 'pmi.mid IN (' . db_placeholders($pmids) . ')';
+  $fragments['query_args']['where']  += $pmids;
   $fragments['where'][]       = 'pmi.uid = %d';
   $fragments['query_args']['where'][]  = $account->uid;
 }
@@ -1113,7 +1121,7 @@ function privatemsg_message_change_delet
     global $user;
     $account = drupal_clone($user);
   }
-  $message = _privatemsg_load($pmid, $account);
+  $message = privatemsg_message_load($pmid, $account);
 
   db_query('UPDATE {pm_index} SET deleted = %d WHERE mid = %d AND uid = %d', $delete, $pmid, $account->uid);
 
@@ -1224,7 +1232,7 @@ function privatemsg_reply($thread_id, $b
 
   // We don't know the subject and the recipients, so we need to load them..
   // thread_id == mid on the first message of the thread
-  $first_message = _privatemsg_load($thread_id, $message['author']);
+  $first_message = privatemsg_message_load($thread_id, $message['author']);
   if (!$first_message) {
     return array(t('Thread %thread_id not found, unable to answer', array('%thread_id' => $thread_id)));
   }
@@ -1400,6 +1408,8 @@ function privatemsg_get_link($recipients
   return $url;
 }
 
+
+
 /**
  * Load a single message.
  *
@@ -1411,24 +1421,48 @@ function privatemsg_get_link($recipients
  *
  * @ingroup api
  */
-function _privatemsg_load($pmid, $account = NULL) {
+function privatemsg_message_load($pmid, $account = NULL) {
+  $messages = privatemsg_message_load_multiple(array($pmid), $account);
+  return current($messages);
+}
+
+/**
+ * Load multiple messages.
+ *
+ * @param $pmid
+ *   Array of Message ids, pm.mid field
+ * @param $account
+ *   For which account the message should be loaded.
+ *   Defaults to the current user.
+ *
+ * @ingroup api
+ */
+function privatemsg_message_load_multiple($pmids, $account = NULL) {
   if (empty($account)) {
     global $user;
     $account = drupal_clone($user);
   }
 
-  $query = _privatemsg_assemble_query('load', $pmid, $account);
+  // Return an empty array, if no mid's are passed in.
+  if (empty($mids)) {
+    return array();
+  }
+
+  $query = _privatemsg_assemble_query('load', $pmids, $account);
 
   $result = db_query($query['query']);
-  $message = db_fetch_array($result);
-  $message['user'] = $account;
-  // Load author of message.
-  $message['author'] = user_load($message['author']);
-  $returned = module_invoke_all('privatemsg_message_load', $message);
-  if (!empty($returned)) {
-    $message = array_merge_recursive($returned, $message);
+  $messages = array();
+  while ($message = db_fetch_array($result)) {
+    $message['user'] = $account;
+    // Load author of message.
+    $message['author'] = user_load($message['author']);
+    $returned = module_invoke_all('privatemsg_message_load', $message);
+    if (!empty($returned)) {
+      $message = array_merge_recursive($returned, $message);
+    }
+    $messages[$message['mid']] = $message;
   }
-  return $message;
+  return $messages;
 }
 
 /**
