knjrbfw 0.0.23 → 0.0.24

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 (48) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +7 -4
  3. data/lib/knj/autoload.rb +1 -61
  4. data/lib/knj/datarow.rb +7 -10
  5. data/lib/knj/datarow_custom.rb +12 -2
  6. data/lib/knj/datet.rb +107 -0
  7. data/lib/knj/eruby.rb +21 -12
  8. data/lib/knj/gettext_threadded.rb +1 -1
  9. data/lib/knj/http2.rb +27 -9
  10. data/lib/knj/image.rb +10 -0
  11. data/lib/knj/includes/require_info.rb +3 -3
  12. data/lib/knj/knj.rb +16 -9
  13. data/lib/knj/knj_controller.rb +10 -1
  14. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +26 -9
  15. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -8
  16. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +5 -0
  17. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +83 -26
  18. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +3 -3
  19. data/lib/knj/knjdb/libknjdb.rb +19 -20
  20. data/lib/knj/knjdb/revision.rb +9 -2
  21. data/lib/knj/kvm.rb +100 -0
  22. data/lib/knj/locale_strings.rb +32 -3
  23. data/lib/knj/locales.rb +1 -4
  24. data/lib/knj/memory_analyzer.rb +335 -0
  25. data/lib/knj/objects/objects_sqlhelper.rb +2 -2
  26. data/lib/knj/objects.rb +44 -11
  27. data/lib/knj/opts.rb +8 -8
  28. data/lib/knj/os.rb +13 -0
  29. data/lib/knj/php.rb +18 -33
  30. data/lib/knj/process.rb +3 -0
  31. data/lib/knj/process_meta.rb +1 -1
  32. data/lib/knj/rhodes/mutex.rb +2 -1
  33. data/lib/knj/rhodes/rhodes.js +5 -1
  34. data/lib/knj/rhodes/rhodes.rb +15 -15
  35. data/lib/knj/rhodes/youtube_embed.erb +12 -0
  36. data/lib/knj/rhodes/youtube_open.erb +45 -0
  37. data/lib/knj/strings.rb +2 -1
  38. data/lib/knj/translations.rb +3 -3
  39. data/lib/knj/unix_proc.rb +15 -4
  40. data/lib/knj/web.rb +17 -247
  41. data/lib/knj/webscripts/image.rhtml +9 -3
  42. data/lib/knj/wref.rb +109 -70
  43. data/spec/datet_spec.rb +30 -0
  44. data/spec/http2_spec.rb +23 -0
  45. data/spec/php_spec.rb +3 -0
  46. metadata +20 -17
  47. data/lib/knj/rhodes/delegate.rb +0 -414
  48. data/lib/knj/rhodes/weakref.rb +0 -80
@@ -71,6 +71,8 @@ class KnjDB_mysql
71
71
  args[key] = @knjdb.opts[key] if @knjdb.opts.key?(key)
72
72
  end
73
73
 
74
+ args[:as] = :array if @opts[:result] == "array"
75
+
74
76
  tries = 0
75
77
  begin
76
78
  tries += 1
@@ -93,7 +95,7 @@ class KnjDB_mysql
93
95
  @jdbc_loaded = true
94
96
  end
95
97
 
96
- @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&characterEncoding=#{@encoding}")
98
+ @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&characterEncoding=#{@encoding}&holdResultsOpenOverStatementClose=true")
97
99
  self.query("SET SQL_MODE = ''")
98
100
  else
99
101
  raise "Unknown subtype: #{@subtype}"
@@ -128,18 +130,25 @@ class KnjDB_mysql
128
130
 
129
131
  return nil
130
132
  else
133
+ id = nil
134
+
131
135
  begin
132
136
  res = stmt.execute_query(str)
133
137
  ret = KnjDB_java_mysql_result.new(@knjdb, @opts, res)
138
+ id = ret.__id__
139
+
140
+ #If ID is being reused we have to free the result.
141
+ self.java_mysql_resultset_killer(id) if @java_rs_data.key?(id)
134
142
 
135
143
  #Save reference to result and statement, so we can close them when they are garbage collected.
