og 0.5.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/AUTHORS ADDED
@@ -0,0 +1,19 @@
1
+ MAIN DEVELOPER:
2
+
3
+ * George Moschovitis <gm@navel.gr>
4
+ Project Leader, Architecture and Design, main coder, documentation,
5
+ maintainer.
6
+
7
+ IDEAS, ADDITIONAL CODING, SUPPORT:
8
+
9
+ * Anastasios Koutoumanos <ak@navel.gr>
10
+ Design, additional coding.
11
+
12
+ * Elias Athanasopoulos <elathan@navel.gr>
13
+ Additional coding.
14
+
15
+ * Elias Karakoulakis <ekarak@navel.gr>
16
+ Additional design.
17
+
18
+ * Kostas Nasis <kostas@nasis.com>
19
+ Ideas and bug reports.
data/LICENSE ADDED
@@ -0,0 +1,32 @@
1
+ The BSD License
2
+
3
+ Copyright (c) 2004, Navel Ltd. (http://www.navel.gr)
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are
8
+ met:
9
+
10
+ * Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+
13
+ * Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+
17
+ * Neither the name of Navel nor the names of its contributors may be
18
+ used to endorse or promote products derived from this software
19
+ without specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+
@@ -0,0 +1,104 @@
1
+ = Og 0.5.0
2
+
3
+ Og (ObjectGraph) is an efficient, yet simple object-relational mapping
4
+ library. Og provides transparent serialization of object graphs to a RDBMS
5
+ backend. Unlike other similar libraries Og maps standard Ruby
6
+ objects to SQL tables and not vice versa. Og provides a meta language
7
+ to describe the relations between objects, a flexible and intuitive api
8
+ for querieng the database, raw access to the SQL language if needed
9
+ (for example to fine tune the automatically generated SQL tables, or
10
+ for custom queries), suports deserialization to Ruby objects or tuples
11
+ and provides a collection of usefull Mixins to synthesize common
12
+ Objects.
13
+
14
+ Og is a combination of the best features of Active Record and the
15
+ former O-R mapping library included in Nitro (NDB). Adapters for
16
+ PostgreSQL and MySQL are included.
17
+
18
+ Og is part of the Nitro project, released as a stand-alone library
19
+ due to popular demand. You can find the ChangeLog in the Nitro
20
+ distribution (http://www.navel.gr/nitro).
21
+
22
+
23
+ == Features
24
+
25
+ The library provides the following features:
26
+
27
+ + Object-Relational mapping.
28
+ + Absolutely no configuration files.
29
+ + Multiple backends (PostgreSQL, MySQL).
30
+ + ActiveRecord-style meta language and db aware methods.
31
+ + Deserialize to Ruby Objects or ResultSets.
32
+ + Deserialize sql join queries to Ruby Objects.
33
+ + Serialize arbitrary ruby object graphs through YAML.
34
+ + Connection pooling.
35
+ + Thread safety.
36
+ + SQL transactions.
37
+ + Lifecycle callbacks.
38
+ + Transparent support for cascading deletes for all backends.
39
+ + Hierarchical structures (preorder traversal, materialized paths)
40
+ + Works safely as part of distributed application.
41
+ + Simple implementation < 2k lines of code.
42
+
43
+ == Download
44
+
45
+ The latest version of Og can be found at
46
+
47
+ * http://www.navel.gr/og
48
+
49
+ Documentation for Og can be found at
50
+
51
+ * http://www.navel.gr/nitro/og
52
+
53
+
54
+ == Requirements
55
+
56
+ Og requires the following applications or libraries:
57
+
58
+ * Ruby 1.8.1 and greater (http://www.ruby-lang.org)
59
+ Version 1.8.2.preview2 is recomended
60
+
61
+ * Ruby-psql (http://www.postgresql.jp/interfaces/ruby/archive/ruby-postgres-0.7.1.tar.gz)
62
+ Ruby interface to the PostgreSQL RDBMS.
63
+
64
+ * Ruby-mysql (http://tmtm.org/ja/ruby/mysql/README_en.html)
65
+ Ruby interface to the MySQL RDBMS.
66
+
67
+ * PostgreSQL (http://www.postgres.org)
68
+ Used for the Database Backend.
69
+
70
+ * MySQL (http://www.mysql.org)
71
+ Used for the Database Backend.
72
+
73
+ Please install the required applications and libraries before continuing
74
+ with the installation of Og.
75
+
76
+
77
+ == Instalation
78
+
79
+ Og is distributed as a RubyGem. First of all make sure you have
80
+ installed RubyGems on your system. Then run the following command:
81
+
82
+ gem install og-rml
83
+
84
+ Then try to run the examples/og Example application.
85
+
86
+ A tar.gz distribution is also available on http://www.navel.gr/og
87
+
88
+
89
+ == Support
90
+
91
+ For any questions regarding Og, feel free to ask on the ruby-talk
92
+ mailing list (which is mirrored to comp.lang.ruby) or contact
93
+ mailto:gm@navel.gr.
94
+
95
+
96
+ == Licence
97
+
98
+ Copyright (c) 2004 Navel Ltd (http://www.navel.gr)
99
+
100
+ Og (http://www.navel.gr/og) is copyrighted free software
101
+ created and maintained by George Moschovitis (mailto:gm@navel.gr)
102
+ and released under the standard BSD Licence. For details consult
103
+ the file LICENCE.
104
+
@@ -0,0 +1,23 @@
1
+
2
+ == Version 0.5.0 was released on 21/11/2004.
3
+
4
+ New standalone version. SQL indices can be defined again.
5
+
6
+
7
+ == Version 0.5.0 was released on 01/11/2004.
8
+
9
+ Renamed to Og (ObjectGraph) Og combines the best features of Active
10
+ Record and NDB. A fully working MySQL adapter is also provided.
11
+ Moreover the code base is further cleaned up. Small improvements
12
+ to the application configuration system. This version is integrated
13
+ in Nitro.
14
+
15
+
16
+ == Version 0.2 was released on 07-10-2004.
17
+
18
+ The sofware is actually usable but not tested in a production environment.
19
+ Comments from the Ruby community are critical in order to fix possible
20
+ bugs and improve the API. Suggestions for missing features are also
21
+ welcome. This version only supports the Postgres Database.
22
+
23
+
@@ -0,0 +1,4 @@
1
+ = Og Example
2
+
3
+ A simple example that demonstrates some Og features. The example
4
+ automatically creates a 'test' database.
@@ -0,0 +1,251 @@
1
+ # = Og Example
2
+ #
3
+ # A simple example to demonstrate the Og library.
4
+ #
5
+ # code:
6
+ # * George Moschovitis <gm@navel.gr>
7
+ #
8
+ # (c) 2004 Navel, all rights reserved.
9
+ # $Id: run.rb 167 2004-11-23 14:03:10Z gmosx $
10
+
11
+ $:.unshift "../../lib"
12
+
13
+ require "glue/logger"
14
+ require "og"
15
+
16
+ # Full debug information.
17
+ $DBG = true
18
+
19
+ # = A child class
20
+ #
21
+ class Comment
22
+ prop_accessor :body, String
23
+
24
+ def initialize(body = nil)
25
+ @body = body
26
+ end
27
+
28
+ def to_s
29
+ return @body
30
+ end
31
+ end
32
+
33
+ # forward declaration
34
+ class ArticleComment < Comment; end
35
+
36
+ # forward declaration
37
+ class UserComment < Comment; end
38
+
39
+ # forward declaration
40
+ class Part; end
41
+
42
+ # = A Parent class
43
+ #
44
+ class User
45
+ prop_accessor :name, String
46
+
47
+ has_many :comments, UserComment
48
+
49
+ def initialize(name = nil)
50
+ @name = name
51
+ end
52
+
53
+ def to_s
54
+ return @name
55
+ end
56
+ end
57
+
58
+ # = A parent class
59
+ #
60
+ class Article
61
+ prop_accessor :title, String
62
+ prop_accessor :body, String
63
+ # override the default O->R mapping
64
+ prop_accessor :level, Fixnum, :sql => "smallint DEFAULT 1"
65
+ # store a Ruby Hash in the Database. YAML
66
+ # is used for serializing the attribute.
67
+ # no need to define the class, but you can if you want.
68
+ prop_accessor :options
69
+ # exactly like the standard Ruby attr creates only the reader.
70
+ prop :create_time, Time
71
+
72
+ # define comment relation:
73
+ has_many :comments, ArticleComment
74
+
75
+ has_many :parts, Part
76
+
77
+ # define author relation:
78
+ belongs_to :author, User
79
+
80
+ # this attribute is NOT stored in the db.
81
+ attr_accessor :other_options
82
+
83
+ # Managed object constructors with no args, take *args
84
+ # as parameter to allow for Mixin chaining.
85
+ #
86
+ def initialize(title = nil, body = nil)
87
+ @title, @body = title, body
88
+ @create_time = Time.now
89
+ @options = {}
90
+ @other_options = {}
91
+ end
92
+
93
+ def to_s
94
+ return "#@title: #@body"
95
+ end
96
+ end
97
+
98
+ # = Article comment
99
+ #
100
+ class ArticleComment < Comment
101
+ belongs_to :article, Article
102
+ end
103
+
104
+ # = User comment
105
+ #
106
+ class UserComment < Comment
107
+ belongs_to :author, User
108
+ end
109
+
110
+ # = Another child class
111
+ #
112
+ class Part
113
+ prop_accessor :name, String
114
+ belongs_to :article, Article
115
+
116
+ def initialize(name = nil)
117
+ @name = name
118
+ end
119
+
120
+ def to_s
121
+ return @name
122
+ end
123
+ end
124
+
125
+ # Initialize a logger.
126
+
127
+ $log = Logger.new(STDERR);
128
+
129
+ # Og configuration.
130
+
131
+ config = {
132
+ :address => "localhost",
133
+ :database => "test",
134
+ :backend => "psql",
135
+ :user => "postgres",
136
+ :password => "navelrulez",
137
+ :connection_count => 1
138
+ }
139
+ =begin
140
+ config = {
141
+ :address => "localhost",
142
+ :database => "test",
143
+ :backend => "mysql",
144
+ :user => "root",
145
+ :password => "navelrulez",
146
+ :connection_count => 1
147
+ }
148
+ =end
149
+ # Cleanup the database for earlier executions
150
+
151
+ Og::Database.drop_db!(config)
152
+
153
+ # Initialize Og
154
+
155
+ $og = Og::Database.new(config)
156
+
157
+ # Get an Og connection for this thread.
158
+
159
+ $og.get_connection
160
+
161
+ # Create some articles
162
+
163
+ a1 = Article.new("Title1", "Body1")
164
+ a1.save!
165
+
166
+ a2 = Article.new("Title2", "Body2")
167
+ a2.save!
168
+
169
+ puts "\n\n"
170
+ puts "* Get and print all articles:"
171
+ articles = Article.all()
172
+ articles.each { |a| puts a }
173
+
174
+ # Create some comments
175
+
176
+ c1 = ArticleComment.new("Comment 1")
177
+ c1.article = a1
178
+ c1.save!
179
+
180
+ c2 = ArticleComment.new("Comment 2")
181
+ # alternative way to set the parent.
182
+ c2.article_oid = a1.oid
183
+ # an alternative way to save (add to the $og 'virtal collection' of
184
+ # managed objects).
185
+ $og << c2
186
+
187
+ c3 = ArticleComment.new("Comment 3")
188
+ c3.article = a1
189
+ c3.save!
190
+
191
+ puts "\n\n"
192
+ puts "* Print all all comments for article 1:"
193
+ a1.comments.each { |c| puts c }
194
+
195
+ # Most Og commands allow you to fine-tune the low level
196
+ # SQL code by passing extra_sql parameters, here is an
197
+ # example
198
+ puts "\n\n"
199
+ puts "* comments with sql finetunings:"
200
+ # use a standard SQL limit clause
201
+ a1.comments("LIMIT 2").each { |c| puts c }
202
+
203
+
204
+ # Change a managed object
205
+ a1.title = "Changed Title"
206
+ # Og knows that this is a managed object and executes
207
+ # an SQL UPDATE instead of an SQL INSERT
208
+ a1.save!
209
+
210
+ puts "\n\n"
211
+ Article.all.each { |a| puts a }
212
+
213
+ # The previous command updates the whole object. It is used
214
+ # when there are many updates or you dont care about speed.
215
+ # To update only specific fields use pupdate or properties_update
216
+ a2.pupdate! "title='A specific title'"
217
+
218
+ puts "\n\n"
219
+ Article.all.each { |a| puts a }
220
+
221
+ # delete an object
222
+ ArticleComment.delete(c3)
223
+
224
+ puts "\n\n"
225
+ ArticleComment.all.each { |a| puts a }
226
+
227
+
228
+ # Serialize a hash
229
+ a1.options = { "k1" => "val1", "k2" => "val2" }
230
+ a1.save!
231
+
232
+ # lookup an object
233
+ article = Article[a1.oid]
234
+
235
+ puts "\n\n"
236
+ puts article.options.inspect
237
+
238
+ u = User.new("gmosx")
239
+ u.save!
240
+
241
+ article = Article[1]
242
+ # you can also lookup by the name property.
243
+ article.author = User["gmosx"]
244
+ article.save!
245
+
246
+ part = Part.new("admin")
247
+ part.article = article
248
+ part.save!
249
+
250
+ article.parts.each { |pa| puts pa }
251
+
@@ -0,0 +1,52 @@
1
+ # = Glue
2
+ #
3
+ # General libraries used by various projects.
4
+ #
5
+ # code:
6
+ # * George Moschovitis <gm@navel.gr>
7
+ #
8
+ # (c) 2004 Navel, all rights reserved.
9
+ # $Id$
10
+
11
+ require "English"
12
+ require "pp"
13
+
14
+ require 'glue/property'
15
+
16
+ class NilClass
17
+ # quite usefull for error tolerant apps.
18
+ # a bit dangerous? Will have to rethink this.
19
+ #
20
+ def empty?
21
+ return true
22
+ end
23
+ end
24
+
25
+ class Class
26
+ #--
27
+ # gmosx: is this really needed?
28
+ #++
29
+ def to_i()
30
+ return self.hash()
31
+ end
32
+ end
33
+
34
+ module Kernel
35
+ # pretty prints an exception/error object
36
+ # usefull for helpfull debug messages
37
+ #
38
+ # Input:
39
+ # The Exception/StandardError object
40
+ #
41
+ # Output:
42
+ # the pretty printed string
43
+ #
44
+ def pp_exception(ex)
45
+ return %{#{ex.message}\n\tBACKTRACE:\n\t#{ex.backtrace.join("\n\t")}\n\tLOGGED FROM:\n\t#{caller[0]}}
46
+ end
47
+
48
+ end
49
+
50
+ # predefine some comonly used objects
51
+
52
+ EMPTY_STRING = ""