og 0.15.0 → 0.16.0

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.
Files changed (46) hide show
  1. data/CHANGELOG +77 -0
  2. data/INSTALL +3 -0
  3. data/README +5 -3
  4. data/Rakefile +148 -5
  5. data/benchmark/bench.rb +1 -1
  6. data/doc/AUTHORS +4 -4
  7. data/doc/RELEASES +41 -1
  8. data/examples/mock_example.rb +1 -1
  9. data/examples/mysql_to_psql.rb +1 -1
  10. data/examples/run.rb +1 -1
  11. data/install.rb +1 -1
  12. data/lib/og.rb +4 -2
  13. data/lib/og/{adapter.rb → adapters/base.rb} +334 -152
  14. data/lib/og/adapters/filesys.rb +3 -7
  15. data/lib/og/adapters/mysql.rb +5 -9
  16. data/lib/og/adapters/oracle.rb +5 -9
  17. data/lib/og/adapters/psql.rb +5 -9
  18. data/lib/og/adapters/sqlite.rb +5 -9
  19. data/lib/og/adapters/sqlserver.rb +5 -9
  20. data/lib/og/database.rb +13 -11
  21. data/lib/og/enchant.rb +1 -1
  22. data/lib/og/errors.rb +21 -0
  23. data/lib/og/meta.rb +10 -9
  24. data/lib/og/mixins/hierarchical.rb +4 -4
  25. data/lib/og/mixins/orderable.rb +1 -1
  26. data/lib/og/mixins/timestamped.rb +24 -0
  27. data/lib/og/mixins/tree.rb +3 -1
  28. data/lib/og/testing/mock.rb +2 -2
  29. data/lib/og/typemacros.rb +1 -1
  30. data/lib/og/validation.rb +4 -4
  31. data/test/og/{tc_filesys.rb → adapters/tc_filesys.rb} +1 -1
  32. data/test/og/{tc_sqlite.rb → adapters/tc_sqlite.rb} +3 -4
  33. data/test/og/{tc_sqlserver.rb → adapters/tc_sqlserver.rb} +5 -2
  34. data/test/og/mixins/tc_hierarchical.rb +0 -1
  35. data/test/og/mixins/tc_orderable.rb +0 -1
  36. data/test/og/tc_automanage.rb +3 -2
  37. data/test/og/tc_lifecycle.rb +15 -14
  38. data/test/og/tc_many_to_many.rb +0 -1
  39. data/test/og/tc_meta.rb +5 -5
  40. data/test/og/tc_validation.rb +1 -1
  41. data/test/tc_og.rb +0 -20
  42. metadata +33 -34
  43. data/examples/test.db +0 -0
  44. data/lib/og/connection.rb +0 -325
  45. data/lib/og/observer.rb +0 -53
  46. data/test/og/tc_observer.rb +0 -85
@@ -1,12 +1,10 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: filesys.rb 281 2005-03-10 12:24:14Z gmosx $
3
+ # $Id: filesys.rb 17 2005-04-14 16:03:40Z gmosx $
4
4
 
5
5
  require 'fileutils'
6
6
 
7
- require 'og/adapter'
8
- require 'og/connection'
9
- require 'glue/attribute'
7
+ require 'og/adapters/base'
10
8
 
11
9
  module Og
12
10
 
@@ -40,17 +38,15 @@ class FilesysAdapter < Adapter
40
38
  end
41
39
  end
42
40
 
43
- def insert_code(klass, db, pre_cb, post_cb)
41
+ def insert_code(klass, db)
44
42
  props = props_for_insert(klass)
45
43
  values = props.collect { |p| write_prop(p) }.join(',')
46
44
 
47
45
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values})"
48
46
 
49
47
  %{
50
- #{pre_cb}
51
48
  conn.store.query("#{sql}").close
52
49
  @oid = conn.store.last_insert_row_id
53
- #{post_cb}
54
50
  }
55
51
  end
56
52
 
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: mysql.rb 326 2005-03-28 11:07:17Z gmosx $
3
+ # $Id: mysql.rb 17 2005-04-14 16:03:40Z gmosx $
4
4
 
5
5
  begin
6
6
  require 'mysql'
@@ -9,9 +9,7 @@ rescue Object => ex
9
9
  Logger.error ex
10
10
  end
11
11
 
12
- require 'og/adapter'
13
- require 'og/connection'
14
- require 'glue/attribute'
12
+ require 'og/adapters/base'
15
13
 
16
14
  module Og
17
15
 
@@ -94,18 +92,16 @@ class MysqlAdapter < Adapter
94
92
  klass.__props.reject { |p| :oid == p.symbol }
95
93
  end
96
94
 
97
- def insert_code(klass, db, pre_cb, post_cb)
95
+ def insert_code(klass, db)
98
96
  props = props_for_insert(klass)
99
97
  values = props.collect { |p| write_prop(p) }.join(',')
100
98
 
101
99
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values})"
102
100
 
103
101
  %{
104
- #{pre_cb}
105
102
  conn.store.query_with_result = false
106
103
  conn.store.query "#{sql}"
107
104
  @oid = conn.store.insert_id()
108
- #{post_cb}
109
105
  }
110
106
  end
111
107
 
@@ -314,7 +310,7 @@ class MysqlConnection < Connection
314
310
  return nil unless valid_res?(res)
315
311
 
316
312
  row = res.fetch_row
317
- obj = klass.new
313
+ obj = klass.allocate
318
314
  obj.og_read(row)
319
315
 
320
316
  res.free
@@ -329,7 +325,7 @@ class MysqlConnection < Connection
329
325
  for tuple in (0...res.num_rows)
330
326
  row = res.fetch_row
331
327
 
332
- obj = klass.new
328
+ obj = klass.allocate
333
329
  obj.og_read(row)
334
330
 
335
331
  objects << obj
@@ -1,7 +1,7 @@
1
1
  # * Matt Bowen <matt.bowen@farweststeel.com>
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  # (c) 2004-2005 Navel, all rights reserved.
4
- # $Id: oracle.rb 337 2005-03-31 16:20:40Z gmosx $
4
+ # $Id: oracle.rb 17 2005-04-14 16:03:40Z gmosx $
5
5
 
6
6
  begin
7
7
  require 'oracle'
@@ -10,9 +10,7 @@ rescue
10
10
  Logger.error ex
11
11
  end
12
12
 
13
- require 'og/adapter'
14
- require 'og/connection'
15
- require 'glue/attribute'
13
+ require 'og/adapters/base'
16
14
 
17
15
  module Og
18
16
 
@@ -86,19 +84,17 @@ class OracleAdapter < Adapter
86
84
  super
87
85
  end
88
86
 
89
- def insert_code(klass, db, pre_cb, post_cb)
87
+ def insert_code(klass, db)
90
88
  props = props_for_insert(klass)
91
89
  values = props.collect { |p| write_prop(p) }.join(',')
92
90
 
93
91
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values})"
94
92
 
95
93
  %{
96
- #{pre_cb}
97
94
  res = conn.store.exec("SELECT #{klass::DBSEQ}.nextval FROM DUAL")
98
95
  @oid = res.fetch[0].to_i
99
96
  res.close
100
97
  conn.exec "#{sql}"
101
- #{post_cb}
102
98
  }
103
99
  end
104
100
 
@@ -337,7 +333,7 @@ class OracleConnection < Connection
337
333
  row = res.fetch
338
334
  return nil unless row
339
335
 
340
- obj = klass.new
336
+ obj = klass.allocate
341
337
  obj.og_read(row)
342
338
 
343
339
  res.close
@@ -349,7 +345,7 @@ class OracleConnection < Connection
349
345
  objects = []
350
346
 
351
347
  while row = res.fetch
352
- obj = klass.new
348
+ obj = klass.allocate
353
349
  obj.og_read(row)
354
350
  objects << obj