136
- @java_rs_data[ret.__id__] = {:res => res, :stmt => stmt}
144
+ @java_rs_data[id] = {:res => res, :stmt => stmt}
137
145
  ObjectSpace.define_finalizer(ret, self.method("java_mysql_resultset_killer"))
138
146
 
139
147
  return ret
140
148
  rescue => e
141
149
  res.close if res
142
150
  stmt.close
151
+ @java_rs_data.delete(id) if ret and id
143
152
  raise e
144
153
  end
145
154
  end
@@ -162,7 +171,7 @@ class KnjDB_mysql
162
171
  end
163
172
  end
164
173
 
165
- print str
174
+ #print str
166
175
  raise e
167
176
  end
168
177
  end
@@ -175,7 +184,7 @@ class KnjDB_mysql
175
184
  @conn.query_with_result = false
176
185
  return KnjDB_mysql_unbuffered_result.new(@conn, @opts, @conn.query(str))
177
186
  when "mysql2"
178
- raise "MySQL2 does not support unbuffered queries yet! Waiting for :stream..."
187
+ return KnjDB_mysql2_result.new(@conn.query(str, @query_args.merge(:stream => true)))
179
188
  when "java"
180
189
  if str.match(/^\s*(delete|update|create|drop|insert\s+into)\s+/i)
181
190
  stmt = @conn.createStatement
@@ -206,7 +215,6 @@ class KnjDB_mysql
206
215
  raise e
207
216
  end
208
217
  end
209
- raise "Not implemented yet."
210
218
  else
211
219
  raise "Unknown subtype: '#{@subtype}'"
212
220
  end
@@ -458,8 +466,13 @@ class KnjDB_mysql2_result
458
466
  end
459
467
  end
460
468
 
461
- def each(&block)
462
- @result.each(&block)
469
+ def each
470
+ @result.each do |res|
471
+ #This sometimes happens when streaming results...
472
+ next if !res
473
+
474
+ yield(res)
475
+ end
463
476
  end
464
477
  end
465
478
 
@@ -491,11 +504,15 @@ class KnjDB_java_mysql_result
491
504
 
492
505
  def fetch
493
506
  return false if !@result
494
-
495
507
  self.read_meta if !@keys
496
508
  status = @result.next
497
509
 
498
- return false if !status
510
+ if !status
511
+ @result = nil
512
+ @keys = nil
513
+ @count = nil
514
+ return false
515
+ end
499
516
 
500
517
  if @as_hash
501
518
  ret = {}
@@ -1,10 +1,9 @@
1
1
  class KnjDB_mysql::Columns
2
- attr_reader :db, :driver
2
+ attr_reader :db
3
3
 
4
4
  def initialize(args)
5
5
  @args = args
6
6
  @db = @args[:db]
7
- @driver = @args[:driver]
8
7
  end
9
8
 
10
9
  def data_sql(data)
@@ -39,12 +38,17 @@ class KnjDB_mysql::Columns::Column
39
38
  @args = args
40
39
  end
41
40
 
41
+ #Used to validate in Knj::Wrap_map.
42
+ def __object_unique_id__
43
+ return @args[:data][:Field]
44
+ end
45
+
42
46
  def name
43
47
  return @args[:data][:Field]
44
48
  end
45
49
 
46
50
  def table
47
- return @args[:db].tables[@args[:table_name]]
51
+ return @db.tables[@args[:table_name]]
48
52
  end
49
53
 
50
54
  def data
@@ -112,13 +116,12 @@ class KnjDB_mysql::Columns::Column
112
116
  end
113
117
 
114
118
  def drop
115
- @args[:db].query("ALTER TABLE `#{@args[:table_name]}` DROP COLUMN `#{self.name}`")
119
+ @db.query("ALTER TABLE `#{@args[:table_name]}` DROP COLUMN `#{self.name}`")
116
120
  end
117
121
 
118
122
  def change(data)
119
- esc_col = @args[:driver].escape_col
120
- col_escaped = "#{esc_col}#{@args[:db].esc_col(self.name)}#{esc_col}"
121
- table_escape = "#{@args[:driver].escape_table}#{@args[:driver].esc_table(self.table.name)}#{@args[:driver].escape_table}"
123
+ col_escaped = "#{@db.enc_col}#{@db.esc_col(self.name)}#{@db.enc_col}"
124
+ table_escape = "#{@db.enc_table}#{@db.esc_table(self.table.name)}#{@db.enc_table}"
122
125
  newdata = data.clone
123
126
 
124
127
  newdata["name"] = self.name if !newdata.key?("name")
@@ -129,6 +132,6 @@ class KnjDB_mysql::Columns::Column
129
132
  newdata.delete("primarykey") if newdata.key?("primarykey")
130
133
 
131
134
  type_s = newdata["type"].to_s
132
- @args[:db].query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@args[:db].cols.data_sql(newdata)}")
135
+ @db.query("ALTER TABLE #{table_escape} CHANGE #{col_escaped} #{@db.cols.data_sql(newdata)}")
133
136
  end
134
137
  end
@@ -12,6 +12,11 @@ class KnjDB_mysql::Indexes::Index
12
12
  @columns = []
13
13
  end
14
14
 
15
+ #Used to validate in Knj::Wrap_map.
16
+ def __object_unique_id__
17
+ return @args[:data][:Key_name]
18
+ end
19
+
15
20
  def name
16
21
  return @args[:data][:Key_name]
17
22
  end
@@ -1,12 +1,11 @@
1
1
  require "#{$knjpath}wref"
2
2
 
3
3
  class KnjDB_mysql::Tables
4
- attr_reader :db, :driver, :list
4
+ attr_reader :db, :list
5
5
 
6
6
  def initialize(args)
7
7
  @args = args
8
8
  @db = @args[:db]
9
- @driver = @args[:driver]
10
9
  @subtype = @db.opts[:subtype]
11
10
  @list_mutex = Mutex.new
12
11
  @list = Knj::Wref_map.new
@@ -23,11 +22,11 @@ class KnjDB_mysql::Tables
23
22
 
24
23
  begin
25
24
  return @list[table_name]
26
- rescue WeakRef::RefError
25
+ rescue Knj::Wref::Recycled
27
26
  #ignore.
28
27
  end
29
28
 
30
- self.list do |table_obj|
29
+ self.list(:name => table_name) do |table_obj|
31
30
  return table_obj if table_obj.name == table_name
32
31
  end
33
32
 
@@ -37,16 +36,19 @@ class KnjDB_mysql::Tables
37
36
  def list(args = {})
38
37
  ret = {} unless block_given?
39
38
 
39
+ sql = "SHOW TABLE STATUS"
40
+ if args[:name]
41
+ sql << " WHERE `Name` = '#{@db.esc(args[:name])}'"
42
+ end
43
+
40
44
  @list_mutex.synchronize do
41
- @db.q("SHOW TABLE STATUS") do |d_tables|
45
+ @db.q(sql) do |d_tables|
42
46
  obj = @list.get!(d_tables[:Name])
43
47
 
44
48
  if !obj
45
49
  obj = KnjDB_mysql::Tables::Table.new(
46
50
  :db => @db,
47
- :driver => @driver,
48
- :data => d_tables,
49
- :tables => self
51
+ :data => d_tables
50
52
  )
51
53
  @list[d_tables[:Name]] = obj
52
54
  end
@@ -79,14 +81,19 @@ class KnjDB_mysql::Tables
79
81
  sql << @db.cols.data_sql(col_data)
80
82
  end
81
83
 
82
- sql << ")"
83
-
84
- @db.query(sql)
85
-
86
84
  if data["indexes"]
87
- table_obj = self[name]
88
- table_obj.create_indexes(data["indexes"])
85
+ sql << ", "
86
+ sql << KnjDB_mysql::Tables::Table.create_indexes(data["indexes"], {
87
+ :db => @db,
88
+ :return_sql => true,
89
+ :create => false,
90
+ :on_table => false,
91
+ :table_name => name
92
+ })
89
93
  end
94
+
95
+ sql << ")"
96
+ @db.query(sql)
90
97
  end
91
98
  end
92
99
 
@@ -96,7 +103,6 @@ class KnjDB_mysql::Tables::Table
96
103
  def initialize(args)
97
104
  @args = args
98
105
  @db = args[:db]
99
- @driver = args[:driver]
100
106
  @data = args[:data]
101
107
  @subtype = @db.opts[:subtype]
