Example #1
0
 /**
  * Searches tags according to filter and paging
  * The Current user needs to have the given right, unless $_ignoreAcl is true
  * 
  * @param  Tinebase_Model_TagFilter $_filter
  * @param  Tinebase_Model_Pagination  $_paging
  * @return Tinebase_Record_RecordSet  Set of Tinebase_Model_Tag
  */
 public function searchTags($_filter, $_paging)
 {
     $select = $_filter->getSelect();
     Tinebase_Model_TagRight::applyAclSql($select, $_filter->grant);
     $_paging->appendPaginationSql($select);
     return new Tinebase_Record_RecordSet('Tinebase_Model_Tag', $this->_db->fetchAssoc($select));
 }
 /**
  * Searches tags according to filter and paging
  * The Current user needs to have the given right, unless $_ignoreAcl is true
  * 
  * @param  Tinebase_Model_TagFilter $_filter
  * @param  Tinebase_Model_Pagination  $_paging
  * @return Tinebase_Record_RecordSet  Set of Tinebase_Model_Tag
  */
 public function searchTags($_filter, $_paging = NULL)
 {
     $select = $_filter->getSelect();
     Tinebase_Model_TagRight::applyAclSql($select, $_filter->grant);
     if (isset($_filter->application)) {
         $app = Tinebase_Application::getInstance()->getApplicationByName($_filter->application);
         $this->_filterSharedOnly($select, $app->getId());
     }
     if ($_paging !== NULL) {
         $_paging->appendPaginationSql($select);
     }
     Tinebase_Backend_Sql_Abstract::traitGroup($select);
     $tags = new Tinebase_Record_RecordSet('Tinebase_Model_Tag', $this->_db->fetchAssoc($select));
     return $tags;
 }
 /**
  * Appends pagination statements to a given select object
  * 
  * @param  Zend_Db_Select
  * @return void
  */
 public function appendPaginationSql($_select)
 {
     if ($this->isValid()) {
         if (!empty($this->sort) && !empty($this->dir) && $this->sort == 'due') {
             $dir = $this->dir == 'ASC' ? 'DESC' : 'ASC';
             $_select->order('is_due' . ' ' . $dir);
         }
     }
     parent::appendPaginationSql($_select);
 }
 /**
  * Searches roles according to filter and paging
  * 
  * @param  Tinebase_Model_RoleFilter  $_filter
  * @param  Tinebase_Model_Pagination  $_paging
  * @return Tinebase_Record_RecordSet  Set of Tinebase_Model_Role
  */
 public function searchRoles($_filter, $_paging)
 {
     $select = $_filter->getSelect();
     $_paging->appendPaginationSql($select);
     return new Tinebase_Record_RecordSet('Tinebase_Model_Role', $this->_getDb()->fetchAssoc($select));
 }
 /**
  * delete duplicate events defined by an event filter
  * 
  * @param Calendar_Model_EventFilter $filter
  * @param boolean $dryrun
  * @return integer number of deleted events
  */
 public function deleteDuplicateEvents($filter, $dryrun = TRUE)
 {
     if ($dryrun && Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
         Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' - Running in dry run mode - using filter: ' . print_r($filter->toArray(), true));
     }
     $duplicateFields = array('summary', 'dtstart', 'dtend');
     $select = $this->_db->select();
     $select->from(array($this->_tableName => $this->_tablePrefix . $this->_tableName), $duplicateFields);
     $select->where($this->_db->quoteIdentifier($this->_tableName . '.is_deleted') . ' = 0');
     $this->_addFilter($select, $filter);
     $select->group($duplicateFields)->having('count(*) > 1');
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $select);
     }
     $rows = $this->_fetch($select, self::FETCH_ALL);
     if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
         Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($rows, TRUE));
     }
     $toDelete = array();
     foreach ($rows as $row) {
         $index = $row['summary'] . ' / ' . $row['dtstart'] . ' - ' . $row['dtend'];
         $filter = new Calendar_Model_EventFilter(array(array('field' => 'summary', 'operator' => 'equals', 'value' => $row['summary']), array('field' => 'dtstart', 'operator' => 'equals', 'value' => new Tinebase_DateTime($row['dtstart'])), array('field' => 'dtend', 'operator' => 'equals', 'value' => new Tinebase_DateTime($row['dtend']))));
         $pagination = new Tinebase_Model_Pagination(array('sort' => array($this->_tableName . '.last_modified_time', $this->_tableName . '.creation_time')));
         $select = $this->_db->select();
         $select->from(array($this->_tableName => $this->_tablePrefix . $this->_tableName));
         $select->where($this->_db->quoteIdentifier($this->_tableName . '.is_deleted') . ' = 0');
         $this->_addFilter($select, $filter);
         $pagination->appendPaginationSql($select);
         $rows = $this->_fetch($select, self::FETCH_ALL);
         $events = $this->_rawDataToRecordSet($rows);
         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
             Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($events->toArray(), TRUE));
         }
         $deleteIds = $events->getArrayOfIds();
         // keep the first
         array_shift($deleteIds);
         if (!empty($deleteIds)) {
             $deleteContainerIds = $events->container_id;
             $origContainer = array_shift($deleteContainerIds);
             if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
                 Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Deleting ' . count($deleteIds) . ' duplicates of: ' . $index . ' in container_ids ' . implode(',', $deleteContainerIds) . ' (origin container: ' . $origContainer . ')');
             }
             if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
                 Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($deleteIds, TRUE));
             }
             $toDelete = array_merge($toDelete, $deleteIds);
         } else {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                 Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' No duplicates found for ' . $index);
             }
         }
     }
     if (empty($toDelete)) {
         if (Tinebase_Core::isLogLevel(Zend_Log::INFO)) {
             Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' No duplicates found.');
         }
         $result = 0;
     } else {
         $result = $dryrun ? count($toDelete) : $this->delete($toDelete);
     }
     return $result;
 }
