nitro 0.3.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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