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.
Files changed (148) hide show
  1. data/ChangeLog +284 -0
  2. data/{LICENCE → LICENSE} +1 -1
  3. data/README +13 -17
  4. data/RELEASES +13 -1
  5. data/Rakefile +1 -9
  6. data/bin/cluster.rb +5 -5
  7. data/examples/blog/README +45 -0
  8. data/examples/blog/apache.conf +0 -0
  9. data/examples/blog/app.rb +21 -0
  10. data/examples/blog/config.rb +88 -0
  11. data/examples/blog/lib/blog.rb +104 -0
  12. data/examples/blog/log/app.log +117 -0
  13. data/examples/blog/root/comments.xhtml +38 -0
  14. data/examples/blog/root/entry_form.xhtml +18 -0
  15. data/examples/blog/root/index.xhtml +43 -0
  16. data/examples/blog/root/login.xhtml +24 -0
  17. data/examples/blog/root/m/bubbles.gif +0 -0
  18. data/examples/blog/root/m/comments_curve.gif +0 -0
  19. data/examples/blog/root/m/down.gif +0 -0
  20. data/examples/blog/root/m/footer_bg.gif +0 -0
  21. data/examples/blog/root/m/garrow.gif +0 -0
  22. data/examples/blog/root/m/gbull.gif +0 -0
  23. data/examples/blog/root/m/grbull.gif +0 -0
  24. data/examples/blog/root/m/h1_bg.gif +0 -0
  25. data/examples/blog/root/m/header_bg.gif +0 -0
  26. data/examples/blog/root/m/obull.gif +0 -0
  27. data/examples/blog/root/m/page_bg.gif +0 -0
  28. data/examples/blog/root/m/side_title_bg.gif +0 -0
  29. data/examples/blog/root/m/sidebar_bg.gif +0 -0
  30. data/examples/blog/root/recent_posts.xhtml +14 -0
  31. data/examples/blog/root/style.css +201 -0
  32. data/examples/blog/root/style.xsl +118 -0
  33. data/examples/blog/root/view_entry.xhtml +29 -0
  34. data/examples/og/run.rb +27 -29
  35. data/examples/tiny/README +3 -4
  36. data/examples/tiny/app.rb +6 -16
  37. data/examples/tiny/config.rb +30 -0
  38. data/examples/tiny/log/app.log +23 -0
  39. data/examples/tiny/root/{index.sx → index.xhtml} +3 -6
  40. data/lib/{n/std.rb → nitro.rb} +9 -4
  41. data/lib/{n → nitro}/application.rb +13 -7
  42. data/lib/{n → nitro}/config.rb +38 -8
  43. data/lib/{n → nitro}/events.rb +1 -1
  44. data/lib/{n → nitro}/l10n.rb +1 -1
  45. data/lib/{n → nitro}/logger.rb +8 -8
  46. data/lib/{n → nitro}/macros.rb +3 -3
  47. data/lib/{n → nitro}/mixins.rb +1 -1
  48. data/lib/nitro/properties.rb +301 -0
  49. data/lib/{n → nitro}/server.rb +2 -2
  50. data/lib/{n → nitro}/server/appserver.rb +14 -5
  51. data/lib/{n → nitro}/server/cluster.rb +5 -5
  52. data/lib/{n → nitro}/server/cookie.rb +1 -1
  53. data/lib/nitro/server/dispatcher.rb +66 -0
  54. data/lib/{n → nitro}/server/filters.rb +7 -7
  55. data/lib/{n → nitro}/server/filters/autologin.rb +3 -3
  56. data/lib/{n → nitro}/server/fragment.rb +3 -3
  57. data/lib/{n → nitro}/server/handlers.rb +3 -3
  58. data/lib/nitro/server/render.rb +200 -0
  59. data/lib/{n → nitro}/server/request.rb +6 -6
  60. data/lib/{n → nitro}/server/requestpart.rb +5 -5
  61. data/lib/{n → nitro}/server/script.rb +3 -3
  62. data/lib/{n → nitro}/server/server.rb +4 -4
  63. data/lib/{n → nitro}/server/session.rb +3 -3
  64. data/lib/nitro/server/shaders.rb +165 -0
  65. data/lib/{n → nitro}/server/user.rb +1 -1
  66. data/lib/nitro/server/webrick.rb +175 -0
  67. data/lib/nitro/service.rb +25 -0
  68. data/lib/{n → nitro}/sitemap.rb +2 -2
  69. data/lib/{n → nitro}/ui/date-select.rb +0 -0
  70. data/lib/{n → nitro}/ui/pager.rb +1 -1
  71. data/lib/{n → nitro}/ui/popup.rb +1 -1
  72. data/lib/{n → nitro}/ui/select.rb +1 -1
  73. data/lib/{n → nitro}/ui/tabs.rb +1 -1
  74. data/lib/{n → nitro}/utils/array.rb +1 -1
  75. data/lib/{n → nitro}/utils/cache.rb +1 -1
  76. data/lib/{n → nitro}/utils/gfx.rb +1 -1
  77. data/lib/{n → nitro}/utils/hash.rb +1 -1
  78. data/lib/{n → nitro}/utils/html.rb +1 -1
  79. data/lib/{n → nitro}/utils/http.rb +1 -1
  80. data/lib/{n → nitro}/utils/mail.rb +1 -1
  81. data/lib/{n → nitro}/utils/number.rb +1 -1
  82. data/lib/{n → nitro}/utils/pool.rb +1 -1
  83. data/lib/{n → nitro}/utils/string.rb +19 -95
  84. data/lib/{n → nitro}/utils/template.rb +0 -0
  85. data/lib/{n → nitro}/utils/time.rb +1 -1
  86. data/lib/{n → nitro}/utils/uri.rb +3 -3
  87. data/lib/nitro/version.rb +11 -0
  88. data/lib/{n/og.rb → og.rb} +61 -31
  89. data/lib/{n/og → og}/backend.rb +13 -7
  90. data/lib/{n/og → og}/backends/mysql.rb +43 -39
  91. data/lib/{n/og → og}/backends/psql.rb +42 -38
  92. data/lib/{n/og → og}/connection.rb +21 -9
  93. data/lib/{n/og → og}/meta.rb +18 -12
  94. data/lib/xsl/base.xsl +11 -88
  95. data/test/n/server/tc_cookie.rb +1 -1
  96. data/test/n/server/tc_filters.rb +1 -1
  97. data/test/n/server/tc_request.rb +3 -3
  98. data/test/n/server/tc_requestpart.rb +2 -2
  99. data/test/n/server/tc_session.rb +1 -1
  100. data/test/n/tc_events.rb +1 -1
  101. data/test/n/tc_og.rb +16 -18
  102. data/test/n/tc_properties.rb +22 -18
  103. data/test/n/tc_sitemap.rb +2 -2
  104. data/test/n/ui/tc_pager.rb +4 -4
  105. data/test/n/utils/tc_cache.rb +1 -1
  106. data/test/n/utils/tc_hash.rb +1 -1
  107. data/test/n/utils/tc_html.rb +1 -1
  108. data/test/n/utils/tc_http.rb +1 -1
  109. data/test/n/utils/tc_number.rb +1 -1
  110. data/test/n/utils/tc_strings.rb +1 -46
  111. data/test/n/utils/tc_uri.rb +1 -1
  112. metadata +101 -108
  113. data/examples/simple/README +0 -42
  114. data/examples/simple/app.rb +0 -31
  115. data/examples/simple/conf/apache.conf +0 -100
  116. data/examples/simple/conf/config.rb +0 -72
  117. data/examples/simple/conf/debug-config.rb +0 -26
  118. data/examples/simple/conf/live-config.rb +0 -26
  119. data/examples/simple/conf/requires.rb +0 -43
  120. data/examples/simple/ctl +0 -32
  121. data/examples/simple/env.rb +0 -32
  122. data/examples/simple/install.rb +0 -12
  123. data/examples/simple/lib/articles/entities.rb +0 -37
  124. data/examples/simple/lib/articles/lc-en.rb +0 -36
  125. data/examples/simple/lib/articles/methods.rb +0 -55
  126. data/examples/simple/lib/articles/part.rb +0 -57
  127. data/examples/simple/root/add-article.sx +0 -15
  128. data/examples/simple/root/article-form.ss +0 -20
  129. data/examples/simple/root/comments-form.ss +0 -16
  130. data/examples/simple/root/comments.si +0 -30
  131. data/examples/simple/root/index.sx +0 -44
  132. data/examples/simple/root/shader/shader.xsl +0 -100
  133. data/examples/simple/root/shader/style.css +0 -9
  134. data/examples/simple/root/view-article.sx +0 -29
  135. data/examples/tiny/conf/config.rb +0 -62
  136. data/examples/tiny/conf/requires.rb +0 -33
  137. data/examples/tiny/ctl +0 -16
  138. data/lib/n/parts.rb +0 -157
  139. data/lib/n/properties.rb +0 -199
  140. data/lib/n/server/dispatcher.rb +0 -55
  141. data/lib/n/server/handlers/code-handler.rb +0 -182
  142. data/lib/n/server/handlers/page-handler.rb +0 -612
  143. data/lib/n/server/webrick.rb +0 -283
  144. data/lib/n/shaders.rb +0 -166
  145. data/lib/n/sync/clc.rb +0 -110
  146. data/lib/n/sync/handler.rb +0 -229
  147. data/lib/n/sync/server.rb +0 -176
  148. data/lib/p/README +0 -1
