nitro 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +186 -0
- data/README +40 -11
- data/RELEASES +10 -1
- data/Rakefile +5 -4
- data/bin/cluster.rb +3 -3
- data/{etc/new-project.rb → bin/new_app.rb} +1 -1
- data/examples/og/README +4 -0
- data/examples/og/run.rb +254 -0
- data/examples/simple/app.rb +3 -3
- data/examples/simple/conf/config.rb +10 -22
- data/examples/simple/conf/debug-config.rb +6 -32
- data/examples/simple/conf/live-config.rb +3 -23
- data/examples/simple/conf/requires.rb +5 -5
- data/examples/simple/env.rb +3 -4
- data/examples/simple/lib/articles/entities.rb +17 -15
- data/examples/simple/lib/articles/methods.rb +15 -15
- data/examples/simple/lib/articles/part.rb +7 -8
- data/examples/simple/root/comments.si +1 -1
- data/examples/simple/root/index.sx +1 -1
- data/examples/simple/root/view-article.sx +1 -2
- data/examples/tiny/app.rb +3 -3
- data/examples/tiny/conf/config.rb +4 -4
- data/examples/tiny/conf/requires.rb +3 -4
- data/lib/n/config.rb +50 -3
- data/lib/n/logger.rb +14 -2
- data/lib/n/og.rb +381 -0
- data/lib/n/og/backend.rb +252 -0
- data/lib/n/og/backends/mysql.rb +352 -0
- data/lib/n/og/backends/psql.rb +351 -0
- data/lib/n/og/connection.rb +253 -0
- data/lib/n/og/meta.rb +127 -0
- data/lib/n/properties.rb +6 -6
- data/lib/n/server.rb +4 -7
- data/lib/n/server/appserver.rb +58 -0
- data/lib/n/{app → server}/cluster.rb +3 -3
- data/lib/n/{app → server}/cookie.rb +3 -3
- data/lib/n/server/dispatcher.rb +55 -0
- data/lib/n/server/{filter.rb → filters.rb} +1 -1
- data/lib/n/{app → server}/filters/autologin.rb +5 -5
- data/lib/n/{app → server}/fragment.rb +3 -3
- data/lib/n/{app → server}/handlers.rb +4 -4
- data/lib/n/{app → server}/handlers/code-handler.rb +6 -6
- data/lib/n/{app → server}/handlers/page-handler.rb +9 -7
- data/lib/n/{app → server}/request.rb +8 -8
- data/lib/n/{app/request-part.rb → server/requestpart.rb} +4 -4
- data/lib/n/{app → server}/script.rb +5 -5
- data/lib/n/{app → server}/server.rb +1 -1
- data/lib/n/{app → server}/session.rb +5 -5
- data/lib/n/{app → server}/user.rb +1 -1
- data/lib/n/{app/webrick-servlet.rb → server/webrick.rb} +77 -20
- data/lib/n/shaders.rb +3 -2
- data/lib/n/std.rb +5 -32
- data/test/n/{app → server}/tc_cookie.rb +2 -2
- data/test/n/server/tc_filters.rb +38 -0
- data/test/n/{app → server}/tc_request.rb +6 -6
- data/test/n/{app → server}/tc_requestpart.rb +3 -3
- data/test/n/{app → server}/tc_session.rb +2 -2
- data/test/n/tc_og.rb +178 -0
- data/test/n/ui/tc_pager.rb +3 -3
- metadata +41 -65
- data/examples/ndb/README +0 -5
- data/examples/ndb/run.rb +0 -271
- data/lib/n/app/webrick.rb +0 -73
- data/lib/n/db.rb +0 -233
- data/lib/n/db/README +0 -232
- data/lib/n/db/connection.rb +0 -365
- data/lib/n/db/managed.rb +0 -233
- data/lib/n/db/mixins.rb +0 -279
- data/lib/n/db/mysql.rb +0 -345
- data/lib/n/db/psql.rb +0 -383
- data/lib/n/db/tools.rb +0 -106
- data/lib/n/db/utils.rb +0 -102
- data/lib/n/server/PLAYBACK.txt +0 -8
- data/lib/n/server/RESEARCH.txt +0 -13
- data/test/n/tc_db.rb +0 -223
- data/test/n/tc_db_mysql.rb +0 -241
data/examples/ndb/README
DELETED
data/examples/ndb/run.rb
DELETED
@@ -1,271 +0,0 @@
|
|
1
|
-
# = NDB Example
|
2
|
-
#
|
3
|
-
# A simple example to demonstrate the NDB library.
|
4
|
-
# Ignore the errors marked as surpressed.
|
5
|
-
#
|
6
|
-
# code:
|
7
|
-
# * George Moschovitis <gm@navel.gr>
|
8
|
-
#
|
9
|
-
# (c) 2004 Navel, all rights reserved.
|
10
|
-
# $Id: run.rb 106 2004-10-25 11:31:11Z gmosx $
|
11
|
-
|
12
|
-
$:.unshift "../../lib"
|
13
|
-
|
14
|
-
require "n/std"
|
15
|
-
require "n/logger"
|
16
|
-
require "n/db"
|
17
|
-
|
18
|
-
# = A parent class
|
19
|
-
#
|
20
|
-
class Article
|
21
|
-
manage {
|
22
|
-
# include some Mixins to 'synthesize' the class.
|
23
|
-
include N::Entity
|
24
|
-
include N::CreateTime
|
25
|
-
|
26
|
-
prop_accessor String, :title
|
27
|
-
prop_accessor String, :body
|
28
|
-
# override the default O->R mapping
|
29
|
-
prop_accessor Fixnum, "smallint DEFAULT 1", :level
|
30
|
-
# store a Ruby Hash in the Database. Marshal
|
31
|
-
# is used for serializing the attribute.
|
32
|
-
prop_accessor Hash, :options
|
33
|
-
}
|
34
|
-
# this attribute is NOT stored in the db.
|
35
|
-
attr_accessor :other_options
|
36
|
-
|
37
|
-
# Managed object constructors with no args, take *args
|
38
|
-
# as parameter to allow for Mixin chaining.
|
39
|
-
#
|
40
|
-
def initialize(title = nil, body = nil)
|
41
|
-
# call the constructors of the mixins
|
42
|
-
super
|
43
|
-
@title, @body = title, body
|
44
|
-
options = {}
|
45
|
-
other_options = {}
|
46
|
-
end
|
47
|
-
|
48
|
-
def to_s
|
49
|
-
return "#@title: #@body"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# = Another Parent class
|
54
|
-
#
|
55
|
-
class User
|
56
|
-
manage {
|
57
|
-
include N::Entity
|
58
|
-
include N::Named
|
59
|
-
}
|
60
|
-
|
61
|
-
def initialize(name = nil)
|
62
|
-
@name = name
|
63
|
-
# can be called afterwards if you want.
|
64
|
-
super
|
65
|
-
end
|
66
|
-
|
67
|
-
def to_s
|
68
|
-
return @name
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# = A child class
|
73
|
-
#
|
74
|
-
class Comment
|
75
|
-
manage {
|
76
|
-
# include some Mixins to 'synthesize' the class.
|
77
|
-
# This way we get OO sql table definitions.
|
78
|
-
include N::Entity
|
79
|
-
include N::Child
|
80
|
-
# by including this mixin the object can be attached
|
81
|
-
# to different parents.
|
82
|
-
include N::ParentClass
|
83
|
-
include N::CreateTime
|
84
|
-
|
85
|
-
prop_accessor String, :body
|
86
|
-
}
|
87
|
-
|
88
|
-
def initialize(body = nil)
|
89
|
-
super
|
90
|
-
@body = body
|
91
|
-
end
|
92
|
-
|
93
|
-
def to_s
|
94
|
-
return @body
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
# = Another child class
|
99
|
-
#
|
100
|
-
class DummyChild
|
101
|
-
manage {
|
102
|
-
include N::Entity
|
103
|
-
include N::Child
|
104
|
-
|
105
|
-
prop_accessor String, :body
|
106
|
-
}
|
107
|
-
|
108
|
-
def initialize(body = nil)
|
109
|
-
super
|
110
|
-
@body = body
|
111
|
-
end
|
112
|
-
|
113
|
-
def to_s
|
114
|
-
return @body
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
# Initialize a logger.
|
119
|
-
|
120
|
-
$log = Logger.new(STDERR);
|
121
|
-
|
122
|
-
# Intialize NDB
|
123
|
-
|
124
|
-
begin
|
125
|
-
$db = N::Db.new(
|
126
|
-
:address => "localhost",
|
127
|
-
:database => "test",
|
128
|
-
:user => "postgres",
|
129
|
-
:password => "navelrulez",
|
130
|
-
:connection_count => 5
|
131
|
-
)
|
132
|
-
rescue => ex
|
133
|
-
puts "Database 'test' does not exist"
|
134
|
-
puts "Create a new database with the following command: "
|
135
|
-
puts "$ createdb test -U postgres"
|
136
|
-
end
|
137
|
-
|
138
|
-
# Cleanup the database for earlier executions
|
139
|
-
|
140
|
-
$db.drop_table(Article)
|
141
|
-
$db.drop_table(Comment)
|
142
|
-
|
143
|
-
# Create some articles
|
144
|
-
|
145
|
-
a1 = Article.new("Title1", "Body1")
|
146
|
-
# by adding the managed object to the $db virtual array you denote
|
147
|
-
# that this object should be managed.
|
148
|
-
$db << a1
|
149
|
-
|
150
|
-
a2 = Article.new("Title2", "Body2")
|
151
|
-
$db << a2
|
152
|
-
|
153
|
-
puts "\n\n"
|
154
|
-
puts "Ignore the errors, NDB automatically initialized the schema"
|
155
|
-
|
156
|
-
# Until now we use $db as a helper. From now on we 'll explicitly
|
157
|
-
# require a connection to the db. The standard block idiom is used.
|
158
|
-
# You can also use the $db.xxx helpers if you just want to execute
|
159
|
-
# one command.
|
160
|
-
|
161
|
-
$db.open { |db|
|
162
|
-
|
163
|
-
puts "\n\n"
|
164
|
-
puts "* Get and print all articles:"
|
165
|
-
articles = db.get_all(Article)
|
166
|
-
articles.each { |a| puts a }
|
167
|
-
|
168
|
-
puts "\n\n"
|
169
|
-
puts "* Print all children of the root (oid = -1) of class Aritcle:"
|
170
|
-
articles = db.children(-1, Article)
|
171
|
-
articles.each { |a| puts a }
|
172
|
-
|
173
|
-
# Create some comments
|
174
|
-
|
175
|
-
c1 = Comment.new("Comment 1")
|
176
|
-
c1.set_parent(a1)
|
177
|
-
$db << c1
|
178
|
-
|
179
|
-
c2 = Comment.new("Comment 2")
|
180
|
-
# alternative way to set the parent.
|
181
|
-
c2.pid = a1.oid
|
182
|
-
$db << c2
|
183
|
-
|
184
|
-
c3 = Comment.new("Comment 3")
|
185
|
-
# alternative way to set the parent.
|
186
|
-
c3.pid = a1.oid
|
187
|
-
$db << c3
|
188
|
-
|
189
|
-
puts "\n\n"
|
190
|
-
puts "* Print all all comments for article 1:"
|
191
|
-
comments = db.children(a1, Comment)
|
192
|
-
comments.each { |c| puts c }
|
193
|
-
|
194
|
-
# Most NDB commands allow you to fine-tune the low level
|
195
|
-
# SQL code by passing extra_sql parameters, here is an
|
196
|
-
# example
|
197
|
-
puts "\n\n"
|
198
|
-
puts "* comments with sql finetunings:"
|
199
|
-
# use a standard SQL limit clause
|
200
|
-
comments = db.children(a1, Comment, "LIMIT 2")
|
201
|
-
comments.each { |c| puts c }
|
202
|
-
|
203
|
-
|
204
|
-
# Change a managed object
|
205
|
-
a1.title = "Changed Title"
|
206
|
-
# NDB knows that this is a managed object and executes
|
207
|
-
# an SQL UPDATE instead of an SQL INSERT
|
208
|
-
$db << a1
|
209
|
-
|
210
|
-
puts "\n\n"
|
211
|
-
db.get_all(Article).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
|
-
db.pupdate("title='A specific title'", a2)
|
217
|
-
|
218
|
-
puts "\n\n"
|
219
|
-
db.get_all(Article).each { |a| puts a }
|
220
|
-
|
221
|
-
# delete an object
|
222
|
-
db.delete(c3)
|
223
|
-
|
224
|
-
puts "\n\n"
|
225
|
-
db.get_all(Comment).each { |a| puts a }
|
226
|
-
|
227
|
-
|
228
|
-
# Serialize a hash
|
229
|
-
a1.options = { "k1" => "val1", "k2" => "val2" }
|
230
|
-
db << a1
|
231
|
-
|
232
|
-
# lookup an object
|
233
|
-
article = db.get(a1.oid, Article)
|
234
|
-
|
235
|
-
puts "\n\n"
|
236
|
-
puts article.options.inspect
|
237
|
-
|
238
|
-
# attach another class of child objects to Article:
|
239
|
-
|
240
|
-
d1 = DummyChild.new("hello")
|
241
|
-
d1.set_parent(a1)
|
242
|
-
db << d1
|
243
|
-
|
244
|
-
d1 = DummyChild.new("world")
|
245
|
-
d1.set_parent(a1)
|
246
|
-
db << d1
|
247
|
-
|
248
|
-
# Show the dummy children and not the comments.
|
249
|
-
|
250
|
-
dummies = db.children(a1, DummyChild)
|
251
|
-
dummies.each { |d| puts d }
|
252
|
-
|
253
|
-
# And now something cool: We attach the Comment objects to different
|
254
|
-
# parents
|
255
|
-
|
256
|
-
u = User.new("gmosx")
|
257
|
-
db << u
|
258
|
-
|
259
|
-
c4 = Comment.new("Comment 4")
|
260
|
-
c4.set_parent(u)
|
261
|
-
$db << c4
|
262
|
-
|
263
|
-
c5 = Comment.new("Comment 5")
|
264
|
-
c5.set_parent(u)
|
265
|
-
$db << c5
|
266
|
-
|
267
|
-
comments = db.children(u, Comment)
|
268
|
-
comments.each { |c| puts c }
|
269
|
-
}
|
270
|
-
|
271
|
-
|
data/lib/n/app/webrick.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
# code:
|
2
|
-
# * George Moschovitis <gm@navel.gr>
|
3
|
-
# * Elias Athanasopoulos <elathan@navel.gr>
|
4
|
-
#
|
5
|
-
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: webrick.rb 106 2004-10-25 11:31:11Z gmosx $
|
7
|
-
|
8
|
-
require "drb"
|
9
|
-
require "cgi"
|
10
|
-
require "webrick"
|
11
|
-
|
12
|
-
require "n/logger"
|
13
|
-
require "n/application"
|
14
|
-
require "n/app/server"
|
15
|
-
require "n/app/webrick-servlet"
|
16
|
-
|
17
|
-
module N; module App
|
18
|
-
|
19
|
-
# = Webrick AppServer
|
20
|
-
#
|
21
|
-
# The Application Server. Handles dynamic requests in a web application.
|
22
|
-
# Dont keepalive (or use a VERY SMALL keepalive). Typically this server
|
23
|
-
# is used along with a standard http server that handles other resources.
|
24
|
-
#
|
25
|
-
# Used temporarily unitl we build our own app server.
|
26
|
-
#
|
27
|
-
class Webrick < N::App::Server
|
28
|
-
include WEBrick
|
29
|
-
|
30
|
-
# the integrated webrock server.
|
31
|
-
attr_accessor :webrick
|
32
|
-
|
33
|
-
def initialize(name = "WebrickServer")
|
34
|
-
super
|
35
|
-
end
|
36
|
-
|
37
|
-
# Start the application server.
|
38
|
-
#
|
39
|
-
def start
|
40
|
-
accesslog = WEBrick::BasicLog::new("/dev/null")
|
41
|
-
referer = WEBrick::BasicLog::new("/dev/null")
|
42
|
-
|
43
|
-
@webrick = HTTPServer.new(
|
44
|
-
:BindAddress => $appsrv_address,
|
45
|
-
:Port => $appsrv_port,
|
46
|
-
:DocumentRoot => $root_dir,
|
47
|
-
# gmosx, FIXME: this shit still logs!!
|
48
|
-
:Logger => Log.new(nil, WEBrick::Log::WARN),
|
49
|
-
# elathan: amateur...
|
50
|
-
:AccessLog => [
|
51
|
-
[accesslog, AccessLog::COMMON_LOG_FORMAT],
|
52
|
-
[referer, AccessLog::REFERER_LOG_FORMAT]
|
53
|
-
]
|
54
|
-
)
|
55
|
-
|
56
|
-
@webrick.mount("/", N::App::WebrickServlet)
|
57
|
-
|
58
|
-
trap("INT") {
|
59
|
-
@webrick.shutdown()
|
60
|
-
}
|
61
|
-
|
62
|
-
@webrick.start()
|
63
|
-
end
|
64
|
-
|
65
|
-
# Stop the application server.
|
66
|
-
#
|
67
|
-
def stop
|
68
|
-
@webrick.stop
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
end; end # module
|
data/lib/n/db.rb
DELETED
@@ -1,233 +0,0 @@
|
|
1
|
-
# code:
|
2
|
-
# * George Moschovitis <gm@navel.gr>
|
3
|
-
#
|
4
|
-
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: db.rb 106 2004-10-25 11:31:11Z gmosx $
|
6
|
-
|
7
|
-
module N;
|
8
|
-
|
9
|
-
require "n/properties"
|
10
|
-
require "n/utils/array"
|
11
|
-
require "n/utils/time"
|
12
|
-
require "n/utils/pool"
|
13
|
-
|
14
|
-
require "n/db/utils"
|
15
|
-
require "n/db/managed"
|
16
|
-
require "n/db/connection"
|
17
|
-
require "n/db/mixins"
|
18
|
-
|
19
|
-
# Configuration
|
20
|
-
|
21
|
-
# if true, enables the read only mode
|
22
|
-
$db_read_only_mode = false
|
23
|
-
|
24
|
-
# = Db
|
25
|
-
#
|
26
|
-
# An efficient, yet simple Object-Relational Mapper.
|
27
|
-
#
|
28
|
-
# == Features
|
29
|
-
#
|
30
|
-
# The library provides the following features:
|
31
|
-
#
|
32
|
-
# + Object-Relational mapping
|
33
|
-
# + Deserialize to Ruby Objects or ResultSets
|
34
|
-
# + Deserialize sql join queries to Ruby Objects
|
35
|
-
# + Serialize arbitrary ruby object graphs through Marshal
|
36
|
-
# + Connection pooling
|
37
|
-
# + Thread safety
|
38
|
-
# + SQL transactions
|
39
|
-
# + Callbacks
|
40
|
-
# + Simple support for cascading deletes
|
41
|
-
# + Hierarchical structures (preorder traversal, materialized paths)
|
42
|
-
# + Works safely as part of distributed application.
|
43
|
-
# + Simple implementation < 10k lines of code.
|
44
|
-
#
|
45
|
-
# === Design
|
46
|
-
#
|
47
|
-
# Keep this class backend agnostic. Put backend specific code in
|
48
|
-
# the Connection / Managed class.
|
49
|
-
#
|
50
|
-
# Try to make the methods work with oids. We do keep
|
51
|
-
# a unified id space. Include the N::Sequenced Marker to
|
52
|
-
# denote custom id space.
|
53
|
-
# Do NOT implement descendants use a root id (rid).
|
54
|
-
#
|
55
|
-
# For class ids we use the name instead of a hash. Class ids are
|
56
|
-
# typically not used in querys, they are stored for completeness.
|
57
|
-
# If we store a hash we cannot reclaim the class thus invalidating
|
58
|
-
# the point. Instead of .name(), to_s() is used so the methods
|
59
|
-
# are more flexible (they accept class names too!!)
|
60
|
-
#
|
61
|
-
# Db allows the serialization of arbitrary Ruby objects. Just
|
62
|
-
# mark them as Object (or Array or Hash) in the prop_accessor
|
63
|
-
# and the engine will serialize a Marshal.dump of the object.
|
64
|
-
# Arbitrary object graphs are supported too.
|
65
|
-
#
|
66
|
-
# === Future
|
67
|
-
#
|
68
|
-
# * Support multiple DataBase backends (Postgres, MySQL, ...)
|
69
|
-
# * Support prepared statements (pgsql)
|
70
|
-
# * Support stored procedures (pgsql)
|
71
|
-
# * Support caching
|
72
|
-
# * Deserialize to OpenStruct
|
73
|
-
# * Better documentation
|
74
|
-
# * Code cleanup, refactoring
|
75
|
-
# * Release as Gem, RPAbase
|
76
|
-
# * Foreign keys (cascading delete)
|
77
|
-
#
|
78
|
-
# === Design:
|
79
|
-
#
|
80
|
-
# - This is NOT a singleton, an application may access multiple
|
81
|
-
# databases.
|
82
|
-
#
|
83
|
-
class Db
|
84
|
-
# hash of configuration options.
|
85
|
-
attr_accessor :config
|
86
|
-
|
87
|
-
# Pool of connections to the backend.
|
88
|
-
attr_accessor :pool
|
89
|
-
|
90
|
-
# Entities cache.
|
91
|
-
attr_accessor :cache
|
92
|
-
|
93
|
-
# Managed classes fields. A hash of hashes.
|
94
|
-
attr_accessor :fields
|
95
|
-
|
96
|
-
# Initialize the database interface.
|
97
|
-
#
|
98
|
-
def initialize(config)
|
99
|
-
@config = config
|
100
|
-
|
101
|
-
if backend = config[:backend]
|
102
|
-
require "n/db/#{backend}"
|
103
|
-
else
|
104
|
-
require "n/db/psql"
|
105
|
-
end
|
106
|
-
|
107
|
-
$log.info "Connecting to database '#{config[:database]}'."
|
108
|
-
|
109
|
-
@pool = N::Pool.new
|
110
|
-
@fields = N::SafeHash.new
|
111
|
-
|
112
|
-
for i in (0...config[:connection_count])
|
113
|
-
@pool << DbConnection.new(config)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# Shutdown the database interface.
|
118
|
-
#
|
119
|
-
def shutdown
|
120
|
-
for con in @pool
|
121
|
-
con.close()
|
122
|
-
end
|
123
|
-
end
|
124
|
-
alias_method :close, :shutdown
|
125
|
-
|
126
|
-
# Get a connection from the pool to access the database.
|
127
|
-
#
|
128
|
-
def get_connection
|
129
|
-
return @pool.pop()
|
130
|
-
end
|
131
|
-
|
132
|
-
# Restore an unused connection to the pool.
|
133
|
-
#
|
134
|
-
def put_connection(connection)
|
135
|
-
return @pool.push(connection)
|
136
|
-
end
|
137
|
-
|
138
|
-
# Utility method, automatically restores a connection to the pool.
|
139
|
-
#
|
140
|
-
def connect(deserialize = nil, &block)
|
141
|
-
result = nil
|
142
|
-
|
143
|
-
begin
|
144
|
-
db = @pool.pop()
|
145
|
-
db.deserialize = deserialize unless deserialize.nil?
|
146
|
-
|
147
|
-
result = yield(db)
|
148
|
-
|
149
|
-
db.deserialize = true
|
150
|
-
ensure
|
151
|
-
@pool.push(db)
|
152
|
-
end
|
153
|
-
|
154
|
-
return result
|
155
|
-
end
|
156
|
-
alias_method :open, :connect
|
157
|
-
|
158
|
-
# Utility method, gets connection and encloses in transaction.
|
159
|
-
#
|
160
|
-
def transaction(deserialize = nil, &block)
|
161
|
-
result = nil
|
162
|
-
|
163
|
-
begin
|
164
|
-
db = @pool.pop()
|
165
|
-
db.deserialize = deserialize if deserialize
|
166
|
-
|
167
|
-
db.start()
|
168
|
-
result = yield(db)
|
169
|
-
db.commit()
|
170
|
-
|
171
|
-
db.deserialize = true
|
172
|
-
ensure
|
173
|
-
@pool.push(db)
|
174
|
-
end
|
175
|
-
|
176
|
-
return result
|
177
|
-
end
|
178
|
-
|
179
|
-
# Utility method, creates an entity from a row
|
180
|
-
#
|
181
|
-
def entity_from_row(row, klass)
|
182
|
-
entity = klass.new()
|
183
|
-
entity.__db_read_row__(row)
|
184
|
-
return entity
|
185
|
-
end
|
186
|
-
|
187
|
-
private
|
188
|
-
|
189
|
-
# Automatically wrap connection methods.
|
190
|
-
#
|
191
|
-
def self.wrap_method(method, args)
|
192
|
-
args = args.split(/,/)
|
193
|
-
class_eval %{
|
194
|
-
def #{method}(#{args.join(", ")})
|
195
|
-
begin
|
196
|
-
db = @pool.pop()
|
197
|
-
res = db.#{method}(#{args.collect {|a| a.split(/=/)[0]}.join(", ")})
|
198
|
-
ensure
|
199
|
-
@pool.push(db)
|
200
|
-
end
|
201
|
-
return res
|
202
|
-
end
|
203
|
-
}
|
204
|
-
end
|
205
|
-
|
206
|
-
wrap_method :put, "entity"
|
207
|
-
alias_method :<<, :put
|
208
|
-
wrap_method :insert, "obj"
|
209
|
-
wrap_method :update, "obj"
|
210
|
-
wrap_method :update_properties, "update_sql, ent_or_oid, klass = nil"
|
211
|
-
wrap_method :pupdate, "update_sql, ent_or_oid, klass = nil"
|
212
|
-
wrap_method :get, "oid, klass"
|
213
|
-
wrap_method :get_by_oid, "oid, klass"
|
214
|
-
wrap_method :get_by_name, "name, klass"
|
215
|
-
wrap_method :get_all, "klass, extrasql = nil"
|
216
|
-
wrap_method :select, "sql, klass, join_fields = nil"
|
217
|
-
wrap_method :select_one, "sql, klass, join_fields = nil"
|
218
|
-
wrap_method :child, "entity, klass, extrasql = nil"
|
219
|
-
wrap_method :children, "entity, klass, extrasql = nil"
|
220
|
-
wrap_method :count_children, "entity, klass, extrasql = nil"
|
221
|
-
wrap_method :delete, "entity, klass = nil, cascade = true"
|
222
|
-
wrap_method :query, "sql"
|
223
|
-
wrap_method :query_one, "sql"
|
224
|
-
wrap_method :count, "sql"
|
225
|
-
wrap_method :match, "sql"
|
226
|
-
wrap_method :exec, "sql"
|
227
|
-
wrap_method :exec_and_clear, "sql"
|
228
|
-
wrap_method :exec_clear, "sql"
|
229
|
-
wrap_method :drop_table, "klass"
|
230
|
-
end
|
231
|
-
|
232
|
-
end # module
|
233
|
-
|