]> git.llucax.com Git - software/mutt-debian.git/blob - upstream/extra-patches/header-cache
69ee997a2f7da5085b508d84c1bfafc799f0c67a
[software/mutt-debian.git] / upstream / extra-patches / header-cache
1 # vi: ft=diff
2 This is the header cache patch by Thomas Glanzmann
3 <sithglan@stud.uni-erlangen.de>.
4
5 The home page for this patch is:
6
7   http://wwwcip.informatik.uni-erlangen.de/~sithglan/mutt/
8
9 * Patch last synced with upstream:
10   - Date: 2005-02-10
11   - File: http://wwwcip.informatik.uni-erlangen.de/~sithglan/mutt/mutt-cvs-header-cache.28
12
13 * Changes made: NONE.
14
15 == END PATCH
16 diff -Nru a/PATCHES b/PATCHES
17 --- a/PATCHES
18 +++ b/PATCHES
19 @@ -0,0 +1 @@
20 +mutt-cvs-header-cache.28
21 diff -Nru a/init.h b/init.h
22 --- a/init.h    2005-01-27 20:54:24 +01:00
23 +++ b/init.h    2005-01-28 15:12:41 +01:00
24 @@ -1032,6 +1032,13 @@
25    ** global header cache for all folders is used. Per default it is unset and so
26    ** no header caching will be used.
27    */
28 +  { "maildir_header_cache_verify", DT_BOOL, R_NONE, OPTHCACHEVERIFY, 1 },
29 +  /*
30 +  ** .pp
31 +  ** Check for Maildir unaware programs other than mutt having modified maildir
32 +  ** files when the header cache is in use.  This incurs one stat(2) per
33 +  ** message every time the folder is opened.
34 +  */
35    { "header_cache_pagesize", DT_STR, R_NONE, UL &HeaderCachePageSize, UL "16384" },
36    /*
37    ** .pp
38 diff -Nru a/mh.c b/mh.c
39 --- a/mh.c      2005-01-27 20:45:37 +01:00
40 +++ b/mh.c      2005-02-03 09:09:50 +01:00
41 @@ -787,6 +787,14 @@
42    return r;
43  }
44  
45 +#if USE_HCACHE
46 +static size_t maildir_hcache_keylen (const char *fn)
47 +{
48 +  const char * p = strrchr (fn, ':');
49 +  return p ? (size_t) (p - fn) : mutt_strlen(fn);
50 +}
51 +#endif
52 +
53  #ifdef USE_INODESORT
54  /*
55   * Merge two maildir lists according to the inode numbers.
56 @@ -882,27 +890,67 @@
57   * This function does the second parsing pass for a maildir-style
58   * folder.
59   */
60 -
61  void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md)
62  {
63    struct maildir *p;
64    char fn[_POSIX_PATH_MAX];
65    int count;
66  
67 +#if USE_HCACHE
68 +  void *hc = NULL;
69 +  void *data;
70 +  struct timeval *when = NULL;
71 +  struct stat lastchanged;
72 +  int ret;
73 +
74 +  hc = mutt_hcache_open (HeaderCache, ctx->path);
75 +#endif
76 +
77    for (p = md, count = 0; p; p = p->next, count++)
78 -    if (p && p->h && !p->header_parsed)
79 -    {
80 -      if (!ctx->quiet && ReadInc && ((count % ReadInc) == 0 || count == 1))
81 -       mutt_message (_("Reading %s... %d"), ctx->path, count);
82 -      snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
83 -      if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h))
84 -       p->header_parsed = 1;
85 -      else
86 -       mutt_free_header (&p->h);
87 -    }
88 -}
89 +  {
90 +    if (! (p && p->h && !p->header_parsed))
91 +      continue;
92  
93 +    if (!ctx->quiet && ReadInc && ((count % ReadInc) == 0 || count == 1))
94 +      mutt_message (_("Reading %s... %d"), ctx->path, count);
95  
96 +#if USE_HCACHE
97 +    data = mutt_hcache_fetch (hc, p->h->path + 3, &maildir_hcache_keylen);
98 +    when = (struct timeval *) data;
99 +#endif
100 +
101 +    snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
102 +
103 +#if USE_HCACHE
104 +    if (option(OPTHCACHEVERIFY))
105 +      ret = stat(fn, &lastchanged);
106 +    else {
107 +      lastchanged.st_mtime = 0;
108 +      ret = 0;
109 +    }
110 +    
111 +    if (data != NULL && !ret && lastchanged.st_mtime <= when->tv_sec)
112 +    {
113 +      p->h = mutt_hcache_restore ((unsigned char *)data, &p->h);
114 +      maildir_parse_flags (p->h, fn);
115 +    } else
116 +#endif
117 +    if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h))
118 +    {
119 +      p->header_parsed = 1;
120 +#if USE_HCACHE
121 +      mutt_hcache_store (hc, p->h->path + 3, p->h, 0, &maildir_hcache_keylen);
122 +#endif
123 +    } else
124 +      mutt_free_header (&p->h);
125 +#if USE_HCACHE
126 +    FREE(&data);
127 +#endif
128 +  }
129 +#if USE_HCACHE
130 +  mutt_hcache_close (hc);
131 +#endif
132 +}
133  
134  /* Read a MH/maildir style mailbox.
135   *
136 @@ -1399,6 +1447,9 @@
137  {
138    char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX];
139    int i, j;
140 +#if USE_HCACHE
141 +  void *hc = NULL;
142 +#endif /* USE_HCACHE */
143  
144    if (ctx->magic == M_MH)
145      i = mh_check_mailbox (ctx, index_hint);
146 @@ -1408,6 +1459,11 @@
147    if (i != 0)
148      return i;
149  
150 +#if USE_HCACHE
151 +  if (ctx->magic == M_MAILDIR)
152 +    hc = mutt_hcache_open(HeaderCache, ctx->path);
153 +#endif /* USE_HCACHE */
154 +
155    for (i = 0; i < ctx->msgcount; i++)
156    {
157      if (ctx->hdrs[i]->deleted
158 @@ -1416,7 +1472,13 @@
159        snprintf (path, sizeof (path), "%s/%s", ctx->path, ctx->hdrs[i]->path);
160        if (ctx->magic == M_MAILDIR
161           || (option (OPTMHPURGE) && ctx->magic == M_MH))
162 +      {
163 +#if USE_HCACHE
164 +        if (ctx->magic == M_MAILDIR)
165 +          mutt_hcache_delete (hc, ctx->hdrs[i]->path + 3, &maildir_hcache_keylen);
166 +#endif /* USE_HCACHE */
167         unlink (path);
168 +      }
169        else if (ctx->magic == M_MH)
170        {
171         /* MH just moves files out of the way when you delete them */
172 @@ -1438,16 +1500,21 @@
173        if (ctx->magic == M_MAILDIR)
174        {
175         if (maildir_sync_message (ctx, i) == -1)
176 -         return -1;
177 +         goto err;
178        }
179        else
180        {
181         if (mh_sync_message (ctx, i) == -1)
182 -         return -1;
183 +         goto err;
184        }
185      }
186    }
187  
188 +#if USE_HCACHE
189 +  if (ctx->magic == M_MAILDIR)
190 +    mutt_hcache_close (hc);
191 +#endif /* USE_HCACHE */
192 +
193    if (ctx->magic == M_MH)
194      mh_update_sequences (ctx);
195  
196 @@ -1468,6 +1535,13 @@
197    }
198  
199    return 0;
200 +
201 +err:
202 +#if USE_HCACHE
203 +  if (ctx->magic == M_MAILDIR)
204 +    mutt_hcache_close (hc);
205 +#endif /* USE_HCACHE */
206 +  return -1;
207  }
208  
209  static char *maildir_canon_filename (char *dest, const char *src, size_t l)
210 diff -Nru a/mutt.h b/mutt.h
211 --- a/mutt.h    2005-01-27 20:54:24 +01:00
212 +++ b/mutt.h    2005-01-28 15:12:54 +01:00
213 @@ -353,6 +353,9 @@
214    OPTFORCENAME,
215    OPTFORWDECODE,
216    OPTFORWQUOTE,
217 +#if USE_HCACHE
218 +  OPTHCACHEVERIFY,
219 +#endif
220    OPTHDRS,
221    OPTHEADER,
222    OPTHELP,