/**
  * Soft deletes a record
  *
  * @param Model $Model using this behavior of model
  * @param int $id record id
  * @return bool
  */
 public function softdelete(Model $Model, $id = null)
 {
     if ($id) {
         $Model->id = $id;
     }
     if (!$Model->id) {
         return false;
     }
     $deleteCol = 'deleted';
     if (!$Model->hasField($deleteCol)) {
         return false;
     }
     $db = $Model->getDataSource();
     $now = time();
     $default = array('formatter' => 'date');
     $colType = array_merge($default, $db->columns[$Model->getColumnType($deleteCol)]);
     $time = $now;
     if (array_key_exists('format', $colType)) {
         $time = call_user_func($colType['formatter'], $colType['format']);
     }
     if (!empty($Model->whitelist)) {
         $Model->whitelist[] = $deleteCol;
     }
     $Model->set($deleteCol, $time);
     return $Model->saveField($deleteCol, $time);
 }
 /**
  * Uninstall plugin
  *
  * @param Model $model Model using this behavior
  * @param array $data Plugin data
  * @return bool True on success
  * @throws InternalErrorException
  */
 public function uninstallPlugin(Model $model, $data)
 {
     $model->loadModels(['Plugin' => 'PluginManager.Plugin', 'PluginsRole' => 'PluginManager.PluginsRole', 'PluginsRoom' => 'PluginManager.PluginsRoom']);
     //トランザクションBegin
     $model->setDataSource('master');
     $dataSource = $model->getDataSource();
     $dataSource->begin();
     if (is_string($data)) {
         $key = $data;
     } else {
         $key = $data[$model->alias]['key'];
     }
     try {
         //Pluginの削除
         if (!$model->deleteAll(array($model->alias . '.key' => $key), false)) {
             throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
         }
         //PluginsRoomの削除
         if (!$model->PluginsRoom->deleteAll(array($model->PluginsRoom->alias . '.plugin_key' => $key), false)) {
             throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
         }
         //PluginsRoleの削除
         if (!$model->PluginsRole->deleteAll(array($model->PluginsRole->alias . '.plugin_key' => $key), false)) {
             throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
         }
         //トランザクションCommit
         $dataSource->commit();
     } catch (Exception $ex) {
         //トランザクションRollback
         $dataSource->rollback();
         CakeLog::error($ex);
         throw $ex;
     }
     return true;
 }
 /**
  * Recursively parses joins
  *
  * @param Model $Model
  * @param array $joins
  * @return array
  */
 protected function _parseJoins(Model $Model, $joins, $defaults = array())
 {
     $ds = $Model->getDataSource();
     $defaults = array_merge($this->_defaults, $defaults);
     if (isset($joins['defaults'])) {
         $defaults = array_merge($defaults, $joins['defaults']);
         unset($joins['defaults']);
     }
     foreach ((array) $joins as $association => $options) {
         if (is_string($options)) {
             if (is_numeric($association)) {
                 $association = $options;
                 $options = array();
             } else {
                 $options = (array) $options;
             }
         }
         $AssociatedModel = $this->_associatedModel($Model, $association);
         $deeperAssociations = array_diff_key($options, $defaults);
         $options = array_merge($defaults, $options);
         $this->_join($Model, $association, $options['conditions'], $options['type']);
         $fields = false;
         if ($options['fields'] === true) {
             $fields = null;
         } elseif (!empty($options['fields'])) {
             $fields = $options['fields'];
         }
         if ($fields !== false) {
             $this->_query['fields'] = array_merge($this->_query['fields'], $ds->fields($AssociatedModel, null, $fields));
         }
         if (!empty($deeperAssociations)) {
             $this->_parseJoins($AssociatedModel, $deeperAssociations, $defaults);
         }
     }
 }
