From 24a6821749b75ecfc8db81527d1943237e821dc0 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 1 Apr 2014 16:32:28 +0200 Subject: [PATCH] Resolve UID -> MSGUID mapping from cache table index instead of using IMAP search --- plugins/libkolab/SQL/mysql.initial.sql | 26 +++++++++++++------- plugins/libkolab/SQL/mysql/2014032700.sql | 8 ++++++ plugins/libkolab/lib/kolab_storage_cache.php | 16 ++++++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 plugins/libkolab/SQL/mysql/2014032700.sql diff --git a/plugins/libkolab/SQL/mysql.initial.sql b/plugins/libkolab/SQL/mysql.initial.sql index 89b7244d..b6032418 100644 --- a/plugins/libkolab/SQL/mysql.initial.sql +++ b/plugins/libkolab/SQL/mysql.initial.sql @@ -1,7 +1,7 @@ /** * libkolab database schema * - * @version 1.0 + * @version 1.1 * @author Thomas Bruederli * @licence GNU AGPL **/ @@ -41,7 +41,8 @@ CREATE TABLE `kolab_cache_contact` ( CONSTRAINT `fk_kolab_cache_contact_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(`folder_id`,`msguid`), - INDEX `contact_type` (`folder_id`,`type`) + INDEX `contact_type` (`folder_id`,`type`), + INDEX `contact_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_event`; @@ -60,7 +61,8 @@ CREATE TABLE `kolab_cache_event` ( `dtend` DATETIME, CONSTRAINT `fk_kolab_cache_event_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, - PRIMARY KEY(`folder_id`,`msguid`) + PRIMARY KEY(`folder_id`,`msguid`), + INDEX `event_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_task`; @@ -79,7 +81,8 @@ CREATE TABLE `kolab_cache_task` ( `dtend` DATETIME, CONSTRAINT `fk_kolab_cache_task_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, - PRIMARY KEY(`folder_id`,`msguid`) + PRIMARY KEY(`folder_id`,`msguid`), + INDEX `task_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_journal`; @@ -98,7 +101,8 @@ CREATE TABLE `kolab_cache_journal` ( `dtend` DATETIME, CONSTRAINT `fk_kolab_cache_journal_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, - PRIMARY KEY(`folder_id`,`msguid`) + PRIMARY KEY(`folder_id`,`msguid`), + INDEX `journal_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_note`; @@ -115,7 +119,8 @@ CREATE TABLE `kolab_cache_note` ( `words` TEXT NOT NULL, CONSTRAINT `fk_kolab_cache_note_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, - PRIMARY KEY(`folder_id`,`msguid`) + PRIMARY KEY(`folder_id`,`msguid`), + INDEX `note_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_file`; @@ -134,7 +139,8 @@ CREATE TABLE `kolab_cache_file` ( CONSTRAINT `fk_kolab_cache_file_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(`folder_id`,`msguid`), - INDEX `folder_filename` (`folder_id`, `filename`) + INDEX `folder_filename` (`folder_id`, `filename`), + INDEX `file_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_configuration`; @@ -153,7 +159,8 @@ CREATE TABLE `kolab_cache_configuration` ( CONSTRAINT `fk_kolab_cache_configuration_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(`folder_id`,`msguid`), - INDEX `configuration_type` (`folder_id`,`type`) + INDEX `configuration_type` (`folder_id`,`type`), + INDEX `configuration_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; DROP TABLE IF EXISTS `kolab_cache_freebusy`; @@ -172,7 +179,8 @@ CREATE TABLE `kolab_cache_freebusy` ( `dtend` DATETIME, CONSTRAINT `fk_kolab_cache_freebusy_folder` FOREIGN KEY (`folder_id`) REFERENCES `kolab_folders`(`folder_id`) ON DELETE CASCADE ON UPDATE CASCADE, - PRIMARY KEY(`folder_id`,`msguid`) + PRIMARY KEY(`folder_id`,`msguid`), + INDEX `freebusy_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; diff --git a/plugins/libkolab/SQL/mysql/2014032700.sql b/plugins/libkolab/SQL/mysql/2014032700.sql new file mode 100644 index 00000000..a45fae30 --- /dev/null +++ b/plugins/libkolab/SQL/mysql/2014032700.sql @@ -0,0 +1,8 @@ +ALTER TABLE `kolab_cache_configuration` ADD INDEX `configuration_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_contact` ADD INDEX `contact_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_event` ADD INDEX `event_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_task` ADD INDEX `task_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_journal` ADD INDEX `journal_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_note` ADD INDEX `note_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_file` ADD INDEX `file_uid2msguid` (`folder_id`, `uid`, `msguid`); +ALTER TABLE `kolab_cache_freebusy` ADD INDEX `freebusy_uid2msguid` (`folder_id`, `uid`, `msguid`); diff --git a/plugins/libkolab/lib/kolab_storage_cache.php b/plugins/libkolab/lib/kolab_storage_cache.php index 718d95eb..606c5d54 100644 --- a/plugins/libkolab/lib/kolab_storage_cache.php +++ b/plugins/libkolab/lib/kolab_storage_cache.php @@ -911,6 +911,22 @@ class kolab_storage_cache */ public function uid2msguid($uid, $deleted = false) { + // query local database if available + if (!isset($this->uid2msg[$uid]) && $this->ready) { + $this->_read_folder_data(); + + $sql_result = $this->db->query( + "SELECT msguid FROM $this->cache_table ". + "WHERE folder_id=? AND uid=?", + $this->folder_id, + $uid + ); + + if ($sql_arr = $this->db->fetch_assoc($sql_result)) { + $this->uid2msg[$uid] = $sql_arr['msguid']; + } + } + if (!isset($this->uid2msg[$uid])) { // use IMAP SEARCH to get the right message $index = $this->imap->search_once($this->folder->name, ($deleted ? '' : 'UNDELETED ') .