Example #1
0
 /**
  * delete messages with given messageuids by folder (id)
  *
  * @param  array  $_msguids
  * @param  mixed  $_folderId
  * @return integer number of deleted rows or false if no message are given
  */
 public function deleteMessageuidsByFolderId($_msguids, $_folderId)
 {
     $return = FALSE;
     if (!(empty($_msguids) || !is_array($_msguids))) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Logicaly delete the messages ' . print_r($_msguids, true));
         $return = count($_msguids);
     }
     //return $return;
     /**
      * TODO: remove the code below and uncomment the code above
      */
     $aux = new Felamimail_Backend_Cache_Sql_Message();
     $retorno = $aux->deleteMessageuidsByFolderId($_msguids, $_folderId);
     return $retorno;
 }
 /**
  * test search with cache
  * - test text_plain.eml message
  * - test from header
  */
 public function testSearchWithCache()
 {
     // get inbox folder id
     Felamimail_Controller_Cache_Folder::getInstance()->update($this->_account->getId());
     $folderBackend = new Felamimail_Backend_Folder();
     $folder = Felamimail_Controller_Folder::getInstance()->getByBackendAndGlobalName($this->_account->getId(), $this->_testFolderName);
     // clear cache and empty folder
     $this->_cache->clear($folder->getId());
     Felamimail_Controller_Folder::getInstance()->emptyFolder($folder->getId());
     // append message
     $this->_appendMessage('text_plain.eml', $this->_folder);
     // search messages in test folder
     $this->_cache->updateCache($folder);
     $result = $this->_controller->search($this->_getFilter($folder->getId()));
     //print_r($result->toArray());
     // check result
     $firstMessage = $result->getFirstRecord();
     $this->_createdMessages->addRecord($firstMessage);
     $this->assertGreaterThan(0, count($result));
     $this->assertEquals($folder->getId(), $firstMessage->folder_id);
     $this->assertEquals("Re: [gentoo-dev] `paludis --info' is not like `emerge --info'", $firstMessage->subject);
     $this->assertEquals('Pipping, Sebastian (Luxembourg)', $firstMessage->from_name);
     $this->assertEquals('*****@*****.**', $firstMessage->from_email);
     $this->assertEquals(array('*****@*****.**', '*****@*****.**'), $firstMessage->to);
     // check cache entries
     $cacheBackend = new Felamimail_Backend_Cache_Sql_Message();
     $cachedMessage = $cacheBackend->get($firstMessage->getId());
     $this->assertEquals($folder->getId(), $cachedMessage->folder_id);
     $this->assertEquals(Tinebase_DateTime::now()->format('Y-m-d'), $cachedMessage->timestamp->format('Y-m-d'));
     // clear cache
     $this->_cache->clear($folder->getId());
 }
 /**
  * add to/cc/bcc and flags custom filters
  *
  * @param  Zend_Db_Select                       $_select
  * @param  Felamimail_Backend_Cache_Sql_Message $_backend
  * @param  array                                $_filterData
  * @return void
  */
 protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData)
 {
     $db = $_backend->getAdapter();
     $foreignTables = $_backend->getForeignTables();
     // add conditions
     $tablename = $foreignTables[$_filterData['field']]['table'];
     if ($_filterData['field'] !== 'flags') {
         $fieldName = $tablename . '.name';
         $fieldEmail = $tablename . '.email';
     }
     // add filter value
     if (!is_array($_filterData['value'])) {
         $value = '%' . $_filterData['value'] . '%';
     } else {
         $value = array();
         foreach ((array) $_filterData['value'] as $customValue) {
             $value[] = '%' . $customValue . '%';
         }
     }
     if ($_filterData['field'] == 'flags') {
         $columns = $_select->getPart(Zend_Db_Select::COLUMNS);
         $flags = '';
         foreach ($columns as $column) {
             if ($column[2] == 'flags') {
                 $flags = '(' . $column[1] . ')';
                 break;
             }
         }
         if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') {
             $_select->having($db->quoteInto($flags . ' LIKE ?', $value));
         } else {
             if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') {
                 if (empty($value)) {
                     $whereString = $flags . ' IS NULL';
                 } else {
                     $value = (array) $value;
                     $where = array();
                     $op = $_filterData['operator'] == 'in' ? 'LIKE' : 'NOT LIKE';
                     $opImplode = $_filterData['operator'] == 'in' ? ' OR ' : ' AND ';
                     foreach ($value as $flag) {
                         $where[] = $db->quoteInto($flags . ' ' . $op . ' ?', $flag);
                     }
                     $whereString = implode($opImplode, $where);
                     if ($_filterData['operator'] == 'notin') {
                         $whereString = '(' . $whereString . ') OR ' . $flags . ' IS NULL';
                     }
                 }
                 $_select->having($whereString);
             } else {
                 $_select->having($db->quoteInto($flags . ' NOT LIKE ? OR ' . $flags . ' IS NULL', $value));
             }
         }
     } else {
         $_select->where($db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . $db->quoteInto($fieldEmail . ' LIKE ?', $value));
     }
 }
 /**
  * delete messages from cache by folder
  * 
  * @param $_folder
  */
 public function deleteByFolder(Felamimail_Model_Folder $_folder)
 {
     $this->_backend->deleteByFolderId($_folder);
 }
 /**
  * add to/cc/bcc and flags custom filters
  * 
  * @param  Zend_Db_Select                       $_select
  * @param  Felamimail_Backend_Cache_Sql_Message $_backend
  * @param  array                                $_filterData
  * @return void
  */
 protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData)
 {
     $db = $_backend->getAdapter();
     $foreignTables = $_backend->getForeignTables();
     // add conditions
     $tablename = $foreignTables[$_filterData['field']]['table'];
     if ($_filterData['field'] !== 'flags') {
         $fieldName = $tablename . '.name';
         $fieldEmail = $tablename . '.email';
     }
     // add filter value
     if (!is_array($_filterData['value'])) {
         $value = '%' . $_filterData['value'] . '%';
     } else {
         $value = array();
         foreach ((array) $_filterData['value'] as $customValue) {
             $value[] = '%' . $customValue . '%';
         }
     }
     if ($_filterData['field'] == 'flags') {
         $havingColumn = $db instanceof Zend_Db_Adapter_Pdo_Pgsql ? Tinebase_Backend_Sql_Command::factory($db)->getAggregate('felamimail_cache_msg_flag.flag') : 'flags';
         if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') {
             $_select->having($db->quoteInto($havingColumn . ' LIKE ?', $value));
         } else {
             if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') {
                 if (empty($value)) {
                     $whereString = 'flags IS NULL';
                 } else {
                     $value = (array) $value;
                     $where = array();
                     $op = $_filterData['operator'] == 'in' ? 'LIKE' : 'NOT LIKE';
                     $opImplode = $_filterData['operator'] == 'in' ? ' OR ' : ' AND ';
                     foreach ($value as $flag) {
                         $where[] = $db->quoteInto('flags ' . $op . ' ?', $flag);
                     }
                     $whereString = implode($opImplode, $where);
                     if ($_filterData['operator'] == 'notin') {
                         $whereString = '(' . $whereString . ') OR flags IS NULL';
                     }
                 }
                 $_select->having(str_replace('flags', $havingColumn, $whereString));
             } else {
                 $_select->having($db->quoteInto($havingColumn . ' NOT LIKE ? OR ' . $havingColumn . ' IS NULL', $value));
             }
         }
     } else {
         $_select->where($db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . $db->quoteInto($fieldEmail . ' LIKE ?', $value));
     }
 }
 /**
  * test clear message cache
  *
  */
 public function testClear()
 {
     $this->_controller->clear($this->_folder);
     $messageCacheBackend = new Felamimail_Backend_Cache_Sql_Message();
     $count = $messageCacheBackend->searchCountByFolderId($this->_folder->getId());
     // check if empty
     $this->assertEquals(0, $count);
     $this->assertEquals(Felamimail_Model_Folder::CACHE_STATUS_EMPTY, $this->_folder->cache_status);
     $this->assertEquals(0, $this->_folder->cache_job_actions_est);
 }
 /**
  * update to 8.5
  * - add account_id-folder_id index to felamimail_cache_message
  *
  */
 public function update_4()
 {
     $tableVersion = $this->getTableVersion('felamimail_cache_message');
     if ($tableVersion < 10) {
         $backend = new Felamimail_Backend_Cache_Sql_Message();
         $db = $backend->getAdapter();
         $skip = false;
         if ($db instanceof Zend_Db_Adapter_Pdo_Mysql) {
             try {
                 if (!($stmt = $db->query('select @@innodb_version')) || !$stmt->setFetchMode(Zend_Db::FETCH_NUM) || !($row = $stmt->fetchAll())) {
                     $skip = true;
                 }
             } catch (Exception $e) {
                 Tinebase_Exception::log($e);
                 $skip = true;
             }
             if (!$skip) {
                 $declaration = new Setup_Backend_Schema_Index_Xml('<index>
                          <name>account_id-folder_id</name>
                          <field>
                              <name>account_id</name>
                          </field>
                          <field>
                              <name>folder_id</name>
                          </field>
                     </index>');
                 $this->_backend->addIndex('felamimail_cache_message', $declaration);
             }
             $this->setTableVersion('felamimail_cache_message', '10');
         }
     }
     $this->setApplicationVersion('Felamimail', '8.5');
 }