function addAPage($ncat, $unixName, $source, $title) { $now = new ODate(); $nsource = new DB_PageSource(); $nsource->setText($source); $nsource->save(); $nmeta = new DB_PageMetadata(); $nmeta->setTitle($title); $nmeta->setUnixName($unixName); $nmeta->setOwnerUserId(1); $nmeta->save(); $nrev = new DB_PageRevision(); $nrev->setSiteId(1); $nrev->setSourceId($nsource->getSourceId()); $nrev->setMetadataId($nmeta->getMetadataId()); $nrev->setFlagNew(true); $nrev->setDateLastEdited($now); $nrev->setUserId(1); $nrev->obtainPK(); $npage = new DB_Page(); $npage->setSiteId(1); $npage->setCategoryId($ncat->getCategoryId()); $npage->setRevisionId($nrev->getRevisionId()); $npage->setSourceId($nsource->getSourceId()); $npage->setMetadataId($nmeta->getMetadataId()); $npage->setTitle($title); $npage->setUnixName($unixName); $npage->setDateLastEdited($now); $npage->setDateCreated($now); $npage->setLastEditUserId(1); $npage->setOwnerUserId(1); $npage->save(); $nrev->setPageId($npage->getPageId()); $nrev->save(); $ncomp = new DB_PageCompiled(); $ncomp->setPageId($npage->getPageId()); $ncomp->setDateCompiled($now); $ncomp->save(); }
public function save($args) { $db = Database::connection(); $db->begin(); // simple argument checking if (!isset($args['page'])) { throw new Wikidot_Facade_Exception_WrongArguments("Page argument must be passed"); } $pm = new WDPermissionManager(); $now = new ODate(); // page (existant or not) name $arg_page = WDStringUtils::toUnixName($args['page']); // parse the rest (beside page name) unset($args['page']); $this->parseArgs($args, array("performer", "site")); try { // parse page name to figure out if it points to an existant page $page = $this->_parsePage($this->site, $arg_page); $new = false; // check permissions to edit the page $pm->hasPagePermission('edit', $this->performer, $page->getCategory(), $page); } catch (Wikidot_Facade_Exception_WrongArguments $e) { if ($this->source === null) { $this->source = ""; } if ($this->title === null) { $this->title = $arg_page; } $new = true; $category_name = preg_replace('/^([^:]*):.*$/', '\\1', $arg_page); if ($category_name == $arg_page) { $category_name = '_default'; } $category = $this->_getOrCreateCategory($this->site, $category_name); $page = new DB_Page(); $page->setSiteId($this->site->getSiteId()); $page->setCategoryId($category->getCategoryId()); $page->setUnixName($arg_page); $page->setDateCreated(new ODate()); $page->setOwnerUserId($this->performer->getUserId()); $page->save(); $compiled = new DB_PageCompiled(); $compiled->setPageId($page->getPageId()); $compiled->save(); } // get current revision and metadata if (!$new) { $cur_rev = $page->getCurrentRevision(); $cur_meta = $cur_rev->getMetadata(); } // construct new metadata if ($new) { $new_meta = new DB_PageMetadata(); $new_meta->setUnixName($arg_page); $new_meta->setOwnerUserId($this->performer->getUserId()); } else { $new_meta = clone $cur_meta; $new_meta->setNew(true); $new_meta->setMetadataId(null); } // construct new revision $new_rev = new DB_PageRevision(); $new_rev->setSiteId($this->site->getSiteId()); $new_rev->setPageId($page->getPageId()); $new_rev->setUserId($this->performer->getUserId()); $new_rev->setDateLastEdited($now); if ($new) { $new_rev->setRevisionNumber(0); } else { $new_rev->setRevisionNumber($cur_rev->getRevisionNumber() + 1); } $src_changed = false; $title_changed = false; $parent_changed = false; $tags_changed = false; // handle source change if ($new || $this->source !== null && $page->getSource() != $this->source) { $new_src = new DB_PageSource(); $new_src->setText($this->source); $new_src->save(); $new_rev->setSourceId($new_src->getSourceId()); $src_changed = true; } else { $new_rev->setSourceId($cur_rev->getSourceId()); $new_rev->setSinceFullSource($cur_rev->getSinceFullSource()); $new_rev->setDiffSource($cur_rev->getDiffSource()); } // handle tags change if ($this->tags) { $new_tags = $this->tags; $cur_tags = $page->getTagsAsArray(); sort($cur_tags); sort($new_tags); if ($cur_tags != $new_tags) { $tags_changed = true; $tags_deleted = array(); $tags_added = array(); foreach ($cur_tags as $tag) { if (!in_array($tag, $new_tags)) { $c = new Criteria(); $c->add('page_id', $page->getPageId()); $c->add('tag', $tag); if ($t = DB_PageTagPeer::instance()->selectOne($c)) { $t->delete(); $tags_deleted[] = $tag; } } } foreach ($new_tags as $tag) { if (!in_array($tag, $cur_tags)) { $t = new DB_PageTag(); $t->getPageId($page->getPageId()); $t->setSiteId($this->site->getSiteId()); $t->setTag($tag); $t->save(); $tags_added[] = $tag; } } } } // handle metadata: title change if ($new || $this->title !== null && $cur_meta->getTitle() != $this->title) { $new_meta->setTitle($this->title); $page->setTitle($this->title); $title_changed = true; } // handle metadata: parent page change if ($this->parent_page) { if (!$cur_meta->getParentPageId() || $cur_meta->getParentPageId() != $this->parent_page->getPageId()) { $new_meta->setParentPageId($this->parent_page->getPageId()); $parent_changed = true; } } if ($this->clear_parent_page && $page->getParentPageId()) { $new_meta->setParentPageId(null); $parent_changed = true; } $meta_changed = $title_changed || $parent_changed; // decide whether to use previous metadata or create a new object if ($meta_changed) { $new_meta->save(); $new_rev->setMetadataId($new_meta->getMetadataId()); } else { $new_rev->setMetadataId($cur_meta->getMetadataId()); } // set flag on revision if ($new) { $new_rev->setFlagNew(true); } else { if ($src_changed) { $new_rev->setFlagText(true); } if ($title_changed) { $new_rev->setFlagTitle(true); } if ($parent_changed) { $new_rev->setFlagMeta(true); } } if ($src_changed || $meta_changed || $tags_changed) { $new_rev->save(); $page->setSourceId($new_rev->getSourceId()); $page->setDateLastEdited($now); $page->setMetadataId($new_rev->getMetadataId()); $page->setRevisionNumber($new_rev->getRevisionNumber()); $page->setRevisionId($new_rev->getRevisionId()); $page->save(); $db->commit(); $GLOBALS['site'] = $this->site; $outdater = new Outdater(); if ($src_changed) { $outdater->pageEvent("source_changed", $page); } if ($title_changed) { $outdater->pageEvent("title_changed", $page); } if ($parent_changed) { $outdater->pageEvent("parent_changed", $page); } if ($tags_changed) { $outdater->pageEvent("tag_changed", $page); } } else { /* This place is reached when API client tries to set source or * title or parent page or tags that are already set (in the DB) * to the same value. * * Let's suppose doing nothing is the desired behavior in this case * * Other possible way to react can be raising an exception. * But it should be different from Wikidot_Facade_Exception_WrongArguments * because this one implies client error (and client does not need * to know the exact database state). */ } }
public function revertEvent($runData) { $pl = $runData->getParameterList(); $pageId = $pl->getParameterValue("pageId"); $revisionId = $pl->getParameterValue("revisionId"); $site = $runData->getTemp("site"); $db = Database::connection(); $db->begin(); $c = new Criteria(); $c->add("page_id", $pageId); $c->setForUpdate(true); $page = DB_PagePeer::instance()->selectOne($c); if ($page == null || $page->getSiteId() != $site->getSiteId()) { throw new ProcessException(_("Error getting page information."), "no_page"); } // check for permissions again $category = $page->getCategory(); $user = $runData->getUser(); WDPermissionManager::instance()->hasPagePermission('edit', $user, $category, $page); // get the revision $toRevision = DB_PageRevisionPeer::instance()->selectByPrimaryKey($revisionId); $toMeta = DB_PageMetadataPeer::instance()->selectByPrimaryKey($toRevision->getMetadataId()); $currentRevision = $page->getCurrentRevision(); $currentMeta = $currentRevision->getMetadata(); // compare title and source (ids and contents) if ($toMeta->getTitle() === $currentMeta->getTitle() && $toRevision->getSourceId() === $currentRevision->getSourceId()) { throw new ProcessException(_("The title and content source of the current revision and the destination revision are identical. No change has been applied."), "no_change"); } // check for locks first DB_PageEditLockPeer::instance()->deleteOutdated($pageId); $c = new Criteria(); $c->add("page_id", $page->getPageId()); if ($pl->getParameterValue("force") === "yes") { DB_PageEditLockPeer::instance()->delete($c); } $locks = DB_PageEditLockPeer::instance()->select($c); if (count($locks) > 0) { $runData->ajaxResponseAdd("locks", true); $runData->contextAdd("locks", $locks); $runData->setModuleTemplate("history/RevertPageLockedWin"); $db->rollback(); return; } // success so far... $titleChanged = false; if ($toMeta->getTitle() !== $currentMeta->getTitle()) { // change the title, need to create a new metadata... $metadata = clone $currentMeta; $metadata->setMetadataId(null); $metadata->setNew(true); $metadata->setTitle($toMeta->getTitle()); $metadata->save(); $titleChanged = true; } $userId = $runData->getUserId(); if ($userId == null) { $userString = $runData->createIpString(); } if ($toRevision->getSourceId() !== $currentRevision->getSourceId()) { $sourceChanged = true; $nSource = $toRevision->getSourceText(); $oSource = $currentRevision->getSourceText(); if ($nSource === $oSource) { $sourceChanged = false; } } if (!$sourceChanged && !$titleChanged) { throw new ProcessException(_("The title and content source of the current revision and the destination revision are identical. No change has been applied."), "no_change"); } $revision = clone $currentRevision; $revision->setNew(true); $revision->setRevisionId(null); $revision->resetFlags(); if ($sourceChanged) { $revision->setFlagText(true); } if ($titleChanged) { $revision->setFlagTitle(true); $revision->setMetadataId($metadata->getMetadataId()); $page->setTitle($toMeta->getTitle()); } $revision->setComments(_("Reverted to page revision number") . " " . $toRevision->getRevisionNumber()); if ($userId) { $revision->setUserId($userId); $page->setLastEditUserId($userId); } else { $revision->setUserId(0); $page->setLastEditUserId(0); $revision->setUserString($userString); $page->setLastEditUserString($userString); } if ($sourceChanged) { $fullSource = false; // first check if store new source as a diff or as a full-source. if (true || $currentRevision->getSinceFullSource() > 9) { $fullSource = true; } else { // also compare size of diff against size of new source. // must be less than %50 to qualify $differ = new ODiff(); $diff = $differ->diffString($oSource, $nSource); if (strlen($diff) > 0.5 * strlen($nSource)) { $fullSource = true; } } $pageSource = new DB_PageSource(); if ($fullSource) { $pageSource->setText($nSource); $revision->setSinceFullSource(0); $revision->setDiffSource(false); } else { $pageSource->setText($diff); $revision->setDiffSource(true); $revision->setSinceFullSource($currentRevision->getSinceFullSource() + 1); } $pageSource->save(); $revision->setSourceId($pageSource->getSourceId()); } else { // copy source id i.e. do nothing } $revision->setRevisionNumber($revision->getRevisionNumber() + 1); $now = new ODate(); $revision->setDateLastEdited($now); $revision->save(); $page->setRevisionId($revision->getRevisionId()); $page->setDateLastEdited($now); $page->setRevisionNumber($revision->getRevisionNumber()); $page->save(); // outdate party! $outdater = new Outdater(); if ($sourceChanged) { $outdater->pageEvent("source_changed", $page); } if ($titleChanged) { $outdater->pageEvent("title_changed", $page); } // index page EventLogger::instance()->logSavePage($page); $db->commit(); if (GlobalProperties::$UI_SLEEP) { sleep(1); } }
public function fixLinks() { // get the current source. for sure check the lock. // also note that $page should be selected with "FOR UPDATE" clause $oldSourceText = $this->page->getSource(); $sourceChanged = false; $source = $oldSourceText; $source = preg_replace_callback('/(\\[\\[\\[)([^\\]\\|]+?)((\\s*\\|[^\\]]*?)?\\]\\]\\])/i', array(&$this, 'fixLink'), $source); $source = preg_replace_callback('/^\\[\\[include ([a-zA-Z0-9\\s\\-]+?)(?:\\]\\])$/im', array(&$this, 'fixInclusion'), $source); if ($source != $oldSourceText) { $page = $this->page; $currentRevision = $page->getCurrentRevision(); //save it! wooohaaa! should we not clean the page source saving a bit? $revision = clone $currentRevision; $revision->setNew(true); $revision->setRevisionId(null); $revision->resetFlags(); $revision->setFlagText(true); $revision->setPageId($page->getPageId()); $revision->setRevisionNumber($currentRevision->getRevisionNumber() + 1); $now = new ODate(); $revision->setDateLastEdited($now); $fullSource = false; // first check if store new source as a diff or as a full-source. if ($currentRevision->getSinceFullSource() > 9) { $fullSource = true; } else { // also compare size of diff against size of new source. // must be less than %50 to qualify $differ = new ODiff(); $diff = $differ->diffString($oldSourceText, $source); if (strlen($diff) > 0.5 * strlen($source)) { $fullSource = true; } } $pageSource = new DB_PageSource(); if ($fullSource) { $pageSource->setText($source); $revision->setDiffSource(false); $revision->setSinceFullSource(0); } else { $pageSource->setText($diff); $revision->setDiffSource(true); $revision->setSinceFullSource($currentRevision->getSinceFullSource() + 1); } $pageSource->save(); $revision->setSourceId($pageSource->getSourceId()); $revision->setComments(sprintf(_('Automatic update related to page rename: "%s" to "%s".'), $this->oldPageName, $this->newPageName)); $userId = $this->user->getUserId(); if ($userId) { $revision->setUserId($userId); $page->setLastEditUserId($userId); } $revision->save(); $page->setRevisionId($revision->getRevisionId()); $page->setDateLastEdited($now); $page->setRevisionNumber($revision->getRevisionNumber()); $page->save(); // force page compilation } }
public function restoreSite($nsite, $dump) { $superSettings = $dump['superSettings']; $settings = $dump['settings']; $superSettings->setNew(true); $superSettings->setSiteId($nsite->getSiteId()); $superSettings->save(); // site_settings $settings->setNew(true); $settings->setSiteId($nsite->getSiteId()); $settings->save(); $forumSettings = $dump['forumSettings']; $forumSettings->setNew(true); $forumSettings->setSiteId($nsite->getSiteId()); $forumSettings->save(); // add user as admin $owner = $this->owner; if ($owner) { $admin = new DB_Admin(); $admin->setSiteId($nsite->getSiteId()); $admin->setUserId($owner->getUserId()); $admin->setFounder(true); // will be nonremovable ;-) $admin->save(); $member = new DB_Member(); $member->setSiteId($nsite->getSiteId()); $member->setUserId($owner->getUserId()); $member->setDateJoined(new ODate()); $member->save(); } $categories = $dump['categories']; foreach ($categories as $category) { $cat = clone $category; $cat->setNew(true); $cat->setCategoryId(null); $cat->setSiteId($nsite->getSiteId()); $cat->save(); // get pages $pages = $dump['pages'][$category->getCategoryId()]; foreach ($pages as $page) { $newUnixName = $page->getUnixName(); $now = new ODate(); // create new page object based on the existing page $nsource = new DB_PageSource(); $nsource->setText($page->getTemp("source")); $nsource->save(); $meta = $page->getTemp("meta"); $nmeta = new DB_PageMetadata(); $nmeta->setTitle($meta->getTitle()); $nmeta->setUnixName($newUnixName); if ($owner) { $nmeta->setOwnerUserId($owner->getUserId()); } else { $nmeta->setOwnerUserId($meta->getOwnerUserId()); } $nmeta->save(); $nrev = new DB_PageRevision(); $nrev->setSiteId($nsite->getSiteId()); $nrev->setSourceId($nsource->getSourceId()); $nrev->setMetadataId($nmeta->getMetadataId()); $nrev->setFlagNew(true); $nrev->setDateLastEdited($now); $nrev->setUserId($owner->getUserId()); $nrev->obtainPK(); $npage = new DB_Page(); $npage->setSiteId($nsite->getSiteId()); $npage->setCategoryId($cat->getCategoryId()); $npage->setRevisionId($nrev->getRevisionId()); $npage->setSourceId($nsource->getSourceId()); $npage->setMetadataId($nmeta->getMetadataId()); $npage->setTitle($page->getTitle()); $npage->setUnixName($newUnixName); $npage->setDateLastEdited($now); $npage->setLastEditUserId($owner->getUserId()); $npage->setOwnerUserId($owner->getUserId()); $npage->save(); $nrev->setPageId($npage->getPageId()); $nrev->save(); $ncomp = new DB_PageCompiled(); $ncomp->setPageId($npage->getPageId()); $ncomp->setDateCompiled($now); $ncomp->save(); } } $od = new Outdater(); $od->recompileWholeSite($nsite); }