Changeset 5030 in subversion
- Timestamp:
- Aug 8, 2011 12:56:33 PM (22 months ago)
- Location:
- branches/devel-mcache/roundcubemail
- Files:
-
- 6 edited
-
SQL/mysql.initial.sql (modified) (2 diffs)
-
program/include/rcube_imap.php (modified) (7 diffs)
-
program/include/rcube_imap_cache.php (modified) (9 diffs)
-
program/include/rcube_imap_generic.php (modified) (4 diffs)
-
program/steps/mail/func.inc (modified) (1 diff)
-
program/steps/mail/show.inc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/devel-mcache/roundcubemail/SQL/mysql.initial.sql
r5028 r5030 46 46 REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, 47 47 INDEX `changed_index` (`changed`), 48 PRIMARY KEY (`user_id`, `mailbox`, ` sort_field`, `threaded`)48 PRIMARY KEY (`user_id`, `mailbox`, `threaded`, `sort_field`) 49 49 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; 50 50 … … 58 58 `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', 59 59 `data` text, 60 `seen` tinyint(1) NOT NULL DEFAULT '0', 61 `deleted` tinyint(1) NOT NULL DEFAULT '0', 62 `answered` tinyint(1) NOT NULL DEFAULT '0', 63 `forwarded` tinyint(1) NOT NULL DEFAULT '0', 64 `flagged` tinyint(1) NOT NULL DEFAULT '0', 65 `mdnsent` tinyint(1) NOT NULL DEFAULT '0', 60 66 CONSTRAINT `user_id_fk_cache_messages` FOREIGN KEY (`user_id`) 61 67 REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, -
branches/devel-mcache/roundcubemail/program/include/rcube_imap.php
r5029 r5030 2472 2472 // @TODO: update flags instead removing from cache 2473 2473 if (!$skip_cache && ($mcache = $this->get_mcache_engine())) { 2474 $mcache->clear($mailbox, $all_mode ? null : explode(',', $uids)); 2474 $status = strpos($flag, 'UN') !== 0; 2475 $mflag = preg_replace('/^UN/', '', $flag); 2476 $mcache->change_flag($mailbox, $all_mode ? null : explode(',', $uids), 2477 $mflag, $status); 2475 2478 } 2476 2479 … … 2604 2607 $this->refresh_search(); 2605 2608 else { 2606 $ uids = explode(',', $uids);2607 foreach ($ uids as $uid)2609 $a_uids = explode(',', $uids); 2610 foreach ($a_uids as $uid) 2608 2611 $a_mids[] = $this->uid2id($uid, $from_mbox); 2609 2612 $this->search_set = array_diff($this->search_set, $a_mids); 2610 2613 } 2614 unset($a_mids); 2615 unset($a_uids); 2611 2616 } 2612 2617 2613 2618 // remove cached messages 2614 2619 // @TODO: do cache update instead of clearing it 2615 $this->clear_message_cache($from_mbox, $all_mode ? null : $uids);2620 $this->clear_message_cache($from_mbox, $all_mode ? null : explode(',', $uids)); 2616 2621 } 2617 2622 … … 2698 2703 $this->refresh_search(); 2699 2704 else { 2700 $ uids = explode(',', $uids);2701 foreach ($ uids as $uid)2705 $a_uids = explode(',', $uids); 2706 foreach ($a_uids as $uid) 2702 2707 $a_mids[] = $this->uid2id($uid, $mailbox); 2703 2708 $this->search_set = array_diff($this->search_set, $a_mids); 2709 unset($a_uids); 2710 unset($a_mids); 2704 2711 } 2705 2712 } 2706 2713 2707 2714 // remove cached messages 2708 $this->clear_message_cache($mailbox, $all_mode ? null : $uids);2715 $this->clear_message_cache($mailbox, $all_mode ? null : explode(',', $uids)); 2709 2716 } 2710 2717 … … 2774 2781 { 2775 2782 if ($uids && $this->get_capability('UIDPLUS')) 2776 $a_uids = is_array($uids) ? join(',', $uids) : $uids;2783 list($uids, $all_mode) = $this->_parse_uids($uids, $mailbox); 2777 2784 else 2778 $ a_uids = NULL;2785 $uids = null; 2779 2786 2780 2787 // force mailbox selection and check if mailbox is writeable … … 2791 2798 2792 2799 // CLOSE(+SELECT) should be faster than EXPUNGE 2793 if (empty($ a_uids) || $a_uids == '1:*')2800 if (empty($uids) || $all_mode) 2794 2801 $result = $this->conn->close(); 2795 2802 else 2796 $result = $this->conn->expunge($mailbox, $ a_uids);2803 $result = $this->conn->expunge($mailbox, $uids); 2797 2804 2798 2805 if ($result && $clear_cache) { 2799 // @TODO: I'm not sure we should remove all messages 2800 // maybe we could clear only indexes and counters 2801 $this->clear_message_cache($mailbox); 2806 $this->clear_message_cache($mailbox, $all_mode ? null : explode(',', $uids)); 2802 2807 $this->_clear_messagecount($mailbox); 2803 2808 } … … 3161 3166 $this->conn->subscribe(preg_replace('/^'.preg_quote($mailbox, '/').'/', 3162 3167 $new_name, $c_subscribed)); 3168 3169 // clear cache 3170 $this->clear_message_cache($c_subscribed); 3163 3171 } 3164 3172 } 3165 3173 3166 3174 // clear cache 3167 // @TODO: we could be much smarter here3168 3175 $this->clear_message_cache($mailbox); 3169 3176 $this->clear_cache('mailboxes', true); … … 3840 3847 function clear_message_cache($mailbox = null, $uids = null) 3841 3848 { 3842 if ($mcache = $this->get_ cache_engine()) {3849 if ($mcache = $this->get_mcache_engine()) { 3843 3850 $mcache->clear($mailbox, $uids); 3844 3851 } -
branches/devel-mcache/roundcubemail/program/include/rcube_imap_cache.php
r5029 r5030 37 37 * @var rcube_imap 38 38 */ 39 p ublic$imap;39 private $imap; 40 40 41 41 /** … … 61 61 62 62 private $skip_deleted = false; 63 64 public $flag_fields = array('seen', 'deleted', 'answered', 'forwarded', 'flagged', 'mdnsent'); 65 63 66 64 67 /** … … 284 287 } 285 288 289 $flag_fields = implode(', ', array_map(array($this->db, 'quoteIdentifier'), $this->flag_fields)); 290 286 291 // Fetch messages from cache 287 292 $sql_result = $this->db->query( 288 "SELECT uid, data "293 "SELECT uid, data, ".$flag_fields 289 294 ." FROM ".get_table_name('cache_messages') 290 295 ." WHERE user_id = ?" … … 298 303 while ($sql_arr = $this->db->fetch_assoc($sql_result)) { 299 304 $uid = intval($sql_arr['uid']); 300 $result[$uid] = $this-> db->decode(unserialize($sql_arr['data']));305 $result[$uid] = $this->build_message($sql_arr); 301 306 //@TODO: update message ID according to index data? 302 307 … … 333 338 function get_message($mailbox, $uid) 334 339 { 340 $flag_fields = implode(', ', array_map(array($this->db, 'quoteIdentifier'), $this->flag_fields)); 341 335 342 $sql_result = $this->db->query( 336 "SELECT data FROM ".get_table_name('cache_messages') 343 "SELECT data, ".$flag_fields 344 ." FROM ".get_table_name('cache_messages') 337 345 ." WHERE user_id = ?" 338 346 ." AND mailbox = ?" 339 347 ." AND uid = ?", 340 $this->userid, $mailbox, $uid);348 $this->userid, $mailbox, (int)$uid); 341 349 342 350 if ($sql_arr = $this->db->fetch_assoc($sql_result)) { 343 $message = $this-> db->decode(unserialize($sql_arr['data']));351 $message = $this->build_message($sql_arr); 344 352 $found = true; 345 353 … … 372 380 $msg = serialize($this->db->encode(clone $message)); 373 381 382 $flag_fields = array_map(array($this->db, 'quoteIdentifier'), $this->flag_fields); 383 $flag_values = array(); 384 385 foreach ($this->flag_fields as $flag) 386 $flag_values[] = (int) $message->$flag; 387 374 388 // update cache record (even if it exists, the update 375 389 // here will work as select, assume row exist if affected_rows=0) 376 390 if (!$force) { 391 foreach ($flag_fields as $key => $val) 392 $flag_data[] = $val . " = " . $flag_values[$key]; 393 377 394 $res = $this->db->query( 378 395 "UPDATE ".get_table_name('cache_messages') 379 396 ." SET data = ?, changed = ".$this->db->now() 397 .", " . implode(', ', $flag_data) 380 398 ." WHERE user_id = ?" 381 399 ." AND mailbox = ?" 382 400 ." AND uid = ?", 383 $msg, $this->userid, $mailbox, $message->uid);401 $msg, $this->userid, $mailbox, (int) $message->uid); 384 402 385 403 if ($this->db->affected_rows()) … … 390 408 $this->db->query( 391 409 "INSERT INTO ".get_table_name('cache_messages') 392 ." (user_id, mailbox, uid, changed, data)" 393 ." VALUES (?, ?, ?, ".$this->db->now().", ?)", 394 $this->userid, $mailbox, $message->uid, $msg); 395 } 396 397 398 /** 399 * Clears messages/index cache 410 ." (user_id, mailbox, uid, changed, data, " . implode(', ', $flag_fields) . ")" 411 ." VALUES (?, ?, ?, ".$this->db->now().", ?, " . implode(', ', $flag_values) . ")", 412 $this->userid, $mailbox, (int) $message->uid, $msg); 413 } 414 415 416 /** 417 * Sets the flag for specified message. 418 * 419 * @param string $mailbox Folder name 420 * @param array $uids Message UIDs or -1 to change flag 421 * of all messages in a folder 422 * @param string $flag The name of the flag 423 * @param bool $enabled Flag state 424 */ 425 function change_flag($mailbox, $uids, $flag, $enabled = false) 426 { 427 $flag = strtolower($flag); 428 429 if (in_array($flag, $this->flag_fields)) { 430 $this->db->query( 431 "UPDATE ".get_table_name('cache_messages') 432 ." SET changed = ".$this->db->now() 433 .", " .$this->db->quoteIdentifier($flag) . " = " . intval($enabled) 434 ." WHERE user_id = ?" 435 ." AND mailbox = ?" 436 .($uids !== null ? " AND uid IN (".$this->db->array2list((array)$uids, 'integer').")" : ""), 437 $this->userid, $mailbox); 438 } 439 else { 440 // @TODO: SELECT+UPDATE? 441 $this->remove_message($mailbox, $uids); 442 } 443 } 444 445 446 /** 447 * Removes message(s) from cache. 400 448 * 401 449 * @param string $mailbox Folder name 402 * @param array $uids Message UIDs 403 */ 404 function clear($mailbox = null, $uids = array()) 450 * @param array $uids Message UIDs, NULL removes all messages 451 */ 452 function remove_message($mailbox = null, $uids = null) 453 { 454 if (!strlen($mailbox)) { 455 $this->db->query( 456 "DELETE FROM ".get_table_name('cache_messages') 457 ." WHERE user_id = ?", 458 $this->userid); 459 } 460 else { 461 $this->db->query( 462 "DELETE FROM ".get_table_name('cache_messages') 463 ." WHERE user_id = ?" 464 ." AND mailbox = ".$this->db->quote($mailbox) 465 .($uids !== null ? " AND uid IN (".$this->db->array2list((array)$uids, 'integer').")" : ""), 466 $this->userid); 467 } 468 469 } 470 471 472 /** 473 * Clears messages/index cache. 474 * 475 * @param string $mailbox Folder name 476 * @param array $uids Message UIDs, NULL removes all messages in a folder 477 */ 478 function clear($mailbox = null, $uids = null) 405 479 { 406 480 $this->db->query( … … 410 484 $this->userid); 411 485 412 if (!strlen($mailbox)) { 486 $this->remove_message($mailbox, $uids); 487 488 if (strlen($mailbox)) 413 489 unset($this->icache[$mailbox]); 414 $this->db->query( 415 "DELETE FROM ".get_table_name('cache_messages') 416 ." WHERE user_id = ?", 417 $this->userid); 418 } 419 else { 490 else 420 491 $this->icache = array(); 421 $this->db->query(422 "DELETE FROM ".get_table_name('cache_messages')423 ." WHERE user_id = ?"424 ." AND mailbox = ".$this->db->quote($mailbox)425 .(!empty($uids) ? " AND uid IN (".$this->db->array2list($uids, 'integer').")" : ""),426 $this->userid);427 }428 492 } 429 493 … … 503 567 } 504 568 569 570 /** 571 * 572 */ 573 private function build_message($sql_arr) 574 { 575 $message = $this->db->decode(unserialize($sql_arr['data'])); 576 577 if ($message) { 578 foreach ($this->flag_fields as $field) 579 $message->$field = (bool) $sql_arr[$field]; 580 } 581 582 return $message; 583 } 584 505 585 } -
branches/devel-mcache/roundcubemail/program/include/rcube_imap_generic.php
r5029 r5030 49 49 public $charset; 50 50 public $ctype; 51 public $flags;52 51 public $timestamp; 53 52 public $body_structure; … … 56 55 public $priority; 57 56 public $mdn_to; 58 public $mdn_sent = false; 57 58 public $flags; 59 public $mdnsent = false; 59 60 public $seen = false; 60 61 public $deleted = false; … … 1721 1722 foreach ($flags_a as $flag) { 1722 1723 $flag = str_replace('\\', '', $flag); 1723 $result[$id]->flags[] = $flag;1724 1724 1725 1725 switch (strtoupper($flag)) { … … 1737 1737 break; 1738 1738 case '$MDNSENT': 1739 $result[$id]->mdn _sent = true;1739 $result[$id]->mdnsent = true; 1740 1740 break; 1741 1741 case 'FLAGGED': 1742 1742 $result[$id]->flagged = true; 1743 break; 1744 default: 1745 $result[$id]->flags[] = $flag; 1743 1746 break; 1744 1747 } -
branches/devel-mcache/roundcubemail/program/steps/mail/func.inc
r4977 r5030 1452 1452 $message = new rcube_message($message); 1453 1453 1454 if ($message->headers->mdn_to && !$message->headers->mdn _sent &&1454 if ($message->headers->mdn_to && !$message->headers->mdnsent && 1455 1455 ($IMAP->check_permflag('MDNSENT') || $IMAP->check_permflag('*'))) 1456 1456 { -
branches/devel-mcache/roundcubemail/program/steps/mail/show.inc
r4802 r5030 74 74 // check for unset disposition notification 75 75 if ($MESSAGE->headers->mdn_to && 76 !$MESSAGE->headers->mdn _sent && !$MESSAGE->headers->seen &&76 !$MESSAGE->headers->mdnsent && !$MESSAGE->headers->seen && 77 77 ($IMAP->check_permflag('MDNSENT') || $IMAP->check_permflag('*')) && 78 78 $mbox_name != $CONFIG['drafts_mbox'] &&
Note: See TracChangeset
for help on using the changeset viewer.
