og 0.5.0

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