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