- Patch #10945 by Adrian: more PostgreSQL fixes/updates.

4.5.x
Dries Buytaert 2004-09-20 17:58:14 +00:00
parent 4fe5b52a21
commit 228b3c7cc8
6 changed files with 107 additions and 33 deletions

View File

@ -162,7 +162,7 @@ CREATE TABLE aggregator_item (
CREATE TABLE cache ( CREATE TABLE cache (
cid varchar(255) NOT NULL default '', cid varchar(255) NOT NULL default '',
data bytea default '', data text default '',
expire integer NOT NULL default '0', expire integer NOT NULL default '0',
created integer NOT NULL default '0', created integer NOT NULL default '0',
headers text default '', headers text default '',
@ -196,6 +196,20 @@ CREATE TABLE comments (
); );
CREATE INDEX comments_nid_idx ON comments(nid); CREATE INDEX comments_nid_idx ON comments(nid);
--
-- Table structre for table 'node_last_comment'
--
CREATE TABLE node_comment_statistics (
nid integer NOT NULL,
cid integer NOT NULL default '0',
last_comment_timestamp integer NOT NULL default '0',
last_comment_name varchar(60) default NULL,
last_comment_uid integer NOT NULL default '0',
comment_count integer NOT NULL default '0',
PRIMARY KEY (nid)
);
-- --
-- Table structure for directory -- Table structure for directory
-- --
@ -799,3 +813,15 @@ BEGIN
RETURN $1 || $2; RETURN $1 || $2;
END; END;
' LANGUAGE 'plpgsql'; ' LANGUAGE 'plpgsql';
CREATE FUNCTION "if"(integer, text, text) RETURNS text AS '
BEGIN
IF $1 THEN
RETURN $2;
END IF;
IF NOT $1 THEN
RETURN $3;
END IF;
END;
' LANGUAGE 'plpgsql';

View File

@ -1077,10 +1077,19 @@ function update_85() {
$ret[] = update_sql("ALTER TABLE {bundle} RENAME TO {aggregator_category}"); $ret[] = update_sql("ALTER TABLE {bundle} RENAME TO {aggregator_category}");
$ret[] = update_sql("ALTER TABLE {aggregator_category} DROP attributes"); $ret[] = update_sql("ALTER TABLE {aggregator_category} DROP attributes");
$ret[] = update_sql("ALTER TABLE {aggregator_category} RENAME bid TO cid"); $ret[] = update_sql("ALTER TABLE {aggregator_category} RENAME bid TO cid");
$lastvalue = db_result(db_query('SELECT last_value from {bundle}_bid_seq'));
$ret[] = update_sql("CREATE SEQUENCE {aggregator_category}_cid_seq START $lastvalue MINVALUE 0");
$ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER cid SET DEFAULT nextval('public.{aggregator_category}_cid_seq'::text)");
$ret[] = update_sql("ALTER TABLE {aggregator_category} ADD description text"); $ret[] = update_sql("ALTER TABLE {aggregator_category} ADD description text");
$ret[] = update_sql("UPDATE {aggregator_category} SET description = ''"); $ret[] = update_sql("UPDATE {aggregator_category} SET description = ''");
$ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN description SET NOT NULL"); $ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN description SET NOT NULL");
$ret[] = update_sql("ALTER TABLE {feed} RENAME TO {aggregator_feed}"); $ret[] = update_sql("ALTER TABLE {feed} RENAME TO {aggregator_feed}");
$lastvalue = db_result(db_query('SELECT last_value from {feed}_fid_seq'));
$ret[] = update_sql("CREATE SEQUENCE {aggregator_feed}_fid_seq START $lastvalue MINVALUE 0");
$ret[] = update_sql("ALTER TABLE {aggregator_feed} ALTER fid SET DEFAULT nextval('public.{aggregator_feed}_fid_seq'::text)");
$ret[] = update_sql("ALTER TABLE {aggregator_feed} DROP attributes"); $ret[] = update_sql("ALTER TABLE {aggregator_feed} DROP attributes");
$ret[] = update_sql("ALTER TABLE {aggregator_feed} ADD block smallint"); $ret[] = update_sql("ALTER TABLE {aggregator_feed} ADD block smallint");
$ret[] = update_sql("UPDATE {aggregator_feed} SET block = 0"); $ret[] = update_sql("UPDATE {aggregator_feed} SET block = 0");
@ -1088,7 +1097,12 @@ function update_85() {
$ret[] = update_sql("ALTER TABLE {aggregator_category} ADD block smallint"); $ret[] = update_sql("ALTER TABLE {aggregator_category} ADD block smallint");
$ret[] = update_sql("UPDATE {aggregator_category} SET block = 0"); $ret[] = update_sql("UPDATE {aggregator_category} SET block = 0");
$ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN block SET NOT NULL"); $ret[] = update_sql("ALTER TABLE {aggregator_category} ALTER COLUMN block SET NOT NULL");
$ret[] = update_sql("ALTER TABLE {item} RENAME TO {aggregator_item}"); $ret[] = update_sql("ALTER TABLE {item} RENAME TO {aggregator_item}");
$lastvalue = db_result(db_query('SELECT last_value from {item}_iid_seq'));
$ret[] = update_sql("CREATE SEQUENCE {aggregator_item}_iid_seq START $lastvalue MINVALUE 0");
$ret[] = update_sql("ALTER TABLE {aggregator_item} ALTER iid SET DEFAULT nextval('public.{aggregator_item}_iid_seq'::text)");
$ret[] = update_sql("ALTER TABLE {aggregator_item} DROP attributes"); $ret[] = update_sql("ALTER TABLE {aggregator_item} DROP attributes");
$ret[] = update_sql("CREATE TABLE {aggregator_category_feed} ( $ret[] = update_sql("CREATE TABLE {aggregator_category_feed} (
fid integer NOT NULL default '0', fid integer NOT NULL default '0',
@ -1754,7 +1768,6 @@ function update_104() {
} }
function update_105() { function update_105() {
// TODO: needs PGSQL equivalent
$ret = array(); $ret = array();
$shadowupdates = db_query("SELECT nid,tid FROM {forum} WHERE shadow=0"); $shadowupdates = db_query("SELECT nid,tid FROM {forum} WHERE shadow=0");
@ -1762,6 +1775,7 @@ function update_105() {
db_query("DELETE FROM {term_node} WHERE nid = %d AND tid <> %d", $shadowrecord->nid, $shadowrecord->tid); db_query("DELETE FROM {term_node} WHERE nid = %d AND tid <> %d", $shadowrecord->nid, $shadowrecord->tid);
} }
if ($GLOBALS['db_type'] == 'mysql') {
$ret[] = update_sql("ALTER TABLE {forum} DROP shadow"); $ret[] = update_sql("ALTER TABLE {forum} DROP shadow");
$ret[] = update_sql('ALTER TABLE {node} ADD INDEX node_status_type (status, type, nid)'); $ret[] = update_sql('ALTER TABLE {node} ADD INDEX node_status_type (status, type, nid)');
@ -1789,6 +1803,35 @@ function update_105() {
/* This would be faster but only works with MySQL 4.0.4 or higher /* This would be faster but only works with MySQL 4.0.4 or higher
$ret[] = update_sql('UPDATE {node_comment_statistics} n, {forum_conv_temp} t, {comments} c SET n.comment_count = t.comment_count, n.last_comment_timestamp = c.timestamp, n.last_comment_name = c.name, n.last_comment_uid = c.uid, n.cid = t.cid WHERE t.cid = c.cid AND n.nid = t.nid'); $ret[] = update_sql('UPDATE {node_comment_statistics} n, {forum_conv_temp} t, {comments} c SET n.comment_count = t.comment_count, n.last_comment_timestamp = c.timestamp, n.last_comment_name = c.name, n.last_comment_uid = c.uid, n.cid = t.cid WHERE t.cid = c.cid AND n.nid = t.nid');
*/ */
}
else {
// PostgreSQL is incapable of dropping columns in all but the latest versions.
$ret[] = update_sql("CREATE INDEX {node}_status_type_idx ON {node} (status, type, nid)");
$ret[] = update_sql("CREATE TABLE {node}_comment_statistics (
nid integer NOT NULL,
cid integer NOT NULL default '0',
last_comment_timestamp integer NOT NULL default '0',
last_comment_name varchar(60) default NULL,
last_comment_uid integer NOT NULL default '0',
comment_count integer NOT NULL default '0',
PRIMARY KEY (nid)
)");
$ret[] = update_sql("SELECT f.nid, MAX(c.cid) as cid, COUNT(c.nid) as comment_count INTO TEMPORARY {forum_conv_temp} FROM {forum} f INNER JOIN {comments} c ON f.nid = c.nid WHERE c.status = 0 GROUP BY f.nid");
$ret[] = update_sql("CREATE FUNCTION \"if\"(integer, text, text) RETURNS text AS '
BEGIN
IF $1 THEN
RETURN $2;
END IF;
IF NOT $1 THEN
RETURN $3;
END IF;
END;
' LANGUAGE 'plpgsql'");
}
$commentupdates = db_query("SELECT t.nid, t.cid, t.comment_count, c.timestamp, c.name, c.uid FROM {forum_conv_temp} t INNER JOIN {comments} c ON t.cid = c.cid"); $commentupdates = db_query("SELECT t.nid, t.cid, t.comment_count, c.timestamp, c.name, c.uid FROM {forum_conv_temp} t INNER JOIN {comments} c ON t.cid = c.cid");
while ($commentrecord = db_fetch_object($commentupdates)) { while ($commentrecord = db_fetch_object($commentupdates)) {
@ -1806,7 +1849,7 @@ function update_106() {
$ret[] = update_sql('ALTER TABLE {cache} ADD INDEX expire (expire)'); $ret[] = update_sql('ALTER TABLE {cache} ADD INDEX expire (expire)');
} }
else if ($GLOBALS['db_type'] == 'pgsql') { else if ($GLOBALS['db_type'] == 'pgsql') {
// TODO: needs PGSQL equivalent. $ret[] = update_sql('CREATE INDEX {cache}_expire_idx ON {cache}(expire)');
} }
$ret[] = update_sql('DELETE FROM {cache}'); $ret[] = update_sql('DELETE FROM {cache}');

View File

@ -118,7 +118,11 @@ function variable_del($name) {
*/ */
function cache_get($key) { function cache_get($key) {
$cache = db_fetch_object(db_query("SELECT data, created, headers FROM {cache} WHERE cid = '%s'", $key)); $cache = db_fetch_object(db_query("SELECT data, created, headers FROM {cache} WHERE cid = '%s'", $key));
return isset($cache->data) ? $cache : 0; if (isset($cache->data)) {
$cache->data = db_decode_blob($cache->data);
return $cache;
}
return 0;
} }
/** /**
@ -271,7 +275,7 @@ function drupal_page_header() {
header($header); header($header);
} }
print db_decode_blob($cache->data); print $cache->data;
// Call all init() and exit() hooks without including all modules. // Call all init() and exit() hooks without including all modules.
// Only use those hooks for critical operations. // Only use those hooks for critical operations.

View File

@ -23,7 +23,8 @@
function db_connect($url) { function db_connect($url) {
$url = parse_url($url); $url = parse_url($url);
$conn_string = ' user='. $url['user'] .' dbname='. substr($url['path'], 1) .' password='. $url['pass']; $conn_string = ' user='. $url['user'] .' dbname='. substr($url['path'], 1) .' password='. $url['pass'] . ' host=' . $url['host'];
$conn_string .= ($url['port']) ? ' port=' . $url['port'] : '';
$connection = pg_connect($conn_string) or die(pg_last_error()); $connection = pg_connect($conn_string) or die(pg_last_error());
return $connection; return $connection;
@ -263,7 +264,7 @@ function db_query_range($query) {
* Encoded data. * Encoded data.
*/ */
function db_encode_blob($data) { function db_encode_blob($data) {
return pg_escape_bytea($data); return addcslashes($data, "\0..\37\\");
} }
/** /**

View File

@ -693,7 +693,7 @@ function aggregator_get_category($cid) {
} }
function aggregator_view() { function aggregator_view() {
$result = db_query('SELECT f.*, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.etag, f.modified, f.image ORDER BY f.title'); $result = db_query('SELECT f.*, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.etag, f.modified, f.image, f.block ORDER BY f.title');
$output .= '<h3>'. t('Feed overview') .'</h3>'; $output .= '<h3>'. t('Feed overview') .'</h3>';
@ -704,7 +704,7 @@ function aggregator_view() {
} }
$output .= theme('table', $header, $rows); $output .= theme('table', $header, $rows);
$result = db_query('SELECT c.cid, c.title, count(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid ORDER BY title'); $result = db_query('SELECT c.cid, c.title, count(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid, c.title ORDER BY title');
$output .= '<h3>'. t('Category overview') .'</h3>'; $output .= '<h3>'. t('Category overview') .'</h3>';

View File

@ -693,7 +693,7 @@ function aggregator_get_category($cid) {
} }
function aggregator_view() { function aggregator_view() {
$result = db_query('SELECT f.*, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.etag, f.modified, f.image ORDER BY f.title'); $result = db_query('SELECT f.*, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.etag, f.modified, f.image, f.block ORDER BY f.title');
$output .= '<h3>'. t('Feed overview') .'</h3>'; $output .= '<h3>'. t('Feed overview') .'</h3>';
@ -704,7 +704,7 @@ function aggregator_view() {
} }
$output .= theme('table', $header, $rows); $output .= theme('table', $header, $rows);
$result = db_query('SELECT c.cid, c.title, count(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid ORDER BY title'); $result = db_query('SELECT c.cid, c.title, count(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid, c.title ORDER BY title');
$output .= '<h3>'. t('Category overview') .'</h3>'; $output .= '<h3>'. t('Category overview') .'</h3>';