Skip to content
Snippets Groups Projects
Commit cd66bd57 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Properly handle links, allow configuration of looking function

parent ee29ef9a
No related branches found
No related tags found
No related merge requests found
...@@ -8,25 +8,30 @@ class Config ...@@ -8,25 +8,30 @@ class Config
public $database_connector; public $database_connector;
public $username; public $username;
public $password; public $password;
public $database_options;
public $backend; public $backend;
public $path_prefix; 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->database_connector = $database_connector;
$this->username = $username; $this->username = $username;
$this->password = $password; $this->password = $password;
$this->database_options = $options;
$this->path_prefix = $path_prefix; $this->path_prefix = $path_prefix;
$this->backend = $backend; $this->backend = $backend;
} }
public static function createFromGlobals() 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) 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 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);
} }
} }
...@@ -15,19 +15,19 @@ class Database ...@@ -15,19 +15,19 @@ class Database
private $backend; 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 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 public function authenticateFromHeader(string $header): bool
......
...@@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php'; ...@@ -8,13 +8,13 @@ require_once 'SQLiteSmartBackend.php';
class BackendFactory class BackendFactory
{ {
public static function create(string $type, \PDO $db): Backend public static function create(string $type, \PDO $db, array $options): Backend
{ {
switch ($type) { switch ($type) {
case 'pgsql-smart': case 'pgsql-smart':
return new PostgresSmartBackend($db); return new PostgresSmartBackend($db, $options);
case 'sqlite-smart': case 'sqlite-smart':
return new SQLiteSmartBackend($db); return new SQLiteSmartBackend($db, $options);
default: default:
return null; return null;
} }
......
...@@ -7,11 +7,13 @@ require_once 'Backend.php'; ...@@ -7,11 +7,13 @@ require_once 'Backend.php';
class PostgresSmartBackend implements Backend class PostgresSmartBackend implements Backend
{ {
private $db; private $db;
private $options;
function __construct(\PDO $db) function __construct(\PDO $db, array $options)
{ {
$this->db = $db; $this->db = $db;
$this->db->exec("SET statement_timeout = 5000;"); $this->db->exec("SET statement_timeout = 5000;");
$this->options = $options;
} }
public function findUser(): \PDOStatement public function findUser(): \PDOStatement
...@@ -23,8 +25,14 @@ class PostgresSmartBackend implements Backend ...@@ -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 public function findInBuffers(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
ranked_messages.bufferid, ranked_messages.bufferid,
...@@ -70,7 +78,7 @@ class PostgresSmartBackend implements Backend ...@@ -70,7 +78,7 @@ class PostgresSmartBackend implements Backend
FROM FROM
backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
, phraseto_tsquery_multilang(:query) query , $tsQueryFunction query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP)
...@@ -90,6 +98,7 @@ class PostgresSmartBackend implements Backend ...@@ -90,6 +98,7 @@ class PostgresSmartBackend implements Backend
public function findInBuffersCount(): \PDOStatement public function findInBuffersCount(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
backlog.bufferid, backlog.bufferid,
...@@ -99,7 +108,7 @@ class PostgresSmartBackend implements Backend ...@@ -99,7 +108,7 @@ class PostgresSmartBackend implements Backend
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN sender ON backlog.senderid = sender.senderid JOIN sender ON backlog.senderid = sender.senderid
JOIN network ON buffer.networkid = network.networkid JOIN network ON buffer.networkid = network.networkid
, phraseto_tsquery_multilang(:query) query , $tsQueryFunction query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP) AND (:ignore_before::BOOLEAN OR backlog.time < :before::TIMESTAMP)
...@@ -113,6 +122,7 @@ class PostgresSmartBackend implements Backend ...@@ -113,6 +122,7 @@ class PostgresSmartBackend implements Backend
public function findInBuffer(): \PDOStatement public function findInBuffer(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
matching_messages.messageid, matching_messages.messageid,
...@@ -142,7 +152,7 @@ class PostgresSmartBackend implements Backend ...@@ -142,7 +152,7 @@ class PostgresSmartBackend implements Backend
FROM FROM
backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
, phraseto_tsquery_multilang(:query) query , $tsQueryFunction query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND buffer.bufferid = :bufferid AND buffer.bufferid = :bufferid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
...@@ -161,6 +171,7 @@ class PostgresSmartBackend implements Backend ...@@ -161,6 +171,7 @@ class PostgresSmartBackend implements Backend
public function findInBufferCount(): \PDOStatement public function findInBufferCount(): \PDOStatement
{ {
$tsQueryFunction = $this->tsQueryFunction();
return $this->db->prepare(" return $this->db->prepare("
SELECT SELECT
COUNT(*) > (:limit::INT + :offset::INT) AS hasmore COUNT(*) > (:limit::INT + :offset::INT) AS hasmore
...@@ -168,7 +179,7 @@ class PostgresSmartBackend implements Backend ...@@ -168,7 +179,7 @@ class PostgresSmartBackend implements Backend
backlog backlog
JOIN buffer ON backlog.bufferid = buffer.bufferid JOIN buffer ON backlog.bufferid = buffer.bufferid
JOIN sender ON backlog.senderid = sender.senderid JOIN sender ON backlog.senderid = sender.senderid
, phraseto_tsquery_multilang(:query) query , $tsQueryFunction query
WHERE buffer.userid = :userid WHERE buffer.userid = :userid
AND backlog.bufferid = :bufferid AND backlog.bufferid = :bufferid
AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP) AND (:ignore_since::BOOLEAN OR backlog.time > :since::TIMESTAMP)
......
...@@ -7,10 +7,12 @@ require_once 'Backend.php'; ...@@ -7,10 +7,12 @@ require_once 'Backend.php';
class SQLiteSmartBackend implements Backend class SQLiteSmartBackend implements Backend
{ {
private $db; private $db;
private $options;
function __construct(\PDO $db) function __construct(\PDO $db, array $options)
{ {
$this->db = $db; $this->db = $db;
$this->options = $options;
} }
public function findUser(): \PDOStatement public function findUser(): \PDOStatement
......
...@@ -9,6 +9,8 @@ define('qrs_db_connector', null); ...@@ -9,6 +9,8 @@ define('qrs_db_connector', null);
define('qrs_db_user', 'quassel'); define('qrs_db_user', 'quassel');
define('qrs_db_pass', 'password'); define('qrs_db_pass', 'password');
define('qrs_db_option_tsqueryfunction', "plainto_tsquery('english', :query)");
define('qrs_backend', 'pgsql-smart'); define('qrs_backend', 'pgsql-smart');
define('qrs_path_prefix', ''); define('qrs_path_prefix', '');
...@@ -57,8 +57,12 @@ class MircColorHandler { ...@@ -57,8 +57,12 @@ class MircColorHandler {
const s = unescape(str.substr(i - normalCount, normalCount)); const s = unescape(str.substr(i - normalCount, normalCount));
if (normalCount === 0) if (normalCount === 0)
return; return;
if (lastTag.tagName === 'A') if (lastTag.tagName === 'A') {
if (s.indexOf('://') !== -1)
lastTag.href = s; lastTag.href = s;
else
lastTag.href = "http://" + s;
}
lastTag.appendChild(document.createTextNode(s)); lastTag.appendChild(document.createTextNode(s));
nodes.push(lastTag); nodes.push(lastTag);
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment