function config_updated() { global $db, $user, $config, $phpbb_root_path, $phpEx; if ($config['fulltext_sphinx_autoconf']) { $paths = array('fulltext_sphinx_bin_path', 'fulltext_sphinx_config_path', 'fulltext_sphinx_data_path'); // check for completeness and add trailing slash if it's not present foreach ($paths as $path) { if (empty($config[$path])) { return $user->lang['FULLTEXT_SPHINX_UNCONFIGURED']; } if ($config[$path] && substr($config[$path], -1) != '/') { set_config($path, $config[$path] . '/'); } } } $executables = array($config['fulltext_sphinx_bin_path'] . INDEXER_NAME, $config['fulltext_sphinx_bin_path'] . SEARCHD_NAME); if ($config['fulltext_sphinx_autorun']) { foreach ($executables as $executable) { if (!file_exists($executable)) { return sprintf($user->lang['FULLTEXT_SPHINX_FILE_NOT_FOUND'], $executable); } if (!function_exists('exec')) { return $user->lang['FULLTEXT_SPHINX_REQUIRES_EXEC']; } $output = array(); @exec($executable, $output); $output = implode("\n", $output); if (strpos($output, 'Sphinx ') === false) { return sprintf($user->lang['FULLTEXT_SPHINX_FILE_NOT_EXECUTABLE'], $executable); } } } $writable_paths = array($config['fulltext_sphinx_config_path'] => array('config' => 'fulltext_sphinx_autoconf', 'subdir' => false), $config['fulltext_sphinx_data_path'] => array('config' => 'fulltext_sphinx_autorun', 'subdir' => 'log'), $config['fulltext_sphinx_data_path'] . 'log/' => array('config' => 'fulltext_sphinx_autorun', 'subdir' => false)); foreach ($writable_paths as $path => $info) { if ($config[$info['config']]) { // make sure directory exists // if we could drop the @ here and figure out whether the file really // doesn't exist or whether open_basedir is in effect, would be nice if (!@file_exists($path)) { return sprintf($user->lang['FULLTEXT_SPHINX_DIRECTORY_NOT_FOUND'], $path); } // now check if it is writable by storing a simple file $filename = $path . 'write_test'; $fp = @fopen($filename, 'wb'); if ($fp === false) { return sprintf($user->lang['FULLTEXT_SPHINX_FILE_NOT_WRITABLE'], $filename); } @fclose($fp); @unlink($filename); if ($info['subdir'] !== false) { if (!is_dir($path . $info['subdir'])) { mkdir($path . $info['subdir']); } } } } if ($config['fulltext_sphinx_autoconf']) { include $phpbb_root_path . 'config.' . $phpEx; // now that we're sure everything was entered correctly, generate a config for the index // we misuse the avatar_salt for this, as it should be unique ;-) if (!class_exists('sphinx_config')) { include $phpbb_root_path . 'includes/functions_sphinx.php'; } if (!file_exists($config['fulltext_sphinx_config_path'] . 'sphinx.conf')) { $filename = $config['fulltext_sphinx_config_path'] . 'sphinx.conf'; $fp = @fopen($filename, 'wb'); if ($fp === false) { return sprintf($user->lang['FULLTEXT_SPHINX_FILE_NOT_WRITABLE'], $filename); } @fclose($fp); } $config_object = new sphinx_config($config['fulltext_sphinx_config_path'] . 'sphinx.conf'); $config_data = array("source source_phpbb_{$this->id}_main" => array(array('type', 'mysql'), array('sql_host', $dbhost), array('sql_user', $dbuser), array('sql_pass', $dbpasswd), array('sql_db', $dbname), array('sql_port', $dbport), array('sql_query_pre', 'SET NAMES utf8'), array('sql_query_pre', 'REPLACE INTO ' . SPHINX_TABLE . ' SELECT 1, MAX(post_id) FROM ' . POSTS_TABLE . ''), array('sql_query_range', 'SELECT MIN(post_id), MAX(post_id) FROM ' . POSTS_TABLE . ''), array('sql_range_step', '5000'), array('sql_query', 'SELECT p.post_id AS id, p.forum_id, p.topic_id, p.poster_id, IF(p.post_id = t.topic_first_post_id, 1, 0) as topic_first_post, p.post_time, p.post_subject, p.post_subject as title, p.post_text as data, t.topic_last_post_time, 0 as deleted FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t WHERE p.topic_id = t.topic_id AND p.post_id >= $start AND p.post_id <= $end'), array('sql_query_post', ''), array('sql_query_post_index', 'REPLACE INTO ' . SPHINX_TABLE . ' ( counter_id, max_doc_id ) VALUES ( 1, $maxid )'), array('sql_query_info', 'SELECT * FROM ' . POSTS_TABLE . ' WHERE post_id = $id'), array('sql_attr_uint', 'forum_id'), array('sql_attr_uint', 'topic_id'), array('sql_attr_uint', 'poster_id'), array('sql_attr_bool', 'topic_first_post'), array('sql_attr_bool', 'deleted'), array('sql_attr_timestamp', 'post_time'), array('sql_attr_timestamp', 'topic_last_post_time'), array('sql_attr_str2ordinal', 'post_subject')), "source source_phpbb_{$this->id}_delta : source_phpbb_{$this->id}_main" => array(array('sql_query_pre', ''), array('sql_query_range', ''), array('sql_range_step', ''), array('sql_query', 'SELECT p.post_id AS id, p.forum_id, p.topic_id, p.poster_id, IF(p.post_id = t.topic_first_post_id, 1, 0) as topic_first_post, p.post_time, p.post_subject, p.post_subject as title, p.post_text as data, t.topic_last_post_time, 0 as deleted FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t WHERE p.topic_id = t.topic_id AND p.post_id >= ( SELECT max_doc_id FROM ' . SPHINX_TABLE . ' WHERE counter_id=1 )')), "index index_phpbb_{$this->id}_main" => array(array('path', $config['fulltext_sphinx_data_path'] . "index_phpbb_{$this->id}_main"), array('source', "source_phpbb_{$this->id}_main"), array('docinfo', 'extern'), array('morphology', 'none'), array('stopwords', file_exists($config['fulltext_sphinx_config_path'] . 'sphinx_stopwords.txt') && $config['fulltext_sphinx_stopwords'] ? $config['fulltext_sphinx_config_path'] . 'sphinx_stopwords.txt' : ''), array('min_word_len', '2'), array('charset_type', 'utf-8'), array('charset_table', 'U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+ß410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF'), array('min_prefix_len', '0'), array('min_infix_len', '0')), "index index_phpbb_{$this->id}_delta : index_phpbb_{$this->id}_main" => array(array('path', $config['fulltext_sphinx_data_path'] . "index_phpbb_{$this->id}_delta"), array('source', "source_phpbb_{$this->id}_delta")), 'indexer' => array(array('mem_limit', $config['fulltext_sphinx_indexer_mem_limit'] . 'M')), 'searchd' => array(array('address', '127.0.0.1'), array('port', $config['fulltext_sphinx_port'] ? $config['fulltext_sphinx_port'] : '3312'), array('log', $config['fulltext_sphinx_data_path'] . "log/searchd.log"), array('query_log', $config['fulltext_sphinx_data_path'] . "log/sphinx-query.log"), array('read_timeout', '5'), array('max_children', '30'), array('pid_file', $config['fulltext_sphinx_data_path'] . "searchd.pid"), array('max_matches', (string) MAX_MATCHES))); $non_unique = array('sql_query_pre' => true, 'sql_attr_uint' => true, 'sql_attr_timestamp' => true, 'sql_attr_str2ordinal' => true, 'sql_attr_bool' => true); $delete = array('sql_group_column' => true, 'sql_date_column' => true, 'sql_str2ordinal_column' => true); foreach ($config_data as $section_name => $section_data) { $section =& $config_object->get_section_by_name($section_name); if (!$section) { $section =& $config_object->add_section($section_name); } foreach ($delete as $key => $void) { $section->delete_variables_by_name($key); } foreach ($non_unique as $key => $void) { $section->delete_variables_by_name($key); } foreach ($section_data as $entry) { $key = $entry[0]; $value = $entry[1]; if (!isset($non_unique[$key])) { $variable =& $section->get_variable_by_name($key); if (!$variable) { $variable =& $section->create_variable($key, $value); } else { $variable->set_value($value); } } else { $variable =& $section->create_variable($key, $value); } } } $config_object->write($config['fulltext_sphinx_config_path'] . 'sphinx.conf'); } set_config('fulltext_sphinx_configured', '1'); $this->shutdown_searchd(); $this->tidy(); return false; }
/** * Do update config and start/restart sphinx */ function _update_config($name = "", $no_indexing = false, $no_write = false) { $conf_file_path = $this->CONF_PATH . "sphinx.conf"; if (file_exists($conf_file_path) && !is_readable($conf_file_path)) { return _e("Error!. File " . $conf_file_path . " is not readable! Please check permissions."); } $config_object = new sphinx_config($this->CONF_PATH . "sphinx.conf"); $non_unique = ["sql_group_column" => true, "sql_date_column" => true, "sql_str2ordinal_column" => true, "sql_attr_uint" => true, "sql_attr_float" => true, "sql_attr_bool" => true, "sql_attr_string" => true, "sql_attr_multi" => true, "sql_attr_timestamp" => true, "sql_attr_str2ordinal" => true, "sql_query_pre" => true, "sql_field_string" => true]; $config_data = $this->_current_config(); // Empty current loaded config if ($this->REPLACE_CONFIG) { $config_object->sections = null; } foreach ((array) $config_data as $section_name => $section_data) { $section =& $config_object->get_section_by_name($section_name); if (!$section) { $section =& $config_object->add_section($section_name); } foreach ((array) $non_unique as $key => $void) { $section->delete_variables_by_name($key); } foreach ((array) $section_data as $entry) { $key = $entry[0]; $value = $entry[1]; if (!isset($non_unique[$key])) { $variable =& $section->get_variable_by_name($key); if (!$variable) { $variable =& $section->create_variable($key, $value); } else { $variable->set_value($value); } } else { $variable =& $section->create_variable($key, $value); } } } if ($no_write) { return $config_object->to_string(); } if (file_exists($conf_file_path) && !is_writeable($conf_file_path)) { return _e("Error!. File " . $conf_file_path . " is not writeable! Please check permissions.") . "\n" . $config_object->to_string(); } $config_object->write($conf_file_path); if (!$no_indexing) { $this->_shutdown_searchd(); $this->_create_index($name); $this->_start_searchd(); } return true; }