spiderfw 0.5.5 → 0.5.6
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/apps/webdav/controllers/webdav_controller.rb +4 -4
- data/apps/webdav/lib/vfs/mapped.rb +2 -2
- data/lib/spiderfw/app.rb +1 -0
- data/lib/spiderfw/config/options/spider.rb +1 -0
- data/lib/spiderfw/controller/http_controller.rb +2 -0
- data/lib/spiderfw/http/adapters/mongrel.rb +30 -10
- data/lib/spiderfw/model/base_model.rb +17 -4
- data/lib/spiderfw/model/mappers/db_mapper.rb +24 -5
- data/lib/spiderfw/model/query_set.rb +6 -1
- data/lib/spiderfw/model/storage/db/adapters/oci8.rb +4 -1
- data/lib/spiderfw/model/storage/db/db_schema.rb +5 -1
- data/lib/spiderfw/utils/logger.rb +3 -0
- data/lib/spiderfw.rb +0 -1
- data/spider.gemspec +2 -2
- metadata +2 -2
@@ -351,7 +351,7 @@ module Spider; module WebDAV
|
|
351
351
|
raise HTTPStatus.NO_CONTENT
|
352
352
|
else
|
353
353
|
Spider::Logger.error("UNLOCK OF #{path} FAILED!!!")
|
354
|
-
raise Forbidden
|
354
|
+
raise Forbidden, "Unlock of path #{path}"
|
355
355
|
end
|
356
356
|
end
|
357
357
|
|
@@ -362,7 +362,7 @@ module Spider; module WebDAV
|
|
362
362
|
begin
|
363
363
|
vfs.mkdir(path)
|
364
364
|
rescue Errno::ENOENT, Errno::EACCES
|
365
|
-
raise Forbidden
|
365
|
+
raise Forbidden, "MKCOL of path #{path}"
|
366
366
|
rescue Errno::ENOSPC
|
367
367
|
raise HTTPStatus.WEBDAV_INSUFFICIENT_STORAGE
|
368
368
|
rescue Errno::EEXIST
|
@@ -378,7 +378,7 @@ module Spider; module WebDAV
|
|
378
378
|
|
379
379
|
vfs.unlock_all(lock.resource) if vfs.locking? and lock
|
380
380
|
rescue Errno::EPERM
|
381
|
-
raise Forbidden
|
381
|
+
raise Forbidden, "DELETE #{path}"
|
382
382
|
end
|
383
383
|
raise HTTPStatus.NO_CONTENT
|
384
384
|
end
|
@@ -829,7 +829,7 @@ module Spider; module WebDAV
|
|
829
829
|
src = path
|
830
830
|
dest = normalize_path(@request.env['HTTP_DESTINATION'])
|
831
831
|
|
832
|
-
src == dest and raise Forbidden
|
832
|
+
src == dest and raise Forbidden, "Copy or move #{src} on itself"
|
833
833
|
|
834
834
|
if @request.env['REQUEST_METHOD'] == 'MOVE'
|
835
835
|
# MOVE - check lock on source
|
@@ -77,11 +77,11 @@ module Spider; module WebDAV; module VFS
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def cp(src, dst, recursive=true)
|
80
|
-
raise Forbidden
|
80
|
+
raise Forbidden, "Copy #{src} -> #{dst}"
|
81
81
|
end
|
82
82
|
|
83
83
|
def mv(src, dst)
|
84
|
-
raise Forbidden
|
84
|
+
raise Forbidden, "Move #{src} -> #{dst}"
|
85
85
|
end
|
86
86
|
|
87
87
|
def exists?(path)
|
data/lib/spiderfw/app.rb
CHANGED
@@ -21,6 +21,7 @@ module Spider
|
|
21
21
|
config_option 'webserver.port', _("Port to use for the http server"), :default => 8080
|
22
22
|
config_option 'webserver.force_threads', _("Force threading on non-threaded adapters"),
|
23
23
|
:default => Proc.new{ RUBY_VERSION_PARTS[1] == '8' ? true : false }
|
24
|
+
config_option 'webserver.timeout', _("Time allowed for each request (in seconds)"), :type=> Fixnum, :default => nil
|
24
25
|
# Client
|
25
26
|
config_option 'client.text_editor', _("The text editor installed on the client")
|
26
27
|
|
@@ -78,6 +78,17 @@ module Spider; module HTTP
|
|
78
78
|
|
79
79
|
def initialize(server)
|
80
80
|
@server = server
|
81
|
+
if (Spider.conf.get('webserver.timeout'))
|
82
|
+
begin
|
83
|
+
require 'system_timer'
|
84
|
+
@timer = SystemTimer
|
85
|
+
rescue LoadError
|
86
|
+
require 'timeout'
|
87
|
+
@timer = Timeout
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
81
92
|
#@request_notify = true
|
82
93
|
end
|
83
94
|
|
@@ -113,16 +124,25 @@ module Spider; module HTTP
|
|
113
124
|
end
|
114
125
|
|
115
126
|
begin
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
127
|
+
main_block = lambda do
|
128
|
+
controller = ::Spider::HTTPController.new(controller_request, controller_response)
|
129
|
+
controller.extend(Spider::FirstResponder)
|
130
|
+
Spider::Logger.debug("CONTROLLER: #{controller}")
|
131
|
+
controller.before(path)
|
132
|
+
MongrelIO.send_headers(controller_response, response) unless Spider.conf.get('http.auto_headers')
|
133
|
+
controller.execute(path)
|
134
|
+
Spider::Logger.debug("Response:")
|
135
|
+
Spider::Logger.debug(controller.response)
|
136
|
+
controller.after(path)
|
137
|
+
Spider::Logger.debug("Controller #{controller} DONE")
|
138
|
+
end
|
139
|
+
if (Spider.conf.get('webserver.timeout'))
|
140
|
+
@timer.timeout(Spider.conf.get('webserver.timeout')) do
|
141
|
+
main_block.call
|
142
|
+
end
|
143
|
+
else
|
144
|
+
main_block.call
|
145
|
+
end
|
126
146
|
rescue => exc
|
127
147
|
Spider.logger.error(exc)
|
128
148
|
controller.ensure() if controller
|
@@ -210,7 +210,7 @@ module Spider; module Model
|
|
210
210
|
|
211
211
|
orig_type = type
|
212
212
|
assoc_type = nil
|
213
|
-
if (attributes[:junction] || (attributes[:multiple] && (!attributes[:add_reverse]) && (!attributes[:has_single_reverse]) && \
|
213
|
+
if (proc || attributes[:junction] || (attributes[:multiple] && (!attributes[:add_reverse]) && (!attributes[:has_single_reverse]) && \
|
214
214
|
# FIXME! the first check is needed when the referenced class has not been parsed yet
|
215
215
|
# but now it assumes that the reverse is not multiple if it is not defined
|
216
216
|
(attributes[:has_single_reverse] == false || !attributes[:reverse] || (!type.elements[attributes[:reverse]] || type.elements[attributes[:reverse]].multiple?))))
|
@@ -807,6 +807,11 @@ module Spider; module Model
|
|
807
807
|
@mapper_modules << mod
|
808
808
|
end
|
809
809
|
|
810
|
+
def self.mapper_include_for(params, mod)
|
811
|
+
@mapper_modules_for ||= []
|
812
|
+
@mapper_modules_for << [params, mod]
|
813
|
+
end
|
814
|
+
|
810
815
|
# The given proc will be mixed in the mapper used by this class
|
811
816
|
# Note that the proc will be converted to a Module, so any overridden methods will still have
|
812
817
|
# access to the super method.
|
@@ -881,6 +886,13 @@ module Spider; module Model
|
|
881
886
|
if (@mapper_modules)
|
882
887
|
@mapper_modules.each{ |mod| mapper.extend(mod) }
|
883
888
|
end
|
889
|
+
if (@mapper_modules_for)
|
890
|
+
@mapper_modules_for.each do |params, mod|
|
891
|
+
if params.is_a?(String)
|
892
|
+
mapper.extend(mod) if self.use_storage == params
|
893
|
+
end
|
894
|
+
end
|
895
|
+
end
|
884
896
|
if (@mapper_procs)
|
885
897
|
@mapper_procs.each{ |proc| mapper.instance_eval(&proc) }
|
886
898
|
end
|
@@ -1059,7 +1071,7 @@ module Spider; module Model
|
|
1059
1071
|
end
|
1060
1072
|
end
|
1061
1073
|
obj.identity_mapper = self.identity_mapper if obj.respond_to?(:identity_mapper)
|
1062
|
-
if (element.attributes[:junction] && element.attributes[:keep_junction])
|
1074
|
+
if (element.multiple? && element.attributes[:junction] && element.attributes[:keep_junction])
|
1063
1075
|
obj.append_element = element.attributes[:junction_their_element]
|
1064
1076
|
end
|
1065
1077
|
if (element.attributes[:set] && element.attributes[:set].is_a?(Hash))
|
@@ -1108,8 +1120,9 @@ module Spider; module Model
|
|
1108
1120
|
element = element.name if (element.class == Spider::Model::Element)
|
1109
1121
|
first, rest = element.to_s.split('.', 2)
|
1110
1122
|
if (rest)
|
1111
|
-
|
1112
|
-
return
|
1123
|
+
sub_val = send(first)
|
1124
|
+
return nil unless sub_val
|
1125
|
+
return sub_val.get(rest)
|
1113
1126
|
end
|
1114
1127
|
return send(element)
|
1115
1128
|
end
|
@@ -337,10 +337,11 @@ module Spider; module Model; module Mappers
|
|
337
337
|
primary_keys << field if model_pks.include?(el)
|
338
338
|
seen_fields[field.name] = true
|
339
339
|
end
|
340
|
-
elsif (!element.
|
340
|
+
elsif (!element.attributes[:junction])
|
341
341
|
if (schema.has_foreign_fields?(el))
|
342
342
|
element.model.primary_keys.each do |key|
|
343
343
|
field = schema.foreign_key_field(el, key.name)
|
344
|
+
raise "Can't find a foreign key field for key #{key.name} of element #{el} of model #{@model}" unless field
|
344
345
|
unless seen_fields[field.name]
|
345
346
|
keys << field
|
346
347
|
primary_keys << field if model_pks.include?(el)
|
@@ -459,10 +460,28 @@ module Spider; module Model; module Mappers
|
|
459
460
|
element = model.elements[k.to_sym]
|
460
461
|
if (!v.is_a?(Condition) && element.model?)
|
461
462
|
condition.delete(element.name)
|
462
|
-
|
463
|
-
|
464
|
-
|
463
|
+
def set_pks_condition(condition, el, val, prefix)
|
464
|
+
el.model.primary_keys.each do |primary_key|
|
465
|
+
new_prefix = "#{prefix}.#{primary_key.name}"
|
466
|
+
if (primary_key.model?)
|
467
|
+
if (primary_key.model.primary_keys.length == 1)
|
468
|
+
# FIXME: this should not be needed, see below
|
469
|
+
condition.set(new_prefix, '=', val.get(primary_key).get(primary_key.model.primary_keys[0]))
|
470
|
+
else
|
471
|
+
# FIXME! does not work, the subcondition does not get processed
|
472
|
+
raise "Subonditions on multiple key elements not supported yet"
|
473
|
+
set_pks_condition(condition, primary_key, val.get(primary_key), new_prefix)
|
474
|
+
end
|
475
|
+
else
|
476
|
+
condition.set(new_prefix, '=', val.get(primary_key))
|
477
|
+
end
|
465
478
|
end
|
479
|
+
end
|
480
|
+
if (v.is_a?(BaseModel))
|
481
|
+
set_pks_condition(condition, element, v, element.name)
|
482
|
+
# element.model.primary_keys.each do |primary_key|
|
483
|
+
# condition.set("#{element.name}.#{primary_key.name}", '=', v.get(primary_key))
|
484
|
+
# end
|
466
485
|
elsif (element.model.primary_keys.length == 1 )
|
467
486
|
new_v = Condition.new
|
468
487
|
if (model.mapper.have_references?(element.name))
|
@@ -892,7 +911,7 @@ module Spider; module Model; module Mappers
|
|
892
911
|
column.primary_key = true if element.primary_key?
|
893
912
|
schema.set_column(element.name, column)
|
894
913
|
elsif (true) # FIXME: must have condition element.storage == @storage in some of the subcases
|
895
|
-
if (!element.multiple?) # 1/n <-> 1
|
914
|
+
if (!element.multiple? && !element.attributes[:junction]) # 1/n <-> 1
|
896
915
|
current_schema = schema.foreign_keys[element.name] || {}
|
897
916
|
foreign_key_constraints = {}
|
898
917
|
element.type.primary_keys.each do |key|
|
@@ -315,7 +315,12 @@ module Spider; module Model
|
|
315
315
|
def search_key(obj, name) # :nodoc:
|
316
316
|
sub = obj.is_a?(Hash) ? obj[name] : obj.get(name.to_sym)
|
317
317
|
if (sub.is_a?(Spider::Model::BaseModel))
|
318
|
-
|
318
|
+
name_parts = name.to_s.split('.')
|
319
|
+
model = @model
|
320
|
+
name_parts.each do |part|
|
321
|
+
model = model.elements[part.to_sym].type
|
322
|
+
end
|
323
|
+
model.primary_keys.map{ |k| sub.get(k).to_s }.join(',')
|
319
324
|
else
|
320
325
|
sub.to_s
|
321
326
|
end
|
@@ -108,10 +108,13 @@ module Spider; module Model; module Storage; module Db
|
|
108
108
|
case type.name
|
109
109
|
when 'Date', 'DateTime'
|
110
110
|
return nil unless value
|
111
|
+
return value if value.is_a?(Type)
|
111
112
|
return value.to_datetime if type == DateTime
|
112
113
|
return value.to_date # FIXME: check what is returned, here we espect an OCI8::Date
|
113
114
|
when 'Spider::DataTypes::Text'
|
114
115
|
value = value.read if value.respond_to?(:read)
|
116
|
+
when 'Spider::DataTypes::Decimal', 'BigDecimal'
|
117
|
+
value = value.to_s
|
115
118
|
end
|
116
119
|
return super(type, value)
|
117
120
|
end
|
@@ -276,7 +279,7 @@ module Spider; module Model; module Storage; module Db
|
|
276
279
|
pk_sql = query[:primary_keys].join(', ')
|
277
280
|
distinct_sql = "SELECT DISTINCT #{pk_sql} FROM #{tables_sql}"
|
278
281
|
distinct_sql += " WHERE #{where}" if where && !where.empty?
|
279
|
-
data_sql = "SELECT #{keys} FROM #{
|
282
|
+
data_sql = "SELECT #{keys} FROM #{tables_sql} WHERE #{pk_sql} IN (#{distinct_sql}) order by #{order}"
|
280
283
|
else
|
281
284
|
data_sql = "#{sql} order by #{order}"
|
282
285
|
end
|
@@ -172,6 +172,10 @@ module Spider; module Model; module Storage; module Db
|
|
172
172
|
@name
|
173
173
|
end
|
174
174
|
|
175
|
+
def inspect
|
176
|
+
"#<#{self.class.name}:#{self.object_id} @name=\"#{@name}\ >"
|
177
|
+
end
|
178
|
+
|
175
179
|
end
|
176
180
|
|
177
181
|
class Field
|
@@ -203,7 +207,7 @@ module Spider; module Model; module Storage; module Db
|
|
203
207
|
end
|
204
208
|
|
205
209
|
def inspect
|
206
|
-
"#<#{self.class.name}:#{self.object_id} @name=\"#{@name}\", @table=#<Spider::Model::Storage::Db::Table
|
210
|
+
"#<#{self.class.name}:#{self.object_id} @name=\"#{@name}\", @table=#<Spider::Model::Storage::Db::Table:#{@table.object_id} #{@table.name}> >"
|
207
211
|
end
|
208
212
|
|
209
213
|
end
|
@@ -44,6 +44,9 @@ module Spider
|
|
44
44
|
def send_to_loggers(action, *args)
|
45
45
|
return if $SAFE > 1
|
46
46
|
return unless @loggers
|
47
|
+
if args[0].is_a?(String)
|
48
|
+
args[0] = "T#{Thread.current.object_id} #{args[0]}"
|
49
|
+
end
|
47
50
|
@loggers.each do |dest, logger|
|
48
51
|
begin
|
49
52
|
logger.send(action, *args)
|
data/lib/spiderfw.rb
CHANGED
data/spider.gemspec
CHANGED
@@ -2,8 +2,8 @@ require 'rake'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "spiderfw"
|
5
|
-
s.version = "0.5.
|
6
|
-
s.date = "2010-02-
|
5
|
+
s.version = "0.5.6"
|
6
|
+
s.date = "2010-02-26"
|
7
7
|
s.summary = "A (web) framework"
|
8
8
|
s.email = "abmajor7@gmail.com"
|
9
9
|
s.homepage = "http://github.com/me/spider"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spiderfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Pirlik
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-26 00:00:00 +01:00
|
13
13
|
default_executable: spider
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|