nitro 0.3.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +284 -0
- data/{LICENCE → LICENSE} +1 -1
- data/README +13 -17
- data/RELEASES +13 -1
- data/Rakefile +1 -9
- data/bin/cluster.rb +5 -5
- data/examples/blog/README +45 -0
- data/examples/blog/apache.conf +0 -0
- data/examples/blog/app.rb +21 -0
- data/examples/blog/config.rb +88 -0
- data/examples/blog/lib/blog.rb +104 -0
- data/examples/blog/log/app.log +117 -0
- data/examples/blog/root/comments.xhtml +38 -0
- data/examples/blog/root/entry_form.xhtml +18 -0
- data/examples/blog/root/index.xhtml +43 -0
- data/examples/blog/root/login.xhtml +24 -0
- data/examples/blog/root/m/bubbles.gif +0 -0
- data/examples/blog/root/m/comments_curve.gif +0 -0
- data/examples/blog/root/m/down.gif +0 -0
- data/examples/blog/root/m/footer_bg.gif +0 -0
- data/examples/blog/root/m/garrow.gif +0 -0
- data/examples/blog/root/m/gbull.gif +0 -0
- data/examples/blog/root/m/grbull.gif +0 -0
- data/examples/blog/root/m/h1_bg.gif +0 -0
- data/examples/blog/root/m/header_bg.gif +0 -0
- data/examples/blog/root/m/obull.gif +0 -0
- data/examples/blog/root/m/page_bg.gif +0 -0
- data/examples/blog/root/m/side_title_bg.gif +0 -0
- data/examples/blog/root/m/sidebar_bg.gif +0 -0
- data/examples/blog/root/recent_posts.xhtml +14 -0
- data/examples/blog/root/style.css +201 -0
- data/examples/blog/root/style.xsl +118 -0
- data/examples/blog/root/view_entry.xhtml +29 -0
- data/examples/og/run.rb +27 -29
- data/examples/tiny/README +3 -4
- data/examples/tiny/app.rb +6 -16
- data/examples/tiny/config.rb +30 -0
- data/examples/tiny/log/app.log +23 -0
- data/examples/tiny/root/{index.sx → index.xhtml} +3 -6
- data/lib/{n/std.rb → nitro.rb} +9 -4
- data/lib/{n → nitro}/application.rb +13 -7
- data/lib/{n → nitro}/config.rb +38 -8
- data/lib/{n → nitro}/events.rb +1 -1
- data/lib/{n → nitro}/l10n.rb +1 -1
- data/lib/{n → nitro}/logger.rb +8 -8
- data/lib/{n → nitro}/macros.rb +3 -3
- data/lib/{n → nitro}/mixins.rb +1 -1
- data/lib/nitro/properties.rb +301 -0
- data/lib/{n → nitro}/server.rb +2 -2
- data/lib/{n → nitro}/server/appserver.rb +14 -5
- data/lib/{n → nitro}/server/cluster.rb +5 -5
- data/lib/{n → nitro}/server/cookie.rb +1 -1
- data/lib/nitro/server/dispatcher.rb +66 -0
- data/lib/{n → nitro}/server/filters.rb +7 -7
- data/lib/{n → nitro}/server/filters/autologin.rb +3 -3
- data/lib/{n → nitro}/server/fragment.rb +3 -3
- data/lib/{n → nitro}/server/handlers.rb +3 -3
- data/lib/nitro/server/render.rb +200 -0
- data/lib/{n → nitro}/server/request.rb +6 -6
- data/lib/{n → nitro}/server/requestpart.rb +5 -5
- data/lib/{n → nitro}/server/script.rb +3 -3
- data/lib/{n → nitro}/server/server.rb +4 -4
- data/lib/{n → nitro}/server/session.rb +3 -3
- data/lib/nitro/server/shaders.rb +165 -0
- data/lib/{n → nitro}/server/user.rb +1 -1
- data/lib/nitro/server/webrick.rb +175 -0
- data/lib/nitro/service.rb +25 -0
- data/lib/{n → nitro}/sitemap.rb +2 -2
- data/lib/{n → nitro}/ui/date-select.rb +0 -0
- data/lib/{n → nitro}/ui/pager.rb +1 -1
- data/lib/{n → nitro}/ui/popup.rb +1 -1
- data/lib/{n → nitro}/ui/select.rb +1 -1
- data/lib/{n → nitro}/ui/tabs.rb +1 -1
- data/lib/{n → nitro}/utils/array.rb +1 -1
- data/lib/{n → nitro}/utils/cache.rb +1 -1
- data/lib/{n → nitro}/utils/gfx.rb +1 -1
- data/lib/{n → nitro}/utils/hash.rb +1 -1
- data/lib/{n → nitro}/utils/html.rb +1 -1
- data/lib/{n → nitro}/utils/http.rb +1 -1
- data/lib/{n → nitro}/utils/mail.rb +1 -1
- data/lib/{n → nitro}/utils/number.rb +1 -1
- data/lib/{n → nitro}/utils/pool.rb +1 -1
- data/lib/{n → nitro}/utils/string.rb +19 -95
- data/lib/{n → nitro}/utils/template.rb +0 -0
- data/lib/{n → nitro}/utils/time.rb +1 -1
- data/lib/{n → nitro}/utils/uri.rb +3 -3
- data/lib/nitro/version.rb +11 -0
- data/lib/{n/og.rb → og.rb} +61 -31
- data/lib/{n/og → og}/backend.rb +13 -7
- data/lib/{n/og → og}/backends/mysql.rb +43 -39
- data/lib/{n/og → og}/backends/psql.rb +42 -38
- data/lib/{n/og → og}/connection.rb +21 -9
- data/lib/{n/og → og}/meta.rb +18 -12
- data/lib/xsl/base.xsl +11 -88
- data/test/n/server/tc_cookie.rb +1 -1
- data/test/n/server/tc_filters.rb +1 -1
- data/test/n/server/tc_request.rb +3 -3
- data/test/n/server/tc_requestpart.rb +2 -2
- data/test/n/server/tc_session.rb +1 -1
- data/test/n/tc_events.rb +1 -1
- data/test/n/tc_og.rb +16 -18
- data/test/n/tc_properties.rb +22 -18
- data/test/n/tc_sitemap.rb +2 -2
- data/test/n/ui/tc_pager.rb +4 -4
- data/test/n/utils/tc_cache.rb +1 -1
- data/test/n/utils/tc_hash.rb +1 -1
- data/test/n/utils/tc_html.rb +1 -1
- data/test/n/utils/tc_http.rb +1 -1
- data/test/n/utils/tc_number.rb +1 -1
- data/test/n/utils/tc_strings.rb +1 -46
- data/test/n/utils/tc_uri.rb +1 -1
- metadata +101 -108
- data/examples/simple/README +0 -42
- data/examples/simple/app.rb +0 -31
- data/examples/simple/conf/apache.conf +0 -100
- data/examples/simple/conf/config.rb +0 -72
- data/examples/simple/conf/debug-config.rb +0 -26
- data/examples/simple/conf/live-config.rb +0 -26
- data/examples/simple/conf/requires.rb +0 -43
- data/examples/simple/ctl +0 -32
- data/examples/simple/env.rb +0 -32
- data/examples/simple/install.rb +0 -12
- data/examples/simple/lib/articles/entities.rb +0 -37
- data/examples/simple/lib/articles/lc-en.rb +0 -36
- data/examples/simple/lib/articles/methods.rb +0 -55
- data/examples/simple/lib/articles/part.rb +0 -57
- data/examples/simple/root/add-article.sx +0 -15
- data/examples/simple/root/article-form.ss +0 -20
- data/examples/simple/root/comments-form.ss +0 -16
- data/examples/simple/root/comments.si +0 -30
- data/examples/simple/root/index.sx +0 -44
- data/examples/simple/root/shader/shader.xsl +0 -100
- data/examples/simple/root/shader/style.css +0 -9
- data/examples/simple/root/view-article.sx +0 -29
- data/examples/tiny/conf/config.rb +0 -62
- data/examples/tiny/conf/requires.rb +0 -33
- data/examples/tiny/ctl +0 -16
- data/lib/n/parts.rb +0 -157
- data/lib/n/properties.rb +0 -199
- data/lib/n/server/dispatcher.rb +0 -55
- data/lib/n/server/handlers/code-handler.rb +0 -182
- data/lib/n/server/handlers/page-handler.rb +0 -612
- data/lib/n/server/webrick.rb +0 -283
- data/lib/n/shaders.rb +0 -166
- data/lib/n/sync/clc.rb +0 -110
- data/lib/n/sync/handler.rb +0 -229
- data/lib/n/sync/server.rb +0 -176
- data/lib/p/README +0 -1
data/lib/{n/og → og}/backend.rb
RENAMED
@@ -2,19 +2,19 @@
|
|
2
2
|
# * George Moschovitis <gm@navel.gr>
|
3
3
|
#
|
4
4
|
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: backend.rb
|
5
|
+
# $Id: backend.rb 155 2004-11-13 20:32:12Z gmosx $
|
6
6
|
|
7
7
|
require "yaml"
|
8
8
|
|
9
|
-
require "
|
9
|
+
require "og/connection"
|
10
10
|
|
11
|
-
module
|
11
|
+
module Og
|
12
12
|
|
13
13
|
# = OgUtils
|
14
14
|
#
|
15
15
|
# A collection of useful utilities.
|
16
16
|
#
|
17
|
-
module
|
17
|
+
module Utils
|
18
18
|
|
19
19
|
# The name of the SQL table where objects of this class are stored.
|
20
20
|
# The Module separators are replaced with _ and NOT stripped out so
|
@@ -124,7 +124,7 @@ module OgUtils
|
|
124
124
|
if idx = og.managed_classes[klass].field_index[p.name]
|
125
125
|
# more fault tolerant if a new field is added and it
|
126
126
|
# doesnt exist in the database.
|
127
|
-
code << "@#{p.name} = #{
|
127
|
+
code << "@#{p.name} = #{Og::Utils.read_prop(p, idx)}"
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
@@ -137,12 +137,12 @@ module OgUtils
|
|
137
137
|
|
138
138
|
end
|
139
139
|
|
140
|
-
# =
|
140
|
+
# = Backend
|
141
141
|
#
|
142
142
|
# Abstract backend. A backend communicates with the RDBMS.
|
143
143
|
# This is the base class for the various backend implementations.
|
144
144
|
#
|
145
|
-
class
|
145
|
+
class Backend
|
146
146
|
|
147
147
|
# The actual connection to the database
|
148
148
|
attr_accessor :conn
|
@@ -246,6 +246,12 @@ class OgBackend
|
|
246
246
|
def deserialize_all(res, klass)
|
247
247
|
raise "Not implemented"
|
248
248
|
end
|
249
|
+
|
250
|
+
# Return a single integer value from the resultset.
|
251
|
+
#
|
252
|
+
def get_int(res, idx = 0)
|
253
|
+
raise "Not implemented"
|
254
|
+
end
|
249
255
|
|
250
256
|
end
|
251
257
|
|
@@ -3,19 +3,19 @@
|
|
3
3
|
# * Elias Athanasopoulos <elathan@navel.gr>
|
4
4
|
#
|
5
5
|
# (c) 2004 Navel, all rights reserved.
|
6
|
-
# $Id: mysql.rb
|
6
|
+
# $Id: mysql.rb 155 2004-11-13 20:32:12Z gmosx $
|
7
7
|
|
8
8
|
require "mysql"
|
9
9
|
|
10
|
-
require "
|
10
|
+
require "og/backend"
|
11
11
|
|
12
|
-
module
|
12
|
+
module Og
|
13
13
|
|
14
|
-
# =
|
14
|
+
# = Utils
|
15
15
|
#
|
16
16
|
# A collection of useful utilities.
|
17
17
|
#
|
18
|
-
module
|
18
|
+
module Utils
|
19
19
|
|
20
20
|
# Escape an SQL string
|
21
21
|
#
|
@@ -63,17 +63,20 @@ module OgUtils
|
|
63
63
|
# FIXME: add extra handling for float.
|
64
64
|
#
|
65
65
|
def self.write_prop(p)
|
66
|
-
if
|
67
|
-
return "'#\{N::OgUtils.escape(@#{p.symbol})\}'"
|
68
|
-
elsif Time == p.klass
|
69
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.timestamp(@#{p.symbol})\}'" : 'NULL'\}|
|
70
|
-
elsif Date == p.klass
|
71
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.date(@#{p.symbol})\}'" : 'NULL'\}|
|
72
|
-
elsif Object == p.klass or Array == p.klass or Hash == p.klass
|
73
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.escape(@#{p.symbol}.to_yaml)\}'" : ''\}|
|
74
|
-
else
|
75
|
-
# Fixnum, TrueClass
|
66
|
+
if p.klass.ancestors.include?(Integer)
|
76
67
|
return "#\{@#{p.symbol} || 'NULL'\}"
|
68
|
+
elsif p.klass.ancestors.include?(Float)
|
69
|
+
return "#\{@#{p.symbol} || 'NULL'\}"
|
70
|
+
elsif p.klass.ancestors.include?(String)
|
71
|
+
return "'#\{Og::Utils.escape(@#{p.symbol})\}'"
|
72
|
+
elsif p.klass.ancestors.include?(Time)
|
73
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.timestamp(@#{p.symbol})\}'" : 'NULL'\}|
|
74
|
+
elsif p.klass.ancestors.include?(Date)
|
75
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.date(@#{p.symbol})\}'" : 'NULL'\}|
|
76
|
+
elsif p.klass.ancestors.include?(TrueClass)
|
77
|
+
return "#\{@#{p.symbol} || 'NULL'\}"
|
78
|
+
else
|
79
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.escape(@#{p.symbol}.to_yaml)\}'" : "''"\}|
|
77
80
|
end
|
78
81
|
end
|
79
82
|
|
@@ -81,26 +84,21 @@ module OgUtils
|
|
81
84
|
# No need to optimize this, used only to precalculate code.
|
82
85
|
#
|
83
86
|
def self.read_prop(p, idx)
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
when Hash.name
|
100
|
-
return "YAML::load(res[#{idx}])"
|
101
|
-
else # String
|
102
|
-
return "res[#{idx}]"
|
103
|
-
end
|
87
|
+
if p.klass.ancestors.include?(Integer)
|
88
|
+
return "res[#{idx}].to_i()"
|
89
|
+
elsif p.klass.ancestors.include?(Float)
|
90
|
+
return "res[#{idx}].to_f()"
|
91
|
+
elsif p.klass.ancestors.include?(String)
|
92
|
+
return "res[#{idx}]"
|
93
|
+
elsif p.klass.ancestors.include?(Time)
|
94
|
+
return "Og::Utils.parse_timestamp(res[#{idx}])"
|
95
|
+
elsif p.klass.ancestors.include?(Date)
|
96
|
+
return "Og::Utils.parse_date(res[#{idx}])"
|
97
|
+
elsif p.klass.ancestors.include?(TrueClass)
|
98
|
+
return "('true' == res[#{idx}])"
|
99
|
+
else
|
100
|
+
return "YAML::load(res[#{idx}])"
|
101
|
+
end
|
104
102
|
end
|
105
103
|
|
106
104
|
# Returns the props that will be included in the insert query.
|
@@ -139,7 +137,7 @@ module OgUtils
|
|
139
137
|
#
|
140
138
|
def self.eval_og_oid(klass)
|
141
139
|
klass.class_eval %{
|
142
|
-
prop_accessor Fixnum, "integer AUTO_INCREMENT PRIMARY KEY"
|
140
|
+
prop_accessor :oid, Fixnum, :sql => "integer AUTO_INCREMENT PRIMARY KEY"
|
143
141
|
}
|
144
142
|
end
|
145
143
|
end
|
@@ -148,7 +146,7 @@ end
|
|
148
146
|
#
|
149
147
|
# Implements a MySQL powered backend.
|
150
148
|
#
|
151
|
-
class MysqlBackend <
|
149
|
+
class MysqlBackend < Og::Backend
|
152
150
|
|
153
151
|
# A mapping between Ruby and SQL types.
|
154
152
|
#
|
@@ -270,8 +268,8 @@ class MysqlBackend < N::OgBackend
|
|
270
268
|
klass.__props.each do |p|
|
271
269
|
field = "#{p.symbol}"
|
272
270
|
|
273
|
-
if p.sql
|
274
|
-
field << " #{p.sql}"
|
271
|
+
if p.meta and p.meta[:sql]
|
272
|
+
field << " #{p.meta[:sql]}"
|
275
273
|
else
|
276
274
|
field << " #{TYPEMAP[p.klass]}"
|
277
275
|
end
|
@@ -346,6 +344,12 @@ class MysqlBackend < N::OgBackend
|
|
346
344
|
|
347
345
|
return entities
|
348
346
|
end
|
347
|
+
|
348
|
+
# Return a single integer value from the resultset.
|
349
|
+
#
|
350
|
+
def get_int(res, idx = 0)
|
351
|
+
return res.fetch_row[idx].to_i
|
352
|
+
end
|
349
353
|
|
350
354
|
end
|
351
355
|
|
@@ -2,19 +2,19 @@
|
|
2
2
|
# * George Moschovitis <gm@navel.gr>
|
3
3
|
#
|
4
4
|
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: psql.rb
|
5
|
+
# $Id: psql.rb 155 2004-11-13 20:32:12Z gmosx $
|
6
6
|
|
7
7
|
require "postgres"
|
8
8
|
|
9
|
-
require "
|
9
|
+
require "og/backend"
|
10
10
|
|
11
|
-
module
|
11
|
+
module Og
|
12
12
|
|
13
|
-
# =
|
13
|
+
# = Utils
|
14
14
|
#
|
15
15
|
# A collection of useful utilities.
|
16
16
|
#
|
17
|
-
module
|
17
|
+
module Utils
|
18
18
|
|
19
19
|
# Escape an SQL string
|
20
20
|
#
|
@@ -62,17 +62,20 @@ module OgUtils
|
|
62
62
|
# FIXME: add extra handling for float.
|
63
63
|
#
|
64
64
|
def self.write_prop(p)
|
65
|
-
if
|
66
|
-
return "'#\{N::OgUtils.escape(@#{p.symbol})\}'"
|
67
|
-
elsif Time == p.klass
|
68
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.timestamp(@#{p.symbol})\}'" : 'NULL'\}|
|
69
|
-
elsif Date == p.klass
|
70
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.date(@#{p.symbol})\}'" : 'NULL'\}|
|
71
|
-
elsif Object == p.klass or Array == p.klass or Hash == p.klass
|
72
|
-
return %|#\{@#{p.symbol} ? "'#\{N::OgUtils.escape(@#{p.symbol}.to_yaml)\}'" : ''\}|
|
73
|
-
else
|
74
|
-
# Fixnum, TrueClass
|
65
|
+
if p.klass.ancestors.include?(Integer)
|
75
66
|
return "#\{@#{p.symbol} || 'NULL'\}"
|
67
|
+
elsif p.klass.ancestors.include?(Float)
|
68
|
+
return "#\{@#{p.symbol} || 'NULL'\}"
|
69
|
+
elsif p.klass.ancestors.include?(String)
|
70
|
+
return "'#\{Og::Utils.escape(@#{p.symbol})\}'"
|
71
|
+
elsif p.klass.ancestors.include?(Time)
|
72
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.timestamp(@#{p.symbol})\}'" : 'NULL'\}|
|
73
|
+
elsif p.klass.ancestors.include?(Date)
|
74
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.date(@#{p.symbol})\}'" : 'NULL'\}|
|
75
|
+
elsif p.klass.ancestors.include?(TrueClass)
|
76
|
+
return "#\{@#{p.symbol} || 'NULL'\}"
|
77
|
+
else
|
78
|
+
return %|#\{@#{p.symbol} ? "'#\{Og::Utils.escape(@#{p.symbol}.to_yaml)\}'" : "''"\}|
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
@@ -80,25 +83,20 @@ module OgUtils
|
|
80
83
|
# No need to optimize this, used only to precalculate code.
|
81
84
|
#
|
82
85
|
def self.read_prop(p, idx)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
return "YAML::load(res.getvalue(tuple, #{idx}))"
|
98
|
-
when Hash.name
|
99
|
-
return "YAML::load(res.getvalue(tuple, #{idx}))"
|
100
|
-
else # String
|
101
|
-
return "res.getvalue(tuple, #{idx})"
|
86
|
+
if p.klass.ancestors.include?(Integer)
|
87
|
+
return "res.getvalue(tuple, #{idx}).to_i()"
|
88
|
+
elsif p.klass.ancestors.include?(Float)
|
89
|
+
return "res.getvalue(tuple, #{idx}).to_f()"
|
90
|
+
elsif p.klass.ancestors.include?(String)
|
91
|
+
return "res.getvalue(tuple, #{idx})"
|
92
|
+
elsif p.klass.ancestors.include?(Time)
|
93
|
+
return "Og::Utils.parse_timestamp(res.getvalue(tuple, #{idx}))"
|
94
|
+
elsif p.klass.ancestors.include?(Date)
|
95
|
+
return "Og::Utils.parse_date(res.getvalue(tuple, #{idx}))"
|
96
|
+
elsif p.klass.ancestors.include?(TrueClass)
|
97
|
+
return "('true' == res.getvalue(tuple, #{idx}))"
|
98
|
+
else
|
99
|
+
return "YAML::load(res.getvalue(tuple, #{idx}))"
|
102
100
|
end
|
103
101
|
end
|
104
102
|
|
@@ -131,7 +129,7 @@ module OgUtils
|
|
131
129
|
#
|
132
130
|
def self.eval_og_oid(klass)
|
133
131
|
klass.class_eval %{
|
134
|
-
prop_accessor Fixnum, "integer PRIMARY KEY"
|
132
|
+
prop_accessor :oid, Fixnum, :sql => "integer PRIMARY KEY"
|
135
133
|
}
|
136
134
|
end
|
137
135
|
end
|
@@ -140,7 +138,7 @@ end
|
|
140
138
|
#
|
141
139
|
# Implements a PostgreSQL powered backend.
|
142
140
|
#
|
143
|
-
class PsqlBackend <
|
141
|
+
class PsqlBackend < Og::Backend
|
144
142
|
|
145
143
|
# A mapping between Ruby and SQL types.
|
146
144
|
#
|
@@ -247,8 +245,8 @@ class PsqlBackend < N::OgBackend
|
|
247
245
|
klass.__props.each do |p|
|
248
246
|
field = "#{p.symbol}"
|
249
247
|
|
250
|
-
if p.sql
|
251
|
-
field << " #{p.sql}"
|
248
|
+
if p.meta and p.meta[:sql]
|
249
|
+
field << " #{p.meta[:sql]}"
|
252
250
|
else
|
253
251
|
field << " #{TYPEMAP[p.klass]}"
|
254
252
|
end
|
@@ -346,6 +344,12 @@ class PsqlBackend < N::OgBackend
|
|
346
344
|
return entities
|
347
345
|
end
|
348
346
|
|
347
|
+
# Return a single integer value from the resultset.
|
348
|
+
#
|
349
|
+
def get_int(res, idx = 0)
|
350
|
+
return res.getvalue(0, idx).to_i
|
351
|
+
end
|
352
|
+
|
349
353
|
end
|
350
354
|
|
351
355
|
end # module
|
@@ -2,15 +2,15 @@
|
|
2
2
|
# * George Moschovitis <gm@navel.gr>
|
3
3
|
#
|
4
4
|
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: connection.rb
|
5
|
+
# $Id: connection.rb 155 2004-11-13 20:32:12Z gmosx $
|
6
6
|
|
7
|
-
module
|
7
|
+
module Og;
|
8
8
|
|
9
|
-
require "
|
10
|
-
require "
|
11
|
-
require "
|
9
|
+
require "nitro/properties"
|
10
|
+
require "nitro/utils/array"
|
11
|
+
require "nitro/utils/time"
|
12
12
|
|
13
|
-
# =
|
13
|
+
# = Connection
|
14
14
|
#
|
15
15
|
# A Connection to the Database. This file defines the skeleton
|
16
16
|
# functionality. A backend specific implementation file (driver)
|
@@ -21,7 +21,7 @@ require "n/utils/time"
|
|
21
21
|
# - support caching.
|
22
22
|
# - support prepared statements.
|
23
23
|
#
|
24
|
-
class
|
24
|
+
class Connection
|
25
25
|
# The frontend (Og) contains useful strucutres.
|
26
26
|
attr_reader :og
|
27
27
|
|
@@ -140,7 +140,7 @@ class OgConnection
|
|
140
140
|
sql = "SELECT * FROM #{klass::DBTABLE} WHERE #{sql}"
|
141
141
|
end
|
142
142
|
|
143
|
-
res =
|
143
|
+
res = @db.safe_query(sql)
|
144
144
|
@deserialize? @db.deserialize_all(res, klass) : res
|
145
145
|
end
|
146
146
|
|
@@ -151,9 +151,21 @@ class OgConnection
|
|
151
151
|
sql = "SELECT * FROM #{klass::DBTABLE} WHERE #{sql}"
|
152
152
|
end
|
153
153
|
|
154
|
-
res =
|
154
|
+
res = @db.safe_query(sql)
|
155
155
|
@deserialize? @db.deserialize_one(res, klass) : res
|
156
156
|
end
|
157
|
+
|
158
|
+
# Perform a count query.
|
159
|
+
#
|
160
|
+
def count(sql, klass = nil)
|
161
|
+
unless sql =~ /SELECT/i
|
162
|
+
sql = "SELECT COUNT(*) FROM #{klass::DBTABLE} WHERE #{sql}"
|
163
|
+
end
|
164
|
+
|
165
|
+
res = @db.safe_query(sql)
|
166
|
+
|
167
|
+
return @db.get_int(res)
|
168
|
+
end
|
157
169
|
|
158
170
|
# Delete an object from the database. Allways perform a deep delete.
|
159
171
|
#
|
data/lib/{n/og → og}/meta.rb
RENAMED
@@ -2,26 +2,28 @@
|
|
2
2
|
# * George Moschovitis <gm@navel.gr>
|
3
3
|
#
|
4
4
|
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: meta.rb
|
5
|
+
# $Id: meta.rb 155 2004-11-13 20:32:12Z gmosx $
|
6
6
|
|
7
|
-
|
7
|
+
require 'og/backend'
|
8
8
|
|
9
|
-
|
9
|
+
module Og
|
10
|
+
|
11
|
+
# = MetaUtils
|
10
12
|
#
|
11
13
|
# Some useful meta-language utilities.
|
12
14
|
#
|
13
|
-
module
|
15
|
+
module MetaUtils # :nodoc: all
|
14
16
|
|
15
17
|
# Conver the klass to a string representation
|
16
18
|
# The leading module if available is removed.
|
17
19
|
#
|
18
20
|
def self.expand(klass)
|
19
|
-
return klass.name.gsub(/^.*::/,
|
21
|
+
return klass.name.gsub(/^.*::/, '').gsub(/::/, '_').downcase
|
20
22
|
end
|
21
23
|
|
22
24
|
end
|
23
25
|
|
24
|
-
# =
|
26
|
+
# = MetaLanguage
|
25
27
|
#
|
26
28
|
# Implements a meta-language for manipulating og-managed objects
|
27
29
|
# and defining their relationships. The original idea comes
|
@@ -29,7 +31,7 @@ end
|
|
29
31
|
#
|
30
32
|
# Many more useful relations will be available soon.
|
31
33
|
#
|
32
|
-
module
|
34
|
+
module MetaLanguage
|
33
35
|
|
34
36
|
# Implements a 'belongs_to' relation.
|
35
37
|
# Automatically enchants the calling class with helper methods.
|
@@ -46,7 +48,7 @@ module OgMetaLanguage
|
|
46
48
|
# def parent; ... end
|
47
49
|
# def parent=(obj_or_oid); ... end
|
48
50
|
#
|
49
|
-
def belongs_to(
|
51
|
+
def belongs_to(name, klass, options = {})
|
50
52
|
module_eval %{
|
51
53
|
prop_accessor Fixnum, :#{name}_oid
|
52
54
|
|
@@ -96,10 +98,10 @@ module OgMetaLanguage
|
|
96
98
|
#
|
97
99
|
# def children; ... end
|
98
100
|
#
|
99
|
-
def has_many(
|
101
|
+
def has_many(name, klass, options = {})
|
100
102
|
# linkback is the property of the child object that 'links back'
|
101
103
|
# to this object.
|
102
|
-
linkback = options[:linkback] || "#{
|
104
|
+
linkback = options[:linkback] || "#{MetaUtils.expand(self)}_oid"
|
103
105
|
|
104
106
|
module_eval %{
|
105
107
|
@@og_descendants ||= {}
|
@@ -112,7 +114,11 @@ module OgMetaLanguage
|
|
112
114
|
end
|
113
115
|
|
114
116
|
def #{name}(extrasql = nil)
|
115
|
-
$og.select("#{linkback}=\#\@oid \#\{extrasql\}", #{klass})
|
117
|
+
$og.select("SELECT * FROM #{Utils.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}", #{klass})
|
118
|
+
end
|
119
|
+
|
120
|
+
def #{name}_count(extrasql = nil)
|
121
|
+
$og.count("SELECT COUNT(*) FROM #{Utils.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
|
116
122
|
end
|
117
123
|
}
|
118
124
|
end
|
@@ -122,6 +128,6 @@ end
|
|
122
128
|
end # module
|
123
129
|
|
124
130
|
class Module # :nodoc: all
|
125
|
-
include
|
131
|
+
include Og::MetaLanguage
|
126
132
|
end
|
127
133
|
|