";
}
}
function watchdog($type, $message) {
global $user;
db_query("INSERT INTO watchdog (uid, type, message, location, hostname, timestamp) VALUES ('$user->uid', '%s', '%s', '%s', '%s', '%s')", $type, $message, request_uri(), getenv("REMOTE_ADDR"), time());
}
function throttle($type, $rate) {
if (!user_access("access administration pages")) {
if ($throttle = db_fetch_object(db_query("SELECT * FROM watchdog WHERE type = '$type' AND hostname = '". getenv("REMOTE_ADDR") ."' AND ". time() ." - timestamp < $rate"))) {
watchdog("warning", "throttle: '". getenv("REMOTE_ADDR") ."' exceeded submission rate - $throttle->type");
die(message_throttle());
}
else {
watchdog($type, "throttle");
}
}
}
function array2object($node) {
if (is_array($node)) {
foreach ($node as $key => $value) {
$object->$key = $value;
}
}
else {
$object = $node;
}
return $object;
}
function object2array($node) {
if (is_object($node)) {
foreach ($node as $key => $value) {
$array[$key] = $value;
}
}
else {
$array = $node;
}
return $array;
}
function path_uri($brief = 0) {
global $HTTP_HOST;
$path = $HTTP_HOST . substr(request_uri(), 0, strrpos(request_uri(), "/")) ."/";
if (!$brief) {
$path = "http://". $path;
}
return $path;
}
function request_uri() {
// since request_uri() is only available on apache, we generate equivalent using other environment vars.
global $REQUEST_URI, $PATH_INFO, $QUERY_STRING;
if ($REQUEST_URI) {
return $REQUEST_URI;
}
else {
return $PATH_INFO ."?". $QUERY_STRING;
}
}
function message_access() {
return t("You are not authorized to access to this page.");
}
function message_na() {
return t("n/a");
}
function message_throttle() {
return t("You exceeded the maximum submission rate. Please wait a few minutes and try again.");
}
function locale_init() {
global $languages, $user;
return ($languages ? (($user->uid && $user->language) ? $user->language : key($languages)) : 0);
}
function t($string, $args = 0) {
global $languages;
/*
** About the usage of t(). We try to keep strings whole as much as
** possible and are unafraid of HTML markup within translation strings
** if necessary. The suggested syntax for a link embedded within a
** translation string is for example:
**
** $msg = t("You must login below or create a new
** account before viewing the next page.", array ("%url"
** => drupal_url(array ("mod" => "user", "op" => "register"),
** "module")));
*/
$string = ($languages && function_exists("locale") ? locale($string) : $string);
if (!$args) {
return $string;
}
else {
return strtr($string, $args);
}
}
function variable_init($conf = array()) {
$result = db_query("SELECT * FROM variable");
while ($variable = db_fetch_object($result)) {
if (!isset($conf[$variable->name])) {
$conf[$variable->name] = unserialize($variable->value);
}
}
return $conf;
}
function variable_get($name, $default, $object = 0) {
global $conf;
return isset($conf[$name]) ? $conf[$name] : $default;
}
function variable_set($name, $value) {
global $conf;
db_query("DELETE FROM variable WHERE name = '%s'", $name);
db_query("INSERT INTO variable (name, value) VALUES ('%s', '%s')", $name, serialize($value));
$conf[$name] = $value;
}
function variable_del($name) {
global $conf;
db_query("DELETE FROM variable WHERE name = '%s'", $name);
unset($conf[$name]);
}
/**
* Format a single result entry of a search query:
*
* @param $item a single search result as returned by _search of type
* array("count" => ..., "link" => ..., "title" => ...,
* "user" => ..., "date" => ..., "keywords" => ...)
* @param $type module type of this item
*/
function search_item($item, $type) {
/*
** Modules may implement the "search_item" hook in order to overwrite
** the default function to display search results.
*/
if (module_hook($type, "search_item")) {
$output = module_invoke($type, "search_item", $item);
}
else {
$output .= " ". $item["count"] ." ". $item["title"] ." ";
$output .= " $type ". ($item["user"] ? " - ". $item["user"] : "") ."". ($item["date"] ? " - ". format_date($item["date"], "small") : "") ."";
$output .= "
";
}
return $output;
}
/**
* Render a generic search form.
*
* "Generic" means "universal usable" - that is, usable not only from
* module.php?mod=search, but also as a simple seach box (without
* "Restrict search to", help text, etc) from theme's header etc.
* This means: provide options to only conditionally render certain
* parts of this form.
*
* @param $action Form action. Defaults to module.php?mod=search.
* @param $query Query string. Defaults to global $keys.
* @param $options != 0: Render additional form fields/text
* ("Restrict search to", help text, etc).
*/
function search_form($action = 0, $query = 0, $options = 0) {
global $keys;
if (!$action) {
$action = drupal_url(array("mod" => "search"), "module");
}
if (!$query) {
$query = $keys;
}
$output .= " ";
$output .= " \n";
if ($options != 0) {
$output .= " ";
$output .= t("Restrict search to") .": ";
foreach (module_list() as $name) {
if (module_hook($name, "search")) {
$output .= " ". t($name);
}
}
// TODO: (link to) search hints
}
$form .= " ";
return form($output, "post", $action);
}
/*
* Collect the search results:
*/
function search_data() {
global $keys, $edit;
$keys = check_input($keys);
if ($keys) {
foreach (module_list() as $name) {
if (module_hook($name, "search") && (!$edit["type"] || $edit["type"][$name]) && ($result = module_invoke($name, "search", check_query($keys)))) {
if ($name == "node" || $name == "comment") {
$output .= "
". t("Matching ". $name ."s ranked in order of relevance") .":
";
}
else {
$output .= "
". t("Matching ". $name ."s") .":
";
}
foreach ($result as $entry) {
$output .= search_item($entry, $name);
}
}
}
if (!$output) {
$output .= t("Your search yielded no results.");
}
}
return $output;
}
/**
* Display the search form and the resulting data.
*
* @param $type If set, search only nodes of this type.
* Otherwise, search all types.
* @param $action Form action. Defaults to module.php?mod=search.
* @param $query Query string. Defaults to global $keys.
* @param $options != 0: Render additional form fields/text
* ("Restrict search to", help text, etc).
*/
function search_type($type = 0, $action = 0, $query = 0, $options = 0) {
global $edit;
if ($type) {
$edit["type"][$type] = "on";
}
return search_form($action, $query, $options) . search_data();
}
function drupal_goto($url) {
/*
** Translate & to simply &
*/
$url = str_replace ("&", "&", $url);
/*
** It is advised to use "drupal_goto()" instead of PHP's "header()" as
** "drupal_goto()" will append the user's session ID to the URI when PHP
** is compiled with "--enable-trans-sid".
*/
if (ini_get("session.use_trans_sid")) {
$sid = session_name() . "=" . session_id();
}
if (!session_id() || strstr($url, $sid)) {
header("Location: $url");
}
else if (strstr($url, "?") && !strstr($url, $sid)) {
header("Location: $url&". $sid);
}
else {
header("Location: $url?". $sid);
}
/*
** The "Location" header sends a REDIRECT status code to the http
** deamon. In some cases this can go wrong, so we make sure none
** of the code /below/ gets executed when we redirect.
*/
exit();
}
/*
** Stores the referer in a persistent variable:
*/
function referer_save() {
global $referer, $HTTP_REFERER;
if (!strstr($HTTP_REFERER, request_uri())) {
$referer = $HTTP_REFERER;
session_register("referer");
}
}
/*
** Restores the referer from a persistent variable:
*/
function referer_load() {
global $referer;
if (session_is_registered("referer")) {
return $referer;
}
else {
return 0;
}
}
function check_form($text) {
return htmlspecialchars(stripslashes($text));
}
function check_export($text) {
return htmlspecialchars(stripslashes($text));
}
function check_code($text) {
return $text;
}
function check_preview($text) {
return check_output(check_input($text));
}
function check_query($text) {
return addslashes(stripslashes($text));
}
function filter($text) {
foreach (module_list() as $name) {
if (module_hook($name, "filter")) {
$text = module_invoke($name, "filter", $text);
}
}
return $text;
}
function check_input($text) {
return check_query($text);
}
function check_output($text, $nl2br = 0) {
return ($text) ? ($nl2br ? str_replace("\r", "", str_replace("\n", " ", stripslashes($text))) : stripslashes($text)) : message_na();
}
function check_file($filename) {
if (is_uploaded_file($filename)) {
return 1;
}
else {
return 0;
}
}
function format_rss_channel($title, $link, $description, $items, $language = "en", $args = array()) {
// arbitrary elements may be added using the $args associative array
$output .= "\n";
$output .= " ". htmlentities(strip_tags($title)) ."\n";
$output .= " ". htmlentities(strip_tags($link)) ."\n";
$output .= " ". htmlentities($description) ."\n";
$output .= " ". htmlentities(strip_tags($language)) ."\n";
foreach ($args as $key => $value) {
$output .= "<$key>". htmlentities(strip_tags($value)) ."$key>";
}
$output .= $items;
$output .= "\n";
return $output;
}
function format_rss_item($title, $link, $description, $args = array()) {
// arbitrary elements may be added using the $args associative array
$output .= "\n";
$output .= " ". htmlentities(strip_tags($title)) ."\n";
$output .= " ". htmlentities(strip_tags($link)) ."\n";
$output .= " ". htmlentities($description) ."\n";
foreach ($args as $key => $value) {
$output .= "<$key>". htmlentities(strip_tags($value)) ."$key>";
}
$output .= "\n";
return $output;
}
function format_plural($count, $singular, $plural) {
return ($count == 1) ? "$count ". t($singular) : "$count ". t($plural);
}
function format_size($size) {
$suffix = t("bytes");
if ($size > 1024) {
$size = round($size / 1024, 2);
$suffix = t("KB");
}
if ($size > 1024) {
$size = round($size / 1024, 2);
$suffix = t("MB");
}
return t("%size %suffix", array("%size" => $size, "%suffix" => $suffix));
}
function cache_get($key) {
$cache = db_fetch_object(db_query("SELECT data FROM cache WHERE cid = '%s'", $key));
return $cache->data ? $cache->data : 0;
}
function cache_set($cid, $data, $expire = 0) {
if (db_fetch_object(db_query("SELECT cid FROM cache WHERE cid = '%s'", $cid))) {
db_query("UPDATE cache SET data = '%s' WHERE cid = '%s'", $data, $cid);
}
else {
db_query("INSERT INTO cache (cid, data, expire) VALUES('%s', '%s', '%s')", $cid, $data, $expire);
}
}
function cache_clear_all($cid = NULL) {
if (empty($cid)) {
db_query("DELETE FROM cache");
}
else {
db_query("DELETE FROM cache WHERE cid = '%s'", $cid);
}
}
function cache_clear_old($cid = NULL) {
if (empty($cid)) {
db_query("DELETE FROM cache WHERE expire < ". time() ." AND expire > 0");
}
else {
db_query("DELETE FROM cache WHERE cid = '%s' AND expire < %s AND expire > 0", $cid, time());
}
}
function page_set_cache() {
global $user, $REQUEST_METHOD;
if (!$user->uid && $REQUEST_METHOD == "GET") {
if ($data = ob_get_contents()) {
cache_set(request_uri(), $data, (time() + variable_get("cache_clear", 120)));
}
}
}
function page_get_cache() {
global $user, $REQUEST_METHOD;
if (!$user->uid && $REQUEST_METHOD == "GET") {
if ($cache = cache_get(request_uri())) {
cache_clear_old();
}
else {
ob_start();
}
}
return $cache ? $cache : 0;
}
function format_interval($timestamp) {
$units = array("year|years" => 31536000, "week|weeks" => 604800, "day|days" => 86400, "hour|hours" => 3600, "min|min" => 60, "sec|sec" => 1);
foreach ($units as $key=>$value) {
$key = explode("|", $key);
if ($timestamp >= $value) {
$output .= ($output ? " " : "") . format_plural(floor($timestamp / $value), $key[0], $key[1]);
$timestamp %= $value;
}
}
return ($output) ? $output : t("0 sec");
}
function format_date($timestamp, $type = "medium", $format = "") {
global $user;
$timestamp += ($user->timezone) ? $user->timezone - date("Z") : 0;
switch ($type) {
case "small":
$date = date(variable_get("date_format", "m/d/Y - H:i"), $timestamp);
break;
case "medium":
$date = t(date("l", $timestamp)) .", ". date(variable_get("date_format", "m/d/Y - H:i"), $timestamp);
break;
case "large":
$date = t(date("l", $timestamp)) .", ". t(date("F", $timestamp)) ." ". date("d, Y - H:i", $timestamp);
break;
case "custom":
for ($i = strlen($format); $i >= 0; $c = $format[--$i]) {
if (strstr("DFlMSw", $c)) {
$date = t(date($c, $timestamp)) . $date;
}
else if (strstr("AaBdgGhHiIjLmnrstTUWYyZz", $c)) {
$date = date($c, $timestamp) . $date;
}
else {
$date = $c.$date;
}
}
break;
default:
$date = t(date("l", $timestamp)) .", ". date(variable_get("date_format", "m/d/Y - H:i"), $timestamp);
}
return $date;
}
function format_name($object) {
global $PHP_SELF;
if ($object->uid && $object->name) {
if (strstr($PHP_SELF, "admin.php")) {
$output = la($object->name, array("mod" => "user", "op" => "edit", "id" => $object->uid), "", array("title" => t("Administer user profile.")));
}
else {
$output = lm($object->name, array("mod" => "user", "op" => "view", "id" => $object->uid), "", array("title" => t("View user profile.")));
}
}
else {
$output = t(variable_get(anonymous, "Anonymous"));
}
return $output;
}
function format_tag($link, $text) {
return l(($text ? $text : $link), array("title" => $link));
}
function form($form, $method = "post", $action = 0, $options = 0) {
return "\n";
}
function form_item($title, $value, $description = 0) {
return "