Hi,

I've installed the module on Oracle and it crashed on messages listing and threat view. Here's a patch.

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

Berdir’s picture

Status: Active » Needs work
+++ privatemsg.module	(working copy)
@@ -85,9 +85,13 @@
+    ¶
+    //if ((int)$uid > 0 && ($account = array_shift($user_ids))) {
+    if((int)$uid > 0) {
+      $user_ids = privatemsg_user_load_multiple(array($uid));
+      if($account = array_shift($user_ids)) {
+        $participants[privatemsg_recipient_key($account)] = $account;
+      }

No need to keep the commented out line here, just remove it.

Also, I think we should actually fix privatemsg_user_load_multiple() to not blow up when called with uid 0. Which ultimately is a core bug that is known for a long time now :(

+++ privatemsg.module	(working copy)
@@ -1044,8 +1048,12 @@
                                                           WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :current), ',')", 'participants', array(':current' => $account->uid));
     }
+    // Query for a string with uids, for example "1,6,7". This needs a subquery on Oracle.
+    else if(db_driver() == 'oracle') {
+            $query->addExpression("(SELECT distinct LISTAGG(pmia.type || '_' || pmia.recipient,',') WITHIN GROUP (ORDER BY pmia.recipient) FROM userremote.pm_index pmia WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :currentUID)", 'participants', array(':currentUID' => $account->uid));
+	}
     else {
-      $query->addExpression("(SELECT GROUP_CONCAT(DISTINCT CONCAT(pmia.type, '_', pmia.recipient))
+		$query->addExpression("(SELECT GROUP_CONCAT(DISTINCT CONCAT(pmia.type, '_', pmia.recipient))
                                      FROM {pm_index} pmia
                                      WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :current)", 'participants', array(':current' => $account->uid));
     }
@@ -1110,7 +1118,7 @@

Woah, black oracle magic :)

if that works for you then that sounds fine to me. Two remarks:

- You should use :current_uid or something like that, db placeholders shouldn't be in upper case.
- There are some tabs here, that also unecessarly change the mysql query below.

metallized’s picture

Issue summary: View changes

Hi, i got the 7.x.1.3 version of the module and apply this patch but i cannot get into the messages page i'm getting this error:

PDOException: SELECT * FROM (SELECT TAB.*, ROWNUM RWN_TO_REMOVE FROM (SELECT pmi.thread_id AS thread_id, MIN(pm.subject) AS subject, MAX(pm.timestamp) AS last_updated, MAX(pm.has_tokens) AS has_tokens, SUM(pmi.is_new) AS is_new, (SELECT distinct LISTAGG(pmia.type || '_' || pmia.recipient,',') WITHIN GROUP (ORDER BY pmia.recipient) FROM userremote.pm_index pmia WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :currentUID) AS participants FROM {pm_message} pm INNER JOIN {pm_index} pmi ON pm.mid = pmi.mid WHERE (pmi.recipient = :db_condition_placeholder_0) AND (pmi.type IN (:db_condition_placeholder_1, :db_condition_placeholder_2)) AND (pmi.deleted = :db_condition_placeholder_3) GROUP BY pmi.thread_id ORDER BY last_updated DESC) TAB) WHERE RWN_TO_REMOVE BETWEEN 1 AND 25 (prepared: SELECT * FROM (SELECT TAB.*, ROWNUM RWN_TO_REMOVE FROM (SELECT pmi.thread_id AS thread_id, MIN(pm.subject) AS subject, MAX(pm.timestamp) AS last_updated, MAX(pm.has_tokens) AS has_tokens, SUM(pmi.is_new) AS is_new, (SELECT distinct LISTAGG(pmia.type || '_' || pmia.recipient,',') WITHIN GROUP (ORDER BY pmia.recipient) FROM userremote.pm_index pmia WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :currentUID) AS participants FROM "PM_MESSAGE" pm INNER JOIN "PM_INDEX" pmi ON pm.mid = pmi.mid WHERE (pmi.recipient = :db_condition_placeholder_0) AND (pmi.type IN (:db_condition_placeholder_1, :db_condition_placeholder_2)) AND (pmi.deleted = :db_condition_placeholder_3) GROUP BY pmi.thread_id ORDER BY last_updated DESC) TAB) WHERE RWN_TO_REMOVE BETWEEN 1 AND 25 ) e: SQLSTATE[HY000]: General error: 942 OCIStmtExecute: ORA-00942: table or view does not exist (/root/PDO_OCI-1.0/oci_statement.c:142) args: Array ( [:db_condition_placeholder_0] => 1 [:db_condition_placeholder_1] => hidden [:db_condition_placeholder_2] => user [:db_condition_placeholder_3] => 0 [:currentUID] => 1 ) en PagerDefault->execute() (línea 79 de /var/www/html/includes/pager.inc).