Example #4
0
	/**
	 * Inicializa os dados do behavior
	 *
	 * @see ModelBehavior::setup()
	 */
	public function setup(Model $model, $config = array())
	{
		$db = $model->getDataSource();

		if (!isset($db->columns) || is_a($db, 'MongodbSource')) {
			$this->_disabledFor[$model->alias] = true;
		}
	}
 /**
  * Uses the model datasource _after_ it was set to Cacher.cache
  *
  * @param Model $Model
  * @param array $queryData
  * @return string
  */
 function beforeFind(Model $Model, $queryData = array())
 {
     $this->_dbconfig = $Model->useDbConfig;
     $ds = $Model->getDataSource($this->_dbconfig);
     $this->_dbfields = $ds->fields($Model);
     $this->_queryData = $queryData;
     $queryData['conditions']['CacheData.name LIKE'] = '%thing%';
     return $queryData;
 }
 public function beforeValidate(Model $model, $config = array())
 {
     $this->_Model = $model;
     if (is_a($model->getDataSource(), 'Mongodbsource') && isset($model->collectionValidate)) {
         foreach ($model->data[$model->alias] as $fieldName => $value) {
             if (!isset($model->collectionValidate[$fieldName])) {
                 continue;
             }
             $this->_validateCollection($model->data[$model->alias][$fieldName], $model->collectionValidate[$fieldName]);
         }
     }
     return true;
 }
 /**
  * afterFind 
  *
  * @param Model $model Model
  * @param array $results Results
  * @param bool $primary Primary
  * @return mixed
  */
 public function afterFind(Model $model, $results, $primary = false)
 {
     $db = $model->getDataSource();
     $log = $db->getLog();
     $count = $log['count'];
     if ($db instanceof Sqlite) {
         foreach ($log['log'] as $log) {
             if (strpos($log['query'], 'sqlite_master') !== false) {
                 --$count;
             }
         }
     }
     $this->runtime[$model->alias]['count'] += $count;
 }
 /**
  * {@inheritDoc}
  */
 public function setup(Model $Model, $settings = null)
 {
     if (is_array($settings)) {
         $this->settings[$Model->alias] = array_merge($this->_defaults, $settings);
     } else {
         $this->settings[$Model->alias] = $this->_defaults;
     }
     $this->_stopwatch = new Stopwatch();
     $dsConfig = $Model->getDataSource()->config;
     if (isset($dsConfig['host'])) {
         $this->_serverName = $dsConfig['host'];
         if (isset($dsConfig['port'])) {
             $this->_serverName .= ':' . $dsConfig['port'];
         }
     }
 }
 /**
  * Utility method to smoothly switch dbconfigs without woes
  * @param \Model $model
  * @param string $source
  * @param string $useTable
  * @return void
  * @author Ceeram
  */
 public function setDbConfig(\Model $model, $source = null, $useTable = null)
 {
     $datasource = $model->getDataSource();
     if (method_exists($datasource, 'flushMethodCache')) {
         $datasource->flushMethodCache();
     }
     if ($source) {
         $this->config[$model->alias]['default'] = array('useTable' => $this->useTable, 'useDbConfig' => $this->useDbConfig);
         $this->setDataSource($source);
         if ($useTable !== null) {
             $this->setSource($useTable);
         }
     } else {
         if (!empty($this->config[$model->alias]['default'])) {
             $this->setDataSource($this->config[$model->alias]['default']['useDbConfig']);
             $this->setSource($this->config[$model->alias]['default']['useTable']);
             $this->config[$model->alias]['default'] = array();
         }
     }
 }