Example #6
0
 /**
  * Calendar optimized search function
  *
  * @param  Tinebase_Model_Filter_FilterGroup    $_filter
  * @param  Tinebase_Model_Pagination            $_pagination
  * @param  boolean                              $_onlyIds
  * @param  bool   $_getDeleted
  * @return Tinebase_Record_RecordSet|array
  */
 public function search(Tinebase_Model_Filter_FilterGroup $_filter = NULL, Tinebase_Model_Pagination $_pagination = NULL, $_onlyIds = FALSE, $_getDeleted = FALSE)
 {
     if ($_pagination === NULL) {
         $_pagination = new Tinebase_Model_Pagination();
     }
     // we use a an extra select to reduce data amount where grants etc. have to be computed for.
     // the exdate is already appended here, to reduce virtual row numbers later
     $subselect = $this->_getSelectSimple('id', $_getDeleted);
     $subselect->joinLeft(array('exdate' => $this->_tablePrefix . 'cal_exdate'), $this->_db->quoteIdentifier('exdate.cal_event_id') . ' = ' . $this->_db->quoteIdentifier($this->_tableName . '.id'), array('exdate' => Tinebase_Backend_Sql_Command::getAggregateFunction($this->_db, $this->_db->quoteIdentifier('exdate.exdate'))));
     // this attendee join has nothing to do with grants but is here for attendee/status/... filters
     $subselect->joinLeft(array('attendee' => $this->_tablePrefix . 'cal_attendee'), $this->_db->quoteIdentifier('attendee.cal_event_id') . ' = ' . $this->_db->quoteIdentifier('cal_events.id'), array());
     if (!$_getDeleted) {
         $subselect->joinLeft(array('dispcontainer' => $this->_tablePrefix . 'container'), $this->_db->quoteIdentifier('dispcontainer.id') . ' = ' . $this->_db->quoteIdentifier('attendee.displaycontainer_id'), array());
         $subselect->where($this->_db->quoteIdentifier('dispcontainer.is_deleted') . ' = 0 OR ' . $this->_db->quoteIdentifier('dispcontainer.is_deleted') . 'IS NULL');
     }
     // remove grantsfilter here as we need it in the main select
     $grantsFilter = $_filter->getFilter('grants');
     if ($grantsFilter) {
         $_filter->removeFilter('grants');
     }
     $this->_addFilter($subselect, $_filter);
     $_pagination->appendPaginationSql($subselect);
     $subselect->group($this->_tableName . '.' . 'id');
     $stmt = $this->_db->query($subselect);
     $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
     $ids = array();
     $exdates = array();
     foreach ($rows as $row) {
         $ids[] = $row['id'];
         $exdates[$row['id']] = $row['exdate'];
     }
     $select = $this->_getSelectSimple('*', $_getDeleted);
     $select->where($this->_db->quoteInto("{$this->_db->quoteIdentifier('cal_events.id')} IN (?)", !empty($ids) ? $ids : ' '));
     $_pagination->appendPaginationSql($select);
     // append grants filters : only take limited set of attendee into account for grants computation
     $attenderFilter = $_filter->getFilter('attender');
     if (!$attenderFilter) {
         // if a container filter is set, take owners of personal containers (solve secretary scenario)
         $containerFilter = $_filter->getFilter('container_id');
         if ($containerFilter && $containerFilter instanceof Calendar_Model_CalendarFilter) {
             $attenderFilter = $containerFilter->getRelatedAttendeeFilter();
         } else {
             $attenderFilter = new Calendar_Model_AttenderFilter('attender', 'equals', array('user_type' => Calendar_Model_Attender::USERTYPE_USER, 'user_id' => Tinebase_Core::getUser()->contact_id));
         }
     }
     $this->_appendEffectiveGrantCalculationSql($select, $attenderFilter);
     if ($grantsFilter) {
         $grantsFilter->appendFilterSql($select, $this);
     }
     $select->group($this->_tableName . '.' . 'id');
     $this->_traitGroup($select);
     $stmt = null;
     // solve PHP bug @see {http://bugs.php.net/bug.php?id=35793}
     $stmt = $this->_db->query($select);
     $rows = (array) $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
     if ($_onlyIds) {
         $identifier = is_bool($_onlyIds) ? $this->_getRecordIdentifier() : $_onlyIds;
         $result = array();
         foreach ($rows as $row) {
             $result[] = $row[$identifier];
         }
     } else {
         foreach ($rows as &$row) {
             $row['exdate'] = $exdates[$row[$this->_getRecordIdentifier()]];
         }
         $result = $this->_rawDataToRecordSet($rows);
     }
     return $result;
 }
 /**
  * search for notes
  *
  * @param Tinebase_Model_NoteFilter $_filter
  * @param Tinebase_Model_Pagination $_pagination
  * @param boolean $ignoreACL
  * @return Tinebase_Record_RecordSet subtype Tinebase_Model_Note
  */
 public function searchNotes(Tinebase_Model_NoteFilter $_filter, Tinebase_Model_Pagination $_pagination = NULL, $ignoreACL = true)
 {
     $select = $this->_db->select()->from(array('notes' => SQL_TABLE_PREFIX . 'notes'))->where($this->_db->quoteIdentifier('is_deleted') . ' = 0');
     if (!$ignoreACL) {
         $this->_checkFilterACL($_filter);
     }
     Tinebase_Backend_Sql_Filter_FilterGroup::appendFilters($select, $_filter, $this);
     if ($_pagination !== NULL) {
         $_pagination->appendPaginationSql($select);
     }
     $stmt = $this->_db->query($select);
     $rows = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
     $result = new Tinebase_Record_RecordSet('Tinebase_Model_Note', $rows, true);
     return $result;
 }
Example #8
0
 /**
  * search for notes
  *
  * @param Tinebase_Model_NoteFilter $_filter
  * @param Tinebase_Model_Pagination $_pagination
  * @return Tinebase_Record_RecordSet subtype Tinebase_Model_Note
  */
 public function searchNotes(Tinebase_Model_NoteFilter $_filter, Tinebase_Model_Pagination $_pagination = NULL)
 {
     $select = $this->_db->select()->from(array('notes' => SQL_TABLE_PREFIX . 'notes'));
     Tinebase_Backend_Sql_Filter_FilterGroup::appendFilters($select, $_filter, $this);
     if ($_pagination !== NULL) {
         $_pagination->appendPaginationSql($select);
     }
     //if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $select->__toString());
     $rows = $this->_db->fetchAssoc($select);
     $result = new Tinebase_Record_RecordSet('Tinebase_Model_Note', $rows, true);
     return $result;
 }