Some advice is highly appreciated. Suscribe.

metallized’s picture

Hi, i was able to get work this module over the 7.x-1.4 version. here is the diff i got can anyone help me making this a patch?

diff -ENur Desktop/privatemsg/privatemsg.module /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg.module
--- Desktop/privatemsg/privatemsg.module	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg.module	2014-11-25 14:45:56.000000000 -0500
@@ -1046,6 +1046,9 @@
                                                           FROM {pm_index} pmia
                                                           WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :current), ',')", 'participants', array(':current' => $account->uid));
     }
+    else if(db_driver() == 'oracle') {
+      $query->addExpression("(SELECT distinct LISTAGG(pmia.type || '_' || pmia.recipient,',') WITHIN GROUP (ORDER BY pmia.recipient) FROM pm_index pmia WHERE pmia.type <> 'hidden' AND pmia.thread_id = pmi.thread_id AND pmia.recipient <> :current_uid)", 'participants', array(':current_uid' => $account->uid));
+    }
     else {
       $query->addExpression("(SELECT GROUP_CONCAT(DISTINCT CONCAT(pmia.type, '_', pmia.recipient))
                                      FROM {pm_index} pmia
@@ -1130,7 +1133,12 @@
     ));
 
     // Only load recipients of messages which are visible for that user.
-    $query->where('(SELECT 1 FROM {pm_index} pmiu WHERE pmi.mid = pmiu.mid AND pmiu.recipient = :recipient LIMIT 1) = 1', array(':recipient' => $account->uid));
+    if(db_driver() == 'oracle') {
+      $query->where('(SELECT 1 FROM {pm_index} pmiu WHERE pmi.mid = pmiu.mid AND pmiu.recipient = :recipient AND rownum <= 1) = 1', array(':recipient' => $account->uid));
+    }
+    else {
+      $query->where('(SELECT 1 FROM {pm_index} pmiu WHERE pmi.mid = pmiu.mid AND pmiu.recipient = :recipient LIMIT 1) = 1', array(':recipient' => $account->uid));
+    }
   }
   else {
     // If not, only limit participants to visible ones.
diff -ENur Desktop/privatemsg/privatemsg_filter/privatemsg_filter.admin.inc /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.admin.inc
--- Desktop/privatemsg/privatemsg_filter/privatemsg_filter.admin.inc	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.admin.inc	2014-11-25 15:51:57.000000000 -0500
@@ -23,9 +23,9 @@
       'field'   => 'count',
       'class'   => array('privatemsg-filter-header-usage'),
     ),
