knjrbfw 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/knjrbfw.gemspec +29 -8
- data/lib/knj/arrayext.rb +206 -153
- data/lib/knj/autoload/backups/ping.rb +2 -2
- data/lib/knj/autoload/erubis.rb +3 -3
- data/lib/knj/autoload/facets_dictionary.rb +2 -2
- data/lib/knj/autoload/gettext.rb +3 -3
- data/lib/knj/autoload/gtk2.rb +1 -1
- data/lib/knj/autoload/json.rb +14 -0
- data/lib/knj/autoload/magick.rb +3 -3
- data/lib/knj/autoload/mysql.rb +3 -3
- data/lib/knj/autoload/parsedate.rb +1 -1
- data/lib/knj/autoload/ping.rb +2 -2
- data/lib/knj/autoload/rexml.rb +5 -5
- data/lib/knj/autoload/soap.rb +1 -1
- data/lib/knj/autoload/sqlite3.rb +3 -3
- data/lib/knj/autoload/tmail.rb +3 -3
- data/lib/knj/autoload/xmlsimple.rb +3 -3
- data/lib/knj/autoload/zip.rb +3 -3
- data/lib/knj/autoload.rb +87 -81
- data/lib/knj/cmd_gen.rb +19 -19
- data/lib/knj/cmd_parser.rb +59 -0
- data/lib/knj/compiler.rb +34 -34
- data/lib/knj/cpufreq.rb +37 -37
- data/lib/knj/csv.rb +20 -0
- data/lib/knj/datarow.rb +406 -239
- data/lib/knj/datarow_custom.rb +124 -0
- data/lib/knj/datestamp.rb +89 -89
- data/lib/knj/datet.rb +550 -454
- data/lib/knj/db.rb +1 -0
- data/lib/knj/degulesider.rb +42 -44
- data/lib/knj/erb/erb.rb +5 -5
- data/lib/knj/erb/erb_cache_clean.rb +10 -10
- data/lib/knj/erb/erb_fcgi.rb +32 -32
- data/lib/knj/erb/erb_fcgi_1.9.rb +32 -32
- data/lib/knj/erb/erb_fcgi_jruby.rb +2 -2
- data/lib/knj/erb/erb_jruby.rb +5 -5
- data/lib/knj/erb/include.rb +243 -243
- data/lib/knj/errors.rb +19 -18
- data/lib/knj/eruby.rb +12 -10
- data/lib/knj/event_filemod.rb +31 -31
- data/lib/knj/event_handler.rb +73 -67
- data/lib/knj/exchangerates.rb +37 -37
- data/lib/knj/facebook_connect.rb +95 -18
- data/lib/knj/filesystem.rb +6 -6
- data/lib/knj/fs/drivers/filesystem.rb +12 -12
- data/lib/knj/fs/drivers/ftp.rb +31 -31
- data/lib/knj/fs/drivers/ssh.rb +26 -26
- data/lib/knj/fs/fs.rb +31 -31
- data/lib/knj/gettext_fallback.rb +15 -15
- data/lib/knj/gettext_threadded.rb +75 -75
- data/lib/knj/google_sitemap.rb +53 -53
- data/lib/knj/gtk2.rb +272 -272
- data/lib/knj/gtk2_cb.rb +80 -80
- data/lib/knj/gtk2_menu.rb +55 -55
- data/lib/knj/gtk2_statuswindow.rb +62 -62
- data/lib/knj/gtk2_tv.rb +58 -58
- data/lib/knj/hash_methods.rb +27 -36
- data/lib/knj/http.rb +189 -167
- data/lib/knj/http2.rb +259 -53
- data/lib/knj/image.rb +2 -2
- data/lib/knj/includes/appserver_cli.rb +18 -18
- data/lib/knj/includes/require_info.rb +15 -0
- data/lib/knj/ip2location.rb +20 -20
- data/lib/knj/ironruby-gtk2/button.rb +14 -14
- data/lib/knj/ironruby-gtk2/dialog.rb +42 -42
- data/lib/knj/ironruby-gtk2/entry.rb +4 -4
- data/lib/knj/ironruby-gtk2/gdk_event.rb +1 -1
- data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +11 -11
- data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +9 -9
- data/lib/knj/ironruby-gtk2/gladexml.rb +102 -102
- data/lib/knj/ironruby-gtk2/glib.rb +13 -13
- data/lib/knj/ironruby-gtk2/gtk2.rb +121 -121
- data/lib/knj/ironruby-gtk2/gtk_builder.rb +29 -29
- data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +3 -3
- data/lib/knj/ironruby-gtk2/gtk_combobox.rb +17 -17
- data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +3 -3
- data/lib/knj/ironruby-gtk2/gtk_liststore.rb +16 -16
- data/lib/knj/ironruby-gtk2/gtk_menu.rb +3 -3
- data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +2 -2
- data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +3 -3
- data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +22 -22
- data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +11 -11
- data/lib/knj/ironruby-gtk2/gtk_treeview.rb +17 -17
- data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +30 -30
- data/lib/knj/ironruby-gtk2/iconsize.rb +1 -1
- data/lib/knj/ironruby-gtk2/image.rb +13 -13
- data/lib/knj/ironruby-gtk2/label.rb +17 -17
- data/lib/knj/ironruby-gtk2/stock.rb +2 -2
- data/lib/knj/ironruby-gtk2/tests/test_2.rb +14 -14
- data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +37 -37
- data/lib/knj/ironruby-gtk2/vbox.rb +3 -3
- data/lib/knj/ironruby-gtk2/window.rb +18 -18
- data/lib/knj/jruby-gtk2/builder/test_builder.rb +11 -11
- data/lib/knj/jruby-gtk2/builder.rb +25 -25
- data/lib/knj/jruby-gtk2/cellrenderertext.rb +10 -10
- data/lib/knj/jruby-gtk2/checkbutton.rb +1 -1
- data/lib/knj/jruby-gtk2/combobox.rb +27 -27
- data/lib/knj/jruby-gtk2/dialog.rb +40 -40
- data/lib/knj/jruby-gtk2/eventbutton.rb +19 -19
- data/lib/knj/jruby-gtk2/gladexml.rb +97 -97
- data/lib/knj/jruby-gtk2/gtk2.rb +203 -203
- data/lib/knj/jruby-gtk2/hbox.rb +8 -8
- data/lib/knj/jruby-gtk2/iconsize.rb +3 -3
- data/lib/knj/jruby-gtk2/image.rb +8 -8
- data/lib/knj/jruby-gtk2/liststore.rb +54 -54
- data/lib/knj/jruby-gtk2/menu.rb +35 -35
- data/lib/knj/jruby-gtk2/progressbar.rb +10 -10
- data/lib/knj/jruby-gtk2/statusicon.rb +3 -3
- data/lib/knj/jruby-gtk2/stock.rb +6 -6
- data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +36 -36
- data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +3 -3
- data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +2 -2
- data/lib/knj/jruby-gtk2/treeview.rb +88 -88
- data/lib/knj/jruby-gtk2/vbox.rb +10 -10
- data/lib/knj/jruby-gtk2/window.rb +7 -7
- data/lib/knj/jruby_compiler.rb +12 -12
- data/lib/knj/knj.rb +12 -11
- data/lib/knj/knj_controller.rb +13 -8
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +499 -316
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +127 -125
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +43 -25
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +316 -241
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +12 -0
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +146 -146
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +24 -24
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +283 -283
- data/lib/knj/knjdb/libknjdb.rb +96 -52
- data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +78 -78
- data/lib/knj/knjdb/libknjdb_row.rb +147 -147
- data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +61 -61
- data/lib/knj/knjdb/revision.rb +262 -0
- data/lib/knj/libqt.rb +69 -69
- data/lib/knj/libqt_window.rb +8 -8
- data/lib/knj/locales.rb +62 -52
- data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +54 -54
- data/lib/knj/mail.rb +73 -73
- data/lib/knj/mailobj.rb +82 -80
- data/lib/knj/mount.rb +113 -113
- data/lib/knj/notify.rb +11 -11
- data/lib/knj/nvidia_settings.rb +43 -43
- data/lib/knj/objects/objects_sqlhelper.rb +474 -0
- data/lib/knj/objects.rb +569 -793
- data/lib/knj/opts.rb +38 -38
- data/lib/knj/os.rb +176 -158
- data/lib/knj/php.rb +853 -683
- data/lib/knj/php_parser/arguments.rb +3 -3
- data/lib/knj/php_parser/functions.rb +95 -95
- data/lib/knj/php_parser/php_parser.rb +16 -16
- data/lib/knj/php_parser/tests/test.rb +6 -6
- data/lib/knj/php_parser/tests/test_function_run.rb +6 -6
- data/lib/knj/power_manager.rb +29 -29
- data/lib/knj/process.rb +457 -0
- data/lib/knj/process_meta.rb +400 -0
- data/lib/knj/rand.rb +8 -8
- data/lib/knj/retry.rb +69 -69
- data/lib/knj/rhodes/delegate.rb +414 -0
- data/lib/knj/rhodes/rhodes.rb +114 -40
- data/lib/knj/rhodes/weakref.rb +80 -0
- data/lib/knj/rsvgbin.rb +18 -18
- data/lib/knj/scripts/degulesider.rb +2 -2
- data/lib/knj/scripts/filesearch.rb +35 -35
- data/lib/knj/scripts/ip2location.rb +2 -2
- data/lib/knj/scripts/keepalive.rb +2 -2
- data/lib/knj/scripts/php_to_rb_helper.rb +376 -0
- data/lib/knj/scripts/process_meta_exec.rb +104 -0
- data/lib/knj/scripts/svn_merge.rb +21 -21
- data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +26 -26
- data/lib/knj/sms.rb +52 -52
- data/lib/knj/sshrobot/sshrobot.rb +90 -88
- data/lib/knj/sshrobot.rb +1 -0
- data/lib/knj/strings.rb +186 -74
- data/lib/knj/sysuser.rb +25 -25
- data/lib/knj/table_writer.rb +97 -0
- data/lib/knj/tests/compiler/compiler_test.rb +2 -2
- data/lib/knj/tests/test_degulesider.rb +1 -1
- data/lib/knj/tests/test_http2_proxy.rb +26 -0
- data/lib/knj/tests/test_mount.rb +9 -9
- data/lib/knj/tests/test_retry.rb +17 -17
- data/lib/knj/thread.rb +23 -24
- data/lib/knj/thread2.rb +45 -45
- data/lib/knj/threadhandler.rb +135 -102
- data/lib/knj/threadpool.rb +195 -145
- data/lib/knj/translations.rb +128 -119
- data/lib/knj/unix_proc.rb +80 -80
- data/lib/knj/web.rb +947 -881
- data/lib/knj/webscripts/image.rhtml +142 -67
- data/lib/knj/win.rb +2 -2
- data/lib/knj/win_registry.rb +58 -58
- data/lib/knj/win_tightvnc.rb +125 -125
- data/lib/knj/wref.rb +104 -0
- data/lib/knj/x11vnc.rb +46 -46
- data/lib/knj/youtube.rb +33 -36
- data/lib/knjrbfw.rb +1 -0
- data/spec/cmd_parser_spec.rb +25 -0
- data/spec/db_spec.rb +40 -0
- data/spec/db_spec_encoding_test_file.txt +1 -0
- data/spec/http2_spec.rb +37 -0
- data/spec/knjrbfw_spec.rb +17 -15
- data/spec/php_spec.rb +69 -0
- data/spec/process_meta_spec.rb +150 -0
- data/spec/process_spec.rb +107 -0
- data/spec/strings_spec.rb +21 -0
- data/spec/web_spec.rb +16 -0
- metadata +42 -21
- data/lib/knj/autoload/json_autoload.rb +0 -7
- data/lib/knj/autoload/twitter.rb +0 -2
- data/lib/knj/ext/webrick.rb +0 -31
- data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
- data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
- data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
@@ -0,0 +1,474 @@
|
|
1
|
+
class Knj::Objects
|
2
|
+
#This method helps build SQL from Objects-instances list-method. It should not be called directly but only through Objects.list.
|
3
|
+
def sqlhelper(list_args, args_def)
|
4
|
+
args = args_def
|
5
|
+
|
6
|
+
if args[:db]
|
7
|
+
db = args[:db]
|
8
|
+
else
|
9
|
+
db = @args[:db]
|
10
|
+
end
|
11
|
+
|
12
|
+
if args[:table]
|
13
|
+
table_def = "`#{db.esc_table(args[:table])}`."
|
14
|
+
else
|
15
|
+
table_def = ""
|
16
|
+
end
|
17
|
+
|
18
|
+
sql_joins = ""
|
19
|
+
sql_where = ""
|
20
|
+
sql_order = ""
|
21
|
+
sql_limit = ""
|
22
|
+
sql_groupby = ""
|
23
|
+
|
24
|
+
do_joins = {}
|
25
|
+
|
26
|
+
limit_from = nil
|
27
|
+
limit_to = nil
|
28
|
+
|
29
|
+
if list_args.key?("orderby")
|
30
|
+
orders = []
|
31
|
+
orderstr = list_args["orderby"]
|
32
|
+
list_args["orderby"] = [list_args["orderby"]] if list_args["orderby"].is_a?(Hash)
|
33
|
+
|
34
|
+
if list_args["orderby"].is_a?(String)
|
35
|
+
found = false
|
36
|
+
found = true if args[:cols].key?(orderstr)
|
37
|
+
|
38
|
+
if found
|
39
|
+
sql_order << " ORDER BY "
|
40
|
+
ordermode = " ASC"
|
41
|
+
if list_args.key?("ordermode")
|
42
|
+
if list_args["ordermode"] == "desc"
|
43
|
+
ordermode = " DESC"
|
44
|
+
elsif list_args["ordermode"] == "asc"
|
45
|
+
ordermode = " ASC"
|
46
|
+
raise "Unknown ordermode: #{list_args["ordermode"]}"
|
47
|
+
end
|
48
|
+
|
49
|
+
list_args.delete("ordermode")
|
50
|
+
end
|
51
|
+
|
52
|
+
sql_order << "#{table_def}`#{db.esc_col(list_args["orderby"])}`#{ordermode}"
|
53
|
+
list_args.delete("orderby")
|
54
|
+
end
|
55
|
+
elsif list_args["orderby"].is_a?(Array)
|
56
|
+
sql_order << " ORDER BY "
|
57
|
+
|
58
|
+
list_args["orderby"].each do |val|
|
59
|
+
ordermode = nil
|
60
|
+
orderstr = nil
|
61
|
+
found = false
|
62
|
+
|
63
|
+
if val.is_a?(Array)
|
64
|
+
if val[1] == "asc"
|
65
|
+
ordermode = " ASC"
|
66
|
+
elsif val[1] == "desc"
|
67
|
+
ordermode = "DESC"
|
68
|
+
end
|
69
|
+
|
70
|
+
if val[0].is_a?(Array)
|
71
|
+
if args[:joined_tables]
|
72
|
+
args[:joined_tables].each do |table_name, table_data|
|
73
|
+
next if table_name.to_s != val[0][0].to_s
|
74
|
+
do_joins[table_name] = true
|
75
|
+
orders << "`#{db.esc_table(table_name)}`.`#{db.esc_col(val[0][1])}`#{ordermode}"
|
76
|
+
found = true
|
77
|
+
break
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
raise "Could not find joined table for ordering: '#{val[0][0]}'." if !found
|
82
|
+
else
|
83
|
+
orderstr = val[0]
|
84
|
+
end
|
85
|
+
elsif val.is_a?(String)
|
86
|
+
orderstr = val
|
87
|
+
ordermode = " ASC"
|
88
|
+
elsif val.is_a?(Hash) and val[:type] == :sql
|
89
|
+
orders << val[:sql]
|
90
|
+
found = true
|
91
|
+
elsif val.is_a?(Hash) and val[:type] == :case
|
92
|
+
caseorder = " CASE"
|
93
|
+
|
94
|
+
val[:case].each do |key, caseval|
|
95
|
+
col = key.first
|
96
|
+
isval = key.last
|
97
|
+
col_str = nil
|
98
|
+
|
99
|
+
if col.is_a?(Array)
|
100
|
+
raise "No joined tables for '#{args[:table]}'." if !args[:joined_tables]
|
101
|
+
|
102
|
+
found = false
|
103
|
+
args[:joined_tables].each do |table_name, table_data|
|
104
|
+
if table_name == col.first
|
105
|
+
do_joins[table_name] = true
|
106
|
+
col_str = "`#{db.esc_table(table_name)}`.`#{db.esc_col(col.last)}`"
|
107
|
+
found = true
|
108
|
+
break
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
raise "No such joined table on '#{args[:table]}': '#{col.first}' (#{col.first.class.name}) with the following joined table:\n#{Knj::Php.print_r(args[:joined_tables], true)}" if !found
|
113
|
+
elsif col.is_a?(String) or col.is_a?(Symbol)
|
114
|
+
col_str = "#{table_def}`#{col}`"
|
115
|
+
found = true
|
116
|
+
else
|
117
|
+
raise "Unknown type for case-ordering: '#{col.class.name}'."
|
118
|
+
end
|
119
|
+
|
120
|
+
raise "'colstr' was not set." if !col_str
|
121
|
+
caseorder << " WHEN #{col_str} = '#{db.esc(isval)}' THEN '#{db.esc(caseval)}'"
|
122
|
+
end
|
123
|
+
|
124
|
+
if val[:else]
|
125
|
+
caseorder << " ELSE '#{db.esc(val[:else])}'"
|
126
|
+
end
|
127
|
+
|
128
|
+
caseorder << " END"
|
129
|
+
orders << caseorder
|
130
|
+
elsif val.is_a?(Hash)
|
131
|
+
raise "No joined tables." if !args.key?(:joined_tables)
|
132
|
+
|
133
|
+
if val[:mode] == "asc"
|
134
|
+
ordermode = " ASC"
|
135
|
+
elsif val[:mode] == "desc"
|
136
|
+
ordermode = " DESC"
|
137
|
+
end
|
138
|
+
|
139
|
+
if args[:joined_tables]
|
140
|
+
args[:joined_tables].each do |table_name, table_data|
|
141
|
+
if table_data[:parent_table]
|
142
|
+
table_name_real = table_name
|
143
|
+
elsif table_data[:datarow]
|
144
|
+
table_name_real = table_data[:datarow].classname
|
145
|
+
else
|
146
|
+
table_name_real = @args[:module].const_get(table_name).classname
|
147
|
+
end
|
148
|
+
|
149
|
+
if table_name.to_s == val[:table].to_s
|
150
|
+
do_joins[table_name] = true
|
151
|
+
|
152
|
+
if val[:sql]
|
153
|
+
orders << val[:sql]
|
154
|
+
elsif val[:col]
|
155
|
+
orders << "`#{db.esc_table(table_name_real)}`.`#{db.esc_col(val[:col])}`#{ordermode}"
|
156
|
+
else
|
157
|
+
raise "Couldnt figure out how to order based on keys: '#{val.keys.sort}'."
|
158
|
+
end
|
159
|
+
|
160
|
+
found = true
|
161
|
+
break
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
else
|
166
|
+
raise "Unknown object: #{val.class.name}"
|
167
|
+
end
|
168
|
+
|
169
|
+
found = true if args[:cols].key?(orderstr)
|
170
|
+
|
171
|
+
if !found
|
172
|
+
raise "Column not found for ordering: #{orderstr}."
|
173
|
+
end
|
174
|
+
|
175
|
+
orders << "#{table_def}`#{db.esc_col(orderstr)}`#{ordermode}" if orderstr
|
176
|
+
end
|
177
|
+
|
178
|
+
sql_order << orders.join(", ")
|
179
|
+
list_args.delete("orderby")
|
180
|
+
else
|
181
|
+
raise "Unknown orderby object: #{list_args["orderby"].class.name}."
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
list_args.each do |realkey, val|
|
186
|
+
found = false
|
187
|
+
|
188
|
+
if realkey.is_a?(Array)
|
189
|
+
if !args[:joins_skip]
|
190
|
+
datarow_obj = self.datarow_obj_from_args(args_def, list_args, realkey[0])
|
191
|
+
args = datarow_obj.columns_sqlhelper_args
|
192
|
+
else
|
193
|
+
datarow_obj = @args[:module].const_get(realkey[0])
|
194
|
+
args = args_def
|
195
|
+
end
|
196
|
+
|
197
|
+
table_sym = realkey[0].to_sym
|
198
|
+
do_joins[table_sym] = true
|
199
|
+
list_table_name_real = table_sym
|
200
|
+
table = "`#{db.esc_table(list_table_name_real)}`."
|
201
|
+
key = realkey[1]
|
202
|
+
else
|
203
|
+
table = table_def
|
204
|
+
args = args_def
|
205
|
+
key = realkey
|
206
|
+
end
|
207
|
+
|
208
|
+
if args[:cols].key?(key)
|
209
|
+
if val.is_a?(Array)
|
210
|
+
if val.empty?
|
211
|
+
sql_where << " AND false"
|
212
|
+
else
|
213
|
+
escape_sql = Knj::ArrayExt.join(
|
214
|
+
:arr => val,
|
215
|
+
:callback => proc{|value|
|
216
|
+
db.escape(value)
|
217
|
+
},
|
218
|
+
:sep => ",",
|
219
|
+
:surr => "'"
|
220
|
+
)
|
221
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` IN (#{escape_sql})"
|
222
|
+
end
|
223
|
+
elsif val.is_a?(Hash) and val[:type] == "col"
|
224
|
+
raise "No table was given for join." if !val.key?(:table)
|
225
|
+
|
226
|
+
do_joins[val[:table].to_sym] = true
|
227
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` = `#{db.esc_table(val[:table])}`.`#{db.esc_col(val[:name])}`"
|
228
|
+
elsif val.is_a?(Hash) and val[:type] == :sqlval and val[:val] == :null
|
229
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` IS NULL"
|
230
|
+
elsif val.is_a?(Proc)
|
231
|
+
call_args = Knj::Hash_methods.new(:ob => self, :db => db)
|
232
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` = '#{db.esc(val.call(call_args))}'"
|
233
|
+
else
|
234
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` = '#{db.esc(val)}'"
|
235
|
+
end
|
236
|
+
|
237
|
+
found = true
|
238
|
+
elsif args.key?(:cols_bools) and args[:cols_bools].index(key) != nil
|
239
|
+
if val.is_a?(TrueClass) or (val.is_a?(Integer) and val.to_i == 1) or (val.is_a?(String) and (val == "true" or val == "1"))
|
240
|
+
realval = "1"
|
241
|
+
elsif val.is_a?(FalseClass) or (val.is_a?(Integer) and val.to_i == 0) or (val.is_a?(String) and (val == "false" or val == "0"))
|
242
|
+
realval = "0"
|
243
|
+
else
|
244
|
+
raise "Could not make real value out of class: #{val.class.name} => #{val}."
|
245
|
+
end
|
246
|
+
|
247
|
+
sql_where << " AND #{table}`#{db.esc_col(key)}` = '#{db.esc(realval)}'"
|
248
|
+
found = true
|
249
|
+
elsif key.to_s == "limit_from"
|
250
|
+
limit_from = val.to_i
|
251
|
+
found = true
|
252
|
+
elsif key.to_s == "limit_to"
|
253
|
+
limit_to = val.to_i
|
254
|
+
found = true
|
255
|
+
elsif key.to_s == "limit"
|
256
|
+
limit_from = 0
|
257
|
+
limit_to = val.to_i
|
258
|
+
found = true
|
259
|
+
elsif args.key?(:cols_dbrows) and args[:cols_dbrows].index("#{key.to_s}_id") != nil
|
260
|
+
if val == false
|
261
|
+
sql_where << " AND #{table}`#{db.esc_col(key.to_s + "_id")}` = '0'"
|
262
|
+
elsif val.is_a?(Array)
|
263
|
+
if val.empty?
|
264
|
+
sql_where << " AND false"
|
265
|
+
else
|
266
|
+
sql_where << " AND #{table}`#{db.esc_col("#{key}_id")}` IN (#{Knj::ArrayExt.join(:arr => val, :sep => ",", :surr => "'", :callback => proc{|obj| obj.id.sql})})"
|
267
|
+
end
|
268
|
+
else
|
269
|
+
sql_where << " AND #{table}`#{db.esc_col(key.to_s + "_id")}` = '#{db.esc(val.id)}'"
|
270
|
+
end
|
271
|
+
|
272
|
+
found = true
|
273
|
+
elsif match = key.match(/^([A-z_\d]+)_(search|has)$/) and args[:cols].key?(match[1]) != nil
|
274
|
+
if match[2] == "search"
|
275
|
+
Knj::Strings.searchstring(val).each do |str|
|
276
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` LIKE '%#{db.esc(str)}%'"
|
277
|
+
end
|
278
|
+
elsif match[2] == "has"
|
279
|
+
if val
|
280
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` != ''"
|
281
|
+
else
|
282
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` = ''"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
found = true
|
287
|
+
elsif match = key.match(/^([A-z_\d]+)_(not|lower)$/) and args[:cols].key?(match[1])
|
288
|
+
if match[2] == "not"
|
289
|
+
if val.is_a?(Array)
|
290
|
+
if val.empty?
|
291
|
+
sql_where << " AND false"
|
292
|
+
else
|
293
|
+
escape_sql = Knj::ArrayExt.join(
|
294
|
+
:arr => val,
|
295
|
+
:callback => proc{|value|
|
296
|
+
db.escape(value)
|
297
|
+
},
|
298
|
+
:sep => ",",
|
299
|
+
:surr => "'"
|
300
|
+
)
|
301
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` NOT IN (#{escape_sql})"
|
302
|
+
end
|
303
|
+
else
|
304
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` != '#{db.esc(val)}'"
|
305
|
+
end
|
306
|
+
elsif match[2] == "lower"
|
307
|
+
sql_where << " AND LOWER(#{table}`#{db.esc_col(match[1])}`) = LOWER('#{db.esc(val)}')"
|
308
|
+
else
|
309
|
+
raise "Unknown mode: '#{match[2]}'."
|
310
|
+
end
|
311
|
+
|
312
|
+
found = true
|
313
|
+
elsif args.key?(:cols_date) and match = key.match(/^(.+)_(day|month|year|from|to|below|above)$/) and args[:cols_date].index(match[1]) != nil
|
314
|
+
val = Knj::Datet.in(val) if val.is_a?(Time)
|
315
|
+
|
316
|
+
if match[2] == "day"
|
317
|
+
if val.is_a?(Array)
|
318
|
+
sql_where << " AND ("
|
319
|
+
first = true
|
320
|
+
|
321
|
+
val.each do |realval|
|
322
|
+
if first
|
323
|
+
first = false
|
324
|
+
else
|
325
|
+
sql_where << " OR "
|
326
|
+
end
|
327
|
+
|
328
|
+
sql_where << "DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%d %m %Y') = DATE_FORMAT('#{db.esc(realval.dbstr)}', '%d %m %Y')"
|
329
|
+
end
|
330
|
+
|
331
|
+
sql_where << ")"
|
332
|
+
else
|
333
|
+
sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%d %m %Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%d %m %Y')"
|
334
|
+
end
|
335
|
+
elsif match[2] == "month"
|
336
|
+
sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%m %Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%m %Y')"
|
337
|
+
elsif match[2] == "year"
|
338
|
+
sql_where << " AND DATE_FORMAT(#{table}`#{db.esc_col(match[1])}`, '%Y') = DATE_FORMAT('#{db.esc(val.dbstr)}', '%Y')"
|
339
|
+
elsif match[2] == "from" or match[2] == "above"
|
340
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` >= '#{db.esc(val.dbstr)}'"
|
341
|
+
elsif match[2] == "to" or match[2] == "below"
|
342
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` <= '#{db.esc(val.dbstr)}'"
|
343
|
+
else
|
344
|
+
raise "Unknown date-key: #{match[2]}."
|
345
|
+
end
|
346
|
+
|
347
|
+
found = true
|
348
|
+
elsif args.key?(:cols_num) and match = key.match(/^(.+)_(from|to|above|below)$/) and args[:cols_num].index(match[1]) != nil
|
349
|
+
if match[2] == "from"
|
350
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` <= '#{db.esc(val)}'"
|
351
|
+
elsif match[2] == "to"
|
352
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` >= '#{db.esc(val)}'"
|
353
|
+
elsif match[2] == "above"
|
354
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` > '#{db.esc(val)}'"
|
355
|
+
elsif match[2] == "below"
|
356
|
+
sql_where << " AND #{table}`#{db.esc_col(match[1])}` < '#{db.esc(val)}'"
|
357
|
+
else
|
358
|
+
raise "Unknown method of treating cols-num-argument: #{match[2]}."
|
359
|
+
end
|
360
|
+
|
361
|
+
found = true
|
362
|
+
elsif match = key.match(/^(.+)_lookup$/) and args[:cols].key?("#{match[1]}_id") and args[:cols].key?("#{match[1]}_class")
|
363
|
+
sql_where << " AND #{table}`#{db.esc_col("#{match[1]}_class")}` = '#{db.esc(val.table)}'"
|
364
|
+
sql_where << " AND #{table}`#{db.esc_col("#{match[1]}_id")}` = '#{db.esc(val.id)}'"
|
365
|
+
found = true
|
366
|
+
elsif realkey == "groupby"
|
367
|
+
found = true
|
368
|
+
|
369
|
+
if val.is_a?(Array)
|
370
|
+
val.each do |col_name|
|
371
|
+
raise "Column '#{val}' not found on table '#{table}'." if !args[:cols].key?(col_name)
|
372
|
+
sql_groupby << ", " if sql_groupby.length > 0
|
373
|
+
sql_groupby << "#{table}`#{db.esc_col(col_name)}`"
|
374
|
+
end
|
375
|
+
elsif val.is_a?(String)
|
376
|
+
sql_groupby << ", " if sql_groupby.length > 0
|
377
|
+
sql_groupby << "#{table}`#{db.esc_col(val)}`"
|
378
|
+
else
|
379
|
+
raise "Unknown class given for 'groupby': '#{val.class.name}'."
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
list_args.delete(realkey) if found
|
384
|
+
end
|
385
|
+
|
386
|
+
args = args_def
|
387
|
+
|
388
|
+
if !args[:joins_skip]
|
389
|
+
raise "No joins defined on '#{args[:table]}' for: '#{args[:table]}'." if !do_joins.empty? and !args[:joined_tables]
|
390
|
+
|
391
|
+
do_joins.each do |table_name, temp_val|
|
392
|
+
raise "No join defined on table '#{args[:table]}' for table '#{table_name}'." if !args[:joined_tables].key?(table_name)
|
393
|
+
table_data = args[:joined_tables][table_name]
|
394
|
+
|
395
|
+
if table_data.key?(:parent_table)
|
396
|
+
join_table_name_real = table_name
|
397
|
+
sql_joins << " LEFT JOIN `#{table_data[:parent_table]}` AS `#{table_name}` ON 1=1"
|
398
|
+
else
|
399
|
+
const = @args[:module].const_get(table_name)
|
400
|
+
join_table_name_real = const.classname
|
401
|
+
sql_joins << " LEFT JOIN `#{const.table}` AS `#{const.classname}` ON 1=1"
|
402
|
+
end
|
403
|
+
|
404
|
+
if table_data[:ob]
|
405
|
+
ob = table_data[:ob]
|
406
|
+
else
|
407
|
+
ob = self
|
408
|
+
end
|
409
|
+
|
410
|
+
class_name = args[:table].to_sym
|
411
|
+
|
412
|
+
if table_data[:datarow]
|
413
|
+
datarow = table_data[:datarow]
|
414
|
+
else
|
415
|
+
self.requireclass(class_name) if @objects.key?(class_name)
|
416
|
+
datarow = @args[:module].const_get(class_name)
|
417
|
+
end
|
418
|
+
|
419
|
+
if !datarow.columns_sqlhelper_args
|
420
|
+
ob.requireclass(datarow.table.to_sym)
|
421
|
+
raise "No SQL-helper-args on class '#{datarow.table}' ???" if !datarow.columns_sqlhelper_args
|
422
|
+
end
|
423
|
+
|
424
|
+
newargs = datarow.columns_sqlhelper_args.clone
|
425
|
+
newargs[:table] = join_table_name_real
|
426
|
+
newargs[:joins_skip] = true
|
427
|
+
|
428
|
+
#Clone the where-arguments and run them against another sqlhelper to sub-join.
|
429
|
+
join_args = table_data[:where].clone
|
430
|
+
ret = self.sqlhelper(join_args, newargs)
|
431
|
+
sql_joins << ret[:sql_where]
|
432
|
+
|
433
|
+
#If any of the join-arguments are left, then we should throw an error.
|
434
|
+
join_args.each do |key, val|
|
435
|
+
raise "Invalid key '#{key}' when trying to join table '#{table_name}' on table '#{args_def[:table]}'."
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
#If limit arguments has been given then add them.
|
441
|
+
if limit_from and limit_to
|
442
|
+
sql_limit = " LIMIT #{limit_from}, #{limit_to}"
|
443
|
+
end
|
444
|
+
|
445
|
+
sql_groupby = nil if sql_groupby.length <= 0
|
446
|
+
|
447
|
+
return {
|
448
|
+
:sql_joins => sql_joins,
|
449
|
+
:sql_where => sql_where,
|
450
|
+
:sql_limit => sql_limit,
|
451
|
+
:sql_order => sql_order,
|
452
|
+
:sql_groupby => sql_groupby
|
453
|
+
}
|
454
|
+
end
|
455
|
+
|
456
|
+
#Used by sqlhelper-method to look up datarow-classes and automatically load them if they arent loaded already.
|
457
|
+
def datarow_obj_from_args(args, list_args, class_name)
|
458
|
+
class_name = class_name.to_sym
|
459
|
+
|
460
|
+
if !args.key?(:joined_tables)
|
461
|
+
raise "No joined tables on '#{args[:table]}' to find datarow for: '#{class_name}'."
|
462
|
+
end
|
463
|
+
|
464
|
+
args[:joined_tables].each do |table_name, table_data|
|
465
|
+
next if table_name.to_sym != class_name
|
466
|
+
return table_data[:datarow] if table_data[:datarow]
|
467
|
+
|
468
|
+
self.requireclass(class_name) if @objects.key?(class_name)
|
469
|
+
return @args[:module].const_get(class_name)
|
470
|
+
end
|
471
|
+
|
472
|
+
raise "Could not figure out datarow for: '#{class_name}'."
|
473
|
+
end
|
474
|
+
end
|