class DrbDb
this file is part of manqod manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
Constants
- INIT
- LOADING
- SERVING
Attributes
admin[R]
cache[R]
client[R]
connection[R]
images[R]
main_server[RW]
moditems[R]
relation_builder[R]
server[RW]
state[R]
uri[R]
Public Class Methods
new(connection,main_server_uri)
click to toggle source
# File lib/DrbDB.rb, line 19 def initialize(connection,main_server_uri) @state=INIT @connection=connection @main_server_uri=main_server_uri @moditems=Hash.new #[moditem_id][id][fields] @server=nil # @relations=Hash.new # @server=DRb::DRbServer.new(@connection['uri'],self) end
Public Instance Methods
alive?()
click to toggle source
# File lib/DrbDB.rb, line 291 def alive? true # server.alive? end
auth?(nick,password)
click to toggle source
# File lib/DrbDB.rb, line 234 def auth?(nick,password) r=@users.auth?(nick,password) edebug("auth?(#{nick}):#{r}") r end
changed_ids_of_base(base,ids,nick=nil)
click to toggle source
# File lib/DrbDB.rb, line 255 def changed_ids_of_base(base,ids,nick=nil) base_moditem=nil moditems_with_base(base){|b| base_moditem=b } unless base_moditem.nil? base_moditem.rows_changed(ids,nick) end end
each_moditem(modtype = "list") { |m| ... }
click to toggle source
# File lib/DrbDB.rb, line 275 def each_moditem(modtype = "list") @moditems.each_value{|m| yield m if m.mod_type == modtype } end
exit()
click to toggle source
Calls superclass method
# File lib/DrbDB.rb, line 304 def exit @server.stop_service super end
init()
click to toggle source
# File lib/DrbDB.rb, line 31 def init einfo("Memcached #{Memcached::VERSION}") @cache = Memcached.new([@connection['cache_host']],{:prefix_key=>key_name, :default_ttl => 0, :timeout => 30}) DRb.start_service(@connection["uri"],self) @server=DRb.current_server() @main_server=DRb::DRbObject.new_with_uri(@main_server_uri) @uri=server.uri() unless init_sql(@connection['sql_host'],@connection['sql_user'],@connection['sql_password'],@connection['sql_db']) eerror("connection to sql server failed: #{@connection['sql_user']}@#{@connection['sql_host']}/#{@connection['sql_db']}") return nil end update_manqod_db begin begin @admin=DRb::DRbObject.new(nil,@connection['admin_uri']) we_have_admin=@admin.alive? rescue ewarn("no admin?") sleep 1 end end until we_have_admin begin @state=LOADING load_all_attributes admin.rows("select moditems.id,modules.modname,moditems.display from moditems left join modules on modules.id = moditems.modid").each{|moditem| begin case moditem["modname"] when "listing" @moditems[moditem["id"].to_i]=DrbListModel.new(self,moditem["id"].to_i).create_skeleton unless @moditems.has_key?(moditem["id"]) @moditems[moditem["id"].to_i].update(self) when "form" @moditems[moditem["id"].to_i]=DrbForm.new(self,moditem["id"].to_i).create_skeleton unless @moditems.has_key?(moditem["id"]) when "relation_builder" @relation_builder=@moditems[moditem["id"].to_i]=DrbRelationBuilder.new(self,moditem["id"].to_i) unless @moditems.has_key?(moditem["id"]) else ewarn("not caching #{moditem['display']}[#{moditem['modname']}]") end rescue =>err ewarn("error loading moditem: #{moditem.inspect}") eexception(err,:moditem => moditem) end } @images=DrbImages.new(self).load_all @users=Users.new(self).load_all load_all_events load_all_help start_cron @state=SERVING rescue => err eexception(err) retry end DRb.thread.join einfo("EXITED") exit end
key_name()
click to toggle source
# File lib/DrbDB.rb, line 116 def key_name @connection['key_name'] end
lock_id_of_base(base,lid)
click to toggle source
# File lib/DrbDB.rb, line 265 def lock_id_of_base(base,lid) ids=if lid.class == Array then lid else [lid] end moditems_with_base(base){|b| ids.each{|iid| b.lock_iter(iid)}} end
moditem(mod_id)
click to toggle source
# File lib/DrbDB.rb, line 121 def moditem(mod_id) @moditems[mod_id.to_i] end
moditems_with_base(base) { |drblist| ... }
click to toggle source
# File lib/DrbDB.rb, line 249 def moditems_with_base(base) @moditems.each_value{|drblist| yield drblist if drblist && drblist.mod_type == "list" && drblist.base == base } end
mygroups(nick)
click to toggle source
# File lib/DrbDB.rb, line 245 def mygroups(nick) @users.mygroups(nick) end
name()
click to toggle source
# File lib/DrbDB.rb, line 113 def name @connection['name'] end
reload_client_attributes()
click to toggle source
# File lib/DrbDB.rb, line 193 def reload_client_attributes client.load_all_attributes dead=Array.new main_server.connected_clients.each_pair{|client_id,cdb| if cdb[:db] == client.name begin einfo("sending reload attribute to #{client_id}") cdb[:object].rpc("GtkAttributeStorage.instance.load_all") rescue => err ewarn("cannot send reload attributes to #{client_id}") dead.push(client_id) end end } dead.each{|client_id| ewarn("killing dead client: #{client_id}") remove_client(client_id) } end
reload_client_events(goid)
click to toggle source
# File lib/DrbDB.rb, line 213 def reload_client_events(goid) einfo("changed client event: #{goid}") client.events(goid,true) dead=Array.new main_server.connected_clients.each_pair{|client_id,cdb| if cdb[:db] == client.name begin einfo("sending reload event to #{client_id}") cdb[:object].rpc("EventCache.instance.reload_events(\"#{goid}\")") rescue => err ewarn("cannot send reload events to #{client_id}") dead.push(client_id) end end } dead.each{|client_id| ewarn("killing dead client: #{client_id}") remove_client(client_id) } end
reload_client_images()
click to toggle source
# File lib/DrbDB.rb, line 174 def reload_client_images dead=Array.new main_server.connected_clients.each_pair{|client_id,cdb| if cdb[:db] == client.name begin einfo("sending reload images to #{client_id}") sdb[:object].rpc("DrbImages.instance.load_images") rescue => err ewarn("cannot send reload images to #{client_id}") dead.push(client_id) end end } dead.each{|client_id| ewarn("killing dead client: #{client_id}") remove_client(client_id) } end
reload_moditem(moditem_id)
click to toggle source
# File lib/DrbDB.rb, line 125 def reload_moditem(moditem_id) @state=LOADING if moditem(moditem_id).nil? einfo("creating moditem ##{moditem_id}") #moditem added admin.rows("select moditems.id,modules.modname,moditems.display from moditems left join modules on modules.id = moditems.modid where moditems.id='#{moditem_id}'").each{|moditem| begin case moditem["modname"] when "listing" @moditems[moditem["id"].to_i]=DrbListModel.new(self,moditem["id"].to_i).create_skeleton unless @moditems.has_key?(moditem["id"]) @moditems[moditem["id"].to_i].update(self) when "form" @moditems[moditem["id"].to_i]=DrbForm.new(self,moditem["id"].to_i).create_skeleton unless @moditems.has_key?(moditem["id"]) else eerror("not caching #{moditem['display']}[#{moditem['modname']}]") end rescue =>err ewarn("error loading moditem: #{moditem.inspect}") eexception(err,:moditem => moditem) end } else einfo("reloading moditem ##{moditem_id}") case moditem(moditem_id).mod_type when "list" new_model=DrbListModel.new(self,moditem_id).create_skeleton edebug("#{new_model} created") new_model.update(self) unless @moditems[moditem_id.to_i].nil? @moditems[moditem_id.to_i].clients.each_pair{|client_id,client| new_model.subscribe(client_id,client)} edebug("#{@moditems[moditem_id.to_i]} abandoned") end @moditems[moditem_id.to_i]=new_model @moditems[moditem_id.to_i].notify_clients(nil,"structure") when "form" moditem(moditem_id).create_skeleton end end @state=SERVING end
reload_users()
click to toggle source
# File lib/DrbDB.rb, line 170 def reload_users @users.load_all end
remove_client(client_id)
click to toggle source
# File lib/DrbDB.rb, line 287 def remove_client(client_id) @moditems.each_value{|m| m.unsubscribe(client_id) if m.mod_type == "list"} end
remove_dead_clients()
click to toggle source
# File lib/DrbDB.rb, line 281 def remove_dead_clients cnt=0 @moditems.each_value{|m| cnt+=m.remove_dead_clients if m.mod_type == "list"} cnt end
report_mail(subject, variables)
click to toggle source
def method_missing(sym,*args)
p "#{self} missing method: #{sym}(#{args})"
end
# File lib/DrbDB.rb, line 300 def report_mail(subject, variables) @main_server.report_mail(subject,variables) end
sendmail(nick,subject,body)
click to toggle source
# File lib/DrbDB.rb, line 239 def sendmail(nick,subject,body) sendmail_to_nick(nick,subject,body) end
serving?()
click to toggle source
# File lib/DrbDB.rb, line 309 def serving? @state==SERVING end
setup_client()
click to toggle source
# File lib/DrbDB.rb, line 90 def setup_client if @connection['client_uri'].length>0 begin @client=DRb::DRbObject.new(nil,@connection['client_uri']) einfo("client is alive?(#{@client}): #{@client.alive?}") =begin @moditems.each_value{|mi| ecode(mi.class.name) mi.update if mi.class == DrbRelationBuilder } =end rescue @client=nil einfo("no client.") end begin @relation_builder.update if @relation_builder && @client rescue => err eexception(err) end end end
to_s()
click to toggle source
# File lib/DrbDB.rb, line 313 def to_s "[ManqodDb #{name}(#{Process.pid})]" end
unlock_id_of_base(base,lid)
click to toggle source
# File lib/DrbDB.rb, line 270 def unlock_id_of_base(base,lid) ids=if lid.class == Array then lid else [lid] end moditems_with_base(base){|b| ids.each{|iid| b.unlock_iter(iid)}} end
user_in_group?(user_id,group_id)
click to toggle source
# File lib/DrbDB.rb, line 242 def user_in_group?(user_id,group_id) @users.user_in_group?(user_id,group_id) end