@@ -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 123 2004-11-01 11:55:11Z gmosx $
5
+ # $Id: backend.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
7
  require "yaml"
8
8
 
9
- require "n/og/connection"
9
+ require "og/connection"
10
10
 
11
- module N
11
+ module Og
12
12
 
13
13
  # = OgUtils
14
14
  #
15
15
  # A collection of useful utilities.
16
16
  #
17
- module OgUtils
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} = #{N::OgUtils.read_prop(p, idx)}"
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
- # = OgBackend
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 OgBackend
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 123 2004-11-01 11:55:11Z gmosx $
6
+ # $Id: mysql.rb 155 2004-11-13 20:32:12Z gmosx $
7
7
 
8
8
  require "mysql"
9
9
 
10
- require "n/og/backend"
10
+ require "og/backend"
11
11
 
12
- module N
12
+ module Og
13
13
 
14
- # = OgUtils
14
+ # = Utils
15
15
  #
16
16
  # A collection of useful utilities.
17
17
  #
18
- module OgUtils
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 String == p.klass
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
- case p.klass.to_s
85
- when Fixnum.name
86
- return "res[#{idx}].to_i()"
87
- when Float.name
88
- return "res[#{idx}].to_f()"
89
- when Time.name
90
- return "N::OgUtils.parse_timestamp(res[#{idx}])"
91
- when Date.name
92
- return "N::OgUtils.parse_date(res[#{idx}])"
93
- when TrueClass.name
94
- return "('true' == res[#{idx}])"
95
- when Object.name
96
- return "YAML::load(res[#{idx}])"
97
- when Array.name
98
- return "YAML::load(res[#{idx}])"
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", :oid
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 < N::OgBackend
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 123 2004-11-01 11:55:11Z gmosx $
5
+ # $Id: psql.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
7
  require "postgres"
