diff options
author | Andrew Dolgov <[email protected]> | 2023-10-25 12:55:09 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2023-10-25 12:55:09 +0300 |
commit | 865ecc87963dc3b26e66296616eef2a1cc41ac3f (patch) | |
tree | bf2ecd8a391103bdb2c8b70cd33c47467310754b /classes/Logger_SQL.php | |
parent | 0a5507d3bd79d04c860455664f919bf8e7274fda (diff) |
move to psr-4 autoloader
Diffstat (limited to 'classes/Logger_SQL.php')
-rw-r--r-- | classes/Logger_SQL.php | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/classes/Logger_SQL.php b/classes/Logger_SQL.php new file mode 100644 index 000000000..5f3c67852 --- /dev/null +++ b/classes/Logger_SQL.php @@ -0,0 +1,61 @@ +<?php +class Logger_SQL implements Logger_Adapter { + + function __construct() { + $conn = get_class($this); + + ORM::configure(Db::get_dsn(), null, $conn); + ORM::configure('username', Config::get(Config::DB_USER), $conn); + ORM::configure('password', Config::get(Config::DB_PASS), $conn); + ORM::configure('return_result_sets', true, $conn); + } + + function log_error(int $errno, string $errstr, string $file, int $line, string $context): bool { + + if (Config::get_schema_version() > 117) { + + // limit context length, DOMDocument dumps entire XML in here sometimes, which may be huge + $context = mb_substr($context, 0, 8192); + + $server_params = [ + "Real IP" => "HTTP_X_REAL_IP", + "Forwarded For" => "HTTP_X_FORWARDED_FOR", + "Forwarded Protocol" => "HTTP_X_FORWARDED_PROTO", + "Remote IP" => "REMOTE_ADDR", + "Request URI" => "REQUEST_URI", + "User agent" => "HTTP_USER_AGENT", + ]; + + foreach ($server_params as $n => $p) { + if (isset($_SERVER[$p])) + $context .= "\n$n: " . $_SERVER[$p]; + } + + // passed error message may contain invalid unicode characters, failing to insert an error here + // would break the execution entirely by generating an actual fatal error instead of a E_WARNING etc + $errstr = UConverter::transcode($errstr, 'UTF-8', 'UTF-8'); + $context = UConverter::transcode($context, 'UTF-8', 'UTF-8'); + + // can't use $_SESSION["uid"] ?? null because what if its, for example, false? or zero? + // this would cause a PDOException on insert below + $owner_uid = !empty($_SESSION["uid"]) ? $_SESSION["uid"] : null; + + $entry = ORM::for_table('ttrss_error_log', get_class($this))->create(); + + $entry->set([ + 'errno' => $errno, + 'errstr' => $errstr, + 'filename' => $file, + 'lineno' => (int)$line, + 'context' => $context, + 'owner_uid' => $owner_uid, + 'created_at' => Db::NOW(), + ]); + + return $entry->save(); + } + + return false; + } + +} |