diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/bootstrap.inc | 10 | ||||
-rw-r--r-- | includes/database.inc | 2 | ||||
-rw-r--r-- | includes/database.mysql.inc | 24 | ||||
-rw-r--r-- | includes/database.pgsql.inc | 285 | ||||
-rw-r--r-- | includes/locale.inc | 2 |
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))) { |