102
108
  @list = Knj::Wref_map.new
@@ -105,6 +111,15 @@ class KnjDB_mysql::Tables::Table
105
111
  raise "Could not figure out name from: '#{@data}'." if !@data[:Name]
106
112
  end
107
113
 
114
+ def reload
115
+ @data = @db.q("SHOW TABLE STATUS WHERE `Name` = '#{@db.esc(self.name)}'").fetch
116
+ end
117
+
118
+ #Used to validate in Knj::Wrap_map.
119
+ def __object_unique_id__
120
+ return @data[:Name]
121
+ end
122
+
108
123
  def name
109
124
  return @data[:Name]
110
125
  end
@@ -119,12 +134,16 @@ class KnjDB_mysql::Tables::Table
119
134
  return self
120
135
  end
121
136
 
137
+ def rows_count
138
+ return @data[:Rows].to_i
139
+ end
140
+
122
141
  def column(name)
123
142
  name = name.to_s
124
143
 
125
144
  begin
126
145
  return @list[name]
127
- rescue WeakRef::RefError
146
+ rescue Knj::Wref::Recycled
128
147
  #ignore.
129
148
  end
130
149
 
@@ -147,7 +166,6 @@ class KnjDB_mysql::Tables::Table
147
166
  obj = KnjDB_mysql::Columns::Column.new(
148
167
  :table_name => self.name,
149
168
  :db => @db,
150
- :driver => @driver,
151
169
  :data => d_cols
152
170
  )
153
171
  @list[d_cols[:Field]] = obj
@@ -180,7 +198,6 @@ class KnjDB_mysql::Tables::Table
180
198
  obj = KnjDB_mysql::Indexes::Index.new(
181
199
  :table_name => self.name,
182
200
  :db => @db,
183
- :driver => @driver,
184
201
  :data => d_indexes
185
202
  )
186
203
  obj.columns << d_indexes[:Column_name]
@@ -206,7 +223,7 @@ class KnjDB_mysql::Tables::Table
206
223
 
207
224
  begin
208
225
  return @indexes_list[name]
209
- rescue WeakRef::RefError
226
+ rescue Knj::Wref::Recycled
210
227
  #ignore.
211
228
  end
212
229
 
@@ -224,8 +241,27 @@ class KnjDB_mysql::Tables::Table
224
241
  end
225
242
  end
226
243
 
227
- def create_indexes(index_arr)
244
+ def create_indexes(index_arr, args = {})
245
+ return KnjDB_mysql::Tables::Table.create_indexes(index_arr, args.merge(:table_name => self.name, :db => @db))
246
+ end
247
+
248
+ def self.create_indexes(index_arr, args = {})
249
+ db = args[:db]
250
+
251
+ if args[:return_sql]
252
+ sql = ""
253
+ first = true
254
+ end
255
+
228
256
  index_arr.each do |index_data|
257
+ if !args[:return_sql]
258
+ sql = ""
259
+ end
260
+
261
+ if args[:create] or !args.key?(:create)
262
+ sql << "CREATE"
263
+ end
264
+
229
265
  if index_data.is_a?(String)
230
266
  index_data = {"name" => index_data, "columns" => [index_data]}
231
267
  end
@@ -233,29 +269,50 @@ class KnjDB_mysql::Tables::Table
233
269
  raise "No name was given." if !index_data.key?("name") or index_data["name"].strip.length <= 0
234
270
  raise "No columns was given on index: '#{index_data["name"]}'." if !index_data["columns"] or index_data["columns"].empty?
235
271
 
236
- sql = "CREATE"
272
+ if args[:return_sql]
273
+ if first
274
+ first = false
275
+ else
276
+ sql << ", "
277
+ end
278
+ end
279
+
237
280
  sql << " UNIQUE" if index_data["unique"]
238
- sql << " INDEX #{@db.escape_col}#{@db.esc_col(index_data["name"])}#{@db.escape_col} ON #{@db.escape_table}#{@db.esc_table(self.name)}#{@db.escape_table} ("
281
+ sql << " INDEX #{db.escape_col}#{db.esc_col(index_data["name"])}#{db.escape_col}"
282
+
283
+ if args[:on_table] or !args.key?(:on_table)
284
+ sql << " ON #{db.escape_table}#{db.esc_table(args[:table_name])}#{db.escape_table}"
285
+ end
286
+
287
+ sql << " ("
239
288
 
