2003-11-18 19:44:36 +00:00
< ? php
2004-09-09 05:51:08 +00:00
// $Id$
2003-11-18 19:44:36 +00:00
2004-07-13 07:21:14 +00:00
/**
* @ file
* Functions that need to be loaded on every Drupal request .
*/
2004-09-16 07:17:56 +00:00
2004-09-15 20:34:35 +00:00
define ( 'CACHE_PERMANENT' , 0 );
define ( 'CACHE_TEMPORARY' , - 1 );
2003-11-18 19:44:36 +00:00
2005-04-11 19:05:52 +00:00
define ( 'CACHE_DISABLED' , 0 );
2006-08-31 18:40:04 +00:00
define ( 'CACHE_NORMAL' , 1 );
define ( 'CACHE_AGGRESSIVE' , 2 );
2005-04-11 19:05:52 +00:00
2005-01-09 09:22:40 +00:00
define ( 'WATCHDOG_NOTICE' , 0 );
define ( 'WATCHDOG_WARNING' , 1 );
define ( 'WATCHDOG_ERROR' , 2 );
2006-06-14 14:01:12 +00:00
define ( 'DRUPAL_BOOTSTRAP_CONFIGURATION' , 0 );
define ( 'DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE' , 1 );
define ( 'DRUPAL_BOOTSTRAP_DATABASE' , 2 );
define ( 'DRUPAL_BOOTSTRAP_SESSION' , 3 );
define ( 'DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE' , 4 );
define ( 'DRUPAL_BOOTSTRAP_PATH' , 5 );
define ( 'DRUPAL_BOOTSTRAP_FULL' , 6 );
2005-07-23 05:57:27 +00:00
2006-08-25 05:42:00 +00:00
// These values should match the 'role' table
2006-01-21 08:28:55 +00:00
define ( 'DRUPAL_ANONYMOUS_RID' , 1 );
define ( 'DRUPAL_AUTHENTICATED_RID' , 2 );
2005-05-12 11:21:35 +00:00
/**
2006-05-07 00:08:36 +00:00
* Start the timer with the specified name . If you start and stop
2005-05-12 11:21:35 +00:00
* the same timer multiple times , the measured intervals will be
* accumulated .
*
* @ param name
* The name of the timer .
*/
function timer_start ( $name ) {
global $timers ;
list ( $usec , $sec ) = explode ( ' ' , microtime ());
$timers [ $name ][ 'start' ] = ( float ) $usec + ( float ) $sec ;
2006-02-27 13:46:01 +00:00
$timers [ $name ][ 'count' ] = isset ( $timers [ $name ][ 'count' ]) ? ++ $timers [ $name ][ 'count' ] : 1 ;
2005-05-12 11:21:35 +00:00
}
/**
* Read the current timer value without stopping the timer .
*
* @ param name
* The name of the timer .
* @ return
* The current timer value in ms .
*/
function timer_read ( $name ) {
global $timers ;
list ( $usec , $sec ) = explode ( ' ' , microtime ());
$stop = ( float ) $usec + ( float ) $sec ;
$diff = round (( $stop - $timers [ $name ][ 'start' ]) * 1000 , 2 );
2006-09-06 06:43:03 +00:00
if ( isset ( $timers [ $name ][ 'time' ])) {
$diff += $timers [ $name ][ 'time' ];
}
return $diff ;
2005-05-12 11:21:35 +00:00
}
/**
* Stop the timer with the specified name .
*
* @ param name
* The name of the timer .
* @ return
2006-05-07 00:08:36 +00:00
* A timer array . The array contains the number of times the
2005-05-12 11:21:35 +00:00
* timer has been started and stopped ( count ) and the accumulated
* timer value in ms ( time ) .
*/
function timer_stop ( $name ) {
global $timers ;
2006-01-23 07:54:08 +00:00
$timers [ $name ][ 'time' ] = timer_read ( $name );
2005-05-12 11:21:35 +00:00
unset ( $timers [ $name ][ 'start' ]);
return $timers [ $name ];
}
2005-01-09 09:22:40 +00:00
2004-07-13 07:21:14 +00:00
/**
2006-04-12 08:42:47 +00:00
* Find the appropriate configuration directory .
2004-07-13 07:21:14 +00:00
*
2005-11-21 21:33:44 +00:00
* Try finding a matching configuration directory by stripping the website ' s
* hostname from left to right and pathname from right to left . The first
2006-08-25 05:42:00 +00:00
* configuration file found will be used ; the remaining will ignored . If no
2005-11-21 21:33:44 +00:00
* configuration file is found , return a default value '$confdir/default' .
2004-11-24 22:44:01 +00:00
*
2005-03-31 21:18:08 +00:00
* Example for a fictitious site installed at
2005-11-21 21:33:44 +00:00
* http :// www . drupal . org : 8080 / mysite / test / the 'settings.php' is searched in
* the following directories :
2004-12-29 19:56:25 +00:00
*
2005-11-21 21:33:44 +00:00
* 1. $confdir / 8080. www . drupal . org . mysite . test
* 2. $confdir / www . drupal . org . mysite . test
* 3. $confdir / drupal . org . mysite . test
* 4. $confdir / org . mysite . test
2004-12-29 19:56:25 +00:00
*
2005-11-21 21:33:44 +00:00
* 5. $confdir / 8080. www . drupal . org . mysite
* 6. $confdir / www . drupal . org . mysite
* 7. $confdir / drupal . org . mysite
* 8. $confdir / org . mysite
2004-12-29 19:56:25 +00:00
*
2005-11-21 21:33:44 +00:00
* 9. $confdir / 8080. www . drupal . org
* 10. $confdir / www . drupal . org
* 11. $confdir / drupal . org
* 12. $confdir / org
2004-12-29 19:56:25 +00:00
*
2005-11-21 21:33:44 +00:00
* 13. $confdir / default
2004-07-13 07:21:14 +00:00
*/
2006-04-12 08:42:47 +00:00
function conf_path () {
2004-11-24 22:44:01 +00:00
static $conf = '' ;
2003-11-18 19:44:36 +00:00
2004-11-24 22:44:01 +00:00
if ( $conf ) {
return $conf ;
}
2003-11-18 19:44:36 +00:00
2004-12-29 19:56:25 +00:00
$confdir = 'sites' ;
2006-04-28 11:52:31 +00:00
$uri = explode ( '/' , $_SERVER [ 'PHP_SELF' ] ? $_SERVER [ 'PHP_SELF' ] : $_SERVER [ 'SCRIPT_FILENAME' ]);
2005-11-21 16:24:41 +00:00
$server = explode ( '.' , implode ( '.' , array_reverse ( explode ( ':' , rtrim ( $_SERVER [ 'HTTP_HOST' ], '.' )))));
2004-11-24 22:44:01 +00:00
for ( $i = count ( $uri ) - 1 ; $i > 0 ; $i -- ) {
for ( $j = count ( $server ); $j > 0 ; $j -- ) {
$dir = implode ( '.' , array_slice ( $server , - $j )) . implode ( '.' , array_slice ( $uri , 0 , $i ));
if ( file_exists ( " $confdir / $dir /settings.php " )) {
$conf = " $confdir / $dir " ;
return $conf ;
}
2003-11-18 19:44:36 +00:00
}
}
2004-11-24 22:44:01 +00:00
$conf = " $confdir /default " ;
return $conf ;
2003-11-18 19:44:36 +00:00
}
2006-04-21 06:39:00 +00:00
/**
* Unsets all disallowed global variables . See $allowed for what ' s allowed .
*/
function drupal_unset_globals () {
if ( ini_get ( 'register_globals' )) {
2006-05-04 09:28:32 +00:00
$allowed = array ( '_ENV' => 1 , '_GET' => 1 , '_POST' => 1 , '_COOKIE' => 1 , '_FILES' => 1 , '_SERVER' => 1 , '_REQUEST' => 1 , 'access_check' => 1 , 'GLOBALS' => 1 );
2006-09-03 07:08:24 +00:00
foreach ( $GLOBALS as $key => $value ) {
2006-04-21 06:39:00 +00:00
if ( ! isset ( $allowed [ $key ])) {
unset ( $GLOBALS [ $key ]);
}
}
}
}
2006-04-12 08:42:47 +00:00
/**
* Loads the configuration and sets the base URL correctly .
*/
function conf_init () {
2006-07-13 13:14:25 +00:00
global $db_url , $db_prefix , $base_url , $base_path , $base_root , $conf , $installed_profile ;
2006-04-12 08:42:47 +00:00
$conf = array ();
2006-07-13 13:14:25 +00:00
include_once './' . conf_path () . '/settings.php' ;
2006-04-12 08:42:47 +00:00
if ( isset ( $base_url )) {
// Parse fixed base URL from settings.php.
$parts = parse_url ( $base_url );
2006-05-02 08:37:42 +00:00
if ( ! isset ( $parts [ 'path' ])) {
$parts [ 'path' ] = '' ;
}
$base_path = $parts [ 'path' ] . '/' ;
2006-04-12 08:42:47 +00:00
// Build $base_root (everything until first slash after "scheme://").
$base_root = substr ( $base_url , 0 , strlen ( $base_url ) - strlen ( $parts [ 'path' ]));
}
else {
// Create base URL
$base_root = ( isset ( $_SERVER [ 'HTTPS' ]) && $_SERVER [ 'HTTPS' ] == 'on' ) ? 'https' : 'http' ;
$base_url = $base_root .= '://' . $_SERVER [ 'HTTP_HOST' ];
if ( $dir = trim ( dirname ( $_SERVER [ 'SCRIPT_NAME' ]), '\,/' )) {
$base_path = " / $dir " ;
$base_url .= $base_path ;
$base_path .= '/' ;
}
else {
$base_path = '/' ;
}
}
}
2004-11-25 06:14:59 +00:00
/**
* Returns and optionally sets the filename for a system item ( module ,
2006-05-07 00:08:36 +00:00
* theme , etc . ) . The filename , whether provided , cached , or retrieved
2004-11-25 06:14:59 +00:00
* from the database , is only returned if the file exists .
*
* @ param $type
* The type of the item ( i . e . theme , theme_engine , module ) .
* @ param $name
* The name of the item for which the filename is requested .
* @ param $filename
* The filename of the item if it is to be set explicitly rather
* than by consulting the database .
2006-08-03 01:02:51 +00:00
* @ param $check_db
* Allows the database search to be skipped ( useful for pre - bootstrap
2006-08-03 07:06:36 +00:00
* checks where configuration paths must still be respected ) .
2004-11-25 06:14:59 +00:00
*
* @ return
* The filename of the requested item .
*/
2006-08-03 01:02:51 +00:00
function drupal_get_filename ( $type , $name , $filename = NULL , $check_db = TRUE ) {
2004-11-25 06:14:59 +00:00
static $files = array ();
2005-10-22 15:14:46 +00:00
if ( ! isset ( $files [ $type ])) {
2004-11-25 06:14:59 +00:00
$files [ $type ] = array ();
}
2005-10-22 15:14:46 +00:00
if ( ! empty ( $filename ) && file_exists ( $filename )) {
2004-11-25 06:14:59 +00:00
$files [ $type ][ $name ] = $filename ;
}
2005-10-22 15:14:46 +00:00
elseif ( isset ( $files [ $type ][ $name ])) {
2004-11-25 06:14:59 +00:00
// nothing
}
2006-08-03 01:02:51 +00:00
elseif ( $check_db && (( $file = db_result ( db_query ( " SELECT filename FROM { system} WHERE name = '%s' AND type = '%s' " , $name , $type ))) && file_exists ( $file ))) {
2004-11-25 06:14:59 +00:00
$files [ $type ][ $name ] = $file ;
}
else {
2006-04-12 20:58:09 +00:00
$config = conf_path ();
2004-11-25 06:14:59 +00:00
$dir = (( $type == 'theme_engine' ) ? 'themes/engines' : " ${ type } s " );
2005-03-16 19:41:12 +00:00
$file = (( $type == 'theme_engine' ) ? " $name .engine " : " $name . $type " );
2004-11-25 06:14:59 +00:00
foreach ( array ( " $config / $dir / $file " , " $config / $dir / $name / $file " , " $dir / $file " , " $dir / $name / $file " ) as $file ) {
if ( file_exists ( $file )) {
$files [ $type ][ $name ] = $file ;
break ;
}
}
}
return $files [ $type ][ $name ];
}
2004-07-13 07:21:14 +00:00
/**
* Load the persistent variable table .
*
* The variable table is composed of values that have been saved in the table
* with variable_set () as well as those explicitly specified in the configuration
* file .
*/
2003-11-18 19:44:36 +00:00
function variable_init ( $conf = array ()) {
2006-08-25 05:42:00 +00:00
// NOTE: caching the variables improves performance by 20% when serving cached pages.
2006-08-30 08:46:17 +00:00
if ( $cached = cache_get ( 'variables' , 'cache' )) {
2004-09-08 18:06:04 +00:00
$variables = unserialize ( $cached -> data );
}
else {
$result = db_query ( 'SELECT * FROM {variable}' );
while ( $variable = db_fetch_object ( $result )) {
$variables [ $variable -> name ] = unserialize ( $variable -> value );
2003-11-18 19:44:36 +00:00
}
2006-08-30 08:46:17 +00:00
cache_set ( 'variables' , 'cache' , serialize ( $variables ));
2004-09-08 18:06:04 +00:00
}
foreach ( $conf as $name => $value ) {
$variables [ $name ] = $value ;
2003-11-18 19:44:36 +00:00
}
2004-09-08 18:06:04 +00:00
return $variables ;
2003-11-18 19:44:36 +00:00
}
2004-07-13 07:21:14 +00:00
/**
* Return a persistent variable .
*
* @ param $name
* The name of the variable to return .
* @ param $default
* The default value to use if this variable has never been set .
* @ return
* The value of the variable .
*/
2003-11-18 19:44:36 +00:00
function variable_get ( $name , $default ) {
global $conf ;
return isset ( $conf [ $name ]) ? $conf [ $name ] : $default ;
}
2004-07-13 07:21:14 +00:00
/**
* Set a persistent variable .
*
* @ param $name
* The name of the variable to set .
* @ param $value
* The value to set . This can be any PHP data type ; these functions take care
* of serialization as necessary .
*/
2003-11-18 19:44:36 +00:00
function variable_set ( $name , $value ) {
global $conf ;
2005-08-29 19:17:17 +00:00
db_lock_table ( 'variable' );
2003-11-18 19:44:36 +00:00
db_query ( " DELETE FROM { variable} WHERE name = '%s' " , $name );
db_query ( " INSERT INTO { variable} (name, value) VALUES ('%s', '%s') " , $name , serialize ( $value ));
2005-08-29 19:17:17 +00:00
db_unlock_tables ();
2005-05-12 11:21:35 +00:00
2006-08-30 08:46:17 +00:00
cache_clear_all ( 'variables' , 'cache' );
2003-11-18 19:44:36 +00:00
$conf [ $name ] = $value ;
}
2004-07-13 07:21:14 +00:00
/**
* Unset a persistent variable .
*
* @ param $name
* The name of the variable to undefine .
*/
2003-11-18 19:44:36 +00:00
function variable_del ( $name ) {
global $conf ;
db_query ( " DELETE FROM { variable} WHERE name = '%s' " , $name );
2006-08-30 08:46:17 +00:00
cache_clear_all ( 'variables' , 'cache' );
2003-11-18 19:44:36 +00:00
unset ( $conf [ $name ]);
}
2004-07-13 07:21:14 +00:00
/**
* Retrieve the current page from the cache .
*
2006-08-25 05:42:00 +00:00
* Note : we do not serve cached pages when status messages are waiting ( from
2004-07-13 07:21:14 +00:00
* a redirected form submission which was completed ) .
* Because the output handler is not activated , the resulting page will not
* get cached either .
*/
2003-11-18 19:44:36 +00:00
function page_get_cache () {
2006-04-12 08:42:47 +00:00
global $user , $base_root ;
2003-11-18 19:44:36 +00:00
$cache = NULL ;
2004-06-30 07:26:02 +00:00
2004-06-28 20:00:53 +00:00
if ( ! $user -> uid && $_SERVER [ 'REQUEST_METHOD' ] == 'GET' && count ( drupal_set_message ()) == 0 ) {
2006-08-30 08:46:17 +00:00
$cache = cache_get ( $base_root . request_uri (), 'cache_page' );
2003-11-18 19:44:36 +00:00
if ( empty ( $cache )) {
ob_start ();
}
}
return $cache ;
}
2004-11-25 06:14:59 +00:00
/**
* Call all init or exit hooks without including all modules .
*
2006-01-05 10:51:47 +00:00
* @ param $hook
2004-11-25 06:14:59 +00:00
* The name of the bootstrap hook we wish to invoke .
*/
2006-01-05 10:51:47 +00:00
function bootstrap_invoke_all ( $hook ) {
2006-06-28 21:18:30 +00:00
foreach ( module_list ( TRUE , TRUE ) as $module ) {
2004-11-25 06:14:59 +00:00
drupal_load ( 'module' , $module );
2006-01-05 10:51:47 +00:00
module_invoke ( $module , $hook );
2004-11-25 06:14:59 +00:00
}
}
/**
2006-05-07 00:08:36 +00:00
* Includes a file with the provided type and name . This prevents
2004-11-25 06:14:59 +00:00
* including a theme , engine , module , etc . , more than once .
*
* @ param $type
* The type of item to load ( i . e . theme , theme_engine , module ) .
* @ param $name
* The name of the item to load .
*
* @ return
* TRUE if the item is loaded or has already been loaded .
*/
function drupal_load ( $type , $name ) {
static $files = array ();
2005-05-14 09:23:47 +00:00
if ( isset ( $files [ $type ][ $name ])) {
2004-11-25 06:14:59 +00:00
return TRUE ;
}
$filename = drupal_get_filename ( $type , $name );
if ( $filename ) {
2005-09-08 19:19:01 +00:00
include_once " ./ $filename " ;
2004-11-25 06:14:59 +00:00
$files [ $type ][ $name ] = TRUE ;
return TRUE ;
}
return FALSE ;
}
2004-07-13 07:21:14 +00:00
/**
* Set HTTP headers in preparation for a page response .
2005-10-09 21:51:43 +00:00
*
2006-08-03 13:42:34 +00:00
* Authenticated users are always given a 'no-cache' header , and will
* fetch a fresh page on every request . This prevents authenticated
* users seeing locally cached pages that show them as logged out .
*
2005-10-09 21:51:43 +00:00
* @ see page_set_cache
2004-07-13 07:21:14 +00:00
*/
2003-11-18 19:44:36 +00:00
function drupal_page_header () {
2006-08-31 18:40:04 +00:00
header ( " Expires: Sun, 19 Nov 1978 05:00:00 GMT " );
header ( " Last-Modified: " . gmdate ( " D, d M Y H:i:s " ) . " GMT " );
header ( " Cache-Control: no-store, no-cache, must-revalidate " );
header ( " Cache-Control: post-check=0, pre-check=0 " , FALSE );
header ( " Pragma: no-cache " );
}
2004-02-15 15:57:55 +00:00
2006-08-31 18:40:04 +00:00
/**
* Set HTTP headers in preparation for a cached page response .
*
* The general approach here is that anonymous users can keep a local
* cache of the page , but must revalidate it on every request . Then ,
* they are given a '304 Not Modified' response as long as they stay
* logged out and the page has not been modified .
*
*/
function drupal_page_cache_header ( $cache ) {
// Set default values:
$last_modified = gmdate ( 'D, d M Y H:i:s' , $cache -> created ) . ' GMT' ;
$etag = '"' . md5 ( $last_modified ) . '"' ;
// See if the client has provided the required HTTP headers:
$if_modified_since = isset ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ]) ? stripslashes ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ]) : FALSE ;
$if_none_match = isset ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ]) ? stripslashes ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ]) : FALSE ;
if ( $if_modified_since && $if_none_match
&& $if_none_match == $etag // etag must match
&& $if_modified_since == $last_modified ) { // if-modified-since must match
header ( 'HTTP/1.1 304 Not Modified' );
// All 304 responses must send an etag if the 200 response for the same object contained an etag
header ( " Etag: $etag " );
exit ();
}
2006-08-03 13:42:34 +00:00
2006-08-31 18:40:04 +00:00
// Send appropriate response:
header ( " Last-Modified: $last_modified " );
header ( " ETag: $etag " );
2006-07-02 19:25:34 +00:00
2006-08-31 18:40:04 +00:00
// The following headers force validation of cache:
header ( " Expires: Sun, 19 Nov 1978 05:00:00 GMT " );
header ( " Cache-Control: must-revalidate " );
2006-07-02 19:25:34 +00:00
2006-08-31 18:40:04 +00:00
// Determine if the browser accepts gzipped data.
if ( @ strpos ( $_SERVER [ 'HTTP_ACCEPT_ENCODING' ], 'gzip' ) === FALSE && function_exists ( 'gzencode' )) {
// Strip the gzip header and run uncompress.
$cache -> data = gzinflate ( substr ( substr ( $cache -> data , 10 ), 0 , - 8 ));
2006-07-02 19:25:34 +00:00
}
2006-08-31 18:40:04 +00:00
elseif ( function_exists ( 'gzencode' )) {
header ( 'Content-Encoding: gzip' );
2003-11-18 19:44:36 +00:00
}
2006-08-31 18:40:04 +00:00
// Send the original request's headers. We send them one after
// another so PHP's header() function can deal with duplicate
// headers.
$headers = explode ( " \n " , $cache -> headers );
foreach ( $headers as $header ) {
header ( $header );
}
print $cache -> data ;
2003-11-18 19:44:36 +00:00
}
2004-07-13 07:21:14 +00:00
/**
* Define the critical hooks that force modules to always be loaded .
*/
2003-11-18 19:44:36 +00:00
function bootstrap_hooks () {
return array ( 'init' , 'exit' );
}
2004-07-13 07:21:14 +00:00
/**
* Unserializes and appends elements from a serialized string .
*
* @ param $obj
* The object to which the elements are appended .
* @ param $field
* The attribute of $obj whose value should be unserialized .
*/
2004-01-13 19:25:37 +00:00
function drupal_unpack ( $obj , $field = 'data' ) {
if ( $obj -> $field && $data = unserialize ( $obj -> $field )) {
foreach ( $data as $key => $value ) {
if ( ! isset ( $obj -> $key )) {
$obj -> $key = $value ;
}
}
}
return $obj ;
}
2004-07-13 07:21:14 +00:00
/**
* Return the URI of the referring page .
*/
2003-11-18 19:44:36 +00:00
function referer_uri () {
2004-06-28 20:00:53 +00:00
if ( isset ( $_SERVER [ 'HTTP_REFERER' ])) {
2005-03-31 09:25:33 +00:00
return $_SERVER [ 'HTTP_REFERER' ];
2003-11-18 19:44:36 +00:00
}
}
2005-11-29 20:37:19 +00:00
/**
* Encode special characters in a plain - text string for display as HTML .
*/
function check_plain ( $text ) {
return htmlspecialchars ( $text , ENT_QUOTES );
}
2004-07-13 07:21:14 +00:00
/**
* Since request_uri () is only available on Apache , we generate an
2005-10-22 15:14:46 +00:00
* equivalent using other environment variables .
2004-07-13 07:21:14 +00:00
*/
2003-11-18 19:44:36 +00:00
function request_uri () {
2004-06-28 20:00:53 +00:00
if ( isset ( $_SERVER [ 'REQUEST_URI' ])) {
$uri = $_SERVER [ 'REQUEST_URI' ];
2003-11-18 19:44:36 +00:00
}
else {
2004-10-12 19:50:12 +00:00
if ( isset ( $_SERVER [ 'argv' ])) {
$uri = $_SERVER [ 'PHP_SELF' ] . '?' . $_SERVER [ 'argv' ][ 0 ];
}
else {
$uri = $_SERVER [ 'PHP_SELF' ] . '?' . $_SERVER [ 'QUERY_STRING' ];
}
2003-11-18 19:44:36 +00:00
}
2004-10-18 18:35:19 +00:00
2005-03-31 09:25:33 +00:00
return $uri ;
2003-11-18 19:44:36 +00:00
}
2003-12-13 14:10:23 +00:00
2004-07-13 07:21:14 +00:00
/**
* Log a system message .
*
* @ param $type
* The category to which this message belongs .
* @ param $message
* The message to store in the log .
2005-01-09 09:22:40 +00:00
* @ param $severity
* The severity of the message . One of the following values :
* - WATCHDOG_NOTICE
* - WATCHDOG_WARNING
* - WATCHDOG_ERROR
2004-07-13 07:21:14 +00:00
* @ param $link
* A link to associate with the message .
*/
2005-01-09 09:22:40 +00:00
function watchdog ( $type , $message , $severity = WATCHDOG_NOTICE , $link = NULL ) {
2006-04-12 08:42:47 +00:00
global $user , $base_root ;
2006-03-26 14:11:38 +00:00
$current_db = db_set_active ();
2006-04-12 08:42:47 +00:00
// Note: log the exact, entire absolute URL.
$request_uri = $base_root . request_uri ();
db_query ( " INSERT INTO { watchdog} (uid, type, message, severity, link, location, referer, hostname, timestamp) VALUES (%d, '%s', '%s', %d, '%s', '%s', '%s', '%s', %d) " , $user -> uid , $type , $message , $severity , $link , $request_uri , referer_uri (), $_SERVER [ 'REMOTE_ADDR' ], time ());
2006-03-26 14:11:38 +00:00
if ( $current_db ) {
db_set_active ( $current_db );
}
2003-12-10 23:09:31 +00:00
}
2004-07-13 07:21:14 +00:00
/**
2005-05-14 18:32:22 +00:00
* Set a message which reflects the status of the performed operation .
2004-07-13 07:21:14 +00:00
*
2005-05-14 18:32:22 +00:00
* If the function is called with no arguments , this function returns all set
* messages without clearing them .
2004-07-13 07:21:14 +00:00
*
2005-05-14 18:32:22 +00:00
* @ param $message
* The message should begin with a capital letter and always ends with a
* period '.' .
* @ param $type
* The type of the message . One of the following values are possible :
* - 'status'
* - 'error'
2004-07-13 07:21:14 +00:00
*/
function drupal_set_message ( $message = NULL , $type = 'status' ) {
2006-02-10 05:42:11 +00:00
if ( $message ) {
2004-07-08 16:04:07 +00:00
if ( ! isset ( $_SESSION [ 'messages' ])) {
$_SESSION [ 'messages' ] = array ();
}
if ( ! isset ( $_SESSION [ 'messages' ][ $type ])) {
$_SESSION [ 'messages' ][ $type ] = array ();
}
$_SESSION [ 'messages' ][ $type ][] = $message ;
2004-06-28 20:00:53 +00:00
}
2005-10-22 15:14:46 +00:00
// messages not set when DB connection fails
return isset ( $_SESSION [ 'messages' ]) ? $_SESSION [ 'messages' ] : NULL ;
2004-06-28 20:00:53 +00:00
}
2004-07-13 07:21:14 +00:00
/**
* Return all messages that have been set .
*
2006-07-13 13:14:25 +00:00
* @ param $type
* ( optional ) Only return messages of this type .
2004-07-13 07:21:14 +00:00
*/
2006-07-13 13:14:25 +00:00
function drupal_get_messages ( $type = NULL ) {
2006-04-01 14:53:03 +00:00
if ( $messages = drupal_set_message ()) {
2006-07-13 13:14:25 +00:00
if ( $type ) {
unset ( $_SESSION [ 'messages' ][ $type ]);
return array ( $type => $messages [ $type ]);
}
else {
unset ( $_SESSION [ 'messages' ]);
return $messages ;
}
2006-04-01 14:53:03 +00:00
}
2006-07-13 13:14:25 +00:00
return array ();
2004-06-28 20:00:53 +00:00
}
2005-06-07 18:54:37 +00:00
/**
2006-08-29 08:36:14 +00:00
* Perform an access check for a given mask and rule type . Rules are usually
* created via admin / user / rules page .
*
* If any allow rule matches , access is allowed . Otherwise , if any deny rule
* matches , access is denied . If no rule matches , access is allowed .
*
* @ param $type string
* Type of access to check : Allowed values are :
* - 'host' : host name or IP address
* - 'mail' : e - mail address
* - 'user' : username
* @ param $mask string
* String or mask to test : '_' matches any character , '%' matches any
* number of characters .
* @ return bool
* TRUE if access is denied , FALSE if access is allowed .
2005-06-07 18:54:37 +00:00
*/
2005-06-21 18:21:08 +00:00
function drupal_is_denied ( $type , $mask ) {
2006-08-29 08:36:14 +00:00
// Because this function is called for every page request, both cached
// and non-cached pages, we tried to optimize it as much as possible.
// We deny access if the only matching records in the {access} table have
// status 0. If any have status 1, or if there are no matching records,
// we allow access. So, select matching records in decreasing order of
// 'status', returning NOT(status) for the first. If any have status 1,
// they come first, and we return NOT(status) = 0 (allowed). Otherwise,
// if we have some with status 0, we return 1 (denied). If no matching
// records, we get no return from db_result, so we return (bool)NULL = 0
// (allowed).
// The use of ORDER BY / LIMIT is more efficient than "MAX(status) = 0"
// in PostgreSQL <= 8.0.
return ( bool ) db_result ( db_query_range ( " SELECT NOT(status) FROM { access} WHERE type = '%s' AND LOWER('%s') LIKE LOWER(mask) ORDER BY status DESC " , $type , $mask , 0 , 1 ));
2005-06-07 18:54:37 +00:00
}
2006-08-16 13:13:34 +00:00
/**
2006-08-25 05:42:00 +00:00
* Generates a default anonymous $user object .
2006-08-16 13:13:34 +00:00
*
* @ return Object - the user object .
*/
2006-08-18 19:24:52 +00:00
function drupal_anonymous_user ( $session = '' ) {
2006-08-16 13:13:34 +00:00
$user = new stdClass ();
$user -> uid = 0 ;
$user -> hostname = $_SERVER [ 'REMOTE_ADDR' ];
$user -> roles = array ();
$user -> roles [ DRUPAL_ANONYMOUS_RID ] = 'anonymous user' ;
2006-08-18 19:24:52 +00:00
$user -> session = $session ;
2006-08-16 13:13:34 +00:00
return $user ;
}
2005-06-22 20:19:58 +00:00
/**
* A string describing a phase of Drupal to load . Each phase adds to the
* previous one , so invoking a later phase automatically runs the earlier
2006-08-25 05:42:00 +00:00
* phases too . The most important usage is that if you want to access the
2005-06-22 20:19:58 +00:00
* Drupal database from a script without loading anything else , you can
2005-07-23 05:57:27 +00:00
* include bootstrap . inc , and call drupal_bootstrap ( DRUPAL_BOOTSTRAP_DATABASE ) .
2005-06-22 20:19:58 +00:00
*
* @ param $phase
2005-07-23 05:57:27 +00:00
* A constant . Allowed values are :
2006-08-25 05:42:00 +00:00
* DRUPAL_BOOTSTRAP_CONFIGURATION : initialize configuration .
* DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE : try to call a non - database cache fetch routine .
2005-07-23 05:57:27 +00:00
* DRUPAL_BOOTSTRAP_DATABASE : initialize database layer .
* DRUPAL_BOOTSTRAP_SESSION : initialize session handling .
2006-06-14 14:01:12 +00:00
* DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE : load bootstrap . inc and module . inc , start
2005-07-23 05:57:27 +00:00
* the variable system and try to serve a page from the cache .
2006-08-25 05:42:00 +00:00
* DRUPAL_BOOTSTRAP_FULL : Drupal is fully loaded , validate and fix input data .
2005-06-22 20:19:58 +00:00
*/
function drupal_bootstrap ( $phase ) {
2006-06-14 14:01:12 +00:00
static $phases = array ( DRUPAL_BOOTSTRAP_CONFIGURATION , DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE , DRUPAL_BOOTSTRAP_DATABASE , DRUPAL_BOOTSTRAP_SESSION , DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE , DRUPAL_BOOTSTRAP_PATH , DRUPAL_BOOTSTRAP_FULL );
2005-06-22 20:19:58 +00:00
2005-07-23 05:57:27 +00:00
while ( ! is_null ( $current_phase = array_shift ( $phases ))) {
2005-06-22 20:19:58 +00:00
_drupal_bootstrap ( $current_phase );
if ( $phase == $current_phase ) {
return ;
}
}
}
2005-06-07 18:54:37 +00:00
2005-06-22 20:19:58 +00:00
function _drupal_bootstrap ( $phase ) {
global $conf ;
2003-11-18 19:44:36 +00:00
2005-06-22 20:19:58 +00:00
switch ( $phase ) {
2006-08-31 18:40:04 +00:00
2006-06-14 14:01:12 +00:00
case DRUPAL_BOOTSTRAP_CONFIGURATION :
2006-04-21 06:39:00 +00:00
drupal_unset_globals ();
2006-04-12 08:42:47 +00:00
// Initialize the configuration
conf_init ();
2006-06-14 14:01:12 +00:00
break ;
2006-08-31 18:40:04 +00:00
2006-06-14 14:01:12 +00:00
case DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE :
2006-08-31 18:40:04 +00:00
_drupal_cache_init ( $phase );
2006-06-14 14:01:12 +00:00
break ;
2006-08-31 18:40:04 +00:00
2006-06-14 14:01:12 +00:00
case DRUPAL_BOOTSTRAP_DATABASE :
2005-06-22 20:19:58 +00:00
// Initialize the default database.
2006-04-12 08:42:47 +00:00
require_once './includes/database.inc' ;
2005-06-22 20:19:58 +00:00
db_set_active ();
break ;
2005-07-23 05:57:27 +00:00
case DRUPAL_BOOTSTRAP_SESSION :
2005-06-22 20:19:58 +00:00
require_once './includes/session.inc' ;
session_set_save_handler ( " sess_open " , " sess_close " , " sess_read " , " sess_write " , " sess_destroy " , " sess_gc " );
session_start ();
break ;
2005-07-23 05:57:27 +00:00
2006-06-14 14:01:12 +00:00
case DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE :
2006-08-31 18:40:04 +00:00
// Initialize configuration variables, using values from settings.php if available.
$conf = variable_init ( isset ( $conf ) ? $conf : array ());
_drupal_cache_init ( $phase );
2005-06-22 20:19:58 +00:00
// deny access to hosts which were banned. t() is not yet available.
if ( drupal_is_denied ( 'host' , $_SERVER [ 'REMOTE_ADDR' ])) {
header ( 'HTTP/1.0 403 Forbidden' );
2005-10-22 15:14:46 +00:00
print 'Sorry, ' . $_SERVER [ 'REMOTE_ADDR' ] . ' has been banned.' ;
2005-06-22 20:19:58 +00:00
exit ();
}
2005-06-07 18:54:37 +00:00
2006-08-31 18:40:04 +00:00
// Start a page timer:
timer_start ( 'page' );
2005-06-22 20:19:58 +00:00
drupal_page_header ();
break ;
2005-07-23 05:57:27 +00:00
2006-01-23 07:54:08 +00:00
case DRUPAL_BOOTSTRAP_PATH :
require_once './includes/path.inc' ;
// Initialize $_GET['q'] prior to loading modules and invoking hook_init().
drupal_init_path ();
break ;
2005-07-23 05:57:27 +00:00
case DRUPAL_BOOTSTRAP_FULL :
2005-06-22 20:19:58 +00:00
require_once './includes/common.inc' ;
_drupal_bootstrap_full ();
break ;
}
2005-06-07 18:54:37 +00:00
}
2006-08-31 18:40:04 +00:00
/**
* Initialize the caching strategy , which loads at different stages within
* Drupal ' s bootstrap process .
*/
function _drupal_cache_init ( $phase ) {
require_once variable_get ( 'cache_inc' , './includes/cache.inc' );
if ( $phase == DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE && variable_get ( 'page_cache_fastpath' , 0 )) {
if ( page_cache_fastpath ()) {
exit ();
}
}
elseif ( $phase == DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE ) {
if ( $cache = page_get_cache ()) {
if ( variable_get ( 'cache' , CACHE_DISABLED ) == CACHE_AGGRESSIVE ) {
drupal_page_cache_header ( $cache );
exit ();
}
elseif ( variable_get ( 'cache' , CACHE_DISABLED ) == CACHE_NORMAL ) {
require_once './includes/module.inc' ;
bootstrap_invoke_all ( 'init' );
drupal_page_cache_header ( $cache );
bootstrap_invoke_all ( 'exit' );
exit ();
}
}
require_once './includes/module.inc' ;
}
}
2005-07-27 01:58:43 +00:00
/**
* Enables use of the theme system without requiring database access . Since
* there is not database access no theme will be enabled and the default
2006-04-11 11:33:15 +00:00
* themeable functions will be called . Some themeable functions can not be used
2005-07-27 01:58:43 +00:00
* without the full Drupal API loaded . For example , theme_page () is
* unavailable and theme_maintenance_page () must be used in its place .
*/
function drupal_maintenance_theme () {
global $theme ;
2006-01-24 18:18:41 +00:00
require_once './includes/path.inc' ;
2005-07-27 01:58:43 +00:00
require_once './includes/theme.inc' ;
require_once './includes/common.inc' ;
require_once './includes/unicode.inc' ;
2006-08-30 08:03:15 +00:00
require_once './modules/filter/filter.module' ;
2005-07-27 01:58:43 +00:00
unicode_check ();
2006-08-15 05:16:23 +00:00
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/defaults.css' , 'core' );
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/system.css' , 'core' );
2005-07-27 01:58:43 +00:00
$theme = '' ;
}
2006-09-01 08:44:53 +00:00
/**
* Return the name of the localisation function . Use in code that needs to
* run both during installation and normal operation .
*/
function get_t () {
static $t ;
if ( is_null ( $t )) {
$t = function_exists ( 'install_main' ) ? 'st' : 't' ;
}
return $t ;
}