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,327 @@
1
+ class KnjDB_mysql
2
+ attr_reader :knjdb, :conn, :escape_table, :escape_col, :escape_val, :esc_table
3
+ attr_accessor :tables, :cols, :indexes
4
+
5
+ def initialize(knjdb_ob)
6
+ @knjdb = knjdb_ob
7
+ @encoding = @knjdb.opts[:encoding]
8
+ @escape_table = "`"
9
+ @escape_col = "`"
10
+ @escape_val = "'"
11
+ @esc_table = "`"
12
+ @esc_col = "`"
13
+ @mutex = Mutex.new
14
+
15
+ if @knjdb.opts.has_key?(:port)
16
+ @port = @knjdb.opts[:port].to_i
17
+ else
18
+ @port = 3306
19
+ end
20
+
21
+ @subtype = @knjdb.opts[:subtype]
22
+ reconnect
23
+ end
24
+
25
+ def reconnect
26
+ if !@subtype or @subtype == "mysql"
27
+ @conn = Mysql.real_connect(@knjdb.opts[:host], @knjdb.opts[:user], @knjdb.opts[:pass], @knjdb.opts[:db], @port)
28
+ elsif @subtype == "mysql2"
29
+ require "rubygems"
30
+ require "mysql2"
31
+
32
+ args = {
33
+ :host => @knjdb.opts[:host],
34
+ :username => @knjdb.opts[:user],
35
+ :password => @knjdb.opts[:pass],
36
+ :database => @knjdb.opts[:db],
37
+ :port => @port,
38
+ :symbolize_keys => true
39
+ }
40
+
41
+ @query_args = @knjdb.opts[:query_args]
42
+ @query_args = {} if !@query_args
43
+
44
+ pos_args = [:as, :async, :cast_booleans, :database_timezone, :application_timezone, :cache_rows, :connect_flags, :cast]
45
+ pos_args.each do |key|
46
+ args[key] = @knjdb.opts[key] if @knjdb.opts.has_key?(key)
47
+ end
48
+
49
+ @conn = Mysql2::Client.new(args)
50
+ elsif @subtype == "java"
51
+ if !@jdbc_loaded
52
+ require "java"
53
+
54
+ if File.exists?("/usr/share/java/mysql-connector-java.jar")
55
+ require "/usr/share/java/mysql-connector-java.jar"
56
+ else
57
+ require File.dirname(__FILE__) + "/mysql-connector-java-5.1.13-bin.jar"
58
+ end
59
+
60
+ import "com.mysql.jdbc.Driver"
61
+ @jdbc_loaded = true
62
+ end
63
+
64
+ @conn = java.sql::DriverManager.getConnection("jdbc:mysql://#{@knjdb.opts[:host]}:#{@port}/#{@knjdb.opts[:db]}?user=#{@knjdb.opts[:user]}&password=#{@knjdb.opts[:pass]}&populateInsertRowWithDefaultValues=true&zeroDateTimeBehavior=round")
65
+ query("SET SQL_MODE = ''")
66
+ else
67
+ raise "Unknown subtype: #{@subtype}"
68
+ end
69
+
70
+ query_conn(@conn, "SET NAMES '#{esc(@encoding)}'") if @encoding
71
+ end
72
+
73
+ def query_conn(conn, str)
74
+ if @subtype == "java"
75
+ stmt = conn.createStatement
76
+
77
+ if str.match(/insert\s+into\s+/i) or str.match(/update\s+/i) or str.match(/^\s*delete\s+/i) or str.match(/^\s*create\s*/i)
78
+ return stmt.execute(str)
79
+ else
80
+ return stmt.executeQuery(str)
81
+ end
82
+ elsif conn.respond_to?(:query)
83
+ return conn.query(str)
84
+ else
85
+ raise "Could not figure out the way to execute the query on #{conn.class.name}."
86
+ end
87
+ end
88
+
89
+ def query(string)
90
+ string = string.to_s
91
+ string = string.force_encoding("UTF-8") if @encoding == "utf8" and string.respond_to?(:force_encoding)
92
+
93
+ @mutex.synchronize do
94
+ if !@subtype or @subtype == "mysql"
95
+ begin
96
+ return KnjDB_mysql_result.new(self, @conn.query(string))
97
+ rescue Mysql::Error => e
98
+ if e.message == "MySQL server has gone away"
99
+ reconnect
100
+ retry
101
+ else
102
+ raise e
103
+ end
104
+ end
105
+ elsif @subtype == "mysql2"
106
+ begin
107
+ return KnjDB_mysql2_result.new(@conn.query(string, @query_args))
108
+ rescue Mysql2::Error => e
109
+ if e.message == "MySQL server has gone away" or e.message == "closed MySQL connection"
110
+ reconnect
111
+ retry
112
+ elsif e.message == "This connection is still waiting for a result, try again once you have the result"
113
+ sleep 0.1
114
+ retry
115
+ else
116
+ print string
117
+ raise e
118
+ end
119
+ end
120
+ elsif @subtype == "java"
121
+ begin
122
+ return KnjDB_java_mysql_result.new(@knjdb, query_conn(@conn, string))
123
+ rescue => e
124
+ if e.to_s.index("No operations allowed after connection closed") != nil
125
+ reconnect
126
+ retry
127
+ end
128
+
129
+ raise e
130
+ end
131
+ else
132
+ raise "Unknown subtype: '#{@subtype}'."
133
+ end
134
+ end
135
+ end
136
+
137
+ def escape(string)
138
+ if !@subtype or @subtype == "mysql"
139
+ return @conn.escape_string(string.to_s)
140
+ elsif @subtype == "mysql2"
141
+ return @conn.escape(string.to_s)
142
+ elsif @subtype == "java"
143
+ #This is copied from the Ruby/MySQL framework at: http://www.tmtm.org/en/ruby/mysql/
144
+ return string.to_s.gsub(/([\0\n\r\032\'\"\\])/) do
145
+ case $1
146
+ when "\0" then "\\0"
147
+ when "\n" then "\\n"
148
+ when "\r" then "\\r"
149
+ when "\032" then "\\Z"
150
+ else "\\" + $1
151
+ end
152
+ end
153
+ else
154
+ raise "Unknown subtype: '#{@subtype}'."
155
+ end
156
+ end
157
+
158
+ def esc_col(string)
159
+ string = string.to_s
160
+ raise "Invalid column-string: #{string}" if string.index(@escape_col) != nil
161
+ return string
162
+ end
163
+
164
+ alias :esc_table :esc_col
165
+ alias :esc :escape
166
+
167
+ def lastID
168
+ if !@subtype or @subtype == "mysql"
169
+ @mutex.synchronize do
170
+ return @conn.insert_id
171
+ end
172
+ elsif @subtype == "mysql2"
173
+ @mutex.synchronize do
174
+ return @conn.last_id
175
+ end
176
+ else
177
+ data = self.query("SELECT LAST_INSERT_ID() AS id").fetch
178
+ return data[:id] if data.has_key?(:id)
179
+ raise "Could not figure out last inserted ID."
180
+ end
181
+ end
182
+
183
+ def close
184
+ @mutex.synchronize do
185
+ @conn.close
186
+ end
187
+ end
188
+
189
+ def destroy
190
+ @conn = nil
191
+ @knjdb = nil
192
+ @mutex = nil
193
+ @subtype = nil
194
+ @encoding = nil
195
+ @query_args = nil
196
+ @port = nil
197
+ end
198
+
199
+ def insert_multi(tablename, arr_hashes)
200
+ sql = "INSERT INTO `#{esc_table(tablename)}` ("
201
+
202
+ first = true
203
+ arr_hashes[0].keys.each do |col_name|
204
+ sql += "," if !first
205
+ first = false if first
206
+ sql += "`#{esc_col(col_name)}`"
207
+ end
208
+
209
+ sql += ") VALUES ("
210
+
211
+ first = true
212
+ arr_hashes.each do |hash|
213
+ sql += "),(" if !first
214
+ first = false if first
215
+
216
+ first_key = true
217
+ hash.each do |key, val|
218
+ sql += "," if !first_key
219
+ first_key = false if first_key
220
+ sql += "'#{esc(val)}'"
221
+ end
222
+ end
223
+
224
+ sql += ")"
225
+
226
+ query(sql)
227
+ end
228
+ end
229
+
230
+ class KnjDB_mysql_result
231
+ def initialize(driver, result)
232
+ @driver = driver
233
+ @result = result
234
+ @mutex = Mutex.new
235
+
236
+ if @result
237
+ @keys = []
238
+ keys = @result.fetch_fields
239
+ keys.each do |key|
240
+ @keys << key.name.to_sym
241
+ end
242
+ end
243
+ end
244
+
245
+ def fetch
246
+ return fetch_hash_symbols if @driver.knjdb.opts[:return_keys] == "symbols"
247
+ return fetch_hash_strings
248
+ end
249
+
250
+ def fetch_hash_strings
251
+ @mutex.synchronize do
252
+ return @result.fetch_hash
253
+ end
254
+ end
255
+
256
+ def fetch_hash_symbols
257
+ @mutex.synchronize do
258
+ fetched = @result.fetch_row
259
+ return false if !fetched
260
+
261
+ ret = {}
262
+ count = 0
263
+ @keys.each do |key|
264
+ ret[key] = fetched[count]
265
+ count += 1
266
+ end
267
+
268
+ return ret
269
+ end
270
+ end
271
+ end
272
+
273
+ class KnjDB_mysql2_result
274
+ def initialize(result)
275
+ @result = result.to_a
276
+ @count = 0
277
+ @mutex = Mutex.new
278
+ end
279
+
280
+ def fetch
281
+ @mutex.synchronize do
282
+ ret = @result[@count]
283
+ return false if !ret
284
+
285
+ realret = {}
286
+ ret.each do |key, val|
287
+ realret[key.to_sym] = val
288
+ end
289
+
290
+ @count += 1
291
+ return realret
292
+ end
293
+ end
294
+ end
295
+
296
+ class KnjDB_java_mysql_result
297
+ def initialize(knjdb, result)
298
+ @knjdb = knjdb
299
+ @result = result
300
+ @mutex = Mutex.new
301
+ end
302
+
303
+ def read_meta
304
+ @result.before_first
305
+ meta = @result.meta_data
306
+
307
+ @keys = []
308
+ 0.upto(meta.column_count - 1) do |count|
309
+ @keys << meta.column_name(count + 1).to_sym
310
+ end
311
+ end
312
+
313
+ def fetch
314
+ @mutex.synchronize do
315
+ read_meta if !@keys
316
+ status = @result.next
317
+ return false if !status
318
+
319
+ ret = {}
320
+ 0.upto(@keys.length - 1) do |count|
321
+ ret[@keys[count].to_sym] = @result.string(count + 1)
322
+ end
323
+
324
+ return ret
325
+ end
326
+ end
327
+ end
@@ -0,0 +1,130 @@
1
+ class KnjDB_mysql::Columns
2
+ attr_reader :db, :driver
3
+
4
+ def initialize(args)
5
+ @args = args
6
+ @db = @args[:db]
7
+ @driver = @args[:driver]
8
+ end
9
+
10
+ def data_sql(data)
11
+ raise "No type given." if !data["type"]
12
+
13
+ data["maxlength"] = 255 if data["type"] == "varchar" and !data.has_key?("maxlength")
14
+
15
+ sql = "`#{data["name"]}` #{data["type"]}"
16
+ sql += "(#{data["maxlength"]})" if data["maxlength"]
17
+ sql += " PRIMARY KEY" if data["primarykey"]
18
+ sql += " AUTO_INCREMENT" if data["autoincr"]
19
+ sql += " NOT NULL" if !data["null"]
20
+
21
+ if data.has_key?("default_func")
22
+ sql += " DEFAULT #{data["default_func"]}"
23
+ elsif data.has_key?("default") and data["default"] != false
24
+ sql += " DEFAULT '#{@db.escape(data["default"])}'"
25
+ end
26
+
27
+ sql += " COMMENT '#{@db.escape(data["comment"])}'" if data.has_key?("comment")
28
+ sql += " AFTER `#{@db.esc_col(data["after"])}`" if data["after"] and !data["first"]
29
+ sql += " FIRST" if data["first"]
30
+
31
+ return sql
32
+ end
33
+ end
34
+
35
+ class KnjDB_mysql::Columns::Column
36
+ attr_reader :args
37
+
38
+ def initialize(args)
39
+ @args = args
40
+ @db = @args[:db]
41
+ end
42
+
43
+ def name
44
+ return @args[:data][:Field]
45
+ end
46
+
47
+ def data
48
+ return {
49
+ "type" => self.type,
50
+ "name" => self.name,
51
+ "null" => self.null?,
52
+ "maxlength" => self.maxlength,
53
+ "default" => self.default,
54
+ "primarykey" => self.primarykey?,
55
+ "autoincr" => self.autoincr?
56
+ }
57
+ end
58
+
59
+ def type
60
+ if !@type
61
+ if match = @args[:data][:Type].match(/^([A-z]+)$/)
62
+ @maxlength = false
63
+ @type = match[0]
64
+ elsif match = @args[:data][:Type].match(/^decimal\((\d+),(\d+)\)$/)
65
+ @maxlength = "#{match[1]},#{match[2]}"
66
+ @type = "decimal"
67
+ elsif match = @args[:data][:Type].match(/^enum\((.+)\)$/)
68
+ @maxlength = match[1]
69
+ @type = "enum"
70
+ elsif match = @args[:data][:Type].match(/^(.+)\((\d+)\)$/)
71
+ @maxlength = match[2]
72
+ @type = match[1]
73
+ end
74
+ end
75
+
76
+ return @type
77
+ end
78
+
79
+ def null?
80
+ return false if @args[:data][:Null] == "NO"
81
+ return true
82
+ end
83
+
84
+ def maxlength
85
+ self.type
86
+ return @maxlength if @maxlength
87
+ return false
88
+ end
89
+
90
+ def default
91
+ return false if !@args[:data][:Default]
92
+ return @args[:data][:Default]
93
+ end
94
+
95
+ def primarykey?
96
+ return false if @args[:data][:pk].to_i == 0
97
+ return true
98
+ end
99
+
100
+ def autoincr?
101
+ return true if @args[:data][:Extra].index("auto_increment") != nil
102
+ return false
103
+ end
104
+
105
+ def comment
106
+ return @args[:data][:Comment]
107
+ end
108
+
109
+ def drop
110
+ @args[:db].query("ALTER TABLE `#{@args[:table].name}` DROP COLUMN `#{self.name}`")
111
+ end
112
+
113
+ def change(data)
114
+ esc_col = @args[:driver].escape_col
115
+ col_escaped = "#{esc_col}#{@db.esc_col(self.name)}#{esc_col}"
116
+ table_escape = "#{@args[:driver].escape_table}#{@args[:driver].esc_table(@args[:table].name)}#{@args[:driver].escape_table}"
117
+ newdata = data.clone
118
+
119
+ newdata["name"] = self.name if !newdata.has_key?("name")
120
+ newdata["type"] = self.type if !newdata.has_key?("type")
121
+ newdata["maxlength"] = self.maxlength if !newdata.has_key?("maxlength") and self.maxlength
122
+ newdata["null"] = self.null? if !newdata.has_key?("null")
123
+ newdata["default"] = self.default if !newdata.has_key?("default")
124
+ newdata.delete("primarykey") if newdata.has_key?("primarykey")
125
+
126
+ type_s = newdata["type"].to_s
127
+ @db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.cols.data_sql(newdata)}")
128
+ @args[:table].list = nil if data.has_key?("name") and data["name"] != self.name
129
+ end
130
+ end
@@ -0,0 +1,30 @@
1
+ class KnjDB_mysql::Indexes
2
+ def initialize(args)
3
+ @args = args
4
+ end
5
+ end
6
+
7
+ class KnjDB_mysql::Indexes::Index
8
+ attr_reader :columns
9
+
10
+ def initialize(args)
11
+ @args = args
12
+ @columns = []
13
+ end
14
+
15
+ def name
16
+ return @args[:data][:Key_name]
17
+ end
18
+
19
+ def drop
20
+ sql = "DROP INDEX `#{self.name}` ON `#{@args[:table].name}`"
21
+ @args[:db].query(sql)
22
+ end
23
+
24
+ def data
25
+ return {
26
+ "name" => name,
27
+ "columns" => @columns
28
+ }
29
+ end
30
+ end