Class: DrbDb
Overview
this file is part of manqod manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint([email protected])
Constant Summary
collapse
- INIT =
0
- LOADING =
1
- SERVING =
2
Constants included
from Eprint
Eprint::TERM_COLOUR
Instance Attribute Summary collapse
Attributes included from Cron
#scheduler
Instance Method Summary
collapse
-
#alive? ⇒ Boolean
-
#auth?(nick, password) ⇒ Boolean
-
#changed_ids_of_base(base, ids, nick = nil) ⇒ Object
-
#each_moditem(modtype = "list") ⇒ Object
-
#exit ⇒ Object
-
#init ⇒ Object
-
#initialize(connection, main_server_uri) ⇒ DrbDb
constructor
-
#key_name ⇒ Object
-
#lock_id_of_base(base, lid) ⇒ Object
-
#moditem(mod_id) ⇒ Object
-
#moditems_with_base(base) ⇒ Object
-
#mygroups(nick) ⇒ Object
-
#name ⇒ Object
-
#reload_client_attributes ⇒ Object
-
#reload_client_events(goid) ⇒ Object
-
#reload_client_images ⇒ Object
-
#reload_moditem(moditem_id) ⇒ Object
-
#reload_users ⇒ Object
-
#remove_client(client_id) ⇒ Object
-
#remove_dead_clients ⇒ Object
-
#report_mail(subject, variables) ⇒ Object
def method_missing(sym,*args) p “#self missing method: #sym(#args)” end.
-
#sendmail(nick, subject, body) ⇒ Object
-
#serving? ⇒ Boolean
-
#setup_client ⇒ Object
-
#to_s ⇒ Object
-
#unlock_id_of_base(base, lid) ⇒ Object
-
#user_in_group?(user_id, group_id) ⇒ Boolean
Methods included from Messaging
#delete_message, #messages, #send_check_messages, #send_message, #sendmail_to_nick, #set_message_read, #unread_messages
Methods included from EventCache
#events, #load_all_events
#gtk_attribute, #gtk_attribute_of_object, #load_all_attributes
Methods included from Cron
#add_cron, #remove_cron, #reset_cron, #start_cron, #stop_cron
Methods included from Help
#load_all_help, #remove_help_format, #remove_help_item, #save_help_format, #save_help_item
Methods included from SQL
#add_where, #escape_string, #fields, #guess_base, #guess_table, #init_sql, #jruby?, #prepare_sql, #qrow, #query, #rows, #select_last, #top_level, #update_manqod_db
Methods included from Eprint
#ecode, #edebug, #eerror, #eeval, #eexception, #efatal, #einfo, #eprint, #ewarn, #getBinding
Constructor Details
#initialize(connection, main_server_uri) ⇒ DrbDb
Returns a new instance of DrbDb.
19
20
21
22
23
24
25
26
27
|
# 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 @server=nil
end
|
Instance Attribute Details
#admin ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def admin
@admin
end
|
#cache ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def cache
@cache
end
|
#client ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def client
@client
end
|
#connection ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def connection
@connection
end
|
#images ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def images
@images
end
|
#main_server ⇒ Object
Returns the value of attribute main_server.
29
30
31
|
# File 'lib/DrbDB.rb', line 29
def main_server
@main_server
end
|
#moditems ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def moditems
@moditems
end
|
#relation_builder ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def relation_builder
@relation_builder
end
|
#server ⇒ Object
Returns the value of attribute server.
29
30
31
|
# File 'lib/DrbDB.rb', line 29
def server
@server
end
|
#state ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def state
@state
end
|
#uri ⇒ Object
28
29
30
|
# File 'lib/DrbDB.rb', line 28
def uri
@uri
end
|
Instance Method Details
#alive? ⇒ Boolean
291
292
293
294
|
# File 'lib/DrbDB.rb', line 291
def alive?
true
end
|
#auth?(nick, password) ⇒ Boolean
234
235
236
237
238
|
# 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) ⇒ Object
255
256
257
258
259
260
261
262
263
|
# 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") ⇒ Object
275
276
277
278
279
|
# File 'lib/DrbDB.rb', line 275
def each_moditem(modtype = "list")
@moditems.each_value{|m|
yield m if m.mod_type == modtype
}
end
|
#exit ⇒ Object
304
305
306
307
|
# File 'lib/DrbDB.rb', line 304
def exit
@server.stop_service
super
end
|
#init ⇒ Object
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
# 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 ⇒ Object
116
117
118
|
# File 'lib/DrbDB.rb', line 116
def key_name
@connection['key_name']
end
|
#lock_id_of_base(base, lid) ⇒ Object
265
266
267
268
|
# 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) ⇒ Object
121
122
123
|
# File 'lib/DrbDB.rb', line 121
def moditem(mod_id)
@moditems[mod_id.to_i]
end
|
#moditems_with_base(base) ⇒ Object
249
250
251
252
253
|
# 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) ⇒ Object
245
246
247
|
# File 'lib/DrbDB.rb', line 245
def mygroups(nick)
@users.mygroups(nick)
end
|
#name ⇒ Object
113
114
115
|
# File 'lib/DrbDB.rb', line 113
def name
@connection['name']
end
|
#reload_client_attributes ⇒ Object
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
# 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) ⇒ Object
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
# 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 ⇒ Object
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
# 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) ⇒ Object
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
# File 'lib/DrbDB.rb', line 125
def reload_moditem(moditem_id)
@state=LOADING
if moditem(moditem_id).nil?
einfo("creating moditem ##{moditem_id}")
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 ⇒ Object
170
171
172
|
# File 'lib/DrbDB.rb', line 170
def reload_users
@users.load_all
end
|
#remove_client(client_id) ⇒ Object
287
288
289
|
# 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 ⇒ Object
281
282
283
284
285
|
# 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) ⇒ Object
def method_missing(sym,*args) p “#self missing method: #sym(#args)” end
300
301
302
|
# File 'lib/DrbDB.rb', line 300
def report_mail(subject, variables)
@main_server.report_mail(subject,variables)
end
|
#sendmail(nick, subject, body) ⇒ Object
239
240
241
|
# File 'lib/DrbDB.rb', line 239
def sendmail(nick,subject,body)
sendmail_to_nick(nick,subject,body)
end
|
#serving? ⇒ Boolean
309
310
311
|
# File 'lib/DrbDB.rb', line 309
def serving?
@state==SERVING
end
|
#setup_client ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
# 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 ⇒ Object
313
314
315
|
# File 'lib/DrbDB.rb', line 313
def to_s
"[ManqodDb #{name}(#{Process.pid})]"
end
|
#unlock_id_of_base(base, lid) ⇒ Object
270
271
272
273
|
# 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) ⇒ Boolean
242
243
244
|
# File 'lib/DrbDB.rb', line 242
def user_in_group?(user_id,group_id)
@users.user_in_group?(user_id,group_id)
end
|