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 +19 -0
- data/LICENSE +32 -0
- data/README.og +104 -0
- data/RELEASES.og +23 -0
- data/examples/og/README +4 -0
- data/examples/og/run.rb +251 -0
- data/lib/glue.rb +52 -0
- data/lib/glue/array.rb +84 -0
- data/lib/glue/cache.rb +140 -0
- data/lib/glue/hash.rb +143 -0
- data/lib/glue/inflector.rb +91 -0
- data/lib/glue/logger.rb +51 -0
- data/lib/glue/macro.rb +56 -0
- data/lib/glue/mixins.rb +45 -0
- data/lib/glue/number.rb +30 -0
- data/lib/glue/pool.rb +63 -0
- data/lib/glue/property.rb +301 -0
- data/lib/glue/string.rb +224 -0
- data/lib/glue/time.rb +93 -0
- data/lib/og.rb +411 -0
- data/lib/og/backend.rb +258 -0
- data/lib/og/backends/mysql.rb +360 -0
- data/lib/og/backends/psql.rb +359 -0
- data/lib/og/connection.rb +265 -0
- data/lib/og/meta.rb +139 -0
- data/lib/og/version.rb +8 -0
- data/test/tc_og.rb +179 -0
- metadata +71 -0
data/lib/og/meta.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
# code:
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
3
|
+
#
|
4
|
+
# (c) 2004 Navel, all rights reserved.
|
5
|
+
# $Id: meta.rb 159 2004-11-18 10:18:30Z gmosx $
|
6
|
+
|
7
|
+
require 'og/backend'
|
8
|
+
|
9
|
+
module Og
|
10
|
+
|
11
|
+
# = MetaUtils
|
12
|
+
#
|
13
|
+
# Some useful meta-language utilities.
|
14
|
+
#
|
15
|
+
module MetaUtils # :nodoc: all
|
16
|
+
|
17
|
+
# Conver the klass to a string representation
|
18
|
+
# The leading module if available is removed.
|
19
|
+
#
|
20
|
+
def self.expand(klass)
|
21
|
+
return klass.name.gsub(/^.*::/, '').gsub(/::/, '_').downcase
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# = MetaLanguage
|
27
|
+
#
|
28
|
+
# Implements a meta-language for manipulating og-managed objects
|
29
|
+
# and defining their relationships. The original idea comes
|
30
|
+
# from the excellent ActiveRecord library.
|
31
|
+
#
|
32
|
+
# Many more useful relations will be available soon.
|
33
|
+
#
|
34
|
+
module MetaLanguage
|
35
|
+
|
36
|
+
# Defines an SQL index.
|
37
|
+
#
|
38
|
+
def sql_index(index, options = {})
|
39
|
+
meta :sql_index, [index, options]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Implements a 'belongs_to' relation.
|
43
|
+
# Automatically enchants the calling class with helper methods.
|
44
|
+
#
|
45
|
+
# Example:
|
46
|
+
#
|
47
|
+
# class MyObject
|
48
|
+
# belongs_to AnotherObject, :parent
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# creates the code:
|
52
|
+
#
|
53
|
+
# prop_accessor Fixnum, :parent_oid
|
54
|
+
# def parent; ... end
|
55
|
+
# def parent=(obj_or_oid); ... end
|
56
|
+
#
|
57
|
+
def belongs_to(name, klass, options = {})
|
58
|
+
module_eval %{
|
59
|
+
prop_accessor Fixnum, :#{name}_oid
|
60
|
+
|
61
|
+
def #{name}
|
62
|
+
$og.load_by_oid(@#{name}_oid, #{klass})
|
63
|
+
end
|
64
|
+
|
65
|
+
def #{name}=(obj_or_oid)
|
66
|
+
@#{name}_oid = obj_or_oid.to_i
|
67
|
+
end
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
# Implements a 'has_many' relation.
|
72
|
+
# Automatically enchants the calling class with helper methods.
|
73
|
+
#
|
74
|
+
# NOT IMPLEMENTED.
|
75
|
+
#
|
76
|
+
# Example:
|
77
|
+
#
|
78
|
+
# class MyObject
|
79
|
+
# has_many AnotherObject, :children
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# creates the code:
|
83
|
+
#
|
84
|
+
# def children; ... end
|
85
|
+
#
|
86
|
+
def has_one(klass, name, options = {})
|
87
|
+
module_eval %{
|
88
|
+
def #{name}(extrasql = nil)
|
89
|
+
$og.select_one("article_oid=\#\@oid \#\{extrasql\}", #{klass})
|
90
|
+
end
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
# Implements a 'has_many' relation.
|
95
|
+
# Automatically enchants the calling class with helper methods.
|
96
|
+
#
|
97
|
+
# Example:
|
98
|
+
#
|
99
|
+
# class MyObject
|
100
|
+
# has_many AnotherObject, :children
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# creates the code:
|
104
|
+
#
|
105
|
+
# def children; ... end
|
106
|
+
#
|
107
|
+
def has_many(name, klass, options = {})
|
108
|
+
# linkback is the property of the child object that 'links back'
|
109
|
+
# to this object.
|
110
|
+
linkback = options[:linkback] || "#{MetaUtils.expand(self)}_oid"
|
111
|
+
|
112
|
+
module_eval %{
|
113
|
+
@@og_descendants ||= {}
|
114
|
+
@@og_descendants[#{klass}] = :#{linkback}
|
115
|
+
|
116
|
+
unless defined?(og_descendants)
|
117
|
+
def self.og_descendants
|
118
|
+
@@og_descendants
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def #{name}(extrasql = nil)
|
123
|
+
$og.select("SELECT * FROM #{Utils.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}", #{klass})
|
124
|
+
end
|
125
|
+
|
126
|
+
def #{name}_count(extrasql = nil)
|
127
|
+
$og.count("SELECT COUNT(*) FROM #{Utils.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
|
128
|
+
end
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end # module
|
135
|
+
|
136
|
+
class Module # :nodoc: all
|
137
|
+
include Og::MetaLanguage
|
138
|
+
end
|
139
|
+
|
data/lib/og/version.rb
ADDED
data/test/tc_og.rb
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
|
3
|
+
require "glue/logger"; $log = Logger.new(STDERR) unless $log
|
4
|
+
require "og"
|
5
|
+
|
6
|
+
module Test # :nodoc: all
|
7
|
+
|
8
|
+
# bug: creates a table that fucks-up postgres if not
|
9
|
+
# correctly escaped.
|
10
|
+
class User
|
11
|
+
prop_accessor :name, String
|
12
|
+
|
13
|
+
def initialize(name = nil)
|
14
|
+
@name = name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Comment; end
|
19
|
+
|
20
|
+
class Article
|
21
|
+
prop_accessor :title, String
|
22
|
+
prop_accessor :body, String
|
23
|
+
prop_accessor :owner_oid, Fixnum, :sql_index => true
|
24
|
+
prop_accessor :another_oid, Fixnum
|
25
|
+
sql_index 'owner_oid, another_oid'
|
26
|
+
prop_accessor :options, Hash
|
27
|
+
has_many :comments, Test::Comment
|
28
|
+
|
29
|
+
def initialize(title = nil, body = nil)
|
30
|
+
@title = title
|
31
|
+
@body = body
|
32
|
+
@options = {"hello" => "world"}
|
33
|
+
end
|
34
|
+
|
35
|
+
def og_pre_insert(conn)
|
36
|
+
puts "-- PRE INSERT CALLED FOR ARTICLE"
|
37
|
+
end
|
38
|
+
|
39
|
+
def og_post_insert_update(conn)
|
40
|
+
puts "-- POST INSERT UPDATE CALLED FOR ARTICLE"
|
41
|
+
end
|
42
|
+
|
43
|
+
def og_post_update(conn)
|
44
|
+
puts "-- POST UPDATE CALLED FOR ARTICLE"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Comment
|
49
|
+
belongs_to :article, Test::Article
|
50
|
+
belongs_to :author, Test::User
|
51
|
+
prop_accessor :body, String
|
52
|
+
prop_accessor :create_time, Time
|
53
|
+
|
54
|
+
def initialize(body = nil)
|
55
|
+
@create_time = Time.now
|
56
|
+
@body = body
|
57
|
+
end
|
58
|
+
|
59
|
+
def og_pre_insert(conn)
|
60
|
+
puts "-- PRE INSERT CALLED FOR COMMENT"
|
61
|
+
end
|
62
|
+
|
63
|
+
def og_post_insert(conn)
|
64
|
+
puts "-- POST INSERT CALLED FOR COMMENT"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class TC_N_OG < Test::Unit::TestCase
|
69
|
+
|
70
|
+
def setup
|
71
|
+
psql = true
|
72
|
+
|
73
|
+
if psql
|
74
|
+
config = {
|
75
|
+
:backend => "psql",
|
76
|
+
:address => "localhost",
|
77
|
+
:database => "test",
|
78
|
+
:user => "postgres",
|
79
|
+
:password => "navelrulez",
|
80
|
+
:connection_count => 1
|
81
|
+
}
|
82
|
+
else
|
83
|
+
config = {
|
84
|
+
:backend => "mysql",
|
85
|
+
:address => "localhost",
|
86
|
+
:database => "test",
|
87
|
+
:user => "root",
|
88
|
+
:password => "navelrulez",
|
89
|
+
:connection_count => 1
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
Og::Database.drop_db!(config)
|
94
|
+
$og = Og::Database.new(config)
|
95
|
+
end
|
96
|
+
|
97
|
+
def teardown
|
98
|
+
$og.shutdown()
|
99
|
+
end
|
100
|
+
|
101
|
+
# gmosx: hmm, implemented in one method to enforce order.
|
102
|
+
#
|
103
|
+
def test_all
|
104
|
+
$DBG = true
|
105
|
+
|
106
|
+
$og.get_connection()
|
107
|
+
|
108
|
+
article = Article.new("Title", "Here comes the body")
|
109
|
+
$og << article
|
110
|
+
|
111
|
+
article.title = "Changed"
|
112
|
+
article.save!
|
113
|
+
|
114
|
+
$og.pupdate("body='Hello'", article)
|
115
|
+
|
116
|
+
article.update_properties "body='Hello'"
|
117
|
+
|
118
|
+
another = Article[1]
|
119
|
+
assert_equal(1, another.oid)
|
120
|
+
# bug: yaml load problem.
|
121
|
+
assert_equal("world", another.options["hello"])
|
122
|
+
|
123
|
+
# bug: YAMLing nil property
|
124
|
+
another.options = nil
|
125
|
+
another.save!
|
126
|
+
|
127
|
+
assert_equal(nil, $og.load(30000, Article))
|
128
|
+
|
129
|
+
articles = $og.load_all(Article)
|
130
|
+
|
131
|
+
# p articles
|
132
|
+
# p Article[23]
|
133
|
+
|
134
|
+
user = User.new("gmosx")
|
135
|
+
user.save!
|
136
|
+
|
137
|
+
user = User["gmosx"]
|
138
|
+
|
139
|
+
assert_equal("gmosx", user.name)
|
140
|
+
|
141
|
+
users1 = $og.select("name='gmosx' ORDER BY oid", User)
|
142
|
+
|
143
|
+
users = $og.select("SELECT * FROM #{User::DBTABLE} WHERE name='gmosx' ORDER BY oid", User)
|
144
|
+
|
145
|
+
users2 = User.select "name='gmosx' ORDER BY oid"
|
146
|
+
|
147
|
+
assert_equal(users1.size, users2.size)
|
148
|
+
|
149
|
+
article = Article.new("Title", "Body")
|
150
|
+
article.save!
|
151
|
+
|
152
|
+
comment = Comment.new("This is a comment")
|
153
|
+
comment.article = article
|
154
|
+
comment.author = User["gmosx"]
|
155
|
+
comment.save!
|
156
|
+
|
157
|
+
comment = Comment.new("This is another comment")
|
158
|
+
comment.article = article.oid
|
159
|
+
comment.author = User["gmosx"]
|
160
|
+
comment.save!
|
161
|
+
|
162
|
+
assert_equal(article.oid, comment.article_oid)
|
163
|
+
|
164
|
+
comments = article.comments
|
165
|
+
|
166
|
+
assert_equal(2, comments.size)
|
167
|
+
|
168
|
+
assert_equal("gmosx", comments[0].author.name)
|
169
|
+
|
170
|
+
Article.delete(article)
|
171
|
+
|
172
|
+
assert_equal(nil, Comment.all)
|
173
|
+
|
174
|
+
comment.delete!
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.1
|
3
|
+
specification_version: 1
|
4
|
+
name: og
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.5.0
|
7
|
+
date: 2004-11-23
|
8
|
+
summary: Og (ObjectGraph)
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
author: George Moschovitis
|
12
|
+
email: gm@navel.gr
|
13
|
+
homepage: http://www.navel.gr/og
|
14
|
+
rubyforge_project: og-rml
|
15
|
+
description: An efficient and transparent Object-Relational mapping library
|
16
|
+
autorequire: og
|
17
|
+
default_executable:
|
18
|
+
bindir: bin
|
19
|
+
has_rdoc: true
|
20
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
21
|
+
requirements:
|
22
|
+
-
|
23
|
+
- ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 1.8.1
|
26
|
+
version:
|
27
|
+
platform: ruby
|
28
|
+
files:
|
29
|
+
- README.og
|
30
|
+
- RELEASES.og
|
31
|
+
- LICENSE
|
32
|
+
- AUTHORS
|
33
|
+
- examples/og/run.rb
|
34
|
+
- examples/og/README
|
35
|
+
- lib/glue.rb
|
36
|
+
- lib/glue/pool.rb
|
37
|
+
- lib/glue/time.rb
|
38
|
+
- lib/glue/macro.rb
|
39
|
+
- lib/glue/inflector.rb
|
40
|
+
- lib/glue/array.rb
|
41
|
+
- lib/glue/number.rb
|
42
|
+
- lib/glue/cache.rb
|
43
|
+
- lib/glue/mixins.rb
|
44
|
+
- lib/glue/property.rb
|
45
|
+
- lib/glue/string.rb
|
46
|
+
- lib/glue/hash.rb
|
47
|
+
- lib/glue/logger.rb
|
48
|
+
- lib/og/backends
|
49
|
+
- lib/og/connection.rb
|
50
|
+
- lib/og/backend.rb
|
51
|
+
- lib/og/meta.rb
|
52
|
+
- lib/og/version.rb
|
53
|
+
- lib/og/backends/psql.rb
|
54
|
+
- lib/og/backends/mysql.rb
|
55
|
+
- lib/og.rb
|
56
|
+
- test/tc_og.rb
|
57
|
+
test_files: []
|
58
|
+
rdoc_options:
|
59
|
+
- "--main"
|
60
|
+
- README.og
|
61
|
+
- "--title"
|
62
|
+
- Og Documentation
|
63
|
+
extra_rdoc_files:
|
64
|
+
- README.og
|
65
|
+
- RELEASES.og
|
66
|
+
- LICENSE
|
67
|
+
- AUTHORS
|
68
|
+
executables: []
|
69
|
+
extensions: []
|
70
|
+
requirements: []
|
71
|
+
dependencies: []
|