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

📄 dbabase.php

📁 PhpWiki是sourceforge的一个开源项目
💻 PHP
📖 第 1 页 / 共 2 页
字号:
            $pages[] = $page;        }        return new WikiDB_backend_dbaBase_pageiter($this, $pages,                                                    array('sortby'=>$sortby,                                                         'limit' =>$limit));    }    function set_links($pagename, $links) {        $this->_linkdb->set_links($pagename, $links);    }    function get_links($pagename, $reversed=true, $include_empty=false,                       $sortby=false, $limit=false, $exclude=false) {        $links = $this->_linkdb->get_links($pagename, $reversed);        return new WikiDB_backend_dbaBase_pageiter($this, $links,                                                    array('sortby'=>$sortby,                                                         'limit' =>$limit,                                                         'exclude'=>$exclude,                                                         ));    }};function WikiDB_backend_dbaBase_sortby_pagename_ASC ($a, $b) {    return strcasecmp($a, $b);}function WikiDB_backend_dbaBase_sortby_pagename_DESC ($a, $b) {    return strcasecmp($b, $a);}function WikiDB_backend_dbaBase_sortby_mtime_ASC ($a, $b) {    return WikiDB_backend_dbaBase_sortby_num($a, $b, 'mtime');}function WikiDB_backend_dbaBase_sortby_mtime_DESC ($a, $b) {    return WikiDB_backend_dbaBase_sortby_num($b, $a, 'mtime');}/*function WikiDB_backend_dbaBase_sortby_hits_ASC ($a, $b) {    return WikiDB_backend_dbaBase_sortby_num($a, $b, 'hits');}function WikiDB_backend_dbaBase_sortby_hits_DESC ($a, $b) {    return WikiDB_backend_dbaBase_sortby_num($b, $a, 'hits');}*/function WikiDB_backend_dbaBase_sortby_num($aname, $bname, $field) {    global $request;    $dbi = $request->getDbh();    // fields are stored in versiondata    $av = $dbi->_backend->get_latest_version($aname);    $bv = $dbi->_backend->get_latest_version($bname);    $a = $dbi->_backend->get_versiondata($aname, $av, false);    if (!$a) return 0;    $b = $dbi->_backend->get_versiondata($bname, $bv, false);    if (!$b) return 0;    if ((!isset($a[$field]) && !isset($b[$field])) || ($a[$field] === $b[$field])) {        return 0;     } else {        return (!isset($a[$field]) || ($a[$field] < $b[$field])) ? -1 : 1;    }}class WikiDB_backend_dbaBase_pageiterextends WikiDB_backend_iterator{    function WikiDB_backend_dbaBase_pageiter(&$backend, &$pages, $options=false) {        $this->_backend = $backend;        $this->_options = $options;        if ($pages) {             if (!empty($options['sortby'])) {                $sortby = WikiDB_backend::sortby($options['sortby'], 'db', array('pagename','mtime'));                if ($sortby and !strstr($sortby, "hits ")) { // check for which column to sortby                    usort($pages, 'WikiDB_backend_dbaBase_sortby_'.str_replace(' ','_',$sortby));                }            }            if (!empty($options['limit'])) {                list($offset,$limit) = WikiDB_backend::limit($options['limit']);                $pages = array_slice($pages, $offset, $limit);            }            $this->_pages = $pages;        } else             $this->_pages = array();    }    function next() {        if ( ! ($next = array_shift($this->_pages)) )            return false;        if (!empty($options['exclude']) and in_array($next, $options['exclude']))            return $this->next();        return array('pagename' => $next);    }                function count() {        return count($this->_pages);    }    function asArray() {        reset($this->_pages);        return $this->_pages;    }    function free() {        $this->_pages = array();    }};class WikiDB_backend_dbaBase_linktable {    function WikiDB_backend_dbaBase_linktable(&$dba) {        $this->_db = &$dba;    }    //FIXME: try storing link lists as hashes rather than arrays.    // (backlink deletion would be faster.)    function get_links($page, $reversed=true) {        return $this->_get_links($reversed ? 'i' : 'o', $page);    }        function set_links($page, $newlinks) {        $oldlinks = $this->_get_links('o', $page);        if (!is_array($newlinks)) {            assert(empty($newlinks));            $newlinks = array();        }        else {            $newlinks = array_unique($newlinks);        }        sort($newlinks);        $this->_set_links('o', $page, $newlinks);        reset($newlinks);        reset($oldlinks);        $new = current($newlinks);        $old = current($oldlinks);        while ($new !== false || $old !== false) {            if ($old === false || ($new !== false && $new < $old)) {                // $new is a new link (not in $oldlinks).                $this->_add_backlink($new, $page);                $new = next($newlinks);            }            elseif ($new === false || $old < $new) {                // $old is a obsolete link (not in $newlinks).                $this->_delete_backlink($old, $page);                $old = next($oldlinks);            }            else {                // Unchanged link (in both $newlist and $oldlinks).                assert($new == $old);                $new = next($newlinks);                $old = next($oldlinks);            }        }    }    /**     * Rebuild the back-link index.     *     * This should never be needed, but if the database gets hosed for some reason,     * this should put it back into a consistent state.     *     * We assume the forward links in the our table are correct, and recalculate     * all the backlinks appropriately.     */    function rebuild () {        $db = &$this->_db;        // Delete the backlink tables, make a list of page names.        $okeys = array();        $ikeys = array();        for ($key = $db->firstkey(); $key; $key = $db->nextkey()) {            if ($key[0] == 'i')                $ikeys[] = $key;            elseif ($key[0] == 'o')                $okeys[] = $key;            else {                trigger_error("Bad key in linktable: '$key'", E_USER_WARNING);                $ikeys[] = $key;            }        }        foreach ($ikeys as $key) {            $db->delete($key);        }        foreach ($okeys as $key) {            $page = substr($key,1);            $links = $this->_get_links('o', $page);            $db->delete($key);            $this->set_links($page, $links);        }    }    function check() {        $db = &$this->_db;        // FIXME: check for sortedness and uniqueness in links lists.        for ($key = $db->firstkey(); $key; $key = $db->nextkey()) {            if (strlen($key) < 1 || ($key[0] != 'i' && $key[0] != 'o')) {                $errs[] = "Bad key '$key' in table";                continue;            }            $page = substr($key, 1);            if ($key[0] == 'o') {                // Forward links.                foreach($this->_get_links('o', $page) as $link) {                    if (!$this->_has_link('i', $link, $page))                        $errs[] = "backlink entry missing for link '$page'->'$link'";                }            }            else {                assert($key[0] == 'i');                // Backlinks.                foreach($this->_get_links('i', $page) as $link) {                    if (!$this->_has_link('o', $link, $page))                        $errs[] = "link entry missing for backlink '$page'<-'$link'";                }            }        }        return isset($errs) ? $errs : false;    }                function _add_backlink($page, $linkedfrom) {        $backlinks = $this->_get_links('i', $page);        $backlinks[] = $linkedfrom;        sort($backlinks);        $this->_set_links('i', $page, $backlinks);    }        function _delete_backlink($page, $linkedfrom) {        $backlinks = $this->_get_links('i', $page);        foreach ($backlinks as $key => $backlink) {            if ($backlink == $linkedfrom)                unset($backlinks[$key]);        }        $this->_set_links('i', $page, $backlinks);    }        function _has_link($which, $page, $link) {        $links = $this->_get_links($which, $page);        foreach($links as $l) {            if ($l == $link)                return true;        }        return false;    }        function _get_links($which, $page) {        $data = $this->_db->get($which . $page);        return $data ? unserialize($data) : array();    }    function _set_links($which, $page, &$links) {        $key = $which . $page;        if ($links)            $this->_db->set($key, serialize($links));        else            $this->_db->set($key, false);    }}// (c-file-style: "gnu")// Local Variables:// mode: php// tab-width: 8// c-basic-offset: 4// c-hanging-comment-ender-p: nil// indent-tabs-mode: nil// End:   ?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -