diff --git a/database/Config.php b/database/Config.php index bb9bdb8ff3979710aacc5edd5519149bb5c7974c..8779ea47351c1f4a55e14695dc61e3e78284b933 100644 --- a/database/Config.php +++ b/database/Config.php @@ -8,25 +8,30 @@ class Config public $database_connector; public $username; public $password; + public $database_options; public $backend; public $path_prefix; - public function __construct(string $path_prefix, string $database_connector, string $username, string $password, string $backend) + public function __construct(string $path_prefix, string $database_connector, string $username, string $password, string $backend, array $options) { $this->database_connector = $database_connector; $this->username = $username; $this->password = $password; + $this->database_options = $options; $this->path_prefix = $path_prefix; $this->backend = $backend; } public static function createFromGlobals() { + $options = []; + if (defined(qrs_db_option_tsqueryfunction) && null !== qrs_db_option_tsqueryfunction) + $options['tsqueryfunction'] = qrs_db_option_tsqueryfunction; if (defined(qrs_db_connector) && null !== qrs_db_connector) - return new Config(qrs_path_prefix, qrs_db_connector, qrs_db_user, qrs_db_pass, qrs_backend); + return new Config(qrs_path_prefix, qrs_db_connector, qrs_db_user, qrs_db_pass, qrs_backend, $options); else - return new Config(qrs_path_prefix, 'pgsql:host=' . qrs_db_host . ';port=' . qrs_db_port . ';dbname=' . qrs_db_name . '', qrs_db_user, qrs_db_pass, qrs_backend); + return new Config(qrs_path_prefix, 'pgsql:host=' . qrs_db_host . ';port=' . qrs_db_port . ';dbname=' . qrs_db_name . '', qrs_db_user, qrs_db_pass, qrs_backend, $options); } } diff --git a/database/Database.php b/database/Database.php index d6a28c7961acfa12ee34db915f3aee497dee669a..599c57d891745eab71b208b5cb66121f1c929a5c 100644 --- a/database/Database.php +++ b/database/Database.php @@ -15,19 +15,19 @@ class Database private $backend; - private function __construct(string $database_connector, string $username, string $password, string $type) + private function __construct(string $database_connector, string $username, string $password, string $type, array $options) { - $this->backend = BackendFactory::create($type, new \PDO($database_connector, $username, $password)); + $this->backend = BackendFactory::create($type, new \PDO($database_connector, $username, $password), $options); } public static function createFromConfig(Config $config): Database { - return Database::createFromOptions($config->database_connector, $config->username, $config->password, $config->backend); + return Database::createFromOptions($config->database_connector, $config->username, $config->password, $config->backend, $config->database_options); } - public static function createFromOptions(string $database_connector, string $username, string $password, string $type): Database + public static function createFromOptions(string $database_connector, string $username, string $password, string $type, array $options): Database { - return new Database($database_connector, $username, $password, $type); + return new Database($database_connector, $username, $password, $type, $options); } public function authenticateFromHeader(string $header): bool diff --git a/database/backends/BackendFactory.php b/database/backends/BackendFactory.php index d2d56406d06108b994bdeb60e16964ea81bdbf4a..2c44f177db085fd5fe0fcc541f9fd46b7c7acc06 100644 --- a/database/backends/BackendFactory.php +++ b/database/backends/BackendFactory.php @@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php'; class BackendFactory { - public static function create(string $type, \PDO $db): Backend + public static function create(string $type, \PDO $db, array $options): Backend { switch ($type) { case 'pgsql-smart': - return new PostgresSmartBackend($db); + return new PostgresSmartBackend($db, $options); case 'sqlite-smart': - return new SQLiteSmartBackend($db); + return new SQLiteSmartBackend($db, $options); default: return null; } diff --git a/database/backends/PostgresSmartBackend.php b/database/backends/PostgresSmartBackend.php index cd95adc67ccdd3748f1774afea820c65ef7a5ba3..319b61d56fe5b8b08d666cf6a6ff9143f5a46665 100644 --- a/database/backends/PostgresSmartBackend.php +++ b/database/backends/PostgresSmartBackend.php @@ -7,11 +7,13 @@ require_once 'Backend.php'; class PostgresSmartBackend implements Backend { private $db; + private $options; - function __construct(\PDO $db) + function __construct(\PDO $db, array $options) { $this->db = $db; $this->db->exec("SET statement_timeout = 5000;"); + $this->options = $options; } public function findUser(): \PDOStatement @@ -23,8 +25,14 @@ class PostgresSmartBackend implements Backend "); } + private function tsQueryFunction(): string + { + return array_key_exists('tsqueryfunction', $this->options) ? $this->options['tsqueryfunction'] : "plainto_tsquery('english', :query)"; + } + public function findInBuffers(): \PDOStatement { + $tsQueryFunction = $this->tsQueryFunction(); return $this->db->prepare(" SELECT ranked_messages.bufferid, @@ -70,7 +78,7 @@ class PostgresSmartBackend implements Backend FROM backlog JOIN buffer ON backlog.bufferid = buffer.bufferid - , phraseto_tsquery_multilang(:query) query + , $tsQueryFunction query WHERE buffer.userid = :userid AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) @@ -90,6 +98,7 @@ class PostgresSmartBackend implements Backend public function findInBuffersCount(): \PDOStatement { + $tsQueryFunction = $this->tsQueryFunction(); return $this->db->prepare(" SELECT backlog.bufferid, @@ -99,7 +108,7 @@ class PostgresSmartBackend implements Backend JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN sender ON backlog.senderid = sender.senderid JOIN network ON buffer.networkid = network.networkid - , phraseto_tsquery_multilang(:query) query + , $tsQueryFunction query WHERE buffer.userid = :userid AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) @@ -113,6 +122,7 @@ class PostgresSmartBackend implements Backend public function findInBuffer(): \PDOStatement { + $tsQueryFunction = $this->tsQueryFunction(); return $this->db->prepare(" SELECT matching_messages.messageid, @@ -142,7 +152,7 @@ class PostgresSmartBackend implements Backend FROM backlog JOIN buffer ON backlog.bufferid = buffer.bufferid - , phraseto_tsquery_multilang(:query) query + , $tsQueryFunction query WHERE buffer.userid = :userid AND buffer.bufferid = :bufferid AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) @@ -161,6 +171,7 @@ class PostgresSmartBackend implements Backend public function findInBufferCount(): \PDOStatement { + $tsQueryFunction = $this->tsQueryFunction(); return $this->db->prepare(" SELECT COUNT(*) > (:limit::INT + :offset::INT) AS hasmore @@ -168,7 +179,7 @@ class PostgresSmartBackend implements Backend backlog JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN sender ON backlog.senderid = sender.senderid - , phraseto_tsquery_multilang(:query) query + , $tsQueryFunction query WHERE buffer.userid = :userid AND backlog.bufferid = :bufferid AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) diff --git a/database/backends/SQLiteSmartBackend.php b/database/backends/SQLiteSmartBackend.php index 0d83a467db7484c50d3bf43100452503515c4bab..fcac6e49846daa442afb3bbccd8e054f5e8c292e 100644 --- a/database/backends/SQLiteSmartBackend.php +++ b/database/backends/SQLiteSmartBackend.php @@ -7,10 +7,12 @@ require_once 'Backend.php'; class SQLiteSmartBackend implements Backend { private $db; + private $options; - function __construct(\PDO $db) + function __construct(\PDO $db, array $options) { $this->db = $db; + $this->options = $options; } public function findUser(): \PDOStatement diff --git a/qrs_config.default.php b/qrs_config.default.php index 4ef34f9c0f7769b298198ff7c7fb232e5c7f0cbc..95539f3c28f4f7141d5325f72a7ffc15501dbbe8 100644 --- a/qrs_config.default.php +++ b/qrs_config.default.php @@ -9,6 +9,8 @@ define('qrs_db_connector', null); define('qrs_db_user', 'quassel'); define('qrs_db_pass', 'password'); +define('qrs_db_option_tsqueryfunction', "plainto_tsquery('english', :query)"); + define('qrs_backend', 'pgsql-smart'); define('qrs_path_prefix', ''); diff --git a/res/js/util/mirccolorhandler.js b/res/js/util/mirccolorhandler.js index 076eb5d8ce2e8188467a27e46467878f0a441aa5..e4909c9dc5517580c5b6667712766f500221b544 100644 --- a/res/js/util/mirccolorhandler.js +++ b/res/js/util/mirccolorhandler.js @@ -57,8 +57,12 @@ class MircColorHandler { const s = unescape(str.substr(i - normalCount, normalCount)); if (normalCount === 0) return; - if (lastTag.tagName === 'A') - lastTag.href = s; + if (lastTag.tagName === 'A') { + if (s.indexOf('://') !== -1) + lastTag.href = s; + else + lastTag.href = "http://" + s; + } lastTag.appendChild(document.createTextNode(s)); nodes.push(lastTag); };