og 0.17.0 → 0.18.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.
data/CHANGELOG CHANGED
@@ -1,5 +1,86 @@
1
+ 29-05-2005 George Moschovitis <gm@navel.gr>
2
+
3
+ * lib/og/relation/has_many.rb: takes :order into account.
4
+
5
+ * lib/og/entity.rb (#find/#all): take find_options into account,
6
+ (#find_options): implemented.
7
+ (#order): implemented.
8
+
9
+ 24-05-2005 George Moschovitis <gm@navel.gr>
10
+
11
+ * lib/og/store/kirby.rb (#og_insert): implemented,
12
+ (#destroy): implemented,
13
+ save files in a custom directory.
14
+
15
+ * test/*: some changes to make them pass again.
16
+
17
+ * lib/og/mixin/orderable.rb: use facet/macro instead of dinclude.
18
+
19
+ * lib/og/mixin/hierarchical.rb: use facet/macro instead of dinclude.
20
+
21
+ 23-05-2005 George Moschovitis <gm@navel.gr>
22
+
23
+ * lib/og.rb: added thread_safe mode.
24
+
25
+ * lib/og/manager.rb: re-added support for threads,
26
+ use thread code only in thread safe mode.
27
+
28
+ 20-05-2005 George Moschovitis <gm@navel.gr>
29
+
30
+ * lib/og/store/psql.rb (#initialize) min_messages, encoding,
31
+ schema_order options.
32
+
33
+ * lib/og/store/kirbybase/*: copied files from kirby distribution.
34
+
35
+ * lib/og/store/kirby.rb: introduced,
36
+ (#create_table): works.
37
+ (#create_column_map): implemented.
38
+
39
+ * lib/og/store/*: converted all stores to better handle nil
40
+ values [mneumann],
41
+ don't use the term 'column', use 'field' instead to make
42
+ more SQL agnostic.
43
+
44
+ * lib/og/store/sql.rb (#parse_float): added,
45
+ (#parse_int): added,
46
+ (#read_prop): handle nil values. [mneumann]
47
+
48
+ * lib/og/store/sqlite.rb (#blank?): alias eof? [jperrot]
49
+
50
+ --- THE REVENGE OF SITH ---
51
+
52
+ 19-05-2005 George Moschovitis <gm@navel.gr>
53
+
54
+ * resolved a posted bug [mneumann].
55
+
56
+ * lib/og/relation/has_many.rb: added 'dummy' remove support.
57
+
58
+ * lib/og/collection.rb: improved Julien's patch.
59
+
60
+ 18-05-2005 Julien Perrot <jperrot@exosec.fr>
61
+
62
+ * lib/og/collection.rb (#remove): implemented.
63
+
64
+ * lib/og/relation/joins_many.rb (#remove_xxx): implemented.
65
+
66
+ * lib/og/store/sql.rb (#unjoin): implemented.
67
+
68
+ * lib/og/manager.rb (#==): fixed when other == nil.
69
+
70
+ 18-05-2005 George Moschovitis <gm@navel.gr>
71
+
72
+ * lib/og/store/sqlite.rb (#db_filename): overridable db file name [slewis].
73
+
74
+ * README: added warning about sqlite3 version [slewis].
75
+
76
+ 17-05-2005 George Moschovitis <gm@navel.gr>
77
+
78
+ * lib/og.rb: keep active manager.
79
+
1
80
  16-05-2005 George Moschovitis <gm@navel.gr>
2
81
 
82
+ * --- VERSION 0.17.0 ---
83
+
3
84
  * doc/RELEASES: updated.
4
85
 
5
86
  * README: updated.
data/README CHANGED
@@ -90,6 +90,7 @@ Og requires the following applications or libraries:
90
90
 
91
91
  * SQLite
92
92
  http://www.sqlite.org/download.html
93
+ WARNING: you need sqlite3-ruby > 1.1.0
93
94
 
94
95
  Please install the required applications and libraries before continuing
95
96
  with the installation of Og. Only install the libraries needed for
data/doc/AUTHORS CHANGED
@@ -1,19 +1,22 @@
1
1
  MAIN DEVELOPER:
2
2
 
3
- * George Moschovitis <gm@navel.gr>
3
+ * George Moschovitis <gm@navel.gr>
4
4
  Project leader, architecture and design, main coder,
5
5
  documentation, maintainer.
6
6
 
7
7
  IDEAS, ADDITIONAL CODING, SUPPORT:
8
8
 
9
- * Michael Neumann <mneumann@ntecs.de>
9
+ * Michael Neumann <mneumann@ntecs.de>
10
10
  Design, additional coding and bug reports.
11
11
 
12
- * Matt Bowen <matt.bowen@farweststeel.com>
12
+ * Anastasios Koutoumanos <ak@navel.gr>
13
+ Design, additional coding.
14
+
15
+ * Matt Bowen <matt.bowen@farweststeel.com>
13
16
  Additional code and documentation.
14
17
 
15
- * Anastasios Koutoumanos <ak@navel.gr>
16
- Design, additional coding.
18
+ * Julien Perrot <jperrot@exosec.fr>
19
+ Bug reports and patches.
17
20
 
18
- * Thomas Quas <tquas@yahoo.com>
21
+ * Thomas Quas <tquas@yahoo.com>
19
22
  Ideas, bug reports, unit tests.
data/doc/RELEASES CHANGED
@@ -1,4 +1,27 @@
1
- == Version 0.17.0
1
+ == Version 0.18.0
2
+
3
+ Mainly a bug fix release. Many small improvements were
4
+ implemented. All reported bugs were fixed, as well as bugs found
5
+ during the deployment of a live application. For more information
6
+ consult the detailed changelog. Thanks to Julien Perrot for small
7
+ patches.
8
+
9
+ Some notable changes:
10
+
11
+ * Thread safe mode was added again in Og. This works nice with
12
+ the Webrick server.
13
+
14
+ * New order macro in Og to set default ordering for each
15
+ entity. The has_many collections respect the order setting.
16
+
17
+ * Fixes in the SQLite adapter.
18
+
19
+ * No warnings in the Posrgres adapter.
20
+
21
+ * Cleaned up some source files.
22
+
23
+
24
+ == Version 0.17.0 was released on 16/05/2005.
2
25
 
3
26
  Og Reloaded!! A totally new, clean and elegant implementation
4
27
  that supports tons of new advanced features. This version should
data/lib/og.rb CHANGED
@@ -15,7 +15,6 @@ require 'glue/array'
15
15
  require 'glue/hash'
16
16
  require 'glue/time'
17
17
  require 'glue/pool'
18
- require 'glue/inflector'
19
18
  require 'glue/validation'
20
19
  require 'glue/aspects'
21
20
 
@@ -74,7 +73,7 @@ module Og
74
73
 
75
74
  # The version.
76
75
 
77
- Version = '0.17.0'
76
+ Version = '0.18.0'
78
77
 
79
78
  # Library path.
80
79
 
@@ -122,11 +121,18 @@ module Og
122
121
 
123
122
  mattr_accessor :raise_store_exceptions, true
124
123
 
124
+ # Enable/dissable thread safe mode.
125
+
126
+ mattr_accessor :thread_safe, true
127
+
125
128
  # Marker module. If included in a class, the Og automanager
126
129
  # ignores this class.
127
130
 
128
131
  module Unmanageable; end
129
132
 
133
+ # The active manager
134
+
135
+ mattr_accessor :manager
130
136
  end
131
137
 
132
138
  # gmosx: leave this here.
data/lib/og/collection.rb CHANGED
@@ -18,12 +18,16 @@ class Collection
18
18
  # A method used to add insert objects in the collection.
19
19
 
20
20
  attr_accessor :insert_proc
21
+
22
+ # A method used to remove objects from the collection.
23
+
24
+ attr_accessor :remove_proc
21
25
 
22
26
  # A method used to find the objects that belong to the
23
27
  # collection.
24
28
 
25
29
  attr_accessor :find_proc
26
-
30
+
27
31
  # The default find options.
28
32
 
29
33
  attr_accessor :find_options
@@ -38,9 +42,10 @@ class Collection
38
42
 
39
43
  # Initialize the collection.
40
44
 
41
- def initialize(owner = nil, insert_proc = nil, find_proc = nil, find_options = {})
45
+ def initialize(owner = nil, insert_proc = nil, remove_proc = nil, find_proc = nil, find_options = {})
42
46
  @owner = owner
43
47
  @insert_proc = insert_proc
48
+ @remove_proc = remove_proc
44
49
  @find_proc = find_proc
45
50
  @find_options = find_options
46
51
  @members = []
@@ -97,7 +102,24 @@ class Collection
97
102
  alias_method :<<, :push
98
103
  alias_method :add, :push
99
104
 
100
- # Delete a member from the collection.
105
+ # Remove a member from the collection, the actual object
106
+ # is not deleted.
107
+
108
+ def remove(*objects)
109
+ objects = objects.flatten
110
+
111
+ objects.reject! { |obj| @members.delete(obj) if obj.unsaved? }
112
+ return if objects.empty?
113
+
114
+ @owner.transaction do
115
+ objects.each do |obj|
116
+ @owner.send(@remove_proc, obj)
117
+ @members.delete(obj)
118
+ end
119
+ end
120
+ end
121
+
122
+ # Delete a member from the collection AND the store.
101
123
 
102
124
  def delete(*objects)
103
125
  objects = objects.flatten
@@ -113,9 +135,20 @@ class Collection
113
135
  end
114
136
  end
115
137
 
116
- # Delete all members of the collection.
138
+ # Remove all members from the collection.
139
+
140
+ def remove_all
141
+ @owner.transaction do
142
+ @members.each { |obj| @owner.send(@remove_proc, obj) }
143
+ end
144
+ @members.clear
145
+ end
146
+ alias_method :clear, :remove_all
147
+
148
+ # Delete all members of the collection. Also delete from the
149
+ # store.
117
150
 
118
- def clear
151
+ def delete_all
119
152
  @owner.transaction do
120
153
  @members.each { |obj| obj.delete }
121
154
  end
@@ -137,20 +170,3 @@ private
137
170
  end
138
171
 
139
172
  end
140
-
141
- __END__
142
-
143
- === Examples
144
-
145
- article.comments.to_ary
146
-
147
- for article in article.comments
148
- end
149
-
150
- blog = Blog.new
151
- blog.categories << Category.new
152
- blog.categories << Category.new
153
- blog.enties << Entry.new
154
- blog.save
155
-
156
- blog.categories.unlink(1)
data/lib/og/entity.rb CHANGED
@@ -71,6 +71,9 @@ module EntityMixin
71
71
  alias_method :batch_update, :update_properties
72
72
 
73
73
  def find(options = {})
74
+ if find_options = self.__meta[:find_options]
75
+ options = find_options.first.update(options)
76
+ end
74
77
  options[:class] = self
75
78
  ogmanager.store.find(options)
76
79
  end
@@ -107,6 +110,18 @@ module EntityMixin
107
110
  def const_missing(sym)
108
111
  return sym
109
112
  end
113
+
114
+ # Set the default find options for this entity.
115
+
116
+ def find_options(options)
117
+ meta :find_options, options
118
+ end
119
+
120
+ # Set the default order option for this entity.
121
+
122
+ def order(order_str)
123
+ meta :find_options, :order => order_str
124
+ end
110
125
  end
111
126
 
112
127
  end
data/lib/og/manager.rb CHANGED
@@ -13,8 +13,7 @@ class Manager
13
13
  class EntityInfo
14
14
  attr_accessor :klass
15
15
  attr_accessor :enchanted
16
- attr_accessor :options
17
-
16
+ attr_accessor :options
18
17
 
19
18
  def initialize(klass = nil)
20
19
  @klass = klass
@@ -27,8 +26,9 @@ class Manager
27
26
 
28
27
  attr_accessor :options
29
28
 
30
- # The store used for persistence.
31
-
29
+ # The store used for persistence. This is a virtual field
30
+ # when running in thread_safe mode.
31
+
32
32
  attr_accessor :store
33
33
 
34
34
  # The collection of Entities managed by this manager.
@@ -38,7 +38,50 @@ class Manager
38
38
  def initialize(options)
39
39
  @options = options
40
40
  @entities = {}
41
+ @pool = Glue::Pool.new
42
+
43
+ store_class = Store.for_name(options[:store])
44
+ store_class.destroy(options) if options[:destroy]
45
+
46
+ if Og.thread_safe
47
+ (options[:connection_count] || 5).times do
48
+ @pool << store_class.new(options)
49
+ end
50
+ else
51
+ @store = store_class.new(options)
52
+ end
53
+ end
54
+
55
+ # Get a store from the pool.
56
+
57
+ def get_store
58
+ if Og.thread_safe
59
+ thread = Thread.current
60
+
61
+ unless conn = thread[:og_store]
62
+ conn = @pool.pop()
63
+ thread[:og_store] = conn
64
+ end
65
+
66
+ return conn
67
+ else
68
+ return @store
69
+ end
41
70
  end
71
+ alias_method :store, :get_store
72
+
73
+ # Return a store to the pool.
74
+
75
+ def put_store
76
+ if Og.thread_safe
77
+ thread = Thread.current
78
+
79
+ if conn = thread[:og_store]
80
+ thread[:og_store] = nil
81
+ return @pool.push(conn)
82
+ end
83
+ end
84
+ end
42
85
 
43
86
  # Manage a class. Converts the class to an Entity.
44
87
 
@@ -49,7 +92,7 @@ class Manager
49
92
 
50
93
  klass.module_eval %{
51
94
  def ==(other)
52
- @#{klass.primary_key.first} == other.#{klass.primary_key.first}
95
+ other ? @#{klass.primary_key.first} == other.#{klass.primary_key.first} : false
53
96
  end
54
97
  }
55
98
 
@@ -57,7 +100,9 @@ class Manager
57
100
  klass.class.send(:attr_accessor, :ogmanager)
58
101
 
59
102
  Relation.enchant(klass)
60
- @store.enchant(klass, self)
103
+
104
+ # FIXME: uggly!
105
+ store.enchant(klass, self); put_store
61
106
 
62
107
  @entities[klass] = info
63
108
  end
@@ -101,10 +146,7 @@ class << self
101
146
  # Helper method, useful to initialize Og.
102
147
 
103
148
  def setup(options = {})
104
- m = Manager.new(options)
105
- store = Store.for_name(options[:store])
106
- store.destroy(options) if options[:destroy]
107
- m.store = store.new(options)
149
+ m = @@manager = Manager.new(options)
108
150
  m.manage_classes
109
151
  return m
110
152
  end
@@ -2,15 +2,14 @@ require 'facet/string/plural'
2
2
  require 'facet/string/singular'
3
3
  require 'facet/string/demodulize'
4
4
  require 'facet/string/underscore'
5
-
6
- require 'glue/dynamic_include'
5
+ require 'facet/macro'
7
6
 
8
7
  module Og
9
8
 
10
9
  # Implements the Nested Sets pattern for hierarchical
11
10
  # SQL queries.
12
11
  #--
13
- # TODO: use actice collections.
12
+ # TODO: use active collections.
14
13
  #++
15
14
 
16
15
  module NestedSets
@@ -137,4 +136,4 @@ end
137
136
 
138
137
  end
139
138
 
140
- __END__
139
+ # * George Moschovitis <gm@navel.gr>
@@ -1,4 +1,4 @@
1
- require 'glue/dynamic_include'
1
+ require 'facet/macro'
2
2
 
3
3
  module Og
4
4
 
@@ -154,7 +154,8 @@ module Orderable
154
154
  base.module_eval(code)
155
155
  end
156
156
 
157
-
158
157
  end
159
158
 
160
159
  end
160
+
161
+ # * George Moschovitis <gm@navel.gr>