Example #10
0
 /**
  * Update bbs_article_modified and bbs_article_count
  *
  * @param object $model instance of model
  * @param int $bbsId bbses.id
  * @param string $bbsKey bbses.key
  * @param int $languageId languages.id
  * @return bool True on success
  * @throws InternalErrorException
  */
 public function updateBbsByBbsArticle(Model $model, $bbsId, $bbsKey, $languageId)
 {
     $db = $model->getDataSource();
     $conditions = array('bbs_id' => $bbsId, 'language_id' => $languageId, 'is_latest' => true);
     $count = $model->find('count', array('recursive' => -1, 'conditions' => $conditions));
     if ($count === false) {
         throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
     }
     $article = $model->find('first', array('recursive' => -1, 'fields' => 'modified', 'conditions' => $conditions, 'order' => array('modified' => 'desc')));
     if ($article === false) {
         throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
     }
     $update = array('bbs_article_count' => $count);
     if ($article) {
         $update['bbs_article_modified'] = $db->value($article[$model->alias]['modified'], 'string');
     }
     if (!$model->Bbs->updateAll($update, array('Bbs.key' => $bbsKey))) {
         throw new InternalErrorException(__d('net_commons', 'Internal Server Error'));
     }
     return true;
 }
 protected function _saveHasAndBelongsToMany(&$record)
 {
     foreach ($this->_associations as $association) {
         if (!($association->isChanged() && $association->isHasAndBelongsToMany())) {
             continue;
         }
         $this->_changed = true;
         $associatedActiveRecords = $association->getActiveRecords();
         $DataSource = $this->_Model->getDataSource();
         if (count($associatedActiveRecords) === 0) {
             // All associated records must be delete in the join table
             // Maybe not the most beautiful way to do it...
             $DataSource->execute('DELETE FROM ' . $association->getDefinition('joinTable') . ' WHERE ' . $association->getDefinition('foreignKey') . ' = ' . $DataSource->value($this->_Record[$this->getPrimaryKey()]));
         } else {
             $records = $this->_createOrGetHABTMRecordKeys($associatedActiveRecords, $association->getPrimaryKey());
             $record[$association->getName()] = $records;
             $DataSource->execute('DELETE FROM ' . $association->getDefinition('joinTable') . ' WHERE ' . $association->getDefinition('foreignKey') . ' = ' . $DataSource->value($this->_Record[$this->getPrimaryKey()]) . ' AND ' . $association->getDefinition('associationForeignKey') . ' NOT IN (' . implode(',', array_map(array($DataSource, 'value'), $records)) . ')');
         }
         $association->setChanged(false);
     }
 }
 /**
  * Triggers afterFind() method
  *
  * @param Model $parent Model
  * @param string $alias Alias
  * @param array $results Results
  * @return array
  */
 private function filterResults(Model $parent, $alias, array $results)
 {
     // @codingStandardsIgnoreLine
     $db = $parent->getDataSource();
     $db->dispatchMethod('_filterResultsInclusive', array(&$results, $parent, array($alias)));
     return $results;
 }
Example #13
0
 /**
  * Updates a database record with the necessary extra data
  *
  * @param Model $model Model instance
  * @param array $data array containing data to be saved to the record
  * @return void
  */
 protected function _updateRecord(Model $model, $data)
 {
     CakeLog::debug('NcUploadBehavior::_updateRecord()');
     CakeLog::debug('NcUploadBehavior::_updateRecord() $model->useDbConfig=' . $model->useDbConfig);
     CakeLog::debug('NcUploadBehavior::_updateRecord() $data=' . print_r($data, true));
     if (!$this->runtime) {
         return;
     }
     $db = $model->getDataSource();
     $fields = array_keys($this->runtime[$model->alias]);
     foreach ($fields as $field) {
         if (isset($model->data[$field][$model->FileModel->alias]['path']) && $model->data[$field][$model->FileModel->alias]['path'] !== '') {
             $path = $model->data[$field][$model->FileModel->alias]['path'] . $model->id . '{DS}';
             $model->FileModel->updateAll(array('path' => $db->value($path, 'string')), array($model->FileModel->primaryKey => (int) $model->data[$field][$model->FileModel->alias]['id']));
         }
     }
 }
 public function convertValue(Model $Model, $field, $value)
 {
     if ($value === null) {
         return null;
     }
     if ($Model->OriginModel->schema($field)['type'] === 'date') {
         return date($Model->getDataSource()->columns['date']['format'], strtotime($value));
     }
     if ($Model->OriginModel->schema($field)['type'] === 'time') {
         return date($Model->getDataSource()->columns['time']['format'], strtotime($value));
     }
     return $value;
 }
