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.
@@ -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
+