Merge lp://qastaging/~marnanel/joule/statussnap into lp://qastaging/joule
- statussnap
- Merge into joule-3-0-1
Proposed by
Marnanel Thurman
Status: | Merged |
---|---|
Merged at revision: | not available |
Proposed branch: | lp://qastaging/~marnanel/joule/statussnap |
Merge into: | lp://qastaging/joule |
Diff against target: | None lines |
To merge this branch: | bzr merge lp://qastaging/~marnanel/joule/statussnap |
Related bugs: | |
Related blueprints: |
Delta calculation should be done in SQL
(Undefined)
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Marnanel Thurman | Approve | ||
Review via email: mp+5915@code.qastaging.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Marnanel Thurman (marnanel) wrote : | # |
Revision history for this message
Marnanel Thurman (marnanel) wrote : | # |
approving my own review :)
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'lib/Joule/History.pm' | |||
2 | --- lib/Joule/History.pm 2009-04-21 01:52:56 +0000 | |||
3 | +++ lib/Joule/History.pm 2009-04-27 04:10:26 +0000 | |||
4 | @@ -1,5 +1,5 @@ | |||
5 | 1 | # Joule - track changes in an online list over time | 1 | # Joule - track changes in an online list over time |
7 | 2 | # Copyright (C) 2002-2008 Thomas Thurman | 2 | # Copyright (C) 2002-2009 Thomas Thurman |
8 | 3 | # | 3 | # |
9 | 4 | # This program is free software: you can redistribute it and/or modify | 4 | # This program is free software: you can redistribute it and/or modify |
10 | 5 | # it under the terms of the GNU Affero General Public License as | 5 | # it under the terms of the GNU Affero General Public License as |
11 | @@ -49,6 +49,14 @@ | |||
12 | 49 | return map { $_->[0] } @{ $sth->fetchall_arrayref() }; | 49 | return map { $_->[0] } @{ $sth->fetchall_arrayref() }; |
13 | 50 | } | 50 | } |
14 | 51 | 51 | ||
15 | 52 | sub _add_snapshot_row { | ||
16 | 53 | my ($self, $snap, $name) = @_; | ||
17 | 54 | my $sth = $self->{dbh}->prepare('INSERT INTO snapshot (snap, name) VALUES (?,?)'); | ||
18 | 55 | $sth->execute($snap, $name); | ||
19 | 56 | open TEST, ">/tmp/j-$snap-$name"; | ||
20 | 57 | close TEST; | ||
21 | 58 | } | ||
22 | 59 | |||
23 | 52 | sub content { | 60 | sub content { |
24 | 53 | my ($self, $opts) = @_; | 61 | my ($self, $opts) = @_; |
25 | 54 | 62 | ||
26 | @@ -61,67 +69,87 @@ | |||
27 | 61 | my $done_today = $self->{dbh}->prepare("SELECT COUNT(datestamp) FROM checking WHERE userid=? AND datestamp=CURRENT_DATE LIMIT 1"); | 69 | my $done_today = $self->{dbh}->prepare("SELECT COUNT(datestamp) FROM checking WHERE userid=? AND datestamp=CURRENT_DATE LIMIT 1"); |
28 | 62 | $done_today->execute($self->{userid}); | 70 | $done_today->execute($self->{userid}); |
29 | 63 | 71 | ||
38 | 64 | if ($done_today->fetchrow()) { | 72 | my $sth; |
39 | 65 | 73 | ||
40 | 66 | if ($opts->{virgin}) { | 74 | unless ($done_today->fetchrow()) { |
41 | 67 | $opts->{current_names} = [ $self->{'status'}->names() ]; | 75 | |
34 | 68 | return (); | ||
35 | 69 | } | ||
36 | 70 | |||
37 | 71 | } else { | ||
42 | 72 | # it hasn't been done today | 76 | # it hasn't been done today |
43 | 73 | 77 | ||
44 | 74 | $self->{dbh}->begin_work(); | 78 | $self->{dbh}->begin_work(); |
45 | 75 | 79 | ||
49 | 76 | my @newfetch = $self->{'status'}->names(); | 80 | $sth = $self->{dbh}->prepare("SELECT nextval('snapid'), current_date"); |
50 | 77 | 81 | $sth->execute(); | |
51 | 78 | $opts->{lonely} = 1 unless @newfetch; | 82 | my ($snap, $today) = $sth->fetchrow_array(); |
52 | 83 | my $name_count = 0; | ||
53 | 84 | |||
54 | 85 | $self->{'status'}->names(sub { | ||
55 | 86 | $name_count++; | ||
56 | 87 | $self->_add_snapshot_row($snap, shift); | ||
57 | 88 | }); | ||
58 | 89 | |||
59 | 90 | $opts->{lonely} = 1 unless $name_count; | ||
60 | 79 | return () if $opts->{lonely} and $opts->{virgin}; # because we don't know for sure it exists at all | 91 | return () if $opts->{lonely} and $opts->{virgin}; # because we don't know for sure it exists at all |
61 | 80 | 92 | ||
63 | 81 | my $sth = $self->{dbh}->prepare("SELECT COUNT(*) FROM account WHERE userid=?"); | 93 | $sth = $self->{dbh}->prepare("SELECT COUNT(*) FROM account WHERE userid=? LIMIT 1"); |
64 | 82 | $sth->execute($self->{userid}); | 94 | $sth->execute($self->{userid}); |
65 | 83 | unless ($sth->fetchrow()) { | 95 | unless ($sth->fetchrow()) { |
68 | 84 | $sth = $self->{dbh}->prepare("INSERT INTO account VALUES (?)"); | 96 | $sth = $self->{dbh}->prepare("INSERT INTO account VALUES (?)"); |
69 | 85 | $sth->execute($self->{userid}); | 97 | $sth->execute($self->{userid}); |
70 | 86 | } | 98 | } |
71 | 87 | 99 | ||
72 | 88 | my $adder = $self->{dbh}->prepare("INSERT INTO checking(userid, datestamp) VALUES (?, CURRENT_DATE)"); | 100 | my $adder = $self->{dbh}->prepare("INSERT INTO checking(userid, datestamp) VALUES (?, CURRENT_DATE)"); |
73 | 89 | $adder->execute($self->{userid}); | 101 | $adder->execute($self->{userid}); |
74 | 90 | 102 | ||
75 | 91 | my $current_add = $self->{dbh}->prepare("INSERT INTO current(userid, fan) VALUES (?,?)"); | ||
76 | 92 | if ($opts->{virgin}) { | 103 | if ($opts->{virgin}) { |
83 | 93 | $opts->{virgin} = 1; | 104 | |
84 | 94 | $opts->{current_names} = \@newfetch; | 105 | $opts->{virgin} = 1; |
85 | 95 | 106 | ||
86 | 96 | for (@newfetch) { | 107 | $sth = $self->{dbh}->prepare( |
87 | 97 | $current_add->execute($self->{userid}, $_); | 108 | "insert into current (userid, fan) ". |
88 | 98 | } | 109 | "select ?, name from snapshot where snap=?"); |
89 | 110 | $sth->execute($self->{userid}, $snap); | ||
90 | 99 | 111 | ||
91 | 100 | } else { | 112 | } else { |
107 | 101 | my @latest = $self->current(); | 113 | |
108 | 102 | 114 | # Deltas are not stored for virgin accounts | |
109 | 103 | my $adder = $self->{dbh}->prepare("INSERT INTO change(userid, datestamp, fan, added) VALUES (?,CURRENT_DATE,?,?)"); | 115 | # (otherwise it shows a mass friending first) |
110 | 104 | my $current_del = $self->{dbh}->prepare("DELETE FROM current WHERE userid=? AND fan=?"); | 116 | |
111 | 105 | 117 | $sth = $self->{dbh}->prepare( | |
112 | 106 | # Deltas are not stored for virgin accounts (otherwise it shows a mass friending first) | 118 | "insert into change(userid,datestamp,fan,added) ". |
113 | 107 | for (_subtract( \@newfetch, \@latest )) { | 119 | "select ?, ?, name, true ". |
114 | 108 | $adder->execute($self->{userid}, $_, 1); | 120 | "from snapshot where snap=? and name not in ". |
115 | 109 | $current_add->execute($self->{userid}, $_); | 121 | "(select fan from current where userid=?)"); |
116 | 110 | } | 122 | $sth->execute($self->{userid}, $today, $snap, $self->{userid}); |
117 | 111 | 123 | ||
118 | 112 | for (_subtract( \@latest, \@newfetch )) { | 124 | $sth = $self->{dbh}->prepare( |
119 | 113 | $adder->execute($self->{userid}, $_, 0); | 125 | "insert into change(userid,datestamp,fan,added) ". |
120 | 114 | $current_del->execute($self->{userid}, $_); | 126 | "select ?, ?, fan, false ". |
121 | 115 | } | 127 | "from current where userid=? and fan not in ". |
122 | 128 | "(select name from snapshot where snap=?) and userid=?"); | ||
123 | 129 | $sth->execute($self->{userid}, $today, $self->{userid}, $snap, $self->{userid}); | ||
124 | 130 | |||
125 | 131 | $sth = $self->{dbh}->prepare( | ||
126 | 132 | "insert into current select userid, fan from change ". | ||
127 | 133 | "where userid=? and datestamp=? and added"); | ||
128 | 134 | $sth->execute($self->{userid}, $today); | ||
129 | 135 | |||
130 | 136 | $sth = $self->{dbh}->prepare( | ||
131 | 137 | "delete from current where userid=? ". | ||
132 | 138 | "and fan in (select fan from change where ". | ||
133 | 139 | "userid=? and datestamp=? and not added)"); | ||
134 | 140 | $sth->execute($self->{userid}, $self->{userid}, $today); | ||
135 | 116 | } | 141 | } |
136 | 117 | 142 | ||
137 | 143 | $sth = $self->{dbh}->prepare('delete from snapshot where snap=?'); | ||
138 | 144 | $sth->execute($snap); | ||
139 | 145 | |||
140 | 118 | # Aaaaand... commit. | 146 | # Aaaaand... commit. |
141 | 119 | $self->{dbh}->commit(); | 147 | $self->{dbh}->commit(); |
142 | 120 | |||
143 | 121 | # There's no more useful information to return on virgin accounts. | ||
144 | 122 | return () if $opts->{virgin}; | ||
145 | 123 | } | 148 | } |
146 | 124 | 149 | ||
147 | 150 | # There's no more useful information to return on virgin accounts. | ||
148 | 151 | return () if $opts->{virgin}; | ||
149 | 152 | |||
150 | 125 | my $query; | 153 | my $query; |
151 | 126 | if ($opts->{'noblanks'}) { # noblanks version is much simpler | 154 | if ($opts->{'noblanks'}) { # noblanks version is much simpler |
152 | 127 | my $where_limit = ''; | 155 | my $where_limit = ''; |
153 | @@ -144,8 +172,7 @@ | |||
154 | 144 | ' ORDER BY checking.datestamp DESC'; | 172 | ' ORDER BY checking.datestamp DESC'; |
155 | 145 | } | 173 | } |
156 | 146 | 174 | ||
159 | 147 | my $sth = $self->{dbh}->prepare($query); | 175 | $sth = $self->{dbh}->prepare($query); |
158 | 148 | |||
160 | 149 | $sth->execute($self->{userid}); | 176 | $sth->execute($self->{userid}); |
161 | 150 | 177 | ||
162 | 151 | my %results; | 178 | my %results; |
163 | @@ -180,17 +207,6 @@ | |||
164 | 180 | return @result; | 207 | return @result; |
165 | 181 | } | 208 | } |
166 | 182 | 209 | ||
167 | 183 | sub _subtract { | ||
168 | 184 | my ($left, $right) = @_; | ||
169 | 185 | |||
170 | 186 | my @left = @$left; | ||
171 | 187 | my @right = @$right; | ||
172 | 188 | |||
173 | 189 | my %right_index = map { $_ => 1 } @right; | ||
174 | 190 | |||
175 | 191 | return grep { !$right_index{$_} } @$left; | ||
176 | 192 | } | ||
177 | 193 | |||
178 | 194 | sub DESTROY { | 210 | sub DESTROY { |
179 | 195 | my ($self) = @_; | 211 | my ($self) = @_; |
180 | 196 | $self->{dbh}->disconnect(); | 212 | $self->{dbh}->disconnect(); |
181 | 197 | 213 | ||
182 | === modified file 'lib/Joule/Status/From_DE.pm' | |||
183 | --- lib/Joule/Status/From_DE.pm 2008-10-28 14:23:22 +0000 | |||
184 | +++ lib/Joule/Status/From_DE.pm 2009-04-25 01:38:44 +0000 | |||
185 | @@ -30,7 +30,8 @@ | |||
186 | 30 | sub site { "del.icio.us"; } | 30 | sub site { "del.icio.us"; } |
187 | 31 | 31 | ||
188 | 32 | sub names { | 32 | sub names { |
190 | 33 | my ($self) = @_; | 33 | my ($self, $callback) = @_; |
191 | 34 | |||
192 | 34 | my $ua = LWP::UserAgent->new(); | 35 | my $ua = LWP::UserAgent->new(); |
193 | 35 | $ua->agent("Joule/3.0 (http://marnanel.org/joule; thomas\@thurman.org.uk)"); | 36 | $ua->agent("Joule/3.0 (http://marnanel.org/joule; thomas\@thurman.org.uk)"); |
194 | 36 | 37 | ||
195 | @@ -40,7 +41,9 @@ | |||
196 | 40 | 41 | ||
197 | 41 | die __PACKAGE__ . ' error: ' . $res->status_line() unless $res->is_success(); | 42 | die __PACKAGE__ . ' error: ' . $res->status_line() unless $res->is_success(); |
198 | 42 | 43 | ||
200 | 43 | return @{ jsonToObj($res->content()) }; | 44 | for (@{ jsonToObj($res->content()) }) { |
201 | 45 | $callback->($_); | ||
202 | 46 | } | ||
203 | 44 | } | 47 | } |
204 | 45 | 48 | ||
205 | 46 | 1; | 49 | 1; |
206 | 47 | 50 | ||
207 | === modified file 'lib/Joule/Status/From_LJ.pm' | |||
208 | --- lib/Joule/Status/From_LJ.pm 2008-10-28 14:23:22 +0000 | |||
209 | +++ lib/Joule/Status/From_LJ.pm 2009-04-25 01:38:44 +0000 | |||
210 | @@ -30,7 +30,8 @@ | |||
211 | 30 | sub site { "LiveJournal"; } | 30 | sub site { "LiveJournal"; } |
212 | 31 | 31 | ||
213 | 32 | sub names { | 32 | sub names { |
215 | 33 | my ($self) = @_; | 33 | my ($self, $callback) = @_; |
216 | 34 | |||
217 | 34 | my $ua = LWP::UserAgent->new(); | 35 | my $ua = LWP::UserAgent->new(); |
218 | 35 | $ua->agent("Joule/3.0 (http://marnanel.org/joule; thomas\@thurman.org.uk)"); | 36 | $ua->agent("Joule/3.0 (http://marnanel.org/joule; thomas\@thurman.org.uk)"); |
219 | 36 | 37 | ||
220 | @@ -40,13 +41,9 @@ | |||
221 | 40 | 41 | ||
222 | 41 | die __PACKAGE__ . ' error: ' . $res->status_line() unless $res->is_success(); | 42 | die __PACKAGE__ . ' error: ' . $res->status_line() unless $res->is_success(); |
223 | 42 | 43 | ||
224 | 43 | my @result; | ||
225 | 44 | |||
226 | 45 | for (split('\n', $res->content())) { | 44 | for (split('\n', $res->content())) { |
228 | 46 | push @result, $1 if $_ =~ /^< (.*)$/; | 45 | $callback->($1) if $_ =~ /^< (.*)$/; |
229 | 47 | } | 46 | } |
230 | 48 | |||
231 | 49 | return @result; | ||
232 | 50 | } | 47 | } |
233 | 51 | 48 | ||
234 | 52 | 1; | 49 | 1; |
235 | 53 | 50 | ||
236 | === added file 'lib/Joule/Status/From_QD.pm' | |||
237 | --- lib/Joule/Status/From_QD.pm 1970-01-01 00:00:00 +0000 | |||
238 | +++ lib/Joule/Status/From_QD.pm 2009-04-27 04:10:26 +0000 | |||
239 | @@ -0,0 +1,46 @@ | |||
240 | 1 | # Joule - track changes in an online list over time | ||
241 | 2 | # Copyright (C) 2002-2008 Thomas Thurman | ||
242 | 3 | # | ||
243 | 4 | # This program is free software: you can redistribute it and/or modify | ||
244 | 5 | # it under the terms of the GNU Affero General Public License as | ||
245 | 6 | # published by the Free Software Foundation, either version 3 of the | ||
246 | 7 | # License, or (at your option) any later version. | ||
247 | 8 | # | ||
248 | 9 | # This program is distributed in the hope that it will be useful, | ||
249 | 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
250 | 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
251 | 12 | # GNU Affero General Public License for more details. | ||
252 | 13 | # | ||
253 | 14 | # You should have received a copy of the GNU Affero General Public License | ||
254 | 15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
255 | 16 | |||
256 | 17 | package Joule::Status::From_QD; | ||
257 | 18 | |||
258 | 19 | use strict; | ||
259 | 20 | use warnings; | ||
260 | 21 | use JSON; | ||
261 | 22 | |||
262 | 23 | sub new { | ||
263 | 24 | my ($class, $vars) = @_; | ||
264 | 25 | |||
265 | 26 | die "unknown user" unless $vars->{user} eq 'dummy'; | ||
266 | 27 | |||
267 | 28 | bless {}, $class; | ||
268 | 29 | } | ||
269 | 30 | |||
270 | 31 | sub site { "Dummy testing site"; } | ||
271 | 32 | |||
272 | 33 | sub names { | ||
273 | 34 | my ($self, $callback) = @_; | ||
274 | 35 | |||
275 | 36 | open JSON, '</tmp/joule.qd.json' or return; | ||
276 | 37 | my @result = @{from_json(<JSON>)}; | ||
277 | 38 | close JSON or return; | ||
278 | 39 | |||
279 | 40 | for (@result) { | ||
280 | 41 | $callback->($_); | ||
281 | 42 | } | ||
282 | 43 | } | ||
283 | 44 | |||
284 | 45 | 1; | ||
285 | 46 | |||
286 | 0 | 47 | ||
287 | === modified file 'share/tmpl/html_virgin_page.tmpl' | |||
288 | --- share/tmpl/html_virgin_page.tmpl 2008-10-28 14:06:24 +0000 | |||
289 | +++ share/tmpl/html_virgin_page.tmpl 2009-04-27 04:14:27 +0000 | |||
290 | @@ -2,9 +2,5 @@ | |||
291 | 2 | You haven't used Joule before today. Welcome!<br /><br /> | 2 | You haven't used Joule before today. Welcome!<br /><br /> |
292 | 3 | 3 | ||
293 | 4 | Come back tomorrow and you'll see a list of who has friended | 4 | Come back tomorrow and you'll see a list of who has friended |
299 | 5 | or unfriended you between now and then. Until then, here's the | 5 | or unfriended you between now and then. |
295 | 6 | list of people who currently have you friended:<br /><br /> | ||
296 | 7 | |||
297 | 8 | [% SET nohiccup=1 %] | ||
298 | 9 | [% INCLUDE user_list.tmpl list=current_names %] | ||
300 | 10 | </p> | 6 | </p> |
301 | 11 | 7 | ||
302 | === added directory 'test' | |||
303 | === added file 'test/qd-test.pl' | |||
304 | --- test/qd-test.pl 1970-01-01 00:00:00 +0000 | |||
305 | +++ test/qd-test.pl 2009-04-27 04:10:26 +0000 | |||
306 | @@ -0,0 +1,89 @@ | |||
307 | 1 | use strict; | ||
308 | 2 | use warnings; | ||
309 | 3 | use Test::More tests=>7; | ||
310 | 4 | use Data::Dumper; | ||
311 | 5 | use DBI; | ||
312 | 6 | use LWP::UserAgent; | ||
313 | 7 | use JSON; | ||
314 | 8 | |||
315 | 9 | my $settings = do '/etc/joule.conf'; | ||
316 | 10 | die "Must be run on the staging server" if $settings->{'user'} ne 'stagingjoule'; | ||
317 | 11 | |||
318 | 12 | my $dbh = DBI->connect($settings->{'database'}, | ||
319 | 13 | $settings->{'user'}, | ||
320 | 14 | $settings->{'password'}); | ||
321 | 15 | ok($dbh, 'connected to the database'); | ||
322 | 16 | die "no point continuing" unless $dbh; | ||
323 | 17 | |||
324 | 18 | my $sth; | ||
325 | 19 | |||
326 | 20 | $sth = $dbh->prepare("DELETE FROM current WHERE userid=?"); | ||
327 | 21 | $sth->execute('qd/dummy'); | ||
328 | 22 | $sth = $dbh->prepare("DELETE FROM change WHERE userid=?"); | ||
329 | 23 | $sth->execute('qd/dummy'); | ||
330 | 24 | $sth = $dbh->prepare("DELETE FROM checking WHERE userid=?"); | ||
331 | 25 | $sth->execute('qd/dummy'); | ||
332 | 26 | |||
333 | 27 | ok(1, "cleaned database"); | ||
334 | 28 | |||
335 | 29 | sub db_state { | ||
336 | 30 | my @result; | ||
337 | 31 | |||
338 | 32 | my $sth = $dbh->prepare("select fan from current where userid='qd/dummy'"); | ||
339 | 33 | $sth->execute(); | ||
340 | 34 | @result = (@result, map { $_->[0] } @{ $sth->fetchall_arrayref() } ); | ||
341 | 35 | |||
342 | 36 | $sth = $dbh->prepare("select fan from change where userid='qd/dummy' and added"); | ||
343 | 37 | $sth->execute(); | ||
344 | 38 | @result = (@result, map { '+'.$_->[0] } @{ $sth->fetchall_arrayref() } ); | ||
345 | 39 | |||
346 | 40 | $sth = $dbh->prepare("select fan from change where userid='qd/dummy' and not added"); | ||
347 | 41 | $sth->execute(); | ||
348 | 42 | @result = (@result, map { '-'.$_->[0] } @{ $sth->fetchall_arrayref() } ); | ||
349 | 43 | |||
350 | 44 | return join(' ', sort @result); | ||
351 | 45 | } | ||
352 | 46 | |||
353 | 47 | sub set_qd { | ||
354 | 48 | open JSON, '>/tmp/joule.qd.json' or die "Can't open: $!"; | ||
355 | 49 | print JSON to_json(\@_); | ||
356 | 50 | close JSON or die "Can't close!"; | ||
357 | 51 | } | ||
358 | 52 | |||
359 | 53 | sub do_fetch { | ||
360 | 54 | |||
361 | 55 | my $ua = LWP::UserAgent->new; | ||
362 | 56 | |||
363 | 57 | my $req = HTTP::Request->new(GET => 'http://staging.joule.marnanel.org/chart/qd/dummy'); | ||
364 | 58 | my $res = $ua->request($req); | ||
365 | 59 | |||
366 | 60 | ok($res->is_success, 'Touched the webserver to make it fetch'); | ||
367 | 61 | die $res->status_line unless $res->is_success; | ||
368 | 62 | } | ||
369 | 63 | |||
370 | 64 | sub age_records { | ||
371 | 65 | my $sth = $dbh->prepare('INSERT INTO checking (userid, datestamp) VALUES (?,?)'); | ||
372 | 66 | $sth->execute('qd/dummy', '1975-01-30'); | ||
373 | 67 | $sth = $dbh->prepare('UPDATE change SET datestamp=? WHERE userid=?'); | ||
374 | 68 | $sth->execute('1975-01-30', 'qd/dummy'); | ||
375 | 69 | $sth = $dbh->prepare('DELETE FROM checking WHERE userid=? AND datestamp!=?'); | ||
376 | 70 | $sth->execute('qd/dummy', '1975-01-30'); | ||
377 | 71 | } | ||
378 | 72 | |||
379 | 73 | is(db_state(), '', 'initially empty'); | ||
380 | 74 | |||
381 | 75 | set_qd(qw(alpha beta gamma delta)); | ||
382 | 76 | |||
383 | 77 | do_fetch(); | ||
384 | 78 | |||
385 | 79 | is(db_state(), 'alpha beta delta gamma', 'first check has no changes'); | ||
386 | 80 | |||
387 | 81 | set_qd(qw(delta beta epsilon zeta)); | ||
388 | 82 | |||
389 | 83 | age_records(); | ||
390 | 84 | |||
391 | 85 | do_fetch(); | ||
392 | 86 | |||
393 | 87 | is(db_state(), '+epsilon +zeta -alpha -gamma beta delta epsilon zeta', 'second check has changes'); | ||
394 | 88 | |||
395 | 89 | $dbh->disconnect(); |
Completed.