/** * Make a plain SQL Query. * Notice: The db resource is not closed by this method. The caller is in charge to do this! * * @TODO: logging integrieren! * * @param string $sqlQuery * @param int $debug * @return result pointer for SELECT, EXPLAIN, SHOW, DESCRIBE or boolean */ public static function doQuery($query, array $options = array()) { return parent::doQuery($query); }
/** * Get picture usage count * * @param int $mediaUid * @return int */ public static function getReferencesCount($mediaUid) { $options['where'] = 'uid_local = ' . (int) $mediaUid; $options['count'] = 1; $options['enablefieldsoff'] = 1; $ret = tx_rnbase_util_DB::doSelect('count(*) AS \'cnt\'', 'tx_dam_mm_ref', $options, 0); $cnt = count($ret) ? intval($ret[0]['cnt']) : 0; return $cnt; }
/** * Reload this records from database * * @return tx_rnbase_model_base */ function reset() { $this->record = tx_rnbase_util_DB::getRecord($this->getTableName(), $this->getUid()); // set the modified state to clean $this->resetCleanState(); return $this; }
public static function getAddLocalizationLinks(tx_rnbase_model_base $item, tx_rnbase_mod_BaseModule $mod = NULL) { if ($item->getUid() != $item->getProperty('uid') || $item->getSysLanguageUid() !== 0) { return ''; } $out = ''; foreach (self::getLangRecords($item->getPid()) as $lang) { // skip, if the be user hase no access to for the language! if (!$GLOBALS['BE_USER']->checkLanguageAccess($lang['uid'])) { continue; } // skip, if a overlay for this language allready exists tx_rnbase::load('tx_rnbase_util_TCA'); $parentField = tx_rnbase_util_TCA::getTransOrigPointerFieldForTable($item->getTableName()); $sysLanguageUidField = tx_rnbase_util_TCA::getLanguageFieldForTable($item->getTableName()); $overlays = tx_rnbase_util_DB::doSelect('uid', $item->getTableName(), array('where' => implode(' AND ', array($parentField . '=' . $item->getUid(), $sysLanguageUidField . '=' . (int) $lang['uid'])), 'limit' => 1)); if (!empty($overlays)) { continue; } /* @var $mod tx_rnbase_mod_BaseModule */ if (!$mod instanceof tx_rnbase_mod_BaseModule) { $mod = $GLOBALS['SOBE']; } $onclick = $mod->getDoc()->issueCommand('&cmd[' . $item->getTableName() . '][' . $item->getUid() . '][localize]=' . $lang['uid']); $onclick = 'window.location.href=\'' . $onclick . '\'; return false;'; $out .= sprintf('<a href="#" onclick="%1$s">%2$s</a>', htmlspecialchars($onclick), self::getLangSpriteIcon($lang, array('show_title' => FALSE))); } return $out; }
/** * Wrapper for actual deletion * * Delete records according to given ready-constructed "where" condition and deletion mode * * @param string $table * @param string $where Ready-to-use where condition containing uid restriction * @param int $mode @see self::handleDelete() */ protected function delete($table, $where, $mode) { global $GLOBALS; tx_rnbase::load('tx_rnbase_util_DB'); switch ($mode) { // Hide model case self::DELETION_MODE_HIDE: // Set hidden field according to $TCA if (!isset($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'])) { throw new Exception("tx_rnbase_sv1_Base->delete(): Cannot hide records in table {$table} - no \$TCA entry found!"); } //else $data = array($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled'] => 1); tx_rnbase_util_DB::doUpdate($table, $where, self::insertTimestamp($data, $table)); break; // Soft-delete model // Soft-delete model case self::DELETION_MODE_SOFTDELETE: // Set deleted field according to $TCA if (!isset($GLOBALS['TCA'][$table]['ctrl']['delete'])) { throw new Exception("tx_rnbase_sv1_Base->delete(): Cannot soft-delete records in table {$table} - no \$TCA entry found!"); } //else $data = array($GLOBALS['TCA'][$table]['ctrl']['delete'] => 1); tx_rnbase_util_DB::doUpdate($table, $where, self::insertTimestamp($data, $table)); break; // Really hard-delete model // Really hard-delete model case self::DELETION_MODE_REALLYDELETE: tx_rnbase_util_DB::doDelete($table, $where); break; default: throw new Exception("tx_rnbase_sv1_Base->delete(): Unknown deletion mode ({$mode})"); } }
/** * updates the lastrun time with the current time * * @return integer */ protected function setLastRunTime() { try { $lastRun = new DateTime(); $return = @tx_rnbase_util_DB::doUpdate('tx_scheduler_task', 'uid=' . (int) $this->getTaskUid(), array('tx_mklib_lastrun' => $lastRun->format('Y-m-d H:i:s'))); } catch (Exception $e) { $return = 0; } return $return; }
/** * Setzt einen Dam Record auf hidden * @todo nicht nur verstecken sondern auch löschen integrieren * @param array $aDamRecord sollte nur einen record in ['rows'] enthalten * @param int $iMode verstecken, auf deleted setzen oder ganz löschen * @param bool $bDeletePicture * * @return bool */ public static function deleteDamRecord($aDamRecords, $iMode = 0, $bDeletePicture = false) { if (empty($aDamRecords['rows'])) { return false; } foreach ($aDamRecords['rows'] as $iDam => $row) { //wenn wir nur keine referenzen mehr haben dann können wir das bild und //den eigentlichen eintrag löschen if (!tx_mklib_util_DAM::damRecordHasReferences($iDam)) { //dam eintrag und bild löschen tx_rnbase::load('tx_rnbase_util_DB'); switch ($iMode) { case 0: //verstecken //verstecken default: tx_rnbase_util_DB::doUpdate('tx_dam', 'tx_dam.uid = ' . $iDam, array('hidden' => 1)); break; case 1: //löschen tx_rnbase_util_DB::doUpdate('tx_dam', 'tx_dam.uid = ' . $iDam, array('deleted' => 1)); break; case 2: //hart löschen tx_rnbase_util_DB::doDelete('tx_dam', 'tx_dam.uid = ' . $iDam); break; } //und bild löschen? if ($bDeletePicture) { unlink(PATH_site . '/' . $aDamRecords['files'][$iDam]); } } } return true; }
/** * returns all language overlays. * * @param Tx_Rnbase_Domain_Model_Base $entry * @return array[Tx_Rnbase_Domain_Model_Base] */ private static function getLangOverlayEntries(Tx_Rnbase_Domain_Model_RecordInterface $entry) { tx_rnbase::load('tx_rnbase_util_TCA'); $parentField = tx_rnbase_util_TCA::getTransOrigPointerFieldForTable($entry->getTableName()); $overlays = tx_rnbase_util_DB::doSelect('*', $entry->getTableName(), array('where' => $parentField . '=' . $entry->getUid(), 'wrapperclass' => get_class($entry))); return $overlays; }
/** * Wurden die ZipRules geladen? */ private static function checkStaticCountries() { $cnt = tx_rnbase_util_DB::doSelect('COUNT(uid) as cnt', 'static_countries', array('enablefieldsoff' => 1, 'where' => 'zipcode_rule > 0')); $loaded = intval($cnt[0]['cnt']) > 0; if (!$loaded) { // zur Sicherheit die Zip Code Rules einfügen $sqlFilename = t3lib_div::getFileAbsFileName(t3lib_extMgm::extPath('mklib', 'ext_tables_static_update.sql')); if (@is_file($sqlFilename)) { tx_mklib_tests_Util::queryDB($sqlFilename, false, true); //alle statements importieren } } }
/** * @group unit */ public function testMethodClassAreRedirectedToDatabaseConnectionClass() { $this->getDatabaseConnectionClassReflectionProperty()->setValue(NULL, 'Tx_Rnbase_Database_ConnectionMock'); self::assertEquals(array('first', 'second'), tx_rnbase_util_DB::nonStaticTestMethod('first', 'second')); }
/** * Generische Schnittstelle für Datenbankabfragen. Anstatt vieler Parameter wird hier ein * Hash als Parameter verwendet, der mögliche Informationen aufnimmt. * Es sind die folgenden Parameter zulässig: * <pre> * - 'where' - the Where-Clause * - 'groupby' - the GroupBy-Clause * - 'orderby' - the OrderBy-Clause * - 'sqlonly' - returns the generated SQL statement. No database access. * - 'limit' - limits the number of result rows * - 'wrapperclass' - A wrapper for each result rows * - 'pidlist' - A list of page-IDs to search for records * - 'recursive' - the recursive level to search for records in pages * - 'enablefieldsoff' - deactivate enableFields check * - 'enablefieldsbe' - force enableFields check for BE (this usually ignores hidden records) * - 'enablefieldsfe' - force enableFields check for FE * - 'db' - external database: tx_rnbase_util_db_IDatabase * - 'ignorei18n' - do not translate record to fe language * - 'i18nolmode' - translation mode, possible value: 'hideNonTranslated' * </pre> * @param string $what requested columns * @param string $from either the name of on table or an array with index 0 the from clause * and index 1 the requested tablename and optional index 2 a table alias to use. * @param array $arr the options array * @param boolean $debug = 0 Set to 1 to debug sql-String */ public function doSelect($what, $from, $arr, $debug = 0) { $debug = $debug ? $debug : intval($arr['debug']) > 0; if ($debug) { $time = microtime(TRUE); $mem = memory_get_usage(); } $tableName = $from; $fromClause = $from; if (is_array($from)) { $tableName = $from[1]; $fromClause = $from[0]; $tableAlias = isset($from[2]) && strlen(trim($from[2])) > 0 ? trim($from[2]) : FALSE; } $where = is_string($arr['where']) ? $arr['where'] : '1=1'; $groupBy = is_string($arr['groupby']) ? $arr['groupby'] : ''; if ($groupBy) { $groupBy .= is_string($arr['having']) > 0 ? ' HAVING ' . $arr['having'] : ''; } $orderBy = is_string($arr['orderby']) ? $arr['orderby'] : ''; $offset = intval($arr['offset']) > 0 ? intval($arr['offset']) : 0; $limit = intval($arr['limit']) > 0 ? intval($arr['limit']) : ''; $pidList = is_string($arr['pidlist']) ? $arr['pidlist'] : ''; $recursive = intval($arr['recursive']) ? intval($arr['recursive']) : 0; $i18n = is_string($arr['i18n']) > 0 ? $arr['i18n'] : ''; $sqlOnly = intval($arr['sqlonly']) > 0 ? intval($arr['sqlonly']) : ''; $union = is_string($arr['union']) > 0 ? $arr['union'] : ''; // offset und limit kombinieren // bei gesetztem limit ist offset optional if ($limit) { $limit = $offset > 0 ? $offset . ',' . $limit : $limit; } elseif ($offset) { $limit = $limit > 0 ? $offset . ',' . $limit : $offset . ',1000'; } else { $limit = ''; } $where .= $this->handleEnableFieldsOptions($arr, $tableName, $tableAlias); // Das sollte wegfallen. Die OL werden weiter unten geladen if (strlen($i18n) > 0) { $i18n = implode(',', tx_rnbase_util_Strings::intExplode(',', $i18n)); $where .= ' AND ' . ($tableAlias ? $tableAlias : $tableName) . '.sys_language_uid IN (' . $i18n . ')'; } if (strlen($pidList) > 0) { $where .= ' AND ' . ($tableAlias ? $tableAlias : $tableName) . '.pid IN (' . tx_rnbase_util_DB::_getPidList($pidList, $recursive) . ')'; } if (strlen($union) > 0) { $where .= ' UNION ' . $union; } $database = $this->getDatabaseConnection($arr); if ($debug || $sqlOnly) { $sql = $database->SELECTquery($what, $fromClause, $where, $groupBy, $orderBy, $limit); if ($sqlOnly) { return $sql; } if ($debug) { tx_rnbase_util_Debug::debug($sql, 'SQL'); tx_rnbase_util_Debug::debug(array($what, $from, $arr)); } } $storeLastBuiltQuery = $database->store_lastBuiltQuery; $database->store_lastBuiltQuery = TRUE; $res = $this->watchOutDB($database->exec_SELECTquery($what, $fromClause, $where, $groupBy, $orderBy, $limit), $database); $database->store_lastBuiltQuery = $storeLastBuiltQuery; // use classic arrays or the array object // should be ever an object, but for backward compatibility is ts an array by default $rows = empty($arr['array_object']) ? array() : new ArrayObject(); if ($this->testResource($res)) { $wrapper = is_string($arr['wrapperclass']) ? trim($arr['wrapperclass']) : 0; $callback = isset($arr['callback']) ? $arr['callback'] : FALSE; while ($row = $database->sql_fetch_assoc($res)) { // Workspacesupport $this->lookupWorkspace($row, $tableName, $arr); $this->lookupLanguage($row, $tableName, $arr); if (!is_array($row)) { continue; } $item = $wrapper ? tx_rnbase::makeInstance($wrapper, $row) : $row; if ($item instanceof Tx_Rnbase_Domain_Model_DynamicTableInterface || $item instanceof tx_rnbase_model_base) { $item->setTablename($tableName); } if ($callback) { call_user_func($callback, $item); unset($item); } else { if (is_array($rows)) { $rows[] = $item; } else { $rows->append($item); } } } $database->sql_free_result($res); } if ($debug) { tx_rnbase_util_Debug::debug(array('Rows retrieved ' => count($rows), 'Time ' => microtime(TRUE) - $time, 'Memory consumed ' => memory_get_usage() - $mem), 'SQL statistics'); } return $rows; }
/** * @param int $taskId * * @return int number of rows affected */ protected function updateLastRunTime($taskId) { $lastRun = new DateTime(); return tx_rnbase_util_DB::doUpdate('tx_scheduler_task', 'uid=' . intval($taskId), array('tx_mklog_lastrun' => $lastRun->format('Y-m-d H:i:s'))); }
/** * Pagebrowser vorbereiten. Wir im Plugin nach dem init() des Filters aufgerufen: * * // Soll ein PageBrowser verwendet werden * tx_rnbase_filter_BaseFilter::handlePageBrowser($configurations, * $this->getConfId().'myitem.pagebrowser', $viewdata, $fields, $options, array( * 'searchcallback'=> array($service, 'search'), * 'pbid' => 'mt'.$configurations->getPluginId(), * ) * ); * * @param tx_rnbase_configurations $configurations * @param string $confid Die Confid des PageBrowsers. z.B. myview.org.pagebrowser ohne Punkt! * @param ArrayObject $viewdata * @param array $fields * @param array $options * @param array $cfg You have to set 'searchcallback' and optional 'pbid' */ public static function handlePageBrowser(&$configurations, $confid, &$viewdata, &$fields, &$options, $cfg = array()) { $confid .= '.'; if (is_array($configurations->get($confid))) { $searchCallback = $cfg['searchcallback']; if (!$searchCallback) { throw new Exception('No search callback defined!'); } // Die Gesamtzahl der Items ist entweder im Limit gesetzt oder muss ermittelt werden $listSize = intval($options['limit']); if (!$listSize) { // Mit Pagebrowser benötigen wir zwei Zugriffe, um die Gesamtanzahl der Items zu ermitteln $pageBrowserOptions = $options; $pageBrowserOptions['count'] = 1; // eigenes what? if ($configurations->get($confid . 'what')) { $pageBrowserOptions['what'] = $configurations->get($confid . 'what'); // wir brauchen keinen countwrap wenn sich das what selbst darum // kümmert if (strpos(strtoupper($pageBrowserOptions['what']), 'COUNT(') !== FALSE) { $pageBrowserOptions['disableCountWrap'] = TRUE; } } $listSize = call_user_func($searchCallback, $fields, $pageBrowserOptions); //$listSize = $service->search($fields, $options); unset($options['count']); } // PageBrowser initialisieren $pbId = $cfg['pbid'] ? $cfg['pbid'] : 'pb'; /** * @var tx_rnbase_util_PageBrowser $pageBrowser */ $pageBrowser = tx_rnbase::makeInstance('tx_rnbase_util_PageBrowser', $pbId); $pageSize = intval($configurations->get($confid . 'limit')); $pageBrowser->setState($configurations->getParameters(), $listSize, $pageSize); // Nach dem Item nur suchen wenn über die Parameter kein Pointer gesetzt wurde. if (is_array($cfg['pointerFromItem']) && !$configurations->getParameters()->offsetExists($pageBrowser->getParamName('pointer')) && ($itemId = $configurations->getParameters()->get($cfg['pointerFromItem']['param']))) { // Wir erzeugen uns das SQl der eigentlichen Abfrage. // Dabei wollen wir auch die rownum haben! $sql = call_user_func($searchCallback, $fields, array_merge($options, array('sqlonly' => 1, 'rownum' => 1))); // Jetzt besorgen wir uns die Position des aktuellen Eintrages $res = tx_rnbase_util_DB::doSelect('ROW.rownum', '(' . $sql . ') as ROW', array('where' => 'ROW.' . $cfg['pointerFromItem']['field'] . '=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($itemId, ''), 'enablefieldsoff' => TRUE)); // Jetzt haben wir ein Ergebnis, mit der Zeilennummer des Datensatzes. if (!empty($res)) { $rownum = intval($res[0]['rownum']); // Wir berechnen die Seite, auf der sich der aktuelle Eintrag befindet. // intval schneidet die Dezimalzahlen ab, erspart uns das runden. // -1, weil Bei 10 Einträgen pro Seite rownum 20 auf seite 2 ist, // 20/10 allerdings 2 (für seite 3) ergibt. $pageBrowser->setPointer(intval(($rownum - 1) / $pageSize)); } } $limit = $pageBrowser->getState(); $options = array_merge($options, $limit); if ($viewdata) { $viewdata->offsetSet('pagebrowser', $pageBrowser); } } }
/** * möglicherweise hängen geblibene tasks * @return array */ protected function getPossiblyFrozenTasks() { $selectFields = tx_rnbase_util_TYPO3::isTYPO62OrHigher() ? 'uid,serialized_task_object' : 'uid,classname'; return tx_rnbase_util_DB::doSelect($selectFields, 'tx_scheduler_task', array('enablefieldsoff' => true, 'where' => ' uid != ' . intval($this->taskUid) . ' AND LENGTH(serialized_executions) > 0 AND freezedetected = 0 AND lastexecution_time < ' . ($GLOBALS['EXEC_TIME'] - $this->getOption('threshold')))); }
/** * prüfen ob alles gelöscht wird, auch die bilder da sie keine * verwendung mehr haben * @group integration */ public function testHandleDeleteWhenNoReference() { $this->importDataSet(tx_mklib_tests_Util::getFixturePath('db/wordlist.xml')); //wir müssen nachträglich noch die richtige pid in die dam datensätze einfügen damit //diese auch gefunden werden über tx_mklib_util_DAM::getRecords require_once PATH_txdam . 'lib/class.tx_dam_db.php'; tx_rnbase_util_DB::doUpdate('tx_dam', '', array('pid' => tx_dam_db::getPidList())); $result = tx_mklib_util_DAM::handleDelete('tx_mklib_wordlist', 2, 'blacklisted', 1, true); //richtige Anzahl gelöscht? $this->assertEquals(0, $result['deletedReferences'], 'deletedReferences ist falsch!'); $this->assertEquals(0, $result['deletedRecords'], 'deletedRecords ist falsch!'); //bild nicht gelöscht? $this->assertFileExists($this->sAbsoluteImagePath, 'Das Bild der tempoäreren Anzeigen 4 und 20 wurde nicht gelöscht!'); //eintrag in dam auf hidden gesetzt? $res = tx_rnbase_util_DB::doSelect('*', 'tx_dam', array('enablefieldsoff' => true)); $this->assertEquals(1, count($res), 'Es wurde nicht die korrekte Anzahl von DAM Einträgen gefunden!'); $this->assertEquals(1, $res[0]['uid'], 'Es wurde scheinbar eine falscher DAM Eintrag gelöscht!!'); $this->assertEquals(0, $res[0]['hidden'], 'hidden falsch!'); $this->assertEquals(0, $res[0]['deleted'], 'deleted falsch!'); }
/** * Anzahl aller Meldungen für alle Log-Level laden * @param DateTime $lastRun */ protected function getSummary(DateTime $lastRun) { $what = 'severity, count(uid) As cnt'; $from = Tx_Mklog_Utility_Devlog::getTableName(); $options = array(); $options['groupby'] = 'severity'; $options['enablefieldsoff'] = '1'; $options['where'] = 'crdate>=' . $lastRun->format('U'); $result = tx_rnbase_util_DB::doSelect($what, $from, $options); return $result; }