nitro 0.3.0 → 0.4.1
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/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
|
|