/** * 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); } } }
/** * 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(); } } }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
public function setup(Model $Model, $config = []) { $this->_settings = $config; $this->_Grid = $Model->getDataSource()->getMongoDb()->getGridFS(); return parent::setup($Model, $this->_settings); }
/** * 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']; } } }
/** * 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); }
/** * 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; }
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; }
/** * 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); }