knjrbfw 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +29 -8
  3. data/lib/knj/arrayext.rb +206 -153
  4. data/lib/knj/autoload/backups/ping.rb +2 -2
  5. data/lib/knj/autoload/erubis.rb +3 -3
  6. data/lib/knj/autoload/facets_dictionary.rb +2 -2
  7. data/lib/knj/autoload/gettext.rb +3 -3
  8. data/lib/knj/autoload/gtk2.rb +1 -1
  9. data/lib/knj/autoload/json.rb +14 -0
  10. data/lib/knj/autoload/magick.rb +3 -3
  11. data/lib/knj/autoload/mysql.rb +3 -3
  12. data/lib/knj/autoload/parsedate.rb +1 -1
  13. data/lib/knj/autoload/ping.rb +2 -2
  14. data/lib/knj/autoload/rexml.rb +5 -5
  15. data/lib/knj/autoload/soap.rb +1 -1
  16. data/lib/knj/autoload/sqlite3.rb +3 -3
  17. data/lib/knj/autoload/tmail.rb +3 -3
  18. data/lib/knj/autoload/xmlsimple.rb +3 -3
  19. data/lib/knj/autoload/zip.rb +3 -3
  20. data/lib/knj/autoload.rb +87 -81
  21. data/lib/knj/cmd_gen.rb +19 -19
  22. data/lib/knj/cmd_parser.rb +59 -0
  23. data/lib/knj/compiler.rb +34 -34
  24. data/lib/knj/cpufreq.rb +37 -37
  25. data/lib/knj/csv.rb +20 -0
  26. data/lib/knj/datarow.rb +406 -239
  27. data/lib/knj/datarow_custom.rb +124 -0
  28. data/lib/knj/datestamp.rb +89 -89
  29. data/lib/knj/datet.rb +550 -454
  30. data/lib/knj/db.rb +1 -0
  31. data/lib/knj/degulesider.rb +42 -44
  32. data/lib/knj/erb/erb.rb +5 -5
  33. data/lib/knj/erb/erb_cache_clean.rb +10 -10
  34. data/lib/knj/erb/erb_fcgi.rb +32 -32
  35. data/lib/knj/erb/erb_fcgi_1.9.rb +32 -32
  36. data/lib/knj/erb/erb_fcgi_jruby.rb +2 -2
  37. data/lib/knj/erb/erb_jruby.rb +5 -5
  38. data/lib/knj/erb/include.rb +243 -243
  39. data/lib/knj/errors.rb +19 -18
  40. data/lib/knj/eruby.rb +12 -10
  41. data/lib/knj/event_filemod.rb +31 -31
  42. data/lib/knj/event_handler.rb +73 -67
  43. data/lib/knj/exchangerates.rb +37 -37
  44. data/lib/knj/facebook_connect.rb +95 -18
  45. data/lib/knj/filesystem.rb +6 -6
  46. data/lib/knj/fs/drivers/filesystem.rb +12 -12
  47. data/lib/knj/fs/drivers/ftp.rb +31 -31
  48. data/lib/knj/fs/drivers/ssh.rb +26 -26
  49. data/lib/knj/fs/fs.rb +31 -31
  50. data/lib/knj/gettext_fallback.rb +15 -15
  51. data/lib/knj/gettext_threadded.rb +75 -75
  52. data/lib/knj/google_sitemap.rb +53 -53
  53. data/lib/knj/gtk2.rb +272 -272
  54. data/lib/knj/gtk2_cb.rb +80 -80
  55. data/lib/knj/gtk2_menu.rb +55 -55
  56. data/lib/knj/gtk2_statuswindow.rb +62 -62
  57. data/lib/knj/gtk2_tv.rb +58 -58
  58. data/lib/knj/hash_methods.rb +27 -36
  59. data/lib/knj/http.rb +189 -167
  60. data/lib/knj/http2.rb +259 -53
  61. data/lib/knj/image.rb +2 -2
  62. data/lib/knj/includes/appserver_cli.rb +18 -18
  63. data/lib/knj/includes/require_info.rb +15 -0
  64. data/lib/knj/ip2location.rb +20 -20
  65. data/lib/knj/ironruby-gtk2/button.rb +14 -14
  66. data/lib/knj/ironruby-gtk2/dialog.rb +42 -42
  67. data/lib/knj/ironruby-gtk2/entry.rb +4 -4
  68. data/lib/knj/ironruby-gtk2/gdk_event.rb +1 -1
  69. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +11 -11
  70. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +9 -9
  71. data/lib/knj/ironruby-gtk2/gladexml.rb +102 -102
  72. data/lib/knj/ironruby-gtk2/glib.rb +13 -13
  73. data/lib/knj/ironruby-gtk2/gtk2.rb +121 -121
  74. data/lib/knj/ironruby-gtk2/gtk_builder.rb +29 -29
  75. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +3 -3
  76. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +17 -17
  77. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +3 -3
  78. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +16 -16
  79. data/lib/knj/ironruby-gtk2/gtk_menu.rb +3 -3
  80. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +2 -2
  81. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +3 -3
  82. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +22 -22
  83. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +11 -11
  84. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +17 -17
  85. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +30 -30
  86. data/lib/knj/ironruby-gtk2/iconsize.rb +1 -1
  87. data/lib/knj/ironruby-gtk2/image.rb +13 -13
  88. data/lib/knj/ironruby-gtk2/label.rb +17 -17
  89. data/lib/knj/ironruby-gtk2/stock.rb +2 -2
  90. data/lib/knj/ironruby-gtk2/tests/test_2.rb +14 -14
  91. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +37 -37
  92. data/lib/knj/ironruby-gtk2/vbox.rb +3 -3
  93. data/lib/knj/ironruby-gtk2/window.rb +18 -18
  94. data/lib/knj/jruby-gtk2/builder/test_builder.rb +11 -11
  95. data/lib/knj/jruby-gtk2/builder.rb +25 -25
  96. data/lib/knj/jruby-gtk2/cellrenderertext.rb +10 -10
  97. data/lib/knj/jruby-gtk2/checkbutton.rb +1 -1
  98. data/lib/knj/jruby-gtk2/combobox.rb +27 -27
  99. data/lib/knj/jruby-gtk2/dialog.rb +40 -40
  100. data/lib/knj/jruby-gtk2/eventbutton.rb +19 -19
  101. data/lib/knj/jruby-gtk2/gladexml.rb +97 -97
  102. data/lib/knj/jruby-gtk2/gtk2.rb +203 -203
  103. data/lib/knj/jruby-gtk2/hbox.rb +8 -8
  104. data/lib/knj/jruby-gtk2/iconsize.rb +3 -3
  105. data/lib/knj/jruby-gtk2/image.rb +8 -8
  106. data/lib/knj/jruby-gtk2/liststore.rb +54 -54
  107. data/lib/knj/jruby-gtk2/menu.rb +35 -35
  108. data/lib/knj/jruby-gtk2/progressbar.rb +10 -10
  109. data/lib/knj/jruby-gtk2/statusicon.rb +3 -3
  110. data/lib/knj/jruby-gtk2/stock.rb +6 -6
  111. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +36 -36
  112. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +3 -3
  113. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +2 -2
  114. data/lib/knj/jruby-gtk2/treeview.rb +88 -88
  115. data/lib/knj/jruby-gtk2/vbox.rb +10 -10
  116. data/lib/knj/jruby-gtk2/window.rb +7 -7
  117. data/lib/knj/jruby_compiler.rb +12 -12
  118. data/lib/knj/knj.rb +12 -11
  119. data/lib/knj/knj_controller.rb +13 -8
  120. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +499 -316
  121. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +127 -125
  122. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +43 -25
  123. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +316 -241
  124. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +12 -0
  125. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +146 -146
  126. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +24 -24
  127. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +283 -283
  128. data/lib/knj/knjdb/libknjdb.rb +96 -52
  129. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +78 -78
  130. data/lib/knj/knjdb/libknjdb_row.rb +147 -147
  131. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +61 -61
  132. data/lib/knj/knjdb/revision.rb +262 -0
  133. data/lib/knj/libqt.rb +69 -69
  134. data/lib/knj/libqt_window.rb +8 -8
  135. data/lib/knj/locales.rb +62 -52
  136. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +54 -54
  137. data/lib/knj/mail.rb +73 -73
  138. data/lib/knj/mailobj.rb +82 -80
  139. data/lib/knj/mount.rb +113 -113
  140. data/lib/knj/notify.rb +11 -11
  141. data/lib/knj/nvidia_settings.rb +43 -43
  142. data/lib/knj/objects/objects_sqlhelper.rb +474 -0
  143. data/lib/knj/objects.rb +569 -793
  144. data/lib/knj/opts.rb +38 -38
  145. data/lib/knj/os.rb +176 -158
  146. data/lib/knj/php.rb +853 -683
  147. data/lib/knj/php_parser/arguments.rb +3 -3
  148. data/lib/knj/php_parser/functions.rb +95 -95
  149. data/lib/knj/php_parser/php_parser.rb +16 -16
  150. data/lib/knj/php_parser/tests/test.rb +6 -6
  151. data/lib/knj/php_parser/tests/test_function_run.rb +6 -6
  152. data/lib/knj/power_manager.rb +29 -29
  153. data/lib/knj/process.rb +457 -0
  154. data/lib/knj/process_meta.rb +400 -0
  155. data/lib/knj/rand.rb +8 -8
  156. data/lib/knj/retry.rb +69 -69
  157. data/lib/knj/rhodes/delegate.rb +414 -0
  158. data/lib/knj/rhodes/rhodes.rb +114 -40
  159. data/lib/knj/rhodes/weakref.rb +80 -0
  160. data/lib/knj/rsvgbin.rb +18 -18
  161. data/lib/knj/scripts/degulesider.rb +2 -2
  162. data/lib/knj/scripts/filesearch.rb +35 -35
  163. data/lib/knj/scripts/ip2location.rb +2 -2
  164. data/lib/knj/scripts/keepalive.rb +2 -2
  165. data/lib/knj/scripts/php_to_rb_helper.rb +376 -0
  166. data/lib/knj/scripts/process_meta_exec.rb +104 -0
  167. data/lib/knj/scripts/svn_merge.rb +21 -21
  168. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +26 -26
  169. data/lib/knj/sms.rb +52 -52
  170. data/lib/knj/sshrobot/sshrobot.rb +90 -88
  171. data/lib/knj/sshrobot.rb +1 -0
  172. data/lib/knj/strings.rb +186 -74
  173. data/lib/knj/sysuser.rb +25 -25
  174. data/lib/knj/table_writer.rb +97 -0
  175. data/lib/knj/tests/compiler/compiler_test.rb +2 -2
  176. data/lib/knj/tests/test_degulesider.rb +1 -1
  177. data/lib/knj/tests/test_http2_proxy.rb +26 -0
  178. data/lib/knj/tests/test_mount.rb +9 -9
  179. data/lib/knj/tests/test_retry.rb +17 -17
  180. data/lib/knj/thread.rb +23 -24
  181. data/lib/knj/thread2.rb +45 -45
  182. data/lib/knj/threadhandler.rb +135 -102
  183. data/lib/knj/threadpool.rb +195 -145
  184. data/lib/knj/translations.rb +128 -119
  185. data/lib/knj/unix_proc.rb +80 -80
  186. data/lib/knj/web.rb +947 -881
  187. data/lib/knj/webscripts/image.rhtml +142 -67
  188. data/lib/knj/win.rb +2 -2
  189. data/lib/knj/win_registry.rb +58 -58
  190. data/lib/knj/win_tightvnc.rb +125 -125
  191. data/lib/knj/wref.rb +104 -0
  192. data/lib/knj/x11vnc.rb +46 -46
  193. data/lib/knj/youtube.rb +33 -36
  194. data/lib/knjrbfw.rb +1 -0
  195. data/spec/cmd_parser_spec.rb +25 -0
  196. data/spec/db_spec.rb +40 -0
  197. data/spec/db_spec_encoding_test_file.txt +1 -0
  198. data/spec/http2_spec.rb +37 -0
  199. data/spec/knjrbfw_spec.rb +17 -15
  200. data/spec/php_spec.rb +69 -0
  201. data/spec/process_meta_spec.rb +150 -0
  202. data/spec/process_spec.rb +107 -0
  203. data/spec/strings_spec.rb +21 -0
  204. data/spec/web_spec.rb +16 -0
  205. metadata +42 -21
  206. data/lib/knj/autoload/json_autoload.rb +0 -7
  207. data/lib/knj/autoload/twitter.rb +0 -2
  208. data/lib/knj/ext/webrick.rb +0 -31
  209. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  210. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  211. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