355
351
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: psql.rb 326 2005-03-28 11:07:17Z gmosx $
3
+ # $Id: psql.rb 17 2005-04-14 16:03:40Z gmosx $
4
4
 
5
5
  begin
6
6
  require 'postgres'
@@ -9,9 +9,7 @@ rescue Object => ex
9
9
  Logger.error ex
10
10
  end
11
11
 
12
- require 'og/adapter'
13
- require 'og/connection'
14
- require 'glue/attribute'
12
+ require 'og/adapters/base'
15
13
 
16
14
  module Og
17
15
 
@@ -65,19 +63,17 @@ class PsqlAdapter < Adapter
65
63
  super
66
64
  end
67
65
 
68
- def insert_code(klass, db, pre_cb, post_cb)
66
+ def insert_code(klass, db)
69
67
  props = props_for_insert(klass)
70
68
  values = props.collect { |p| write_prop(p) }.join(',')
71
69
 
72
70
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values})"
73
71
 
74
72
  %{
75
- #{pre_cb}
76
73
  res = conn.store.exec("SELECT nextval('#{klass::DBSEQ}')")
77
74
  @oid = res.getvalue(0, 0).to_i
78
75
  res.clear
79
76
  conn.exec "#{sql}"
80
- #{post_cb}
81
77
  }
82
78
  end
83
79
 
@@ -244,7 +240,7 @@ class PsqlConnection < Connection
244
240
  def read_one(res, klass)
245
241
  return nil unless valid_res?(res)
246
242
 
247
- obj = klass.new
243
+ obj = klass.allocate
248
244
  obj.og_read(res, 0)
249
245
 
250
246
  res.clear
@@ -256,7 +252,7 @@ class PsqlConnection < Connection
256
252
  objects = []
257
253
 
258
254
  for tuple in (0...res.num_tuples)
259
- obj = klass.new
255
+ obj = klass.allocate
260
256
  obj.og_read(res, tuple)
261
257
  objects << obj
262
258
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: sqlite.rb 326 2005-03-28 11:07:17Z gmosx $
3
+ # $Id: sqlite.rb 17 2005-04-14 16:03:40Z gmosx $
4
4
 
5
5
  begin
6
6
  require 'sqlite3'
@@ -11,9 +11,7 @@ end
11
11
 
12
12
  require 'fileutils'
13
13
 
14
- require 'og/adapter'
15
- require 'og/connection'
16
- require 'glue/attribute'
14
+ require 'og/adapters/base'
17
15
 
18
16
  module Og
19
17
 
@@ -50,17 +48,15 @@ class SqliteAdapter < Adapter
50
48
  end
51
49
  end
52
50
  =end
53
- def insert_code(klass, db, pre_cb, post_cb)
51
+ def insert_code(klass, db)
54
52
  props = props_for_insert(klass)
55
53
  values = props.collect { |p| write_prop(p) }.join(',')
56
54
 
57
55
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values})"
58
56
 
59
57
  %{
60
- #{pre_cb}
61
58
  conn.store.query("#{sql}").close
62
59
  @oid = conn.store.last_insert_row_id
63
- #{post_cb}
64
60
  }
65
61
  =begin
66
62
  props = props_for_insert(klass)
@@ -233,7 +229,7 @@ class SqliteConnection < Connection
233
229
  row = res.next
234
230
  return nil unless row
235
231
 
236
- obj = klass.new
232
+ obj = klass.allocate
237
233
  obj.og_read(row)
238
234
 
239
235
  res.close
@@ -245,7 +241,7 @@ class SqliteConnection < Connection
245
241
  objects = []
246
242
 
247
243
  res.each do |row|
248
- obj = klass.new
244
+ obj = klass.allocate
249
245
  obj.og_read(row)
250
246
  objects << obj
251
247
  end
@@ -1,6 +1,6 @@
1
1
  # * Anastasios Koutoumanos <ak@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: sqlserver.rb 341 2005-04-04 08:28:54Z gmosx $
3
+ # $Id: sqlserver.rb 17 2005-04-14 16:03:40Z gmosx $
4
4
 