Example #15
0
 /**
  * Helper method for getQuery.
  * extension of dbo source method. Create association query.
  *
  * @param Model $Model
  * @param array $queryData
  * @return string
  */
 protected function _queryGet(Model $Model, $queryData = array())
 {
     /** @var DboSource $db  */
     $db = $Model->getDataSource();
     $queryData = $this->_scrubQueryData($queryData);
     $recursive = null;
     $byPass = false;
     $null = null;
     $linkedModels = array();
     if (isset($queryData['recursive'])) {
         $recursive = $queryData['recursive'];
     }
     if ($recursive !== null) {
         $Model->recursive = $recursive;
     }
     if (!empty($queryData['fields'])) {
         $byPass = true;
         $queryData['fields'] = $db->fields($Model, null, $queryData['fields']);
     } else {
         $queryData['fields'] = $db->fields($Model);
     }
     $_associations = $Model->associations();
     if ($Model->recursive == -1) {
         $_associations = array();
     } elseif ($Model->recursive == 0) {
         unset($_associations[2], $_associations[3]);
     }
     foreach ($_associations as $type) {
         foreach ($Model->{$type} as $assoc => $assocData) {
             $linkModel = $Model->{$assoc};
             $external = isset($assocData['external']);
             $linkModel->getDataSource();
             if ($Model->useDbConfig === $linkModel->useDbConfig) {
                 if ($byPass) {
                     $assocData['fields'] = false;
                 }
                 if ($db->generateAssociationQuery($Model, $linkModel, $type, $assoc, $assocData, $queryData, $external, $null) === true) {
                     $linkedModels[$type . '/' . $assoc] = true;
                 }
             }
         }
     }
     return trim($db->generateAssociationQuery($Model, null, null, null, null, $queryData, false, $null));
 }
 /**
  * Index a document or a list of documents, bypassing Model::save() (much faster)
  *
  * Good for indexing pre-validated data such as data from your DB
  *
  * @param Model $Model
  * @param array $documents
  * @return void
  * @author David Kullmann
  */
 public function index(Model $Model, $documents = array(), $options = array())
 {
     $defaults = array('callbacks' => false);
     $options = array_merge($defaults, $options);
     $geoFields = !empty($this->settings[$Model->alias]['geoFields']) ? $this->settings[$Model->alias]['geoFields'] : false;
     if ($geoFields) {
         extract($geoFields);
     }
     $ds = $Model->getDataSource();
     $ds->begin();
     foreach ($documents as $document) {
         if ($geoFields) {
             $document[$alias][$location] = array('lat' => $document[$Model->alias][$latitude], 'lon' => $document[$Model->alias][$longitude]);
         }
         if ($options['callbacks'] === true || $options['callbacks'] === 'before') {
             $Model->set($document);
             $event = new CakeEvent('Model.beforeSave', $Model, array($options));
             list($event->break, $event->breakOn) = array(true, array(false, null));
             $Model->getEventManager()->dispatch($event);
             if (!$event->result) {
                 return false;
             }
         }
         $ds->addToDocument($Model, $document);
     }
     $ds->commit();
     return $documents;
 }
Example #17
0
 /**
  * Bulk Copy
  *
  * @param Model $model Model object
  * @param array $ids Array of IDs
  * @return boolean True on success, false on failure
  */
 public function bulkCopy(Model $model, $ids)
 {
     if (!$model->Behaviors->loaded('Copyable')) {
         $model->Behaviors->load('Croogo.Copyable');
     }
     $result = false;
     $ds = $model->getDataSource();
     $ds->begin();
     foreach ($ids as $id) {
         $result = $model->copy($id);
         if (!$result) {
             $ds->rollback();
             break;
         }
     }
     if ($result) {
         $ds->commit();
     }
     return $result;
 }
Example #18
0
 public function setup(Model $Model, $config = [])
 {
     $this->_settings = $config;
     $this->_Grid = $Model->getDataSource()->getMongoDb()->getGridFS();
     return parent::setup($Model, $this->_settings);
 }