240
289
  first = true
241
290
  index_data["columns"].each do |col_name|
242
291
  sql << ", " if !first
243
292
  first = false if first
244
293
 
245
- sql << "#{@db.escape_col}#{@db.esc_col(col_name)}#{@db.escape_col}"
294
+ sql << "#{db.escape_col}#{db.esc_col(col_name)}#{db.escape_col}"
246
295
  end
247
296
 
248
297
  sql << ")"
249
298
 
250
- @db.query(sql)
299
+ if !args[:return_sql]
300
+ db.query(sql)
301
+ end
302
+ end
303
+
304
+ if args[:return_sql]
305
+ return sql
306
+ else
307
+ return nil
251
308
  end
252
309
  end
253
310
 
254
311
  def rename(newname)
255
312
  oldname = self.name
256
313
  @db.query("ALTER TABLE `#{oldname}` RENAME TO `#{newname}`")
257
- @args[:tables].list[newname] = self
258
- @args[:tables].list.delete(oldname)
314
+ @db.tables.list[newname] = self
315
+ @db.tables.list.delete(oldname)
259
316
  @data[:Name] = newname
260
317
  end
261
318
 
@@ -17,7 +17,7 @@ class KnjDB_sqlite3::Tables
17
17
 
18
18
  begin
19
19
  return @list[table_name]
20
- rescue WeakRef::RefError
20
+ rescue Knj::Wref::Recycled
21
21
  #ignore.
22
22
  end
23
23
 
@@ -271,13 +271,13 @@ class KnjDB_sqlite3::Tables::Table
271
271
 
272
272
  begin
273
273
  return @indexes_list[name]
274
- rescue WeakRef::RefError
274
+ rescue Knj::Wref::Recycled
275
275
  if @db.opts[:index_append_table_name]
276
276
  tryname = "#{self.name}__#{name}"
277
277
 
278
278
  begin
279
279
  return @indexes_list[tryname]
280
- rescue WeakRef::RefError
280
+ rescue Knj::Wref::Recycled
281
281
  #ignore.
282
282
  end
283
283
  else
@@ -68,7 +68,7 @@ class Knj::Db
68
68
 
69
69
  fpaths = [
70
70
  "drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}.rb",
71
- "libknjdb_" + @opts[:type] + ".rb"
71
+ "libknjdb_#{@opts[:type]}.rb"
72
72
  ]
73
73
  fpaths.each do |fpath|
74
74
  rpath = "#{File.dirname(__FILE__)}/#{fpath}"
@@ -370,11 +370,10 @@ class Knj::Db
370
370
  #Executes a query and returns the result.
371
371
  def query(string)
372
372
  if @debug
373
- begin
374
- raise "test"
375
- rescue => e
376
- print "SQL: #{string}\n"
377
- print e.backtrace.join("\n")
373
+ print "SQL: #{string}\n"
374
+
375
+ if @debug.is_a?(Fixnum) and @debug >= 2
376
+ print caller.join("\n")
378
377
  print "\n"
379
378
  end
380
379
  end
@@ -402,15 +401,7 @@ class Knj::Db
402
401
 
403
402
  #Clones the connection, executes a unbuffered query and closes the connection again.
404
403
  def cloned_conn(args = nil, &block)
405
- subtype = @opts[:subtype]
406
-
407
- #MySQL2-driver doesnt support unbuffered queries yet.
408
- if @opts[:type] == "mysql" and @opts[:subtype] == "mysql2"
409
- subtype = "mysql"
410
- end
411
-
412
404
  clone_conn_args = {
413
- :subtype => subtype,
414
405
  :threadsafe => false
415
406
  }
416
407
 
@@ -513,15 +504,14 @@ class Knj::Db
513
504
  #Returns the table-module and spawns it if it isnt already spawned.
514
505
  def tables
515
506
  conn_exec do |driver|
516
- if !driver.tables
507
+ if !@tables
517
508
  require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_tables" if (!@opts.key?(:require) or @opts[:require])
