redis_object 0.5.0 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -2
- data/Gemfile +0 -4
- data/README.markdown +15 -24
- data/Rakefile +0 -8
- data/doc/Object.html +185 -0
- data/doc/Seabright.html +181 -0
- data/doc/Seabright/Adapter.html +442 -0
- data/doc/Seabright/Collection.html +797 -0
- data/doc/Seabright/Collections.html +635 -0
- data/doc/Seabright/Collections/ClassMethods.html +212 -0
- data/doc/Seabright/ExternalIndex.html +217 -0
- data/doc/Seabright/History.html +382 -0
- data/doc/Seabright/History/ClassMethods.html +276 -0
- data/doc/Seabright/Indices.html +324 -0
- data/doc/Seabright/Indices/ClassMethods.html +348 -0
- data/doc/Seabright/Keys.html +314 -0
- data/doc/Seabright/Keys/ClassMethods.html +276 -0
- data/doc/Seabright/ObjectBase.html +852 -0
- data/doc/Seabright/ObjectBase/ClassMethods.html +677 -0
- data/doc/Seabright/RedisObject.html +230 -0
- data/doc/Seabright/References.html +280 -0
- data/doc/Seabright/Storage.html +252 -0
- data/doc/Seabright/Storage/ClassMethods.html +276 -0
- data/doc/Seabright/Storage/MySQL.html +442 -0
- data/doc/Seabright/Storage/Redis.html +218 -0
- data/doc/Seabright/Template.html +212 -0
- data/doc/Seabright/Template/ClassMethods.html +166 -0
- data/doc/Seabright/Timestamps.html +292 -0
- data/doc/Seabright/Timestamps/ClassMethods.html +214 -0
- data/doc/Seabright/Types.html +410 -0
- data/doc/Seabright/Types/ClassMethods.html +308 -0
- data/doc/created.rid +17 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +125 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +394 -0
- data/lib/redis_object.rb +1 -11
- data/lib/redis_object/base.rb +60 -210
- data/lib/redis_object/collection.rb +100 -130
- data/lib/redis_object/defaults.rb +8 -21
- data/lib/redis_object/ext/filters.rb +16 -34
- data/lib/redis_object/ext/triggers.rb +13 -75
- data/lib/redis_object/{experimental/history.rb → history.rb} +0 -0
- data/lib/redis_object/indices.rb +39 -44
- data/lib/redis_object/keys.rb +4 -4
- data/lib/redis_object/storage.rb +1 -30
- data/lib/redis_object/storage/adapter.rb +3 -6
- data/lib/redis_object/storage/redis.rb +3 -98
- data/lib/redis_object/timestamps.rb +21 -42
- data/lib/redis_object/types.rb +30 -172
- data/lib/redis_object/version.rb +1 -1
- data/redis_object.gemspec +0 -1
- data/spec/base_spec.rb +6 -41
- data/spec/spec_helper.rb +1 -32
- metadata +116 -111
- data/.coveralls.yml +0 -1
- data/.travis.yml +0 -5
- data/lib/redis_object/ext/script_cache.rb +0 -92
- data/lib/redis_object/ext/shardable.rb +0 -18
- data/lib/redis_object/ext/view_caching.rb +0 -258
- data/lib/redis_object/ext/views.rb +0 -102
- data/lib/redis_object/inheritance_tracking.rb +0 -23
- data/spec/adapter_spec.rb +0 -43
- data/spec/benchmark_spec.rb +0 -46
- data/spec/collections_spec.rb +0 -144
- data/spec/defaults_spec.rb +0 -56
- data/spec/filters_spec.rb +0 -29
- data/spec/indices_spec.rb +0 -45
- data/spec/rename_class_spec.rb +0 -96
- data/spec/timestamp_spec.rb +0 -28
- data/spec/trigger_spec.rb +0 -51
- data/spec/types_spec.rb +0 -103
- data/spec/view_caching_spec.rb +0 -130
- data/spec/views_spec.rb +0 -72
@@ -1,72 +1,20 @@
|
|
1
1
|
module Seabright
|
2
2
|
module Triggers
|
3
3
|
|
4
|
+
def set(k,v)
|
5
|
+
super(k,v)
|
6
|
+
if self.class.field_triggers[k.to_sym]
|
7
|
+
send(self.class.field_triggers[k.to_sym],k,v)
|
8
|
+
end
|
9
|
+
self.class.update_triggers.each do |actn|
|
10
|
+
send(actn.to_sym,k,v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
module ClassMethods
|
5
15
|
|
6
16
|
def trigger_on_set(fld,actn)
|
7
17
|
field_triggers[fld.to_sym] = actn.to_sym
|
8
|
-
intercept_sets_for_triggers!
|
9
|
-
end
|
10
|
-
|
11
|
-
def intercept_sets_for_triggers!
|
12
|
-
return if @intercepted_sets_for_triggers
|
13
|
-
self.class_eval do
|
14
|
-
alias_method :untriggered_set, :set unless method_defined?(:untriggered_set)
|
15
|
-
def set(k,v)
|
16
|
-
untriggered_set(k,v)
|
17
|
-
unless self.class.untriggerables.include?(k)
|
18
|
-
begin
|
19
|
-
self.class.untriggerables << k
|
20
|
-
if self.class.field_triggers[k.to_sym]
|
21
|
-
send(self.class.field_triggers[k.to_sym],k,v)
|
22
|
-
end
|
23
|
-
self.class.update_triggers.each do |actn|
|
24
|
-
send(actn.to_sym,k,v)
|
25
|
-
end
|
26
|
-
ensure
|
27
|
-
self.class.untriggerables.delete k
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
alias_method :untriggered_setnx, :setnx unless method_defined?(:untriggered_setnx)
|
32
|
-
def setnx(k,v)
|
33
|
-
ret = untriggered_setnx(k,v)
|
34
|
-
unless self.class.untriggerables.include?(k)
|
35
|
-
begin
|
36
|
-
self.class.untriggerables << k
|
37
|
-
if self.class.field_triggers[k.to_sym]
|
38
|
-
send(self.class.field_triggers[k.to_sym],k,v)
|
39
|
-
end
|
40
|
-
self.class.update_triggers.each do |actn|
|
41
|
-
send(actn.to_sym,k,v)
|
42
|
-
end
|
43
|
-
ensure
|
44
|
-
self.class.untriggerables.delete k
|
45
|
-
end
|
46
|
-
end
|
47
|
-
ret
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
@intercepted_sets_for_triggers = true
|
52
|
-
end
|
53
|
-
|
54
|
-
def intercept_reference_for_triggers!
|
55
|
-
return if @intercepted_reference_for_triggers
|
56
|
-
self.class_eval do
|
57
|
-
alias_method :untriggered_reference, :reference unless method_defined?(:untriggered_reference)
|
58
|
-
def reference(obj)
|
59
|
-
untriggered_reference(obj)
|
60
|
-
self.class.reference_triggers.each do |actn|
|
61
|
-
send(actn.to_sym,obj)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
@intercepted_reference_for_triggers = true
|
66
|
-
end
|
67
|
-
|
68
|
-
def untriggerables
|
69
|
-
@untriggerables ||= [:updated_at,:created_at]
|
70
18
|
end
|
71
19
|
|
72
20
|
def field_triggers
|
@@ -74,21 +22,11 @@ module Seabright
|
|
74
22
|
end
|
75
23
|
|
76
24
|
def trigger_on_update(actn)
|
77
|
-
update_triggers
|
78
|
-
intercept_sets_for_triggers!
|
25
|
+
update_triggers.push actn.to_sym
|
79
26
|
end
|
80
27
|
|
81
28
|
def update_triggers
|
82
|
-
@update_triggers ||=
|
83
|
-
end
|
84
|
-
|
85
|
-
def trigger_on_reference(actn)
|
86
|
-
reference_triggers << actn.to_sym
|
87
|
-
intercept_reference_for_triggers!
|
88
|
-
end
|
89
|
-
|
90
|
-
def reference_triggers
|
91
|
-
@reference_triggers ||= Set.new
|
29
|
+
@update_triggers ||= []
|
92
30
|
end
|
93
31
|
|
94
32
|
end
|
@@ -98,4 +36,4 @@ module Seabright
|
|
98
36
|
end
|
99
37
|
|
100
38
|
end
|
101
|
-
end
|
39
|
+
end
|
File without changes
|
data/lib/redis_object/indices.rb
CHANGED
@@ -1,50 +1,45 @@
|
|
1
1
|
module Seabright
|
2
2
|
module Indices
|
3
3
|
|
4
|
+
# def save_indices
|
5
|
+
# # self.class.indices.each do |indx|
|
6
|
+
# # indx.each do |key,idx|
|
7
|
+
# #
|
8
|
+
# # end
|
9
|
+
# # end
|
10
|
+
# self.class.sort_indices.each do |idx|
|
11
|
+
# store.zadd(index_key(idx), send(idx).to_i, hkey)
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
|
4
15
|
def index_key(idx)
|
5
16
|
self.class.index_key(idx)
|
6
17
|
end
|
7
18
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
store.zrem(index_key(k), hkey)
|
18
|
-
store.zadd(index_key(k), score_format(k,v), hkey)
|
19
|
-
end
|
20
|
-
ret
|
21
|
-
end
|
22
|
-
alias_method :unindexed_mset, :mset unless method_defined?(:unindexed_mset)
|
23
|
-
def mset(dat)
|
24
|
-
ret = unindexed_mset(dat)
|
25
|
-
dat.select {|k,v| self.class.has_sort_index?(k) }.each do |k,v|
|
26
|
-
store.zrem(index_key(k), hkey)
|
27
|
-
store.zadd(index_key(k), score_format(k,v), hkey)
|
28
|
-
end
|
29
|
-
ret
|
30
|
-
end
|
31
|
-
alias_method :unindexed_setnx, :setnx unless method_defined?(:unindexed_setnx)
|
32
|
-
def setnx(k,v)
|
33
|
-
ret = unindexed_setnx(k,v)
|
34
|
-
if self.class.has_sort_index?(k)
|
35
|
-
store.zrem(index_key(k), hkey)
|
36
|
-
store.zadd(index_key(k), score_format(k,v), hkey)
|
37
|
-
end
|
38
|
-
ret
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
@intercepted_sets_for_indices = true
|
19
|
+
# def save
|
20
|
+
# super
|
21
|
+
# save_indices
|
22
|
+
# end
|
23
|
+
|
24
|
+
def mset(dat)
|
25
|
+
super(dat)
|
26
|
+
dat.select {|k,v| self.class.has_sort_index?(k) }.each do |k,v|
|
27
|
+
store.zadd(index_key(k), score_format(k,v), hkey)
|
43
28
|
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def set(k,v)
|
32
|
+
super(k,v)
|
33
|
+
if self.class.has_sort_index?(k)
|
34
|
+
store.zadd(index_key(k), score_format(k,v), hkey)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module ClassMethods
|
44
39
|
|
45
40
|
def indexed(idx,num=-1,reverse=false)
|
46
41
|
out = Enumerator.new do |yielder|
|
47
|
-
store.send(reverse ? :zrevrange : :zrange, index_key(idx), 0, num
|
42
|
+
store.send(reverse ? :zrevrange : :zrange, index_key(idx), 0, num).each do |member|
|
48
43
|
if a = self.find_by_key(member)
|
49
44
|
yielder << a
|
50
45
|
end
|
@@ -63,20 +58,20 @@ module Seabright
|
|
63
58
|
"#{self.plname}::#{idx}"
|
64
59
|
end
|
65
60
|
|
61
|
+
# def index(opts)
|
62
|
+
# indices << opts
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# def indices
|
66
|
+
# @@indices ||= []
|
67
|
+
# end
|
68
|
+
|
66
69
|
def sort_indices
|
67
70
|
@@sort_indices ||= []
|
68
71
|
end
|
69
72
|
|
70
73
|
def sort_by(k)
|
71
74
|
sort_indices << k.to_sym
|
72
|
-
intercept_sets_for_indices!
|
73
|
-
end
|
74
|
-
|
75
|
-
def reindex(k)
|
76
|
-
store.del index_key(k)
|
77
|
-
all.each do |obj|
|
78
|
-
obj.set(k,obj.get(k))
|
79
|
-
end
|
80
75
|
end
|
81
76
|
|
82
77
|
def has_sort_index?(k)
|
data/lib/redis_object/keys.rb
CHANGED
@@ -15,15 +15,15 @@ module Seabright
|
|
15
15
|
|
16
16
|
module ClassMethods
|
17
17
|
|
18
|
-
def key(ident
|
19
|
-
"#{cname}
|
18
|
+
def key(ident)
|
19
|
+
"#{cname}:#{ident.gsub(/^.*:/,'')}"
|
20
20
|
end
|
21
21
|
|
22
|
-
def reserve_key(ident
|
22
|
+
def reserve_key(ident)
|
23
23
|
"#{key(ident)}_reserve"
|
24
24
|
end
|
25
25
|
|
26
|
-
def hkey(ident =
|
26
|
+
def hkey(ident = id)
|
27
27
|
"#{key(ident)}_h"
|
28
28
|
end
|
29
29
|
|
data/lib/redis_object/storage.rb
CHANGED
@@ -19,12 +19,8 @@ module Seabright
|
|
19
19
|
adapters[id] ||= const_get(adapter).new(config(id))
|
20
20
|
end
|
21
21
|
|
22
|
-
def configure_store(conf,id=store_name
|
22
|
+
def configure_store(conf,id=store_name)
|
23
23
|
configs[id] = conf
|
24
|
-
ids.each do |i|
|
25
|
-
configs[i] = conf
|
26
|
-
end
|
27
|
-
store(id)
|
28
24
|
end
|
29
25
|
|
30
26
|
def use_store(id)
|
@@ -58,31 +54,6 @@ module Seabright
|
|
58
54
|
configs[id]
|
59
55
|
end
|
60
56
|
|
61
|
-
def stores
|
62
|
-
adapters
|
63
|
-
end
|
64
|
-
|
65
|
-
def dump_stores_to_files(path)
|
66
|
-
raise "Directory does not exist!" unless Dir.exists?(File.dirname(path))
|
67
|
-
adapters.each do |name,adptr|
|
68
|
-
if adptr.respond_to? :dump_to_file
|
69
|
-
puts "Dumping #{name} into #{path}/#{name.to_s}.dump"
|
70
|
-
adptr.dump_to_file("#{path}/#{name.to_s}.dump")
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def restore_stores_from_files(path)
|
76
|
-
raise "Directory does not exist!" unless Dir.exists?(File.dirname(path))
|
77
|
-
Dir.glob(path + "/*.dump").each do |file|
|
78
|
-
name = file.gsub(/\.[^\.]+$/,'').gsub(/.*\//,'').to_sym
|
79
|
-
if (stor = store(name)) && stor.respond_to?(:restore_from_file)
|
80
|
-
puts "Restoring #{name} from #{file}"
|
81
|
-
stor.restore_from_file(file)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
57
|
end
|
87
58
|
|
88
59
|
def self.included(base)
|
@@ -23,18 +23,15 @@ module Seabright
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def reset
|
26
|
-
connections.each_index do |i|
|
27
|
-
connections[i] = nil
|
26
|
+
@connections.each_index do |i|
|
27
|
+
@connections[i] = nil
|
28
28
|
end
|
29
29
|
end
|
30
30
|
alias_method :reconnect!, :reset
|
31
31
|
|
32
32
|
def connection(num=0)
|
33
|
-
connections[num] ||= new_connection
|
34
|
-
end
|
35
|
-
|
36
|
-
def connections
|
37
33
|
@connections ||= []
|
34
|
+
@connections[num] ||= new_connection
|
38
35
|
end
|
39
36
|
|
40
37
|
def new_connection
|
@@ -3,7 +3,6 @@ module Seabright
|
|
3
3
|
class Redis < Adapter
|
4
4
|
|
5
5
|
def method_missing(sym, *args, &block)
|
6
|
-
return super unless connection.respond_to?(sym)
|
7
6
|
puts "[Storage::Redis] #{sym}(#{args.inspect.gsub(/\[|\]/m,'')})" if Debug.verbose?
|
8
7
|
begin
|
9
8
|
connection.send(sym,*args, &block)
|
@@ -11,109 +10,15 @@ module Seabright
|
|
11
10
|
puts "Rescued: #{err.inspect}" if DEBUG
|
12
11
|
reset
|
13
12
|
connection.send(sym,*args, &block)
|
14
|
-
rescue ::Redis::TimeoutError => err
|
15
|
-
puts "Rescued connection timeout: #{err.inspect}" if DEBUG
|
16
|
-
reset
|
17
|
-
connection.send(sym,*args, &block)
|
18
13
|
end
|
19
14
|
end
|
20
15
|
|
21
16
|
def new_connection
|
22
17
|
require 'redis'
|
23
|
-
puts "Connecting to Redis with: #{config_opts(:path, :db, :password
|
24
|
-
::Redis.new(config_opts(:path, :db, :password
|
25
|
-
end
|
26
|
-
|
27
|
-
DUMP_SEPARATOR = "---:::RedisObject::DUMP_SEPARATOR:::---"
|
28
|
-
REC_SEPARATOR = "---:::RedisObject::REC_SEPARATOR:::---"
|
29
|
-
|
30
|
-
def dump_to_file(file)
|
31
|
-
File.open(file,'wb') do |f|
|
32
|
-
keys = connection.send(:keys,"*")
|
33
|
-
f.write keys.map {|k|
|
34
|
-
v = connection.dump(k)
|
35
|
-
v.force_encoding(Encoding::BINARY)
|
36
|
-
[k,v].join(DUMP_SEPARATOR)
|
37
|
-
}.join(REC_SEPARATOR)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def restore_from_file(file)
|
42
|
-
str = File.read(file)
|
43
|
-
str.force_encoding(Encoding::BINARY)
|
44
|
-
str.split(REC_SEPARATOR).each do |line|
|
45
|
-
line.force_encoding(Encoding::BINARY)
|
46
|
-
key, val = line.split(DUMP_SEPARATOR)
|
47
|
-
connection.multi do
|
48
|
-
connection.del key
|
49
|
-
connection.restore key, 0, val
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def rename_class old_name, new_name
|
55
|
-
old_name = old_name.to_s#.split('::').last
|
56
|
-
new_name = new_name.to_s#.split('::').last
|
57
|
-
old_collection_name = old_name.split('::').last.underscore.pluralize
|
58
|
-
new_collection_name = new_name.split('::').last.underscore.pluralize
|
59
|
-
|
60
|
-
# references to type in collection data
|
61
|
-
keys("#{old_name}:*:backreferences").each do |backref_key|
|
62
|
-
smembers(backref_key).each do |hashref|
|
63
|
-
# there are two referenes we need to fix: individual references to items
|
64
|
-
# and lists of collection names.
|
65
|
-
#
|
66
|
-
# this updates the item references in collections
|
67
|
-
backref = hashref.sub(/_h$/,'');
|
68
|
-
old_collection = "#{backref}:COLLECTION:#{old_collection_name}"
|
69
|
-
new_collection = "#{backref}:COLLECTION:#{new_collection_name}"
|
70
|
-
zrange(old_collection, 0, 99999, withscores:true).each do |key, score|
|
71
|
-
zadd(new_collection, score, key.sub(/^#{old_name}/, new_name))
|
72
|
-
end
|
73
|
-
del(old_collection)
|
74
|
-
|
75
|
-
# this updates the lists of collection names
|
76
|
-
collection_names = "#{hashref}:collections"
|
77
|
-
smembers(collection_names).each do |collection_name|
|
78
|
-
if collection_name == old_collection_name
|
79
|
-
sadd(collection_names, new_collection_name)
|
80
|
-
srem(collection_names, old_collection_name)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
rename(backref_key, backref_key.sub(/^#{old_name}/, new_name))
|
85
|
-
end
|
86
|
-
|
87
|
-
# type-wide id index
|
88
|
-
smembers(old_name.pluralize).each do |key|
|
89
|
-
sadd(new_name.pluralize, key.sub(/^#{old_name}/, new_name))
|
90
|
-
old_class = hget("#{key}_h", :class)
|
91
|
-
old_key = hget("#{key}_h", :key)
|
92
|
-
hset("#{key}_h", :class, old_class.sub(/#{old_name}$/, new_name))
|
93
|
-
hset("#{key}_h", :key, old_key.sub(/^#{old_name}/, new_name))
|
94
|
-
hset("#{key}_h", "#{new_name.downcase}_id", key.sub(/^#{old_name}:/,''))
|
95
|
-
hdel("#{key}_h", "#{old_name.downcase}_id")
|
96
|
-
end
|
97
|
-
del(old_name.pluralize)
|
98
|
-
|
99
|
-
# column indexes
|
100
|
-
keys("#{old_name.pluralize}::*").each do |old_index|
|
101
|
-
new_index = old_index.sub(/^#{old_name.pluralize}/, new_name.pluralize)
|
102
|
-
zrange(old_index, 0, 99999, withscores:true).each do |key, score|
|
103
|
-
zadd(new_index, score, key.sub(/^#{old_name}/, new_name))
|
104
|
-
end
|
105
|
-
del(old_index)
|
106
|
-
end
|
107
|
-
|
108
|
-
# top-level keys
|
109
|
-
keys("#{old_name}:*").each do |key|
|
110
|
-
rename(key, key.sub(/^#{old_name}/, new_name))
|
111
|
-
end
|
112
|
-
keys("#{old_name.pluralize}:*").each do |key|
|
113
|
-
rename(key, key.sub(/^#{old_name.pluralize}/, new_name.pluralize))
|
114
|
-
end
|
18
|
+
# puts "Connecting to Redis with: #{config_opts(:path, :db, :password).inspect}" if DEBUG
|
19
|
+
::Redis.new(config_opts(:path, :db, :password))
|
115
20
|
end
|
116
21
|
|
117
22
|
end
|
118
23
|
end
|
119
|
-
end
|
24
|
+
end
|
@@ -2,54 +2,34 @@ module Seabright
|
|
2
2
|
module Timestamps
|
3
3
|
|
4
4
|
def update_timestamps
|
5
|
-
|
5
|
+
return if @@time_irrelevant
|
6
6
|
set(:created_at, Time.now) if !is_set?(:created_at)
|
7
7
|
set(:updated_at, Time.now)
|
8
8
|
end
|
9
9
|
|
10
|
+
def mset(dat)
|
11
|
+
super(dat)
|
12
|
+
set(:updated_at, Time.now)
|
13
|
+
end
|
14
|
+
|
15
|
+
def set(k,v)
|
16
|
+
super(k,v)
|
17
|
+
set(:updated_at, Time.now) unless k.to_sym == :updated_at
|
18
|
+
end
|
19
|
+
|
20
|
+
def save
|
21
|
+
super
|
22
|
+
update_timestamps
|
23
|
+
end
|
24
|
+
|
10
25
|
module ClassMethods
|
11
26
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def set(k,v)
|
17
|
-
ret = untimestamped_set(k,v)
|
18
|
-
set(:updated_at, Time.now) unless k.to_sym == :updated_at
|
19
|
-
ret
|
20
|
-
end
|
21
|
-
alias_method :untimestamped_mset, :mset unless method_defined?(:untimestamped_mset)
|
22
|
-
def mset(dat)
|
23
|
-
ret = untimestamped_mset(dat)
|
24
|
-
set(:updated_at, Time.now)
|
25
|
-
ret
|
26
|
-
end
|
27
|
-
alias_method :untimestamped_setnx, :setnx unless method_defined?(:untimestamped_setnx)
|
28
|
-
def setnx(k,v)
|
29
|
-
ret = untimestamped_setnx(k,v)
|
30
|
-
set(:updated_at, Time.now) unless k.to_sym == :updated_at
|
31
|
-
ret
|
32
|
-
end
|
33
|
-
alias_method :untimestamped_save, :save unless method_defined?(:untimestamped_save)
|
34
|
-
def save
|
35
|
-
ret = untimestamped_save()
|
36
|
-
update_timestamps
|
37
|
-
ret
|
38
|
-
end
|
39
|
-
end
|
40
|
-
@intercepted_sets_for_timestamps = true
|
27
|
+
def time_matters_not!
|
28
|
+
@@time_irrelevant = true
|
29
|
+
@@sort_indices.delete(:created_at)
|
30
|
+
@@sort_indices.delete(:updated_at)
|
41
31
|
end
|
42
32
|
|
43
|
-
# def time_matters?
|
44
|
-
# @time_irrelevant != true
|
45
|
-
# end
|
46
|
-
#
|
47
|
-
# def time_matters_not!
|
48
|
-
# @time_irrelevant = true
|
49
|
-
# sort_indices.delete(:created_at)
|
50
|
-
# sort_indices.delete(:updated_at)
|
51
|
-
# end
|
52
|
-
#
|
53
33
|
def recently_created(num=5)
|
54
34
|
self.indexed(:created_at,num,true)
|
55
35
|
end
|
@@ -61,13 +41,12 @@ module Seabright
|
|
61
41
|
end
|
62
42
|
|
63
43
|
def self.included(base)
|
64
|
-
|
44
|
+
@@time_irrelevant = false
|
65
45
|
base.send(:sort_by,:created_at)
|
66
46
|
base.send(:sort_by,:updated_at)
|
67
47
|
base.send(:register_format,:created_at, :date)
|
68
48
|
base.send(:register_format,:updated_at, :date)
|
69
49
|
base.extend(ClassMethods)
|
70
|
-
base.intercept_sets_for_timestamps!
|
71
50
|
end
|
72
51
|
|
73
52
|
end
|