summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2004-09-08 15:38:26 +0000
committerDries Buytaert <dries@buytaert.net>2004-09-08 15:38:26 +0000
commit7b716e8e770faa6c85a4123db729505bb251df27 (patch)
treec82f8a297bf8a76172e1d71892c4507c3606bad2 /includes
parente1d7609710db3bd984ab8c8b1e78469e07f4f135 (diff)
downloadbrdo-7b716e8e770faa6c85a4123db729505bb251df27.tar.gz
brdo-7b716e8e770faa6c85a4123db729505bb251df27.tar.bz2
- Patch #10622 by Adrian: fixes various PostgreSQL related problems.
1) Menu problems with Postgres (this is a highly critical 1 line fix) 2) Archive module fails with Postgres 3) Postgres setup problems - changes to database.pgsql (although i made these changes myself before finding this patch) 4) Book module fails with Postgres 5) Postgres problems following creation of a new type of user - which is actually about a taxonomy.module bug. 6) Creating accregator_item_table in PostgreSQL 7) Postgres - Polls not displayed on Poll Page 8) Blog module has sql errors with postgres This should not affect MySQL users (hopefully).
Diffstat (limited to 'includes')
-rw-r--r--includes/bootstrap.inc10
-rw-r--r--includes/database.inc2
-rw-r--r--includes/database.mysql.inc24
-rw-r--r--includes/database.pgsql.inc285
-rw-r--r--includes/locale.inc2
5 files changed, 317 insertions, 6 deletions
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 94c1b077f..7bfcaa91f 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -121,10 +121,12 @@ function cache_get($key) {
* A string containing HTTP header information for cached pages.
*/
function cache_set($cid, $data, $expire = 0, $headers = NULL) {
- db_query("UPDATE {cache} SET data = '%s', created = %d, expire = %d, headers = '%s' WHERE cid = '%s'", $data, time(), $expire, $headers, $cid);
+ $data = db_encode_blob($data);
+
+ db_query("UPDATE {cache} SET data = '$data', created = " . time() . ", expire = $expire, headers = '$headers' WHERE cid = '$cid'");
if (!db_affected_rows()) {
- db_query("INSERT INTO {cache} (cid, data, created, expire, headers) VALUES('%s', '%s', %d, %d, '%s')", $cid, $data, time(), $expire, $headers);
- }
+ db_query("INSERT INTO {cache} (cid, data, created, expire, headers) VALUES('$cid', '$data', " . time() . ", $expire, '$headers')");
+ }
}
/**
@@ -250,7 +252,7 @@ function drupal_page_header() {
header($header);
}
- print $cache->data;
+ print db_decode_blob($cache->data);
// Call all init() and exit() hooks without including all modules.
// Only use those hooks for critical operations.
diff --git a/includes/database.inc b/includes/database.inc
index b0e98fcdf..ddfaf5d4c 100644
--- a/includes/database.inc
+++ b/includes/database.inc
@@ -108,7 +108,7 @@ function db_set_active($name = 'default') {
include_once 'includes/database.mysql.inc';
}
else {
- include_once 'includes/database.pear.inc';
+ include_once 'includes/database.pgsql.inc';
}
$db_conns[$name] = db_connect($connect_url);
diff --git a/includes/database.mysql.inc b/includes/database.mysql.inc
index 698ec1ce3..ff0919fdc 100644
--- a/includes/database.mysql.inc
+++ b/includes/database.mysql.inc
@@ -262,6 +262,30 @@ function db_query_range($query) {
}
/**
+ * Returns a properly formatted Binary Large OBject value.
+ *
+ * @param $data
+ * Data to encode.
+ * @return
+ * Encoded data.
+ */
+function db_encode_blob($data) {
+ return $data;
+}
+
+/**
+ * Returns text from a Binary Large OBject value.
+ *
+ * @param $data
+ * Data to decode.
+ * @return
+ * Decoded data.
+ */
+function db_decode_blob($data) {
+ return $data;
+}
+
+/**
* @} end of addtogroup database
*/
diff --git a/includes/database.pgsql.inc b/includes/database.pgsql.inc
new file mode 100644
index 000000000..9ea863d51
--- /dev/null
+++ b/includes/database.pgsql.inc
@@ -0,0 +1,285 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Database interface code for postgresql database servers.
+ */
+
+/**
+ * @addtogroup database
+ * @{
+ */
+
+/**
+ * Initialize a database connection.
+ *
+ * Note that you can change the pg_connect() call to pg_pconnect() if you
+ * want to use persistent connections. This is not recommended on shared hosts,
+ * and might require additional database/webserver tuning. It can increase
+ * performance, however, when the overhead to connect to your database is high
+ * (e.g. your database and web server live on different machines).
+ */
+function db_connect($url) {
+ $url = parse_url($url);
+
+ $conn_string = ' user='. $url['user'] .' dbname='. substr($url['path'], 1) .' password='. $url['pass'];
+ $connection = pg_connect($conn_string) or die(pg_last_error());
+
+ return $connection;
+}
+
+/**
+ * Runs a basic query in the active database.
+ *
+ * User-supplied arguments to the query should be passed in as separate parameters
+ * so that they can be properly escaped to avoid SQL injection attacks.
+ *
+ * @param $query
+ * A string containing an SQL query.
+ * @param ...
+ * A variable number of arguments which are substituted into the query using
+ * printf() syntax.
+ * @return
+ * A database query result resource, or FALSE if the query was not executed
+ * correctly.
+ */
+function db_query($query) {
+ $args = func_get_args();
+
+ $query = db_prefix_tables($query);
+ if (count($args) > 1) {
+ if(is_array($args[1])){
+ $args1 = array_map('check_query', $args[1]);
+ $nargs = array_merge(array($query), $args1);
+ }
+ else {
+ $nargs = array_map('check_query', $args);
+ $nargs[0] = $query;
+ }
+ return _db_query(call_user_func_array('sprintf', $nargs));
+ }
+ else {
+ return _db_query($query);
+ }
+}
+
+/**
+ * Debugging version of db_query().
+ *
+ * Echoes the query to the browser.
+ */
+function db_queryd($query) {
+ $args = func_get_args();
+ $query = db_prefix_tables($query);
+ if (count($args) > 1) {
+ if(is_array($args[1])){
+ $args1 = array_map('check_query', $args[1]);
+ $nargs = array_merge(array($query), $args1);
+ }
+ else {
+ $nargs = array_map('check_query', $args);
+ $nargs[0] = $query;
+ }
+ return _db_query(call_user_func_array('sprintf', $nargs), 1);
+ }
+ else {
+ return _db_query($query, 1);
+ }
+}
+
+/**
+ * Helper function for db_query().
+ */
+function _db_query($query, $debug = 0) {
+ global $active_db, $last_result;
+ global $queries;
+
+ if (variable_get('dev_query', 0)) {
+ list($usec, $sec) = explode(' ', microtime());
+ $timer = (float)$usec + (float)$sec;
+ }
+
+ $last_result = pg_query($active_db, $query);
+
+ if (variable_get('dev_query', 0)) {
+ list($usec, $sec) = explode(' ', microtime());
+ $stop = (float)$usec + (float)$sec;
+ $diff = $stop - $timer;
+ $queries[] = array($query, $diff);
+ }
+
+ if ($debug) {
+ print '<p>query: '. $query .'<br />error:'. pg_last_error() .'</p>';
+ }
+
+ if ($last_result !== FALSE) {
+ return $last_result;
+ }
+ else {
+ trigger_error(pg_last_error() ."\nquery: ". htmlspecialchars($query), E_USER_ERROR);
+ }
+}
+
+/**
+ * Fetch one result row from the previous query as an object.
+ *
+ * @param $result
+ * A database query result resource, as returned from db_query().
+ * @return
+ * An object representing the next row of the result. The attributes of this
+ * object are the table fields selected by the query.
+ */
+function db_fetch_object($result) {
+ if ($result) {
+ return pg_fetch_object($result);
+ }
+}
+
+/**
+ * Fetch one result row from the previous query as an array.
+ *
+ * @param $result
+ * A database query result resource, as returned from db_query().
+ * @return
+ * An associative array representing the next row of the result. The keys of
+ * this object are the names of the table fields selected by the query, and
+ * the values are the field values for this result row.
+ */
+function db_fetch_array($result) {
+ if ($result) {
+ return pg_fetch_assoc($result);
+ }
+}
+
+/**
+ * Determine how many result rows were found by the preceding query.
+ *
+ * @param $result
+ * A database query result resource, as returned from db_query().
+ * @return
+ * The number of result rows.
+ */
+function db_num_rows($result) {
+ if ($result) {
+ return pg_num_rows($result);
+ }
+}
+
+/**
+ * Return an individual result field from the previous query.
+ *
+ * Only use this function if exactly one field is being selected; otherwise,
+ * use db_fetch_object() or db_fetch_array().
+ *
+ * @param $result
+ * A database query result resource, as returned from db_query().
+ * @param $row
+ * The index of the row whose result is needed.
+ * @return
+ * The resulting field.
+ */
+function db_result($result, $row = 0) {
+ if ($result && pg_num_rows($result) > $row) {
+ $res = pg_fetch_row($result, $row);
+
+ return $res[0];
+ }
+}
+
+/**
+ * Determine whether the previous query caused an error.
+ */
+function db_error() {
+ return pg_last_error();
+}
+
+/**
+ * Return a new unique ID in the given sequence.
+ *
+ * For compatibility reasons, Drupal does not use auto-numbered fields in its
+ * database tables. Instead, this function is used to return a new unique ID
+ * of the type requested. If necessary, a new sequence with the given name
+ * will be created.
+ */
+function db_next_id($name) {
+ $id = db_result(db_query("SELECT nextval('public.%s_seq')", db_prefix_tables($name)));
+ return $id;
+}
+
+/**
+ * Determine the number of rows changed by the preceding query.
+ */
+function db_affected_rows() {
+ global $last_result;
+ return pg_affected_rows($last_result);
+}
+
+/**
+ * Runs a limited-range query in the active database.
+ *
+ * Use this as a substitute for db_query() when a subset of the query is to be
+ * returned.
+ * User-supplied arguments to the query should be passed in as separate parameters
+ * so that they can be properly escaped to avoid SQL injection attacks.
+ *
+ * @param $query
+ * A string containing an SQL query.
+ * @param ...
+ * A variable number of arguments which are substituted into the query using
+ * printf() syntax.
+ * @param $from
+ * The first result row to return.
+ * @param $count
+ * The maximum number of result rows to return.
+ * @return
+ * A database query result resource, or FALSE if the query was not executed
+ * correctly.
+ */
+function db_query_range($query) {
+ $args = func_get_args();
+ $count = array_pop($args);
+ $from = array_pop($args);
+ if (count(func_get_args()) > 3) {
+ $args = array_map('check_query', $args);
+ $query = db_prefix_tables($query);
+ $args[0] = $query;
+ $query = call_user_func_array('sprintf', $args);
+ }
+ else {
+ $query = func_get_arg(0);
+ $query = db_prefix_tables($query);
+ }
+ $query .= ' LIMIT '. $count .' OFFSET '. $from;
+ return _db_query($query);
+}
+
+/**
+ * Returns a properly formatted Binary Large OBject value.
+ *
+ * @param $data
+ * Data to encode.
+ * @return
+ * Encoded data.
+ */
+function db_encode_blob($data) {
+ return pg_escape_bytea($data);
+}
+
+/**
+ * Returns text from a Binary Large OBject value.
+ *
+ * @param $data
+ * Data to decode.
+ * @return
+ * Decoded data.
+ */
+function db_decode_blob($data) {
+ return stripcslashes($data);
+}
+
+/**
+ * @} end of addtogroup database
+ */
+
+?>
diff --git a/includes/locale.inc b/includes/locale.inc
index 4bc4b4af2..8b9aa5c20 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -123,7 +123,7 @@ function _locale_import_po($file, $lang, $mode) {
// If not in 'safe mode', increase the maximum execution time:
if (!ini_get('safe_mode')) {
set_time_limit(240);
- }
+ }
// Check if we have the language already in the database
if (!db_fetch_object(db_query("SELECT locale FROM {locales_meta} WHERE locale = '%s'", $lang))) {