Rubernate 0.1.2 → 0.1.3
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/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
|