public function requireLock($args) { $lockName = $args['lockName']; $sessionId = array_key_exists('sessionId', $args) ? $args['sessionId'] : session_id(); $lockedByTitle = $args['lockedByTitle']; $lockedByIPNo = $args['lockedByIPNo']; $this->_pageLockRequireAccess(); $locks = ModUtil::apiFunc('pagelock', 'user', 'getLocks', $args); if (count($locks) > 0) { $lockedBy = ''; foreach ($locks as $lock) { if (strlen($lockedBy) > 0) { $lockedBy .= ', '; } $lockedBy .= $lock['lockedByTitle'] . " ({$lock['lockedByIPNo']}) " . $lock['createdDate']; } return array('hasLock' => false, 'lockedBy' => $lockedBy); } $args['lockedBy'] = null; $dbtable = DBUtil::getTables(); $pageLockTable =& $dbtable['pagelock']; $pageLockColumn =& $dbtable['pagelock_column']; // Look for existing lock $sql = "\nSELECT COUNT(*)\nFROM {$pageLockTable}\nWHERE {$pageLockColumn['name']} = '" . DataUtil::formatForStore($lockName) . "' AND {$pageLockColumn['lockedBySessionId']} = '" . DataUtil::formatForStore($sessionId) . "'"; $count = DBUtil::selectScalar($sql); $now = time(); $expireDate = $now + PageLockLifetime; if ($count > 0) { // Update existing lock $sql = "\nUPDATE {$pageLockTable}\nSET {$pageLockColumn['expiresDate']} = '" . DateUtil::getDatetime($expireDate) . "'\nWHERE {$pageLockColumn['name']} = '" . DataUtil::formatForStore($lockName) . "' AND {$pageLockColumn['lockedBySessionId']} = '" . DataUtil::formatForStore($sessionId) . "'"; DBUtil::executeSql($sql); } else { $data = array('name' => $lockName, 'createdDate' => DateUtil::getDatetime($now), 'expiresDate' => DateUtil::getDatetime($expireDate), 'lockedBySessionId' => $sessionId, 'lockedByTitle' => $lockedByTitle, 'lockedByIPNo' => $lockedByIPNo); DBUtil::insertObject($data, 'pagelock'); } $this->_pageLockReleaseAccess(); return array('hasLock' => true); }
protected function contentGetNextRevisionNumber($pageId) { $pageId = (int) $pageId; $tables = DBUtil::getTables(); $historyTable = $tables['content_history']; $historyColumn = $tables['content_history_column']; $sql = "\n SELECT MAX({$historyColumn['revisionNo']})\n FROM {$historyTable}\n WHERE {$historyColumn['pageId']} = {$pageId}"; // FIXME: how to avoid concurrency problems? $pos = DBUtil::selectScalar($sql); return $pos === null ? 1 : (int) $pos + 1; }
protected function contentGetLastContentPosition($pageId, $contentAreaIndex) { $pageId = (int) $pageId; $contentAreaIndex = (int) $contentAreaIndex; $table = DBUtil::getTables(); $contentTable = $table['content_content']; $contentColumn = $table['content_content_column']; $sql = "\n SELECT MAX({$contentColumn['position']})\n FROM {$contentTable}\n WHERE {$contentColumn['pageId']} = {$pageId}"; $pos = DBUtil::selectScalar($sql); return $pos === null ? -1 : (int) $pos; }
public function insertPage($args) { $pageId = (int) $args['pageId']; $position = (int) $args['position']; $parentPageId = (int) $args['parentPageId']; $dbtables = DBUtil::getTables(); $pageTable = $dbtables['content_page']; $pageColumn = $dbtables['content_page_column']; $sql = " UPDATE $pageTable SET $pageColumn[position] = $pageColumn[position]+1 WHERE $pageColumn[parentPageId] = $parentPageId AND $pageColumn[position] >= $position"; DBUtil::executeSQL($sql); // *** Update all left/right values for all pages "right of this page" // Assume "this page" has left/right values that matches it's subtree (but with a wrong offset) $pageData = DBUtil::selectObjectByID('content_page', $pageId); if ($parentPageId > 0) { $parentPageData = DBUtil::selectObjectByID('content_page', $parentPageId); $parentLevel = $parentPageData['level']; } else { $parentPageData = null; $parentLevel = -1; } // Fetch largest left/right value left of this page's new position $sql = " SELECT MAX($pageColumn[setRight]) FROM $pageTable WHERE $pageColumn[parentPageId] = $parentPageId AND $pageColumn[position] < $position AND $pageColumn[id] != $pageId"; $maxLeftOfthis = DBUtil::selectScalar($sql); if (empty($maxLeftOfthis)) { $maxLeftOfthis = -1; } if ($parentPageData != null && $parentPageData['setLeft'] > $maxLeftOfthis) { $maxLeftOfthis = $parentPageData['setLeft']; } $diff = $pageData['setRight'] - $pageData['setLeft'] + 1; $sql = " UPDATE $pageTable SET $pageColumn[setRight] = $pageColumn[setRight]+$diff WHERE $pageColumn[setRight] > $maxLeftOfthis AND $pageColumn[id] != $pageId"; DBUtil::executeSQL($sql); $sql = " UPDATE $pageTable SET $pageColumn[setLeft] = $pageColumn[setLeft]+$diff WHERE $pageColumn[setLeft] > $maxLeftOfthis AND $pageColumn[id] != $pageId"; DBUtil::executeSQL($sql); // *** Update level/left/right values for this page and all pages below $levelDiff = $pageData['level'] - ($parentLevel + 1); $diff2 = $pageData['setLeft'] - $maxLeftOfthis - 1; //echo "diff2=$diff2. "; $sql = " UPDATE $pageTable SET $pageColumn[setLeft] = $pageColumn[setLeft]-$diff2, $pageColumn[setRight] = $pageColumn[setRight]-$diff2, $pageColumn[level] = $pageColumn[level]-$levelDiff WHERE $pageData[setLeft] <= $pageColumn[setLeft] AND $pageColumn[setRight] <= $pageData[setRight]"; DBUtil::executeSQL($sql); // Update this page $newPageData = array('id' => $pageId, 'position' => $position, 'parentPageId' => $parentPageId, 'level' => ($parentPageData == null ? 0 : $parentPageData['level'] + 1)); DBUtil::updateObject($newPageData, 'content_page'); return true; }
protected function contentGetLastContentPosition($pageId, $contentAreaIndex) { $pageId = (int) $pageId; $contentAreaIndex = (int) $contentAreaIndex; $table = DBUtil::getTables(); $contentTable = $table['content_content']; $contentColumn = $table['content_content_column']; $sql = " SELECT MAX($contentColumn[position]) FROM $contentTable WHERE $contentColumn[pageId] = $pageId"; $pos = DBUtil::selectScalar($sql); return $pos === null ? -1 : (int) $pos; }
public function insertPage($args) { $pageId = (int) $args['pageId']; $position = (int) $args['position']; $parentPageId = (int) $args['parentPageId']; $dbtables = DBUtil::getTables(); $pageTable = $dbtables['content_page']; $pageColumn = $dbtables['content_page_column']; $sql = "\n UPDATE {$pageTable}\n SET {$pageColumn['position']} = {$pageColumn['position']}+1\n WHERE {$pageColumn['parentPageId']} = {$parentPageId}\n AND {$pageColumn['position']} >= {$position}"; DBUtil::executeSQL($sql); // *** Update all left/right values for all pages "right of this page" // Assume "this page" has left/right values that matches it's subtree (but with a wrong offset) $pageData = DBUtil::selectObjectByID('content_page', $pageId); if ($parentPageId > 0) { $parentPageData = DBUtil::selectObjectByID('content_page', $parentPageId); $parentLevel = $parentPageData['level']; } else { $parentPageData = null; $parentLevel = -1; } // Fetch largest left/right value left of this page's new position $sql = "\n SELECT MAX({$pageColumn['setRight']})\n FROM {$pageTable}\n WHERE {$pageColumn['parentPageId']} = {$parentPageId}\n AND {$pageColumn['position']} < {$position}\n AND {$pageColumn['id']} != {$pageId}"; $maxLeftOfthis = DBUtil::selectScalar($sql); if (empty($maxLeftOfthis)) { $maxLeftOfthis = -1; } if ($parentPageData != null && $parentPageData['setLeft'] > $maxLeftOfthis) { $maxLeftOfthis = $parentPageData['setLeft']; } $diff = $pageData['setRight'] - $pageData['setLeft'] + 1; $sql = "\n UPDATE {$pageTable} SET\n {$pageColumn['setRight']} = {$pageColumn['setRight']}+{$diff}\n WHERE {$pageColumn['setRight']} > {$maxLeftOfthis} AND {$pageColumn['id']} != {$pageId}"; DBUtil::executeSQL($sql); $sql = "\n UPDATE {$pageTable} SET\n {$pageColumn['setLeft']} = {$pageColumn['setLeft']}+{$diff}\n WHERE {$pageColumn['setLeft']} > {$maxLeftOfthis} AND {$pageColumn['id']} != {$pageId}"; DBUtil::executeSQL($sql); // *** Update level/left/right values for this page and all pages below $levelDiff = $pageData['level'] - ($parentLevel + 1); $diff2 = $pageData['setLeft'] - $maxLeftOfthis - 1; //echo "diff2=$diff2. "; $sql = "\n UPDATE {$pageTable} SET\n {$pageColumn['setLeft']} = {$pageColumn['setLeft']}-{$diff2},\n {$pageColumn['setRight']} = {$pageColumn['setRight']}-{$diff2},\n {$pageColumn['level']} = {$pageColumn['level']}-{$levelDiff}\n WHERE {$pageData['setLeft']} <= {$pageColumn['setLeft']} AND {$pageColumn['setRight']} <= {$pageData['setRight']}"; DBUtil::executeSQL($sql); // Update this page $newPageData = array('id' => $pageId, 'position' => $position, 'parentPageId' => $parentPageId, 'level' => $parentPageData == null ? 0 : $parentPageData['level'] + 1); DBUtil::updateObject($newPageData, 'content_page'); return true; }