1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
<?php // -*-php-*-
rcs_id('$Id: PearDB_pgsql.php,v 1.17 2005/09/11 13:25:12 rurban Exp $');
require_once('lib/ErrorManager.php');
require_once('lib/WikiDB/backend/PearDB.php');
if (!defined("USE_BYTEA")) // see schemas/psql-initialize.sql
define("USE_BYTEA", true); // only BYTEA is binary safe!
//define("USE_BYTEA", false);
/*
Pending changes from CVS HEAD:
* Foreign Keys
* ON DELETE CASCADE
* tsearch2
*/
class WikiDB_backend_PearDB_pgsql
extends WikiDB_backend_PearDB
{
function WikiDB_backend_PearDB_pgsql($dbparams) {
// The pgsql handler of (at least my version of) the PEAR::DB
// library generates three warnings when a database is opened:
//
// Undefined index: options
// Undefined index: tty
// Undefined index: port
//
// This stuff is all just to catch and ignore these warnings,
// so that they don't get reported to the user. (They are
// not consequential.)
//global $ErrorManager;
//$ErrorManager->pushErrorHandler(new WikiMethodCb($this,'_pgsql_open_error'));
$this->WikiDB_backend_PearDB($dbparams);
//$ErrorManager->popErrorHandler();
}
function _pgsql_open_error($error) {
if (preg_match('/^Undefined\s+index:\s+(options|tty|port)/',
$error->errstr))
return true; // Ignore error
return false;
}
/**
* Pack tables.
*/
function optimize() {
foreach ($this->_table_names as $table) {
// see /var/log/postgresql.log for any errors
// and disable this line here if the wikiuser doesn't have proper permissions
$this->_dbh->query("VACUUM ANALYZE $table");
}
return 1;
}
function _quote($s) {
if (USE_BYTEA)
return pg_escape_bytea($s);
else
// pg_escape_string() is broken
return base64_encode($s);
}
function _unquote($s) {
if (USE_BYTEA)
return pg_unescape_bytea($s);
else
return base64_decode($s);
}
// Until the binary escape problems on pear pgsql are solved */
function get_cached_html($pagename) {
$dbh = &$this->_dbh;
$page_tbl = $this->_table_names['page_tbl'];
$data = $dbh->GetOne(sprintf("SELECT cached_html FROM $page_tbl WHERE pagename='%s'",
$dbh->escapeSimple($pagename)));
if ($data) return $this->_unquote($data);
else return '';
}
function set_cached_html($pagename, $data) {
$dbh = &$this->_dbh;
$page_tbl = $this->_table_names['page_tbl'];
if (USE_BYTEA)
$sth = $dbh->query(sprintf("UPDATE $page_tbl"
. " SET cached_html='%s'"
. " WHERE pagename='%s'",
$this->_quote($data),
$dbh->escapeSimple($pagename)));
else
$sth = $dbh->query("UPDATE $page_tbl"
. " SET cached_html=?"
. " WHERE pagename=?",
// PearDB does NOT use pg_escape_string()! Oh dear.
array($this->_quote($data), $pagename));
}
/**
* Lock all tables we might use.
*/
function _lock_tables($write_lock = true) {
$this->_dbh->query("BEGIN");
}
/**
* Unlock all tables.
*/
function _unlock_tables() {
$this->_dbh->query("COMMIT");
}
/**
* Serialize data
*/
function _serialize($data) {
if (empty($data))
return '';
assert(is_array($data));
return $this->_quote(serialize($data));
}
/**
* Unserialize data
*/
function _unserialize($data) {
if (empty($data))
return array();
// Base64 encoded data does not contain colons.
// (only alphanumerics and '+' and '/'.)
if (substr($data,0,2) == 'a:')
return unserialize($data);
return unserialize($this->_unquote($data));
}
};
class WikiDB_backend_PearDB_pgsql_search
extends WikiDB_backend_PearDB_search
{
function _pagename_match_clause($node) {
$word = $node->sql();
if ($node->op == 'REGEX') { // posix regex extensions
return ($this->_case_exact
? "pagename ~* '$word'"
: "pagename ~ '$word'");
} else {
return ($this->_case_exact
? "pagename LIKE '$word'"
: "pagename ILIKE '$word'");
}
}
function _fulltext_match_clause($node) {
$word = $node->sql();
return $this->_pagename_match_clause($node)
. ($this->_case_exact
? " OR content LIKE '$word'"
: " OR content ILIKE '$word'");
}
}
// (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:
?>
|