knjrbfw 0.0.66 → 0.0.67
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -1
- data/Gemfile.lock +4 -12
- data/VERSION +1 -1
- data/knjrbfw.gemspec +2 -5
- data/lib/knj/cmd_parser.rb +1 -1
- data/lib/knj/datarow.rb +108 -92
- data/lib/knj/eruby.rb +4 -1
- data/lib/knj/facebook_connect.rb +1 -2
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +5 -7
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +3 -3
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +5 -7
- data/lib/knj/knjdb/libknjdb.rb +123 -161
- data/lib/knj/os.rb +1 -4
- data/lib/knj/php.rb +2 -2
- data/lib/knj/process_meta.rb +1 -0
- data/lib/knj/threadhandler.rb +25 -22
- data/lib/knj/web.rb +7 -1
- metadata +5 -16
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
datet (0.0.
|
4
|
+
datet (0.0.12)
|
5
5
|
diff-lcs (1.1.3)
|
6
6
|
git (1.2.5)
|
7
|
-
http2 (0.0.
|
8
|
-
knjrbfw
|
7
|
+
http2 (0.0.5)
|
9
8
|
jeweler (1.6.4)
|
10
9
|
bundler (~> 1.0)
|
11
10
|
git (>= 1.2.5)
|
12
11
|
rake
|
13
|
-
knjrbfw (0.0.55)
|
14
|
-
tsafe
|
15
|
-
wref
|
16
12
|
rake (0.9.2.2)
|
17
|
-
rcov (0.9.11)
|
18
|
-
rcov (0.9.11-java)
|
19
13
|
rmagick (2.13.1)
|
20
14
|
rspec (2.3.0)
|
21
15
|
rspec-core (~> 2.3.0)
|
@@ -26,11 +20,10 @@ GEM
|
|
26
20
|
diff-lcs (~> 1.1.2)
|
27
21
|
rspec-mocks (2.3.0)
|
28
22
|
sqlite3 (1.3.6)
|
29
|
-
tsafe (0.0.
|
30
|
-
wref (0.0.
|
23
|
+
tsafe (0.0.1)
|
24
|
+
wref (0.0.5)
|
31
25
|
|
32
26
|
PLATFORMS
|
33
|
-
java
|
34
27
|
ruby
|
35
28
|
|
36
29
|
DEPENDENCIES
|
@@ -38,7 +31,6 @@ DEPENDENCIES
|
|
38
31
|
datet
|
39
32
|
http2
|
40
33
|
jeweler (~> 1.6.3)
|
41
|
-
rcov
|
42
34
|
rmagick
|
43
35
|
rspec (~> 2.3.0)
|
44
36
|
sqlite3
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.67
|
data/knjrbfw.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjrbfw}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.67"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-07-
|
12
|
+
s.date = %q{2012-07-24}
|
13
13
|
s.description = %q{Including stuff for HTTP, SSH and much more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -287,7 +287,6 @@ Gem::Specification.new do |s|
|
|
287
287
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
288
288
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
289
289
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
|
290
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
291
290
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
292
291
|
s.add_development_dependency(%q<rmagick>, [">= 0"])
|
293
292
|
else
|
@@ -298,7 +297,6 @@ Gem::Specification.new do |s|
|
|
298
297
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
299
298
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
300
299
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
301
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
302
300
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
303
301
|
s.add_dependency(%q<rmagick>, [">= 0"])
|
304
302
|
end
|
@@ -310,7 +308,6 @@ Gem::Specification.new do |s|
|
|
310
308
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
311
309
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
312
310
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
313
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
314
311
|
s.add_dependency(%q<sqlite3>, [">= 0"])
|
315
312
|
s.add_dependency(%q<rmagick>, [">= 0"])
|
316
313
|
end
|
data/lib/knj/cmd_parser.rb
CHANGED
@@ -8,7 +8,7 @@ class Knj::Cmd_parser
|
|
8
8
|
ret = []
|
9
9
|
|
10
10
|
str.lines.each do |line|
|
11
|
-
next if line.match(/^total
|
11
|
+
next if line.match(/^total([A-z]*)\s+([\d\.,]+)(M|k|G|)$/)
|
12
12
|
match = line.match(/^(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\s+(\d+)\s+(.+)\s+([^\W].+?)\s+([\d\.,]+)(M|k|G|K|)\s+((\d+)-(\d+)-(\d+)|(([A-z]{3})\s+(\d+)))\s+((\d+):(\d+)|(\d{4}))\s+(.+)$/)
|
13
13
|
raise "Could not match: '#{line}'." if !match
|
14
14
|
|
data/lib/knj/datarow.rb
CHANGED
@@ -4,17 +4,27 @@
|
|
4
4
|
# ob = Knj::Objects.new(:db => db, :datarow => true, :path => "path_of_model_class_files")
|
5
5
|
# user = ob.get(:User, 1) #=> <Models::User> that extends <Knj::Datarow>
|
6
6
|
class Knj::Datarow
|
7
|
-
|
8
|
-
def data
|
9
|
-
self.reload if @should_reload
|
10
|
-
return @data
|
11
|
-
end
|
7
|
+
@@refs = {}
|
12
8
|
|
13
9
|
#Returns the Knj::Objects which handels this model.
|
14
|
-
|
10
|
+
def ob
|
11
|
+
return self.class.ob
|
12
|
+
end
|
15
13
|
|
16
14
|
#Returns the Knj::Db which handels this model.
|
17
|
-
|
15
|
+
def db
|
16
|
+
return self.class.db
|
17
|
+
end
|
18
|
+
|
19
|
+
#Returns the 'Knj::Objects'-object that handels this class.
|
20
|
+
def self.ob
|
21
|
+
return @ob
|
22
|
+
end
|
23
|
+
|
24
|
+
#Returns the 'Knj::Db'-object that handels this class.
|
25
|
+
def self.db
|
26
|
+
return @db
|
27
|
+
end
|
18
28
|
|
19
29
|
#This is used by 'Knj::Objects' to find out what data is required for this class. Returns the array that tells about required data.
|
20
30
|
#===Examples
|
@@ -44,7 +54,7 @@ class Knj::Datarow
|
|
44
54
|
|
45
55
|
#Returns true if this class has been initialized.
|
46
56
|
def self.initialized?
|
47
|
-
return false if !@
|
57
|
+
return false if !@columns_sqlhelper_args
|
48
58
|
return true
|
49
59
|
end
|
50
60
|
|
@@ -61,11 +71,6 @@ class Knj::Datarow
|
|
61
71
|
return @autodelete_data
|
62
72
|
end
|
63
73
|
|
64
|
-
#Get the 'Knj::Objects'-object that handels this class.
|
65
|
-
def self.ob
|
66
|
-
return @ob
|
67
|
-
end
|
68
|
-
|
69
74
|
#This helps various parts of the framework determine if this is a datarow class without requiring it.
|
70
75
|
#===Examples
|
71
76
|
# print "This is a knj-object." if obj.respond_to?("is_knj?")
|
@@ -152,7 +157,7 @@ class Knj::Datarow
|
|
152
157
|
list_args.merge!(where_args) if where_args
|
153
158
|
list_args[colname.to_s] = self.id
|
154
159
|
|
155
|
-
return
|
160
|
+
return self.class.ob.list(classname, list_args, &block)
|
156
161
|
end
|
157
162
|
|
158
163
|
define_method("#{methodname}_count".to_sym) do |*args|
|
@@ -161,12 +166,12 @@ class Knj::Datarow
|
|
161
166
|
list_args[colname.to_s] = self.id
|
162
167
|
list_args["count"] = true
|
163
168
|
|
164
|
-
return
|
169
|
+
return self.class.ob.list(classname, list_args)
|
165
170
|
end
|
166
171
|
|
167
172
|
define_method("#{methodname}_last".to_sym) do |args|
|
168
173
|
args = {} if !args
|
169
|
-
return
|
174
|
+
return self.class.ob.list(classname, {"orderby" => [["id", "desc"]], "limit" => 1}.merge(args))
|
170
175
|
end
|
171
176
|
|
172
177
|
self.joined_tables(
|
@@ -235,13 +240,13 @@ class Knj::Datarow
|
|
235
240
|
colname = "#{classname.to_s.downcase}_id".to_sym if !colname
|
236
241
|
|
237
242
|
define_method(methodname) do
|
238
|
-
return
|
243
|
+
return self.class.ob.get_try(self, colname, classname)
|
239
244
|
end
|
240
245
|
|
241
246
|
methodname_html = "#{methodname}_html".to_sym
|
242
247
|
define_method(methodname_html) do |*args|
|
243
248
|
obj = self.__send__(methodname)
|
244
|
-
return
|
249
|
+
return self.class.ob.events.call(:no_html, classname) if !obj
|
245
250
|
|
246
251
|
raise "Class '#{classname}' does not have a 'html'-method." if !obj.respond_to?(:html)
|
247
252
|
return obj.html(*args)
|
@@ -250,7 +255,7 @@ class Knj::Datarow
|
|
250
255
|
methodname_name = "#{methodname}_name".to_sym
|
251
256
|
define_method(methodname_name) do |*args|
|
252
257
|
obj = self.__send__(methodname)
|
253
|
-
return
|
258
|
+
return self.class.ob.events.call(:no_name, classname) if !obj
|
254
259
|
return obj.name(*args)
|
255
260
|
end
|
256
261
|
|
@@ -313,34 +318,6 @@ class Knj::Datarow
|
|
313
318
|
@columns_joined_tables.merge!(hash)
|
314
319
|
end
|
315
320
|
|
316
|
-
#Returns the table-name that should be used for this datarow.
|
317
|
-
#===Examples
|
318
|
-
# db.query("SELECT * FROM `#{Models::User.table}` WHERE username = 'John Doe'") do |data|
|
319
|
-
# print data[:id]
|
320
|
-
# end
|
321
|
-
def self.table
|
322
|
-
return @table if @table
|
323
|
-
return self.name.split("::").last
|
324
|
-
end
|
325
|
-
|
326
|
-
#This can be used to manually set the table-name. Useful when meta-programming classes that extends the datarow-class.
|
327
|
-
#===Examples
|
328
|
-
# Models::User.table = "prefix_User"
|
329
|
-
def self.table=(newtable)
|
330
|
-
@table = newtable
|
331
|
-
@columns_sqlhelper_args[:table] = @table if @columns_sqlhelper_args.is_a?(Hash)
|
332
|
-
end
|
333
|
-
|
334
|
-
#Returns the class-name but without having to call the class-table-method. To make code look shorter.
|
335
|
-
#===Examples
|
336
|
-
# user = ob.get_by(:User, {:username => 'John Doe'})
|
337
|
-
# db.query("SELECT * FROM `#{user.table}` WHERE username = 'John Doe'") do |data|
|
338
|
-
# print data[:id]
|
339
|
-
# end
|
340
|
-
def table
|
341
|
-
return self.class.table
|
342
|
-
end
|
343
|
-
|
344
321
|
#Returns various data for the objects-sql-helper. This can be used to view various informations about the columns and more.
|
345
322
|
def self.columns_sqlhelper_args
|
346
323
|
raise "No SQLHelper arguments has been spawned yet." if !@columns_sqlhelper_args
|
@@ -349,17 +326,24 @@ class Knj::Datarow
|
|
349
326
|
|
350
327
|
#Called by Knj::Objects to initialize the model and load column-data on-the-fly.
|
351
328
|
def self.load_columns(d)
|
352
|
-
@ob = d.ob
|
329
|
+
@ob = d.ob
|
330
|
+
@db = d.db
|
353
331
|
|
354
|
-
@classname = self.name.split("::").last if !@classname
|
332
|
+
@classname = self.name.split("::").last.to_sym if !@classname
|
333
|
+
@table = @classname if !@table
|
355
334
|
@mutex = Monitor.new if !@mutex
|
356
335
|
|
336
|
+
#Cache these to avoid method-lookups.
|
337
|
+
@sep_col = @db.sep_col
|
338
|
+
@sep_table = @db.sep_table
|
339
|
+
@table_str = "#{@sep_table}#{@db.esc_table(@table)}#{@sep_table}"
|
340
|
+
|
357
341
|
@mutex.synchronize do
|
358
342
|
inst_methods = self.instance_methods(false)
|
359
343
|
|
360
344
|
sqlhelper_args = {
|
361
|
-
:db =>
|
362
|
-
:table => table,
|
345
|
+
:db => @db,
|
346
|
+
:table => @table,
|
363
347
|
:cols_bools => [],
|
364
348
|
:cols_date => [],
|
365
349
|
:cols_dbrows => [],
|
@@ -368,9 +352,9 @@ class Knj::Datarow
|
|
368
352
|
:cols => {}
|
369
353
|
}
|
370
354
|
|
371
|
-
sqlhelper_args[:table] = @table
|
355
|
+
sqlhelper_args[:table] = @table
|
372
356
|
|
373
|
-
|
357
|
+
@db.tables[table].columns do |col_obj|
|
374
358
|
col_name = col_obj.name
|
375
359
|
col_type = col_obj.type
|
376
360
|
col_type = :int if col_type == :bigint or col_type == :tinyint or col_type == :mediumint or col_type == :smallint
|
@@ -407,7 +391,7 @@ class Knj::Datarow
|
|
407
391
|
if @columns_joined_tables
|
408
392
|
@columns_joined_tables.each do |table_name, table_data|
|
409
393
|
table_data[:where].each do |key, val|
|
410
|
-
val[:table] =
|
394
|
+
val[:table] = @table if val.is_a?(Hash) and !val.key?(:table) and val[:type].to_sym == :col
|
411
395
|
end
|
412
396
|
|
413
397
|
table_data[:datarow] = @ob.args[:module].const_get(table_name.to_sym) if !table_data.key?(:datarow)
|
@@ -431,32 +415,29 @@ class Knj::Datarow
|
|
431
415
|
# array = ob.list(:User, {"id" => 1})
|
432
416
|
# print array.length
|
433
417
|
def self.list(d, &block)
|
434
|
-
|
435
|
-
ec_table = d.db.enc_table
|
436
|
-
|
437
|
-
table_str = "#{ec_table}#{d.db.esc_table(self.table)}#{ec_table}"
|
418
|
+
args = d.args
|
438
419
|
|
439
|
-
if
|
420
|
+
if args["count"]
|
440
421
|
count = true
|
441
|
-
|
442
|
-
sql = "SELECT COUNT(#{table_str}.#{
|
443
|
-
elsif
|
422
|
+
args.delete("count")
|
423
|
+
sql = "SELECT COUNT(#{@table_str}.#{@sep_col}id#{@sep_col}) AS count"
|
424
|
+
elsif args["select_col_as_array"]
|
444
425
|
select_col_as_array = true
|
445
|
-
sql = "SELECT #{table_str}.#{
|
446
|
-
|
426
|
+
sql = "SELECT #{@table_str}.#{@sep_col}#{args["select_col_as_array"]}#{@sep_col} AS id"
|
427
|
+
args.delete("select_col_as_array")
|
447
428
|
else
|
448
|
-
sql = "SELECT #{table_str}.*"
|
429
|
+
sql = "SELECT #{@table_str}.*"
|
449
430
|
end
|
450
431
|
|
451
432
|
qargs = nil
|
452
433
|
ret = self.list_helper(d)
|
453
434
|
|
454
|
-
sql << " FROM #{table_str}"
|
435
|
+
sql << " FROM #{@table_str}"
|
455
436
|
sql << ret[:sql_joins]
|
456
437
|
sql << " WHERE 1=1"
|
457
438
|
sql << ret[:sql_where]
|
458
439
|
|
459
|
-
|
440
|
+
args.each do |key, val|
|
460
441
|
case key
|
461
442
|
when "return_sql"
|
462
443
|
#ignore
|
@@ -470,7 +451,7 @@ class Knj::Datarow
|
|
470
451
|
#The count will bug if there is a group-by-statement.
|
471
452
|
grp_shown = false
|
472
453
|
if !count and !ret[:sql_groupby]
|
473
|
-
sql << " GROUP BY #{table_str}.#{
|
454
|
+
sql << " GROUP BY #{@table_str}.#{@sep_col}id#{@sep_col}"
|
474
455
|
grp_shown = true
|
475
456
|
end
|
476
457
|
|
@@ -487,11 +468,11 @@ class Knj::Datarow
|
|
487
468
|
sql << ret[:sql_order]
|
488
469
|
sql << ret[:sql_limit]
|
489
470
|
|
490
|
-
return sql.to_s if
|
471
|
+
return sql.to_s if args["return_sql"]
|
491
472
|
|
492
473
|
if select_col_as_array
|
493
474
|
enum = Enumerator.new do |yielder|
|
494
|
-
|
475
|
+
@db.q(sql, qargs) do |data|
|
495
476
|
yielder << data[:id]
|
496
477
|
end
|
497
478
|
end
|
@@ -499,25 +480,25 @@ class Knj::Datarow
|
|
499
480
|
if block
|
500
481
|
enum.each(&block)
|
501
482
|
return nil
|
502
|
-
elsif
|
483
|
+
elsif @ob.args[:array_enum]
|
503
484
|
return Array_enumerator.new(enum)
|
504
485
|
else
|
505
486
|
return enum.to_a
|
506
487
|
end
|
507
488
|
elsif count
|
508
|
-
ret =
|
489
|
+
ret = @db.query(sql).fetch
|
509
490
|
return ret[:count].to_i if ret
|
510
491
|
return 0
|
511
492
|
end
|
512
493
|
|
513
|
-
return
|
494
|
+
return @ob.list_bysql(self.classname, sql, qargs, &block)
|
514
495
|
end
|
515
496
|
|
516
497
|
#Helps call 'sqlhelper' on Knj::Objects to generate SQL-strings.
|
517
498
|
def self.list_helper(d)
|
518
499
|
self.load_columns(d) if !@columns_sqlhelper_args
|
519
|
-
@columns_sqlhelper_args[:table] = @table
|
520
|
-
return
|
500
|
+
@columns_sqlhelper_args[:table] = @table
|
501
|
+
return @ob.sqlhelper(d.args, @columns_sqlhelper_args)
|
521
502
|
end
|
522
503
|
|
523
504
|
#Returns the classname of the object without any subclasses.
|
@@ -530,14 +511,37 @@ class Knj::Datarow
|
|
530
511
|
@classname = newclassname
|
531
512
|
end
|
532
513
|
|
514
|
+
#Returns the table-name that should be used for this datarow.
|
515
|
+
#===Examples
|
516
|
+
# db.query("SELECT * FROM `#{Models::User.table}` WHERE username = 'John Doe'") do |data|
|
517
|
+
# print data[:id]
|
518
|
+
# end
|
519
|
+
def self.table
|
520
|
+
return @table
|
521
|
+
end
|
522
|
+
|
523
|
+
#This can be used to manually set the table-name. Useful when meta-programming classes that extends the datarow-class.
|
524
|
+
#===Examples
|
525
|
+
# Models::User.table = "prefix_User"
|
526
|
+
def self.table=(newtable)
|
527
|
+
@table = newtable
|
528
|
+
@columns_sqlhelper_args[:table] = @table if @columns_sqlhelper_args.is_a?(Hash)
|
529
|
+
end
|
530
|
+
|
531
|
+
#Returns the class-name but without having to call the class-table-method. To make code look shorter.
|
532
|
+
#===Examples
|
533
|
+
# user = ob.get_by(:User, {:username => 'John Doe'})
|
534
|
+
# db.query("SELECT * FROM `#{user.table}` WHERE username = 'John Doe'") do |data|
|
535
|
+
# print data[:id]
|
536
|
+
# end
|
537
|
+
def table
|
538
|
+
return self.class.table
|
539
|
+
end
|
540
|
+
|
533
541
|
#Initializes the object. This should be called from 'Knj::Objects' and not manually.
|
534
542
|
#===Examples
|
535
543
|
# user = ob.get(:User, 3)
|
536
544
|
def initialize(data, args = nil)
|
537
|
-
@ob = self.class.ob
|
538
|
-
raise "No ob given." if !@ob
|
539
|
-
@db = ob.db
|
540
|
-
|
541
545
|
if data.is_a?(Hash) and data.key?(:id)
|
542
546
|
@data = data
|
543
547
|
@id = @data[:id].to_i
|
@@ -545,9 +549,9 @@ class Knj::Datarow
|
|
545
549
|
@id = data.to_i
|
546
550
|
|
547
551
|
classname = self.class.classname.to_sym
|
548
|
-
if
|
552
|
+
if self.class.ob.ids_cache_should.key?(classname)
|
549
553
|
#ID caching is enabled for this model - dont reload until first use.
|
550
|
-
raise Errno::ENOENT, "ID was not found in cache: '#{id}'." if
|
554
|
+
raise Errno::ENOENT, "ID was not found in cache: '#{id}'." if !self.class.ob.ids_cache[classname].key?(@id)
|
551
555
|
@should_reload = true
|
552
556
|
else
|
553
557
|
#ID caching is not enabled - reload now to check if row exists. Else set 'should_reload'-variable if 'skip_reload' is set.
|
@@ -573,8 +577,8 @@ class Knj::Datarow
|
|
573
577
|
# user.reload
|
574
578
|
# print "The username changed in the database!" if user[:username] != old_username
|
575
579
|
def reload
|
576
|
-
@data =
|
577
|
-
raise Errno::ENOENT, "Could not find any data for the object with ID: '#{@id}' in the table '#{self.table}'." if !@data
|
580
|
+
@data = self.class.db.single(self.class.table, {:id => @id})
|
581
|
+
raise Errno::ENOENT, "Could not find any data for the object with ID: '#{@id}' in the table '#{self.class.table}'." if !@data
|
578
582
|
@should_reload = false
|
579
583
|
end
|
580
584
|
|
@@ -587,20 +591,24 @@ class Knj::Datarow
|
|
587
591
|
@data = nil
|
588
592
|
end
|
589
593
|
|
594
|
+
#Returns the data-hash that contains all the data from the database.
|
595
|
+
def data
|
596
|
+
self.reload if @should_reload
|
597
|
+
return @data
|
598
|
+
end
|
599
|
+
|
590
600
|
#Writes/updates new data for the object.
|
591
601
|
#===Examples
|
592
602
|
# user.update(:username => 'New username', :date_changed => Time.now)
|
593
603
|
def update(newdata)
|
594
|
-
|
604
|
+
self.class.db.update(self.class.table, newdata, {:id => @id})
|
595
605
|
self.should_reload
|
596
|
-
|
606
|
+
self.class.ob.call("object" => self, "signal" => "update")
|
597
607
|
end
|
598
608
|
|
599
609
|
#Forcefully destroys the object. This is done after deleting it and should not be called manually.
|
600
610
|
def destroy
|
601
611
|
@id = nil
|
602
|
-
@ob = nil
|
603
|
-
@db = nil
|
604
612
|
@data = nil
|
605
613
|
@should_reload = nil
|
606
614
|
end
|
@@ -618,17 +626,25 @@ class Knj::Datarow
|
|
618
626
|
#===Examples
|
619
627
|
# print "That user is deleted." if user.deleted?
|
620
628
|
def deleted?
|
621
|
-
return true if !@
|
629
|
+
return true if !@data and !@id
|
630
|
+
return false
|
631
|
+
end
|
632
|
+
|
633
|
+
#Returns true if the given object no longer exists in the database. Also destroys the data on the object and sets it to deleted-status, if it no longer exists.
|
634
|
+
#===Examples
|
635
|
+
# print "That user is deleted." if user.deleted_from_db?
|
636
|
+
def deleted_from_db?
|
637
|
+
#Try to avoid db-query if object is already deleted.
|
638
|
+
return true if self.deleted?
|
622
639
|
|
623
640
|
#Try to reload data. Destroy object and return true if the row is gone from the database.
|
624
641
|
begin
|
625
642
|
self.reload
|
643
|
+
return false
|
626
644
|
rescue Errno::ENOENT
|
627
645
|
self.destroy
|
628
646
|
return true
|
629
647
|
end
|
630
|
-
|
631
|
-
return false
|
632
648
|
end
|
633
649
|
|
634
650
|
#Returns a specific data from the object by key.
|
@@ -746,7 +762,7 @@ class Knj::Datarow
|
|
746
762
|
if args[:inst_methods].index(method_name) == nil
|
747
763
|
define_method(method_name) do |*method_args|
|
748
764
|
if Datet.is_nullstamp?(self[args[:col_name].to_sym])
|
749
|
-
return
|
765
|
+
return self.class.ob.events.call(:no_date, self.class.name)
|
750
766
|
end
|
751
767
|
|
752
768
|
return Datet.in(self[args[:col_name].to_sym]).out(*method_args)
|
@@ -780,7 +796,7 @@ class Knj::Datarow
|
|
780
796
|
method_name = "by_#{args[:col_name]}".to_sym
|
781
797
|
if args[:inst_methods].index(method_name) == nil and RUBY_VERSION.to_s.slice(0, 3) != "1.8"
|
782
798
|
define_singleton_method(method_name) do |arg|
|
783
|
-
return
|
799
|
+
return self.class.ob.get_by(self.class.table, {args[:col_name].to_s => arg})
|
784
800
|
end
|
785
801
|
end
|
786
802
|
end
|
data/lib/knj/eruby.rb
CHANGED
@@ -7,7 +7,10 @@ class Knj::Eruby
|
|
7
7
|
@args = args
|
8
8
|
|
9
9
|
@tmpdir = "#{Knj::Os.tmpdir}/knj_erb"
|
10
|
-
|
10
|
+
if !File.exists?(@tmpdir)
|
11
|
+
Dir.mkdir(@tmpdir, 0777)
|
12
|
+
File.chmod(0777, @tmpdir)
|
13
|
+
end
|
11
14
|
|
12
15
|
|
13
16
|
#This argument can be used if a shared cache should be used to speed up performance.
|
data/lib/knj/facebook_connect.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
class KnjDB_mysql
|
2
|
-
attr_reader :knjdb, :conn, :conns, :
|
2
|
+
attr_reader :knjdb, :conn, :conns, :sep_table, :sep_col, :sep_val
|
3
3
|
attr_accessor :tables, :cols, :indexes
|
4
4
|
|
5
5
|
def initialize(knjdb_ob)
|
6
6
|
@knjdb = knjdb_ob
|
7
7
|
@opts = @knjdb.opts
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@esc_table = "`"
|
12
|
-
@esc_col = "`"
|
8
|
+
@sep_table = "`"
|
9
|
+
@sep_col = "`"
|
10
|
+
@sep_val = "'"
|
13
11
|
|
14
12
|
require "monitor"
|
15
13
|
@mutex = Monitor.new
|
@@ -252,7 +250,7 @@ class KnjDB_mysql
|
|
252
250
|
#Escapes a string to be safe to use as a column in a query.
|
253
251
|
def esc_col(string)
|
254
252
|
string = string.to_s
|
255
|
-
raise "Invalid column-string: #{string}" if string.index(@
|
253
|
+
raise "Invalid column-string: #{string}" if string.index(@sep_col) != nil
|
256
254
|
return string
|
257
255
|
end
|
258
256
|
|
@@ -31,7 +31,7 @@ class KnjDB_mysql::Tables
|
|
31
31
|
return table_obj if table_obj.name == table_name
|
32
32
|
end
|
33
33
|
|
34
|
-
raise Errno::ENOENT
|
34
|
+
raise Errno::ENOENT, "Table was not found: #{table_name}."
|
35
35
|
end
|
36
36
|
|
37
37
|
#Yields the tables of the current database.
|
@@ -160,7 +160,7 @@ class KnjDB_mysql::Tables::Table
|
|
160
160
|
return col if col.name == name
|
161
161
|
end
|
162
162
|
|
163
|
-
raise Errno::ENOENT
|
163
|
+
raise Errno::ENOENT, "Column not found: '#{name}'."
|
164
164
|
end
|
165
165
|
|
166
166
|
def columns(args = nil)
|
@@ -242,7 +242,7 @@ class KnjDB_mysql::Tables::Table
|
|
242
242
|
return index if index.name.to_s == name
|
243
243
|
end
|
244
244
|
|
245
|
-
raise Errno::ENOENT
|
245
|
+
raise Errno::ENOENT, "Index not found: #{name}."
|
246
246
|
end
|
247
247
|
|
248
248
|
def create_columns(col_arr)
|
@@ -1,15 +1,13 @@
|
|
1
1
|
#This class handels SQLite3-specific behaviour.
|
2
2
|
class KnjDB_sqlite3
|
3
|
-
attr_reader :knjdb, :conn, :
|
3
|
+
attr_reader :knjdb, :conn, :sep_table, :sep_col, :sep_val, :symbolize
|
4
4
|
attr_accessor :tables, :cols, :indexes
|
5
5
|
|
6
6
|
#Constructor. This should not be called manually.
|
7
7
|
def initialize(knjdb_ob)
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@esc_table = "`"
|
12
|
-
@esc_col = "`"
|
8
|
+
@sep_table = "`"
|
9
|
+
@sep_col = "`"
|
10
|
+
@sep_val = "'"
|
13
11
|
|
14
12
|
@knjdb = knjdb_ob
|
15
13
|
@path = @knjdb.opts[:path] if @knjdb.opts[:path]
|
@@ -76,7 +74,7 @@ class KnjDB_sqlite3
|
|
76
74
|
#Escapes a string to be used as a column.
|
77
75
|
def esc_col(string)
|
78
76
|
string = string.to_s
|
79
|
-
raise "Invalid column-string: #{string}" if string.index(@
|
77
|
+
raise "Invalid column-string: #{string}" if string.index(@sep_col) != nil
|
80
78
|
return string
|
81
79
|
end
|
82
80
|
|
data/lib/knj/knjdb/libknjdb.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
require "rubygems"
|
2
|
-
|
3
|
-
if !Kernel.const_defined?(:
|
4
|
-
require "wref"
|
5
|
-
end
|
6
|
-
|
7
|
-
if !Kernel.const_defined?(:Datet)
|
8
|
-
require "datet"
|
9
|
-
end
|
2
|
+
require "wref" if !Kernel.const_defined?(:Wref)
|
3
|
+
require "datet" if !Kernel.const_defined?(:Datet)
|
10
4
|
|
11
5
|
#A wrapper of several possible database-types.
|
12
6
|
#
|
@@ -28,7 +22,7 @@ class Knj::Db
|
|
28
22
|
return Knj::Db.const_get(name)
|
29
23
|
end
|
30
24
|
|
31
|
-
attr_reader :opts, :conn, :conns, :int_types
|
25
|
+
attr_reader :sep_col, :sep_table, :sep_val, :opts, :conn, :conns, :int_types
|
32
26
|
|
33
27
|
def initialize(opts)
|
34
28
|
require "#{$knjpath}threadhandler"
|
@@ -43,6 +37,13 @@ class Knj::Db
|
|
43
37
|
end
|
44
38
|
|
45
39
|
@debug = @opts[:debug]
|
40
|
+
|
41
|
+
self.conn_exec do |driver|
|
42
|
+
@sep_table = driver.sep_table
|
43
|
+
@sep_col = driver.sep_col
|
44
|
+
@sep_val = driver.sep_val
|
45
|
+
@esc_driver = driver
|
46
|
+
end
|
46
47
|
end
|
47
48
|
|
48
49
|
def args
|
@@ -239,43 +240,44 @@ class Knj::Db
|
|
239
240
|
# id = db.insert(:users, {:name => "John", :lastname => "Doe"}, :return_id => true)
|
240
241
|
# sql = db.insert(:users, {:name => "John", :lastname => "Doe"}, :return_sql => true) #=> "INSERT INTO `users` (`name`, `lastname`) VALUES ('John', 'Doe')"
|
241
242
|
def insert(tablename, arr_insert, args = nil)
|
242
|
-
|
243
|
-
|
243
|
+
sql = "INSERT INTO #{@sep_table}#{tablename}#{@sep_table}"
|
244
|
+
|
245
|
+
if !arr_insert or arr_insert.empty?
|
246
|
+
#This is the correct syntax for inserting a blank row in MySQL.
|
247
|
+
sql << " VALUES ()"
|
248
|
+
else
|
249
|
+
sql << " ("
|
244
250
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
first = true
|
252
|
-
arr_insert.each do |key, value|
|
253
|
-
if first
|
254
|
-
first = false
|
255
|
-
else
|
256
|
-
sql << ", "
|
257
|
-
end
|
258
|
-
|
259
|
-
sql << "#{driver.escape_col}#{key.to_s}#{driver.escape_col}"
|
251
|
+
first = true
|
252
|
+
arr_insert.each do |key, value|
|
253
|
+
if first
|
254
|
+
first = false
|
255
|
+
else
|
256
|
+
sql << ", "
|
260
257
|
end
|
261
258
|
|
262
|
-
sql << "
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
sql << "
|
259
|
+
sql << "#{@sep_col}#{key}#{@sep_col}"
|
260
|
+
end
|
261
|
+
|
262
|
+
sql << ") VALUES ("
|
263
|
+
|
264
|
+
first = true
|
265
|
+
arr_insert.each do |key, value|
|
266
|
+
if first
|
267
|
+
first = false
|
268
|
+
else
|
269
|
+
sql << ", "
|
273
270
|
end
|
274
271
|
|
275
|
-
sql << ")"
|
272
|
+
sql << "#{@sep_val}#{@esc_driver.escape(value)}#{@sep_val}"
|
276
273
|
end
|
277
274
|
|
278
|
-
|
275
|
+
sql << ")"
|
276
|
+
end
|
277
|
+
|
278
|
+
return sql if args and args[:return_sql]
|
279
|
+
|
280
|
+
self.conn_exec do |driver|
|
279
281
|
driver.query(sql)
|
280
282
|
return driver.lastID if args and args[:return_id]
|
281
283
|
return nil
|
@@ -292,29 +294,29 @@ class Knj::Db
|
|
292
294
|
def insert_multi(tablename, arr_hashes, args = nil)
|
293
295
|
return false if arr_hashes.empty?
|
294
296
|
|
295
|
-
|
296
|
-
if
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
ret << self.insert(tablename, hash, args)
|
307
|
-
else
|
308
|
-
self.insert(tablename, hash, args)
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
297
|
+
if @esc_driver.respond_to?(:insert_multi)
|
298
|
+
if args and args[:return_sql]
|
299
|
+
return [@esc_driver.insert_multi(tablename, arr_hashes, args)]
|
300
|
+
end
|
301
|
+
|
302
|
+
self.conn_exec do |driver|
|
303
|
+
return driver.insert_multi(tablename, arr_hashes, args)
|
304
|
+
end
|
305
|
+
else
|
306
|
+
ret = [] if args and (args[:return_id] or args[:return_sql])
|
307
|
+
arr_hashes.each do |hash|
|
312
308
|
if ret
|
313
|
-
|
309
|
+
ret << self.insert(tablename, hash, args)
|
314
310
|
else
|
315
|
-
|
311
|
+
self.insert(tablename, hash, args)
|
316
312
|
end
|
317
313
|
end
|
314
|
+
|
315
|
+
if ret
|
316
|
+
return ret
|
317
|
+
else
|
318
|
+
return nil
|
319
|
+
end
|
318
320
|
end
|
319
321
|
end
|
320
322
|
|
@@ -325,30 +327,31 @@ class Knj::Db
|
|
325
327
|
def update(tablename, arr_update, arr_terms = {}, args = nil)
|
326
328
|
return false if arr_update.empty?
|
327
329
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
sql << ", "
|
338
|
-
end
|
339
|
-
|
340
|
-
#Convert dates to valid dbstr.
|
341
|
-
value = self.date_out(value) if value.is_a?(Datet) or value.is_a?(Time)
|
342
|
-
|
343
|
-
sql << "#{driver.escape_col}#{key.to_s}#{driver.escape_col} = "
|
344
|
-
sql << "#{driver.escape_val}#{driver.escape(value.to_s)}#{driver.escape_val}"
|
330
|
+
sql = ""
|
331
|
+
sql << "UPDATE #{@sep_col}#{tablename}#{@sep_col} SET "
|
332
|
+
|
333
|
+
first = true
|
334
|
+
arr_update.each do |key, value|
|
335
|
+
if first
|
336
|
+
first = false
|
337
|
+
else
|
338
|
+
sql << ", "
|
345
339
|
end
|
346
340
|
|
347
|
-
|
348
|
-
|
349
|
-
end
|
341
|
+
#Convert dates to valid dbstr.
|
342
|
+
value = self.date_out(value) if value.is_a?(Datet) or value.is_a?(Time)
|
350
343
|
|
351
|
-
|
344
|
+
sql << "#{@sep_col}#{key}#{@sep_col} = "
|
345
|
+
sql << "#{@sep_val}#{@esc_driver.escape(value)}#{@sep_val}"
|
346
|
+
end
|
347
|
+
|
348
|
+
if arr_terms and arr_terms.length > 0
|
349
|
+
sql << " WHERE #{self.makeWhere(arr_terms)}"
|
350
|
+
end
|
351
|
+
|
352
|
+
return sql if args and args[:return_sql]
|
353
|
+
|
354
|
+
self.conn_exec do |driver|
|
352
355
|
driver.query(sql)
|
353
356
|
end
|
354
357
|
end
|
@@ -376,28 +379,25 @@ class Knj::Db
|
|
376
379
|
end
|
377
380
|
end
|
378
381
|
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
+
sql = "SELECT #{select_sql} FROM #{@sep_table}#{tablename}#{@sep_table}"
|
383
|
+
|
384
|
+
if arr_terms != nil and !arr_terms.empty?
|
385
|
+
sql << " WHERE #{self.makeWhere(arr_terms)}"
|
386
|
+
end
|
387
|
+
|
388
|
+
if args != nil
|
389
|
+
if args["orderby"]
|
390
|
+
sql << " ORDER BY #{args["orderby"]}"
|
391
|
+
end
|
382
392
|
|
383
|
-
if
|
384
|
-
sql << "
|
393
|
+
if args["limit"]
|
394
|
+
sql << " LIMIT #{args["limit"]}"
|
385
395
|
end
|
386
396
|
|
387
|
-
if args
|
388
|
-
if args["
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
if args["limit"]
|
393
|
-
sql << " LIMIT #{args["limit"]}"
|
394
|
-
end
|
395
|
-
|
396
|
-
if args["limit_from"] and args["limit_to"]
|
397
|
-
raise "'limit_from' was not numeric: '#{args["limit_from"]}'." if !Knj::Php.is_numeric(args["limit_from"])
|
398
|
-
raise "'limit_to' was not numeric: '#{args["limit_to"]}'." if !Knj::Php.is_numeric(args["limit_to"])
|
399
|
-
sql << " LIMIT #{args["limit_from"]}, #{args["limit_to"]}"
|
400
|
-
end
|
397
|
+
if args["limit_from"] and args["limit_to"]
|
398
|
+
raise "'limit_from' was not numeric: '#{args["limit_from"]}'." if !Knj::Php.is_numeric(args["limit_from"])
|
399
|
+
raise "'limit_to' was not numeric: '#{args["limit_to"]}'." if !Knj::Php.is_numeric(args["limit_to"])
|
400
|
+
sql << " LIMIT #{args["limit_from"]}, #{args["limit_to"]}"
|
401
401
|
end
|
402
402
|
end
|
403
403
|
|
@@ -438,14 +438,15 @@ class Knj::Db
|
|
438
438
|
#===Examples
|
439
439
|
# db.delete(:users, {:lastname => "Doe"})
|
440
440
|
def delete(tablename, arr_terms, args = nil)
|
441
|
+
sql = "DELETE FROM #{@sep_table}#{tablename}#{@sep_table}"
|
442
|
+
|
443
|
+
if arr_terms != nil and !arr_terms.empty?
|
444
|
+
sql << " WHERE #{self.makeWhere(arr_terms)}"
|
445
|
+
end
|
446
|
+
|
447
|
+
return sql if args and args[:return_sql]
|
448
|
+
|
441
449
|
self.conn_exec do |driver|
|
442
|
-
sql = "DELETE FROM #{driver.escape_table}#{tablename}#{driver.escape_table}"
|
443
|
-
|
444
|
-
if arr_terms != nil and !arr_terms.empty?
|
445
|
-
sql << " WHERE #{self.makeWhere(arr_terms, driver)}"
|
446
|
-
end
|
447
|
-
|
448
|
-
return sql if args and args[:return_sql]
|
449
450
|
driver.query(sql)
|
450
451
|
end
|
451
452
|
|
@@ -456,7 +457,7 @@ class Knj::Db
|
|
456
457
|
#
|
457
458
|
#===Examples
|
458
459
|
# sql = db.makeWhere({:lastname => "Doe"}, driver_obj)
|
459
|
-
def makeWhere(arr_terms, driver)
|
460
|
+
def makeWhere(arr_terms, driver = nil)
|
460
461
|
sql = ""
|
461
462
|
|
462
463
|
first = true
|
@@ -469,11 +470,11 @@ class Knj::Db
|
|
469
470
|
|
470
471
|
if value.is_a?(Array)
|
471
472
|
raise "Array for column '#{key}' was empty." if value.empty?
|
472
|
-
sql << "#{
|
473
|
+
sql << "#{@sep_col}#{key}#{@sep_col} IN (#{Knj::ArrayExt.join(:arr => value, :sep => ",", :surr => "'", :callback => proc{|ele| self.esc(ele)})})"
|
473
474
|
elsif value.is_a?(Hash)
|
474
475
|
raise "Dont know how to handle hash."
|
475
476
|
else
|
476
|
-
sql << "#{
|
477
|
+
sql << "#{@sep_col}#{key}#{@sep_col} = #{@sep_val}#{@esc_driver.escape(value)}#{@sep_val}"
|
477
478
|
end
|
478
479
|
end
|
479
480
|
|
@@ -637,57 +638,27 @@ class Knj::Db
|
|
637
638
|
#===Examples
|
638
639
|
# db.q("INSERT INTO users (name) VALUES ('#{db.esc('John')}')")
|
639
640
|
def escape(string)
|
640
|
-
|
641
|
-
return driver.escape(string)
|
642
|
-
end
|
641
|
+
return @esc_driver.escape(string)
|
643
642
|
end
|
644
643
|
|
645
644
|
alias :esc :escape
|
646
645
|
|
647
646
|
#Escapes the given string to be used as a column.
|
648
647
|
def esc_col(str)
|
649
|
-
|
650
|
-
return driver.esc_col(str)
|
651
|
-
end
|
648
|
+
return @esc_driver.esc_col(str)
|
652
649
|
end
|
653
650
|
|
654
651
|
#Escapes the given string to be used as a table.
|
655
652
|
def esc_table(str)
|
656
|
-
|
657
|
-
return driver.esc_table(str)
|
658
|
-
end
|
659
|
-
end
|
660
|
-
|
661
|
-
#Returns the sign for surrounding the string that should be used as a table.
|
662
|
-
def enc_table
|
663
|
-
if !@enc_table
|
664
|
-
self.conn_exec do |driver|
|
665
|
-
@enc_table = driver.escape_table
|
666
|
-
end
|
667
|
-
end
|
668
|
-
|
669
|
-
return @enc_table
|
670
|
-
end
|
671
|
-
|
672
|
-
#Returns the sign for surrounding the string that should be used as a column.
|
673
|
-
def enc_col
|
674
|
-
if !@enc_col
|
675
|
-
self.conn_exec do |driver|
|
676
|
-
@enc_col = driver.escape_col
|
677
|
-
end
|
678
|
-
end
|
679
|
-
|
680
|
-
return @enc_col
|
653
|
+
return @esc_driver.esc_table(str)
|
681
654
|
end
|
682
655
|
|
683
656
|
#Returns a string which can be used in SQL with the current driver.
|
684
657
|
#===Examples
|
685
658
|
# str = db.date_out(Time.now) #=> "2012-05-20 22:06:09"
|
686
659
|
def date_out(date_obj = Datet.new, args = {})
|
687
|
-
|
688
|
-
|
689
|
-
return driver.date_out(date_obj, args)
|
690
|
-
end
|
660
|
+
if @esc_driver.respond_to?(:date_out)
|
661
|
+
return @esc_driver.date_out(date_obj, args)
|
691
662
|
end
|
692
663
|
|
693
664
|
return Datet.in(date_obj).dbstr(args)
|
@@ -697,10 +668,8 @@ class Knj::Db
|
|
697
668
|
#===Examples
|
698
669
|
# db.date_in('2012-05-20 22:06:09') #=> 2012-05-20 22:06:09 +0200
|
699
670
|
def date_in(date_obj)
|
700
|
-
|
701
|
-
|
702
|
-
return driver.date_in(date_obj)
|
703
|
-
end
|
671
|
+
if @esc_driver.respond_to?(:date_in)
|
672
|
+
return @esc_driver.date_in(date_obj)
|
704
673
|
end
|
705
674
|
|
706
675
|
return Datet.in(date_obj)
|
@@ -708,16 +677,14 @@ class Knj::Db
|
|
708
677
|
|
709
678
|
#Returns the table-module and spawns it if it isnt already spawned.
|
710
679
|
def tables
|
711
|
-
|
712
|
-
if !@
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
)
|
717
|
-
end
|
718
|
-
|
719
|
-
return @tables
|
680
|
+
if !@tables
|
681
|
+
require "#{File.dirname(__FILE__)}/drivers/#{@opts[:type]}/knjdb_#{@opts[:type]}_tables" if (!@opts.key?(:require) or @opts[:require])
|
682
|
+
@tables = Kernel.const_get("KnjDB_#{@opts[:type]}".to_sym).const_get(:Tables).new(
|
683
|
+
:db => self
|
684
|
+
)
|
720
685
|
end
|
686
|
+
|
687
|
+
return @tables
|
721
688
|
end
|
722
689
|
|
723
690
|
#Returns the columns-module and spawns it if it isnt already spawned.
|
@@ -769,11 +736,6 @@ class Knj::Db
|
|
769
736
|
end
|
770
737
|
end
|
771
738
|
|
772
|
-
#Returns the sign to be used for surrounding tables.
|
773
|
-
def col_table
|
774
|
-
return "`"
|
775
|
-
end
|
776
|
-
|
777
739
|
#Optimizes all tables in the database.
|
778
740
|
def optimize(args = nil)
|
779
741
|
STDOUT.puts "Beginning optimization of database." if @debug or (args and args[:debug])
|
data/lib/knj/os.rb
CHANGED
data/lib/knj/php.rb
CHANGED
@@ -219,7 +219,7 @@ module Knj::Php
|
|
219
219
|
end
|
220
220
|
|
221
221
|
def ucwords(string)
|
222
|
-
return string.to_s.split(" ").select
|
222
|
+
return string.to_s.split(" ").select{|w| w.capitalize! or w }.join(" ")
|
223
223
|
end
|
224
224
|
|
225
225
|
def strtoupper(str)
|
@@ -703,7 +703,7 @@ module Knj::Php
|
|
703
703
|
hour = cur_time.hour if hour == nil
|
704
704
|
min = cur_time.min if min == nil
|
705
705
|
sec = cur_time.sec if sec == nil
|
706
|
-
date = cur_time.
|
706
|
+
date = cur_time.day if date == nil
|
707
707
|
month = cur_time.month if month == nil
|
708
708
|
year = cur_time.year if year == nil
|
709
709
|
|
data/lib/knj/process_meta.rb
CHANGED
data/lib/knj/threadhandler.rb
CHANGED
@@ -65,8 +65,9 @@ class Knj::Threadhandler
|
|
65
65
|
|
66
66
|
def check_inactive
|
67
67
|
raise "Destroyed Knj::Threadhandler." if !@mutex
|
68
|
+
cur_time = Time.now.to_i - @args[:timeout]
|
69
|
+
|
68
70
|
@mutex.synchronize do
|
69
|
-
cur_time = Time.now.to_i - @args[:timeout]
|
70
71
|
@objects.each do |data|
|
71
72
|
if data[:free] and !data[:inactive] and data[:free] < cur_time
|
72
73
|
@inactive_blocks.each do |block|
|
@@ -81,46 +82,48 @@ class Knj::Threadhandler
|
|
81
82
|
def get_and_lock
|
82
83
|
raise "Destroyed Knj::Threadhandler." if !@mutex
|
83
84
|
newobj = nil
|
84
|
-
sleep_do = false
|
85
85
|
|
86
86
|
begin
|
87
|
+
retdata = nil
|
88
|
+
|
87
89
|
@mutex.synchronize do
|
88
|
-
retdata = false
|
89
90
|
@objects.each do |data|
|
90
91
|
if data[:free]
|
91
92
|
retdata = data
|
92
93
|
break
|
93
94
|
end
|
94
95
|
end
|
96
|
+
end
|
97
|
+
|
98
|
+
if retdata
|
99
|
+
#Test if object is still free - if not, try again - knj.
|
100
|
+
return get_and_lock if !retdata[:free]
|
101
|
+
retdata[:free] = false
|
95
102
|
|
96
|
-
if retdata
|
97
|
-
|
98
|
-
|
99
|
-
retdata[:free] = false
|
100
|
-
|
101
|
-
if retdata[:inactive]
|
102
|
-
@activate_blocks.each do |block|
|
103
|
-
block.call(:obj => retdata[:object])
|
104
|
-
end
|
105
|
-
|
106
|
-
retdata.delete(:inactive)
|
103
|
+
if retdata[:inactive]
|
104
|
+
@activate_blocks.each do |block|
|
105
|
+
block.call(:obj => retdata[:object])
|
107
106
|
end
|
108
107
|
|
109
|
-
|
108
|
+
retdata.delete(:inactive)
|
110
109
|
end
|
111
110
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
111
|
+
return retdata[:object]
|
112
|
+
end
|
113
|
+
|
114
|
+
if @objects.length >= @args[:max]
|
115
|
+
#The maximum amount of objects has already been spawned... Sleep 0.1 sec and try to lock an object again...
|
116
|
+
raise Knj::Errors::Retry
|
117
|
+
else
|
118
|
+
#No free objects, but we can spawn a new one and use that...
|
119
|
+
newobj = @spawn_new_block.call
|
120
|
+
@mutex.synchronize do
|
118
121
|
@objects << Tsafe::MonHash.new.merge(
|
119
122
|
:free => false,
|
120
123
|
:object => newobj
|
121
124
|
)
|
122
|
-
STDOUT.print "Spawned db and locked new.\n" if @args[:debug]
|
123
125
|
end
|
126
|
+
STDOUT.print "Spawned db and locked new.\n" if @args[:debug]
|
124
127
|
end
|
125
128
|
|
126
129
|
return newobj
|
data/lib/knj/web.rb
CHANGED
@@ -389,11 +389,17 @@ class Knj::Web
|
|
389
389
|
elsif args[:type] == :fckeditor
|
390
390
|
args[:height] = 400 if !args[:height]
|
391
391
|
|
392
|
-
require "/usr/share/fckeditor/fckeditor.rb"
|
392
|
+
require "/usr/share/fckeditor/fckeditor.rb" if !Kernel.const_defined?(:FCKeditor)
|
393
393
|
fck = FCKeditor.new(args[:name])
|
394
394
|
fck.Height = args[:height].to_i
|
395
395
|
fck.Value = value
|
396
396
|
html << fck.CreateHtml
|
397
|
+
elsif args[:type] == :ckeditor
|
398
|
+
args[:height] = 400 if !args[:height]
|
399
|
+
require "ckeditor4ruby" if !Kernel.const_defined?(:CKEditor)
|
400
|
+
ck = CKEditor.new
|
401
|
+
ck.return_output = true
|
402
|
+
html << ck.editor(args[:name], value)
|
397
403
|
elsif args[:type] == :select
|
398
404
|
attr["multiple"] = "multiple" if args[:multiple]
|
399
405
|
attr["size"] = args["size"] if args[:size]
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: knjrbfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.67
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-24 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -91,7 +91,7 @@ dependencies:
|
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: *id007
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
94
|
+
name: sqlite3
|
95
95
|
requirement: &id008 !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
97
97
|
requirements:
|
@@ -102,7 +102,7 @@ dependencies:
|
|
102
102
|
prerelease: false
|
103
103
|
version_requirements: *id008
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
105
|
+
name: rmagick
|
106
106
|
requirement: &id009 !ruby/object:Gem::Requirement
|
107
107
|
none: false
|
108
108
|
requirements:
|
@@ -112,17 +112,6 @@ dependencies:
|
|
112
112
|
type: :development
|
113
113
|
prerelease: false
|
114
114
|
version_requirements: *id009
|
115
|
-
- !ruby/object:Gem::Dependency
|
116
|
-
name: rmagick
|
117
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
118
|
-
none: false
|
119
|
-
requirements:
|
120
|
-
- - ">="
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: "0"
|
123
|
-
type: :development
|
124
|
-
prerelease: false
|
125
|
-
version_requirements: *id010
|
126
115
|
description: Including stuff for HTTP, SSH and much more.
|
127
116
|
email: k@spernj.org
|
128
117
|
executables: []
|
@@ -399,7 +388,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
399
388
|
requirements:
|
400
389
|
- - ">="
|
401
390
|
- !ruby/object:Gem::Version
|
402
|
-
hash:
|
391
|
+
hash: 1657712883441742083
|
403
392
|
segments:
|
404
393
|
- 0
|
405
394
|
version: "0"
|