simple_record 2.0.1 → 2.0.2
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/lib/simple_record.rb +42 -19
- data/lib/simple_record/active_sdb.rb +2 -6
- data/lib/simple_record/stats.rb +3 -1
- data/test/test_lobs.rb +24 -0
- metadata +2 -2
data/lib/simple_record.rb
CHANGED
@@ -128,8 +128,9 @@ module SimpleRecord
|
|
128
128
|
if options[:connection_mode] == :per_thread
|
129
129
|
@@auto_close_s3 = true
|
130
130
|
# todo: should we init this only when needed?
|
131
|
-
@@s3 = Aws::S3.new(SimpleRecord.aws_access_key, SimpleRecord.aws_secret_key, {:connection_mode=>:per_thread})
|
132
131
|
end
|
132
|
+
s3_ops = {:connection_mode=>options[:connection_mode] || :default}
|
133
|
+
@@s3 = Aws::S3.new(SimpleRecord.aws_access_key, SimpleRecord.aws_secret_key, s3_ops)
|
133
134
|
end
|
134
135
|
|
135
136
|
# Call this to close the connection to SimpleDB.
|
@@ -434,7 +435,6 @@ module SimpleRecord
|
|
434
435
|
options[:domain] = sharded_domain
|
435
436
|
end
|
436
437
|
|
437
|
-
# todo: Instead of doing the domain_ok, below, pass in the new option to aws lib :create_domain=>true, does the same thing now
|
438
438
|
if super(options)
|
439
439
|
self.class.cache_results(self)
|
440
440
|
delete_niled(to_delete)
|
@@ -451,16 +451,18 @@ module SimpleRecord
|
|
451
451
|
end
|
452
452
|
rescue Aws::AwsError => ex
|
453
453
|
# puts "RESCUED in save: " + $!
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
454
|
+
# Domain is created in aws lib now using :create_domain=>true
|
455
|
+
# if (domain_ok(ex, options))
|
456
|
+
# if !@create_domain_called
|
457
|
+
# @create_domain_called = true
|
458
|
+
# save(options)
|
459
|
+
# else
|
460
|
+
# raise $!
|
461
|
+
# end
|
462
|
+
# else
|
463
|
+
# raise $!
|
464
|
+
# end
|
465
|
+
raise ex
|
464
466
|
end
|
465
467
|
else
|
466
468
|
#@debug = "not saved"
|
@@ -499,9 +501,24 @@ module SimpleRecord
|
|
499
501
|
end
|
500
502
|
end
|
501
503
|
end
|
504
|
+
end
|
502
505
|
|
506
|
+
def delete_lobs
|
507
|
+
defined_attributes_local.each_pair do |k, v|
|
508
|
+
if v.type == :clob
|
509
|
+
if self.class.get_sr_config[:single_clob]
|
510
|
+
s3_bucket(false, :new_bucket=>true).delete_key(single_clob_id)
|
511
|
+
SimpleRecord.stats.s3_deletes += 1
|
512
|
+
return
|
513
|
+
else
|
514
|
+
s3_bucket.delete_key(s3_lob_id(k))
|
515
|
+
SimpleRecord.stats.s3_deletes += 1
|
516
|
+
end
|
517
|
+
end
|
518
|
+
end
|
503
519
|
end
|
504
520
|
|
521
|
+
|
505
522
|
def put_lob(k, val, options={})
|
506
523
|
begin
|
507
524
|
s3_bucket(false, options).put(k, val)
|
@@ -547,10 +564,14 @@ module SimpleRecord
|
|
547
564
|
end
|
548
565
|
|
549
566
|
def s3_lob_id(name)
|
550
|
-
|
567
|
+
if SimpleRecord.options[:new_bucket]
|
568
|
+
"lobs/#{self.id}_#{name}"
|
569
|
+
else
|
570
|
+
self.id + "_" + name.to_s
|
571
|
+
end
|
551
572
|
end
|
552
573
|
|
553
|
-
def single_clob_id
|
574
|
+
def single_clob_id
|
554
575
|
"lobs/#{self.id}_single_clob"
|
555
576
|
end
|
556
577
|
|
@@ -649,6 +670,7 @@ module SimpleRecord
|
|
649
670
|
# Run pre_save on each object, then runs batch_put_attributes
|
650
671
|
# Returns
|
651
672
|
def self.batch_save(objects, options={})
|
673
|
+
options[:create_domain] = true if options[:create_domain].nil?
|
652
674
|
results = []
|
653
675
|
to_save = []
|
654
676
|
if objects && objects.size > 0
|
@@ -660,12 +682,12 @@ module SimpleRecord
|
|
660
682
|
o.pre_save2
|
661
683
|
to_save << Aws::SdbInterface::Item.new(o.id, o.attributes, true)
|
662
684
|
if to_save.size == 25 # Max amount SDB will accept
|
663
|
-
connection.batch_put_attributes(domain, to_save)
|
685
|
+
connection.batch_put_attributes(domain, to_save, options)
|
664
686
|
to_save.clear
|
665
687
|
end
|
666
688
|
end
|
667
689
|
end
|
668
|
-
connection.batch_put_attributes(domain, to_save) if to_save.size > 0
|
690
|
+
connection.batch_put_attributes(domain, to_save, options) if to_save.size > 0
|
669
691
|
objects.each do |o|
|
670
692
|
o.save_lobs(nil)
|
671
693
|
end
|
@@ -710,13 +732,14 @@ module SimpleRecord
|
|
710
732
|
return i
|
711
733
|
end
|
712
734
|
|
713
|
-
def delete()
|
714
|
-
# TODO: DELETE CLOBS, etc from s3
|
715
|
-
options = {}
|
735
|
+
def delete(options={})
|
716
736
|
if self.class.is_sharded?
|
717
737
|
options[:domain] = sharded_domain
|
718
738
|
end
|
719
739
|
super(options)
|
740
|
+
|
741
|
+
# delete lobs now too
|
742
|
+
delete_lobs
|
720
743
|
end
|
721
744
|
|
722
745
|
def destroy
|
@@ -857,6 +857,7 @@ module SimpleRecord
|
|
857
857
|
#
|
858
858
|
# compare to +put+ method
|
859
859
|
def save(options={})
|
860
|
+
options[:create_domain] = true if options[:create_domain].nil?
|
860
861
|
pre_save2
|
861
862
|
atts_to_save = @attributes.dup
|
862
863
|
#puts 'atts_to_save=' + atts_to_save.inspect
|
@@ -873,7 +874,7 @@ module SimpleRecord
|
|
873
874
|
end
|
874
875
|
dom = options[:domain] || domain
|
875
876
|
#puts 'atts_to_save2=' + atts_to_save.inspect
|
876
|
-
connection.put_attributes(dom, id, atts_to_save, :replace)
|
877
|
+
connection.put_attributes(dom, id, atts_to_save, :replace, options)
|
877
878
|
apres_save2
|
878
879
|
@attributes
|
879
880
|
end
|
@@ -971,11 +972,6 @@ module SimpleRecord
|
|
971
972
|
connection.delete_attributes(options[:domain] || domain, id)
|
972
973
|
end
|
973
974
|
|
974
|
-
# Item ID
|
975
|
-
# def to_s
|
976
|
-
# @id
|
977
|
-
# end
|
978
|
-
|
979
975
|
# Returns true if this object hasn�t been saved yet.
|
980
976
|
def new_record?
|
981
977
|
@new_record
|
data/lib/simple_record/stats.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module SimpleRecord
|
2
2
|
class Stats
|
3
|
-
attr_accessor :selects, :saves, :deletes, :s3_puts, :s3_gets
|
3
|
+
attr_accessor :selects, :saves, :deletes, :s3_puts, :s3_gets, :s3_deletes
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@selects = 0
|
@@ -8,6 +8,7 @@ module SimpleRecord
|
|
8
8
|
@deletes = 0
|
9
9
|
@s3_puts = 0
|
10
10
|
@s3_gets = 0
|
11
|
+
@s3_deletes = 0
|
11
12
|
end
|
12
13
|
|
13
14
|
def clear
|
@@ -16,6 +17,7 @@ module SimpleRecord
|
|
16
17
|
self.deletes = 0
|
17
18
|
self.s3_puts = 0
|
18
19
|
self.s3_gets = 0
|
20
|
+
self.s3_deletes = 0
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
data/test/test_lobs.rb
CHANGED
@@ -53,6 +53,20 @@ class TestLobs < TestBase
|
|
53
53
|
# shouldn't save twice if not dirty
|
54
54
|
assert SimpleRecord.stats.s3_puts == 3
|
55
55
|
|
56
|
+
mm2.delete
|
57
|
+
|
58
|
+
assert_equal 2, SimpleRecord.stats.s3_deletes
|
59
|
+
|
60
|
+
e = assert_raise(Aws::AwsError) do
|
61
|
+
sclob = SimpleRecord.s3.bucket(mm2.s3_bucket_name2).get(mm2.s3_lob_id("clob1"))
|
62
|
+
end
|
63
|
+
assert_match(/NoSuchKey/, e.message)
|
64
|
+
e = assert_raise(Aws::AwsError) do
|
65
|
+
sclob = SimpleRecord.s3.bucket(mm2.s3_bucket_name2).get(mm2.s3_lob_id("clob2"))
|
66
|
+
end
|
67
|
+
assert_match(/NoSuchKey/, e.message)
|
68
|
+
|
69
|
+
|
56
70
|
end
|
57
71
|
|
58
72
|
def test_single_clob
|
@@ -89,6 +103,16 @@ class TestLobs < TestBase
|
|
89
103
|
|
90
104
|
# shouldn't save twice if not dirty
|
91
105
|
assert SimpleRecord.stats.s3_puts == 1
|
106
|
+
|
107
|
+
mm2.delete
|
108
|
+
|
109
|
+
assert SimpleRecord.stats.s3_deletes == 1
|
110
|
+
|
111
|
+
e = assert_raise(Aws::AwsError) do
|
112
|
+
sclob = SimpleRecord.s3.bucket(mm2.s3_bucket_name2).get(mm2.single_clob_id)
|
113
|
+
end
|
114
|
+
assert_match(/NoSuchKey/, e.message)
|
115
|
+
|
92
116
|
end
|
93
117
|
|
94
118
|
end
|