manqod-server 1.269.0 → 1.280.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,7 +25,7 @@ class DrbDb
25
25
  # @relations=Hash.new
26
26
  # @server=DRb::DRbServer.new(@connection['uri'],self)
27
27
  end
28
- attr_reader :uri, :moditems, :admin, :client, :cache, :connection, :images, :state
28
+ attr_reader :uri, :moditems, :admin, :client, :cache, :connection, :images, :state, :relation_builder
29
29
  attr_accessor :server, :main_server
30
30
 
31
31
  def init
@@ -61,6 +61,8 @@ class DrbDb
61
61
  @moditems[moditem["id"].to_i].update(self)
62
62
  when "form"
63
63
  @moditems[moditem["id"].to_i]=DrbForm.new(self,moditem["id"].to_i).create_skeleton unless @moditems.has_key?(moditem["id"])
64
+ when "relation_builder"
65
+ @relation_builder=@moditems[moditem["id"].to_i]=DrbRelationBuilder.new(self,moditem["id"].to_i) unless @moditems.has_key?(moditem["id"])
64
66
  else
65
67
  ewarn("not caching #{moditem['display']}[#{moditem['modname']}]")
66
68
  end
@@ -76,7 +78,7 @@ class DrbDb
76
78
  start_cron
77
79
  @state=SERVING
78
80
  rescue => err
79
- eerror("failed to start: #{err}")
81
+ eexception(err)
80
82
  retry
81
83
  end
82
84
 
@@ -90,10 +92,22 @@ class DrbDb
90
92
  begin
91
93
  @client=DRb::DRbObject.new(nil,@connection['client_uri'])
92
94
  einfo("client is alive?(#{@client}): #{@client.alive?}")
95
+
96
+ =begin
97
+ @moditems.each_value{|mi|
98
+ ecode(mi.class.name)
99
+ mi.update if mi.class == DrbRelationBuilder
100
+ }
101
+ =end
93
102
  rescue
94
103
  @client=nil
95
104
  einfo("no client.")
96
105
  end
106
+ begin
107
+ @relation_builder.update if @relation_builder && @client
108
+ rescue => err
109
+ eexception(err)
110
+ end
97
111
  end
98
112
  end
99
113
  def name
@@ -141,7 +155,7 @@ class DrbDb
141
155
  edebug("#{new_model} created")
142
156
  new_model.update(self)
143
157
  unless @moditems[moditem_id.to_i].nil?
144
- @moditems[moditem_id.to_i].clients.each{|c| new_model.subscribe(c)}
158
+ @moditems[moditem_id.to_i].clients.each_pair{|client_id,client| new_model.subscribe(client_id,client)}
145
159
  edebug("#{@moditems[moditem_id.to_i]} abandoned")
146
160
  end
147
161
  @moditems[moditem_id.to_i]=new_model
@@ -158,41 +172,63 @@ class DrbDb
158
172
  end
159
173
 
160
174
  def reload_client_images
