Skip to content

Commit 9392810

Browse files
author
Peter McCluskey
committed
speed up incremental update with deleted files and usegdbm
1 parent 53ff6dd commit 9392810

File tree

5 files changed

+41
-10
lines changed

5 files changed

+41
-10
lines changed

Changelog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Version Changes for Hypermail
22
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33

4+
Peter McCluskey (Mar 23, 2004)
5+
Changes to speed up incremental update when there are deleted files if
6+
using usegdbm (it's still slow if usegdbm = 0).
7+
48
============================
59
HYPERMAIL VERSION 2.1.9:
610
============================

src/hypermail.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,8 @@ struct emailinfo {
274274
long exp_time;
275275
int is_deleted; /* 1=deleted, 2=expired, 4=filtered out, */
276276
/* 8=filtered (required line missing) */
277+
int deletion_completed; /* -1 or delete_level that reflects last time */
278+
/* that file was rewritten to reflect is_deleted */
277279
};
278280

279281
struct header {

src/parse.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3204,6 +3204,7 @@ int loadoldheadersfromGDBMindex(char *dir, int get_count_only)
32043204
GDBM_FILE gp;
32053205
int num;
32063206
int num_added = 0;
3207+
int old_delete_level = -1;
32073208

32083209
if (!get_count_only)
32093210
authorlist = subjectlist = datelist = NULL;
@@ -3235,6 +3236,12 @@ int loadoldheadersfromGDBMindex(char *dir, int get_count_only)
32353236
datum key;
32363237
int max_num;
32373238

3239+
key.dptr = "delete_level";
3240+
key.dsize = strlen(key.dptr);
3241+
content = gdbm_fetch(gp, key);
3242+
if (content.dptr)
3243+
old_delete_level = atoi(content.dptr);
3244+
32383245
key.dptr = (char *) #
32393246
key.dsize = sizeof(num);
32403247

@@ -3309,6 +3316,7 @@ int loadoldheadersfromGDBMindex(char *dir, int get_count_only)
33093316
fromdate, charset, isodate, isofromdate, bp))) {
33103317
emp->exp_time = exp_time;
33113318
emp->is_deleted = is_deleted;
3319+
emp->deletion_completed = old_delete_level;
33123320
check_expiry(emp);
33133321
if (insert_in_lists(emp, NULL, 0))
33143322
++num_added;

src/print.c

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,17 @@ static GDBM_FILE gdbm_init()
17751775

17761776
unlink(indexname);
17771777
}
1778+
else {
1779+
datum key;
1780+
datum content;
1781+
char buf[512];
1782+
key.dptr = "delete_level";
1783+
key.dsize = strlen(key.dptr);
1784+
sprintf(buf, "%d", set_delete_level);
1785+
content.dsize = strlen(buf) + 1;
1786+
content.dptr = buf; /* the value is in this string */
1787+
gdbm_store(gp, key, content, GDBM_REPLACE);
1788+
}
17781789
}
17791790
return gp;
17801791
}
@@ -1796,17 +1807,22 @@ void update_deletions(int num_old)
17961807
if (num >= num_old)
17971808
continue; /* new message - already done */
17981809
if (hashnumlookup(num, &ep)) {
1799-
char *filename = articlehtmlfilename(ep);
1800-
if (set_delete_level != DELETE_REMOVES_FILES) {
1801-
struct body *bp = ep->bodylist;
1802-
if (bp == NULL)
1803-
parse_old_html(num, ep, 1, 0, NULL, 0);
1804-
writearticles(num, num + 1);
1805-
}
1806-
else if (isfile(filename)) {
1807-
unlink(filename);
1810+
char *filename;
1811+
if (ep->deletion_completed == set_delete_level) /* done already? */
1812+
continue;
1813+
if (set_delete_level != DELETE_LEAVES_TEXT) {
1814+
filename = articlehtmlfilename(ep);
1815+
if (set_delete_level != DELETE_REMOVES_FILES) {
1816+
struct body *bp = ep->bodylist;
1817+
if (bp == NULL)
1818+
parse_old_html(num, ep, 1, 0, NULL, 0);
1819+
writearticles(num, num + 1);
1820+
}
1821+
else if (isfile(filename)) {
1822+
unlink(filename);
1823+
}
1824+
free(filename);
18081825
}
1809-
free(filename);
18101826
#ifdef FASTREPLYCODE
18111827
for (rp = ep->replylist; rp != NULL; rp = rp->next) {
18121828
#else

src/struct.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ struct emailinfo *addhash(int num, char *date, char *name, char *email, char *ms
266266
e->charset = strsav(charset);
267267
e->flags = 0;
268268
e->is_deleted = 0;
269+
e->deletion_completed = -1;
269270
e->exp_time = -1;
270271
e->bodylist = sp;
271272
e->initial_next_in_thread = -1;

0 commit comments

Comments
 (0)