518
- driver.tables = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Tables).new(
519
- :driver => driver,
509
+ @tables = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Tables).new(
520
510
  :db => self
521
511
  )
522
512
  end
523
513
 
524
- return driver.tables
514
+ return @tables
525
515
  end
526
516
  end
527
517
 
@@ -530,7 +520,6 @@ class Knj::Db
530
520
  if !@cols
531
521
  require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_columns" if (!@opts.key?(:require) or @opts[:require])
532
522
  @cols = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Columns).new(
533
- :driver => @conn,
534
523
  :db => self
535
524
  )
536
525
  end
@@ -543,7 +532,6 @@ class Knj::Db
543
532
  if !@indexes
544
533
  require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_indexes" if (!@opts.key?(:require) or @opts[:require])
545
534
  @indexes = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Indexes).new(
546
- :driver => @conn,
547
535
  :db => self
548
536
  )
549
537
  end
@@ -560,4 +548,15 @@ class Knj::Db
560
548
 
561
549
  raise "Method not found: #{method_name}"
562
550
  end
551
+
552
+ #Beings a transaction and commits when the block ends.
553
+ def transaction
554
+ self.query("START TRANSACTION")
555
+
556
+ begin
557
+ yield(self)
558
+ ensure
559
+ self.query("COMMIT")
560
+ end
561
+ end
563
562
  end
@@ -5,6 +5,7 @@ class Knj::Db::Revision
5
5
 
6
6
  #This method checks if certain rows are present in a table based on a hash.
7
7
  def rows_init(args)
8
+ db = args["db"]
8
9
  table = args["table"]
9
10
 
10
11
  args["rows"].each do |row_data|
@@ -37,7 +38,6 @@ class Knj::Db::Revision
37
38
  def init_db(args)
38
39
  schema = args["schema"]
39
40
  db = args["db"]
40
- @db = db
41
41
 
42
42
  #Check for normal bugs and raise apropiate error.
43
43
  raise "'schema' argument was not a Hash: '#{schema.class.name}'." if !schema.is_a?(Hash)
@@ -50,6 +50,7 @@ class Knj::Db::Revision
50
50
  schema["tables"].each do |table_name, table_data|
51
51
  begin
52
52
  begin
53
+ raise Knj::Errors::NotFound if !tables.key?(table_name)
53
54
  table_obj = db.tables[table_name]
54
55
 
55
56
  #Cache indexes- and column-objects to avoid constant reloading.
@@ -224,11 +225,12 @@ class Knj::Db::Revision
224
225
  end
225
226
  end
226
227
 
227
- self.rows_init("table" => table_obj, "rows" => table_data["rows"]) if table_data and table_data["rows"]
228
+ self.rows_init("db" => db, "table" => table_obj, "rows" => table_data["rows"]) if table_data and table_data["rows"]
228
229
  rescue Knj::Errors::NotFound => e
229
230
  if table_data["renames"]
230
231
  table_data["renames"].each do |table_name_rename|
231
232
  begin
233
+ raise Knj::Errors::NotFound if !tables.key?(table_name)
232
234
  table_rename = db.tables[table_name_rename]
233
235
  table_rename.rename(table_name)
234
236
  raise Knj::Errors::Retry
@@ -272,5 +274,10 @@ class Knj::Db::Revision
272
274
  end
273
275
  end
274
276
  end
277
+
278
+
279
+ #Free cache.
280
+ tables.clear
281
+ tables = nil
275
282
  end
276
283
  end