161
- main_server.connected_clients.each_pair{|cc,cdb|
162
- if cdb == client.name
163
- einfo("sending reload images to #{cc}")
164
- cc.rpc("DrbImages.instance.load_images")
175
+ dead=Array.new
176
+ main_server.connected_clients.each_pair{|client_id,cdb|
177
+ if cdb[:db] == client.name
178
+ begin
179
+ einfo("sending reload images to #{client_id}")
180
+ sdb[:object].rpc("DrbImages.instance.load_images")
181
+ rescue => err
182
+ ewarn("cannot send reload images to #{client_id}")
183
+ dead.push(client_id)
184
+ end
165
185
  end
166
186
  }
187
+ dead.each{|client_id|
188
+ ewarn("killing dead client: #{client_id}")
189
+ remove_client(client_id)
190
+ }
167
191
  end
168
192
 
169
193
  def reload_client_attributes
170
194
  client.load_all_attributes
171
- main_server.connected_clients.each_pair{|cc,cdb|
172
- if cdb == client.name
195
+ dead=Array.new
196
+ main_server.connected_clients.each_pair{|client_id,cdb|
197
+ if cdb[:db] == client.name
173
198
  begin
174
- einfo("sending reload attribute to #{cc}")
175
- cc.rpc("GtkAttributeStorage.instance.load_all")
199
+ einfo("sending reload attribute to #{client_id}")
200
+ cdb[:object].rpc("GtkAttributeStorage.instance.load_all")
176
201
  rescue => err
177
- ewarn("cannot send reload attributes #{err}")
202
+ ewarn("cannot send reload attributes to #{client_id}")
203
+ dead.push(client_id)
178
204
  end
179
205
  end
180
206
  }
207
+ dead.each{|client_id|
208
+ ewarn("killing dead client: #{client_id}")
209
+ remove_client(client_id)
210
+ }
181
211
  end
182
212
 
183
213
  def reload_client_events(goid)
184
214
  einfo("changed client event: #{goid}")
185
215
  client.events(goid,true)
186
- main_server.connected_clients.each_pair{|cc,cdb|
187
- if cdb == client.name
216
+ dead=Array.new
217
+ main_server.connected_clients.each_pair{|client_id,cdb|
218
+ if cdb[:db] == client.name
188
219
  begin
189
- einfo("sending reload event to #{cc}")
190
- cc.rpc("EventCache.instance.reload_events(\"#{goid}\")")
220
+ einfo("sending reload event to #{client_id}")
221
+ cdb[:object].rpc("EventCache.instance.reload_events(\"#{goid}\")")
191
222
  rescue => err
192
- ewarn("cannot send reload events #{err}")
223
+ ewarn("cannot send reload events to #{client_id}")
224
+ dead.push(client_id)
193
225
  end
194
226
  end
195
227
  }
228
+ dead.each{|client_id|
229
+ ewarn("killing dead client: #{client_id}")
230
+ remove_client(client_id)
231
+ }
196
232
  end
197
233
 
198
234
  def auth?(nick,password)
@@ -248,6 +284,10 @@ class DrbDb
248
284
  cnt
249
285
  end
250
286
 
287
+ def remove_client(client_id)
288
+ @moditems.each_value{|m| m.clients.delete(client_id) if m.mod_type == "list"}
289
+ end
290
+
251
291
  def alive?
252
292
  true
253
293
  # server.alive?
@@ -17,7 +17,7 @@ class DrbListModel
17
17
  @fetch_filter_value=nil
18
18
  @fetch_filter_negate=false
19
19
  @archive_key=nil
20
- @clients=Array.new
20
+ @clients=Hash.new
21
21
  @base=nil
22
22
  @last_seq=Hash.new
23
23
  @buttons=Array.new
@@ -205,7 +205,10 @@ class DrbListModel
205
205
  @column_of_fetch_filter=if @fetch_filter_key then headers[@fetch_filter_key]["model_col"] else nil end
206
206
  @column_of_archive=if @archive_key then headers[@archive_key]["model_col"] else nil end
207
207
  hdebug="#{hdebug}\nheadertypes: #{@headertypes.inspect}\nheaders:\n"
208
-
208
+
209
+ @background_legend=Hash.new
210
+ @foreground_legend=Hash.new
211
+
209
212
  @headers.each_value{|val| hdebug="#{hdebug} #{val['data']} #{val['model_col']}\n"}
210
213
  # print "#{self} #{hdebug}\n"
211
214
  @column_of_tree=nil
@@ -343,6 +346,18 @@ class DrbListModel
343
346
  else
344
347
  row[header['data']]
345
348
  end
349
+ #prepare background color
350
+ if @column_of_background == header['model_col'] && iter[@column_of_background].class == String
351
+ cl=iter[@column_of_background].split(":")
352
+ iter[@column_of_background]=cl[0]
353
+ @background_legend[cl[0]]=cl[1]
354
+ end
355
+ #prepare foreground color
356
+ if @column_of_foreground == header['model_col'] && iter[@column_of_foreground].class == String
357
+ cl=iter[@column_of_foreground].split(":")
358
+ iter[@column_of_foreground]=cl[0]
359
+ @foreground_legend[cl[0]]=cl[1]
360
+ end
346
361
  #history
347
362
  unless row_backup.nil?
348
363
  if header.has_key?("id") && row_backup[header['model_col']] != iter[header['model_col']]
@@ -360,6 +375,10 @@ class DrbListModel
360
375
  @rowcount+=1 unless ids
361
376
  }
362
377
 
378
+ #store fore and background legends
379
+ cache.set("#{@my_id}foreground",@foreground_legend)
380
+ cache.set("#{@my_id}background",@background_legend)
381
+
363
382
  if ids and qres.size == 0
364
383
  edebug("removed #{ids.inspect}")
365
384
  #we were called to load_data of a non existing id, which means it was deleted
@@ -582,41 +601,41 @@ class DrbListModel
582
601
  end
583
602
  =end
584
603
 
585
- def subscribe(client)
586
- if @clients.include?(client)
604
+ def subscribe(client_id,client)
605
+ if @clients.has_key?(client_id)
587
606
  false
588
- else
589
- # ecode("subscribing: #{client}, #{client.inspect}")
590
- @clients.push(client)
607
+ else
608
+ edebug("subscribing: #{client_id}")
609
+ @clients[client_id]=client
591
610
  true
592
611
  end
593
612
  end
594
613
 
595
- def unsubscribe(client)
596
- # ecode("unsubscribing: #{client}, #{client.inspect}")
597
- @clients.delete(client)
614
+ def unsubscribe(client_id)
615
+ edebug("unsubscribing: #{client_id}")
616
+ @clients.delete(client_id)
598
617
  end
599
618
 
600
619
  def notify_clients(*args)
601
620
  to_remove=Array.new
602
621
  th=Array.new
603
622
  edebug("notifying #{@clients.size} clients for #{args.inspect}") unless @drbdb.main_server.starting_up || @clients.size==0
604
- @clients.each{|client|
623
+ @clients.each_pair{|client_id,client|
605
624
  th << Thread.new{
606
625
  begin
607
626
  if client.alive?
608
627
  client.update(self.class.name,*args)
609
628
  end
610
629
  rescue =>err
611
- ecode("#{err.inspect}\n\t#{err.backtrace.join("\n\t")}")
612
- to_remove.push(client)
630
+ eexception(err)
631
+ to_remove.push(client_id)
613
632
  end
614
633
  }
615
634
  }
616
635
  th.each{|t| t.join}
617
636
  to_remove.each{|dead|
618
637
  @clients.delete(dead)
619
- edebug("dead client deleted")
638
+ edebug("dead client deleted: #{dead}")
620
639
  }
621
640
  end
622
641
 
@@ -649,19 +668,18 @@ class DrbListModel
649
668
 
650
669
  def remove_dead_clients
651
670
  alive_clients=0
652
- to_remove=Array.new
653
- clients.each{|client|
671
+ clients.delete_if{|client_id,client|
654
672
  begin
655
- client.alive?
656
- alive_clients+=1
657
- rescue
658
- to_remove.push(client)
673
+ Timeout.timeout(3){
674
+ client.alive?
675
+ alive_clients+=1
676
+ false
677
+ }
678
+ rescue
679
+ ewarn("removing dead subscription: #{client_id.inspect}")
680
+ true
659
681
  end
660
682
  }
661
- to_remove.each{|dead|
662
- ewarn("removed dead subscription: #{dead.inspect}")
663
- clients.delete(dead)
664
- }
665
683
  alive_clients
666
684
  end
667
685
 
@@ -0,0 +1,97 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the owner of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ class DrbRelationBuilder
6
+ include Eprint
7
+ include DRbUndumped
8
+
9
+ def initialize(drbdb,my_id)
10
+ @my_id=my_id.to_i
11
+ @drbdb=drbdb
12
+ @title="Relation Builder"
13
+ @relations=Hash.new
14
+ @tables=Hash.new
15
+
16
+ end
17
+ attr_reader :moditem
18
+
19
+ def update
20
+ @relations.clear
21
+ @tables.clear
22
+ @drbdb.rows("select * from tables").each{|row|
23
+ @tables[row["name"]]={
24
+ "id" => row["id"],
25
+ "name" => row["name"],
26
+ "rbx" => row["rbx"].to_f,
27
+ "rby" => row["rby"].to_f
28
+ }
29
+ #indexes
30
+ begin
31
+ @tables[row["name"]]["indexes"]=Array.new
32
+ @drbdb.client.rows("show indexes from #{row['name']}").each{|index|
33
+ @tables[row["name"]]["indexes"].push({
34
+ "name"=>index["Key_name"],
35
+ "unique"=>index["Non_unique"]=="0",
36
+ "field"=>index["Column_name"]
37
+ }
38
+ )
39
+ }
40
+ rescue => err
41
+ eerror(err)
42
+ end
43
+
44
+ #is view?
45
+ is_view=false
46
+ begin
47
+ @drbdb.client.fields("show create table `#{row['name']}`").each{|f| is_view=true if f["name"].include?("View")}
48
+ @tables[row["name"]]["view"]=is_view
49
+ rescue => err
50
+ eerror(err)
51
+ end
52
+
53
+ #fields
54
+ @tables[row["name"]]["fields"]=Hash.new
55
+ begin
56
+ @drbdb.client.rows("show fields from #{row['name']}").each{|field|
57
+ fi=field.rehash
58
+ if f=field["Type"].index("(")
59
+ fi["Size"]=field["Type"][f+1 .. field["Type"].index(")") -1]
60
+ fi["Type"]=field["Type"][0 .. f-1]
61
+ end
62
+ @tables[row["name"]]["fields"][field["Field"]]=fi
63
+ }
64
+ rescue => err
65
+ eerror(err)
66
+ end
67
+
68
+ }
69
+ @drbdb.rows("select * from relations").each{|row|
70
+ @relations[row["id"]]={
71
+ "id" => row["id"],
72
+ "src_table" => row["src_table"],
73
+ "src_field" => row["src_field"],
74
+ "dst_table" => row["dst_table"],
75
+ "dst_field" => row["dst_field"],
76
+ "rel_name" => row['rel_name'],
77
+ "rel_type" => row["rel_type"],
78
+ "rbx" => row["rbx"].to_f,
79
+ "rby" => row["rby"].to_f,
80
+ "rel_custom" => row['rel_custom']
81
+ }
82
+ }
83
+ @drbdb.cache.set("tables",@tables)
84
+ einfo("#{@tables.size} tables")
85
+ @drbdb.cache.set("relations",@relations)
86
+ einfo("#{@relations.size} relations")
87
+ self
88
+ end
89
+
90
+ def mod_type
91
+ "relation_builder"
92
+ end
93
+
94
+ def to_s
95
+ "#{@drbdb}.RelationBuilder"
96
+ end
97
+ end
@@ -7,7 +7,7 @@ module Messaging
7
7
  nick=[nick] unless nick.class == Array
8
8
  Thread.new{
9
9
  nick.each{|n|
10
- admin.query("insert into messages (sender,recipient,subject,body,state,`date`) values('#{sender || "system"}','#{n}','#{subject}','#{body}','n',now())")
10
+ admin.query("insert into messages (sender,recipient,subject,body,state,`date`) values('#{sender || "system"}','#{n}','#{admin.escape_string(subject)}','#{admin.escape_string(body)}','n',now())")
11
11
  send_check_messages(n)
12
12
  }
13
13
  }
@@ -12,18 +12,25 @@ module HeartBeat
12
12
  sleep 10
13
13
  to_remove=Array.new
14
14
  alive_clients=0
15
- @connected_clients.each_pair{|cc,db|
15
+ @connected_clients.delete_if{|client_id,cdb|
16
16
  begin
17
- cc.alive?
18
- alive_clients+=1
19
- rescue
20
- to_remove.push(cc)
17
+ Timeout.timeout(3){
18
+ #ecode("#{cc}.alive?:#{cc.alive?}")
19
+ cdb[:object].alive?
20
+ alive_clients+=1
21
+ false
22
+ }
23
+ rescue Timeout::Error
24
+ ewarn("client timed out, removing a dead client #{client_id}")
25
+ true
26
+ rescue => err
27
+ ewarn("removing a dead client #{client_id}")
28
+ @dbs.each_value{|db|
29
+ db.remove_client(client_id) unless db.serving?
30
+ }
31
+ true
21
32
  end
22
33
  }
23
- to_remove.each{|dead|
24
- ewarn("removed dead client: #{dead.inspect}")
25
- @connected_clients.delete(dead)
26
- }
27
34
 
28
35
  alive_client_lists=0
29
36
  @dbs.each_value{|db|
@@ -33,14 +40,14 @@ module HeartBeat
33
40
  #check for alive client list subscriptions
34
41
  alive_client_lists+=db.remove_dead_clients
35
42
  }
36
- einfo("#{alive_clients} clients #{alive_client_lists} subscriptions alive") unless alive_clients==lalive_clients && alive_client_lists==lalive_client_lists
43
+ einfo("#{alive_clients} clients, #{alive_client_lists} subscriptions") unless alive_clients==lalive_clients && alive_client_lists==lalive_client_lists
37
44
 
38
45
  lalive_clients=alive_clients
39
46
  lalive_client_lists=alive_client_lists
40
47
  rescue ECONNREFUSED => err
41
48
  eerror("HeartBeat: #{err}")
42
49
  rescue =>err
43
- eerror("HeartBeat error: #{err}\n#{err.backtrace.join("\n")}")
50
+ eexception(err)
44
51
  end
45
52
  end
46
53
  }
@@ -49,16 +49,16 @@ class ManqodServer
49
49
  def setup_clients
50
50
  #wait for all clients to start up
51
51
  begin
52
- begin
53
- found=false
54
- @dbs.each_value{|drbdb|
55
- unless drbdb.serving?
56
- found = true
57
- sleep 1
58
- end
59
- }
60
- end while found
61
- @dbs.each_pair{|conn_name,drbdb| drbdb.setup_client unless drbdb.client and drbdb.client.alive?}
52
+ begin
53
+ found=false
54
+ @dbs.each_value{|drbdb|
55
+ unless drbdb.serving?
56
+ found = true
57
+ sleep 1
58
+ end
59
+ }
60
+ end while found
61
+ @dbs.each_pair{|conn_name,drbdb| drbdb.setup_client unless drbdb.client and drbdb.client.alive?}
62
62
  rescue
63
63
  end
64
64
  end
@@ -143,13 +143,13 @@ class ManqodServer
143
143
  exit
144
144
  end
145
145
 
146
- def register_client(client,db)
147
- @connected_clients[client]=db unless @connected_clients.has_key?(client)
148
- einfo("#{client} registered to [#{db}]")
146
+ def register_client(client_id,client_object,client_db)
147
+ @connected_clients[client_id.clone]={:object => client_object, :db => client_db} unless @connected_clients.has_key?(client_id)
148
+ einfo("#{client_id} registered to [#{client_db}]")
149
149
  end
150
- def unregister_client(client)
151
- @connected_clients.delete(client)
152
- einfo("#{client} unregistered")
150
+ def unregister_client(client_id)
151
+ @connected_clients.delete(client_id)
152
+ einfo("#{client_id} unregistered")
153
153
  end
154
154
 
155
155
  def alive?