Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
 /**
  * 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;
 }