? 719616-flag-count_0.patch
? 719616-flag-count_1.patch
? 719616-flag-count_2.patch
? 813342-flag-anonymous_cleanup.patch
? 813342-flag-anonymous_cleanup_0.patch
Index: flag.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flag/flag.inc,v
retrieving revision 1.1.2.30.2.25
diff -u -r1.1.2.30.2.25 flag.inc
--- flag.inc	10 May 2010 04:05:28 -0000	1.1.2.30.2.25
+++ flag.inc	30 May 2010 22:38:20 -0000
@@ -643,7 +643,7 @@
   function _flag($content_id, $uid, $sid) {
     db_query("INSERT INTO {flag_content} (fid, content_type, content_id, uid, sid, timestamp) VALUES (%d, '%s', %d, %d, %d, %d)", $this->fid, $this->content_type, $content_id, $uid, $sid, time());
     $fcid = db_last_insert_id('flag_content', 'fcid');
-    $this->_update_count($content_id);
+    $this->_increase_count($content_id);
     return $fcid;
   }
 
@@ -659,7 +659,7 @@
     $fcid = db_result(db_query("SELECT fcid FROM {flag_content} WHERE fid = %d AND content_id = %d AND uid = %d AND sid = %d", $this->fid, $content_id, $uid, $sid));
     if ($fcid) {
       db_query("DELETE FROM {flag_content} WHERE fcid = %d", $fcid);
-      $this->_update_count($content_id);
+      $this->_decrease_count($content_id);
     }
     // Remove anonymous cookies (if any).
     if (isset($_COOKIE['flag'][$this->name . '_' . $content_id])) {
@@ -669,20 +669,39 @@
   }
 
   /**
-   * Updates the flag count for this content
+   * Increases the flag count for this content.
+   *
+   * @param $content_id
+   *   For which item should the count be increased.
+   *
+   * @param $number
+   *   The amount of the increasing.
    *
    * @private
    */
-  function _update_count($content_id) {
-    $count = db_result(db_query("SELECT COUNT(*) FROM {flag_content} WHERE fid = %d AND content_id = %d", $this->fid, $content_id));
-    if ($count == 0) {
-      db_query("DELETE FROM {flag_counts} WHERE fid = %d AND content_id = %d", $this->fid, $content_id);
+  function _increase_count($content_id, $number = 1) {
+    db_query("UPDATE {flag_counts} SET count = count + %d WHERE fid = %d AND content_id = %d", $number, $this->fid, $content_id);
+    if (!db_affected_rows()) {
+      db_query("INSERT INTO {flag_counts} (fid, content_type, content_id, count) VALUES (%d, '%s', %d, %d)", $this->fid, $this->content_type, $content_id, $number);
     }
-    else {
-      db_query("UPDATE {flag_counts} SET count = %d WHERE fid = %d AND content_id = %d", $count, $this->fid, $content_id);
-      if (!db_affected_rows()) {
-        db_query("INSERT INTO {flag_counts} (fid, content_type, content_id, count) VALUES (%d, '%s', %d, %d)", $this->fid, $this->content_type, $content_id, $count);
-      }
+  }
+
+  /**
+   * Decreases the flag count for this content.
+   *
+   * @param $content_id
+   *   For which item should the count be descreased.
+   *
+   * @param $number
+   *   The amount of the descreasing.
+   *
+   * @private
+   */
+  function _decrease_count($content_id, $number = 1) {
+    db_query("UPDATE {flag_counts} SET count = count - %d WHERE fid = %d AND content_id = %d", $number, $this->fid, $content_id);
+    if (db_affected_rows()) {
+      // Delete rows with count 0, to save some space in the database.
+      db_query("DELETE FROM {flag_counts} WHERE fid = %d and content_id = %d AND count = %d", $this->fid, $content_id, 0);
     }
   }
 
Index: flag.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flag/flag.module,v
retrieving revision 1.11.2.72.2.40
diff -u -r1.11.2.72.2.40 flag.module
--- flag.module	10 May 2010 04:05:28 -0000	1.11.2.72.2.40
+++ flag.module	30 May 2010 22:38:21 -0000
@@ -1298,7 +1298,7 @@
   }
   if (!isset($counts[$flag_name])) {
     $flag = flag_get_flag($flag_name);
-    $counts[$flag_name] = db_result(db_query("SELECT COUNT(*) FROM {flag_content} WHERE fid = %d", $flag->fid));
+    $counts[$flag_name] = db_result(db_query("SELECT SUM(count) FROM {flag_counts} WHERE fid = %d", $flag->fid));
   }
 
   return $counts[$flag_name];
