summaryrefslogtreecommitdiff
path: root/vendor/plugins/thinking-sphinx/spec/sphinx_helper.rb
blob: 4e67523e66fdc49e339145f8e0e88253064d142a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
require 'active_record'
prefix = defined?(JRUBY_VERSION) ? "jdbc" : ""
require "active_record/connection_adapters/#{prefix}mysql_adapter"
begin
  require "active_record/connection_adapters/#{prefix}postgresql_adapter"
rescue LoadError
  # No postgres?  no prob...
end
require 'yaml'

class SphinxHelper
  attr_accessor :host, :username, :password
  attr_reader   :path
  
  def initialize
    @host     = "localhost"
    @username = "thinking_sphinx"
    @password = ""

    if File.exist?("spec/fixtures/database.yml")
      config    = YAML.load(File.open("spec/fixtures/database.yml"))
      @host     = config["host"]
      @username = config["username"]
      @password = config["password"]
    end
    
    @path = File.expand_path(File.dirname(__FILE__))
  end
  
  def mysql_adapter
    defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql'
  end
  
  def setup_mysql
    ActiveRecord::Base.establish_connection(
      :adapter  => mysql_adapter,
      :database => 'thinking_sphinx',
      :username => @username,
      :password => @password,
      :host     => @host
    )
    ActiveRecord::Base.logger = Logger.new(File.open("tmp/activerecord.log", "a"))
    
    structure = File.open("spec/fixtures/structure.sql") { |f| f.read.chomp }
    structure.split(';').each { |table|
      ActiveRecord::Base.connection.execute table
    }
    
    File.open("spec/fixtures/data.sql") { |f|
      while line = f.gets
        ActiveRecord::Base.connection.execute line unless line.blank?
      end
    }
  end
  
  def setup_sphinx
    @configuration = ThinkingSphinx::Configuration.instance.reset
    File.open("spec/fixtures/sphinx/database.yml", "w") do |file|
      YAML.dump({@configuration.environment => {
        :adapter  => mysql_adapter,
        :host     => @host,
        :database => "thinking_sphinx",
        :username => @username,
        :password => @password
      }}, file)
    end
    FileUtils.mkdir_p(@configuration.searchd_file_path)
    
    @configuration.database_yml_file = "spec/fixtures/sphinx/database.yml"
    @configuration.build
    
    index
  end
  
  def reset
    setup_mysql
  end
    
  def index
    cmd = "indexer --config #{@configuration.config_file} --all"
    cmd << " --rotate" if running?
    `#{cmd}`
  end
  
  def start
    return if running?
    
    cmd = "searchd --config #{@configuration.config_file}"
    `#{cmd}`    

    sleep(1)

    unless running?
      puts "Failed to start searchd daemon. Check #{@configuration.searchd_log_file}."
    end
  end
  
  def stop
    return unless running?
    `kill #{pid}`
  end
  
  def pid
    if File.exists?("#{@configuration.pid_file}")
      `cat #{@configuration.pid_file}`[/\d+/]
    else
      nil
    end
  end

  def running?
    pid && `ps #{pid} | wc -l`.to_i > 1
  end
end