data/lib/knj/datarow.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  class Knj::Datarow
2
- attr_reader :data, :ob, :db
3
-
4
- def self.required_data
2
+ attr_reader :data, :ob, :db
3
+
4
+ def self.required_data
5
5
  @required_data = [] if !@required_data
6
6
  return @required_data
7
7
  end
@@ -11,14 +11,19 @@ class Knj::Datarow
11
11
  return @depending_data
12
12
  end
13
13
 
14
- def is_knj?; return true; end
15
-
16
- def self.is_nullstamp?(stamp)
14
+ #This helps various parts of the framework determine if this is a datarow class without requiring it.
15
+ def is_knj?
16
+ return true
17
+ end
18
+
19
+ #This tests if a certain string is a date-null-stamp.
20
+ def self.is_nullstamp?(stamp)
17
21
  return true if !stamp or stamp == "0000-00-00 00:00:00" or stamp == "0000-00-00"
18
22
  return false
19
- end
20
-
21
- def self.has_many(arr)
23
+ end
24
+
25
+ #This is used to define datarows that this object can have a lot of.
26
+ def self.has_many(arr)
22
27
  arr.each do |val|
23
28
  if val.is_a?(Array)
24
29
  classname, colname, methodname = *val
@@ -40,43 +45,51 @@ class Knj::Datarow
40
45
  if val.is_a?(Hash) and val.key?(:where)
41
46
  where_args = val[:where]
42
47
  else
43
- where_args = {}
48
+ where_args = nil
44
49
  end
45
50
 
46
51
  raise "No classname given." if !classname
47
52
  methodname = "#{classname.to_s.downcase}s".to_sym if !methodname
48
53
 
49
54
  define_method(methodname) do |*args, &block|
50
- merge_args = args[0] if args and args[0]
51
- merge_args = {} if !merge_args
52
-
53
- all_args = []
54
- all_args << block if block
55
-
56
- if block
57
- @ob.list(classname, merge_args.merge(colname.to_s => self.id)) do |obj|
58
- block.call(obj)
59
- end
55
+ if args and args[0]
56
+ list_args = args[0]
60
57
  else
61
- return @ob.list(classname, merge_args.merge(colname.to_s => self.id))
58
+ list_args = {}
62
59
  end
60
+
61
+ list_args.merge!(where_args) if where_args
62
+ list_args[colname.to_s] = self.id
63
+
64
+ return @ob.list(classname, list_args, &block)
63
65
  end
64
66
 
65
67
  define_method("#{methodname}_count".to_sym) do |*args|
66
- merge_args = args[0] if args and args[0]
67
- merge_args = {} if !merge_args
68
+ list_args = args[0] if args and args[0]
69
+ list_args = {} if !list_args
70
+ list_args[colname.to_s] = self.id
71
+ list_args["count"] = true
68
72
 
69
- return @ob.list(classname, merge_args.merge(colname.to_s => self.id, "count" => true))
73
+ return @ob.list(classname, list_args)
70
74
  end
71
75
 
72
76
  define_method("#{methodname}_last".to_sym) do |args|
73
77
  args = {} if !args
74
78
  return @ob.list(classname, {"orderby" => [["id", "desc"]], "limit" => 1}.merge(args))
75
79
  end
80
+
81
+ self.joined_tables(
82
+ classname => {
83
+ :where => {
84
+ colname.to_s => {:type => "col", :name => :id}
85
+ }
86
+ }
87
+ )
76
88
  end
77
- end
78
-
79
- def self.has_one(arr)
89
+ end
90
+
91
+ #This define is this object has one element of another datarow-class. It define various methods and joins based on that.
92
+ def self.has_one(arr)
80
93
  arr.each do |val|
81
94
  methodname = nil
82
95
  colname = nil
@@ -117,88 +130,105 @@ class Knj::Datarow
117
130
  raise "Class '#{classname}' does not have a 'html'-method." if !obj.respond_to?(:html)
118
131
  return obj.html(*args)
119
132
  end
133
+
134
+ self.joined_tables(
135
+ classname => {
136
+ :where => {
137
+ "id" => {:type => "col", :name => colname}
138
+ }
139
+ }
140
+ )
120
141
  end
121
- end
122
-
123
- def self.joined_tables(hash)
124
- @columns_joined_tables = hash
125
- end
126
-
127
- def self.table
128
- return self.name.split("::").last
129
- end
130
-
131
- def self.columns(d)
132
- columns_load(d) if !@columns
133
- return @columns
134
- end
135
-
136
- def self.columns_load(d)
137
- return nil if @columns
138
- @ob = d.ob
139
- @columns = d.db.tables[table].columns
140
- end
141
-
142
- def self.columns_sqlhelper_args
143
- return @columns_sqlhelper_args
144
- end
145
-
146
- def self.list(d)
147
- ec_col = d.db.enc_col
148
- ec_table = d.db.enc_table
149
-
150
- table_str = "#{ec_table}#{d.db.esc_table(self.table)}#{ec_table}"
151
-
152
- if d.args["count"]
153
- count = true
154
- d.args.delete("count")
155
- sql = "SELECT COUNT(#{table_str}.#{ec_col}id#{ec_col}) AS count"
156
- else
157
- sql = "SELECT #{table_str}.*"
158
- end
159
-
160
- ret = self.list_helper(d)
161
-
162
- sql += " FROM #{table_str}"
163
- sql += ret[:sql_joins]
164
- sql += " WHERE 1=1"
142
+ end
143
+
144
+ #This method initializes joins, sets methods to update translations and makes the translations automatically be deleted when the object is deleted.
145
+ def self.has_translation(arr)
146
+ @translations = [] if !@translations
165
147
 
166
- d.args.each do |key, val|
167
- case key
168
- when "return_sql"
169
- #ignore
170
- else
171
- raise "Invalid key: '#{key}'."
148
+ arr.each do |val|
149
+ @translations << val
150
+
151
+ val_dc = val.to_s.downcase
152
+ table_name = "Translation_#{val_dc}".to_sym
153
+
154
+ joined_tables(
155
+ table_name => {
156
+ :where => {
157
+ "object_class" => self.name,
158
+ "object_id" => {:type => "col", :name => "id"},
159
+ "key" => val.to_s,
160
+ "locale" => proc{|d| _session[:locale]}
161
+ },
162
+ :parent_table => :Translation,
163
+ :datarow => Knj::Translations::Translation,
164
+ :ob => @ob
165
+ }
166
+ )
167
+
168
+ define_method("#{val_dc}=") do |newtransval|
169
+ _kas.trans_set(self, {
170
+ val => newtransval
171
+ })
172
+ end
173
+
174
+ define_method("#{val_dc}") do
175
+ return _kas.trans(self, val)
176
+ end
177
+
178
+ define_method("#{val_dc}_html") do
179
+ str = _kas.trans(self, val)
180
+ if str.to_s.strip.length <= 0
181
+ return "[no translation for #{val}]"
182
+ end
183
+
184
+ return str
172
185
  end
173
186
  end
187
+ end
188
+
189
+ #This returns all translations for this datarow-class.
190
+ def self.translations
191
+ return @translations
192
+ end
193
+
194
+ def self.joined_tables(hash)
195
+ @columns_joined_tables = {} if !@columns_joined_tables
196
+ @columns_joined_tables.merge!(hash)
197
+ end
198
+
199
+ def self.table
200
+ return @table if @table
201
+ return self.name.split("::").last
202
+ end
203
+
204
+ def self.table=(newtable)
205
+ @table = newtable
206
+ @columns_sqlhelper_args[:table] = @table if @columns_sqlhelper_args.is_a?(Hash)
207
+ end
208
+
209
+ def table
210
+ return self.class.table
211
+ end
212
+
213
+ def self.columns_sqlhelper_args
214
+ return @columns_sqlhelper_args
215
+ end
216
+
217
+ def self.load_columns(d)
218
+ @ob = d.ob if !@ob
174
219
 
175
- sql += ret[:sql_where]
176
-
177
- #The count will bug if there is a group-by-statement.
178
- if !count
179
- sql += " GROUP BY #{table_str}.#{ec_col}id#{ec_col}"
180
- end
181
-
182
- sql += ret[:sql_order]
183
- sql += ret[:sql_limit]
184
-
185
- return sql.to_s if d.args["return_sql"]
186
-
187
- if count
188
- ret = d.db.query(sql).fetch
189
- return ret[:count].to_i if ret
190
- return 0
220
+ if !@classname
221
+ if match = self.name.match(/($|::)([A-z\d_]+?)$/)
222
+ @classname = match[2].to_sym
223
+ else
224
+ @classname = self.name.to_sym
225
+ end
191
226
  end
192
227
 
193
- return d.ob.list_bysql(self.table, sql)
194
- end
195
-
196
- def self.load_columns(d)
197
228
  @mutex = Mutex.new if !@mutex
198
229
 
199
230
  @mutex.synchronize do
200
- cols = self.columns(d)
201
- inst_methods = instance_methods(false)
231
+ inst_methods = self.instance_methods(false)
202
232
 
203
233
  sqlhelper_args = {
204
234
  :db => d.db,
@@ -210,75 +240,40 @@ class Knj::Datarow
210
240
  :cols_str => [],
211
241
  :cols => {}
212
242
  }
213
- cols.each do |col_name, col_obj|
243
+
244
+ sqlhelper_args[:table] = @table if @table
245
+
246
+ d.db.tables[table].columns do |col_obj|
247
+ col_name = col_obj.name
214
248
  col_type = col_obj.type
215
249
  col_type = "int" if col_type == "bigint" or col_type == "tinyint" or col_type == "mediumint" or col_type == "smallint"
216
250
  sqlhelper_args[:cols][col_name] = true
217
251
 
252
+ self.define_bool_methods(:inst_methods => inst_methods, :col_name => col_name)
253
+
218
254
  if col_type == "enum" and col_obj.maxlength == "'0','1'"
219
255
  sqlhelper_args[:cols_bools] << col_name
220
- method_name = "#{col_name}?".to_sym
221
-
222
- if !inst_methods.index(method_name)
223
- define_method(method_name) do
224
- return true if self[col_name.to_sym].to_s == "1"
225
- return false
226
- end
227
- end
228
256
  elsif col_type == "int" and col_name.slice(-3, 3) == "_id"
229
257
  sqlhelper_args[:cols_dbrows] << col_name
230
- elsif col_type == "int" or col_type == "bigint"
258
+ elsif col_type == "int" or col_type == "bigint" or col_type == "decimal"
231
259
  sqlhelper_args[:cols_num] << col_name
232
260
  elsif col_type == "varchar" or col_type == "text" or col_type == "enum"
233
261
  sqlhelper_args[:cols_str] << col_name
234
262
  elsif col_type == "date" or col_type == "datetime"
235
263
  sqlhelper_args[:cols_date] << col_name
236
- method_name = "#{col_name}_str".to_sym
237
-
238
- if !inst_methods.index(method_name)
239
- define_method(method_name) do |*args|
240
- if Knj::Datet.is_nullstamp?(self[col_name.to_sym])
241
- return @ob.events.call(:no_date, self.class.name)
242
- end
243
-
244
- return Knj::Datet.in(self[col_name.to_sym]).out(*args)
245
- end
246
- end
247
-
248
- method_name = "#{col_name}".to_sym
249
- if !inst_methods.index(method_name)
250
- define_method(method_name) do |*args|
251
- return false if Knj::Datet.is_nullstamp?(self[col_name.to_sym])
252
- return Knj::Datet.in(self[col_name.to_sym])
253
- end
254
- end
264
+ self.define_date_methods(:inst_methods => inst_methods, :col_name => col_name)
255
265
  end
256
266
 
257
267
  if col_type == "int" or col_type == "decimal"
258
- method_name = "#{col_name}_format"
259
- if inst_methods.index(method_name) == nil
260
- define_method(method_name) do |*args|
261
- return Knj::Locales.number_out(self[col_name.to_sym], *args)
262
- end
263
- end
268
+ self.define_numeric_methods(:inst_methods => inst_methods, :col_name => col_name)
264
269
  end
265
270
 
266
271
  if col_type == "int" or col_type == "varchar"
267
- method_name = "by_#{col_name}".to_sym
268
- if !inst_methods.index(method_name) and RUBY_VERSION.to_s.slice(0, 3) != "1.8"
269
- define_singleton_method(method_name) do |arg|
270
- return d.ob.get_by(self.table, {col_name.to_s => arg})
271
- end
272
- end
272
+ self.define_text_methods(:inst_methods => inst_methods, :col_name => col_name)
273
273
  end
274
274
 
275
275
  if col_type == "time"
276
- method_name = "#{col_name}_dbt"
277
- if !inst_methods.index(method_name)
278
- define_method(method_name) do
279
- return Knj::Db::Dbtime.new(self[col_name.to_sym])
280
- end
281
- end
276
+ self.define_time_methods(:inst_methods => inst_methods, :col_name => col_name)
282
277
  end
283
278
  end
284
279
 
@@ -298,99 +293,271 @@ class Knj::Datarow
298
293
  end
299
294
 
300
295
  self.init_class(d) if self.respond_to?(:init_class)
301
- end
302
-
303
- def self.list_helper(d)
304
- self.load_columns(d) if !@columns_sqlhelper_args
305
- return d.ob.sqlhelper(d.args, @columns_sqlhelper_args)
306
- end
307
-
308
- def table
309
- return self.class.name.split("::").last
310
- end
311
-
312
- def initialize(d)
313
- @ob = d.ob
314
- @db = d.ob.db
315
- raise "No ob given." if !@ob
316
-
317
- if d.data.is_a?(Hash)
318
- @data = d.data
319
- elsif d.data
320
- @data = {:id => d.data}
321
- self.reload
322
- else
323
- raise Knj::Errors::InvalidData, "Could not figure out the data from '#{d.data.class.name}'."
324
- end
325
- end
326
-
327
- def reload
328
- data = @db.single(self.table, {:id => @data[:id]})
329
- if !data
330
- raise Knj::Errors::NotFound, "Could not find any data for the object with ID: '#{@data[:id]}' in the table '#{self.table}'."
331
- end
332
-
333
- @data = data
334
- end
335
-
336
- def update(newdata)
337
- @db.update(self.table, newdata, {:id => @data[:id]})
338
- self.reload
339
-
340
- if @ob
341
- @ob.call("object" => self, "signal" => "update")
342
- end
343
- end
344
-
345
- def destroy
346
- @ob = nil
347
- @db = nil
348
- @data = nil
349
- end
350
-
351
- def has_key?(key)
352
- return @data.key?(key.to_sym)
353
- end
354
-
355
- def key?(key)
296
+ end
297
+
298
+ #Various methods to define methods based on the columns for the datarow.
299
+ def self.define_bool_methods(args)
300
+ #Spawns a method on the class which returns true if the data is 1.
301
+ method_name = "#{args[:col_name]}?".to_sym
302
+
303
+ if args[:inst_methods].index(method_name) == nil
304
+ define_method(method_name) do
305
+ return true if self[args[:col_name].to_sym].to_s == "1"
306
+ return false
307
+ end
308
+ end
309
+ end
310
+
311
+ def self.define_date_methods(args)
312
+ method_name = "#{args[:col_name]}_str".to_sym
313
+ if args[:inst_methods].index(method_name) == nil
314
+ define_method(method_name) do |*method_args|
315
+ if Knj::Datet.is_nullstamp?(self[args[:col_name].to_sym])
316
+ return @ob.events.call(:no_date, self.class.name)
317
+ end
318
+
319
+ return Knj::Datet.in(self[args[:col_name].to_sym]).out(*method_args)
320
+ end
321
+ end
322
+
323
+ method_name = "#{args[:col_name]}".to_sym
324
+ if args[:inst_methods].index(method_name) == nil
325
+ define_method(method_name) do |*method_args|
326
+ return false if Knj::Datet.is_nullstamp?(self[args[:col_name].to_sym])
327
+ return Knj::Datet.in(self[args[:col_name].to_sym])
328
+ end
329
+ end
330
+ end
331
+
332
+ def self.define_numeric_methods(args)
333
+ method_name = "#{args[:col_name]}_format"
334
+ if args[:inst_methods].index(method_name) == nil
335
+ define_method(method_name) do |*method_args|
336
+ return Knj::Locales.number_out(self[args[:col_name].to_sym], *method_args)
337
+ end
338
+ end
339
+ end
340
+
341
+ def self.define_text_methods(args)
342
+ method_name = "by_#{args[:col_name]}".to_sym
343
+ if args[:inst_methods].index(method_name) == nil and RUBY_VERSION.to_s.slice(0, 3) != "1.8"
344
+ define_singleton_method(method_name) do |arg|
345
+ return d.ob.get_by(self.table, {args[:col_name].to_s => arg})
346
+ end
347
+ end
348
+ end
349
+
350
+ def self.define_time_methods(args)
351
+ method_name = "#{args[:col_name]}_dbt"
352
+ if args[:inst_methods].index(method_name) == nil
353
+ define_method(method_name) do
354
+ return Knj::Db::Dbtime.new(self[args[:col_name].to_sym])
355
+ end
356
+ end
357
+ end
358
+
359
+ def self.list(d, &block)
360
+ ec_col = d.db.enc_col
361
+ ec_table = d.db.enc_table
362
+
363
+ table_str = "#{ec_table}#{d.db.esc_table(self.table)}#{ec_table}"
364
+
365
+ if d.args["count"]
366
+ count = true
367
+ d.args.delete("count")
368
+ sql = "SELECT COUNT(#{table_str}.#{ec_col}id#{ec_col}) AS count"
369
+ elsif d.args["select_col_as_array"]
370
+ select_col_as_array = true
371
+ sql = "SELECT #{table_str}.#{ec_col}#{d.args["select_col_as_array"]}#{ec_col} AS id"
372
+ d.args.delete("select_col_as_array")
373
+ else
374
+ sql = "SELECT #{table_str}.*"
375
+ end
376
+
377
+ ret = self.list_helper(d)
378
+
379
+ sql << " FROM #{table_str}"
380
+ sql << ret[:sql_joins]
381
+ sql << " WHERE 1=1"
382
+ sql << ret[:sql_where]
383
+
384
+ d.args.each do |key, val|
385
+ case key
386
+ when "return_sql"
387
+ #ignore
388
+ else
389
+ raise "Invalid key: '#{key}' for '#{self.name}'."
390
+ end
391
+ end
392
+
393
+ #The count will bug if there is a group-by-statement.
394
+ grp_shown = false
395
+ if !count and !ret[:sql_groupby]
396
+ sql << " GROUP BY #{table_str}.#{ec_col}id#{ec_col}"
397
+ grp_shown = true
398
+ end
399
+
400
+ if ret[:sql_groupby]
401
+ if !grp_shown
402
+ sql << " GROUP BY"
403
+ else
404
+ sql << ", "
405
+ end
406
+
407
+ sql << ret[:sql_groupby]
408
+ end
409
+
410
+ sql << ret[:sql_order]
411
+ sql << ret[:sql_limit]
412
+
413
+ return sql.to_s if d.args["return_sql"]
414
+
415
+ if select_col_as_array
416
+ ids = [] if !block
417
+ d.db.q(sql) do |data|
418
+ if block
419
+ block.call(data[:id])
420
+ else
421
+ ids << data[:id]
422
+ end
423
+ end
424
+
425
+ if !block
426
+ return ids
427
+ else
428
+ return nil
429
+ end
430
+ elsif count
431
+ ret = d.db.query(sql).fetch
432
+ return ret[:count].to_i if ret
433
+ return 0
434
+ end
435
+
436
+ return d.ob.list_bysql(self.classname, sql, &block)
437
+ end
438
+
439
+ def self.classname
440
+ return @classname
441
+ end
442
+
443
+ def self.classname=(newclassname)
444
+ @classname = newclassname
445
+ end
446
+
447
+ def self.list_helper(d)
448
+ self.load_columns(d) if !@columns_sqlhelper_args
449
+ @columns_sqlhelper_args[:table] = @table if @table
450
+ return d.ob.sqlhelper(d.args, @columns_sqlhelper_args)
451
+ end
452
+
453
+ def initialize(d)
454
+ @ob = d.ob
455
+ @db = d.ob.db
456
+ raise "No ob given." if !@ob
457
+
458
+ if d.data.is_a?(Hash)
459
+ @data = d.data
460
+ elsif d.data
461
+ @data = {:id => d.data}
462
+ self.reload
463
+ else
464
+ raise Knj::Errors::InvalidData, "Could not figure out the data from '#{d.data.class.name}'."
465
+ end
466
+ end
467
+
468
+ #Reloads the data from the database.
469
+ def reload
470
+ data = @db.single(self.table, {:id => @data[:id]})
471
+ if !data
472
+ raise Knj::Errors::NotFound, "Could not find any data for the object with ID: '#{@data[:id]}' in the table '#{self.table}'."
473
+ end
474
+
475
+ @data = data
476
+ end
477
+
478
+ #Writes/updates new data for the object.
479
+ def update(newdata)
480
+ @db.update(self.table, newdata, {:id => @data[:id]})
481
+ self.reload
482
+
483
+ if @ob
484
+ @ob.call("object" => self, "signal" => "update")
485
+ end
486
+ end
487
+
488
+ #Forcefully destroys the object. This is done after deleting it and should not be called manually.
489
+ def destroy
490
+ @ob = nil
491
+ @db = nil
492
+ @data = nil
493
+ end
494
+
495
+ #Alias for key?
496
+ def has_key?(key)
356
497
  return @data.key?(key.to_sym)
