class ServerConsole

this file is part of manqod-server-console manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)

Public Class Methods

new(name,server_uri,client_uri) click to toggle source
Calls superclass method
# File lib/ServerConsole.rb, line 18
def initialize(name,server_uri,client_uri)
        super("Manqod Server Console on #{name}")
        signal_connect("destroy") {|me| Gtk.main_quit}
        set_size_request(600,400)
require 'drb'
DRb.start_service(client_uri)
@manqod_server=DRb::DRbObject.new(nil,server_uri)
begin
        @manqod_server.alive?
rescue =>err
        retry if Gtk::warn("no server?","tried: #{server_uri}\n#{err}\n",ERROR,true)
        exit
end


#type,conn_name,conn_display,moditem_id,moditem_display
#types:0=connection,1=moditem
tree_store=MyStore.new(Integer,String,String,Integer,String,String)
view=Gtk::TreeView.new(tree_store)



renderer = Gtk::CellRendererText.new
#view.append_column(conn_col=Gtk::TreeViewColumn.new("connections", renderer, :text => 0))
view.append_column(conn_col=Gtk::TreeViewColumn.new("Server", renderer, :text => 2))
view.append_column(moditem_col = Gtk::TreeViewColumn.new("List", renderer, :text => 4))
view.append_column(cnt_col = Gtk::TreeViewColumn.new("Rows", renderer, :text => 5))
view.set_expander_column(moditem_col).set_enable_tree_lines(true)

begin
@manqod_server.conn_list{|conn_name,conn|
        iter=tree_store.append(nil)
        iter[0]=0
        iter[1]=conn_name
        iter[2]=conn["name"]
}
rescue =>err
        retry if Gtk::warn("cannot fill connections list!\nserver is gone?","tried: #{server_uri}\n#{err}\n#{err.backtrace.join("\n")}",ERROR,true)
end

begin
@manqod_server.dbs.each_pair{|conn_name,db|
        piter=tree_store.find_iter(1,conn_name)
        begin
        db.each_moditem{|drb_list_model|
                iter=tree_store.append(piter)
                iter[0]=1
                iter[3]=drb_list_model.get_id
                iter[4]=drb_list_model.moditem["display"]
                iter[5]=drb_list_model.rowcount.to_s
        }
        rescue => err
                p err 
        end
}
rescue =>err
        retry if Gtk::warn("cannot get dbs!\nserver is gone?","tried: #{server_uri}\n#{err}\n#{err.backtrace.join("\n")}",ERROR,true)
end


def edit_connection(view,tree_store,parent_window)
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                cn=cur_iter[1]
                else
                Gtk::warn("select a connection first!")
                return
        end
        begin
                cp=ConnectionProperties.new(parent_window,cn,@manqod_server)
                cur_iter[2]=cp.run
        rescue =>err
                retry if Gtk::warn("tried to edit #{cn}",err,ERROR)
        end
end