data/lib/knj/kvm.rb ADDED
@@ -0,0 +1,100 @@
1
+ class Knj::Kvm
2
+ def self.list
3
+ list = []
4
+
5
+ Knj::Unix_proc.list("grep" => "kvm") do |proc_obj|
6
+ next if !proc_obj["cmd"].match(/^\/usr\/bin\/kvm\s+/)
7
+
8
+ args = {
9
+ :pid => proc_obj["pid"]
10
+ }
11
+
12
+ if mac_match = proc_obj["cmd"].match(/mac=(.+?)(,|\s+|$)/)
13
+ args[:mac] = mac_match[1]
14
+ end
15
+
16
+ if name_match = proc_obj["cmd"].match(/\-name\s+(.+?)(,|\s+|$)/)
17
+ args[:name] = name_match[1]
18
+ end
19
+
20
+ if args.length > 0 and args[:name].to_s.length > 0
21
+ machine = Knj::Kvm::Machine.new(args)
22
+ if block_given?
23
+ yield(machine)
24
+ else
25
+ list << machine
26
+ end
27
+ end
28
+ end
29
+
30
+ if block_given?
31
+ return nil
32
+ else
33
+ return list
34
+ end
35
+ end
36
+ end
37
+
38
+ class Knj::Kvm::Machine
39
+ def initialize(args)
40
+ @args = args
41
+ end
42
+
43
+ def pid
44
+ return @args[:pid]
45
+ end
46
+
47
+ def name
48
+ return @args[:name]
49
+ end
50
+
51
+ def mac
52
+ raise "No MAC-address has been registered for this machine." if !@args.key?(:mac)
53
+ return @args[:mac]
54
+ end
55
+
56
+ def iface
57
+ if !@iface
58
+ res = Knj::Os.shellcmd("ifconfig | grep \"#{self.mac[3, self.mac.length]}\"")
59
+
60
+ if net_match = res.match(/^vnet(\d+)/)
61
+ @iface = net_match[0]
62
+ else
63
+ raise "Could not figure out iface from '#{res}' for '#{self.name}'."
64
+ end
65
+ end
66
+
67
+ return @iface
68
+ end
69
+
70
+ def net_status
71
+ res = Knj::Os.shellcmd("ifconfig \"#{self.iface}\"")
72
+
73
+ ret = {}
74
+
75
+ if tx_bytes_match = res.match(/TX\s*bytes:\s*(\d+)/)
76
+ ret[:tx] = tx_bytes_match[1].to_i
77
+ end
78
+
79
+ if rx_bytes_match = res.match(/RX\s*bytes:\s*(\d+)/)
80
+ ret[:rx] = rx_bytes_match[1].to_i
81
+ end
82
+
83
+ return ret
84
+ end
85
+
86
+ def io_status
87
+ io_status = File.read("/proc/#{self.pid}/io")
88
+
89
+ if !matches = io_status.scan(/^(.+): (\d+)$/)
90
+ raise "Could not match IO-status from: '#{io_status}'."
91
+ end
92
+
93
+ ret = {}
94
+ matches.each do |match|
95
+ ret[match[0].to_sym] = match[1].to_i
96
+ end
97
+
98
+ return ret
99
+ end
100
+ end
@@ -1,3 +1,32 @@
1
- [_("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), _("Friday"), _("Saturday"), _("Sunday")]
2
- [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")]
3
- [_("January"), _("February"), _("March"), _("April"), _("May"), _("June"), _("July"), _("August"), _("September"), _("October"), _("November"), _("December")]
1
+ #This file can be symlinked and thereby easily translated by POEdit. Further more the static methods can be used for stuff.
2
+ module Knj::Locales
3
+ def self.days_arr
4
+ return [_("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), _("Friday"), _("Saturday"), _("Sunday")]
5
+ end
6
+
7
+ def self.days_short_arr
8
+ return [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")]
9
+ end
10
+
11
+ def self.months_arr
12
+ return [_("January"), _("February"), _("March"), _("April"), _("May"), _("June"), _("July"), _("August"), _("September"), _("October"), _("November"), _("December")]
13
+ end
14
+
15
+ def self.ago_strings
16
+ return {
17
+ :year_ago_str => _("%s year ago"),
18
+ :years_ago_str => _("%s years ago"),
19
+ :month_ago_str => _("%s month ago"),
20
+ :months_ago_str => _("%s months ago"),
21
+ :day_ago_str => _("%s day ago"),
22
+ :days_ago_str => _("%s days ago"),
23
+ :hour_ago_str => _("%s hour ago"),
24
+ :hours_ago_str => _("%s hours ago"),
25
+ :min_ago_str => _("%s minute ago"),
26
+ :mins_ago_str => _("%s minutes ago"),
27
+ :sec_ago_str => _("%s second ago"),
28
+ :secs_ago_str => _("%s seconds ago"),
29
+ :right_now_str => _("right now")
30
+ }
31
+ end
32
+ end