Sha256: 9b80dd7dff8221415eae13a980b4de6ec3e45e2d45ac952a2c08a10e2bfe893b

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

require "redis"
require "singleton"
require "logger"
require "fileutils"

class DynportTools::EmbeddedRedis
  include Singleton
  
  attr_accessor :started, :base_path, :killed
  attr_writer :logger
  
  def initialize(options = {})
    self.base_path = options[:base_path] || "/tmp"
    self.logger = options[:logger] || Logger.new($stderr)
  end
  
  def pid_path
    "#{base_path}/pids/redis.#{Process.pid}.pid"
  end
  
  def socket_path
    "#{base_path}/sockets/redis.#{Process.pid}.socket"
  end
  
  def pid
    if File.exists?(pid_path)
      pid = File.read(pid_path).strip
      pid.length > 0 ? pid : nil
    end
  end
  
  def running?
    !!(pid && IO.popen("ps -p #{pid} | grep redis-server").count > 0)
  end
  
  def start
    if !running?
      do_start!
    else
      log "already running with pid #{pid}"
    end
    connection
  end
  
  def do_start!
    [socket_path, pid_path].each { |path| FileUtils.mkdir_p(File.dirname(path)) }
    system(%(echo "#{config}" | redis-server -))
    sleep 0.1
    self.started = true
    log "started redis with pid #{pid}"
    at_exit do
      kill
    end
  end
  
  def started?
    !!self.started
  end
  
  def connection
    if !started?
      start 
    end
    @connection ||= Redis.new(:path => socket_path)
  end
  
  def log(message)
    logger.info("EMBEDDED_REDIS: #{message}")
  end
  
  def logger
    @logger ||= Logger.new($stdout)
  end
  
  def killed?
    !!killed
  end
  
  def kill
    log "killing redis"
    if !killed? && pid
      log "killing #{pid}"
      system(%(kill #{pid})) 
      FileUtils.rm_f(socket_path)
      self.killed = true
    end
  end
  
  def config
    [
      "daemonize yes",
      "pidfile #{pid_path}",
      "port 0",
      "unixsocket #{socket_path}"
      
    ].join("\n")
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dynport_tools-0.2.17 lib/dynport_tools/embedded_redis.rb