function _savePageData($pagename, $data) { $type = 'page_data'; $version = 1; $filename = $this->_pagename2filename($type, $pagename, $version); // Construct a dummy page_revision object $page = new WikiDB_Page($this->_wikidb, $pagename); // data may be pagedate or versiondata updates if (USECACHE and empty($data['pagedata'])) { $cache =& $this->_wikidb->_cache; if (!empty($cache->_pagedata_cache[$pagename]) and is_array($cache->_pagedata_cache[$pagename])) { $cachedata =& $cache->_pagedata_cache[$pagename]; foreach ($data as $key => $val) { $cachedata[$key] = $val; } } else { $cache->_pagedata_cache[$pagename] = $data; } } //unset ($data['pagedata']); //if (empty($data['versiondata'])) // $data['versiondata'] = $data; // TODO: // with versiondata merge it with previous pagedata, not to overwrite with empty pagedata // with pagedata merge it with previous versiondata, not to overwrite with empty versiondata (content) $olddata = $this->_loadPageData($pagename); if (isset($data['version'])) { $version = $data['version']; $latestversion = $this->_getLatestVersion($pagename); if ($latestversion < $version) { $oldversiondata = $this->_loadVersionData($pagename, $latestversion); if ($oldversiondata) { $olddata['versiondata'] = array_merge($oldversiondata, $olddata['versiondata']); } } } $data['pagedata'] = array_merge($olddata['pagedata'], $data['pagedata']); $data['versiondata'] = array_merge($olddata['versiondata'], $data['versiondata']); if (empty($data['versiondata']['%content'])) { $data['versiondata']['%content'] = $olddata['content']; } $current = new WikiDB_PageRevision($this->_wikidb, $pagename, $version, $data['versiondata']); unset($data['versiondata']); foreach ($data as $k => $v) { if ($k == 'pagedata') { $current->_data = array_merge($current->_data, $v); } elseif ($k == 'versiondata') { $current->_data = array_merge($current->_data, $v); } else { $current->_data[$k] = $v; } } $this->_page_data = $current->_data; $pagedata = "Date: " . Rfc2822DateTime($current->get('mtime')) . "\r\n"; $pagedata .= sprintf("Mime-Version: 1.0 (Produced by PhpWiki %s)\r\n", PHPWIKI_VERSION); $pagedata .= MimeifyPageRevision($page, $current); if ($fd = fopen($filename, 'a+b')) { $locked = flock($fd, 2); // Exclusive blocking lock if (!$locked) { ExitWiki("Timeout while obtaining lock. Please try again"); } rewind($fd); ftruncate($fd, 0); $len = strlen($pagedata); $num = fwrite($fd, $pagedata, $len); assert($num == $len); fclose($fd); } else { ExitWiki("Error while writing page '{$pagename}'"); } }
/** * For reference see: * http://www.nacs.uci.edu/indiv/ehood/MIME/2045/rfc2045.html * http://www.faqs.org/rfcs/rfc2045.html * (RFC 1521 has been superceeded by RFC 2045 & others). * * Also see http://www.faqs.org/rfcs/rfc2822.html */ function MailifyPage($page, $nversions = 1) { $current = $page->getCurrentRevision(); $head = ''; if (STRICT_MAILABLE_PAGEDUMPS) { $from = defined('SERVER_ADMIN') ? SERVER_ADMIN : 'foo@bar'; //This is for unix mailbox format: (not RFC (2)822) // $head .= "From $from " . CTime(time()) . "\r\n"; $head .= "Subject: " . rawurlencode($page->getName()) . "\r\n"; $head .= "From: {$from} (PhpWiki)\r\n"; // RFC 2822 requires only a Date: and originator (From:) // field, however the obsolete standard RFC 822 also // requires a destination field. $head .= "To: {$from} (PhpWiki)\r\n"; } $head .= "Date: " . Rfc2822DateTime($current->get('mtime')) . "\r\n"; $head .= sprintf("Mime-Version: 1.0 (Produced by PhpWiki %s)\r\n", PHPWIKI_VERSION); // This should just be entered by hand (or by script?) // in the actual pgsrc files, since only they should have // RCS ids. //$head .= "X-Rcs-Id: \$Id\$\r\n"; $iter = $page->getAllRevisions(); $parts = array(); while ($revision = $iter->next()) { $parts[] = MimeifyPageRevision($page, $revision); if ($nversions > 0 && count($parts) >= $nversions) { break; } } if (count($parts) > 1) { return $head . MimeMultipart($parts); } assert($parts); return $head . $parts[0]; }