Example #19
0
 /**
  * Check and set missing configurations
  *
  * @param Model $model
  * @param array $config
  * @return void
  */
 private function __checkConfig(Model $model, $config = null)
 {
     if ($config !== null || !isset($this->settings[$model->alias])) {
         $this->settings[$model->alias] = Set::merge($this->_defaultSettings, $config);
     }
     if (!isset($this->_modelFields[$model->alias])) {
         $this->_modelFields[$model->alias] = @$model->getColumnTypes();
     }
     if (isset($this->typesFormat[$model->useDbConfig])) {
         return;
     }
     $db = $model->getDataSource();
     $this->typesFormat[$model->useDbConfig] = array();
     foreach ($db->columns as $type => $info) {
         if (isset($info['format'])) {
             $this->typesFormat[$model->useDbConfig][$type] = $info['format'];
         }
     }
 }
Example #20
0
 /**
  * Updates a database record with the necessary extra data
  *
  * @param Model $model Model instance
  * @param array $data array containing data to be saved to the record
  * @return void
  */
 protected function _updateRecord(Model $model, $data)
 {
     if (!$this->runtime) {
         return;
     }
     $db = $model->getDataSource();
     $fields = array_keys($this->runtime[$model->alias]);
     foreach ($fields as $field) {
         if (isset($model->data[$field][$model->FileModel->alias]['path']) && $model->data[$field][$model->FileModel->alias]['path'] !== '') {
             $path = $model->data[$field][$model->FileModel->alias]['path'] . $model->id . '{DS}';
             $model->FileModel->updateAll(array('path' => $db->value($path, 'string')), array($model->FileModel->primaryKey => (int) $model->data[$field][$model->FileModel->alias]['id']));
         }
     }
 }
 /**
  * Get now()
  *
  * @param Model $model Model using this behavior
  * @param string $field Room data
  * @return string now()
  */
 private function __now(Model $model, $field)
 {
     $db = $model->getDataSource();
     $colType = array_merge(array('formatter' => 'date'), $db->columns[$model->getColumnType($field)]);
     $time = time();
     if (array_key_exists('format', $colType)) {
         $time = call_user_func($colType['formatter'], $colType['format']);
     }
     return $time;
 }
 /**
  * Returns the SQL
  *
  * @return string
  */
 public function sql()
 {
     $db = $this->model->getDataSource();
     $options = $this->options->getOptions();
     return $db->buildAssociationQuery($this->model, $options);
 }
Example #23
0
 /**
  * Método auxiliar para recuperar a lista de queries do DataSource
  * e remover campos indesejados.
  *
  * @return array
  */
 protected function getCleanLog(Model $Model)
 {
     $ds = $Model->getDataSource();
     $queries = array();
     if (method_exists($ds, 'getLog')) {
         $log = $ds->getLog(false, false);
         $diff = Set::diff($log['log'], $this->cachedQueries);
         $this->cachedQueries = $log['log'];
         foreach ($diff as $entry) {
             if (empty($entry['affected'])) {
                 continue;
             }
             $queries[] = $entry['query'];
         }
     }
     return $queries;
 }
