@@ -49,6 +49,20 @@ sub definition {
49
49
return $class -> SUPER::definition($session ,$definition );
50
50
}
51
51
52
+ # -------------------------------------------------------------------
53
+
54
+ =head2 get_statement( session, counter )
55
+
56
+ Return a statement handle at the desired offset.
57
+
58
+ =cut
59
+
60
+ sub get_statement {
61
+ my ($session , $counter ) = @_ ;
62
+ my $passive = q{ select SQL_CALC_FOUND_ROWS * from passiveLog where userId <> '1' order by userId, sessionId, timeStamp limit ?, 500000} ;
63
+ my $sth = $session -> db-> read ($passive , [$counter +0]);
64
+ return $sth ;
65
+ }
52
66
53
67
# -------------------------------------------------------------------
54
68
@@ -72,64 +86,67 @@ sub execute {
72
86
my $endTime = time () + $self -> getTTL;
73
87
my $deltaInterval = $self -> get(' deltaInterval' );
74
88
75
- my $passive = q{ select * from passiveLog where userId <> '1' order by userId, sessionId, timeStamp} ;
76
- my $sth ;
77
89
my $lastUserId ;
78
90
my $lastSessionId ;
79
91
my $lastTimeStamp ;
80
92
my $lastAssetId ;
81
93
my $lastUrl ;
82
94
my $counter = $instance -> getScratch(' counter' );
95
+ my $sth = get_statement($session , $counter );
83
96
if ($counter ) {
84
- $passive .= ' limit ' . $counter .' , 1234567890' ;
85
- $sth = $session -> db-> read ($passive );
86
97
$lastUserId = $instance -> getScratch(' lastUserId' );
87
98
$lastSessionId = $instance -> getScratch(' lastSessionId' );
88
99
$lastTimeStamp = $instance -> getScratch(' lastTimeStamp' );
89
100
$lastAssetId = $instance -> getScratch(' lastAssetId' );
90
101
$lastUrl = $instance -> getScratch(' lastUrl' );
91
102
}
92
103
else {
93
- $sth = $session -> db-> read ($passive );
94
104
my $logLine = $sth -> hashRef();
95
105
$lastUserId = $logLine -> {userId };
96
106
$lastSessionId = $logLine -> {sessionId };
97
107
$lastTimeStamp = $logLine -> {timeStamp };
98
108
$lastAssetId = $logLine -> {assetId };
99
109
$lastUrl = $logLine -> {url };
110
+ $session -> db-> write (' delete from deltaLog' ); # #Only if we're starting out
100
111
}
101
112
102
- $session -> db-> write (' delete from deltaLog' ); # #Only if we're starting out
113
+ my $total_rows = $session -> db-> quickScalar(' select found_rows()' );
114
+
103
115
my $deltaLog = $session -> db-> prepare(' insert into deltaLog (userId, assetId, delta, timeStamp, url) VALUES (?,?,?,?,?)' );
104
116
105
117
my $expired = 0;
106
- LOG_ENTRY: while (my $logLine = $sth -> hashRef()) {
107
- $counter ++;
108
- my $delta = $logLine -> {timeStamp } - $lastTimeStamp ;
109
- if ( $logLine -> {userId } eq $lastUserId
110
- && $logLine -> {sessionId } eq $lastSessionId
111
- && $delta < $deltaInterval ) {
112
- $deltaLog -> execute([$lastUserId , $lastAssetId , $delta , $lastTimeStamp , $lastUrl ]);
118
+ LOG_CHUNK: while (1) {
119
+ LOG_ENTRY: while (my $logLine = $sth -> hashRef()) {
120
+ $counter ++;
121
+ my $delta = $logLine -> {timeStamp } - $lastTimeStamp ;
122
+ if ( $logLine -> {userId } eq $lastUserId
123
+ && $logLine -> {sessionId } eq $lastSessionId
124
+ && $delta < $deltaInterval ) {
125
+ $deltaLog -> execute([$lastUserId , $lastAssetId , $delta , $lastTimeStamp , $lastUrl ]);
126
+ }
127
+ $lastUserId = $logLine -> {userId };
128
+ $lastSessionId = $logLine -> {sessionId };
129
+ $lastTimeStamp = $logLine -> {timeStamp };
130
+ $lastAssetId = $logLine -> {assetId };
131
+ $lastUrl = $logLine -> {url };
132
+ if (time () > $endTime ) {
133
+ $instance -> setScratch(' lastUserId' , $lastUserId );
134
+ $instance -> setScratch(' lastSessionId' , $lastSessionId );
135
+ $instance -> setScratch(' lastTimeStamp' , $lastTimeStamp );
136
+ $instance -> setScratch(' lastAssetId' , $lastAssetId );
137
+ $instance -> setScratch(' lastUrl' , $lastUrl );
138
+ $instance -> setScratch(' counter' , $counter );
139
+ $expired = 1;
140
+ last LOG_ENTRY;
141
+ }
113
142
}
114
- $lastUserId = $logLine -> {userId };
115
- $lastSessionId = $logLine -> {sessionId };
116
- $lastTimeStamp = $logLine -> {timeStamp };
117
- $lastAssetId = $logLine -> {assetId };
118
- $lastUrl = $logLine -> {url };
119
- if (time () > $endTime ) {
120
- $instance -> setScratch(' lastUserId' , $lastUserId );
121
- $instance -> setScratch(' lastSessionId' , $lastSessionId );
122
- $instance -> setScratch(' lastTimeStamp' , $lastTimeStamp );
123
- $instance -> setScratch(' lastAssetId' , $lastAssetId );
124
- $instance -> setScratch(' lastUrl' , $lastUrl );
125
- $instance -> setScratch(' counter' , $counter );
126
- $expired = 1;
127
- last LOG_ENTRY;
143
+
144
+ $sth -> finish;
145
+ if ($expired ) {
146
+ return $self -> WAITING(1);
128
147
}
129
- }
130
-
131
- if ($expired ) {
132
- return $self -> WAITING(1);
148
+ last LOG_CHUNK if $counter >= $total_rows ;
149
+ $sth = get_statement($session , $counter );
133
150
}
134
151
135
152
$instance -> deleteScratch(' lastUserId' );
0 commit comments