home *** CD-ROM | disk | FTP | other *** search
- <?php
- // $Id: database.pgsql.inc,v 1.6.2.1 2005/04/08 11:24:25 dries Exp $
-
- /**
- * @file
- * Database interface code for PostgreSQL database servers.
- */
-
- /**
- * @ingroup 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'] . ' host=' . $url['host'];
- $conn_string .= isset($url['port']) ? ' port=' . $url['port'] : '';
- $connection = pg_connect($conn_string) or die(pg_last_error());
-
- return $connection;
- }
-
- /**
- * 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('%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. Instead of a variable number of query arguments, you may
- * also pass a single array containing the query arguments.
- * @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);
-
- $query = db_prefix_tables($query);
- if (count(func_get_args()) > 3) {
- // Check for array (alternative syntax).
- if (is_array($args[1])) {
- $args = array_merge(array($query), $args[1]);
- }
- $args = array_map('db_escape_string', $args);
- $args[0] = $query;
- $query = call_user_func_array('sprintf', $args);
- }
- $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 addcslashes($data, "\0..\37\\");
- }
-
- /**
- * Returns text from a Binary Large OBject value.
- *
- * @param $data
- * Data to decode.
- * @return
- * Decoded data.
- */
- function db_decode_blob($data) {
- return stripcslashes($data);
- }
-
- /**
- * Prepare user input for use in a database query, preventing SQL injection attacks.
- * Note: This function requires PostgreSQL 7.2 or later.
- */
- function db_escape_string($text) {
- return pg_escape_string($text);
- }
-
- /**
- * @} End of "ingroup database".
- */
-
- ?>
-