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.
@@ -6,7 +6,7 @@ module Rubernate
6
6
  module Callbacks
7
7
  # This module contains callback methods and
8
8
  # included in all persisten classes.
9
- module Entity
9
+ module Persistent
10
10
  # Invoked if object has just been created in database.
11
11
  def on_create
12
12
  end
@@ -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
- TimeType = ::DBI::Timestamp
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
- "runtime impl: #{@klass}, db_url: #{@db_url}, db_user: #{@db_user}, db_password: #{@db_password}"
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 Entity: save_ref sth, pk, name, param
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
@@ -114,7 +114,7 @@ module Memory
114
114
 
115
115
  def save_param value
116
116
  case value
117
- when Entity:
117
+ when Persistent:
118
118
  Reference.new value.primary_key, value.class
119
119
  when Array:
120
120
  value.collect{ |item| Reference.new item.primary_key, item.class }
@@ -43,7 +43,7 @@ class Class
43
43
  # Creates persistent property in a class
44
44
  # The class MUST have an empty constructor.
45
45
  def persistent *props
46
- include Rubernate::Entity
46
+ include Rubernate::Persistent
47
47
  for prop in props
48
48
  define_accessor prop
49
49
  end
@@ -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 Entity
4
+ module Persistent
5
5
  include Rubernate
6
- include Callbacks::Entity
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? Entity
57
+ return self.primary_key == other.primary_key if other.is_a? Persistent
58
58
  super
59
59
  end
60
60
  }
@@ -2,7 +2,7 @@
2
2
  module Rubernate
3
3
  module Queries
4
4
  # Log instance for Queries
5
- Log = Log4r::Logger.new self.name
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
- @exprs.inject([]){|result, expr| result.concat expr.markers}
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
- eval_query
381
- sql = "select #{@main.to_sql}.* from #{tables_sql}"
382
- sql+= "\n\twhere #{where_sql}"
383
- sql+= "\n\torder by #{order_by_sql}" unless @order.empty?
384
- dbg_query sql
385
- sql
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 dbg_query sql
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
- @evaluated = true
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
@@ -4,7 +4,7 @@ module Rubernate
4
4
  include Callbacks::Runtime
5
5
 
6
6
  # Log for Runtime events
7
- Log = Log4r::Logger.new self.name
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 : FakeEntity.new(klass)
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::Entity: p.primary_key
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 fake entity. - objects whose class wasn't found during loading.
210
- class FakeEntity
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 Entity: #{primaty_key}, for class: #{@class_name}"
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/dbioracle_test' if $run_oracle_tests
12
- require 'rubernate/impl/dbimysql_test' if $run_mysql_tests
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
- $level = Log4r::DEBUG
19
- $outputter = Log4r::FileOutputter.new 'file',
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::Entity
18
- module Entity
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/dbigeneric_stub'
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/dbigeneric_stub'
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?(Entity)
25
- assert C1.include?(Entity)
26
- assert C2.include?(Entity)
27
- assert C3.include?(Entity)
28
- assert !C0.new.kind_of?(Entity)
29
- assert C1.new.kind_of?(Entity)
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
- assert_nil Rubernate.runtime
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 FakeEntity, o.class
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(NoMethodError) {o.p1}
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.2
7
- date: 2006-03-10 00:00:00 +03:00
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/dbigeneric.rb
42
- - lib/rubernate/impl/dbimysql.rb
43
- - lib/rubernate/impl/dbioracle.rb
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/dbigeneric_stub.rb
58
- - tests/rubernate/impl/dbimysql_test.rb
59
- - tests/rubernate/impl/dbioracle_test.rb
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