8
8
 
9
- require "n/og/backend"
9
+ require "og/backend"
10
10
 
11
- module N
11
+ module Og
12
12
 
13
- # = OgUtils
13
+ # = Utils
14
14
  #
15
15
  # A collection of useful utilities.
16
16
  #
17
- module OgUtils
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 String == p.klass
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
- case p.klass.to_s
84
- when Fixnum.name
85
- return "res.getvalue(tuple, #{idx}).to_i()"
86
- when Float.name
87
- return "res.getvalue(tuple, #{idx}).to_f()"
88
- when Time.name
89
- return "N::OgUtils.parse_timestamp(res.getvalue(tuple, #{idx}))"
90
- when Date.name
91
- return "N::OgUtils.parse_date(res.getvalue(tuple, #{idx}))"
92
- when TrueClass.name
93
- return "('true' == res.getvalue(tuple, #{idx}))"
94
- when Object.name
95
- return "YAML::load(res.getvalue(tuple, #{idx}))"
96
- when Array.name
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", :oid
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 < N::OgBackend
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 124 2004-11-01 12:34:17Z gmosx $
5
+ # $Id: connection.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- module N;
7
+ module Og;
8
8
 
9
- require "n/properties"
10
- require "n/utils/array"
11
- require "n/utils/time"
9
+ require "nitro/properties"
10
+ require "nitro/utils/array"
11
+ require "nitro/utils/time"
12
12
 
13
- # = OgConnection
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 OgConnection
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 = query(sql)
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 = query(sql)
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
  #
@@ -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 124 2004-11-01 12:34:17Z gmosx $
5
+ # $Id: meta.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- module N
7
+ require 'og/backend'
8
8
 
9
- # = OgMetaUtils
9
+ module Og
10
+
11
+ # = MetaUtils
10
12
  #
11
13
  # Some useful meta-language utilities.
12
14
  #
13
- module OgMetaUtils # :nodoc: all
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(/^.*::/, "").gsub(/::/, "_").downcase
21
+ return klass.name.gsub(/^.*::/, '').gsub(/::/, '_').downcase
20
22
  end
21
23
 
22
24
  end
23
25
 
24
- # = OgMetaLanguage
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 OgMetaLanguage
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(klass, name, options = {})
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(klass, name, options = {})
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] || "#{N::OgMetaUtils.expand(self)}_oid"
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 N::OgMetaLanguage
131
+ include Og::MetaLanguage
126
132
  end
127
133