Skip to content

Instantly share code, notes, and snippets.

@litvil
Created January 13, 2016 17:12
Show Gist options
  • Save litvil/0563ff8333ef68b52151 to your computer and use it in GitHub Desktop.
Save litvil/0563ff8333ef68b52151 to your computer and use it in GitHub Desktop.
class CachedPrimitiveUserItems < ActiveRecord::Base
set_table_name 'primitive_user_items'
# for admin sapport
attr_accessor :user
class << self
def find_primitive_user_items(user)
cpi = get_record(user)
return nil if cpi.nil?
cpi.to_user_items(user)
end
def save_primitive_user_items(user, items, force = false)
Application.logger.warn {'can not save nil primitives user items due to nil'} if !force && (items.nil? || items.blank? || items.count == 0)
items ||= {}
ServerBenchmark.easy_bench('cached_primitives_save_primitive_user_items') {
primitive_user_items = {}
room ||= Rooms::HOME
counter_items_to_save = {}
items.each do |item_id, quantity|
item_id = item_id.to_i
quantity = quantity.to_i
# Additionally writing counters in Database for easy global access
item = Item[item_id]
if item['save_to_user_items'] == true && (force || quantity != user.inventory_controller.old_barn_items[item_id])
counter_items_to_save[item_id] = quantity
end
next if quantity == 0
primitive_user_items[item_id] = quantity
user.inventory_controller.old_barn_items[item_id] = quantity
end
if counter_items_to_save.any?
save_data = []
counter_items_to_save.each do |item_id, quantity|
save_data.push({'user_id' => user.id, 'item_id' => item_id, 'quantity' => quantity})
end
BatchUpdater.update_or_insert(save_data,
{
:table => 'user_items',
:filter_by => %w(user_id item_id),
:data_fields => %w(user_id item_id quantity),
:update_fields => %w(quantity)
})
end
state = {:data => Base64.encode64(primitive_user_items.to_msgpack), :user_id => user.id}
self.create!(state) if self.update_all(state, :user_id => user.id) == 0
}
end
def get_record(user)
rec = nil
Application.db_pool.with_user_shard(user.user_id) {
rec = CachedPrimitiveUserItems.find_by_user_id(user.id)
}
rec
end
end
def to_user_items user
res={}
ServerBenchmark.easy_bench('cached_primitives_to_user_items') {
vals = nil
ServerBenchmark.easy_bench('MessagePack.unpack') {
vals = MessagePack.unpack(Base64.decode64(data))
}
vals.each do |item_id, v|
ServerBenchmark.easy_bench('kind_of?') {
res[item_id]= (v.kind_of? Integer) ? v : v['q']
}
end
}
res
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment