knjrbfw 0.0.3

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.
Files changed (208) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +32 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/lib/knj/.gitignore +1 -0
  10. data/lib/knj/arrayext.rb +157 -0
  11. data/lib/knj/autoload/activesupport.rb +2 -0
  12. data/lib/knj/autoload/backups/facets_dictionary.rb +430 -0
  13. data/lib/knj/autoload/backups/parsedate.rb +53 -0
  14. data/lib/knj/autoload/backups/ping.rb +64 -0
  15. data/lib/knj/autoload/cinch.rb +2 -0
  16. data/lib/knj/autoload/erubis.rb +6 -0
  17. data/lib/knj/autoload/facebooker.rb +3 -0
  18. data/lib/knj/autoload/facets_dictionary.rb +7 -0
  19. data/lib/knj/autoload/gd2.rb +2 -0
  20. data/lib/knj/autoload/gettext.rb +9 -0
  21. data/lib/knj/autoload/gtk2.rb +5 -0
  22. data/lib/knj/autoload/json_autoload.rb +7 -0
  23. data/lib/knj/autoload/magick.rb +6 -0
  24. data/lib/knj/autoload/mysql.rb +6 -0
  25. data/lib/knj/autoload/parsedate.rb +1 -0
  26. data/lib/knj/autoload/ping.rb +64 -0
  27. data/lib/knj/autoload/rexml.rb +12 -0
  28. data/lib/knj/autoload/soap.rb +3 -0
  29. data/lib/knj/autoload/sqlite3.rb +6 -0
  30. data/lib/knj/autoload/tmail.rb +6 -0
  31. data/lib/knj/autoload/twitter.rb +2 -0
  32. data/lib/knj/autoload/xmlsimple.rb +6 -0
  33. data/lib/knj/autoload/zip.rb +6 -0
  34. data/lib/knj/autoload.rb +136 -0
  35. data/lib/knj/compiler.rb +53 -0
  36. data/lib/knj/cpufreq.rb +40 -0
  37. data/lib/knj/datarow.rb +256 -0
  38. data/lib/knj/datestamp.rb +91 -0
  39. data/lib/knj/datet.rb +448 -0
  40. data/lib/knj/degulesider.rb +46 -0
  41. data/lib/knj/erb/apache_knjerb.conf +8 -0
  42. data/lib/knj/erb/cache/README +1 -0
  43. data/lib/knj/erb/erb.rb +21 -0
  44. data/lib/knj/erb/erb_1.9.rb +13 -0
  45. data/lib/knj/erb/erb_cache_clean.rb +20 -0
  46. data/lib/knj/erb/erb_fcgi.rb +44 -0
  47. data/lib/knj/erb/erb_fcgi_1.9.rb +44 -0
  48. data/lib/knj/erb/erb_fcgi_jruby.rb +7 -0
  49. data/lib/knj/erb/erb_jruby.rb +22 -0
  50. data/lib/knj/erb/include.rb +248 -0
  51. data/lib/knj/errors.rb +19 -0
  52. data/lib/knj/eruby.rb +224 -0
  53. data/lib/knj/event_filemod.rb +53 -0
  54. data/lib/knj/event_handler.rb +69 -0
  55. data/lib/knj/exchangerates.rb +39 -0
  56. data/lib/knj/ext/webrick.rb +31 -0
  57. data/lib/knj/filesystem.rb +8 -0
  58. data/lib/knj/fs/drivers/filesystem.rb +14 -0
  59. data/lib/knj/fs/drivers/ftp.rb +33 -0
  60. data/lib/knj/fs/drivers/ssh.rb +28 -0
  61. data/lib/knj/fs/fs.rb +36 -0
  62. data/lib/knj/gettext_fallback.rb +17 -0
  63. data/lib/knj/gettext_threadded.rb +77 -0
  64. data/lib/knj/google_sitemap.rb +59 -0
  65. data/lib/knj/gtk2.rb +277 -0
  66. data/lib/knj/gtk2_cb.rb +85 -0
  67. data/lib/knj/gtk2_menu.rb +57 -0
  68. data/lib/knj/gtk2_statuswindow.rb +64 -0
  69. data/lib/knj/gtk2_tv.rb +63 -0
  70. data/lib/knj/hash_methods.rb +37 -0
  71. data/lib/knj/http.rb +190 -0
  72. data/lib/knj/includes/appserver_cli.rb +39 -0
  73. data/lib/knj/ip2location.rb +22 -0
  74. data/lib/knj/ironruby-gtk2/button.rb +19 -0
  75. data/lib/knj/ironruby-gtk2/dialog.rb +44 -0
  76. data/lib/knj/ironruby-gtk2/entry.rb +9 -0
  77. data/lib/knj/ironruby-gtk2/gdk_event.rb +3 -0
  78. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +13 -0
  79. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +11 -0
  80. data/lib/knj/ironruby-gtk2/gladexml.rb +104 -0
  81. data/lib/knj/ironruby-gtk2/glib.rb +15 -0
  82. data/lib/knj/ironruby-gtk2/gtk2.rb +148 -0
  83. data/lib/knj/ironruby-gtk2/gtk_builder.rb +31 -0
  84. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +5 -0
  85. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +19 -0
  86. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +5 -0
  87. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +18 -0
  88. data/lib/knj/ironruby-gtk2/gtk_menu.rb +5 -0
  89. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +7 -0
  90. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +8 -0
  91. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +24 -0
  92. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +16 -0
  93. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +19 -0
  94. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +32 -0
  95. data/lib/knj/ironruby-gtk2/iconsize.rb +3 -0
  96. data/lib/knj/ironruby-gtk2/image.rb +15 -0
  97. data/lib/knj/ironruby-gtk2/label.rb +19 -0
  98. data/lib/knj/ironruby-gtk2/stock.rb +4 -0
  99. data/lib/knj/ironruby-gtk2/tests/test.glade +15 -0
  100. data/lib/knj/ironruby-gtk2/tests/test_2.rb +22 -0
  101. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +47 -0
  102. data/lib/knj/ironruby-gtk2/vbox.rb +5 -0
  103. data/lib/knj/ironruby-gtk2/window.rb +23 -0
  104. data/lib/knj/jruby-gtk2/builder/test_builder.glade +43 -0
  105. data/lib/knj/jruby-gtk2/builder/test_builder.rb +19 -0
  106. data/lib/knj/jruby-gtk2/builder/test_builder.ui +43 -0
  107. data/lib/knj/jruby-gtk2/builder.rb +27 -0
  108. data/lib/knj/jruby-gtk2/cellrenderertext.rb +12 -0
  109. data/lib/knj/jruby-gtk2/checkbutton.rb +3 -0
  110. data/lib/knj/jruby-gtk2/combobox.rb +29 -0
  111. data/lib/knj/jruby-gtk2/dialog.rb +44 -0
  112. data/lib/knj/jruby-gtk2/eventbutton.rb +21 -0
  113. data/lib/knj/jruby-gtk2/gladexml.rb +99 -0
  114. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  115. data/lib/knj/jruby-gtk2/gtk2.rb +246 -0
  116. data/lib/knj/jruby-gtk2/hbox.rb +10 -0
  117. data/lib/knj/jruby-gtk2/iconsize.rb +5 -0
  118. data/lib/knj/jruby-gtk2/image.rb +10 -0
  119. data/lib/knj/jruby-gtk2/liststore.rb +56 -0
  120. data/lib/knj/jruby-gtk2/menu.rb +40 -0
  121. data/lib/knj/jruby-gtk2/progressbar.rb +12 -0
  122. data/lib/knj/jruby-gtk2/statusicon.rb +8 -0
  123. data/lib/knj/jruby-gtk2/stock.rb +8 -0
  124. data/lib/knj/jruby-gtk2/tests/test_glade_window.glade +163 -0
  125. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +47 -0
  126. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +17 -0
  127. data/lib/knj/jruby-gtk2/tests/test_trayicon.png +0 -0
  128. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +18 -0
  129. data/lib/knj/jruby-gtk2/treeview.rb +105 -0
  130. data/lib/knj/jruby-gtk2/vbox.rb +12 -0
  131. data/lib/knj/jruby-gtk2/window.rb +11 -0
  132. data/lib/knj/jruby_compiler.rb +14 -0
  133. data/lib/knj/knj.rb +19 -0
  134. data/lib/knj/knj_controller.rb +13 -0
  135. data/lib/knj/knjdb/dbtime.rb +30 -0
  136. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +327 -0
  137. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +130 -0
  138. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +30 -0
  139. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +255 -0
  140. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +93 -0
  141. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +151 -0
  142. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +29 -0
  143. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +300 -0
  144. data/lib/knj/knjdb/libknjdb.rb +438 -0
  145. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +83 -0
  146. data/lib/knj/knjdb/libknjdb_row.rb +149 -0
  147. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +69 -0
  148. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  149. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
  150. data/lib/knj/libqt.rb +75 -0
  151. data/lib/knj/libqt_window.rb +10 -0
  152. data/lib/knj/locale_strings.rb +3 -0
  153. data/lib/knj/locales.rb +54 -0
  154. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +56 -0
  155. data/lib/knj/mail.rb +75 -0
  156. data/lib/knj/mailobj.rb +82 -0
  157. data/lib/knj/mount.rb +115 -0
  158. data/lib/knj/notify.rb +13 -0
  159. data/lib/knj/nvidia_settings.rb +45 -0
  160. data/lib/knj/objects.rb +731 -0
  161. data/lib/knj/opts.rb +38 -0
  162. data/lib/knj/os.rb +158 -0
  163. data/lib/knj/php.rb +717 -0
  164. data/lib/knj/php_parser/arguments.rb +5 -0
  165. data/lib/knj/php_parser/functions.rb +97 -0
  166. data/lib/knj/php_parser/php_parser.rb +99 -0
  167. data/lib/knj/php_parser/tests/test.rb +12 -0
  168. data/lib/knj/php_parser/tests/test_function.php +8 -0
  169. data/lib/knj/php_parser/tests/test_function_run.rb +19 -0
  170. data/lib/knj/power_manager.rb +31 -0
  171. data/lib/knj/rand.rb +10 -0
  172. data/lib/knj/retry.rb +71 -0
  173. data/lib/knj/rhodes/mutex.rb +11 -0
  174. data/lib/knj/rhodes/rhodes.js +3 -0
  175. data/lib/knj/rhodes/rhodes.rb +11 -0
  176. data/lib/knj/rsvgbin.rb +20 -0
  177. data/lib/knj/scripts/degulesider.rb +12 -0
  178. data/lib/knj/scripts/filesearch.rb +51 -0
  179. data/lib/knj/scripts/ip2location.rb +12 -0
  180. data/lib/knj/scripts/keepalive.rb +6 -0
  181. data/lib/knj/scripts/svn_merge.rb +29 -0
  182. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +41 -0
  183. data/lib/knj/sms.rb +54 -0
  184. data/lib/knj/sshrobot/sshrobot.rb +93 -0
  185. data/lib/knj/strings.rb +65 -0
  186. data/lib/knj/sysuser.rb +27 -0
  187. data/lib/knj/tests/compiler/compiler_test.rb +13 -0
  188. data/lib/knj/tests/compiler/compiler_test_file.rb +62 -0
  189. data/lib/knj/tests/test_degulesider.rb +11 -0
  190. data/lib/knj/tests/test_mount.rb +30 -0
  191. data/lib/knj/tests/test_retry.rb +30 -0
  192. data/lib/knj/thread.rb +32 -0
  193. data/lib/knj/thread2.rb +47 -0
  194. data/lib/knj/threadhandler.rb +130 -0
  195. data/lib/knj/threadpool.rb +177 -0
  196. data/lib/knj/translations.rb +139 -0
  197. data/lib/knj/unix_proc.rb +82 -0
  198. data/lib/knj/web.rb +932 -0
  199. data/lib/knj/webscripts/image.rhtml +82 -0
  200. data/lib/knj/win.rb +4 -0
  201. data/lib/knj/win_registry.rb +60 -0
  202. data/lib/knj/win_tightvnc.rb +127 -0
  203. data/lib/knj/x11vnc.rb +48 -0
  204. data/lib/knj/youtube.rb +38 -0
  205. data/lib/knjrbfw.rb +4 -0
  206. data/spec/knjrbfw_spec.rb +269 -0
  207. data/spec/spec_helper.rb +12 -0
  208. metadata +336 -0
@@ -0,0 +1,438 @@
1
+ class Knj::Db
2
+ autoload :Dbtime, "#{File.dirname(__FILE__)}/dbtime.rb"
3
+ attr_reader :opts, :conn, :conns, :int_types
4
+
5
+ def initialize(opts)
6
+ self.setOpts(opts) if opts != nil
7
+
8
+ @int_types = ["int", "bigint", "tinyint", "smallint", "mediumint"]
9
+
10
+ if !@opts[:threadsafe]
11
+ @mutex = Mutex.new
12
+ end
13
+ end
14
+
15
+ def col_table
16
+ return "`"
17
+ end
18
+
19
+ def args
20
+ return @opts
21
+ end
22
+
23
+ def setOpts(arr_opts)
24
+ @opts = {}
25
+ arr_opts.each do |key, val|
26
+ @opts[key.to_sym] = val
27
+ end
28
+
29
+ if @opts[:type] == "sqlite3" and RUBY_PLATFORM == "java"
30
+ @opts[:type] = "java_sqlite3"
31
+ elsif @opts[:type] == "mysql" and RUBY_PLATFORM == "java"
32
+ @opts[:subtype] = "java"
33
+ elsif @opts[:type] == "sqlite3" and RUBY_PLATFORM.index("mswin32") != nil
34
+ @opts[:type] = "sqlite3_ironruby"
35
+ end
36
+
37
+ self.connect
38
+ end
39
+
40
+ def connect
41
+ if @opts[:threadsafe]
42
+ @conns = Knj::Threadhandler.new
43
+
44
+ @conns.on_spawn_new do
45
+ self.spawn
46
+ end
47
+
48
+ @conns.on_inactive do |data|
49
+ data[:obj].close
50
+ end
51
+
52
+ @conns.on_activate do |data|
53
+ data[:obj].reconnect
54
+ end
55
+ else
56
+ @conn = self.spawn
57
+ end
58
+ end
59
+
60
+ def spawn
61
+ raise "No type given." if !@opts[:type]
62
+
63
+ fpaths = [
64
+ "drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}.rb",
65
+ "libknjdb_" + @opts[:type] + ".rb"
66
+ ]
67
+ fpaths.each do |fpath|
68
+ rpath = "#{File.dirname(__FILE__)}/#{fpath}"
69
+
70
+ if (!@opts.has_key?(:require) or @opts[:require]) and File.exists?(rpath)
71
+ require rpath
72
+ break
73
+ end
74
+ end
75
+
76
+ return Kernel.const_get("KnjDB_" + @opts[:type]).new(self)
77
+ end
78
+
79
+ def get_and_register_thread
80
+ raise "KnjDB-object is not in threadding mode." if !@conns
81
+
82
+ db = @conns.get_and_lock
83
+ tid = self.__id__
84
+ Thread.current[:knjdb] = {} if !Thread.current[:knjdb]
85
+ Thread.current[:knjdb][tid] = db
86
+ end
87
+
88
+ def free_thread
89
+ tid = self.__id__
90
+
91
+ if Thread.current[:knjdb] and Thread.current[:knjdb].has_key?(tid)
92
+ db = Thread.current[:knjdb][tid]
93
+ Thread.current[:knjdb].delete(tid)
94
+ @conns.free(db) if @conns
95
+ end
96
+ end
97
+
98
+ def close
99
+ @conn.close if @conn
100
+ @conns.destroy if @conns
101
+
102
+ @conn = nil
103
+ @conns = nil
104
+ end
105
+
106
+ def clone_conn
107
+ return Knj::Db.new(@opts)
108
+ end
109
+
110
+ def copy_to(db, args = {})
111
+ data["tables"].each do |table|
112
+ table_args = nil
113
+ table_args = args["tables"][table["name"].to_s] if args and args["tables"] and args["tables"][table["name"].to_s]
114
+ next if table_args and table_args["skip"]
115
+ table.delete("indexes") if table.has_key?("indexes") and args["skip_indexes"]
116
+ db.tables.create(table["name"], table)
117
+
118
+ limit_from = 0
119
+ limit_incr = 1000
120
+
121
+ loop do
122
+ ins_arr = []
123
+ q_rows = self.select(table["name"], {}, {"limit_from" => limit_from, "limit_to" => limit_incr})
124
+ while d_rows = q_rows.fetch
125
+ col_args = nil
126
+
127
+ if table_args and table_args["columns"]
128
+ d_rows.each do |col_name, col_data|
129
+ col_args = table_args["columns"][col_name.to_s] if table_args and table_args["columns"]
130
+ d_rows[col_name] = "" if col_args and col_args["empty"]
131
+ end
132
+ end
133
+
134
+ ins_arr << d_rows
135
+ end
136
+
137
+ break if ins_arr.empty?
138
+
139
+ db.insert_multi(table["name"], ins_arr)
140
+ limit_from += limit_incr
141
+ end
142
+ end
143
+ end
144
+
145
+ def data
146
+ tables_ret = []
147
+ tables.list.each do |name, table|
148
+ tables_ret << table.data
149
+ end
150
+
151
+ return {
152
+ "tables" => tables_ret
153
+ }
154
+ end
155
+
156
+ def insert(tablename, arr_insert, args = {})
157
+ sql = ""
158
+
159
+ conn_exec do |driver|
160
+ sql += "INSERT INTO #{driver.escape_table}#{tablename.to_s}#{driver.escape_table} ("
161
+
162
+ first = true
163
+ arr_insert.each do |key, value|
164
+ if first
165
+ first = false
166
+ else
167
+ sql += ", "
168
+ end
169
+
170
+ sql += "#{driver.escape_col}#{key.to_s}#{driver.escape_col}"
171
+ end
172
+
173
+ sql += ") VALUES ("
174
+
175
+ first = true
176
+ arr_insert.each do |key, value|
177
+ if first
178
+ first = false
179
+ else
180
+ sql += ", "
181
+ end
182
+
183
+ sql += "#{driver.escape_val}#{driver.escape(value.to_s)}#{driver.escape_val}"
184
+ end
185
+
186
+ sql += ")"
187
+
188
+ driver.query(sql)
189
+ return driver.lastID if args[:return_id]
190
+ end
191
+ end
192
+
193
+ def insert_multi(tablename, arr_hashes)
194
+ conn_exec do |driver|
195
+ if driver.respond_to?(:insert_multi)
196
+ return false if arr_hashes.empty?
197
+ driver.insert_multi(tablename, arr_hashes)
198
+ else
199
+ arr_hashes.each do |hash|
200
+ self.insert(tablename, hash)
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ def update(tablename, arr_update, arr_terms = {})
207
+ return false if arr_update.empty?
208
+
209
+ conn_exec do |driver|
210
+ sql = ""
211
+ sql += "UPDATE #{driver.escape_col}#{tablename.to_s}#{driver.escape_col} SET "
212
+
213
+ first = true
214
+ arr_update.each do |key, value|
215
+ if first
216
+ first = false
217
+ else
218
+ sql += ", "
219
+ end
220
+
221
+ sql += "#{driver.escape_col}#{key.to_s}#{driver.escape_col} = "
222
+ sql += "#{driver.escape_val}#{driver.escape(value.to_s)}#{driver.escape_val}"
223
+ end
224
+
225
+ if arr_terms and arr_terms.length > 0
226
+ sql += " WHERE #{self.makeWhere(arr_terms, driver)}"
227
+ end
228
+
229
+ driver.query(sql)
230
+ end
231
+ end
232
+
233
+ def select(tablename, arr_terms = nil, args = nil)
234
+ sql = ""
235
+
236
+ conn_exec do |driver|
237
+ sql += "SELECT * FROM #{driver.escape_table}#{tablename.to_s}#{driver.escape_table}"
238
+
239
+ if arr_terms != nil and !arr_terms.empty?
240
+ sql += " WHERE #{self.makeWhere(arr_terms, driver)}"
241
+ end
242
+
243
+ if args != nil
244
+ if args["orderby"]
245
+ sql += " ORDER BY "
246
+ sql += args["orderby"]
247
+ end
248
+
249
+ if args["limit"]
250
+ sql += " LIMIT " + args["limit"].to_s
251
+ end
252
+
253
+ if args["limit_from"] and args["limit_to"]
254
+ raise "'limit_from' was not numeric: '#{args["limit_from"]}'." if !Knj::Php.is_numeric(args["limit_from"])
255
+ raise "'limit_to' was not numeric: '#{args["limit_to"]}'." if !Knj::Php.is_numeric(args["limit_to"])
256
+
257
+ sql += " LIMIT #{args["limit_from"]}, #{args["limit_to"]}"
258
+ end
259
+ end
260
+
261
+ return driver.query(sql)
262
+ end
263
+
264
+ raise "Something went wrong."
265
+ end
266
+
267
+ def selectsingle(tablename, arr_terms = nil, args = {})
268
+ args["limit"] = 1
269
+ return self.select(tablename, arr_terms, args).fetch
270
+ end
271
+
272
+ def single(tablename, arr_terms = nil, args = {})
273
+ args["limit"] = 1
274
+ return self.select(tablename, arr_terms, args).fetch
275
+ end
276
+
277
+ def delete(tablename, arr_terms)
278
+ sql = ""
279
+
280
+ conn_exec do |driver|
281
+ sql += "DELETE FROM #{driver.escape_table}#{tablename.to_s}#{driver.escape_table}"
282
+
283
+ if arr_terms != nil
284
+ sql += " WHERE #{self.makeWhere(arr_terms, driver)}"
285
+ end
286
+
287
+ driver.query(sql)
288
+ end
289
+ end
290
+
291
+ def makeWhere(arr_terms, driver)
292
+ sql = ""
293
+
294
+ first = true
295
+ arr_terms.each do |key, value|
296
+ if first
297
+ first = false
298
+ else
299
+ sql += " AND "
300
+ end
301
+
302
+ sql += "#{driver.escape_col}#{key.to_s}#{driver.escape_col} = #{driver.escape_val}#{driver.escape(value)}#{driver.escape_val}"
303
+ end
304
+
305
+ return sql
306
+ end
307
+
308
+ def conn_exec
309
+ if Thread.current[:knjdb]
310
+ tid = self.__id__
311
+
312
+ if Thread.current[:knjdb].has_key?(tid)
313
+ yield(Thread.current[:knjdb][tid])
314
+ return nil
315
+ end
316
+ end
317
+
318
+ if @conns
319
+ conn = @conns.get_and_lock
320
+
321
+ begin
322
+ yield(conn)
323
+ return nil
324
+ ensure
325
+ @conns.free(conn)
326
+ end
327
+ elsif @conn
328
+ @mutex.synchronize do
329
+ yield(@conn)
330
+ return nil
331
+ end
332
+ end
333
+
334
+ raise "Could not figure out how to find a driver to use?"
335
+ end
336
+
337
+ def query(string)
338
+ conn_exec do |driver|
339
+ return driver.query(string)
340
+ end
341
+ end
342
+
343
+ def q(str)
344
+ ret = self.query(str)
345
+
346
+ if block_given?
347
+ while data = ret.fetch
348
+ yield data
349
+ end
350
+ end
351
+
352
+ return ret
353
+ end
354
+
355
+ def lastID
356
+ conn_exec do |driver|
357
+ return driver.lastID
358
+ end
359
+ end
360
+
361
+ alias :last_id :lastID
362
+
363
+ def escape(string)
364
+ conn_exec do |driver|
365
+ return driver.escape(string)
366
+ end
367
+ end
368
+
369
+ alias :esc :escape
370
+
371
+ def esc_col(str)
372
+ conn_exec do |driver|
373
+ return driver.esc_col(str)
374
+ end
375
+ end
376
+
377
+ def esc_table(str)
378
+ conn_exec do |driver|
379
+ return driver.esc_table(str)
380
+ end
381
+ end
382
+
383
+ def date_out(date_obj)
384
+ return Knj::Datet.in(date_obj).dbstr
385
+ end
386
+
387
+ def date_in(date_obj)
388
+ return Knj::Datet.in(date_obj)
389
+ end
390
+
391
+ def tables
392
+ conn_exec do |driver|
393
+ if !driver.tables
394
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_tables" if (!@opts.has_key?(:require) or @opts[:require])
395
+ driver.tables = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Tables).new(
396
+ :driver => driver,
397
+ :db => self
398
+ )
399
+ end
400
+
401
+ return driver.tables
402
+ end
403
+ end
404
+
405
+ def cols
406
+ if !@cols
407
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_columns" if (!@opts.has_key?(:require) or @opts[:require])
408
+ @cols = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Columns).new(
409
+ :driver => @conn,
410
+ :db => self
411
+ )
412
+ end
413
+
414
+ return @cols
415
+ end
416
+
417
+ def indexes
418
+ if !@indexes
419
+ require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_indexes" if (!@opts.has_key?(:require) or @opts[:require])
420
+ @indexes = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Indexes).new(
421
+ :driver => @conn,
422
+ :db => self
423
+ )
424
+ end
425
+
426
+ return @indexes
427
+ end
428
+
429
+ def method_missing(method_name, *args)
430
+ conn_exec do |driver|
431
+ if driver.respond_to?(method_name.to_sym)
432
+ return driver.send(method_name, *args)
433
+ end
434
+ end
435
+
436
+ raise "Method not found: #{method_name}"
437
+ end
438
+ end
@@ -0,0 +1,83 @@
1
+ class KnjDB_java_sqlite3
2
+ def escape_table
3
+ return "`"
4
+ end
5
+
6
+ def escape_col
7
+ return "`"
8
+ end
9
+
10
+ def escape_val
11
+ return "'"
12
+ end
13
+
14
+ def initialize(knjdb_ob)
15
+ @knjdb = knjdb_ob
16
+
17
+ if @knjdb.opts[:sqlite_driver]
18
+ require @knjdb.opts[:sqlite_driver]
19
+ else
20
+ require File.dirname(__FILE__) + "/sqlitejdbc-v056.jar"
21
+ end
22
+
23
+ require "java"
24
+ import "org.sqlite.JDBC"
25
+ @conn = java.sql.DriverManager::getConnection("jdbc:sqlite:" + @knjdb.opts[:path])
26
+ @stat = @conn.createStatement
27
+ end
28
+
29
+ def query(string)
30
+ begin
31
+ return KnjDB_java_sqlite3_result.new(@stat.executeQuery(string))
32
+ rescue java.sql.SQLException => e
33
+ if e.message == "java.sql.SQLException: query does not return ResultSet"
34
+ #ignore it.
35
+ else
36
+ raise e
37
+ end
38
+ end
39
+ end
40
+
41
+ def fetch(result)
42
+ return result.fetch
43
+ end
44
+
45
+ def escape(string)
46
+ if (!string)
47
+ return ""
48
+ end
49
+
50
+ string = string.gsub("'", "\\'")
51
+ return string
52
+ end
53
+
54
+ def lastID
55
+ return @conn.last_insert_row_id
56
+ end
57
+ end
58
+
59
+ class KnjDB_java_sqlite3_result
60
+ def initialize(rs)
61
+ @rs = rs
62
+ @index = 0
63
+
64
+ if rs
65
+ @metadata = rs.getMetaData
66
+ @columns_count = @metadata.getColumnCount
67
+ end
68
+ end
69
+
70
+ def fetch
71
+ if !@rs.next
72
+ return false
73
+ end
74
+
75
+ tha_return = {}
76
+ for i in (1..@columns_count)
77
+ col_name = @metadata.getColumnName(i)
78
+ tha_return.store(col_name, @rs.getString(i))
79
+ end
80
+
81
+ return tha_return
82
+ end
83
+ end
@@ -0,0 +1,149 @@
1
+ class Knj::Db_row
2
+ attr_reader :args, :data
3
+
4
+ def is_knj?; return true; end
5
+
6
+ def initialize(args)
7
+ @args = {}
8
+ args.each do |key, value|
9
+ @args[key.to_sym] = value
10
+ end
11
+
12
+ @args[:db] = $db if !@args[:db] and $db and $db.class.to_s == "Knj::Db"
13
+ @args[:objects] = $objects if !@args[:objects] and $objects and $objects.is_a?(Knj::Objects)
14
+ @args[:col_id] = :id if !@args[:col_id]
15
+ raise "No table given." if !@args[:table]
16
+
17
+ if @args[:data] and (@args[:data].is_a?(Integer) or @args[:data].is_a?(Fixnum) or @args[:data].is_a?(String))
18
+ @data = {@args[:col_id].to_sym => @args[:data].to_s}
19
+ self.reload
20
+ elsif @args[:data] and @args[:data].is_a?(Hash)
21
+ @data = {}
22
+ @args[:data].each do |key, value|
23
+ @data[key.to_sym] = value
24
+ end
25
+ elsif @args[:id]
26
+ @data = {}
27
+ @data[@args[:col_id].to_sym] = @args[:id]
28
+ self.reload
29
+ else
30
+ raise Knj::Errors::InvalidData.new("Invalid data: #{@args[:data].to_s} (#{@args[:data].class.to_s})")
31
+ end
32
+ end
33
+
34
+ def db
35
+ if !@args[:force_selfdb]
36
+ curthread = Thread.current
37
+ if curthread.is_a?(Knj::Thread) and curthread[:knjappserver] and curthread[:knjappserver][:db]
38
+ return curthread[:knjappserver][:db]
39
+ end
40
+ end
41
+
42
+ return @args[:db]
43
+ end
44
+
45
+ def ob
46
+ return @args[:objects] if @args.has_key?(:objects)
47
+ return $ob if $ob and $ob.is_a?(Knj::Objects)
48
+ return false
49
+ end
50
+
51
+ alias :objects :ob
52
+
53
+ def reload
54
+ last_id = self.id
55
+ data = self.db.single(@args[:table], {@args[:col_id] => self.id})
56
+ if !data
57
+ raise Knj::Errors::NotFound.new("Could not find any data for the object with ID: '#{last_id}' in the table '#{@args[:table].to_s}'.")
58
+ end
59
+
60
+ @data = {}
61
+ data.each do |key, value|
62
+ @data[key.to_sym] = value
63
+ end
64
+ end
65
+
66
+ def update(newdata)
67
+ self.db.update(@args[:table], newdata, {@args[:col_id] => self.id})
68
+ self.reload
69
+
70
+ if self.ob
71
+ self.ob.call("object" => self, "signal" => "update")
72
+ end
73
+ end
74
+
75
+ def delete
76
+ self.db.delete(@args[:table], {@args[:col_id] => self.id})
77
+ self.destroy
78
+ end
79
+
80
+ def destroy
81
+ @args = nil
82
+ @data = nil
83
+ end
84
+
85
+ def has_key?(key)
86
+ return @data.has_key?(key.to_sym)
87
+ end
88
+
89
+ def [](key)
90
+ raise "No valid key given." if !key
91
+ raise "No data was loaded on the object? Maybe you are trying to call a deleted object?" if !@data
92
+
93
+ if @data.has_key?(key)
94
+ return @data[key]
95
+ elsif @data.has_key?(key.to_sym)
96
+ return @data[key.to_sym]
97
+ elsif @data.has_key?(key.to_s)
98
+ return @data[key.to_s]
99
+ end
100
+
101
+ raise "No such key: #{key.to_s}."
102
+ end
103
+
104
+ def []=(key, value)
105
+ self.update(key.to_sym => value)
106
+ self.reload
107
+ end
108
+
109
+ def id
110
+ return @data[@args[:col_id]]
111
+ end
112
+
113
+ def title
114
+ if @args[:col_title]
115
+ return @data[@args[:col_title].to_sym]
116
+ end
117
+
118
+ if @data.has_key?(:title)
119
+ return @data[:title]
120
+ elsif @data.has_key?(:name)
121
+ return @data[:name]
122
+ end
123
+
124
+ raise "'col_title' has not been set for the class: '#{self.class.to_s}'."
125
+ end
126
+
127
+ alias :name :title
128
+
129
+ def each(&args)
130
+ return @data.each(&args)
131
+ end
132
+
133
+ def esc(str)
134
+ return self.db.escape(str)
135
+ end
136
+
137
+ def method_missing(*args)
138
+ func_name = args[0].to_s
139
+ if match = func_name.match(/^(\S+)\?$/) and @data.has_key?(match[1].to_sym)
140
+ if @data[match[1].to_sym] == "1" or @data[match[1].to_sym] == "yes"
141
+ return true
142
+ elsif @data[match[1].to_sym] == "0" or @data[match[1].to_sym] == "no"
143
+ return false
144
+ end
145
+ end
146
+
147
+ raise sprintf("No such method: %s", func_name)
148
+ end
149
+ end