5
5
  begin
6
6
  require 'dbi'
@@ -9,9 +9,7 @@ rescue Object => ex
9
9
  Logger.error ex
10
10
  end
11
11
 
12
- require 'glue/attribute'
13
- require 'og/adapter'
14
- require 'og/connection'
12
+ require 'og/adapters/base'
15
13
 
16
14
  module Og
17
15
 
@@ -128,20 +126,18 @@ class SqlserverAdapter < Adapter
128
126
  klass.__props.reject { |p| :oid == p.symbol }
129
127
  end
130
128
 
131
- def insert_code(klass, db, pre_cb, post_cb="123")
129
+ def insert_code(klass, db)
132
130
  props = props_for_insert(klass)
133
131
  values = props.collect { |p| write_prop(p) }.join(',')
134
132
 
135
133
  sql = "INSERT INTO #{klass::DBTABLE} (#{props.collect {|p| p.name}.join(',')}) VALUES (#{values});"
136
134
 
137
135
  %{
138
- #{pre_cb}
139
136
  conn.exec "#{sql}"
140
137
  conn.commit
141
138
  res = conn.query("SELECT IDENT_CURRENT('#{klass::DBTABLE}')")
142
139
  @oid = res[0][0].to_i
143
140
  #res.finish
144
- #{post_cb}
145
141
  }
146
142
  end
147
143
 
@@ -326,7 +322,7 @@ class SqlserverConnection < Connection
326
322
  return nil unless valid_res?(res)
327
323
  return nil unless res
328
324
 
329
- obj = klass.new
325
+ obj = klass.allocate
330
326
  obj.og_read(res)
331
327
 
332
328
  return obj
@@ -337,7 +333,7 @@ class SqlserverConnection < Connection
337
333
  objects = []
338
334
 
339
335
  for tuple in (0...res.size)
340
- obj = klass.new
336
+ obj = klass.allocate
341
337
  obj.og_read(res, tuple)
342
338
  objects << obj
343
339
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: database.rb 326 2005-03-28 11:07:17Z gmosx $
3
+ # $Id: database.rb 19 2005-04-15 09:24:19Z gmosx $
4
4
 
5
5
  require 'glue/logger'
6
6
  require 'glue/attribute'
@@ -9,17 +9,17 @@ require 'glue/array'
9
9
  require 'glue/hash'
10
10
  require 'glue/time'
11
11
  require 'glue/pool'
12
+ require 'glue/aspects'
12
13
 
13
14
  require 'og/enchant'
14
15
  require 'og/meta'
15
- require 'og/observer'
16
16
 
17
17
  module Og
18
18
 
19
19
  # Encapsulates an Og Database.
20
20
 
21
21
  class Database
22
- include Og::Enchant
22
+ include Enchant
23
23
 
24
24
  # Managed class metadata
25
25
 
@@ -59,7 +59,7 @@ class Database
59
59
  @config = config
60
60
 
61
61
  # populate with default options if needed.
62
- @config[:connection_count] ||= 1
62
+ @config[:connection_count] ||= 5
63
63
 
64
64
  Logger.info "Connecting to database '#{@config[:database]}' using the '#{@config[:adapter]}' adapter."
65
65
 
@@ -67,8 +67,8 @@ class Database
67
67
 
68
68
  self.class.drop!(config) if config[:drop]
69
69
 
70
- @connection_pool = N::Pool.new
71
- @managed_classes = N::SafeHash.new
70
+ @connection_pool = Pool.new
71
+ @managed_classes = SafeHash.new
72
72
 
73
73
  @config[:connection_count].times do
74
74
  @connection_pool << @adapter.new_connection(self)