Example #24
0
 public function beforeFindUserGroupIds(Model $Model, $queryData)
 {
     $authUser = CakeSession::read('Auth.User');
     //$userRole = $authUser['user_role_id']; (this uncommented breaks our tests)
     $userId = $authUser['id'];
     $User = ClassRegistry::init('Users.User');
     debug($User->find('first', array('conditions' => array('User.id' => $userId), 'contain' => array('UserGroup'))));
     if (!empty($userId) && empty($queryData['nocheck'])) {
         // this tells us whether the result would have returned something if UsableBehavior wasn't used
         $queryData['nocheck'] = true;
         // $originalSearchCount = $Model->find('count', $queryData);
         $originalSearchCount = 0;
         if ($originalSearchCount > 0) {
             $this->restrictRedirect = true;
         }
         /*# this allows you to bypass the logged in user check (nocheck should equal the user id)
         		$userQuery = !empty($queryData['nocheck']) ? "Used.user_id = '{$queryData['nocheck']}'" : "Used.user_id = '{$userId}'";
         		*/
         // left because I don't know where nocheck was used
         /* output the new query // left for reference as its a pretty cool query
         			$queryData['joins'] = array(array(
         				'table' => 'used',
         				'alias' => 'Used',
         				'type' => 'LEFT',
         				'conditions' => array(
         					"Used.foreign_key = {$Model->alias}.id",
         					"Used.model = '{$Model->alias}'",
         					$userQuery,
         				),
         			));*/
         $Dbo = $Model->getDataSource();
         // First find users with access
         $subQuery = $Dbo->buildStatement(array('fields' => array('Used.foreign_key'), 'table' => 'used', 'alias' => 'Used', 'limit' => null, 'offset' => null, 'joins' => array(), 'conditions' => array('Used.model' => "{$Model->alias}", 'Used.user_group_id' => $userId), 'order' => null, 'group' => null), $Model);
         $subQuery = "`{$Model->alias}`.`id` IN (" . $subQuery . ")";
         $subQueryExpression = $Dbo->expression($subQuery);
         // First model records that aren't accessed controlled
         $subQuery2 = $Dbo->buildStatement(array('fields' => array('Used.foreign_key'), 'table' => 'used', 'alias' => 'Used', 'limit' => null, 'offset' => null, 'joins' => array(), 'conditions' => array('Used.model' => "{$Model->alias}", 'Used.foreign_key = ' . $Model->alias . '.id'), 'order' => null, 'group' => null), $Model);
         $subQuery2 = "`{$Model->alias}`.`id` NOT IN (" . $subQuery2 . ")";
         $subQueryExpression2 = $Dbo->expression($subQuery2);
         $newQueryData['conditions'][]['OR'] = array('(' . $subQueryExpression->value . ')', '(' . $subQueryExpression2->value . ')');
         $queryData = Set::merge($queryData, $newQueryData);
         /* Example of the query we're running here.
         			SELECT `Project`.`id`
         			FROM `projects` AS `Project`
         			WHERE `Project`.`is_archived` = '0'
         			AND (
         				 ((
         				 	`Project`.`id` IN (
         						SELECT `Used`.`foreign_key`
         						FROM used AS Used
         						WHERE `Used`.`model` = 'Project'
         						AND `Used`.`user_id` = 1 )
         				 )) OR ((
         					`Project`.`id` NOT IN (
         						SELECT `Used`.`foreign_key`
         						FROM used AS Used
         						WHERE `Used`.`model` = 'Project' )
         				 ))
         				)
         			LIMIT 25
         			*/
     }
     return $queryData;
 }
Example #25
0
 /**
  * Generate data files
  *
  * The first two arguments will be passed to Model::find().
  * `$options` accepts the following keys:
  * - `model`: accepts `name`, `table`, and `ds`. See `ClassRegistry::init()`
  * - `output`: Path to output file
  *
  * @param string $type Type of query, eg: 'first' or 'all'. See Model::find()
  * @param array $query Query options passed as second argument to Model::find()
  * @param array $options Array of options. Accepts `model` and `output` keys
  * @see Model::find()
  */
 public function generate($type, $query = array(), $options = array())
 {
     $options = Hash::merge(array('model' => array('name' => null, 'table' => null, 'ds' => null), 'output' => null), $options);
     $modelOptions = $options['model'];
     $name = $modelOptions['name'];
     $table = $modelOptions['table'];
     $ds = $modelOptions['ds'];
     $Model = new Model(array('name' => $name, 'table' => $table, 'ds' => $ds));
     $ds = $Model->getDataSource();
     $records = $Model->find($type, $query);
     // generate file content
     $recordString = '';
     foreach ($records as $record) {
         $values = array();
         foreach ($record[$name] as $field => $value) {
             $value = $ds->value($value);
             $values[] = "\t\t\t'{$field}' => {$value}";
         }
         $recordString .= "\t\tarray(\n";
         $recordString .= implode(",\n", $values);
         $recordString .= "\n\t\t),\n";
     }
     $content = "<?php\n\n";
     $content .= "class " . $name . "Data" . " {\n\n";
     $content .= "\tpublic \$table = '" . $table . "';\n\n";
     $content .= "\tpublic \$records = array(\n";
     $content .= $recordString;
     $content .= "\t);\n\n";
     $content .= "}\n";
     return $this->_writeFile($options['output'], $content);
 }