Rubernate 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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