manqod-server 1.257.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.
- data/bin/manqod-server +96 -0
- data/doc/HOWTO +8 -0
- data/doc/INSTALL +2 -0
- data/doc/LICENCE +450 -0
- data/doc/README +24 -0
- data/doc/gentoo/etc/conf.d/manqod-server +2 -0
- data/doc/gentoo/etc/init.d/manqod-server +32 -0
- data/doc/manqod.sql +440 -0
- data/doc/manqod_structure.sql +356 -0
- data/doc/server.conf.example +19 -0
- data/etc/update.sql +35 -0
- data/lib/DBSetup.rb +98 -0
- data/lib/DrbDB/Cron.rb +66 -0
- data/lib/DrbDB/DrbForm.rb +79 -0
- data/lib/DrbDB/DrbImages.rb +39 -0
- data/lib/DrbDB/DrbListModel.rb +671 -0
- data/lib/DrbDB/EventCache.rb +47 -0
- data/lib/DrbDB/GtkAttributes.rb +39 -0
- data/lib/DrbDB/Help.rb +47 -0
- data/lib/DrbDB/Messaging.rb +75 -0
- data/lib/DrbDB/MyMultiSQL/jdbc.rb +107 -0
- data/lib/DrbDB/MyMultiSQL/mysql-ruby.rb +114 -0
- data/lib/DrbDB/MyMultiSQL.rb +226 -0
- data/lib/DrbDB/Users.rb +61 -0
- data/lib/DrbDB.rb +274 -0
- data/lib/Eprint.rb +94 -0
- data/lib/HeartBeat.rb +54 -0
- data/lib/ManqodLogger.rb +27 -0
- data/lib/ManqodServer.rb +167 -0
- metadata +132 -0
@@ -0,0 +1,47 @@
|
|
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
|
+
module EventCache
|
6
|
+
|
7
|
+
def load_all_events
|
8
|
+
cnt=0
|
9
|
+
admin.rows("select distinct gtkobjectid from events").each{|evid|
|
10
|
+
a=Hash.new
|
11
|
+
admin.rows("select * from events where gtkobjectid = '#{evid['gtkobjectid']}'").each{|row|
|
12
|
+
a[row['event']]=Array.new unless a.has_key?(row['event'])
|
13
|
+
a[row['event']].push(row['command'])
|
14
|
+
cnt+=1
|
15
|
+
}
|
16
|
+
cache.set("ev#{evid['gtkobjectid']}",a)
|
17
|
+
}
|
18
|
+
einfo("loaded #{cnt} events")
|
19
|
+
end
|
20
|
+
|
21
|
+
def events(gtk_object_id,force_load=false)
|
22
|
+
if force_load
|
23
|
+
begin
|
24
|
+
cache.delete("ev#{gtk_object_id}")
|
25
|
+
rescue Memcached::NotFound
|
26
|
+
end
|
27
|
+
cnt=0
|
28
|
+
a=Hash.new
|
29
|
+
admin.rows("select * from events where gtkobjectid = '#{gtk_object_id}'").each{|row|
|
30
|
+
a[row['event']]=Array.new unless a.has_key?(row['event'])
|
31
|
+
a[row['event']].push(row['command'])
|
32
|
+
cnt+=1
|
33
|
+
}
|
34
|
+
cache.set("ev#{gtk_object_id}",a) if a.size>0
|
35
|
+
|
36
|
+
einfo("loaded #{cnt.inspect} events for #{gtk_object_id.inspect}")
|
37
|
+
end
|
38
|
+
begin
|
39
|
+
a=cache.set("ev#{gtk_object_id}",a)
|
40
|
+
rescue Memcached::NotFound
|
41
|
+
a=Array.new
|
42
|
+
end
|
43
|
+
a
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,39 @@
|
|
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
|
+
module GtkAttributes
|
6
|
+
def load_all_attributes
|
7
|
+
@gtk_attributes=Hash.new
|
8
|
+
cnt=0
|
9
|
+
admin.rows("select * from gtkattributes").each{|row|
|
10
|
+
@gtk_attributes[row["gtkobjectid"]]=Hash.new unless @gtk_attributes.has_key?(row["gtkobjectid"])
|
11
|
+
@gtk_attributes[row["gtkobjectid"]][row["gtkobjecttype"]]=Hash.new unless @gtk_attributes[row["gtkobjectid"]].has_key?(row["gtkobjecttype"])
|
12
|
+
@gtk_attributes[row["gtkobjectid"]][row["gtkobjecttype"]][row["attribute"]]=row['data']
|
13
|
+
cnt+=1
|
14
|
+
}
|
15
|
+
cache.set("attributes",@gtk_attributes)
|
16
|
+
einfo("loaded #{cnt} attributes")
|
17
|
+
end
|
18
|
+
|
19
|
+
def gtk_attribute(gtk_attr, context=self)
|
20
|
+
|
21
|
+
got=case context.class.name
|
22
|
+
when "DrbListModel" then "list"
|
23
|
+
when "DrbForm" then "form"
|
24
|
+
else edebug("unsupported class in gtk_attributes: #{context.class.name} for #{context}")
|
25
|
+
end
|
26
|
+
|
27
|
+
(@gtk_attributes.has_key?(context.get_id.to_s) ?
|
28
|
+
( (@gtk_attributes[context.get_id.to_s].has_key?(got)) ?
|
29
|
+
@gtk_attributes[context.get_id.to_s][got][gtk_attr] : nil) : nil )
|
30
|
+
end
|
31
|
+
|
32
|
+
def gtk_attribute_of_object(gtk_attr,gtkobject_id,gtkobject_type)
|
33
|
+
(@gtk_attributes.has_key?(gtkobject_id.to_s) ?
|
34
|
+
( (@gtk_attributes[gtkobject_id.to_s].has_key?(gtkobject_type)) ?
|
35
|
+
@gtk_attributes[gtkobject_id.to_s][gtkobject_type][gtk_attr] : nil) : nil )
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
data/lib/DrbDB/Help.rb
ADDED
@@ -0,0 +1,47 @@
|
|
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
|
+
module Help
|
6
|
+
def load_all_help
|
7
|
+
h=Hash.new
|
8
|
+
admin.rows("select * from help_items").each{|item|
|
9
|
+
h[item["index"]]=item["description"]
|
10
|
+
}
|
11
|
+
|
12
|
+
f=Hash.new
|
13
|
+
admin.rows("select * from help_formats").each{|format|
|
14
|
+
begin
|
15
|
+
f[format["name"]]=eval(format["format_dump"])
|
16
|
+
rescue => err
|
17
|
+
eerror("loading Help Tag Format: #{err}")
|
18
|
+
end
|
19
|
+
}
|
20
|
+
|
21
|
+
cache.set("help_items",h)
|
22
|
+
cache.set("help_formats",f)
|
23
|
+
einfo("ManqodHelp: loaded #{h.size} items and #{f.size} formats")
|
24
|
+
end
|
25
|
+
|
26
|
+
def save_help_item(index,description)
|
27
|
+
admin.query("replace into help_items set `index`='#{index}', `description`='#{description}'")
|
28
|
+
load_all_help
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_help_item(index)
|
32
|
+
admin.query("delete from help_items where `index`='#{index}'")
|
33
|
+
load_all_help
|
34
|
+
end
|
35
|
+
|
36
|
+
def save_help_format(name,format)
|
37
|
+
e=Hash.new
|
38
|
+
format.each_pair{|key,val| e[key]=val}
|
39
|
+
admin.query("replace into help_formats set `name`='#{name}', `format_dump`='#{e.inspect}'")
|
40
|
+
load_all_help
|
41
|
+
end
|
42
|
+
|
43
|
+
def remove_help_format(name)
|
44
|
+
admin.query("delete from help_formats where `name`='#{name}'")
|
45
|
+
load_all_help
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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
|
+
module Messaging
|
6
|
+
def send_message(nick,subject,body,sender=nil,sendmail=true)
|
7
|
+
nick=[nick] unless nick.class == Array
|
8
|
+
Thread.new{
|
9
|
+
nick.each{|n|
|
10
|
+
admin.query("insert into messages (sender,recipient,subject,body,state,`date`) values('#{sender || "system"}','#{n}','#{subject}','#{body}','n',now())")
|
11
|
+
send_check_messages(n)
|
12
|
+
}
|
13
|
+
}
|
14
|
+
sendmail_to_nick(nick,subject,body) if sendmail
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_check_messages(nick)
|
18
|
+
main_server.connected_clients.each_key{|client|
|
19
|
+
c=client.to_s.split(/\@/)[0]
|
20
|
+
begin
|
21
|
+
client.rpc("Messaging.instance.check_messages") if c == nick
|
22
|
+
rescue =>err
|
23
|
+
eerror(err)
|
24
|
+
end
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def sendmail_to_nick(nick,subject,body)
|
29
|
+
Thread.new{
|
30
|
+
nick=[nick] unless nick.class == Array
|
31
|
+
sent=0
|
32
|
+
@users.each{|uid|
|
33
|
+
user=@users.get_user(uid)
|
34
|
+
nick.each{|n|
|
35
|
+
if n.to_s == user["nick"].to_s && user["email"].to_s.length>3
|
36
|
+
begin
|
37
|
+
msg="From: manqod@#{Socket.gethostbyname(Socket.gethostname).first}\nTo: #{user['email']}\nContent-Type: text/plain; charset=UTF-8\nSubject: #{subject}\n#{body}"
|
38
|
+
Net::SMTP.start('localhost'){ |smtp|
|
39
|
+
smtp.send_message(msg, "manqod_server", user["email"])
|
40
|
+
einfo("mail to #{user['email']} sent: #{subject}")
|
41
|
+
}
|
42
|
+
sent+=1
|
43
|
+
rescue => err
|
44
|
+
eerror("can't send error report via SMTP")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
}
|
48
|
+
}
|
49
|
+
einfo("sent total #{sent} emails to #{nick.inspect}")
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def unread_messages(nick)
|
54
|
+
um=0
|
55
|
+
if r=admin.qrow("select count(id) as cnt from messages where `state`='n' and recipient='#{nick}'")
|
56
|
+
um=r["cnt"]
|
57
|
+
end
|
58
|
+
um
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_message_read(message_id,nick)
|
62
|
+
admin.query("update messages set `state`='c' where id='#{message_id}'")
|
63
|
+
send_check_messages(nick)
|
64
|
+
end
|
65
|
+
|
66
|
+
def messages(nick)
|
67
|
+
admin.rows("select * from messages where recipient='#{nick}' and `state`!='d'")
|
68
|
+
end
|
69
|
+
|
70
|
+
def delete_message(message_id,nick)
|
71
|
+
admin.query("update messages set `state`='d' where id='#{message_id}'")
|
72
|
+
send_check_messages(nick)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,107 @@
|
|
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
|
+
require 'rubygems'
|
6
|
+
require 'java'
|
7
|
+
RAILS_CONNECTION_ADAPTERS = %w(jdbc)
|
8
|
+
einfo("pease run: export CLASSPATH=$(java-config --classpath jdbc-mysql)")unless ENV['CLASSPATH'].index("mysql")
|
9
|
+
module Jdbc; DriverManager = java.sql.DriverManager; Driver = com.mysql.jdbc.Driver end
|
10
|
+
module JavaLang;include_package "java.lang";end
|
11
|
+
module JavaSql;include_package 'java.sql';end
|
12
|
+
|
13
|
+
class MySQL
|
14
|
+
include Eprint
|
15
|
+
|
16
|
+
def initialize(host,user,password,dbase)
|
17
|
+
@host=host
|
18
|
+
@user=user
|
19
|
+
@password=password
|
20
|
+
@dbase=dbase
|
21
|
+
@conn = Jdbc::DriverManager.getConnection("jdbc:mysql://#{@host}/#{@dbase}?user=#{@user}&password=#{@password}&zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false");
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def query(sql)
|
26
|
+
return nil if sql.nil? or sql.length ==0
|
27
|
+
begin
|
28
|
+
stmt = @conn.createStatement
|
29
|
+
res = stmt.executeQuery(sql)
|
30
|
+
rescue SQLException => err
|
31
|
+
# case err
|
32
|
+
# when 2006, 2013
|
33
|
+
# einfo("connection dropped: retrying")
|
34
|
+
# reconnect
|
35
|
+
# retry
|
36
|
+
# when 1062
|
37
|
+
#duplicate
|
38
|
+
# res=-1
|
39
|
+
# else
|
40
|
+
eerror("#{err} in\n#{sql}")
|
41
|
+
raise "#{err}\n#{sql}\n"
|
42
|
+
# end
|
43
|
+
rescue CommunicationsException => e
|
44
|
+
edebug("comm error")
|
45
|
+
eerror("#{e} in\n#{sql}")
|
46
|
+
raise "#{e}\n#{sql}\n"
|
47
|
+
rescue =>e
|
48
|
+
edebug("other error: #{e.class.name}")
|
49
|
+
eerror("#{err} in\n#{sql}")
|
50
|
+
end
|
51
|
+
return res
|
52
|
+
end
|
53
|
+
|
54
|
+
def fetch_hash(res,with_table=false)
|
55
|
+
begin
|
56
|
+
data=Array.new
|
57
|
+
unless res.nil?
|
58
|
+
while res.next do
|
59
|
+
md=res.meta_data
|
60
|
+
row=Hash.new
|
61
|
+
i=1
|
62
|
+
while i<=md.column_count do
|
63
|
+
header=if with_table then
|
64
|
+
md.table_name(i)+"."+md.column_label(i)
|
65
|
+
else
|
66
|
+
md.column_label(i)
|
67
|
+
end
|
68
|
+
row[header]=res.getString(md.column_label(i))
|
69
|
+
i+=1
|
70
|
+
end
|
71
|
+
data.push(row)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
return data
|
75
|
+
rescue =>e
|
76
|
+
eerror("metadata:#{md.inspect}\nrow:#{row.inspect}\nheader:#{header.inspect},colnum:#{i}")
|
77
|
+
eerror("error preparing the result:#{e}\n #{e.backtrace.join("\n\t")}")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def fields(sql)
|
82
|
+
yield nil
|
83
|
+
end
|
84
|
+
|
85
|
+
def qrow(sql,with_table=false)
|
86
|
+
row=fetch_hash(query(sql),with_table).first
|
87
|
+
return row
|
88
|
+
end
|
89
|
+
|
90
|
+
def rows(sql,with_table=false)
|
91
|
+
if ret=query(sql)
|
92
|
+
fetch_hash(ret,with_table)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def escape_string(string)
|
97
|
+
#we do nothing yet
|
98
|
+
string
|
99
|
+
end
|
100
|
+
|
101
|
+
def inspect
|
102
|
+
"jmysql(#{@dbase})"
|
103
|
+
end
|
104
|
+
def to_s
|
105
|
+
inspect
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,114 @@
|
|
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
|
+
require('mysql')
|
6
|
+
|
7
|
+
class MySQL < Mysql
|
8
|
+
include Eprint
|
9
|
+
|
10
|
+
MYSQL_FIELD_TYPE={
|
11
|
+
Mysql::Field::TYPE_BIT => "BIT",
|
12
|
+
Mysql::Field::TYPE_BLOB => "BLOB",
|
13
|
+
Mysql::Field::TYPE_CHAR => "CHAR",
|
14
|
+
Mysql::Field::TYPE_DATE => "DATE",
|
15
|
+
Mysql::Field::TYPE_DATETIME => "DATETIME",
|
16
|
+
Mysql::Field::TYPE_DECIMAL => "DECIMAL",
|
17
|
+
Mysql::Field::TYPE_DOUBLE => "DOUBLE",
|
18
|
+
Mysql::Field::TYPE_ENUM => "ENUM",
|
19
|
+
Mysql::Field::TYPE_FLOAT => "FLOAT",
|
20
|
+
Mysql::Field::TYPE_INT24 => "INT24",
|
21
|
+
Mysql::Field::TYPE_LONG => "LONG",
|
22
|
+
Mysql::Field::TYPE_LONGLONG => "LONGLONG",
|
23
|
+
Mysql::Field::TYPE_NEWDECIMAL=> "NEWDECIMAL",
|
24
|
+
Mysql::Field::TYPE_NULL => "NULL",
|
25
|
+
Mysql::Field::TYPE_SET => "SET",
|
26
|
+
Mysql::Field::TYPE_SHORT => "SHORT",
|
27
|
+
Mysql::Field::TYPE_STRING => "CHAR",
|
28
|
+
Mysql::Field::TYPE_TIME => "TIME",
|
29
|
+
Mysql::Field::TYPE_TIMESTAMP=> "TIMESTAMP",
|
30
|
+
Mysql::Field::TYPE_TINY => "TINY",
|
31
|
+
Mysql::Field::TYPE_VAR_STRING=> "VARCHAR",
|
32
|
+
Mysql::Field::TYPE_YEAR => "YEAR"
|
33
|
+
|
34
|
+
}
|
35
|
+
|
36
|
+
def initialize(host,user,password,dbase)
|
37
|
+
# options(Mysql::CLIENT_INTERACTIVE,1)
|
38
|
+
@host=host
|
39
|
+
@user=user
|
40
|
+
@password=password
|
41
|
+
@dbase=dbase
|
42
|
+
options(Mysql::OPT_CONNECT_TIMEOUT,1)
|
43
|
+
options(Mysql::OPT_READ_TIMEOUT,10)
|
44
|
+
options(Mysql::OPT_WRITE_TIMEOUT,10)
|
45
|
+
einfo("Mysql Client version #{client_info()}")
|
46
|
+
begin
|
47
|
+
super(@host,@user,@password,@dbase)
|
48
|
+
rescue MysqlError => err
|
49
|
+
eerror("connecting: #{err.error}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def reconnect
|
55
|
+
begin
|
56
|
+
real_connect(@host,@user,@password,@dbase)
|
57
|
+
rescue MysqlError => err
|
58
|
+
ewarn("reconnecting: #{err.error}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def query(sql)
|
63
|
+
return nil if sql.nil? or sql.length ==0
|
64
|
+
begin
|
65
|
+
res=super(sql)
|
66
|
+
rescue MysqlError => err
|
67
|
+
case err.errno
|
68
|
+
when 2006, 2013
|
69
|
+
einfo("connection dropped: retrying")
|
70
|
+
reconnect
|
71
|
+
retry
|
72
|
+
when 1062
|
73
|
+
#duplicate
|
74
|
+
res=-1
|
75
|
+
else
|
76
|
+
eerror("#{err.error} in\n#{sql}")
|
77
|
+
raise "#{err.error}\n#{sql}\n"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
return res
|
81
|
+
end
|
82
|
+
|
83
|
+
def fetch_hash(res,with_table=false)
|
84
|
+
data=Array.new
|
85
|
+
while row=res.fetch_hash(with_table) do
|
86
|
+
data.push(row)
|
87
|
+
end unless res.nil?
|
88
|
+
return data
|
89
|
+
end
|
90
|
+
|
91
|
+
def fields(sql)
|
92
|
+
fields=Array.new
|
93
|
+
if ret=query(sql)
|
94
|
+
ret.fetch_fields.sort{|a,b|"#{a.table}.#{a.name}" <=> "#{b.table}.#{b.name}"}.each{|field|
|
95
|
+
a={"name"=>"#{field.table}.#{field.name}","type"=>MYSQL_FIELD_TYPE[field.type], "length"=>field.length}
|
96
|
+
a["decimals"]=field.decimals if field.is_num?
|
97
|
+
fields.push(a)
|
98
|
+
a=nil
|
99
|
+
}
|
100
|
+
end
|
101
|
+
fields
|
102
|
+
end
|
103
|
+
|
104
|
+
def rows(sql,with_table=false)
|
105
|
+
if res=query(sql)
|
106
|
+
fetch_hash(res,with_table)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
"mysql(#{@dbase})"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
@@ -0,0 +1,226 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
module SQL
|
6
|
+
include Eprint
|
7
|
+
|
8
|
+
def jruby?
|
9
|
+
RUBY_PLATFORM =~ /java/
|
10
|
+
end
|
11
|
+
|
12
|
+
def init_sql(host,user,password,dbase)
|
13
|
+
if jruby?
|
14
|
+
einfo("using jruby")
|
15
|
+
require 'DrbDB/MyMultiSQL/jdbc.rb'
|
16
|
+
else
|
17
|
+
einfo("using mysql-ruby")
|
18
|
+
require 'DrbDB/MyMultiSQL/mysql-ruby.rb'
|
19
|
+
end
|
20
|
+
begin
|
21
|
+
@my=MySQL.new(host,user,password,dbase)
|
22
|
+
rescue =>err
|
23
|
+
eerror(err)
|
24
|
+
@my=nil
|
25
|
+
end
|
26
|
+
@my
|
27
|
+
end
|
28
|
+
|
29
|
+
def escape_string(string)
|
30
|
+
@my.escape_string(string)
|
31
|
+
end
|
32
|
+
|
33
|
+
def query(sql)
|
34
|
+
edebug("SQL: #{sql}")
|
35
|
+
@my.query(sql)
|
36
|
+
end
|
37
|
+
|
38
|
+
def qrow(sql,with_table=false)
|
39
|
+
edebug("SQL: #{sql}")
|
40
|
+
if ret=@my.rows(sql,with_table)
|
41
|
+
ret.first
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def rows(sql,with_table=false)
|
46
|
+
edebug("SQL: #{sql}")
|
47
|
+
@my.rows(sql,with_table)
|
48
|
+
end
|
49
|
+
|
50
|
+
def fields(sql)
|
51
|
+
@my.fields(sql)
|
52
|
+
end
|
53
|
+
|
54
|
+
def guess_table(query,field)
|
55
|
+
sql=String.new(query)
|
56
|
+
sql=sql+" \r\n"
|
57
|
+
llength=sql.length
|
58
|
+
while (sql.gsub!("`"," ")) and sql.length != llength do llength=sql.length end
|
59
|
+
while (sql.gsub!("\r\n"," ")) and sql.length != llength do llength=sql.length end
|
60
|
+
while (sql.gsub!("\n"," ")) and sql.length != llength do llength=sql.length end
|
61
|
+
while (sql.gsub!(" "," ")) and sql.length != llength do llength=sql.length end
|
62
|
+
|
63
|
+
llast=0
|
64
|
+
while (last=sql.index(")") and (llast != last))
|
65
|
+
llast = last
|
66
|
+
if first=sql[0 .. last].rindex("(") then
|
67
|
+
sql[first .. last]=self.guess_table(sql[first +1 .. last -1],field)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
sql=sql.gsub(",","")
|
72
|
+
first=sql.index(" ",sql.upcase.rindex("FROM")+"from".length)+1 if sql.upcase.rindex("FROM")
|
73
|
+
first=sql.index(" ",sql.upcase.rindex("UPDATE")+"update".length)+1 if sql.upcase.rindex("UPDATE")
|
74
|
+
first=sql.index(" ",sql.upcase.rindex("INSERT INTO")+"insert into".length)+1 if sql.upcase.rindex("INSERT INTO")
|
75
|
+
if first
|
76
|
+
last=sql.index(" ",first)-1
|
77
|
+
table=sql[first .. last]
|
78
|
+
else
|
79
|
+
table=""
|
80
|
+
end
|
81
|
+
table
|
82
|
+
end
|
83
|
+
|
84
|
+
def top_level(sql,subject)
|
85
|
+
i=0
|
86
|
+
tsi=nil
|
87
|
+
while(i=sql.upcase.index(subject.upcase,i+1))
|
88
|
+
tsi=i if sql[0 .. i].count('(') == sql[0 .. i].count(')')
|
89
|
+
#at i is toplevel subject
|
90
|
+
end
|
91
|
+
tsi
|
92
|
+
end
|
93
|
+
|
94
|
+
def guess_base(query)
|
95
|
+
sql=String.new(query)
|
96
|
+
sql=sql+" \r\n"
|
97
|
+
llength=sql.length
|
98
|
+
while (sql.gsub!("`"," ")) and sql.length != llength do llength=sql.length end
|
99
|
+
while (sql.gsub!("\r\n"," ")) and sql.length != llength do llength=sql.length end
|
100
|
+
while (sql.gsub!("\n"," ")) and sql.length != llength do llength=sql.length end
|
101
|
+
while (sql.gsub!(" "," ")) and sql.length != llength do llength=sql.length end
|
102
|
+
|
103
|
+
if fi=top_level(sql,"from")
|
104
|
+
fi=sql.index(" ",fi+"from".length)+1
|
105
|
+
ret=sql[fi .. sql.index(" ",fi)-1]
|
106
|
+
else
|
107
|
+
ret=nil
|
108
|
+
end
|
109
|
+
ret
|
110
|
+
end
|
111
|
+
|
112
|
+
def add_where(query,where)
|
113
|
+
sql=String.new(query)
|
114
|
+
sql=sql+" \r\n"
|
115
|
+
llength=sql.length
|
116
|
+
while (sql.gsub!("`"," ")) and sql.length != llength do llength=sql.length end
|
117
|
+
while (sql.gsub!("\r\n"," ")) and sql.length != llength do llength=sql.length end
|
118
|
+
while (sql.gsub!("\n"," ")) and sql.length != llength do llength=sql.length end
|
119
|
+
while (sql.gsub!(" "," ")) and sql.length != llength do llength=sql.length end
|
120
|
+
|
121
|
+
if twi=top_level(sql,"where")
|
122
|
+
#insert where after 'where'
|
123
|
+
ret=sql[0 .. twi+"where".length] + where +" and "+ sql[twi+"where".length .. sql.length]
|
124
|
+
else
|
125
|
+
toi=top_level(sql,"group by")
|
126
|
+
toi=top_level(sql,"having") if toi.nil?
|
127
|
+
toi=top_level(sql,"order by") if toi.nil?
|
128
|
+
toi=top_level(sql,"limit") if toi.nil?
|
129
|
+
if toi
|
130
|
+
#insert the where before group by/having/order by/limit
|
131
|
+
ret=sql[0 .. toi-1] + " where #{where} " + sql[toi-1 .. sql.length]
|
132
|
+
else
|
133
|
+
#just append the where
|
134
|
+
ret="#{sql} where #{where}"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
ret
|
138
|
+
end
|
139
|
+
|
140
|
+
def select_last(query,orderby) #for select last
|
141
|
+
sql=String.new(query)
|
142
|
+
sql=sql+" \r\n"
|
143
|
+
llength=sql.length
|
144
|
+
while (sql.gsub!("`","")) and sql.length != llength do llength=sql.length end
|
145
|
+
while (sql.gsub!("\r\n"," ")) and sql.length != llength do llength=sql.length end
|
146
|
+
while (sql.gsub!("\n"," ")) and sql.length != llength do llength=sql.length end
|
147
|
+
while (sql.gsub!(" "," ")) and sql.length != llength do llength=sql.length end
|
148
|
+
|
149
|
+
toi=top_level(sql,"order by")
|
150
|
+
toi=top_level(sql,"limit") if toi.nil?
|
151
|
+
toi=sql.length if toi.nil?
|
152
|
+
#insert the orderby
|
153
|
+
ret=sql[0 .. toi-1] + " order by #{orderby} desc limit 1"
|
154
|
+
ret
|
155
|
+
end
|
156
|
+
|
157
|
+
def prepare_sql(isql,caller)
|
158
|
+
sql=String.new(isql)
|
159
|
+
if sql.length >0
|
160
|
+
while first=sql.index("{")
|
161
|
+
i=first+1;k=1
|
162
|
+
while (i<sql.length and k>0)
|
163
|
+
k=k+1 if sql[i .. i]=="{"
|
164
|
+
k=k-1 if sql[i .. i]=="}"
|
165
|
+
i=i+1
|
166
|
+
end
|
167
|
+
last = i-1
|
168
|
+
if sql[last .. last]=='}' then
|
169
|
+
ind=sql[first .. last]
|
170
|
+
indd=ind[1 .. ind.rindex("}")-1]
|
171
|
+
begin
|
172
|
+
sql[ind]=eval(indd,caller.getBinding).to_s
|
173
|
+
rescue StandardError,SyntaxError, NameError => err
|
174
|
+
ewarn("String doesn't compile: #{err}\nin query:#{sql}\n")
|
175
|
+
sql[ind]=""
|
176
|
+
end
|
177
|
+
else
|
178
|
+
ewarn("can't find closing bracket - } in #{sql[first .. sql.length]}\n")
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
return sql
|
183
|
+
end
|
184
|
+
|
185
|
+
def update_manqod_db
|
186
|
+
current_version="unknown"
|
187
|
+
begin
|
188
|
+
t=qrow("select max(`version`) as version from db_version")
|
189
|
+
current_version=t["version"].to_f unless t.nil?
|
190
|
+
einfo("current version: #{current_version}")
|
191
|
+
rescue
|
192
|
+
ewarn("not auto update compatible")
|
193
|
+
end
|
194
|
+
return false if t.nil?
|
195
|
+
usql=File.new(File::expand_path(File.join(File.join(File.join(File.join(File.dirname(__FILE__),".."),".."),"etc"),"update.sql")),"r")
|
196
|
+
sql=""
|
197
|
+
while line=usql.gets do
|
198
|
+
next if line.length<5 #empty line
|
199
|
+
next if line.index("--")&&line.index("--")<2 #line begins with comment
|
200
|
+
sql="#{sql} #{line}"
|
201
|
+
line_version=sql.split("--")[-1]
|
202
|
+
if sql.rindex(";") && line_version && line_version.to_f>0
|
203
|
+
line_version=line_version.to_f
|
204
|
+
#found end of query and version number
|
205
|
+
sql=sql[0 .. sql.rindex("--")-1]
|
206
|
+
if line_version > current_version
|
207
|
+
einfo("applying update version: #{line_version.to_f}, query: \"#{sql}\"")
|
208
|
+
success=true
|
209
|
+
begin
|
210
|
+
query(sql)
|
211
|
+
rescue
|
212
|
+
success=false
|
213
|
+
end
|
214
|
+
if success then
|
215
|
+
query("insert into db_version (`version`) values (#{line_version})")
|
216
|
+
else
|
217
|
+
eerror("failed to apply version: #{line_version}")
|
218
|
+
end
|
219
|
+
end
|
220
|
+
sql=""
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|