knjrbfw 0.0.66 → 0.0.67
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.
- 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"
|