holder=Gtk::VBox.new
holder.pack_start(buttons=Gtk::Toolbar.new,false,false)
holder.pack_end(Gtk::ScrolledWindow.new.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC).add(view))
buttons.append(Gtk::Stock::NEW,"create a new connection"){
        if Gtk::ask("create a new connection?")
                dialog=Gtk::Dialog.new("Connection Properties",self,Gtk::Dialog::MODAL,[Gtk::Stock::OK,Gtk::Dialog::RESPONSE_ACCEPT],[Gtk::Stock::CANCEL,Gtk::Dialog::RESPONSE_REJECT])
                dh=Gtk::Table.new(2,1)
                dh.attach_defaults(Gtk::Label.new("connection name"),0,1,0,1)
                dh.attach_defaults(name=Gtk::Entry.new,1,2,0,1)
                name.text="new"
                dialog.vbox.pack_start(dh)
                dialog.show_all
                if dialog.run==Gtk::Dialog::RESPONSE_ACCEPT
                        iter=tree_store.append(nil);
                        iter[0]=0
                        iter[1]=name.text
                        iter[2]=name.text
                        view.set_cursor(iter.path,nil,false)
                        begin
                                @manqod_server.create_conn(name.text)
                                @manqod_server.set_conn_variables(name.text,{"name" => name.text,
                                        "uri" => "druby://:5550",
                                        "cache_host" => "localhost",
                                        "sql_host" => "localhost",
                                        "sql_user" => "root",
                                        "sql_password" => "",
                                        "sql_db" => "manqod",
                                        "admin_uri" => "druby://127.0.0.1:5549",
                                        "client_uri" => "druby://127.0.0.1:5549",
                                        "auto_load" => true,
                                        "auto_load_order" => "1",
                                        "client_default" => false}
                                )
                        rescue =>err
                                retry if Gtk::warn("Creating new connection failed",err,ERROR,true)
                        end
                end
                dialog.destroy
        end
}
buttons.append(Gtk::Stock::PROPERTIES,"set the connection's properties"){edit_connection(view,tree_store,self)}
buttons.append(Gtk::Stock::REMOVE,"remove the connection"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                if Gtk::ask("delete the connection from the server?")
                        cn=cur_iter[1]
                        begin
                                @manqod_server.remove_conn(cn)
                        rescue => err
                                retry if Gtk::warn("server is gone?\ntried: #{server_uri}",err,ERROR,true)
                        end
                        tree_store.remove(cur_iter)
                end
        else
                Gtk::warn("select a connection first!")
        end
}
buttons.append_space
buttons.append(Gtk::Stock::EXECUTE,"start the selected server thread"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                cn=cur_iter[1]
                begin
                @manqod_server.load_conn(cn)
                @manqod_server.dbs[cn].moditems.each_pair{|moditem_id,drb_list_model|
                        iter=tree_store.append(cur_iter)
                        iter[0]=1
                        iter[3]=moditem_id
                        iter[4]=drb_list_model.moditem["display"]
                }
                rescue
                        retry if Gtk::warn("Starting server thread #{cn} failed",err,ERROR,true)
                end
        else
                Gtk::warn("select a connection first!")
        end
}
buttons.append(Gtk::Stock::STOP,"stop the selected server thread"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                cn=cur_iter[1]
                if Gtk::ask("stop server thread #{cn}?")
                        while cur_iter.has_child? do if i=cur_iter.clone.first_child then tree_store.remove(i) end end
#               tree_store.each{|model,path,iter| tree_store.remove(iter) if iter.parent == cur_iter}
                        begin
                                @manqod_server.free_conn(cn)
                        rescue =>err
                                retry if Gtk::warn("Stop server thread #{cn} failed",err,ERROR,true)
                        end
                end
        else
                Gtk::warn("select a server to stop")
        end
}
buttons.append(Gtk::Stock::REFRESH,"reload the selected server thread"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                cn=cur_iter[1]
                if Gtk::ask("reload server thread #{cn}?")
                        while cur_iter.has_child? do if i=cur_iter.clone.first_child then tree_store.remove(i) end end
                        begin
                                @manqod_server.reload_conn(cn)
                                @manqod_server.dbs[cn].moditems.each_pair{|moditem_id,drb_list_model|
                                        iter=tree_store.append(cur_iter)
                                        iter[0]=1
                                        iter[3]=moditem_id
                                        iter[4]=drb_list_model.moditem["display"]
                                }
                        rescue =>err
                                retry if Gtk::warn("Reload server thread #{cn} failed",err,ERROR,true)
                        end
                end
        else
                Gtk::warn("select a server thread to reload")
        end
}
buttons.append_space
buttons.append(Gtk::Stock::REFRESH,"reload the selected list"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]!=0
                cn=cur_iter.parent[1]
                if Gtk::ask("reload item #{cur_iter[3]} on server thread #{cn}?")
                        begin
                                @manqod_server.dbs[cn].reload_moditem(cur_iter[3])
                        rescue =>err
                                retry if Gtk::warn("Reload list #{cn} failed",err,ERROR,true)
                        end
                end
        else
                Gtk::warn("select an item to reload")
        end
}
buttons.append(Gtk::Stock::JUMP_TO,"download selected list"){
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]!=0
                cn=cur_iter.parent[1]
                if Gtk::ask("download item #{cur_iter[3]} on server thread #{cn}?")
                        begin
                                list=@manqod_server.dbs[cn].moditem(cur_iter[3]).filtered_fetch2
                                print "downloaded #{list.size} rows\n"
                        rescue =>err
                                retry if Gtk::warn("Download test of #{cn} failed",err,ERROR,true)
                        end
                end
        else
                Gtk::warn("select an item to download")
        end
}
buttons.append_space
buttons.append(Gtk::Stock::STOP,"Stop manqod server"){
if Gtk::ask("Are you sure you want to stop the manqod server and all it's server threads?")
        begin
                @manqod_server.stop
        rescue =>err
                retry if Gtk::warn("Stop server failed",err,ERROR,true)
        end
        Gtk.main_quit if Gtk::ask("Nothing to do here anymore,\nDo you wan to  Quit?")
end
}
buttons.append(Gtk::Stock::ABOUT,"about the registered users"){
        
        wu=Gtk::Window.new('Manqod Server Console')
        wu.move(position[0]+size[0]+10,position[1])
        wu.set_size_request(200,size[1])

        tree_store=Gtk::ListStore.new(String,String)
        view=Gtk::TreeView.new(tree_store)
        renderer = Gtk::CellRendererText.new
        view.append_column(Gtk::TreeViewColumn.new("Connection", renderer, :text => 0))
        view.append_column(Gtk::TreeViewColumn.new("Nick", renderer, :text => 1))
        wu.add(view)
        wu.show_all

        begin
                @manqod_server.connected_clients.each_pair{|rpc,db|
                        iter=tree_store.append
                        iter[0]=db
                        begin
                                iter[1]=rpc.nick
                        rescue =>e
                                #connection failed
                        end
                }
        rescue =>err
                retry if Gtk::warn("Fetching client list failed",err,ERROR,true)
        end

}
buttons.append(Gtk::Stock::QUIT,"leave manqod-server-console"){Gtk.main_quit if Gtk::ask("Really Quit?")}
buttons.set_toolbar_style(Gtk::Toolbar::ICONS)
add(holder)
show_all
end

Public Instance Methods

edit_connection(view,tree_store,parent_window) click to toggle source
# File lib/ServerConsole.rb, line 78
def edit_connection(view,tree_store,parent_window)
        if view.cursor[0] and cur_iter=tree_store.get_iter(view.cursor[0]) and cur_iter[0]==0
                cn=cur_iter[1]
                else
                Gtk::warn("select a connection first!")
                return
        end
        begin
                cp=ConnectionProperties.new(parent_window,cn,@manqod_server)
                cur_iter[2]=cp.run
        rescue =>err
                retry if Gtk::warn("tried to edit #{cn}",err,ERROR)
        end
end