/** * Creates file identifier hashes for a single storage. * * @param ResourceStorage $storage The storage to update * @return array The executed database queries */ protected function updateIdentifierHashesForStorage(ResourceStorage $storage) { $queries = array(); if (!ExtensionManagementUtility::isLoaded('dbal')) { // if DBAL is not loaded, we're using MySQL and can thus use their // SHA1() function if ($storage->usesCaseSensitiveIdentifiers()) { $updateCall = 'SHA1(identifier)'; } else { $updateCall = 'SHA1(LOWER(identifier))'; } $queries[] = $query = sprintf('UPDATE sys_file SET identifier_hash = %s WHERE storage=%d', $updateCall, $storage->getUid()); $this->db->sql_query($query); // folder hashes cannot be done with one call: so do it manually $files = $this->db->exec_SELECTgetRows('uid, storage, identifier', 'sys_file', sprintf('storage=%d AND folder_hash=""', $storage->getUid())); foreach ($files as $file) { $folderHash = $storage->hashFileIdentifier($storage->getFolderIdentifierFromFileIdentifier($file['identifier'])); $queries[] = $query = $this->db->UPDATEquery('sys_file', 'uid=' . $file['uid'], array('folder_hash' => $folderHash)); $this->db->sql_query($query); } } else { // manually hash the identifiers when using DBAL $files = $this->db->exec_SELECTgetRows('uid, storage, identifier', 'sys_file', sprintf('storage=%d AND identifier_hash=""', $storage->getUid())); foreach ($files as $file) { $hash = $storage->hashFileIdentifier($file['identifier']); $folderHash = $storage->hashFileIdentifier($storage->getFolderIdentifierFromFileIdentifier($file['identifier'])); $queries[] = $query = $this->db->UPDATEquery('sys_file', 'uid=' . $file['uid'], array('identifier_hash' => $hash, 'folder_hash' => $folderHash)); $this->db->sql_query($query); } } return $queries; }
/** * @test * * @return void */ public function updateQueryCreateValidQuery() { $this->subject = $this->getAccessibleMock(DatabaseConnection::class, ['fullQuoteStr'], [], '', false); $this->subject->expects($this->any())->method('fullQuoteStr')->will($this->returnCallback(function ($data) { return '\'' . (string) $data . '\''; })); $fieldsValues = [$this->testField => 'aTestValue']; $queryExpected = "UPDATE {$this->testTable} SET {$this->testField}='aTestValue' WHERE id=1"; $queryGenerated = $this->subject->UPDATEquery($this->testTable, 'id=1', $fieldsValues); $this->assertSame($queryExpected, $queryGenerated); }
/** * Db update object * * @param int $uid Uid * @param Tx_Commerce_Dao_BasicDaoObject $object Object * * @return void */ protected function dbUpdate($uid, Tx_Commerce_Dao_BasicDaoObject &$object) { $dbTable = $this->dbTable; $dbWhere = 'uid = ' . (int) $uid; $dbModel = $this->parser->parseObjectToModel($object); // execute query $this->database->exec_UPDATEquery($dbTable, $dbWhere, $dbModel); // any errors $error = $this->database->sql_error(); if (!empty($error)) { $this->addError(array($error, $this->database->UPDATEquery($dbTable, $dbWhere, $dbModel), '$dbModel' => $dbModel)); } }
/** * Updates the FlexForm data in the given outdated content element. * * @param array $outdatedContent * @param array &$dbQueries Queries done in this update */ protected function updateOutdatedContentFlexForm($outdatedContent, array &$dbQueries) { $flexFormArray = GeneralUtility::xml2array($outdatedContent['pi_flexform']); if (isset($flexFormArray['data']['rss']['lDEF']['settings.list.rss.channel'])) { $title = $flexFormArray['data']['rss']['lDEF']['settings.list.rss.channel']; unset($flexFormArray['data']['rss']['lDEF']['settings.list.rss.channel']); $flexFormArray['data']['rss']['lDEF']['settings.list.rss.channel.title'] = $title; } $flexFormData = $this->flexObj->flexArray2Xml($flexFormArray); $query = $this->db->UPDATEquery('tt_content', 'uid=' . (int) $outdatedContent['uid'], array('pi_flexform' => $flexFormData)); $this->db->sql_query($query); $dbQueries[] = $query; }
/** * Encrypt old bounce account passwords and preserve old default config * * @return string[] */ private function getQueriesToEncryptOldBounceAccountPasswords() { // Fetch the old records - they will have a default port and an empty config. $rs = $this->databaseConnection->exec_SELECTquery('uid, password', 'tx_newsletter_domain_model_bounceaccount', 'port = 0 AND config = \'\''); $records = []; while ($record = $this->databaseConnection->sql_fetch_assoc($rs)) { $records[] = $record; } $this->databaseConnection->sql_free_result($rs); if (empty($records)) { return []; } // Keep the old config to not break old installations $config = Tools::encrypt("poll ###SERVER###\nproto ###PROTOCOL### \nusername \"###USERNAME###\"\npassword \"###PASSWORD###\"\n"); $queries = []; foreach ($records as $record) { $queries[] = $this->databaseConnection->UPDATEquery('tx_newsletter_domain_model_bounceaccount', 'uid=' . intval($record['uid']), ['password' => Tools::encrypt($record['password']), 'config' => $config]); } return ['Encrypt bounce account passwords' => $queries]; }
/** * Returns the last built SQL UPDATE query with tabs removed. * * This function tries to retrieve the last built SQL UPDATE query from the database object property $this->debug_lastBuiltQuery (works only since T3 3.8.0 with $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true). If this does not succeed, a fallback method is used (for former versions of class.\TYPO3\CMS\Core\Database\DatabaseConnection.php [TYPO3 3.6.0-3.8.0beta1] or $GLOBALS['TYPO3_DB']->store_lastBuiltQuery _not_ set to true) to retrieve the query string from \TYPO3\CMS\Core\Database\DatabaseConnection::UPDATEquery() - as this is an overhead (\TYPO3\CMS\Core\Database\DatabaseConnection::UPDATEquery() is called a second time after the call from \TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATE_query) IMO this should not be a permanent solution. * * @param DatabaseConnection TYPO3 database object (instance of \TYPO3\CMS\Core\Database\DatabaseConnection) used for last executed SQL query * @param string table name passed to last executed SQL query (see comment of \TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATEquery()) * @param string where clause passed to last executed SQL query (see comment of \TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATEquery()) * @param array array containing field/value-pairs passed to last executed SQL query (see comment of \TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATEquery()) * @return string last built SQL query with tabs removed * @see class.\TYPO3\CMS\Core\Database\DatabaseConnection.php, \TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATEquery() * @author Rainer Kuhn */ public static function returnLastBuiltUpdateQuery(DatabaseConnection $dbObject, $table, $where, $updateFieldsArr) { // try to get query from debug_lastBuiltQuery (works only for T3 3.8.0 with $GLOBALS['TYPO3_DB']->store_lastBuiltQuery = true) $query = $dbObject->debug_lastBuiltQuery; // fallback for former versions of class.\TYPO3\CMS\Core\Database\DatabaseConnection.php (TYPO3 3.6.0-3.8.0beta1) or $GLOBALS['TYPO3_DB']->store_lastBuiltQuery _not_ set to true if (strlen($query) < 1) { $query = $dbObject->UPDATEquery($table, $where, $updateFieldsArr); } // remove tabs and return query string return str_replace(chr(9), '', $query); }