sdb_dal 0.0.7 → 0.0.8
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.
@@ -16,19 +16,19 @@ module SdbDal
|
|
16
16
|
@attribute_values=HashWithIndifferentAccess.new
|
17
17
|
|
18
18
|
copy_attributes(options)
|
19
|
-
|
19
|
+
|
20
20
|
@accessor_cache={}
|
21
21
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def copy_attributes(hash)
|
25
25
|
self.class.attribute_descriptions.each do |attribute_name,description|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
value=hash[attribute_name]
|
27
|
+
value=value || hash[attribute_name.intern]
|
28
|
+
if !description.is_collection && value.respond_to?(:flatten) && value.length==1
|
29
|
+
value=value[0]
|
30
|
+
end
|
31
|
+
@attribute_values[attribute_name]=value
|
32
32
|
|
33
33
|
end
|
34
34
|
|
@@ -45,10 +45,10 @@ module SdbDal
|
|
45
45
|
end
|
46
46
|
def set_map(keys,values)
|
47
47
|
(0..keys.length-1).each do |i|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
key=keys[i]
|
49
|
+
value=values[i]
|
50
|
+
@attribute_values[key]=value
|
51
|
+
end
|
52
52
|
|
53
53
|
|
54
54
|
end
|
@@ -60,7 +60,7 @@ module SdbDal
|
|
60
60
|
|
61
61
|
def self.index(index_name,columns,options={})
|
62
62
|
@index_descriptions||={}
|
63
|
-
|
63
|
+
return if self.index_descriptions[index_name]
|
64
64
|
$columns_xxx=columns
|
65
65
|
class_eval <<-GETTERDONE
|
66
66
|
|
@@ -163,7 +163,7 @@ module SdbDal
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
GETTERDONE
|
166
|
-
|
166
|
+
return if self.attribute_descriptions.has_key?(name)
|
167
167
|
|
168
168
|
attribute_description=DomainAttributeDescription.new(name,type,self.is_encrypted?,options)
|
169
169
|
self.attribute_descriptions[name] = attribute_description
|
@@ -181,11 +181,11 @@ module SdbDal
|
|
181
181
|
|
182
182
|
GETTERDONE
|
183
183
|
end
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
184
|
+
if attribute_description.value_type==:clob
|
185
|
+
clob_attribute_names<<attribute_description.name
|
186
|
+
else
|
187
|
+
non_clob_attribute_names<<attribute_description.name
|
188
|
+
end
|
189
189
|
|
190
190
|
scope=":all"
|
191
191
|
if(options[:unique] && options[:unique]==true)
|
@@ -261,38 +261,49 @@ module SdbDal
|
|
261
261
|
|
262
262
|
foreign_key_attribute ||= "#{domain_class.to_s.downcase}_id".to_sym
|
263
263
|
accesser_attribute_name ||=domain_class.to_s.downcase
|
264
|
-
|
264
|
+
if foreign_key_attribute==:without_prefix
|
265
|
+
# #send all attributes and let the other class figure it out}
|
266
|
+
|
267
|
+
class_eval <<-GETTERDONE
|
268
|
+
def #{accesser_attribute_name}
|
265
269
|
|
266
|
-
class_eval <<-GETTERDONE
|
267
|
-
def #{accesser_attribute_name}
|
268
270
|
#{module_name+domain_class.to_s}.find(@attribute_values)
|
269
271
|
end
|
270
|
-
|
272
|
+
GETTERDONE
|
271
273
|
|
272
274
|
|
273
|
-
|
275
|
+
elsif foreign_key_attribute==:with_prefix
|
276
|
+
# #the column names that start with the name of the other class are the
|
277
|
+
# fkeys
|
278
|
+
fkeys=[]
|
279
|
+
self.class.attribute_descriptions.each do |attribute_name,description|
|
280
|
+
if attribute_name.index(domain_class.to_s.downcase)==0
|
281
|
+
fkeys<<attribute_name
|
282
|
+
fkey_names<<attribute_name.to_s
|
283
|
+
end
|
284
|
+
end
|
285
|
+
index(fkey_names.join("_"),keys)
|
274
286
|
|
275
|
-
|
287
|
+
class_eval <<-GETTERDONE
|
276
288
|
def #{accesser_attribute_name}
|
277
289
|
mapped_values={}
|
278
|
-
prefix='#{domain_class.to_s.downcase}
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
#{module_name+domain_class.to_s}.find(mapped_values)
|
284
|
-
end
|
285
|
-
GETTERDONE
|
290
|
+
prefix='#{domain_class.to_s.downcase}'
|
291
|
+
['#{fkey_names.join("','")}'].each |key|
|
292
|
+
mapped_values[key.splice(prefix.length)]=@attribute_values[key]
|
293
|
+
end
|
294
|
+
#{module_name+domain_class.to_s}.find(mapped_values)
|
286
295
|
|
296
|
+
end
|
297
|
+
GETTERDONE
|
287
298
|
else
|
288
299
|
class_eval <<-GETTERDONE
|
289
300
|
def #{accesser_attribute_name}
|
290
|
-
mapped_values={}
|
291
301
|
#{module_name+domain_class.to_s}.find(self.#{foreign_key_attribute})
|
292
302
|
end
|
293
|
-
|
294
|
-
|
295
|
-
|
303
|
+
GETTERDONE
|
304
|
+
index("#{foreign_key_attribute}_index".to_sym,[foreign_key_attribute])
|
305
|
+
end
|
306
|
+
|
296
307
|
end
|
297
308
|
def self.many_to_many(domain_class,
|
298
309
|
through_class,
|
@@ -411,17 +422,27 @@ module SdbDal
|
|
411
422
|
reflecting_key_attributes = primary_key_attribute_names.map{|x|x.to_s}
|
412
423
|
|
413
424
|
end
|
414
|
-
|
425
|
+
reflecting_key_attributes ||= primary_key_attribute_names.map{|x|self.name.downcase+"_"+x.to_s}
|
415
426
|
reflecting_key_attributes =arrayify(reflecting_key_attributes)
|
416
427
|
reflecting_array_code="[:"+reflecting_key_attributes.join(",:")+"]"
|
417
428
|
|
418
429
|
accesser_attribute_name ||=domain_class.to_s.downcase+'s'
|
419
430
|
order=""
|
420
431
|
if options[:order_by]
|
421
|
-
order="
|
432
|
+
order="{:order_by=>:#{options[:order_by]}"
|
422
433
|
end
|
423
434
|
if options[:order]
|
424
|
-
order
|
435
|
+
if order.length>0
|
436
|
+
order << ","
|
437
|
+
else
|
438
|
+
order<<"{"
|
439
|
+
end
|
440
|
+
order<<":order=>:#{options[:order]}"
|
441
|
+
end
|
442
|
+
if order.length==0
|
443
|
+
order << "{}"
|
444
|
+
else
|
445
|
+
order<<"}"
|
425
446
|
end
|
426
447
|
|
427
448
|
|
@@ -439,7 +460,7 @@ module SdbDal
|
|
439
460
|
result.copy_attributes(self.primary_key_hash)
|
440
461
|
result
|
441
462
|
end
|
442
|
-
XXDONE
|
463
|
+
XXDONE
|
443
464
|
# if options[:tracking]
|
444
465
|
# #add add_xxx method
|
445
466
|
# #add to list of tracker attributes
|
@@ -462,7 +483,12 @@ XXDONE
|
|
462
483
|
def #{accesser_attribute_name}
|
463
484
|
|
464
485
|
if !@accessor_cache.has_key? :#{accesser_attribute_name}
|
465
|
-
|
486
|
+
h={}
|
487
|
+
pkey=DomainObject::arrayify(self.primary_key)
|
488
|
+
#{reflecting_array_code}.each do |key|
|
489
|
+
h[key]=pkey.shift
|
490
|
+
end
|
491
|
+
result= #{module_name+domain_class.to_s}.find_by_index(h,#{order})
|
466
492
|
@accessor_cache[:#{accesser_attribute_name}]=result || []
|
467
493
|
end
|
468
494
|
return @accessor_cache[:#{accesser_attribute_name}]
|
@@ -485,7 +511,7 @@ XXDONE
|
|
485
511
|
return result[0] if result.length==1
|
486
512
|
return result
|
487
513
|
end
|
488
|
-
|
514
|
+
def primary_key_hash
|
489
515
|
|
490
516
|
result={}
|
491
517
|
self.class.primary_key_attribute_names.each do |key_part|
|
@@ -665,9 +691,26 @@ XXDONE
|
|
665
691
|
return options[:repository]
|
666
692
|
end
|
667
693
|
|
668
|
-
|
694
|
+
return RepositoryFactory.instance(options)
|
669
695
|
|
670
|
-
|
696
|
+
end
|
697
|
+
def find_by_index(values,more_options)
|
698
|
+
index_descriptions.each do |name,desc|
|
699
|
+
if desc.keys_match?(values)
|
700
|
+
options={}
|
701
|
+
options[:params]={desc.name=>desc.format_index_entry(self.attribute_descriptions,values)}
|
702
|
+
options[:index]=desc.name
|
703
|
+
options[:index_value]=desc.format_index_entry(self.attribute_descriptions,values)
|
704
|
+
options.merge!(more_options)
|
705
|
+
return find(:all,options)
|
706
|
+
end
|
707
|
+
end
|
708
|
+
options={}
|
709
|
+
|
710
|
+
options[:params]={}
|
711
|
+
options.merge!(more_options)
|
712
|
+
values.each{|key,value|options[:params][key]=value}
|
713
|
+
return find_every(options)
|
671
714
|
end
|
672
715
|
def find(*arguments)
|
673
716
|
scope = arguments.slice!(0)
|
@@ -766,7 +809,7 @@ XXDONE
|
|
766
809
|
|
767
810
|
end
|
768
811
|
def self.module_name
|
769
|
-
|
812
|
+
result=""
|
770
813
|
result=self.name.slice(0, self.name.rindex(":")+1) if self.name.rindex(":")
|
771
814
|
result
|
772
815
|
end
|
@@ -35,6 +35,12 @@ class IndexDescription < DomainAttributeDescription
|
|
35
35
|
#don't encrypt because the individual elements are encrypted
|
36
36
|
return value
|
37
37
|
end
|
38
|
-
|
38
|
+
def keys_match?(h)
|
39
|
+
return false unless h.length==columns.length
|
40
|
+
columns.each do |c|
|
41
|
+
return false unless h.has_key?(c)
|
42
|
+
end
|
43
|
+
return true
|
44
|
+
end
|
39
45
|
end
|
40
46
|
end
|
@@ -5,7 +5,6 @@ module SdbDal
|
|
5
5
|
class MemcacheRepository
|
6
6
|
attr_accessor :use_cache #this here just so interface matches sdb repo
|
7
7
|
attr_accessor :storage
|
8
|
-
|
9
8
|
def initialize(
|
10
9
|
sdb_domain= nil,
|
11
10
|
clob_bucket= nil,
|
@@ -13,12 +12,15 @@ module SdbDal
|
|
13
12
|
aws_secret_key= nil,
|
14
13
|
memcache_servers = nil ,
|
15
14
|
a_storage=nil,
|
16
|
-
append_table_to_domain=nil
|
15
|
+
append_table_to_domain=nil,
|
16
|
+
options={}
|
17
17
|
)
|
18
|
-
|
18
|
+
options[:memory_only] ||=(aws_key_id==nil)
|
19
|
+
@storage||=Storage.new(aws_key_id,aws_secret_key,memcache_servers,[],options)
|
19
20
|
@sdb_domain=sdb_domain
|
20
21
|
@clob_bucket=clob_bucket
|
21
22
|
end
|
23
|
+
|
22
24
|
def pause
|
23
25
|
end
|
24
26
|
|
@@ -3,7 +3,11 @@ require "sdb_dal/memory_repository.rb"
|
|
3
3
|
|
4
4
|
module SdbDal
|
5
5
|
class RepositoryFactory
|
6
|
-
|
6
|
+
def self.clear
|
7
|
+
@repository=nil
|
8
|
+
$sdb_dal_config=nil
|
9
|
+
$repository=nil
|
10
|
+
end
|
7
11
|
def self.instance=(repo)
|
8
12
|
@repository=repo
|
9
13
|
end
|
@@ -31,7 +35,11 @@ module SdbDal
|
|
31
35
|
memcache_servers = memcache_servers.split(",") if memcache_servers
|
32
36
|
|
33
37
|
append_table_to_domain=sdb_dal_config['append_table_to_domain']
|
34
|
-
|
38
|
+
options={}
|
39
|
+
if sdb_dal_config.has_key?('fail_fast')
|
40
|
+
options[:fail_fast]=sdb_dal_config['fail_fast']
|
41
|
+
end
|
42
|
+
@repository= repo_class.new(domain_prefix,clob_bucket,aws_key_id,aws_secret_key,memcache_servers,nil,append_table_to_domain,options)
|
35
43
|
end
|
36
44
|
end
|
37
45
|
|
data/lib/sdb_dal/storage.rb
CHANGED
@@ -15,12 +15,16 @@ class Storage
|
|
15
15
|
@aws_secret_key = nil
|
16
16
|
attr_accessor :tokens
|
17
17
|
attr_accessor :memory_only
|
18
|
+
attr_accessor :fail_fast
|
18
19
|
def initialize( aws_key_id,
|
19
20
|
aws_secret_key,
|
20
21
|
memcache_servers,
|
21
22
|
tokens=[] ,
|
22
23
|
options={})
|
23
24
|
@memcache_servers=memcache_servers
|
25
|
+
if options.has_key?(:fail_fast)
|
26
|
+
self.fail_fast=options[:fail_fast]
|
27
|
+
end
|
24
28
|
if options.has_key?(:memory_only) and options[:memory_only]
|
25
29
|
self.memory_only=true
|
26
30
|
else
|
@@ -82,10 +86,11 @@ class Storage
|
|
82
86
|
renew_s3_connection
|
83
87
|
|
84
88
|
rescue=> e
|
89
|
+
|
85
90
|
s= "#{e.message}\n#{e.backtrace}"
|
86
91
|
puts(s)
|
87
92
|
puts "retrying s3 get #{i.to_s}"
|
88
|
-
|
93
|
+
raise e if self.fail_fast
|
89
94
|
sleep(i*i)
|
90
95
|
end
|
91
96
|
end
|
@@ -105,6 +110,7 @@ x=nil
|
|
105
110
|
|
106
111
|
break
|
107
112
|
rescue =>e
|
113
|
+
raise e if self.fail_fast
|
108
114
|
s= "#{e.message}\n#{e.backtrace}"
|
109
115
|
puts(s)
|
110
116
|
puts "retrying s3 put #{i.to_s}"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sdb_dal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Knight
|
@@ -9,7 +9,7 @@ autorequire: sdb_dal
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-23 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|