@@ -202,7 +202,7 @@ class Database
202
202
  klass.class_eval %{
203
203
  DBTABLE = "#{Adapter.table(klass)}"
204
204
  DBSEQ = "#{Adapter.table(klass)}_oid_seq"
205
-
205
+
206
206
  cattr_accessor :og_db
207
207
 
208
208
  def to_i
@@ -214,10 +214,6 @@ class Database
214
214
 
215
215
  klass.og_db = self
216
216
 
217
- # Add observer support.
218
-
219
- klass.extend(Observable)
220
-
221
217
  # Create the schema for this class if not available.
222
218
 
223
219
  @adapter.create_table(klass, self) if Og.create_schema
@@ -285,4 +281,10 @@ class Database
285
281
  end
286
282
  end
287
283
 
284
+ # Helper method
285
+
286
+ def self.connect(*args)
287
+ db = Database.new(*args)
288
+ end
289
+
288
290
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id$
3
+ # $Id: enchant.rb 1 2005-04-11 11:04:30Z gmosx $
4
4
 
5
5
  module Og
6
6
 
@@ -0,0 +1,21 @@
1
+ # * George Moschovitis <gm@navel.gr>
2
+ # (c) 2004-2005 Navel, all rights reserved.
3
+ # $Id: errors.rb 1 2005-04-11 11:04:30Z gmosx $
4
+
5
+ module Og
6
+
7
+ # This exception is thrown when a low level error
8
+ # happens in the store implementation.
9
+ #--
10
+ # TODO: rename adapter_exception to store_exception.
11
+ #++
12
+
13
+ class SqlException < Exception
14
+ attr_accessor :adapter_exception, :sql
15
+
16
+ def initialize(adapter_exception, sql = nil)
17
+ @adapter_exception, @sql = adapter_exception, sql
18
+ end
19
+ end
20
+
21
+ end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: meta.rb 337 2005-03-31 16:20:40Z gmosx $
2
+ # (c) 2005 Navel, all rights reserved.
3
+ # $Id: meta.rb 1 2005-04-11 11:04:30Z gmosx $
4
4
  #--
5
5
  # TODO:
6
6
  # - precreate the meta sql statements as much as possible to
@@ -8,12 +8,12 @@
8
8
  #++
9
9
 
10
10
  require 'glue/inflector'
11
- require 'og/adapter'
11
+ require 'og/adapters/base'
12
12
  require 'og/typemacros'
13
13
 
14
14
  module Og
15
15
 
16
- class Relation < N::Property
16
+ class Relation < Property
17
17
  alias foreign_class klass
18
18
  end
19
19
 
@@ -48,7 +48,7 @@ module MetaUtils # :nodoc: all
48
48
  #++
49
49
 
50
50
  def self.resolve_class(name, klass)
51
- klass ||= N::Inflector.camelize(name)
51
+ klass ||= Inflector.camelize(name)
52
52
 
53
53
  return klass if klass.is_a?(Class)
54
54
 
@@ -178,7 +178,7 @@ module MetaLanguage
178
178
  # end
179
179
 
180
180
  def has_many(name, klass, options = {})
181
- name_s = N::Inflector.singularize(name.to_s)
181
+ name_s = Inflector.singularize(name.to_s)
182
182
 
183
183
  # linkback is the property of the child object that 'links back'
184
184
  # to this object.
@@ -254,9 +254,9 @@ module MetaLanguage
254
254
 
255
255
  def many_to_many(name, klass, options = {})
256
256
  list_o = name.to_s
257
- prop_o = N::Inflector.singularize(list_o)
258
- list_m = (options[:linkback] || N::Inflector.plural_name(self)).to_s
259
- prop_m = N::Inflector.singularize(list_m)
257
+ prop_o = Inflector.singularize(list_o)
258
+ list_m = (options[:linkback] || Inflector.plural_name(self)).to_s
259
+ prop_m = Inflector.singularize(list_m)
260
260
 
261
261
  # Exit if the class is allready indirectly 'enchanted' from the
262
262
  # other class of the many_to_many relation.
@@ -393,6 +393,7 @@ end
393
393
  if Og.include_meta_language
394
394
  class Module # :nodoc: all
395
395
  include Og::MetaLanguage
396
+
396
397
  =begin
397
398
  A hack to avoid forward references. Does not work
398
399
  with namespave modules though. Any idea?