deja-vu 0.4 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Change.log +5 -1
- data/Rakefile +1 -1
- data/lib/deja-vu.rb +9 -8
- data/lib/deja-vu/model/generated_model/DejaVuNS.rb +64 -18
- data/lib/deja-vu/model/xml/dejavu.xml +1 -1
- data/lib/deja-vu/recorder.rb +45 -4
- metadata +1 -1
data/Change.log
CHANGED
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
s.homepage = "http://github.com/kuccello/deja-vu"
|
10
10
|
s.authors = ['Kristan "Krispy" Uccello']
|
11
11
|
s.files = FileList["[A-Z]*", "{lib,test,example,example-playback}/**/*"]
|
12
|
-
s.version = "0.
|
12
|
+
s.version = "0.5"
|
13
13
|
end
|
14
14
|
Jeweler::GemcutterTasks.new
|
15
15
|
rescue LoadError
|
data/lib/deja-vu.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'dirge'
|
1
2
|
require ~'deja-vu/init'
|
2
3
|
#require ~'rack-session-listener'
|
3
4
|
require 'digest/sha1'
|
@@ -25,30 +26,30 @@ module SoldierOfCode
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def call(env)
|
28
|
-
|
29
29
|
if @opt[:enable_record] then
|
30
30
|
user_identifier_before = get_user_identifier(env)
|
31
31
|
env_before = env
|
32
32
|
t_start = Time.new
|
33
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} HERE BEFORE APP CALL"
|
33
34
|
resp = @app.call(env) # would be nice to capture all log output from the downstream as well.... TODO add log object as logger
|
35
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} HERE AFTER APP CALL"
|
34
36
|
t_stop = Time.new
|
35
37
|
user_identifier_after = get_user_identifier(env)
|
36
38
|
|
37
39
|
current_request = Rack::Request.new(env)
|
38
40
|
|
39
|
-
dejavu_recorder =
|
41
|
+
dejavu_recorder = Recorder.new(@opt)
|
40
42
|
if user_identifier_before != user_identifier_after then
|
41
|
-
#
|
42
|
-
dejavu_recorder = Recorder.new(@opt)
|
43
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} HERE SOMETHING CHANGED"
|
43
44
|
dejavu_recorder.identifier_change(user_identifier_after)
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
-
|
47
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} ABOUT TO DO THE RECORD"
|
48
48
|
dejavu_recorder.record(env, resp, current_request, t_start, t_stop, user_identifier_after)
|
49
|
-
|
49
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} FINISHED THE RECORD OPERATION"
|
50
50
|
resp
|
51
51
|
else
|
52
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} HERE SKIPPED COMPLETLEY"
|
52
53
|
@app.call(env)
|
53
54
|
end
|
54
55
|
end
|
@@ -59,7 +60,7 @@ module SoldierOfCode
|
|
59
60
|
# otherwise will create a hash based on the env data available
|
60
61
|
#
|
61
62
|
def get_user_identifier(env) # => a string representing a specific browser client user
|
62
|
-
|
63
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} HERE DOING IDENTIFIER WORK"
|
63
64
|
http_accept = env['HTTP_ACCEPT']
|
64
65
|
http_agent = env['HTTP_USER_AGENT']
|
65
66
|
user_ip = env['REMOTE_ADDR']
|
@@ -184,7 +184,7 @@ module DejaVuNS
|
|
184
184
|
accessed
|
185
185
|
index = record.get_the_index
|
186
186
|
if(nil == index) then
|
187
|
-
raise Xampl::XamplException.new("no value for the index '
|
187
|
+
raise Xampl::XamplException.new("no value for the index 'pid' of record defined in : " << record.pp_xml)
|
188
188
|
end
|
189
189
|
|
190
190
|
existing = @record_child[index]
|
@@ -206,6 +206,7 @@ module DejaVuNS
|
|
206
206
|
accessed
|
207
207
|
|
208
208
|
record = nil
|
209
|
+
record = Record.lookup(index) if Xampl.persister and Xampl.persister.automatic
|
209
210
|
record = Record.new(index) unless record
|
210
211
|
|
211
212
|
yield(record) if block_given?
|
@@ -218,6 +219,7 @@ module DejaVuNS
|
|
218
219
|
record = @record_child[index]
|
219
220
|
return record if record
|
220
221
|
|
222
|
+
record = Record.lookup(index) if Xampl.persister and Xampl.persister.automatic
|
221
223
|
record = Record.new(index) unless record
|
222
224
|
|
223
225
|
yield(record) if block_given?
|
@@ -834,7 +836,28 @@ module DejaVuNS
|
|
834
836
|
end
|
835
837
|
|
836
838
|
class Record
|
837
|
-
include Xampl::
|
839
|
+
include Xampl::XamplPersistedObject
|
840
|
+
|
841
|
+
@@default_persister_format = nil
|
842
|
+
|
843
|
+
def default_persister_format
|
844
|
+
@@default_persister_format
|
845
|
+
end
|
846
|
+
def Record.default_persister_format
|
847
|
+
@@default_persister_format
|
848
|
+
end
|
849
|
+
def Record.set_default_persister_format(format)
|
850
|
+
@@default_persister_format = format
|
851
|
+
end
|
852
|
+
|
853
|
+
def Record.find_by_query
|
854
|
+
things = Xampl.find_xampl do | q |
|
855
|
+
q.add_condition('class', :equals, self.name)
|
856
|
+
yield(q)
|
857
|
+
end
|
858
|
+
end
|
859
|
+
|
860
|
+
|
838
861
|
include Xampl::XamplWithDataContent
|
839
862
|
|
840
863
|
@@tag = "record"
|
@@ -843,12 +866,13 @@ module DejaVuNS
|
|
843
866
|
@@module_name = "DejaVuNS"
|
844
867
|
@@safe_name = "DejaVuNS_record"
|
845
868
|
@@attributes = [
|
846
|
-
[ :@
|
869
|
+
[ :@pid, "pid" ],
|
847
870
|
[ :@stamp, "stamp" ],
|
848
871
|
[ :@status, "status" ],
|
849
872
|
[ :@httpmethod, "httpmethod" ],
|
850
873
|
[ :@url, "url" ],
|
851
874
|
[ :@request_time, "request-time" ],
|
875
|
+
[ :@scheduled_for_deletion_at, "scheduled-for-deletion-at" ],
|
852
876
|
]
|
853
877
|
include DejaVuNS::HeaderAsChild
|
854
878
|
include DejaVuNS::BodyAsChild
|
@@ -856,15 +880,25 @@ module DejaVuNS
|
|
856
880
|
include DejaVuNS::MultipartReferenceAsChild
|
857
881
|
|
858
882
|
|
859
|
-
def
|
860
|
-
|
861
|
-
@id
|
883
|
+
def Record.lookup(pid)
|
884
|
+
Xampl.lookup(Record, pid)
|
862
885
|
end
|
863
886
|
|
864
|
-
def
|
865
|
-
|
866
|
-
|
867
|
-
|
887
|
+
def Record.[](pid)
|
888
|
+
Xampl.lookup(Record, pid)
|
889
|
+
end
|
890
|
+
|
891
|
+
def pid
|
892
|
+
@pid
|
893
|
+
end
|
894
|
+
|
895
|
+
def pid=(v)
|
896
|
+
accessed
|
897
|
+
# This is kind of optimistic, I think you are in trouble if you do this
|
898
|
+
Xampl.auto_uncache(self) if @pid
|
899
|
+
@pid = v
|
900
|
+
changed
|
901
|
+
Xampl.auto_cache(self) if v
|
868
902
|
end
|
869
903
|
|
870
904
|
def stamp
|
@@ -922,16 +956,28 @@ module DejaVuNS
|
|
922
956
|
@request_time = v
|
923
957
|
end
|
924
958
|
|
959
|
+
def scheduled_for_deletion_at
|
960
|
+
accessed
|
961
|
+
@scheduled_for_deletion_at
|
962
|
+
end
|
963
|
+
|
964
|
+
def scheduled_for_deletion_at=(v)
|
965
|
+
accessed
|
966
|
+
changed
|
967
|
+
@scheduled_for_deletion_at = v
|
968
|
+
end
|
969
|
+
|
925
970
|
def initialize(index=nil)
|
926
|
-
@
|
971
|
+
@pid = index if index
|
927
972
|
super()
|
928
973
|
|
929
|
-
@
|
974
|
+
@pid = nil if not defined? @pid
|
930
975
|
@stamp = nil if not defined? @stamp
|
931
976
|
@status = nil if not defined? @status
|
932
977
|
@httpmethod = nil if not defined? @httpmethod
|
933
978
|
@url = nil if not defined? @url
|
934
979
|
@request_time = nil if not defined? @request_time
|
980
|
+
@scheduled_for_deletion_at = nil if not defined? @scheduled_for_deletion_at
|
935
981
|
|
936
982
|
init_xampl_object
|
937
983
|
init_data_content
|
@@ -947,12 +993,12 @@ module DejaVuNS
|
|
947
993
|
end
|
948
994
|
|
949
995
|
def clear_non_persistent_index_attributes
|
950
|
-
@id = nil
|
951
996
|
@stamp = nil
|
952
997
|
@status = nil
|
953
998
|
@httpmethod = nil
|
954
999
|
@url = nil
|
955
1000
|
@request_time = nil
|
1001
|
+
@scheduled_for_deletion_at = nil
|
956
1002
|
end
|
957
1003
|
|
958
1004
|
def append_to(other)
|
@@ -960,11 +1006,11 @@ module DejaVuNS
|
|
960
1006
|
end
|
961
1007
|
|
962
1008
|
def Record.persisted?
|
963
|
-
return
|
1009
|
+
return :pid
|
964
1010
|
end
|
965
1011
|
|
966
1012
|
def persisted?
|
967
|
-
return
|
1013
|
+
return :pid
|
968
1014
|
end
|
969
1015
|
|
970
1016
|
def Record.tag
|
@@ -1012,15 +1058,15 @@ module DejaVuNS
|
|
1012
1058
|
end
|
1013
1059
|
|
1014
1060
|
def indexed_by
|
1015
|
-
:
|
1061
|
+
:pid
|
1016
1062
|
end
|
1017
1063
|
|
1018
1064
|
def get_the_index
|
1019
|
-
@
|
1065
|
+
@pid
|
1020
1066
|
end
|
1021
1067
|
|
1022
1068
|
def set_the_index(index)
|
1023
|
-
@
|
1069
|
+
@pid = index
|
1024
1070
|
end
|
1025
1071
|
|
1026
1072
|
def substitute_in_visit(visitor)
|
data/lib/deja-vu/recorder.rb
CHANGED
@@ -14,6 +14,8 @@ module SoldierOfCode
|
|
14
14
|
def initialize(opt)
|
15
15
|
@identifier = opt['cookie_name']
|
16
16
|
@opt = opt
|
17
|
+
|
18
|
+
@foo = Time.new.to_i
|
17
19
|
end
|
18
20
|
|
19
21
|
def export(to_file_named)
|
@@ -30,27 +32,43 @@ module SoldierOfCode
|
|
30
32
|
|
31
33
|
# 1. try to locate the recording
|
32
34
|
recording = nil
|
35
|
+
|
36
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
37
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} INSIDE RECORD - STARTING TXN"
|
38
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
39
|
+
|
33
40
|
DejaVuNS.transaction do
|
41
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} JUST INSIDE"
|
34
42
|
recording = DejaVuNS::Recording.find_by_identifier(@identifier)
|
35
|
-
|
36
|
-
# puts "#{__FILE__}:#{__LINE__} #{
|
43
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} RECORDING FOUND: #{recording.pid}"
|
44
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} #{recording.class.name}"
|
37
45
|
# 1.b if not found then create a new one
|
38
46
|
unless recording
|
47
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
39
48
|
recording = DejaVuNS.root.new_recording(DejaVuNS.pid_from_string(@identifier||identifier))
|
40
49
|
recording.cookie = req.cookies[@identifier||identifier]
|
41
50
|
recording.stamp = Time.new.to_i
|
42
51
|
recording.agent = env['HTTP_USER_AGENT']
|
43
52
|
recording.ip = env['REMOTE_ADDR']
|
53
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
44
54
|
end
|
45
55
|
|
46
56
|
# 2. create a new record
|
47
|
-
# puts "#{__FILE__}:#{__LINE__} #{
|
57
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} #{recording.class.name}"
|
58
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
48
59
|
record = recording.new_record("#{Time.new.to_i}")
|
60
|
+
#puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
49
61
|
record.stamp = "#{Time.new.to_i}"
|
62
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
63
|
+
|
50
64
|
record.status = "#{resp[0]}"
|
65
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
51
66
|
record.httpmethod = env['REQUEST_METHOD']
|
67
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
52
68
|
record.url = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['REQUEST_URI']}"
|
69
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
53
70
|
record.request_time = ("#{end_time.to_i}.#{end_time.usec}".to_f - "#{start_time.to_i}.#{start_time.usec}".to_f).to_s
|
71
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
54
72
|
|
55
73
|
# 3. add the body etc elements
|
56
74
|
resp[1].each do |k, v|
|
@@ -58,33 +76,56 @@ module SoldierOfCode
|
|
58
76
|
h.name = k
|
59
77
|
h.value = v
|
60
78
|
end
|
79
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
61
80
|
|
62
81
|
record.new_body().content = "<![CDATA[#{resp[2]}]]>"
|
82
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
63
83
|
|
64
84
|
if req.post? && env['CONTENT_TYPE'] =~ %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n
|
65
85
|
# its multipart
|
66
86
|
# <multipart-reference name="" file-path=""/>
|
67
87
|
# can I grab it off the env object?
|
68
|
-
puts "#{__FILE__}:#{__LINE__} #{
|
88
|
+
puts "#{__FILE__}:#{__LINE__} #{Thread.current} NOT IMPLEMENTED - MULTIPART"
|
69
89
|
else
|
90
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
70
91
|
# safe param recording
|
71
92
|
req.params.each do |k,v|
|
72
93
|
p = record.new_param()
|
73
94
|
p.name = k
|
74
95
|
p.value = v
|
75
96
|
end
|
97
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} "
|
76
98
|
|
77
99
|
end
|
100
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} ABOUT TO PRINT XML"
|
101
|
+
STDOUT.flush
|
102
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} #{recording.pp_xml}"
|
78
103
|
end
|
79
104
|
|
105
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
106
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
107
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
108
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
109
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
110
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} DONE TXN"
|
111
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
112
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
113
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
114
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
115
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
116
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
|
117
|
+
|
80
118
|
end
|
81
119
|
|
82
120
|
def identifier_change(new_identifier)
|
83
121
|
DejaVuNS.transaction do
|
122
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} IDENTIFIER CHANGE"
|
84
123
|
recording = DejaVuNS::Recording.find_by_identifier(@identifier)
|
85
124
|
if recording
|
125
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.current} IDENTIFIER CHANGE HERE"
|
86
126
|
@identifier = new_identifier
|
87
127
|
recording.cookie = new_identifier
|
128
|
+
# puts "#{__FILE__}:#{__LINE__} #{Thread.currentta} IDENTIFIER CHANGE HERE #{recording.cookie}"
|
88
129
|
end
|
89
130
|
end
|
90
131
|
end
|