118 lines
3.5 KiB
Ruby
118 lines
3.5 KiB
Ruby
#!/usr/bin/env ruby
|
|
# Make drb server
|
|
# See Dockerfile for run instructions
|
|
require 'rubygems'
|
|
require 'drb/drb'
|
|
require 'erb'
|
|
require 'couchrest'
|
|
#require 'pry'
|
|
#require File.expand_path('../lib/in_memory_q_counter', File.dirname(__FILE__))
|
|
# This is a non thread safe replacement for the
|
|
# couchbase counter mechanism since every test needs
|
|
# a clean start and Hash#clear is soooo much faster than
|
|
# a couchbase bucket flush
|
|
class InMemoryQCounter
|
|
attr_reader :store, :environment
|
|
|
|
def initialize(reload_stats: false, environment: nil)
|
|
@store = {}
|
|
@environment = environment || 'development'
|
|
reload_stats! if reload_stats
|
|
end
|
|
|
|
def get(key, options = {})
|
|
value = store[key]
|
|
debug "Get key #{key} (#{value})"
|
|
value
|
|
end
|
|
|
|
def set(key, value)
|
|
debug "Set key #{key} to #{value}"
|
|
store[key] = value
|
|
end
|
|
|
|
def incr(key, options = {})
|
|
debug "Increment key #{key}"
|
|
# store[key] ||= options[:initial].to_i
|
|
# store[key] += 1
|
|
if store[key]
|
|
store[key] += 1
|
|
else
|
|
store[key] = options[:initial].to_i
|
|
end
|
|
end
|
|
|
|
def decr(key, options = {})
|
|
debug "Decrement key #{key}"
|
|
# store[key] ||= options[:initial].to_i
|
|
# store[key] -= 1
|
|
if store[key]
|
|
store[key] -= 1
|
|
else
|
|
store[key] = options[:initial].to_i
|
|
end
|
|
end
|
|
|
|
def flush
|
|
debug "Flushing store"
|
|
store.clear
|
|
end
|
|
|
|
def debug(message)
|
|
puts message
|
|
end
|
|
|
|
def reload_stats!
|
|
require 'yaml'
|
|
require 'couchrest'
|
|
require 'pry'
|
|
couch_settings_path = 'config/couchdb.yml'
|
|
puts "Couch settings path: #{couch_settings_path}"
|
|
puts "Environment: #{environment.inspect}"
|
|
#couch_settings = YAML.load_file(couch_settings_path)[environment]
|
|
couch_settings = YAML.safe_load(ERB.new(File.read(couch_settings_path)).result, [Symbol], [], ['default'])[environment]
|
|
database = couch_settings['database'].sub 'localhost', 'host.docker.internal'
|
|
#database = couch_settings['database']
|
|
#database = couch_settings['database'].sub 'localhost', '172.17.0.1'
|
|
db = CouchRest.database(database) # for debug: db = CouchPotato.database.couchrest_database
|
|
design_doc = "_design/order_counter"
|
|
view_path = File.join design_doc, "_view/by_supplier_id_and_state"
|
|
tries = 0
|
|
begin
|
|
view_result = db.view(view_path, reduce: true, group: true, group_level: 2)
|
|
rescue CouchRest::NotFound => e
|
|
puts "Database view #{view_path} not found"
|
|
design_doc_path = File.expand_path('../couchdb_design.yml', __FILE__)
|
|
doc = YAML.load_file design_doc_path
|
|
doc['_id'] = design_doc
|
|
db.save_doc(doc)
|
|
if tries < 3
|
|
tries += 1
|
|
retry
|
|
else
|
|
raise e
|
|
end
|
|
# view not available, initialize as zero
|
|
end
|
|
counts = view_result ? view_result['rows'] : nil
|
|
puts "Initialize with: #{counts.to_yaml}"
|
|
if counts
|
|
counts.each do |count_spec|
|
|
supplier_id, order_state = count_spec['key']
|
|
order_count = count_spec['value']
|
|
case order_state
|
|
when "placed" then set("supplier_counter:#{supplier_id}:orders_placed", order_count)
|
|
when "active" then set("supplier_counter:#{supplier_id}:orders_in_process", order_count)
|
|
end
|
|
end
|
|
end
|
|
rescue => e
|
|
raise e
|
|
end
|
|
end
|
|
drb_port = 9022
|
|
environment = (%w[production staging development test] & [ENV['DRB_ENV']]).first || 'development'
|
|
#InMemoryQCounter.new(reload_stats: true, environment: environment)
|
|
DRb.start_service "druby://:#{drb_port}", InMemoryQCounter.new(reload_stats: true, environment: environment)
|
|
DRb.thread.join
|