? 232564_comment_notify_refactor_for_own_table_and_postgres.patch ? 232564_comment_notify_refactor_for_own_table_and_postgres_4.patch ? 282201_comment_notify_one_mail_per_comment.patch ? cvs-release-notes.php Index: comment_notify.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/comment_notify/comment_notify.install,v retrieving revision 1.1.4.3 diff -u -p -r1.1.4.3 comment_notify.install --- comment_notify.install 7 May 2008 17:55:05 -0000 1.1.4.3 +++ comment_notify.install 23 Jul 2008 19:02:02 -0000 @@ -8,27 +8,42 @@ function comment_notify_install() { switch ($GLOBALS['db_type']) { case 'mysql': case 'mysqli': - $status[] = db_query(" - ALTER TABLE {comments} - ADD COLUMN `notify` tinyint(1) NOT NULL DEFAULT '0'"); + // Create a table to hold the data. + $status[] = db_query("CREATE TABLE {comment_notify} ( + cid int NOT NULL auto_increment, + notify tinyint unsigned NOT NULL default 0, + notify_hash varchar(32) NOT NULL default '', + PRIMARY KEY (cid), + KEY notify_hash (notify_hash) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); + // Insert a record for each existing comment. + $status[] = db_query("INSERT INTO {comment_notify} (cid, notify, notify_hash) SELECT c.cid, 0, md5(concat(c.mail, ifnull(u.mail, u.init), c.uid, c.name, c.nid)) FROM {comments} c LEFT OUTER JOIN {users} u on c.uid = u.uid"); break; - case 'pgsql': - $status[] = db_query(" - ALTER TABLE {comments} - ADD COLUMN `notify` tinyint(1) NOT NULL DEFAULT '0'"); + // Do the same for PostgreSQL. + $status[] = db_query("CREATE TABLE {comments} ( + cid integer NOT NULL, + notify smallint_unsigned NOT NULL default '0', + notify_hash varchar(32) NOT NULL default '', + PRIMARY KEY (cid) + )"); + $status[] = db_query("CREATE INDEX {comment_notify}_notify_hash_idx ON {comment_notify} (notify_hash)"); + $status[] = db_query("INSERT INTO {comment_notify} (cid, notify, notify_hash) SELECT c.cid, 0, md5(concat(c.mail, ifnull(u.mail, u.init), c.uid, c.name, c.nid)) FROM {comments} c LEFT OUTER JOIN {users} u on c.uid = u.uid"); break; } - // Set module weight for my module + // Set module weight low so that other modules act on the comment first. $status[] = db_query("UPDATE {system} SET weight = 10 WHERE name = 'comment_notify'"); // If there is one FALSE value in the status array, there was an error. if (array_search(FALSE, $status) !== FALSE) { - drupal_set_message(t('Database modifications for the comment_notify module was unsuccessful. The modifications may need to be made by hand.'), 'error'); + drupal_set_message(t('Database modifications for the comment_notify module were unsuccessful. The modifications may need to be made by hand.'), 'error'); } - else { - drupal_set_message(t('comment_notify module installed successfully.')); +} + +function comment_notify_uninstall(){ + if (db_table_exists('comment_notify')) { + db_query("DROP TABLE {comment_notify}"); } } @@ -68,7 +83,7 @@ function comment_notify_update_3() { else { drupal_set_message(t('comment_notify mail text migration unsuccessful.'), 'error'); } - + $ret[]=$result; return $ret; } @@ -80,4 +95,39 @@ function comment_notify_update_4(){ $ret = array(); $ret[] = update_sql("ALTER TABLE {comments} MODIFY notify tinyint(1) NOT NULL DEFAULT '0'"); return $ret; +} + +/* + * Break out to our own table. + */ +function comment_notify_update_5(){ + // Create the new tables... + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + db_query("CREATE TABLE {comment_notify} ( + cid int NOT NULL auto_increment, + notify tinyint unsigned NOT NULL default 0, + notify_hash varchar(32) NOT NULL default '', + PRIMARY KEY (cid), + KEY notify_hash (notify_hash) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); + break; + case 'pgsql': + db_query("CREATE TABLE {comments} ( + cid serial, + notify smallint_unsigned NOT NULL default '0', + notify_hash varchar(32) NOT NULL default '', + PRIMARY KEY (cid) + )"); + db_query("CREATE INDEX {comment_notify}_notify_hash_idx ON {comment_notify} (notify_hash)"); + break; + } + + // Move the data over there from the previous location. + $ret = array(); + $ret[] = update_sql("INSERT INTO {comment_notify} (cid, notify, notify_hash) SELECT c.cid, c.notify, md5(concat(c.mail, ifnull(u.mail, u.init), c.uid, c.name, c.nid)) FROM {comments} c INNER JOIN {users} u on c.uid = u.uid"); + return $ret; + + // TODO alter the comments table to remove my column? } \ No newline at end of file Index: comment_notify.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/comment_notify/comment_notify.module,v retrieving revision 1.1.4.12 diff -u -p -r1.1.4.12 comment_notify.module --- comment_notify.module 17 Jul 2008 20:41:42 -0000 1.1.4.12 +++ comment_notify.module 23 Jul 2008 19:02:02 -0000 @@ -94,7 +94,8 @@ function comment_notify_form_alter($form } if ($form['cid']['#value'] != '') { - $form['notify']['#default_value'] = $form['#parameters'][1]['notify']; + $notify = db_result(db_query("SELECT notify FROM {comment_notify} WHERE cid = %d", $form['cid']['#value'])); + $form['notify']['#default_value'] = $notify; } } @@ -169,12 +170,7 @@ function comment_notify_page() { switch ($op) { case 'disable': $key = $arg; - db_query("UPDATE {comments} c, {users} u - SET c.notify = 0 - WHERE u.uid = c.uid - AND md5(concat(c.mail, ifnull(u.mail, u.init), c.uid, c.name, c.nid)) = '%s'", - $arg - ); + db_query("UPDATE {comment_notify} c SET c.notify = 0 WHERE notify_hash = '%s'", $arg); drupal_set_message(t('Your comment follow-up notification for this post was disabled. Thanks.')); $title = t('Disabled comment follow-up notification feature for this post.'); @@ -217,10 +213,16 @@ function comment_notify_comment($comment _comment_notify_mailalert($comment); break; case 'update': - case 'insert': - $sql = 'UPDATE {comments} set notify = %d where cid = %d'; + $sql = 'UPDATE {comment_notify} SET notify = %d WHERE cid = %d'; db_query($sql, $comment['notify'], $comment['cid']); break; + + case 'insert': + $mail = empty($comment['mail']) ? $user->mail : $comment['mail']; + $md5_string = $mail . $user->uid . $comment['name'] . $comment['nid']; + $sql = "INSERT INTO {comment_notify} (cid, notify, notify_hash) values (%d, %d, '%s')"; + db_query($sql, $comment['cid'], $comment['notify'], md5($md5_string)); + break; } } @@ -280,21 +282,20 @@ function _comment_notify_mailalert($comm } $from = variable_get('site_mail', ini_get('sendmail_from')); - - $result = db_query('SELECT DISTINCT c.cid, u.init, c.uid, c.name, c.nid, IF(length(c.mail) < 1, ifnull(u.mail, u.init), c.mail) mail, c.uid, c.name, max(cid) cid, md5(concat(c.mail, ifnull(u.mail, u.init), c.uid, c.name, c.nid)) mymd5 - FROM {comments} c LEFT OUTER JOIN {users} u ON u.uid = c.uid - WHERE nid = %d AND notify = 1 AND c.status = 0 - AND LENGTH(IF(LENGTH(c.mail) < 1, ifnull(u.mail, u.init), c.mail)) > 1 - AND IF(LENGTH(c.mail) < 1, ifnull(u.mail, u.init), c.mail) like \'%@%.%\' - GROUP BY IF(LENGTH(c.mail) < 1, ifnull(u.mail, u.init), c.mail), c.name', - $nid + $result = db_query('SELECT DISTINCT c.cid, u.init, c.uid, c.name, c.nid, c.mail cmail, u.mail umail, u.init uinit, c.uid, c.name, cn.notify_hash mymd5 + FROM {comments} c INNER JOIN {comment_notify} cn on c.cid = cn.cid LEFT OUTER JOIN {users} u ON c.uid = u.uid + WHERE nid = %d AND cn.notify = 1 AND c.status = 0', $nid ); + // TODO? the original big query had stuff making sure the mail was populated and contained .+@.+ Perhaps check for that here and set notify = 0 if that is the case for this cid $count = 0; $sent_to = array(); while ($alert = db_fetch_object($result)) { - if ($alert->mail != $comment_mail && !in_array($alert->mail, $sent_to) && $alert->uid != $comment->uid) { + $umail = empty($alert->umail) ? $alert->uinit : $alert->umail; + $mail = empty($alert->cmail) ? $umail : $alert->cmail; + + if ($mail != $comment_mail && !in_array($mail, $sent_to) && $alert->uid != $comment->uid) { if (function_exists('locale') && $languages[$user->language]) { $locale = $user->language; @@ -323,17 +324,17 @@ function _comment_notify_mailalert($comm ) ); - drupal_mail('comment_notify_mail', $alert->mail, $subject, $message, $from, array()); + drupal_mail('comment_notify_mail', $mail, $subject, $message, $from, array()); $count++; - $sent_to[] = $alert->mail; + $sent_to[] = $mail; if ($alert->uid != 0) { $watchdog_message = t('Notified: @user_mail', - array('!url' => url('user/'. $alert->uid .'/edit'), '@user_mail' => $alert->mail)) ; + array('!url' => url('user/'. $alert->uid .'/edit'), '@user_mail' => $mail)) ; } else { - $watchdog_message = t('Notified @user_mail', array('@user_mail' => $alert->mail)); + $watchdog_message = t('Notified @user_mail', array('@user_mail' => $mail)); } // Add an entry to the watchdog log. @@ -370,12 +371,12 @@ function comment_notify_unsubscribe_subm // If they have a uid, use that, otherwise update comments directly $result = db_result(db_query_range("SELECT uid FROM {users} WHERE mail = '%s'", $email, 0, 1)); if ($result > 0) { - $comments = db_result(db_query("SELECT COUNT(1) FROM {comments} WHERE uid = %d AND notify = 1", $result)); - db_query("UPDATE {comments} SET notify = 0 WHERE uid = %d", $result); + $comments = db_result(db_query("SELECT COUNT(1) FROM {comments} c INNER JOIN {comment_notify} cn ON c.cid = cn.cid WHERE c.uid = %d AND cn.notify = 1", $result)); + db_query("UPDATE {comment_notify} cn INNER JOIN {comments} c ON cn.cid = c.cid SET cn.notify = 0 WHERE c.uid = %d", $result); } else { - $comments = db_result(db_query("SELECT COUNT(1) FROM {comments} WHERE mail = '%s' AND notify = 1", $email)); - db_query("UPDATE {comments} SET notify = 0 WHERE mail = '%s'", $email); + $comments = db_result(db_query("SELECT COUNT(1) FROM {comments} c INNER JOIN {comment_notify} cn ON c.cid = cn.cid WHERE c.mail = '%s' AND cn.notify = 1", $email)); + db_query("UPDATE {comment_notify} cn INNER JOIN {comments} c ON cn.cid = c.cid SET cn.notify = 0 WHERE c.mail = '%s'", $email); } // Update the admin about the state of this comment notification subscription. if ($comments == 0) { @@ -387,7 +388,9 @@ function comment_notify_unsubscribe_subm } } - +/* + * Page callback for administrative settings form. + */ function comment_notify_settings() { $form['comment_notify_settings'] = array(); $form['comment_notify_settings']['comment_notify_regged_checkbox'] = array(