357
- end
358
-
359
- def [](key)
360
- raise "No valid key given." if !key.is_a?(Symbol)
361
- raise "No data was loaded on the object? Maybe you are trying to call a deleted object?" if !@data
362
- return @data[key] if @data.key?(key)
363
- raise "No such key: #{key}."
364
- end
365
-
366
- def []=(key, value)
367
- self.update(key.to_sym => value)
368
- self.reload
369
- end
370
-
371
- def id
498
+ end
499
+
500
+ #Returns true if that key exists on the object.
501
+ def key?(key)
502
+ return @data.key?(key.to_sym)
503
+ end
504
+
505
+ #Returns true if the object has been deleted.
506
+ def deleted?
507
+ return true if !@ob and !@data
508
+ return false
509
+ end
510
+
511
+ #Returns a specific data from the object by key.
512
+ def [](key)
513
+ raise "Key was not a symbol: '#{key.class.name}'." if !key.is_a?(Symbol)
514
+ raise "No data was loaded on the object? Maybe you are trying to call a deleted object?" if !@data
515
+ return @data[key] if @data.key?(key)
516
+ raise "No such key: '#{key}'."
517
+ end
518
+
519
+ #Writes/updates a keys value on the object.
520
+ def []=(key, value)
521
+ self.update(key.to_sym => value)
522
+ self.reload
523
+ end
524
+
525
+ #Returns the objects ID.
526
+ def id
372
527
  raise "No data on object." if !@data
373
- return @data[:id]
374
- end
375
-
376
- def name
377
- if @data.key?(:title)
378
- return @data[:title]
379
- elsif @data.key?(:name)
380
- return @data[:name]
381
- end
382
-
383
- obj_methods = self.class.instance_methods(false)
384
- [:name, :title].each do |method_name|
385
- return self.method(method_name).call if obj_methods.index(method_name)
386
- end
387
-
388
- raise "Couldnt figure out the title/name of the object on class #{self.class.name}."
389
- end
390
-
391
- alias :title :name
392
-
393
- def each(&args)
394
- return @data.each(&args)
395
- end
528
+ return @data[:id]
529
+ end
530
+
531
+ #Tries to figure out, and returns, the possible name or title for the object.
532
+ def name
533
+ if @data.key?(:title)
534
+ return @data[:title]
535
+ elsif @data.key?(:name)
536
+ return @data[:name]
537
+ end
538
+
539
+ obj_methods = self.class.instance_methods(false)
540
+ [:name, :title].each do |method_name|
541
+ return self.method(method_name).call if obj_methods.index(method_name)
542
+ end
543
+
544
+ raise "Couldnt figure out the title/name of the object on class #{self.class.name}."
545
+ end
546
+
547
+ #Calls the name-method and returns a HTML-escaped value. Also "[no name]" if the name is empty.
548
+ def name_html
549
+ name_str = self.name.to_s
550
+ if name_str.length <= 0
551
+ name_str = "[no name]"
552
+ end
553
+
554
+ return name_str
555
+ end
556
+
557
+ alias :title :name
558
+
559
+ #Loops through the data on the object.
560
+ def each(&args)
561
+ return @data.each(&args)
562
+ end
396
563
  end