?? dbabase.php
字號:
<?php rcs_id('$Id: dbaBase.php,v 1.21 2005/04/01 16:05:48 rurban Exp $');require_once('lib/WikiDB/backend.php');// FIXME:padding of data? Is it needed? dba_optimize() seems to do a good// job at packing 'gdbm' (and 'db2') databases./* * Tables: * * page: * Index: pagename * Values: latestversion . ':' . flags . ':' serialized hash of page meta data * Currently flags = 1 if latest version has empty content. * * version * Index: version:pagename * Value: serialized hash of revision meta data, including: * + quasi-meta-data %content * * links * index: 'o' . pagename * value: serialized list of pages (names) which pagename links to. * index: 'i' . pagename * value: serialized list of pages which link to pagename * * TODO: * Don't keep tables locked the whole time * * index table with: * list of pagenames for get_all_pages * mostpopular list? * RecentChanges support: * lists of most recent edits (major, minor, either). * * * Separate hit table, so we don't have to update the whole page entry * each time we get a hit. (Maybe not so important though...). */ require_once('lib/DbaPartition.php');class WikiDB_backend_dbaBaseextends WikiDB_backend{ function WikiDB_backend_dbaBase (&$dba) { $this->_db = &$dba; // TODO: page and version tables should be in their own files, probably. // We'll pack them all in one for now (testing). // 2004-07-09 10:07:30 rurban: It's fast enough this way. $this->_pagedb = new DbaPartition($dba, 'p'); $this->_versiondb = new DbaPartition($dba, 'v'); $linkdbpart = new DbaPartition($dba, 'l'); $this->_linkdb = new WikiDB_backend_dbaBase_linktable($linkdbpart); $this->_dbdb = new DbaPartition($dba, 'd'); } function sortable_columns() { return array('pagename','mtime'/*,'author_id','author'*/); } function close() { $this->_db->close(); } function optimize() { $this->_db->optimize(); } function sync() { $this->_db->sync(); } function rebuild() { $this->_linkdb->rebuild(); $this->optimize(); } function check() { return $this->_linkdb->check(); } function get_pagedata($pagename) { $result = $this->_pagedb->get($pagename); if (!$result) return false; list(,,$packed) = explode(':', $result, 3); $data = unserialize($packed); return $data; } function update_pagedata($pagename, $newdata) { $result = $this->_pagedb->get($pagename); if ($result) { list($latestversion,$flags,$data) = explode(':', $result, 3); $data = unserialize($data); } else { $latestversion = $flags = 0; $data = array(); } foreach ($newdata as $key => $val) { if (empty($val)) unset($data[$key]); else $data[$key] = $val; } $this->_pagedb->set($pagename, (int)$latestversion . ':' . (int)$flags . ':' . serialize($data)); } function get_latest_version($pagename) { return (int) $this->_pagedb->get($pagename); } function get_previous_version($pagename, $version) { $versdb = &$this->_versiondb; while (--$version > 0) { if ($versdb->exists($version . ":$pagename")) return $version; } return false; } //check $want_content function get_versiondata($pagename, $version, $want_content=false) { $data = $this->_versiondb->get((int)$version . ":$pagename"); if (empty($data)) return false; else { $data = unserialize($data); if (!$want_content) $data['%content'] = !empty($data['%content']); return $data; } } /** * See ADODB for a better delete_page(), which can be undone and is seen in RecentChanges. * See backend.php */ //function delete_page($pagename) { $this->purge_page($pagename); } /** * Completely delete page from the database. */ function purge_page($pagename) { $pagedb = &$this->_pagedb; $versdb = &$this->_versiondb; $version = $this->get_latest_version($pagename); while ($version > 0) { $versdb->set($version-- . ":$pagename", false); } $pagedb->set($pagename, false); $this->set_links($pagename, false); } function rename_page($pagename, $to) { $result = $this->_pagedb->get($pagename); if ($result) { list($version,$flags,$data) = explode(':', $result, 3); $data = unserialize($data); } else return false; $this->_pagedb->delete($pagename); $data['pagename'] = $to; $this->_pagedb->set($to, (int)$version . ':' . (int)$flags . ':' . serialize($data)); // move over the latest version only $pvdata = $this->get_versiondata($pagename, $version, true); $this->set_versiondata($to, $version, $pvdata); return true; } /** * Delete an old revision of a page. */ function delete_versiondata($pagename, $version) { $versdb = &$this->_versiondb; $latest = $this->get_latest_version($pagename); assert($version > 0); assert($version <= $latest); $versdb->set((int)$version . ":$pagename", false); if ($version == $latest) { $previous = $this->get_previous_version($version); if ($previous> 0) { $pvdata = $this->get_versiondata($pagename, $previous); $is_empty = empty($pvdata['%content']); } else $is_empty = true; $this->_update_latest_version($pagename, $previous, $is_empty); } } /** * Create a new revision of a page. */ function set_versiondata($pagename, $version, $data) { $versdb = &$this->_versiondb; $versdb->set((int)$version . ":$pagename", serialize($data)); if ($version > $this->get_latest_version($pagename)) $this->_update_latest_version($pagename, $version, empty($data['%content'])); } function _update_latest_version($pagename, $latest, $flags) { $pagedb = &$this->_pagedb; $pdata = $pagedb->get($pagename); if ($pdata) list(,,$pagedata) = explode(':',$pdata,3); else $pagedata = serialize(array()); $pagedb->set($pagename, (int)$latest . ':' . (int)$flags . ":$pagedata"); } function numPages($include_empty=false, $exclude=false) { $pagedb = &$this->_pagedb; $count = 0; for ($page = $pagedb->firstkey(); $page!== false; $page = $pagedb->nextkey()) { if (!$page) { assert(!empty($page)); continue; } if ($exclude and in_array($page, $exclude)) continue; if (!$include_empty) { if (!($data = $pagedb->get($page))) continue; list($latestversion,$flags,) = explode(':', $data, 3); unset($data); if ($latestversion == 0 || $flags != 0) continue; // current content is empty } $count++; } return $count; } function get_all_pages($include_empty=false, $sortby=false, $limit=false, $exclude=false) { $pagedb = &$this->_pagedb; $pages = array(); for ($page = $pagedb->firstkey(); $page!== false; $page = $pagedb->nextkey()) { if (!$page) { assert(!empty($page)); continue; } if ($exclude and in_array($page, $exclude)) continue; if ($limit and count($pages) > $limit) break; if (!$include_empty) { if (!($data = $pagedb->get($page))) continue; list($latestversion,$flags,) = explode(':', $data, 3); unset($data); if ($latestversion == 0 || $flags != 0) continue; // current content is empty }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -