/**
  * 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'));
 }
Пример #11
0
 /**
  * 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;
 }