-    'public' => array(
-      'data'    => t('Public'),
-      'field'   => 'public',
+    'is_public' => array(
+      'data'    => t('Is Public'),
+      'field'   => 'is_public',
       'class'   => array('privatemsg-filter-header-public'),
     ),
     'operations' => array(
@@ -43,7 +43,7 @@
     $row = array();
     $row['tag'] = check_plain($tag->tag);
     $row['count'] = $tag->count;
-    $row['public'] = $tag->public ? t('Yes') : '-';
+    $row['is_public'] = $tag->is_public ? t('Yes') : '-';
     $row['operations'] = l(t('edit'), 'admin/config/messaging/privatemsg/tags/edit/' . $tag->tag_id);
     $row['operations'] .= ' ' . l(t('delete'), 'admin/config/messaging/privatemsg/tags/delete/' . $tag->tag_id);
 
@@ -83,10 +83,10 @@
     '#default_value' => empty($tag_id) ? NULL : $tag['tag'],
   );
 
-  $form['public'] = array(
-    '#title' => t('Public'),
+  $form['is_public'] = array(
+    '#title' => t('IS Public'),
     '#type' => 'checkbox',
-    '#default_value' => empty($tag_id) ? TRUE : $tag['public'],
+    '#default_value' => empty($tag_id) ? TRUE : $tag['is_public'],
     '#description' => t('Public tags are visible for all users, private tags are only visible if they use them.'),
   );
 
@@ -131,7 +131,7 @@
     db_update('pm_tags')
       ->fields(array(
         'tag' => $form_state['values']['tag'],
-        'public' => $form_state['values']['public'],
+        'is_public' => $form_state['values']['is_public'],
       ))
       ->condition('tag_id', $form_state['values']['tag_id'])
       ->execute();
@@ -142,7 +142,7 @@
     db_insert('pm_tags')
       ->fields(array(
         'tag' => $form_state['values']['tag'],
-        'public' => $form_state['values']['public'],
+        'is_public' => $form_state['values']['is_public'],
       ))
       ->execute();
     drupal_set_message(t('Tag created.'));
diff -ENur Desktop/privatemsg/privatemsg_filter/privatemsg_filter.install /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.install
--- Desktop/privatemsg/privatemsg_filter/privatemsg_filter.install	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.install	2014-11-25 15:31:00.000000000 -0500
@@ -26,7 +26,7 @@
         'length'        => 255,
         'not null'      => TRUE,
       ),
-      'public'    => array(
+      'is_public'    => array(
         'description'   => 'Defines if a tag is public (visible for all users)',
         'type'          => 'int',
         'unsigned'      => TRUE,
@@ -43,7 +43,7 @@
     ),
     'primary key'     => array('tag_id'),
     'indexes'     => array(
-      'tag_list'    => array('tag_id', 'tag', 'public'),
+      'tag_list'    => array('tag_id', 'tag', 'is_public'),
     ),
   );
 
diff -ENur Desktop/privatemsg/privatemsg_filter/privatemsg_filter.module /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.module
--- Desktop/privatemsg/privatemsg_filter/privatemsg_filter.module	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.module	2014-11-25 16:03:43.000000000 -0500
@@ -894,7 +894,7 @@
  */
 function privatemsg_filter_sql_tags($user = NULL, $threads = NULL, $limit = NULL, $showHidden = FALSE) {
   $query = db_select('pm_tags', 't')
-    ->fields('t', array('tag_id', 'tag', 'public'))
+    ->fields('t', array('tag_id', 'tag', 'is_public'))
     ->orderBy('t.tag', 'ASC');
   if (!empty($threads)) {
     $query->addField('ti', 'thread_id');
@@ -907,7 +907,7 @@
     $query
       ->groupBy('t.tag_id')
       ->groupBy('t.tag')
-      ->groupBy('t.public');
+      ->groupBy('t.is_public');
   }
   if (!empty($user)) {
     $query->condition('ti.uid', $user->uid);
diff -ENur Desktop/privatemsg/privatemsg_filter/privatemsg_filter.test /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.test
--- Desktop/privatemsg/privatemsg_filter/privatemsg_filter.test	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_filter/privatemsg_filter.test	2014-11-25 15:53:30.000000000 -0500
@@ -195,19 +195,19 @@
     // Prepare data.
     $private = array(
       'tag' => $this->randomName(10),
-      'public' => FALSE,
+      'is_public' => FALSE,
     );
     $public = array(
       'tag' => $this->randomName(10),
-      'public' => 1,
+      'is_public' => 1,
     );
     $to_edit = array(
       'tag' => $this->randomName(10),
-      'public' => 1,
+      'is_public' => 1,
     );
     $edited_tag = array(
       'tag' => $this->randomName(10),
-      'public' => FALSE,
+      'is_public' => FALSE,
     );
     $duplicate = $private;
 
diff -ENur Desktop/privatemsg/privatemsg_roles/privatemsg_roles.module /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_roles/privatemsg_roles.module
--- Desktop/privatemsg/privatemsg_roles/privatemsg_roles.module	2013-07-12 20:27:18.000000000 -0500
+++ /Applications/MAMP/htdocs/ccp/sites/all/modules/contrib/privatemsg/privatemsg_roles/privatemsg_roles.module	2014-11-26 11:48:20.000000000 -0500
@@ -128,7 +128,13 @@
 function privatemsg_roles_privatemsg_name_lookup($string) {
   // Remove optional role specifier.
   $string = str_replace(t('[role]'), '', $string);
-  $role = db_query("SELECT *, rid AS recipient FROM {role} WHERE name = :name", array(':name' => trim($string)))->fetchObject();
+  //Support Oracle
+  if(db_driver() == 'oracle') {
+    $role = db_query("SELECT rid AS recipient FROM {role} WHERE name = :name", array(':name' => trim($string)))->fetchObject();
+  }
+  else {
+    $role = db_query("SELECT *, rid AS recipient FROM {role} WHERE name = :name", array(':name' => trim($string)))->fetchObject();
+  }
   if ($role) {
     $role->type = 'role';
     return array(privatemsg_recipient_key($role) => $role);
metallized’s picture

Version: 7.x-1.3 » 7.x-1.4
Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, privatemsg.module.patch, failed testing.

metallized’s picture

Sorry wrong patch...

metallized’s picture

FileSize
8.63 KB

Here is

metallized’s picture

metallized’s picture

metallized’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 7: 1840428-oracle-support.patch, failed testing.

oadaeh’s picture

Category: Bug report » Feature request

Since this is stated on the project's home page:

"If you are interested in a stable and tested version of Privatemsg, use the latest stable 1.x release. No new features will be added to these branches and the API and UI is stable and will not be changed (including strings for translation)."

This patch will not go into the 1.x branch.
If you want to update it for the 2.x branch, maybe it will go in there.

soraver’s picture

Patch in #3 worked for me too.

ivnish’s picture

Status: Needs work » Closed (outdated)
andypost’s picture

Status: Closed (outdated) » Needs work

D7 is not yet outdated