?? peardb.php
字號(hào):
<?php // -*-php-*-rcs_id('$Id: PearDB.php,v 1.87 2005/02/10 19:04:24 rurban Exp $');require_once('lib/WikiDB/backend.php');//require_once('lib/FileFinder.php');//require_once('lib/ErrorManager.php');class WikiDB_backend_PearDBextends WikiDB_backend{ var $_dbh; function WikiDB_backend_PearDB ($dbparams) { // Find and include PEAR's DB.php. maybe we should force our private version again... // if DB would have exported its version number, it would be easier. @require_once('DB/common.php'); // Either our local pear copy or the system one // check the version! $name = check_php_version(5) ? "escapeSimple" : strtolower("escapeSimple"); if (!in_array($name, get_class_methods("DB_common"))) { $finder = new FileFinder; $dir = dirname(__FILE__)."/../../pear"; $finder->_prepend_to_include_path($dir); include_once("$dir/DB/common.php"); // use our version instead. if (!in_array($name, get_class_methods("DB_common"))) { $pearFinder = new PearFileFinder("lib/pear"); $pearFinder->includeOnce('DB.php'); } else { include_once("$dir/DB.php"); } } else { include_once("DB.php"); } // Install filter to handle bogus error notices from buggy DB.php's. // TODO: check the Pear_DB version, but how? if (0) { global $ErrorManager; $ErrorManager->pushErrorHandler(new WikiMethodCb($this, '_pear_notice_filter')); $this->_pearerrhandler = true; } // Open connection to database $this->_dsn = $dbparams['dsn']; $this->_dbparams = $dbparams; $this->_lock_count = 0; // persistent is usually a DSN option: we override it with a config value. // phptype://username:password@hostspec/database?persistent=false $dboptions = array('persistent' => DATABASE_PERSISTENT, 'debug' => 2); //if (preg_match('/^pgsql/', $this->_dsn)) $dboptions['persistent'] = false; $this->_dbh = DB::connect($this->_dsn, $dboptions); $dbh = &$this->_dbh; if (DB::isError($dbh)) { trigger_error(sprintf("Can't connect to database: %s", $this->_pear_error_message($dbh)), E_USER_ERROR); } $dbh->setErrorHandling(PEAR_ERROR_CALLBACK, array($this, '_pear_error_callback')); $dbh->setFetchMode(DB_FETCHMODE_ASSOC); $prefix = isset($dbparams['prefix']) ? $dbparams['prefix'] : ''; $this->_table_names = array('page_tbl' => $prefix . 'page', 'version_tbl' => $prefix . 'version', 'link_tbl' => $prefix . 'link', 'recent_tbl' => $prefix . 'recent', 'nonempty_tbl' => $prefix . 'nonempty'); $page_tbl = $this->_table_names['page_tbl']; $version_tbl = $this->_table_names['version_tbl']; $this->page_tbl_fields = "$page_tbl.id AS id, $page_tbl.pagename AS pagename, $page_tbl.hits AS hits"; $this->version_tbl_fields = "$version_tbl.version AS version, $version_tbl.mtime AS mtime, ". "$version_tbl.minor_edit AS minor_edit, $version_tbl.content AS content, $version_tbl.versiondata AS versiondata"; $this->_expressions = array('maxmajor' => "MAX(CASE WHEN minor_edit=0 THEN version END)", 'maxminor' => "MAX(CASE WHEN minor_edit<>0 THEN version END)", 'maxversion' => "MAX(version)", 'notempty' => "<>''", 'iscontent' => "content<>''"); } /** * Close database connection. */ function close () { if (!$this->_dbh) return; if ($this->_lock_count) { trigger_error( "WARNING: database still locked " . '(lock_count = $this->_lock_count)' . "\n<br />", E_USER_WARNING); } $this->_dbh->setErrorHandling(PEAR_ERROR_PRINT); // prevent recursive loops. $this->unlock('force'); $this->_dbh->disconnect(); if (!empty($this->_pearerrhandler)) { $GLOBALS['ErrorManager']->popErrorHandler(); } } /* * Test fast wikipage. */ function is_wiki_page($pagename) { $dbh = &$this->_dbh; extract($this->_table_names); return $dbh->getOne(sprintf("SELECT $page_tbl.id as id" . " FROM $nonempty_tbl, $page_tbl" . " WHERE $nonempty_tbl.id=$page_tbl.id" . " AND pagename='%s'", $dbh->escapeSimple($pagename))); } function get_all_pagenames() { $dbh = &$this->_dbh; extract($this->_table_names); return $dbh->getCol("SELECT pagename" . " FROM $nonempty_tbl, $page_tbl" . " WHERE $nonempty_tbl.id=$page_tbl.id"); } function numPages($filter=false, $exclude='') { $dbh = &$this->_dbh; extract($this->_table_names); return $dbh->getOne("SELECT count(*)" . " FROM $nonempty_tbl, $page_tbl" . " WHERE $nonempty_tbl.id=$page_tbl.id"); } function increaseHitCount($pagename) { $dbh = &$this->_dbh; // Hits is the only thing we can update in a fast manner. // Note that this will fail silently if the page does not // have a record in the page table. Since it's just the // hit count, who cares? $dbh->query(sprintf("UPDATE %s SET hits=hits+1 WHERE pagename='%s'", $this->_table_names['page_tbl'], $dbh->escapeSimple($pagename))); return; } /** * Read page information from database. */ function get_pagedata($pagename) { $dbh = &$this->_dbh; //trigger_error("GET_PAGEDATA $pagename", E_USER_NOTICE); $result = $dbh->getRow(sprintf("SELECT hits,pagedata FROM %s WHERE pagename='%s'", $this->_table_names['page_tbl'], $dbh->escapeSimple($pagename)), DB_FETCHMODE_ASSOC); return $result ? $this->_extract_page_data($result) : false; } function _extract_page_data($data) { if (empty($data)) return array(); elseif (empty($data['pagedata'])) return $data; else { $data = array_merge($data, $this->_unserialize($data['pagedata'])); unset($data['pagedata']); return $data; } } function update_pagedata($pagename, $newdata) { $dbh = &$this->_dbh; $page_tbl = $this->_table_names['page_tbl']; // Hits is the only thing we can update in a fast manner. if (count($newdata) == 1 && isset($newdata['hits'])) { // Note that this will fail silently if the page does not // have a record in the page table. Since it's just the // hit count, who cares? $dbh->query(sprintf("UPDATE $page_tbl SET hits=%d WHERE pagename='%s'", $newdata['hits'], $dbh->escapeSimple($pagename))); return; } $this->lock(array($page_tbl), true); $data = $this->get_pagedata($pagename); if (!$data) { $data = array(); $this->_get_pageid($pagename, true); // Creates page record } @$hits = (int)$data['hits']; unset($data['hits']); foreach ($newdata as $key => $val) { if ($key == 'hits') $hits = (int)$val; else if (empty($val)) unset($data[$key]); else $data[$key] = $val; } /* Portability issue -- not all DBMS supports huge strings * so we need to 'bind' instead of building a simple SQL statment. * Note that we do not need to escapeSimple when we bind $dbh->query(sprintf("UPDATE $page_tbl" . " SET hits=%d, pagedata='%s'" . " WHERE pagename='%s'", $hits, $dbh->escapeSimple($this->_serialize($data)), $dbh->escapeSimple($pagename))); */ $sth = $dbh->query("UPDATE $page_tbl" . " SET hits=?, pagedata=?" . " WHERE pagename=?", array($hits, $this->_serialize($data), $pagename)); $this->unlock(array($page_tbl)); } function get_cached_html($pagename) { $dbh = &$this->_dbh; $page_tbl = $this->_table_names['page_tbl']; return $dbh->GetOne(sprintf("SELECT cached_html FROM $page_tbl WHERE pagename='%s'", $dbh->escapeSimple($pagename))); } function set_cached_html($pagename, $data) { $dbh = &$this->_dbh; $page_tbl = $this->_table_names['page_tbl']; $sth = $dbh->query("UPDATE $page_tbl" . " SET cached_html=?" . " WHERE pagename=?", array($data, $pagename)); } function _get_pageid($pagename, $create_if_missing = false) { // check id_cache global $request; $cache =& $request->_dbi->_cache->_id_cache; if (isset($cache[$pagename])) { if ($cache[$pagename] or !$create_if_missing) { return $cache[$pagename]; } } $dbh = &$this->_dbh; $page_tbl = $this->_table_names['page_tbl']; $query = sprintf("SELECT id FROM $page_tbl WHERE pagename='%s'", $dbh->escapeSimple($pagename)); if (!$create_if_missing) return $dbh->getOne($query); $id = $dbh->getOne($query); if (empty($id)) { $this->lock(array($page_tbl), true); // write lock $max_id = $dbh->getOne("SELECT MAX(id) FROM $page_tbl"); $id = $max_id + 1; $dbh->query(sprintf("INSERT INTO $page_tbl" . " (id,pagename,hits)" . " VALUES (%d,'%s',0)", $id, $dbh->escapeSimple($pagename))); $this->unlock(array($page_tbl)); } return $id; } function get_latest_version($pagename) { $dbh = &$this->_dbh; extract($this->_table_names); return (int)$dbh->getOne(sprintf("SELECT latestversion" . " FROM $page_tbl, $recent_tbl" . " WHERE $page_tbl.id=$recent_tbl.id" . " AND pagename='%s'", $dbh->escapeSimple($pagename))); } function get_previous_version($pagename, $version) { $dbh = &$this->_dbh; extract($this->_table_names); return (int)$dbh->getOne(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", /* Non portable and useless anyway with getOne . " LIMIT 1", */ $dbh->escapeSimple($pagename), $version)); } /** * 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); //trigger_error("GET_REVISION $pagename $version $want_content", E_USER_NOTICE); // 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 . "," . "mtime, minor_edit, versiondata," . "$iscontent AS have_content"; } $result = $dbh->getRow(sprintf("SELECT $fields" . " FROM $page_tbl, $version_tbl" . " WHERE $page_tbl.id=$version_tbl.id" . " AND pagename='%s'" . " AND version=%d", $dbh->escapeSimple($pagename), $version), DB_FETCHMODE_ASSOC); return $this->_extract_version_data($result); } function _extract_version_data($query_result) { if (!$query_result) return false; $data = $this->_unserialize($query_result['versiondata']); $data['mtime'] = $query_result['mtime']; $data['is_minor_edit'] = !empty($query_result['minor_edit']); if (isset($query_result['content'])) $data['%content'] = $query_result['content']; elseif ($query_result['have_content']) $data['%content'] = true; else $data['%content'] = ''; // FIXME: this is ugly. if (isset($query_result['pagedata'])) { // Query also includes page data. // We might as well send that back too... unset($query_result['versiondata']); $data['%pagedata'] = $this->_extract_page_data($query_result); }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -