⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbabase.php

📁 PhpWiki是sourceforge的一个开源项目
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?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 + -