=')) ? clone($object) : $object; return $result; # PHP internals need a tmp var to return by ref } /** * Append a line to a logfile in log/. Date will be added to filename and line * @param $name Name of logfile * @param $line1 Line to append (varargs) */ function log($name /* ... */) { $args = func_get_args(); $line = date("Y-m-d H:i:s") . "\t" . implode("\t", array_slice($args, 1)) . "\n"; if ($fh = fopen($GLOBALS['ULTRAHOME'] . "/log/$name-" . date('Ymd'), "a")) { fputs($fh, $line); fclose($fh); } } /** * Store timings for appending to log/timer_log-* in auto_append.php */ function timerlog($label = '') { if ($GLOBALS['debug_timerlog']) { $s = $GLOBALS['ULTRATIME']; $e = gettimeofday(); $msec= ($e['sec'] - $s['sec']) * 1000 + ($e['usec'] - $s['usec']) / 1000; $GLOBALS['ULTRATIMERLOG'] .= sprintf(" %s:%d", $label, $msec); } } /** * Send error report either to browser (on devel/twin machines) or by email to .diffnotice guys * @parma $title (optional) error title, one line * @param $body (optional) error body, multiline * @param $to (optional) comma separated recipient list * @param named parameter ok indicates no error happened * @param named parameter ok_key indicates which variable to store failure counts in * @param named parameter ok_maxfail number of failures needed for alert; default 2. only 1 failure per 60 seconds counted */ function error($p=array(), $body='', $to='') { $p += array('ok_key' => "it_error", 'ok_maxfail' => 2); if (is_array($p)) { $title = $p['title']; $body = $p['body']; $to = $p['to']; } else { $title = $p; unset($p); } if (!$to) $to = strtr(trim(@file_get_contents($GLOBALS['ULTRAHOME'] . "/.diffnotice")), array("\n"=>',', ' '=>'')); if (!isset($p['ok'])) $sendalert = true; else { $counterfn = $GLOBALS['ULTRAHOME'] . "/tmp/" . urlencode($p['ok_key']); if (time() - @filemtime($counterfn) >= 60) { # only modify counter if unmodified for 60 secs $oldcounter = intval(@file_get_contents($counterfn)); $newcounter = $p['ok'] ? 0 : $oldcounter + 1; if ($newcounter != $oldcounter) { $fh = fopen($counterfn, "w"); fputs($fh, "$newcounter\n"); fclose($fh); if ($newcounter >= $p['ok_maxfail'] && (time() - @filemtime("$counterfn.mailsent")) >= 86400) { # 1 mail per day $sendalert = true; if (!ereg('twin|devel', $GLOBALS['ULTRASERVERTYPE'])) touch("$counterfn.mailsent"); } } } } if ($sendalert) { $url = ($_SERVER['HTTPS'] ? "https://" : "http://") . $_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI']; if (!$title) $title="Error in $url"; $body .= "\nUrl: $url\n\n\$_REQUEST: ".print_r($_REQUEST, true). "\nStack:\n" . print_r(array_slice(debug_backtrace(), 1), true) . "\n\$_SERVER: " . print_r($_SERVER, true); if (ereg('twin|devel', $GLOBALS['ULTRASERVERTYPE'])) { echo "
$title\n$body\n
"; } else { $cmd = "alert -l " . escapeshellarg($to) . " 4 " . escapeshellarg($title); EDC('exec', $cmd); if (($pipe = popen($cmd, "w"))) { fputs($pipe, $body); pclose($pipe); } error_log("it::error: ".$title); } } } /** * Same as error(), plus exit */ function fatal($title='', $body='', $to='') { it::error($title, $body, $to); exit; } /** * Return "db4" or "db2" depending on availability */ function dba_handler() { return in_array("db4", dba_handlers()) ? "db4" : "db2"; } /** * Convert a string to ASCII-only chars, map/strip ISO-8859-1 accents * @param $text Text to convert * @return mapped/stripped version of $text contains only chars [0..127] */ function toascii($text) { return strtr(strtr($text, 'ÇéâàåçêëèïîìÅÉôòûùÿøØáíóúñÑÁÂÀãÃÊËÈÍÎÏÓÔõÕÚÛÙýÝ', 'CeaaaceeeiiiAEoouuyooaiounNAAAaAEEEIIIOOoOUUUyY'), array('ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'Ä' => 'Ae', 'Ö' => 'Oe', 'Ü' => 'Ue', 'æ' => 'ae', 'Æ' => 'Ae', 'ß' => 'ss')); } } ?>