sphinxQL = new DB( [ 'dbname' => '', 'dbport' => NN_SPHINXQL_PORT, 'dbhost' => NN_SPHINXQL_HOST_NAME, 'dbsock' => NN_SPHINXQL_SOCK_FILE, ] ); } } /** * Insert release into Sphinx RT table. * @param $parameters */ public function insertRelease($parameters): void { if ($this->sphinxQL !== null && $parameters['id']) { $this->sphinxQL->queryExec( sprintf( 'REPLACE INTO releases_rt (id, name, searchname, fromname, filename) VALUES (%d, %s, %s, %s, %s)', $parameters['id'], $this->sphinxQL->escapeString($parameters['name']), $this->sphinxQL->escapeString($parameters['searchname']), $this->sphinxQL->escapeString($parameters['fromname']), empty($parameters['filename']) ? "''" : $this->sphinxQL->escapeString($parameters['filename']) ) ); } } /** * Delete release from Sphinx RT tables. * @param array $identifiers ['g' => Release GUID(mandatory), 'id' => ReleaseID(optional, pass false)] * @param DB $pdo */ public function deleteRelease($identifiers, DB $pdo): void { if ($this->sphinxQL !== null) { if ($identifiers['i'] === false) { $identifiers['i'] = $pdo->queryOneRow( sprintf('SELECT id FROM releases WHERE guid = %s', $pdo->escapeString($identifiers['g'])) ); if ($identifiers['i'] !== false) { $identifiers['i'] = $identifiers['i']['id']; } } if ($identifiers['i'] !== false) { $this->sphinxQL->queryExec(sprintf('DELETE FROM releases_rt WHERE id = %d', $identifiers['i'])); } } } /** * @param $string * * @return mixed */ public static function escapeString($string) { $from = [ '\\', '(', ')', '|', '---', '--', '-', '!', '@', '~', '"', '&', '/', '^', '$', '=', "'", "\x00", "\n", "\r", "\x1a", ]; $to = [ '\\\\\\\\', '\\\\\\\\(', '\\\\\\\\)', '\\\\\\\\|', '-', '-', '\\\\\\\\-', '\\\\\\\\!', '\\\\\\\\@', '\\\\\\\\~', '\\\\\\\\"', '\\\\\\\\&', '\\\\\\\\/', '\\\\\\\\^', '\\\\\\\\$', '\\\\\\\\=', "\\'", '\\x00', '\\n', '\\r', '\\x1a', ]; return str_replace($from, $to, $string); } /** * Update Sphinx Relases index for given releases_id. * * @param int $releaseID * @param DB $pdo */ public function updateRelease($releaseID, DB $pdo): void { if ($this->sphinxQL !== null) { $new = $pdo->queryOneRow( sprintf(' SELECT r.id, r.name, r.searchname, r.fromname, IFNULL(GROUP_CONCAT(rf.name SEPARATOR " "),"") filename FROM releases r LEFT JOIN release_files rf ON (r.id=rf.releases_id) WHERE r.id = %d GROUP BY r.id LIMIT 1', $releaseID ) ); if ($new !== false) { $this->insertRelease($new); } } } /** * Truncate a RT index. * @param string $indexName */ public function truncateRTIndex($indexName): void { if ($this->sphinxQL !== null) { $this->sphinxQL->queryExec(sprintf('TRUNCATE RTINDEX %s', $indexName)); } } /** * Optimize a RT index. * @param string $indexName */ public function optimizeRTIndex($indexName): void { if ($this->sphinxQL !== null) { $this->sphinxQL->queryExec(sprintf('FLUSH RTINDEX %s', $indexName)); $this->sphinxQL->queryExec(sprintf('OPTIMIZE INDEX %s', $indexName)); } } }