knjrbfw 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
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