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

📄 adodb.php

📁 PhpWiki是sourceforge的一个开源项目
💻 PHP
📖 第 1 页 / 共 5 页
字号:
    function get_previous_version($pagename, $version) {        $dbh = &$this->_dbh;        extract($this->_table_names);        // Use SELECTLIMIT for maximum portability        $rs = $dbh->SelectLimit(sprintf("SELECT version"                                        . " FROM $version_tbl, $page_tbl"                                        . " WHERE $version_tbl.id=$page_tbl.id"                                        . "  AND pagename=%s"                                        . "  AND version < %d"                                        . " ORDER BY version DESC"                                        ,$dbh->qstr($pagename),                                        $version),                                1);        return $rs->fields ? (int)$rs->fields[0] : false;    }        /**     * Get version data.     *     * @param $version int Which version to get.     *     * @return hash The version data, or false if specified version does not     *              exist.     */    function get_versiondata($pagename, $version, $want_content = false) {        $dbh = &$this->_dbh;        extract($this->_table_names);        extract($this->_expressions);                        assert(is_string($pagename) and $pagename != '');        assert($version > 0);                // FIXME: optimization: sometimes don't get page data?        if ($want_content) {            $fields = $this->page_tbl_fields . ", $page_tbl.pagedata AS pagedata"                . ', ' . $this->version_tbl_fields;        } else {            $fields = $this->page_tbl_fields . ", '' AS pagedata"                . ", $version_tbl.version AS version, $version_tbl.mtime AS mtime, "                . "$version_tbl.minor_edit AS minor_edit, $iscontent AS have_content, "                . "$version_tbl.versiondata as versiondata";        }        $row = $dbh->GetRow(sprintf("SELECT $fields"                                    . " FROM $page_tbl, $version_tbl"                                    . " WHERE $page_tbl.id=$version_tbl.id"                                    . "  AND pagename=%s"                                    . "  AND version=%d",                                    $dbh->qstr($pagename), $version));        return $row ? $this->_extract_version_data_num($row, $want_content) : false;    }    function _extract_version_data_num($row, $want_content) {        if (!$row)            return false;        //$id       &= $row[0];        //$pagename &= $row[1];        $data = empty($row[8]) ? array() : $this->_unserialize($row[8]);        $data['mtime']         = $row[5];        $data['is_minor_edit'] = !empty($row[6]);        if ($want_content) {            $data['%content'] = $row[7];        } else {            $data['%content'] = !empty($row[7]);        }        if (!empty($row[3])) {            $data['%pagedata'] = $this->_extract_page_data($row[3], $row[2]);        }        return $data;    }    function _extract_version_data_assoc($row) {        if (!$row)            return false;        extract($row);        $data = empty($versiondata) ? array() : $this->_unserialize($versiondata);        $data['mtime'] = $mtime;        $data['is_minor_edit'] = !empty($minor_edit);        if (isset($content))            $data['%content'] = $content;        elseif ($have_content)            $data['%content'] = true;        else            $data['%content'] = '';        if (!empty($pagedata)) {            $data['%pagedata'] = $this->_extract_page_data($pagedata, $hits);        }        return $data;    }    /**     * Create a new revision of a page.     */    function set_versiondata($pagename, $version, $data) {        $dbh = &$this->_dbh;        $version_tbl = $this->_table_names['version_tbl'];                $minor_edit = (int) !empty($data['is_minor_edit']);        unset($data['is_minor_edit']);                $mtime = (int)$data['mtime'];        unset($data['mtime']);        assert(!empty($mtime));        @$content = (string) $data['%content'];        unset($data['%content']);        unset($data['%pagedata']);                $this->lock(array('page','recent','version','nonempty'));        $dbh->BeginTrans( );        $dbh->CommitLock($version_tbl);        $id = $this->_get_pageid($pagename, true);        $backend_type = $this->backendType();        // optimize: mysql can do this with one REPLACE INTO.        if (substr($backend_type,0,5) == 'mysql') {            $rs = $dbh->Execute(sprintf("REPLACE INTO $version_tbl"                                  . " (id,version,mtime,minor_edit,content,versiondata)"                                  . " VALUES(%d,%d,%d,%d,%s,%s)",                                  $id, $version, $mtime, $minor_edit,                                  $dbh->qstr($content),                                  $dbh->qstr($this->_serialize($data))));        } else {            $dbh->Execute(sprintf("DELETE FROM $version_tbl"                                  . " WHERE id=%d AND version=%d",                                  $id, $version));            $rs = $dbh->Execute("INSERT INTO $version_tbl"                                . " (id,version,mtime,minor_edit,content,versiondata)"                                . " VALUES(?,?,?,?,?,?)",                                  array($id, $version, $mtime, $minor_edit,                                  $content, $this->_serialize($data)));        }        $this->_update_recent_table($id);        $this->_update_nonempty_table($id);        if ($rs) $dbh->CommitTrans( );        else $dbh->RollbackTrans( );        $this->unlock(array('page','recent','version','nonempty'));    }        /**     * Delete an old revision of a page.     */    function delete_versiondata($pagename, $version) {        $dbh = &$this->_dbh;        extract($this->_table_names);        $this->lock(array('version'));        if ( ($id = $this->_get_pageid($pagename)) ) {            $dbh->Execute("DELETE FROM $version_tbl"                        . " WHERE id=$id AND version=$version");            $this->_update_recent_table($id);            // This shouldn't be needed (as long as the latestversion            // never gets deleted.)  But, let's be safe.            $this->_update_nonempty_table($id);        }        $this->unlock(array('version'));    }    /**     * Delete page from the database with backup possibility.     * i.e save_page('') and DELETE nonempty id     *      * deletePage increments latestversion in recent to a non-existent version,      * and removes the nonempty row,     * so that get_latest_version returns id+1 and get_previous_version returns prev id      * and page->exists returns false.     */    function delete_page($pagename) {        $dbh = &$this->_dbh;        extract($this->_table_names);        $dbh->BeginTrans();        $dbh->CommitLock($recent_tbl);        if (($id = $this->_get_pageid($pagename, false)) === false) {            $dbh->RollbackTrans( );            return false;        }        $mtime = time();        $user =& $GLOBALS['request']->_user;        $meta = array('author' => $user->getId(),                      'author_id' => $user->getAuthenticatedId(),                      'mtime' => $mtime);        $this->lock(array('version','recent','nonempty','page','link'));        $version = $this->get_latest_version($pagename);        if ($dbh->Execute("UPDATE $recent_tbl SET latestversion=latestversion+1,"                          . "latestmajor=latestversion+1,latestminor=NULL WHERE id=$id")            and $dbh->Execute("INSERT INTO $version_tbl"                                . " (id,version,mtime,minor_edit,content,versiondata)"                                . " VALUES(?,?,?,?,?,?)",                                  array($id, $version+1, $mtime, 0,                                        '', $this->_serialize($meta)))            and $dbh->Execute("DELETE FROM $nonempty_tbl WHERE id=$id")            and $this->set_links($pagename, false)            // need to keep perms and LOCKED, otherwise you can reset the perm             // by action=remove and re-create it with default perms            // keep hits but delete meta-data             //and $dbh->Execute("UPDATE $page_tbl SET pagedata='' WHERE id=$id")            )        {            $this->unlock(array('version','recent','nonempty','page','link'));	            $dbh->CommitTrans( );            return true;        } else {            $this->unlock(array('version','recent','nonempty','page','link'));	            $dbh->RollbackTrans( );            return false;        }    }    function purge_page($pagename) {        $dbh = &$this->_dbh;        extract($this->_table_names);                $this->lock(array('version','recent','nonempty','page','link'));        if ( ($id = $this->_get_pageid($pagename, false)) ) {            $dbh->Execute("DELETE FROM $version_tbl  WHERE id=$id");            $dbh->Execute("DELETE FROM $recent_tbl   WHERE id=$id");            $dbh->Execute("DELETE FROM $nonempty_tbl WHERE id=$id");            $this->set_links($pagename, false);            $row = $dbh->GetRow("SELECT COUNT(*) FROM $link_tbl WHERE linkto=$id");            if ($row and $row[0]) {                // We're still in the link table (dangling link) so we can't delete this                // altogether.                $dbh->Execute("UPDATE $page_tbl SET hits=0, pagedata='' WHERE id=$id");                $result = 0;            }            else {                $dbh->Execute("DELETE FROM $page_tbl WHERE id=$id");                $result = 1;            }        } else {            $result = -1; // already purged or not existing        }        $this->unlock(array('version','recent','nonempty','page','link'));        return $result;    }    // The only thing we might be interested in updating which we can    // do fast in the flags (minor_edit).   I think the default    // update_versiondata will work fine...    //function update_versiondata($pagename, $version, $data) {    //}    function set_links($pagename, $links) {        // Update link table.        // FIXME: optimize: mysql can do this all in one big INSERT/REPLACE.        $dbh = &$this->_dbh;        extract($this->_table_names);        $this->lock(array('link'));        $pageid = $this->_get_pageid($pagename, true);        if ($links) {            $dbh->Execute("DELETE FROM $link_tbl WHERE linkfrom=$pageid");            foreach ($links as $link) {                if (isset($linkseen[$link]))                    continue;                $linkseen[$link] = true;                $linkid = $this->_get_pageid($link, true);                assert($linkid);                $dbh->Execute("INSERT INTO $link_tbl (linkfrom, linkto)"                            . " VALUES ($pageid, $linkid)");            }        } elseif (DEBUG) {            // purge page table: delete all non-referenced pages            // for all previously linked pages...            foreach ($dbh->getRow("SELECT $link_tbl.linkto as id FROM $link_tbl".                                  " WHERE linkfrom=$pageid") as $id) {            	// ...check if the page is empty and has no version                if ($dbh->getRow("SELECT $page_tbl.id FROM $page_tbl"                                 . " LEFT JOIN $nonempty_tbl USING (id) "                                 . " LEFT JOIN $version_tbl USING (id)"                                 . " WHERE ISNULL($nonempty_tbl.id) AND"                                 . " ISNULL($version_tbl.id) AND $page_tbl.id=$id")) {                    $dbh->Execute("DELETE FROM $page_tbl WHERE id=$id");   // this purges the link                    $dbh->Execute("DELETE FROM $recent_tbl WHERE id=$id"); // may fail                }            }            $dbh->Execute("DELETE FROM $link_tbl WHERE linkfrom=$pageid");        }        $this->unlock(array('link'));        return true;    }        /**     * Find pages which link to or are linked from a page.     *     * Optimization: save request->_dbi->_iwpcache[] to avoid further iswikipage checks     * (linkExistingWikiWord or linkUnknownWikiWord)     * This is called on every page header GleanDescription, so we can store all the existing links.     */    function get_links($pagename, $reversed=true, $include_empty=false,                       $sortby=false, $limit=false, $exclude='') {        $dbh = &$this->_dbh;        extract($this->_table_names);        if ($reversed)            list($have,$want) = array('linkee', 'linker');        else            list($have,$want) = array('linker', 'linkee');        $orderby = $this->sortby($sortby, 'db', array('pagename'));        if ($orderby) $orderby = ' ORDER BY $want.' . $orderby;        if ($exclude) // array of pagenames            $exclude = " AND $want.pagename NOT IN ".$this->_sql_set($exclude);        else             $exclude='';        if ($limit) {            list($offset, $count) = $this->limit($limit);            // TODO: check pqsql LIMIT count OFFSET offset             $limit = " LIMIT $offset, $count";        } else             $limit = '';        $qpagename = $dbh->qstr($pagename);        // removed ref to FETCH_MODE in next line        $result = $dbh->Execute("SELECT $want.id AS id, $want.pagename AS pagename,"                                . " $want.hits AS hits"                                . " FROM $link_tbl, $page_tbl linker, $page_tbl linkee"                                . (!$include_empty ? ", $nonempty_tbl" : '')                                . " WHERE linkfrom=linker.id AND linkto=linkee.id"                                . " AND $have.pagename=$qpagename"                                . (!$include_empty ? " AND $nonempty_tbl.id=$want.id" : "")                                //. " GROUP BY $want.id"                                . $exclude                                . $orderby                                . $limit);        return new WikiDB_backend_ADODB_iter($this, $result, $this->page_tbl_field_list);    }    /**     * Find if a page links to another page     */    function exists_link($pagename, $link, $reversed=false) {

⌨️ 快捷键说明

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