Exemplo n.º 1
0
 function getInvalidationData($nodes)
 {
     $this->load();
     $opts = array('inheritParent' => false, 'mode' => 'all', 'fields' => array('id', 'model', 'foreign_key'), 'conditions' => array('model NOT' => null), 'order' => 'model');
     $NodeLink = ClassRegistry::init('NodeLink');
     $Invalidation = ClassRegistry::init('Invalidation');
     /*if(!empty($this->loadedItems)){
     			//reset($this->loadedItems);
     			//$minTime = current($this->loadedItems);
     			//debug($minTime);
     			$loadedCond = array();
     			foreach($this->loadedItems as $node_id => $time){
     				$loadedCond[] = array(
     					$Invalidation->alias.'.node_id'=>$node_id,
     					$Invalidation->alias.'.time >'=>$time
     				);
     			}
     			$opts = set::merge($opts,array(
     				'fields' => Array(
     					"GROUP_CONCAT(IFNULL (".$Invalidation->alias.".field,'all')) AS Fields"
     				),
     				'joins' => array('1000-invalidation'=>array(
     					'type'=>'left',
     					'table'=>$Invalidation->useTable,
     					'alias' =>$Invalidation->alias,
     					'conditions' => array(
     						$Invalidation->alias.'.node_id = AllNode.id',
     						array('or'=>$loadedCond)
     					)
     				)),
     				'conditions' => array(
     					array('or'=>array(
     							$Invalidation->alias.'.node_id IS NOT NULL',
     							'not'=>array('AllNode.id'=>array_keys($this->loadedItems))
     					))
     				)
     			));
     		}*/
     //debug($opts);
     $allNodes = $NodeLink->getLinked($nodes, 'invalidation', $opts);
     //debug($allNodes);
     if (!empty($allNodes)) {
         /////////// Get invalidations ///////////
         App::import('Lib', 'SetMulti');
         $allNodeId = $this->_getAllNodeIds($allNodes);
         $excludeCheck = array();
         $invalids = array();
         if (!$this->disableCache) {
             $excludeCheck = array_intersect_key($this->loadedItems, array_flip($allNodeId));
             $bydate = SetMulti::flip($excludeCheck);
             //debug($bydate);
             $findOpt = array('fields' => array($Invalidation->alias . '.id', $Invalidation->alias . '.node_id'));
             foreach ($bydate as $time => $nids) {
                 $findOpt['conditions']['or'][] = array($Invalidation->alias . '.node_id' => $nids, $Invalidation->alias . '.time >' => $time);
             }
             $invalids = $Invalidation->find('all', $findOpt);
             if (!empty($invalids)) {
                 $invalids = SetMulti::group($invalids, $Invalidation->alias . '.node_id');
             }
         }
         //debug($invalids);
         //debug($excludeCheck);
         /////////// remove unneeded ///////////
         $toGet = array();
         foreach ($allNodes as $node) {
             $nid = $node['Node']['id'];
             if ((!isset($excludeCheck[$nid]) || isset($invalids[$nid])) && !empty($node['Node']['model'])) {
                 $model = $node['Node']['model'];
                 if (empty($toGet[$model])) {
                     $toGet[$model] = array('ids' => array(), 'globalFields' => 'all', 'fields' => array());
                 }
                 $id = $node['Node']['foreign_key'];
                 $toGet[$model]['ids'][] = $id;
                 $toGet[$model]['fields'][$id] = 'all';
             }
         }
         //debug($toGet);
         $aro = array($this->controller->User->myNodeRef($this->controller->user['User']['id']));
         //debug($aro);
         $allItems = array();
         foreach ($toGet as $modelName => $opt) {
             $model = ClassRegistry::init($modelName);
             $model->create();
             $findOptions = array('conditions' => array($model->alias . '.id' => $opt['ids']));
             if ($opt['globalFields'] != 'all') {
                 $findOptions['restrict'] = $opt['globalFields'];
             }
             //debug($findOptions);
             $items = $model->triggerAction('linkRead', array($findOptions), $aro);
             if (!empty($items)) {
                 $allItems = array_merge($allItems, $items);
             }
         }
         //debug($allItems);
         return $allItems;
     }
     return null;
 }
Exemplo n.º 2
0
 function updateDataNow(&$model, $data, $time = null, $options = array())
 {
     App::import('Lib', 'SetMulti');
     if (empty($data)) {
         return $data;
     }
     if (is_array($time)) {
         $options = $time;
     } else {
         $options['time'] = $time;
     }
     $defOpt = array('time' => null, 'belongsTo' => array());
     $opt = array_merge($options, $defOpt);
     if (empty($opt['time'])) {
         $opt['time'] = mktime();
     }
     ////// Normalize Data //////
     //todo : add lateral relation normalisation
     $model->Behaviors->attach('Util');
     $oldFormat = array();
     //$data = $model->unifiedResult($data, null, array(), $oldFormat);
     list($data, $oldFormat) = $model->unifiedResult($data, null, null, true);
     //debug($oldFormat);
     ////// get relation key fields //////
     $relationKeyFields = array();
     $belongsTo = array_merge($model->belongsTo, $opt['belongsTo']);
     foreach ($model->belongsTo as $bkey => $belongs) {
         if (!empty($data[0][$bkey])) {
             $relationKeyFields[] = $belongs['foreignKey'];
         }
     }
     ////// get updated Data //////
     $plans = array();
     $fields = array_merge(array_keys($data[0][$model->alias]), $relationKeyFields);
     $changes = $this->getChanges($model, $data, $opt['time'], $fields, $plans);
     ////// get updated relations //////
     foreach ($model->belongsTo as $bkey => $belongs) {
         $toUpdate = array();
         foreach ($changes as $rkey => $row) {
             if (!empty($data[$rkey][$bkey]) && !empty($row[$model->alias][$belongs['foreignKey']])) {
                 $toUpdate[$rkey] = $row[$model->alias][$belongs['foreignKey']];
             }
         }
         $mapping = SetMulti::flip($toUpdate);
         if (!empty($toUpdate)) {
             $excludeFields = array('name', 'className', 'counterCache');
             $findOptions = array_diff_key($belongs, array_flip($excludeFields));
             $bModel = $model->{$bkey};
             $findOptions['conditions'][$bModel->alias . '.id'] = $toUpdate;
             $findOptions['recursive'] = -1;
             // in the futur we may want to detect contain option
             $newBinded = $bModel->find('all', $findOptions);
             //$newBinded = $bModel->dataToContainedRelations($new); //see comment on recursive
             foreach ($newBinded as $n) {
                 $nid = $n[$bkey][$bModel->primaryKey];
                 foreach ((array) $mapping[$nid] as $rkey) {
                     $changes[$rkey][$bkey] = $n[$bkey];
                 }
             }
         }
     }
     //debug($changes);
     $data = Set::merge($data, $changes);
     //todo : recursive relations update
     ////// Painless update //////
     if (strtotime($opt['time']) <= mktime()) {
         $this->_applyPlans($model, $plans, $opt['time']);
     }
     ////// Un-normalize Data //////
     $data = $model->unifiedResult($data, null, $oldFormat);
     return $data;
 }
    function fix_emailDuplicate2($error, $opt, &$msg)
    {
        $_this =& NewsletterUpgrade::getInstance();
        $db = ConnectionManager::getDataSource($_this->connection);
        App::import('Lib', 'Newsletter.SetMulti');
        $this->NewsletterEmail = ClassRegistry::init('Newsletter.NewsletterEmail');
        $this->NewsletterSendlistsEmail = ClassRegistry::init('Newsletter.NewsletterSendlistsEmail');
        $findOpt = array('fields' => array('e2.id', 'NewsletterEmail.id'), 'conditions' => array(), 'joins' => array(array('alias' => 'e2', 'table' => $this->NewsletterEmail->useTable, 'type' => 'INNER', 'conditions' => array('`e2`.`id` != `NewsletterEmail`.`id`', '`e2`.`email` = `NewsletterEmail`.`email`'))), 'group' => '`e2`.`id` HAVING `e2`.`id` > `NewsletterEmail`.`id`', 'recursive' => -1, 'model' => $this->NewsletterEmail);
        $duplicated = SetMulti::flip($this->NewsletterEmail->find('list', $findOpt));
        foreach ($duplicated as $first => $dup) {
            $dup = (array) $dup;
            $query = 'UPDATE `newsletter_sendlists_emails` AS `NewsletterSendlistsEmail` 
				LEFT JOIN `newsletter_sendlists_emails` AS `Equiv` 
				ON (`NewsletterSendlistsEmail`.`newsletter_sendlist_id` = `Equiv`.`newsletter_sendlist_id` AND `Equiv`.`newsletter_email_id` = ' . $first . ') 
				SET `NewsletterSendlistsEmail`.`newsletter_email_id` = ' . $first . ' 
				WHERE `Equiv`.`id` IS NULL AND `NewsletterSendlistsEmail`.`newsletter_email_id` IN (' . implode(', ', $dup) . ')';
            if (!$db->execute($query)) {
                $msg = __('Unable to execute query :', true) . ' ' . $query;
                return false;
            }
            $this->NewsletterSendlistsEmail->deleteAll(array('newsletter_email_id' => array_values($dup)));
            $this->NewsletterEmail->deleteAll(array('id' => array_values($dup)));
        }
        $query = $db->alterSchema($error, 'newsletter_emails');
        if (!$db->execute($query)) {
            $msg[] = __('Unable to execute query :', true) . ' ' . $query;
            return false;
            break;
        }
        return true;
    }