nitro 0.9.5 → 0.10.0
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 +260 -0
- data/INSTALL +60 -0
- data/LICENSE +1 -0
- data/README +19 -20
- data/RELEASES +48 -0
- data/Rakefile +102 -92
- data/benchmark/og/bench.rb +74 -0
- data/benchmark/og/sqlite-no-prepare.1.txt +13 -0
- data/benchmark/og/sqlite-no-prepare.2.txt +13 -0
- data/benchmark/og/sqlite-prepare.1.txt +13 -0
- data/benchmark/og/sqlite-prepare.2.txt +13 -0
- data/bin/cluster +1 -1
- data/bin/nitro +3 -0
- data/bin/proto/conf/app.conf.rb +2 -10
- data/examples/README.windows +9 -0
- data/examples/blog/README +16 -4
- data/examples/blog/lib/blog.rb +3 -3
- data/examples/blog/lib/blog/controller.rb +7 -9
- data/examples/blog/root/fcgi.rb +2 -4
- data/examples/blog/root/style.xsl +4 -6
- data/examples/blog/run.rb +41 -0
- data/examples/flash/run.rb +9 -0
- data/examples/no_xsl_blog/README +0 -1
- data/examples/no_xsl_blog/conf/app.conf.rb +6 -13
- data/examples/no_xsl_blog/lib/blog.rb +2 -2
- data/examples/no_xsl_blog/lib/blog/controller.rb +6 -6
- data/examples/no_xsl_blog/root/fcgi.rb +2 -4
- data/examples/no_xsl_blog/run.rb +38 -0
- data/examples/og/mock_example.rb +0 -2
- data/examples/og/mysql_to_psql.rb +0 -2
- data/examples/og/run.rb +23 -22
- data/examples/tiny/root/fcgi.rb +2 -4
- data/examples/tiny/root/index.xhtml +21 -5
- data/examples/tiny/root/upload.xhtml +23 -0
- data/examples/tiny/run.rb +9 -0
- data/examples/wee_style/{wee.rb → run.rb} +13 -13
- data/install.rb +44 -0
- data/lib/glue/array.rb +6 -10
- data/lib/glue/attribute.rb +0 -3
- data/lib/glue/cache.rb +1 -1
- data/lib/glue/inflector.rb +5 -5
- data/lib/glue/mixins.rb +3 -12
- data/lib/glue/number.rb +1 -1
- data/lib/glue/object.rb +7 -1
- data/lib/glue/property.rb +32 -22
- data/lib/glue/string.rb +13 -75
- data/lib/glue/time.rb +2 -2
- data/lib/glue/validation.rb +7 -11
- data/lib/nitro.rb +16 -1
- data/lib/nitro/{adaptors → adapters}/cgi.rb +101 -20
- data/lib/nitro/{adaptors → adapters}/fastcgi.rb +3 -2
- data/lib/nitro/{adaptors → adapters}/webrick.rb +4 -4
- data/lib/nitro/builders/rss.rb +1 -1
- data/lib/nitro/builders/xml.rb +8 -10
- data/lib/nitro/cluster.rb +1 -1
- data/lib/nitro/conf.rb +34 -0
- data/lib/nitro/controller.rb +8 -9
- data/lib/nitro/dispatcher.rb +38 -11
- data/lib/nitro/filters.rb +1 -1
- data/lib/nitro/markup.rb +14 -1
- data/lib/nitro/render.rb +7 -10
- data/lib/nitro/runner.rb +232 -0
- data/lib/nitro/ui/pager.rb +2 -6
- data/lib/nitro/uri.rb +7 -11
- data/lib/og.rb +27 -261
- data/lib/og/adapter.rb +352 -0
- data/lib/og/adapters/mysql.rb +304 -0
- data/lib/og/adapters/psql.rb +286 -0
- data/lib/og/adapters/sqlite.rb +262 -0
- data/lib/og/backend.rb +1 -1
- data/lib/og/connection.rb +123 -87
- data/lib/og/database.rb +268 -0
- data/lib/og/meta.rb +23 -22
- data/lib/og/mock.rb +2 -3
- data/lib/xsl/base.xsl +1 -55
- data/test/glue/tc_property.rb +2 -0
- data/test/glue/tc_property_type_checking.rb +32 -0
- data/test/glue/tc_strings.rb +2 -2
- data/test/glue/tc_validation.rb +2 -0
- data/test/nitro/adapters/raw_post1.bin +0 -0
- data/test/nitro/{adaptors → adapters}/tc_cgi.rb +11 -2
- data/test/nitro/{adaptors → adapters}/tc_webrick.rb +3 -3
- data/test/nitro/builders/tc_xml.rb +14 -5
- data/test/nitro/tc_dispatcher.rb +3 -3
- data/test/nitro/tc_uri.rb +2 -4
- data/test/og/tc_lifecycle.rb +22 -25
- data/test/og/tc_sqlite.rb +87 -0
- data/test/tc_og.rb +61 -42
- metadata +67 -33
- data/examples/blog/conf/app.conf.rb +0 -52
- data/examples/blog/ctl +0 -4
- data/examples/flash/conf/app.conf.rb +0 -21
- data/examples/flash/ctl +0 -4
- data/examples/no_xsl_blog/conf/apache.conf +0 -0
- data/examples/no_xsl_blog/ctl +0 -4
- data/examples/tiny/conf/app.conf.rb +0 -17
- data/examples/tiny/ctl +0 -4
- data/lib/glue/macro.rb +0 -56
- data/lib/nitro/adaptors/runner.rb +0 -123
- data/lib/nitro/version.rb +0 -15
- data/lib/og/backends/mysql.rb +0 -370
- data/lib/og/backends/psql.rb +0 -386
- data/lib/og/backends/sqlite.rb +0 -383
- data/lib/og/version.rb +0 -9
data/lib/og/database.rb
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# * George Moschovitis <gm@navel.gr>
|
|
2
|
+
# (c) 2004-2005 Navel, all rights reserved.
|
|
3
|
+
# $Id: database.rb 255 2005-02-10 12:45:32Z gmosx $
|
|
4
|
+
|
|
5
|
+
require 'glue/logger'
|
|
6
|
+
require 'glue/attribute'
|
|
7
|
+
require 'glue/property'
|
|
8
|
+
require 'glue/array'
|
|
9
|
+
require 'glue/hash'
|
|
10
|
+
require 'glue/time'
|
|
11
|
+
require 'glue/pool'
|
|
12
|
+
|
|
13
|
+
require 'og/enchant'
|
|
14
|
+
require 'og/meta'
|
|
15
|
+
|
|
16
|
+
class Og
|
|
17
|
+
|
|
18
|
+
# Encapsulates an Og Database.
|
|
19
|
+
|
|
20
|
+
class Database
|
|
21
|
+
include Og::Enchant
|
|
22
|
+
|
|
23
|
+
# Managed class metadata
|
|
24
|
+
|
|
25
|
+
class ManagedClassMeta
|
|
26
|
+
# The managed class.
|
|
27
|
+
attr_accessor :klass
|
|
28
|
+
|
|
29
|
+
# A mapping of the database fields to the object properties.
|
|
30
|
+
attr_accessor :field_index
|
|
31
|
+
|
|
32
|
+
def initialize(klass = nil)
|
|
33
|
+
@klass = klass
|
|
34
|
+
@field_index = {}
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# hash of configuration options.
|
|
39
|
+
|
|
40
|
+
attr_accessor :config
|
|
41
|
+
|
|
42
|
+
# The adapter that comunicates with the backend
|
|
43
|
+
# datastore.
|
|
44
|
+
|
|
45
|
+
attr_accessor :adapter
|
|
46
|
+
|
|
47
|
+
# Pool of connections.
|
|
48
|
+
|
|
49
|
+
attr_accessor :connection_pool
|
|
50
|
+
|
|
51
|
+
# Managed classes.
|
|
52
|
+
|
|
53
|
+
attr_accessor :managed_classes
|
|
54
|
+
|
|
55
|
+
# Initialize the database interface.
|
|
56
|
+
|
|
57
|
+
def initialize(config)
|
|
58
|
+
@config = config
|
|
59
|
+
|
|
60
|
+
# populate with default options if needed.
|
|
61
|
+
@config[:connection_count] ||= 1
|
|
62
|
+
|
|
63
|
+
Logger.info "Connecting to database '#{@config[:database]}' using the '#{@config[:adapter]}' adapter."
|
|
64
|
+
|
|
65
|
+
@adapter = Adapter.for_name(@config[:adapter])
|
|
66
|
+
|
|
67
|
+
@connection_pool = N::Pool.new
|
|
68
|
+
@managed_classes = N::SafeHash.new
|
|
69
|
+
|
|
70
|
+
@config[:connection_count].times do
|
|
71
|
+
# @connection_pool << Og::Connection.new(self)
|
|
72
|
+
@connection_pool << @adapter.new_connection(self)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# gmosx, FIXME: this automanage code is not elegant and slow
|
|
76
|
+
# should probably recode this, along with glue/property.rb
|
|
77
|
+
|
|
78
|
+
if Og.auto_manage_classes
|
|
79
|
+
# automatically manage classes with properties and metadata.
|
|
80
|
+
# gmosx: Any idea how to optimize this?
|
|
81
|
+
|
|
82
|
+
classes_to_manage = []
|
|
83
|
+
|
|
84
|
+
ObjectSpace.each_object(Class) do |c|
|
|
85
|
+
if c.respond_to?(:__props) and c.__props
|
|
86
|
+
classes_to_manage << c
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
Logger.info "Og auto manages the following classes:"
|
|
91
|
+
Logger.info "#{classes_to_manage.inspect}"
|
|
92
|
+
|
|
93
|
+
manage_classes(*classes_to_manage)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# use the newly created database.
|
|
97
|
+
Og.use(self)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Shutdown the database interface.
|
|
101
|
+
|
|
102
|
+
def shutdown
|
|
103
|
+
for con in @connection_pool
|
|
104
|
+
con.close()
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
alias_method :close, :shutdown
|
|
108
|
+
|
|
109
|
+
# Get a connection from the pool to access the database.
|
|
110
|
+
# Stores the connection in a thread-local variable.
|
|
111
|
+
|
|
112
|
+
def get_connection
|
|
113
|
+
thread = Thread.current
|
|
114
|
+
|
|
115
|
+
unless conn = thread[:og_conn]
|
|
116
|
+
conn = @connection_pool.pop()
|
|
117
|
+
thread[:og_conn] = conn
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
return conn
|
|
121
|
+
end
|
|
122
|
+
alias_method :connection, :get_connection
|
|
123
|
+
|
|
124
|
+
# Restore an unused connection to the pool.
|
|
125
|
+
|
|
126
|
+
def put_connection
|
|
127
|
+
thread = Thread.current
|
|
128
|
+
|
|
129
|
+
if conn = thread[:og_conn]
|
|
130
|
+
thread[:og_conn] = nil
|
|
131
|
+
return @connection_pool.push(conn)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Utility method, automatically restores a connection to the pool.
|
|
136
|
+
|
|
137
|
+
def connect(&block)
|
|
138
|
+
result = nil
|
|
139
|
+
|
|
140
|
+
begin
|
|
141
|
+
conn = get_connection
|
|
142
|
+
result = yield(conn)
|
|
143
|
+
ensure
|
|
144
|
+
put_connection
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
return result
|
|
148
|
+
end
|
|
149
|
+
alias_method :open, :connect
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# Register a standard Ruby class as managed.
|
|
153
|
+
|
|
154
|
+
def manage(klass)
|
|
155
|
+
return if managed?(klass) or klass.ancestors.include?(Og::Unmanageable)
|
|
156
|
+
|
|
157
|
+
@managed_classes[klass] = ManagedClassMeta.new(klass)
|
|
158
|
+
|
|
159
|
+
# Add standard og methods to the class.
|
|
160
|
+
convert(klass)
|
|
161
|
+
|
|
162
|
+
# Add helper methods to the class.
|
|
163
|
+
enchant(klass) if Og.enchant_managed_classes
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Helper method to set multiple managed classes.
|
|
167
|
+
|
|
168
|
+
def manage_classes(*klasses)
|
|
169
|
+
for klass in klasses
|
|
170
|
+
manage(klass)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Stop managing a Ruby class
|
|
175
|
+
|
|
176
|
+
def unmanage(klass)
|
|
177
|
+
@managed_classes.delete(klass)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Is this class managed?
|
|
181
|
+
#
|
|
182
|
+
def managed?(klass)
|
|
183
|
+
return @managed_classes.include?(klass)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Add standard og functionality to the class
|
|
187
|
+
|
|
188
|
+
def convert(klass)
|
|
189
|
+
# gmosx: this check is needed to allow the developer to customize
|
|
190
|
+
# the sql generated for oid
|
|
191
|
+
|
|
192
|
+
@adapter.eval_og_oid(klass) unless klass.instance_methods.include?(:oid)
|
|
193
|
+
|
|
194
|
+
klass.class_eval %{
|
|
195
|
+
DBTABLE = "#{Adapter.table(klass)}"
|
|
196
|
+
DBSEQ = "#{Adapter.table(klass)}_oid_seq"
|
|
197
|
+
|
|
198
|
+
def to_i()
|
|
199
|
+
@oid
|
|
200
|
+
end
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# Create the schema for this class if not available.
|
|
204
|
+
@adapter.create_table(klass, self)
|
|
205
|
+
|
|
206
|
+
# Precompile some code that gets executed all the time.
|
|
207
|
+
# Deletion code is not precompiled, because it is not used
|
|
208
|
+
# as frequently.
|
|
209
|
+
|
|
210
|
+
@adapter.eval_og_insert(klass, self)
|
|
211
|
+
@adapter.eval_og_update(klass, self)
|
|
212
|
+
@adapter.eval_og_read(klass, self)
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Automatically wrap connection methods.
|
|
216
|
+
|
|
217
|
+
def self.wrap_method(method, args)
|
|
218
|
+
args = args.split(/,/)
|
|
219
|
+
class_eval %{
|
|
220
|
+
def #{method}(#{args.join(", ")})
|
|
221
|
+
thread = Thread.current
|
|
222
|
+
|
|
223
|
+
unless conn = thread[:og_conn]
|
|
224
|
+
conn = @connection_pool.pop()
|
|
225
|
+
thread[:og_conn] = conn
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
return conn.#{method}(#{args.collect {|a| a.split(/=/)[0]}.join(", ")})
|
|
229
|
+
end
|
|
230
|
+
}
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
wrap_method :db, ''
|
|
234
|
+
wrap_method :create_table, 'klass'
|
|
235
|
+
wrap_method :drop_table, 'klass'
|
|
236
|
+
wrap_method :save, 'obj'; alias_method :<<, :save; alias_method :put, :save
|
|
237
|
+
wrap_method :insert, 'obj'
|
|
238
|
+
wrap_method :update, 'obj'
|
|
239
|
+
wrap_method :update_properties, 'update_sql, obj_or_oid, klass = nil'
|
|
240
|
+
wrap_method :pupdate, 'update_sql, obj_or_oid, klass = nil'
|
|
241
|
+
wrap_method :load, 'oid, klass'; alias_method :get, :load
|
|
242
|
+
wrap_method :load_by_oid, 'oid, klass'
|
|
243
|
+
wrap_method :load_by_name, 'name, klass'
|
|
244
|
+
wrap_method :load_all, 'klass, extrasql = nil'
|
|
245
|
+
wrap_method :select, 'sql, klass'
|
|
246
|
+
wrap_method :select_one, 'sql, klass'
|
|
247
|
+
wrap_method :count, 'sql, klass = nil'
|
|
248
|
+
wrap_method :delete, 'obj_or_oid, klass = nil'
|
|
249
|
+
wrap_method :prepare, 'sql'
|
|
250
|
+
wrap_method :query, 'sql'
|
|
251
|
+
wrap_method :exec, 'sql'
|
|
252
|
+
|
|
253
|
+
class << self
|
|
254
|
+
def create_db!(config)
|
|
255
|
+
adapter = Adapter.for_name(config[:adapter])
|
|
256
|
+
adapter.create_db(config[:database], config[:user], config[:password])
|
|
257
|
+
end
|
|
258
|
+
alias_method :create!, :create_db!
|
|
259
|
+
|
|
260
|
+
def drop_db!(config)
|
|
261
|
+
adapter = Adapter.for_name(config[:adapter])
|
|
262
|
+
adapter.drop_db(config[:database], config[:user], config[:password])
|
|
263
|
+
end
|
|
264
|
+
alias_method :drop!, :drop_db!
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
end
|
data/lib/og/meta.rb
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
|
3
|
-
# $Id: meta.rb
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
# $Id: meta.rb 254 2005-02-10 12:44:05Z gmosx $
|
|
4
|
+
#--
|
|
5
|
+
# TODO:
|
|
6
|
+
# - precreate the meta sql statements as much as possible to
|
|
7
|
+
# avoid string interpolations.
|
|
8
|
+
#++
|
|
9
|
+
|
|
10
|
+
require 'og/adapter'
|
|
6
11
|
require 'glue/inflector'
|
|
7
12
|
|
|
8
13
|
class Og
|
|
9
14
|
|
|
10
|
-
# = MetaUtils
|
|
11
|
-
#
|
|
12
15
|
# Some useful meta-language utilities.
|
|
13
16
|
|
|
14
17
|
module MetaUtils # :nodoc: all
|
|
@@ -48,8 +51,6 @@ module MetaUtils # :nodoc: all
|
|
|
48
51
|
|
|
49
52
|
end
|
|
50
53
|
|
|
51
|
-
# = MetaLanguage
|
|
52
|
-
#
|
|
53
54
|
# Implements a meta-language for manipulating og-managed objects
|
|
54
55
|
# and defining their relationships. The original idea comes
|
|
55
56
|
# from the excellent ActiveRecord library.
|
|
@@ -125,11 +126,11 @@ module MetaLanguage
|
|
|
125
126
|
|
|
126
127
|
module_eval %{
|
|
127
128
|
def #{name}(extrasql = nil)
|
|
128
|
-
Og.db.select_one("SELECT * FROM #{
|
|
129
|
+
Og.db.select_one("SELECT * FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}", #{klass})
|
|
129
130
|
end
|
|
130
131
|
|
|
131
132
|
def delete_#{name}(extrasql = nil)
|
|
132
|
-
Og.db.exec("DELETE FROM #{
|
|
133
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
|
|
133
134
|
end
|
|
134
135
|
}
|
|
135
136
|
end
|
|
@@ -162,11 +163,11 @@ module MetaLanguage
|
|
|
162
163
|
|
|
163
164
|
module_eval %{
|
|
164
165
|
def #{name}(extrasql = nil)
|
|
165
|
-
Og.db.select("SELECT * FROM #{
|
|
166
|
+
Og.db.select("SELECT * FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}", #{klass})
|
|
166
167
|
end
|
|
167
168
|
|
|
168
169
|
def #{name}_count(extrasql = nil)
|
|
169
|
-
Og.db.count("SELECT COUNT(*) FROM #{
|
|
170
|
+
Og.db.count("SELECT COUNT(*) FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
|
|
170
171
|
end
|
|
171
172
|
|
|
172
173
|
def add_#{name_s}(obj, extra = nil)
|
|
@@ -175,7 +176,7 @@ module MetaLanguage
|
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
def delete_all_#{name}(extrasql = nil)
|
|
178
|
-
Og.db.exec("DELETE FROM #{
|
|
179
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
|
|
179
180
|
end
|
|
180
181
|
}
|
|
181
182
|
end
|
|
@@ -226,23 +227,23 @@ module MetaLanguage
|
|
|
226
227
|
|
|
227
228
|
module_eval %{
|
|
228
229
|
def #{list_o}(extrasql = nil)
|
|
229
|
-
Og.db.select("SELECT d.* FROM #{
|
|
230
|
+
Og.db.select("SELECT d.* FROM #{Og::Adapter.table(klass)} AS d, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
|
|
230
231
|
end
|
|
231
232
|
|
|
232
233
|
def #{list_o}_count(extrasql = nil)
|
|
233
|
-
Og.db.select("SELECT COUNT(*) FROM #{
|
|
234
|
+
Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(klass)} AS d, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
|
|
234
235
|
end
|
|
235
236
|
|
|
236
237
|
def add_#{prop_o}(obj, extra = nil)
|
|
237
|
-
Og.db.exec("INSERT INTO #{
|
|
238
|
+
Og.db.exec("INSERT INTO #{Og::Adapter.join_table(self, klass)} (key1, key2) VALUES (\#\@oid, \#\{obj.oid\})")
|
|
238
239
|
end
|
|
239
240
|
|
|
240
241
|
def delete_#{prop_o}(obj_or_oid, extra = nil)
|
|
241
|
-
Og.db.exec("DELETE FROM #{
|
|
242
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key2=\#\{obj_or_oid.to_i\}")
|
|
242
243
|
end
|
|
243
244
|
|
|
244
245
|
def clear_#{list_o}
|
|
245
|
-
Og.db.exec("DELETE FROM #{
|
|
246
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key1=\#\@oid")
|
|
246
247
|
end
|
|
247
248
|
}
|
|
248
249
|
|
|
@@ -250,23 +251,23 @@ module MetaLanguage
|
|
|
250
251
|
|
|
251
252
|
klass.module_eval %{
|
|
252
253
|
def #{list_m}(extrasql = nil)
|
|
253
|
-
Og.db.select("SELECT s.* FROM #{
|
|
254
|
+
Og.db.select("SELECT s.* FROM #{Og::Adapter.table(self)} AS s, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
|
|
254
255
|
end
|
|
255
256
|
|
|
256
257
|
def #{list_m}_count(extrasql = nil)
|
|
257
|
-
Og.db.select("SELECT COUNT(*) FROM #{
|
|
258
|
+
Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(self)} AS s, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
|
|
258
259
|
end
|
|
259
260
|
|
|
260
261
|
def add_#{prop_m}(obj, extra = nil)
|
|
261
|
-
Og.db.exec("INSERT INTO #{
|
|
262
|
+
Og.db.exec("INSERT INTO #{Og::Adapter.join_table(self, klass)} (key1, key2) VALUES (\#\{obj.oid\}, \#\@oid)")
|
|
262
263
|
end
|
|
263
264
|
|
|
264
265
|
def delete_#{prop_m}(obj_or_oid, extra = nil)
|
|
265
|
-
Og.db.exec("DELETE FROM #{
|
|
266
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key1=\#\{obj_or_oid.to_i\}")
|
|
266
267
|
end
|
|
267
268
|
|
|
268
269
|
def clear_#{list_m}
|
|
269
|
-
Og.db.exec("DELETE FROM #{
|
|
270
|
+
Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key2=\#\@oid")
|
|
270
271
|
end
|
|
271
272
|
}
|
|
272
273
|
end
|
data/lib/og/mock.rb
CHANGED
data/lib/xsl/base.xsl
CHANGED
|
@@ -15,16 +15,10 @@ author: gmosx
|
|
|
15
15
|
|
|
16
16
|
<xsl:stylesheet
|
|
17
17
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
18
|
-
xmlns:xl="http://www.w3.org/1999/xlink"
|
|
19
18
|
xmlns:x="http://www.navel.gr/xml/shader.xsd"
|
|
20
|
-
exclude-result-prefixes="x
|
|
19
|
+
exclude-result-prefixes="x"
|
|
21
20
|
version="1.0">
|
|
22
21
|
|
|
23
|
-
<!-- parameters and constants -->
|
|
24
|
-
|
|
25
|
-
<!-- <xsl:variable name='css'>style.css</xsl:variable> -->
|
|
26
|
-
<!-- <xsl:variable name='lang'>el</xsl:variable> -->
|
|
27
|
-
|
|
28
22
|
<!-- strip comments -->
|
|
29
23
|
<xsl:template match="comment()">
|
|
30
24
|
<!-- strip -->
|
|
@@ -53,38 +47,6 @@ author: gmosx
|
|
|
53
47
|
<xsl:template match="root">
|
|
54
48
|
<xsl:apply-templates/>
|
|
55
49
|
</xsl:template>
|
|
56
|
-
|
|
57
|
-
<!-- create a new, nested output buffer -->
|
|
58
|
-
<xsl:template name="x:ob-start" match="x:ob-start">
|
|
59
|
-
<ruby>
|
|
60
|
-
@out_buffers = [] unless @out_buffers
|
|
61
|
-
@out_buffers.push(@out)
|
|
62
|
-
@out = ""
|
|
63
|
-
</ruby>
|
|
64
|
-
</xsl:template>
|
|
65
|
-
|
|
66
|
-
<!-- close a nested output buffer -->
|
|
67
|
-
<xsl:template name="x:ob-end" match="x:ob-end">
|
|
68
|
-
<ruby>
|
|
69
|
-
@out = @out_buffers.pop()
|
|
70
|
-
</ruby>
|
|
71
|
-
</xsl:template>
|
|
72
|
-
|
|
73
|
-
<!-- close a nested output buffer and write to the parent buffer -->
|
|
74
|
-
<xsl:template name="x:ob-write-end" match="x:ob-write-end">
|
|
75
|
-
<ruby>
|
|
76
|
-
__nested_buffer = @out
|
|
77
|
-
@out = @out_buffers.pop()
|
|
78
|
-
@out += __nested_buffer
|
|
79
|
-
</ruby>
|
|
80
|
-
</xsl:template>
|
|
81
|
-
|
|
82
|
-
<!-- NOT WORKING YET -->
|
|
83
|
-
<xsl:template name="x:cache" match="x:cache">
|
|
84
|
-
<xsl:processing-instruction name='ruby'>
|
|
85
|
-
<![CDATA[__out == __out_buffers.pop()]]>
|
|
86
|
-
</xsl:processing-instruction>
|
|
87
|
-
</xsl:template>
|
|
88
50
|
|
|
89
51
|
<!-- rendering errors -->
|
|
90
52
|
<xsl:template name='x:rendering-errors' match='x:rendering-errors'>
|
|
@@ -128,22 +90,6 @@ author: gmosx
|
|
|
128
90
|
</input>
|
|
129
91
|
</xsl:template>
|
|
130
92
|
|
|
131
|
-
<!--
|
|
132
|
-
Background dispatcher
|
|
133
|
-
A clever hack, web actions are performed in the background without
|
|
134
|
-
redirecting.
|
|
135
|
-
-->
|
|
136
|
-
<xsl:template name='x:dispatcher' match='x:dispatcher'>
|
|
137
|
-
<img id="_dispatch" src="d.gif" alt="" style="display: none" />
|
|
138
|
-
<script type="text/javascript">
|
|
139
|
-
<![CDATA[
|
|
140
|
-
function dispatch(dispatch_url) {
|
|
141
|
-
d = document.getElementById('_dispatch').src = dispatch_url;
|
|
142
|
-
}
|
|
143
|
-
]]>
|
|
144
|
-
</script>
|
|
145
|
-
</xsl:template>
|
|
146
|
-
|
|
147
93
|
<xsl:template name="x:pager-first" match="x:pager-first">
|
|
148
94
|
<ruby>unless @pager.page == @pager.first_page</ruby>
|
|
149
95
|
<a>
|