Rubernate 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rubernate/callbacks.rb +1 -1
- data/lib/rubernate/impl/{dbigeneric.rb → dbi_generic.rb} +8 -8
- data/lib/rubernate/impl/memory.rb +1 -1
- data/lib/rubernate/mixins.rb +1 -1
- data/lib/rubernate/{entity.rb → persistent.rb} +3 -3
- data/lib/rubernate/queries.rb +24 -12
- data/lib/rubernate/runtime.rb +6 -6
- data/lib/rubernate.rb +17 -15
- data/tests/all_tests.rb +2 -2
- data/tests/config.rb +3 -16
- data/tests/rubernate/callbacks_test.rb +2 -2
- data/tests/rubernate/impl/{dbimysql_test.rb → dbi_mysql_test.rb} +1 -1
- data/tests/rubernate/impl/{dbioracle_test.rb → dbi_oracle_test.rb} +1 -1
- data/tests/rubernate/rubernate_test.rb +9 -9
- metadata +9 -9
- /data/lib/rubernate/impl/{dbimysql.rb → dbi_mysql.rb} +0 -0
- /data/lib/rubernate/impl/{dbioracle.rb → dbi_oracle.rb} +0 -0
- /data/tests/rubernate/impl/{dbigeneric_stub.rb → dbi_generic_stub.rb} +0 -0
data/lib/rubernate/callbacks.rb
CHANGED
@@ -20,10 +20,8 @@ module DBI
|
|
20
20
|
HASH_STRING_REF = (PARAM_FLAG_HASH | PARAM_FLAG_STRING).to_i
|
21
21
|
HASH_TIME_REF = (PARAM_FLAG_HASH | PARAM_FLAG_TIME).to_i
|
22
22
|
HASH_DATE_REF = (PARAM_FLAG_HASH | PARAM_FLAG_DATE).to_i
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
# Holds configuration information and serves as factory for Runtime objects.
|
23
|
+
|
24
|
+
# Holds configuration information and serves as factory for Runtime objects.
|
27
25
|
class Configuration
|
28
26
|
# Accepts Runtime impl class, db initializer class, database url, user name, and user password
|
29
27
|
def initialize klass, init, db_url, db_user, db_password
|
@@ -36,8 +34,7 @@ module DBI
|
|
36
34
|
@klass.new connect
|
37
35
|
end
|
38
36
|
|
39
|
-
# Creates connection and pass it in block if present
|
40
|
-
# else return it if there is no block given.
|
37
|
+
# Creates database connection and pass it in block if present else returns it
|
41
38
|
def connect
|
42
39
|
return ::DBI.connect(@db_url, @db_user, @db_password, @params) unless block_given?
|
43
40
|
::DBI.connect(@db_url, @db_user, @db_password, @params) { |dbh| yield dbh }
|
@@ -49,10 +46,13 @@ module DBI
|
|
49
46
|
end
|
50
47
|
|
51
48
|
def to_s
|
52
|
-
"
|
49
|
+
"Impl: #{@klass}, db_url: #{@db_url}, db_user: #{@db_user}, db_password: #{@db_password}"
|
53
50
|
end
|
54
51
|
end
|
55
52
|
|
53
|
+
|
54
|
+
TimeType = ::DBI::Timestamp
|
55
|
+
|
56
56
|
# Represent base class for all Runtime implementation.
|
57
57
|
# Contains generic sql implementations of all required methods except create.
|
58
58
|
#Method create should be implemented in subclasses.
|
@@ -186,7 +186,7 @@ module DBI
|
|
186
186
|
private
|
187
187
|
def save_param sth, pk, name, param
|
188
188
|
case param
|
189
|
-
when
|
189
|
+
when Persistent: save_ref sth, pk, name, param
|
190
190
|
when Hash: save_hash sth, pk, name, param
|
191
191
|
when Array: save_array sth, pk, name, param
|
192
192
|
when Integer: save_int sth, pk, name, param
|
data/lib/rubernate/mixins.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Rubernate
|
2
2
|
|
3
3
|
# This module contains methods that will be included into persistent objects
|
4
|
-
module
|
4
|
+
module Persistent
|
5
5
|
include Rubernate
|
6
|
-
include Callbacks::
|
6
|
+
include Callbacks::Persistent
|
7
7
|
|
8
8
|
# This property holds objects primary key.
|
9
9
|
# The primary key is not nil for objects attached to session.
|
@@ -54,7 +54,7 @@ module Entity
|
|
54
54
|
def self.included klass
|
55
55
|
klass.module_eval %{
|
56
56
|
def == other
|
57
|
-
return self.primary_key == other.primary_key if other.is_a?
|
57
|
+
return self.primary_key == other.primary_key if other.is_a? Persistent
|
58
58
|
super
|
59
59
|
end
|
60
60
|
}
|
data/lib/rubernate/queries.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
module Rubernate
|
3
3
|
module Queries
|
4
4
|
# Log instance for Queries
|
5
|
-
Log =
|
5
|
+
Log = Rubernate::Log
|
6
6
|
|
7
7
|
# Re-Expr express prefix that starts all queries on RQL.
|
8
8
|
RQL_PREFIX_REGEXP = /^\s*Select\s+:/
|
@@ -65,6 +65,7 @@ module Queries
|
|
65
65
|
#
|
66
66
|
# New implementations of elements MUST accept factory as it's first parameter.
|
67
67
|
class Factory
|
68
|
+
attr_reader :cache # Queries cache. TODO: limit size!
|
68
69
|
# Initalizes default implementations
|
69
70
|
def initialize
|
70
71
|
@expr = Generic::Expr
|
@@ -76,6 +77,7 @@ module Queries
|
|
76
77
|
@r_param = Generic::RParam
|
77
78
|
@r_object = Generic::RObject
|
78
79
|
@query = Generic::Query
|
80
|
+
@cache = {}
|
79
81
|
end
|
80
82
|
def query query=nil, &block
|
81
83
|
@query.new self, query, &block
|
@@ -364,9 +366,10 @@ module Queries
|
|
364
366
|
@order.concat exprs
|
365
367
|
end
|
366
368
|
|
367
|
-
# Returns markers used in query in valid order
|
369
|
+
# Returns markers used in query in valid order.
|
368
370
|
def markers
|
369
|
-
|
371
|
+
to_sql unless @sql
|
372
|
+
@markers ||= @exprs.inject([]){|result, expr| result.concat expr.markers}
|
370
373
|
end
|
371
374
|
|
372
375
|
# Arranges map: values {marker=>value} to ordered array of values
|
@@ -377,17 +380,23 @@ module Queries
|
|
377
380
|
|
378
381
|
# Generates SQL for entire query.
|
379
382
|
def to_sql
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
383
|
+
return @sql if @sql
|
384
|
+
if @query.is_a? String
|
385
|
+
@sql, @markers = @factory.cache[@query]
|
386
|
+
unless @sql
|
387
|
+
@sql = eval_query
|
388
|
+
@markers = @exprs.inject([]){|result, expr| result.concat expr.markers}
|
389
|
+
@factory.cache[@query] = [@sql, @markers]
|
390
|
+
end
|
391
|
+
else
|
392
|
+
@sql = eval_query
|
393
|
+
end
|
394
|
+
@sql
|
386
395
|
end
|
387
396
|
|
388
397
|
private
|
389
398
|
# Prints debug message
|
390
|
-
def
|
399
|
+
def log_debug_query sql
|
391
400
|
return unless Log.debug?
|
392
401
|
query = @query.is_a?(Proc) ? 'query given as block' : @query
|
393
402
|
Log.debug "Translate: <<#{query}>> to sql: <<#{sql}>>"
|
@@ -395,13 +404,16 @@ module Queries
|
|
395
404
|
|
396
405
|
# Evaluates query withing the object context.
|
397
406
|
def eval_query
|
398
|
-
return if @evaluated
|
399
407
|
if @query.is_a? Proc
|
400
408
|
instance_eval(&@query)
|
401
409
|
else
|
402
410
|
instance_eval @query
|
403
411
|
end
|
404
|
-
|
412
|
+
sql = "select #{@main.to_sql}.* from #{tables_sql}"
|
413
|
+
sql+= "\n\twhere #{where_sql}"
|
414
|
+
sql+= "\n\torder by #{order_by_sql}" unless @order.empty?
|
415
|
+
log_debug_query sql
|
416
|
+
sql
|
405
417
|
end
|
406
418
|
|
407
419
|
# Generates where clause for each expression joined by and clause
|
data/lib/rubernate/runtime.rb
CHANGED
@@ -4,7 +4,7 @@ module Rubernate
|
|
4
4
|
include Callbacks::Runtime
|
5
5
|
|
6
6
|
# Log for Runtime events
|
7
|
-
Log =
|
7
|
+
Log = Rubernate::Log
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@pool = {} # Contains objects loaded during the session
|
@@ -121,7 +121,7 @@ module Rubernate
|
|
121
121
|
object = @pool[pk]
|
122
122
|
unless object
|
123
123
|
clazz = klass.is_a?(Class) ? klass : get_class(klass)
|
124
|
-
object = clazz ? clazz.allocate :
|
124
|
+
object = clazz ? clazz.allocate : DummyPersistent.new(klass)
|
125
125
|
object.primary_key = pk
|
126
126
|
@pool[pk] = object
|
127
127
|
end
|
@@ -199,15 +199,15 @@ module Rubernate
|
|
199
199
|
|
200
200
|
def native_param p
|
201
201
|
case p
|
202
|
-
when Rubernate::
|
202
|
+
when Rubernate::Persistent: p.primary_key
|
203
203
|
when Class: p.name
|
204
204
|
else p
|
205
205
|
end
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
-
# Represetns
|
210
|
-
class
|
209
|
+
# Represetns Dummy Persistent. - objects whose class wasn't found during loading.
|
210
|
+
class DummyPersistent
|
211
211
|
persistent
|
212
212
|
def initialize class_name
|
213
213
|
@class_name = class_name
|
@@ -216,7 +216,7 @@ module Rubernate
|
|
216
216
|
raise ObjectLoadError.new("class: #{@class_name} not found for object: #{primary_key}")
|
217
217
|
end
|
218
218
|
def to_s
|
219
|
-
"Fake
|
219
|
+
"Fake Persistent: #{primaty_key}, for class: #{@class_name}"
|
220
220
|
end
|
221
221
|
end
|
222
222
|
end
|
data/lib/rubernate.rb
CHANGED
@@ -23,19 +23,6 @@ $:.unshift File.dirname(__FILE__) unless
|
|
23
23
|
$:.include? File.dirname(__FILE__)
|
24
24
|
|
25
25
|
require 'log4r'
|
26
|
-
require 'rubernate/mixins'
|
27
|
-
require 'rubernate/callbacks'
|
28
|
-
require 'rubernate/entity'
|
29
|
-
require 'rubernate/peer'
|
30
|
-
require 'rubernate/runtime'
|
31
|
-
require 'rubernate/impl/dbigeneric'
|
32
|
-
require 'rubernate/queries'
|
33
|
-
require 'rubernate/impl/memory'
|
34
|
-
require 'rubernate/impl/dbimysql'
|
35
|
-
require 'rubernate/impl/dbioracle'
|
36
|
-
require 'rubernate/init/init_mysql'
|
37
|
-
require 'rubernate/init/init_oracle'
|
38
|
-
|
39
26
|
|
40
27
|
|
41
28
|
# Contains most useful methods. This module is included
|
@@ -44,6 +31,19 @@ module Rubernate
|
|
44
31
|
# Common Rubernate Log instance
|
45
32
|
Log = Log4r::Logger.new self.name
|
46
33
|
|
34
|
+
require 'rubernate/mixins'
|
35
|
+
require 'rubernate/callbacks'
|
36
|
+
require 'rubernate/persistent'
|
37
|
+
require 'rubernate/peer'
|
38
|
+
require 'rubernate/runtime'
|
39
|
+
require 'rubernate/impl/dbi_generic'
|
40
|
+
require 'rubernate/queries'
|
41
|
+
require 'rubernate/impl/memory'
|
42
|
+
require 'rubernate/impl/dbi_mysql'
|
43
|
+
require 'rubernate/impl/dbi_oracle'
|
44
|
+
require 'rubernate/init/init_mysql'
|
45
|
+
require 'rubernate/init/init_oracle'
|
46
|
+
|
47
47
|
# Rubernate core singelton methods.
|
48
48
|
class << self
|
49
49
|
# Allows you setup Rubernate by yours implementaion of Configuration.
|
@@ -52,7 +52,7 @@ module Rubernate
|
|
52
52
|
Log.info "Rubernate configured by #{config}"
|
53
53
|
@factory = config
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# Performs configuration of Rubernate.
|
57
57
|
# * db - database type (:mysql, :oracle).
|
58
58
|
# * url - url of database.
|
@@ -75,7 +75,9 @@ module Rubernate
|
|
75
75
|
# Returns Runtime object associated with current session
|
76
76
|
# or nil if session does not excists
|
77
77
|
def runtime
|
78
|
-
Thread.current[:Rubernate]
|
78
|
+
rt = Thread.current[:Rubernate]
|
79
|
+
raise "Session doesn't exists" unless rt
|
80
|
+
rt
|
79
81
|
end
|
80
82
|
|
81
83
|
# Checks if session exists
|
data/tests/all_tests.rb
CHANGED
@@ -8,5 +8,5 @@ require 'rubernate/utils_test'
|
|
8
8
|
require 'rubernate/queries_test'
|
9
9
|
require 'rubernate/impl/memory_test'
|
10
10
|
require 'rubernate/callbacks_test'
|
11
|
-
require 'rubernate/impl/
|
12
|
-
require 'rubernate/impl/
|
11
|
+
require 'rubernate/impl/dbi_oracle_test' if $run_oracle_tests
|
12
|
+
require 'rubernate/impl/dbi_mysql_test' if $run_mysql_tests
|
data/tests/config.rb
CHANGED
@@ -15,20 +15,7 @@ MYSQL_DB_USER = nil
|
|
15
15
|
MYSQL_DB_PWD = nil
|
16
16
|
|
17
17
|
# Log4r configuration
|
18
|
-
|
19
|
-
|
18
|
+
Rubernate::Log.level = Log4r::DEBUG
|
19
|
+
Rubernate::Log.add Log4r::FileOutputter.new('file',
|
20
20
|
:filename => File.dirname(__FILE__) + "/../logs/#{$0}.log",
|
21
|
-
:trunc => true
|
22
|
-
|
23
|
-
# TODO: make external log configuration
|
24
|
-
# Update level for all logs needed
|
25
|
-
module Rubernate
|
26
|
-
Log.add $outputter
|
27
|
-
Log.level = $level
|
28
|
-
class Runtime
|
29
|
-
Log.level = $level
|
30
|
-
end
|
31
|
-
module Queries
|
32
|
-
Log.level = $level
|
33
|
-
end
|
34
|
-
end
|
21
|
+
:trunc => true)
|
@@ -14,8 +14,8 @@ module Rubernate
|
|
14
14
|
end
|
15
15
|
clear
|
16
16
|
|
17
|
-
# This module contains callback methods and included in module Rubernate::
|
18
|
-
module
|
17
|
+
# This module contains callback methods and included in module Rubernate::Persistent
|
18
|
+
module Persistent
|
19
19
|
def on_create
|
20
20
|
Callbacks.handlers << :on_create
|
21
21
|
Callbacks.events << Event.new(self)
|
@@ -2,7 +2,7 @@ $:.unshift(File.expand_path('../../..', __FILE__)) unless
|
|
2
2
|
$:.include?(File.expand_path('../../..', __FILE__))
|
3
3
|
|
4
4
|
require 'rubernate/fixtures'
|
5
|
-
require 'rubernate/impl/
|
5
|
+
require 'rubernate/impl/dbi_generic_stub'
|
6
6
|
|
7
7
|
class Rubernate::DBI::MysqlTest < Test::Unit::TestCase
|
8
8
|
include Rubernate::DBI::GenericTests
|
@@ -2,7 +2,7 @@ $:.unshift(File.expand_path('../../..', __FILE__)) unless
|
|
2
2
|
$:.include?(File.expand_path('../../..', __FILE__))
|
3
3
|
|
4
4
|
require 'rubernate/fixtures'
|
5
|
-
require 'rubernate/impl/
|
5
|
+
require 'rubernate/impl/dbi_generic_stub'
|
6
6
|
|
7
7
|
class Rubernate::DBI::OracleTest < Test::Unit::TestCase
|
8
8
|
include Rubernate::DBI::GenericTests
|
@@ -21,12 +21,12 @@ class Rubernate::RubernateTest < Test::Unit::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_include
|
24
|
-
assert !C0.include?(
|
25
|
-
assert C1.include?(
|
26
|
-
assert C2.include?(
|
27
|
-
assert C3.include?(
|
28
|
-
assert !C0.new.kind_of?(
|
29
|
-
assert C1.new.kind_of?(
|
24
|
+
assert !C0.include?(Persistent)
|
25
|
+
assert C1.include?(Persistent)
|
26
|
+
assert C2.include?(Persistent)
|
27
|
+
assert C3.include?(Persistent)
|
28
|
+
assert !C0.new.kind_of?(Persistent)
|
29
|
+
assert C1.new.kind_of?(Persistent)
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_properties
|
@@ -72,7 +72,7 @@ class Rubernate::RubernateTest < Test::Unit::TestCase
|
|
72
72
|
}
|
73
73
|
assert_equal 'passed', Thread.current[:close_test]
|
74
74
|
assert_equal 'passed', Thread.current[:failed_test]
|
75
|
-
|
75
|
+
assert_raise(RuntimeError) {Rubernate.runtime}
|
76
76
|
end
|
77
77
|
|
78
78
|
def test_find_and_load
|
@@ -289,7 +289,7 @@ class Rubernate::BaseRuntimeTest < Test::Unit::TestCase
|
|
289
289
|
@factory.database = {27 => ['NoSuchClass', {}]}
|
290
290
|
Rubernate.session do
|
291
291
|
o = find_by_pk 27
|
292
|
-
assert_equal
|
292
|
+
assert_equal DummyPersistent, o.class
|
293
293
|
assert_equal 27, o.primary_key
|
294
294
|
assert_raise(ObjectLoadError) {o.test}
|
295
295
|
end
|
@@ -307,7 +307,7 @@ class Rubernate::BaseRuntimeTest < Test::Unit::TestCase
|
|
307
307
|
o = C1.new
|
308
308
|
assert_nothing_raised() {o.p1}
|
309
309
|
o, o.peer = C1.new, nil
|
310
|
-
assert_raise(
|
310
|
+
assert_raise(RuntimeError) {o.p1}
|
311
311
|
o, o.peer = C1.new, Peer.new
|
312
312
|
assert_nothing_raised() {o.p1}
|
313
313
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: Rubernate
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-03-
|
6
|
+
version: 0.1.3
|
7
|
+
date: 2006-03-13 00:00:00 +03:00
|
8
8
|
summary: Object-oriented storage for Ruby objects based on relational database model
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,16 +31,16 @@ files:
|
|
31
31
|
- lib/rubernate
|
32
32
|
- lib/rubernate.rb
|
33
33
|
- lib/rubernate/callbacks.rb
|
34
|
-
- lib/rubernate/entity.rb
|
35
34
|
- lib/rubernate/impl
|
36
35
|
- lib/rubernate/init
|
37
36
|
- lib/rubernate/mixins.rb
|
38
37
|
- lib/rubernate/peer.rb
|
38
|
+
- lib/rubernate/persistent.rb
|
39
39
|
- lib/rubernate/queries.rb
|
40
40
|
- lib/rubernate/runtime.rb
|
41
|
-
- lib/rubernate/impl/
|
42
|
-
- lib/rubernate/impl/
|
43
|
-
- lib/rubernate/impl/
|
41
|
+
- lib/rubernate/impl/dbi_generic.rb
|
42
|
+
- lib/rubernate/impl/dbi_mysql.rb
|
43
|
+
- lib/rubernate/impl/dbi_oracle.rb
|
44
44
|
- lib/rubernate/impl/memory.rb
|
45
45
|
- lib/rubernate/init/init_mysql.rb
|
46
46
|
- lib/rubernate/init/init_oracle.rb
|
@@ -54,9 +54,9 @@ files:
|
|
54
54
|
- tests/rubernate/queries_test.rb
|
55
55
|
- tests/rubernate/rubernate_test.rb
|
56
56
|
- tests/rubernate/utils_test.rb
|
57
|
-
- tests/rubernate/impl/
|
58
|
-
- tests/rubernate/impl/
|
59
|
-
- tests/rubernate/impl/
|
57
|
+
- tests/rubernate/impl/dbi_generic_stub.rb
|
58
|
+
- tests/rubernate/impl/dbi_mysql_test.rb
|
59
|
+
- tests/rubernate/impl/dbi_oracle_test.rb
|
60
60
|
- tests/rubernate/impl/memory_test.rb
|
61
61
|
- README
|
62
62
|
test_files:
|
File without changes
|
File without changes
|
File without changes
|