annotate post.c @ 1125:9293874827bf

post: don't leak parsed tag and cat names Sadly, the recent commit (37044617c35deabfe8337a049d2da635bb14075a) did not fix all the reference leaks surrounding the tag and category name s-expression processing. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 09 Jun 2018 20:06:30 -0400
parents 3f78b97b852d
children 5556e68e971c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
1 /*
1120
3330b6790449 update to new libjeffpc lock API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1087
diff changeset
2 * Copyright (c) 2009-2018 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
594
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
3 *
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
6 * in the Software without restriction, including without limitation the rights
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
9 * furnished to do so, subject to the following conditions:
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
10 *
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
11 * The above copyright notice and this permission notice shall be included in
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
12 * all copies or substantial portions of the Software.
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
13 *
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
20 * SOFTWARE.
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
21 */
96baabdc65fd MIT license
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 584
diff changeset
22
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #include <stdlib.h>
400
ede888dc7eee use system AVL code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 381
diff changeset
24 #include <stddef.h>
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25 #include <stdio.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
26 #include <limits.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27 #include <string.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28 #include <sys/mman.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 #include <sys/types.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30 #include <sys/stat.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 #include <unistd.h>
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
32 #include <fcntl.h>
14
06b2d0a67c4d post: parse post time
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 13
diff changeset
33 #include <time.h>
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
34 #include <dirent.h>
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35
951
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
36 #include <jeffpc/taskq.h>
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
37 #include <jeffpc/error.h>
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
38 #include <jeffpc/io.h>
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
39 #include <jeffpc/mem.h>
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
40
511
21c3406218bf iter: add a simple list_for_each macro
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 510
diff changeset
41 #include "iter.h"
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42 #include "post.h"
212
633e21cb0e36 don't store post array in request structure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 210
diff changeset
43 #include "vars.h"
497
93b02e0f641a scgi daemon can render pages
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 476
diff changeset
44 #include "req.h"
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
45 #include "parse.h"
279
43dae1deee91 use xstrdup wrapper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
46 #include "utils.h"
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
47 #include "file_cache.h"
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
48 #include "debug.h"
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
50 static struct mem_cache *post_cache;
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
51 static struct mem_cache *comment_cache;
599
fea86faff328 post: use libumem for post & comment structs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 598
diff changeset
52
1120
3330b6790449 update to new libjeffpc lock API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1087
diff changeset
53 static LOCK_CLASS(post_lc);
3330b6790449 update to new libjeffpc lock API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1087
diff changeset
54
724
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
55 static void post_remove_all_tags(avl_tree_t *taglist);
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
56 static void post_remove_all_comments(struct post *post);
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
57
717
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
58 static int tag_cmp(const void *va, const void *vb)
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
59 {
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
60 const struct post_tag *a = va;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
61 const struct post_tag *b = vb;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
62 int ret;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
63
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
64 ret = strcasecmp(str_cstr(a->tag), str_cstr(b->tag));
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
65
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
66 if (ret < 0)
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
67 return -1;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
68 if (ret > 0)
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
69 return 1;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
70 return 0;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
71 }
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
72
599
fea86faff328 post: use libumem for post & comment structs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 598
diff changeset
73 void init_post_subsys(void)
fea86faff328 post: use libumem for post & comment structs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 598
diff changeset
74 {
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
75 post_cache = mem_cache_create("post-cache", sizeof(struct post), 0);
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
76 ASSERT(!IS_ERR(post_cache));
599
fea86faff328 post: use libumem for post & comment structs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 598
diff changeset
77
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
78 comment_cache = mem_cache_create("comment-cache",
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
79 sizeof(struct comment), 0);
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
80 ASSERT(!IS_ERR(comment_cache));
602
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
81
685
d5ee8dd8dd39 post index: introduce the post index
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 679
diff changeset
82 init_post_index();
602
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
83 }
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
84
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
85 void revalidate_post(void *arg)
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
86 {
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
87 struct post *post = arg;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
88
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
89 DBG("%s: marking post #%u for refresh", __func__, post->id);
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
90
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
91 post_lock(post, false);
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
92 post->needs_refresh = true;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
93 post_unlock(post);
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
94 }
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
95
1125
9293874827bf post: don't leak parsed tag and cat names
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1124
diff changeset
96 /* consumes the struct val reference */
717
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
97 static void post_add_tags(avl_tree_t *taglist, struct val *list)
608
6aeac44a6085 post: abstract away mangling of post tag list
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 607
diff changeset
98 {
1087
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
99 struct val *tagval;
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
100 struct val *tmp;
660
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
101
1123
37044617c35d post: don't leak tag/cat s-expression values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1120
diff changeset
102 sexpr_for_each_noref(tagval, tmp, list) {
1087
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
103 struct post_tag *tag;
660
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
104 struct str *tagname;
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
105
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
106 /* sanity check */
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
107 ASSERT3U(tagval->type, ==, VT_STR);
608
6aeac44a6085 post: abstract away mangling of post tag list
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 607
diff changeset
108
660
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
109 /* get the tag name */
1087
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
110 tagname = val_getref_str(tagval);
608
6aeac44a6085 post: abstract away mangling of post tag list
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 607
diff changeset
111
660
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
112 tag = malloc(sizeof(struct post_tag));
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
113 ASSERT(tag);
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
114
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
115 tag->tag = tagname;
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
116 ASSERT(tag->tag);
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
117
717
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
118 if (safe_avl_add(taglist, tag)) {
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
119 /* found a duplicate */
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
120 str_putref(tag->tag);
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
121 free(tag);
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
122 }
660
b6b989f4456c post: resume loading tags from metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 659
diff changeset
123 }
1125
9293874827bf post: don't leak parsed tag and cat names
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1124
diff changeset
124
9293874827bf post: don't leak parsed tag and cat names
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1124
diff changeset
125 val_putref(list);
608
6aeac44a6085 post: abstract away mangling of post tag list
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 607
diff changeset
126 }
6aeac44a6085 post: abstract away mangling of post tag list
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 607
diff changeset
127
609
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
128 static void post_remove_all_comments(struct post *post)
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
129 {
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
130 struct comment *com;
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
131
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
132 while ((com = list_remove_head(&post->comments))) {
661
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
133 str_putref(com->author);
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
134 str_putref(com->email);
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
135 str_putref(com->ip);
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
136 str_putref(com->url);
609
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
137 str_putref(com->body);
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
138 mem_cache_free(comment_cache, com);
609
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
139 }
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
140
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
141 post->numcom = 0;
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
142 }
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
143
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
144 static struct str *load_comment(struct post *post, int commid)
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
145 {
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
146 char path[FILENAME_MAX];
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
147 struct str *err_msg;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
148 struct str *out;
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
149
997
ddcbc483bdf6 start using STATIC_STR from libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 996
diff changeset
150 err_msg = STATIC_STR("Error: could not load comment text.");
288
9feab27ad2dc comment text loading error handling
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 286
diff changeset
151
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
152 snprintf(path, FILENAME_MAX, "%s/posts/%d/comments/%d/text.txt",
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
153 str_cstr(config.data_dir), post->id, commid);
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
154
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
155 out = file_cache_get_cb(path, post->preview ? NULL : revalidate_post,
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
156 post);
628
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
157 if (IS_ERR(out))
293
ef0c2676e5a8 introduce a 'read a file' helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 289
diff changeset
158 out = err_msg;
ef0c2676e5a8 introduce a 'read a file' helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 289
diff changeset
159 else
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
160 str_putref(err_msg);
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
161
288
9feab27ad2dc comment text loading error handling
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 286
diff changeset
162 return out;
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
163 }
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
164
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
165 static void post_add_comment(struct post *post, int commid)
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
166 {
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
167 char path[FILENAME_MAX];
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
168 struct comment *comm;
624
88ac4d752d98 post: use the file cache for comment metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 623
diff changeset
169 struct str *meta;
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
170 struct val *lv;
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
171 struct val *v;
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
172
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
173 snprintf(path, FILENAME_MAX, "%s/posts/%d/comments/%d/meta.lisp",
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
174 str_cstr(config.data_dir), post->id, commid);
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
175
624
88ac4d752d98 post: use the file cache for comment metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 623
diff changeset
176 meta = file_cache_get_cb(path, post->preview ? NULL : revalidate_post,
88ac4d752d98 post: use the file cache for comment metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 623
diff changeset
177 post);
628
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
178 ASSERT(!IS_ERR(meta));
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
179
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
180 lv = sexpr_parse_str(meta);
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
181 ASSERT(!IS_ERR(lv));
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
182
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
183 v = sexpr_cdr(sexpr_assoc(lv, "moderated"));
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
184 if (!v || (v->type != VT_BOOL) || !v->b)
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
185 goto done;
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
186
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
187 comm = mem_cache_alloc(comment_cache);
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
188 ASSERT(comm);
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
189
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
190 comm->id = commid;
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
191 comm->author = sexpr_alist_lookup_str(lv, "author");
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
192 comm->email = sexpr_alist_lookup_str(lv, "email");
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
193 comm->time = parse_time_str(sexpr_alist_lookup_str(lv, "time"));
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
194 comm->ip = sexpr_alist_lookup_str(lv, "ip");
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
195 comm->url = sexpr_alist_lookup_str(lv, "url");
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
196 comm->body = load_comment(post, comm->id);
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
197
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
198 if (!comm->author)
997
ddcbc483bdf6 start using STATIC_STR from libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 996
diff changeset
199 comm->author = STATIC_STR("[unknown]");
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
200
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
201 list_insert_tail(&post->comments, comm);
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
202
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
203 post->numcom++;
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
204
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
205 done:
711
a28753d0f699 post: fix bool val leak
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 706
diff changeset
206 val_putref(v);
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
207 val_putref(lv);
624
88ac4d752d98 post: use the file cache for comment metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 623
diff changeset
208 str_putref(meta);
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
209 }
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
210
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
211 static void post_add_comments(struct post *post, struct val *list)
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
212 {
1087
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
213 struct val *val;
5bf62a7209ab post: use sexpr_for_each instead of (poorly) open-coding it
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1077
diff changeset
214 struct val *tmp;
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
215
1124
3f78b97b852d post: don't leak comment s-expression values
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1123
diff changeset
216 sexpr_for_each_noref(val, tmp, list) {
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
217 /* sanity check */
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
218 ASSERT3U(val->type, ==, VT_INT);
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
219
705
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
220 /* add the comment */
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
221 post_add_comment(post, val->i);
60140d62c7ae post: load comments again
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 700
diff changeset
222 }
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
223 }
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
224
679
44ed9e08ee43 post: just pass the string struct to the post format functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 664
diff changeset
225 static int __do_load_post_body_fmt3(struct post *post, const struct str *input)
24
692da6202633 index stub + sorted dir for comments, category names, archive entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
226 {
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
227 struct parser_output x;
314
e39d32abbe90 help identify misbehaving posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 304
diff changeset
228 int ret;
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
229
801
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
230 x.req = NULL;
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
231 x.post = post;
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
232 x.input = str_cstr(input);
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
233 x.len = str_len(input);
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
234 x.pos = 0;
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
235 x.lineno = 0;
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
236 x.table_nesting = 0;
e2b0d9625863 Keep post parsing state outside of the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
237 x.texttt_nesting = 0;
811
0037808ec076 post fmt 3: make {title,published,tag,category} special commands
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 801
diff changeset
238 x.sc_title = NULL;
0037808ec076 post fmt 3: make {title,published,tag,category} special commands
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 801
diff changeset
239 x.sc_pub = NULL;
0037808ec076 post fmt 3: make {title,published,tag,category} special commands
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 801
diff changeset
240 x.sc_tags = NULL;
0037808ec076 post fmt 3: make {title,published,tag,category} special commands
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 801
diff changeset
241 x.sc_cats = NULL;
814
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
242 x.sc_twitter_img = NULL;
327
7d2263c9b2c8 post fmt3: table support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 314
diff changeset
243
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
244 fmt3_lex_init(&x.scanner);
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
245 fmt3_set_extra(&x, x.scanner);
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
246
314
e39d32abbe90 help identify misbehaving posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 304
diff changeset
247 ret = fmt3_parse(&x);
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
248 if (ret)
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
249 panic("failed to parse post id %u", post->id);
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
250
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
251 fmt3_lex_destroy(x.scanner);
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
252
813
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
253 /*
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
254 * Now update struct post based on what we got from the .tex file.
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
255 * The struct is already populated by data from the metadata file.
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
256 * For the simple string values, we merely override whatever was
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
257 * there. For tags and categories we use the union.
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
258 */
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
259
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
260 if (x.sc_title) {
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
261 str_putref(post->title);
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
262 post->title = str_getref(x.sc_title);
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
263 }
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
264
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
265 if (x.sc_pub)
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
266 post->time = parse_time_str(str_getref(x.sc_pub));
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
267
814
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
268 if (x.sc_twitter_img) {
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
269 str_putref(post->twitter_img);
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
270 post->twitter_img = str_getref(x.sc_twitter_img);
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
271 }
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
272
813
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
273 post_add_tags(&post->tags, x.sc_tags);
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
274 post_add_tags(&post->cats, x.sc_cats);
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
275
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
276 str_putref(x.sc_title);
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
277 str_putref(x.sc_pub);
814
2ec4299cf2d6 post fmt 3: Twitter card image support
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 813
diff changeset
278 str_putref(x.sc_twitter_img);
813
ea8f2d1b7162 post: use data from special commands if available
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 811
diff changeset
279
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
280 str_putref(post->body); /* free the previous */
476
5433ddee1753 replace vars code with libnvpair
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 475
diff changeset
281 post->body = x.stroutput;
278
d9301bc8caf8 use custom ASSERT() that syslogs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 270
diff changeset
282 ASSERT(post->body);
24
692da6202633 index stub + sorted dir for comments, category names, archive entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
283
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
284 return 0;
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
285 }
24
692da6202633 index stub + sorted dir for comments, category names, archive entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 23
diff changeset
286
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
287 static int __load_post_body(struct post *post)
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
288 {
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
289 static const char *exts[4] = {
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
290 [3] = "tex",
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
291 };
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
292
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
293 char path[FILENAME_MAX];
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
294 struct str *raw;
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
295 int ret;
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
296
793
6358b7707f87 post: fmt 1 & fmt 2 are gone!
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 792
diff changeset
297 ASSERT3U(post->fmt, ==, 3);
283
6c42bb145fa1 don't SIGSEGV when loading a non-existent post
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
298
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
299 snprintf(path, FILENAME_MAX, "%s/posts/%d/post.%s",
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
300 str_cstr(config.data_dir), post->id, exts[post->fmt]);
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
301
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
302 raw = file_cache_get_cb(path, post->preview ? NULL : revalidate_post,
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
303 post);
628
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
304 if (IS_ERR(raw))
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
305 return PTR_ERR(raw);
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
306
793
6358b7707f87 post: fmt 1 & fmt 2 are gone!
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 792
diff changeset
307 ret = __do_load_post_body_fmt3(post, raw);
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
308
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
309 str_putref(raw);
214
e4d59f6fdc8d cleanup post.c; set up dummy post body reading code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 212
diff changeset
310
217
fbd1728d1b12 wire up fmt3 post parsing
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 216
diff changeset
311 return ret;
15
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
312 }
d2628fb14ec6 story: display comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 14
diff changeset
313
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
314 static void __refresh_published_prop(struct post *post, struct val *lv)
270
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
315 {
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
316 /* update the time */
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
317 post->time = parse_time_str(sexpr_alist_lookup_str(lv, "time"));
270
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
318
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
319 /* update the title */
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
320 post->title = sexpr_alist_lookup_str(lv, "title");
270
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
321
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
322 /* update the format */
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
323 post->fmt = sexpr_alist_lookup_int(lv, "fmt", NULL);
989
54f4f35c180e post index: don't list unlisted posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 974
diff changeset
324
54f4f35c180e post index: don't list unlisted posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 974
diff changeset
325 /* update the listed bool */
54f4f35c180e post index: don't list unlisted posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 974
diff changeset
326 post->listed = sexpr_alist_lookup_bool(lv, "listed", true, NULL);
270
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
327 }
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
328
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
329 static int __refresh_published(struct post *post)
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
330 {
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
331 char path[FILENAME_MAX];
623
5af3e4a85685 post: use the file cache for post metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 617
diff changeset
332 struct str *meta;
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
333 struct val *lv;
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
334
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
335 snprintf(path, FILENAME_MAX, "%s/posts/%d/post.lisp",
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
336 str_cstr(config.data_dir), post->id);
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
337
623
5af3e4a85685 post: use the file cache for post metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 617
diff changeset
338 meta = file_cache_get_cb(path, post->preview ? NULL : revalidate_post,
5af3e4a85685 post: use the file cache for post metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 617
diff changeset
339 post);
628
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
340 if (IS_ERR(meta))
94b285e3de30 file_cache_get* should return ERR_PTR() to indicate cause of failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 625
diff changeset
341 return PTR_ERR(meta);
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
342
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
343 lv = sexpr_parse_str(meta);
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
344 if (IS_ERR(lv)) {
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
345 str_putref(meta);
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
346 return PTR_ERR(lv);
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
347 }
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
348
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
349 __refresh_published_prop(post, lv);
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
350
724
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
351 /* empty out the tags/cats/comments lists */
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
352 post_remove_all_tags(&post->tags);
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
353 post_remove_all_tags(&post->cats);
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
354 post_remove_all_comments(post);
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
355
787a27180b9e post: clear out the tags, cats, and comments on post refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 717
diff changeset
356 /* populate the tags/cats/comments lists */
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
357 post_add_tags(&post->tags, sexpr_alist_lookup_list(lv, "tags"));
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
358 post_add_tags(&post->cats, sexpr_alist_lookup_list(lv, "cats"));
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
359 post_add_comments(post, sexpr_alist_lookup_list(lv, "comments"));
617
9c6ad3deebaf post: read metadata from yaml files instead of sqlite
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 610
diff changeset
360
659
9c0e488f1be0 replace all the yaml code with lisp code
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 655
diff changeset
361 val_putref(lv);
623
5af3e4a85685 post: use the file cache for post metadata
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 617
diff changeset
362 str_putref(meta);
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
363
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
364 return 0;
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
365 }
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
366
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
367 int __refresh(struct post *post)
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
368 {
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
369 int ret;
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
370
661
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
371 str_putref(post->title);
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
372 post->title = NULL;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
373
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
374 if (post->preview) {
997
ddcbc483bdf6 start using STATIC_STR from libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 996
diff changeset
375 post->title = STATIC_STR("PREVIEW");
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
376 post->time = time(NULL);
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
377 post->fmt = 3;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
378 } else {
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
379 ret = __refresh_published(post);
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
380 if (ret)
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
381 return ret;
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
382 }
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
383
610
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
384 if ((ret = __load_post_body(post)))
9f0db0063a6f post: move post struct fill-in code into a separate function
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 609
diff changeset
385 return ret;
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
386
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
387 post->needs_refresh = false;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
388
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
389 return 0;
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
390 }
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
391
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
392 void post_refresh(struct post *post)
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
393 {
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
394 ASSERT0(post->preview);
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
395 ASSERT0(__refresh(post));
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
396 }
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
397
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
398 struct post *load_post(int postid, bool preview)
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
399 {
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
400 struct post *post;
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
401 int err;
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
402
602
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
403 /*
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
404 * If it is *not* a preview, try to get it from the cache.
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
405 */
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
406 if (!preview) {
686
96499bc62406 post: start using the post index code instead of custom tree of all posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 685
diff changeset
407 post = index_lookup_post(postid);
602
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
408 if (post)
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
409 return post;
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
410 }
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
411
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
412 post = mem_cache_alloc(post_cache);
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
413 if (!post) {
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
414 err = -ENOMEM;
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
415 goto err;
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
416 }
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
417
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
418 memset(post, 0, sizeof(struct post));
70
9aa37d4cbcf3 feed: use proper date formats & display last updated date
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 65
diff changeset
419
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
420 post->id = postid;
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
421 post->title = NULL;
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
422 post->body = NULL;
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
423 post->numcom = 0;
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
424 post->preview = preview;
625
30cd099b5cd6 post: posts should be initially marked as needing a refresh
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 624
diff changeset
425 post->needs_refresh = true;
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
426
717
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
427 avl_create(&post->tags, tag_cmp, sizeof(struct post_tag),
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
428 offsetof(struct post_tag, node));
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
429 avl_create(&post->cats, tag_cmp, sizeof(struct post_tag),
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
430 offsetof(struct post_tag, node));
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
431 list_create(&post->comments, sizeof(struct comment),
510
fe2231515a0b convert everything to libcmdutils's list_t interface
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 499
diff changeset
432 offsetof(struct comment, list));
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
433 refcnt_init(&post->refcnt, 1);
1120
3330b6790449 update to new libjeffpc lock API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 1087
diff changeset
434 MXINIT(&post->lock, &post_lc);
597
b2dd77f4c6ab post: we need to end the SQL statement when we don't find the post
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 594
diff changeset
435
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
436 if ((err = __refresh(post)))
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
437 goto err_free;
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
438
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
439 if (!post->preview)
686
96499bc62406 post: start using the post index code instead of custom tree of all posts
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 685
diff changeset
440 ASSERT0(index_insert_post(post));
602
0284e0dba3bb post: keep posts around in memory as a cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 601
diff changeset
441
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
442 return post;
270
fec639cd3c61 load & render comments
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 269
diff changeset
443
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
444 err_free:
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
445 post_destroy(post);
283
6c42bb145fa1 don't SIGSEGV when loading a non-existent post
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
446 err:
996
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
447 cmn_err(CE_ERROR, "Failed to load post id %u: %s", postid,
bd09322d76b7 latest libjeffpc's sexpr_parse() doesn't assert on parsing failure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 989
diff changeset
448 xstrerror(err));
598
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
449 return NULL;
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
450 }
292572d9f03b post: make load_post return the post struct
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 597
diff changeset
451
717
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
452 static void post_remove_all_tags(avl_tree_t *taglist)
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
453 {
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
454 struct post_tag *tag;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
455 void *cookie;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
456
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
457 cookie = NULL;
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
458 while ((tag = avl_destroy_nodes(taglist, &cookie))) {
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
459 str_putref(tag->tag);
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
460 free(tag);
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
461 }
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
462
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
463 avl_create(taglist, tag_cmp, sizeof(struct post_tag),
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
464 offsetof(struct post_tag, node));
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
465 }
2316458777c3 post: tags should be listed in alphabetical order
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
466
601
8728fcec562c post: add a refcount to the post structure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 600
diff changeset
467 void post_destroy(struct post *post)
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
468 {
700
6baa1234d658 post: start keeping track of categories
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 694
diff changeset
469 post_remove_all_tags(&post->tags);
6baa1234d658 post: start keeping track of categories
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 694
diff changeset
470 post_remove_all_tags(&post->cats);
609
08249cd3b094 post: abstract away freeing of comment list entries
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 608
diff changeset
471 post_remove_all_comments(post);
343
5e6afbf844ae post: don't leak tags/comment/post body
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 327
diff changeset
472
661
1504472a274f post: free tag & comment strings via str_putref
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 660
diff changeset
473 str_putref(post->title);
476
5433ddee1753 replace vars code with libnvpair
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 475
diff changeset
474 str_putref(post->body);
599
fea86faff328 post: use libumem for post & comment structs
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 598
diff changeset
475
607
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
476 MXDESTROY(&post->lock);
f5666eb9f701 use FEN to detect changes to files
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 604
diff changeset
477
974
b20d593e802c post: use libjeffpc's slab allocator
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 951
diff changeset
478 mem_cache_free(post_cache, post);
13
76cee581f48b story: work in progress
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
479 }
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
480
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
481 static void __tq_load_post(void *arg)
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
482 {
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
483 int postid = (uintptr_t) arg;
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
484
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
485 /* load the post, but then free it since we don't need it */
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
486 post_putref(load_post(postid, false));
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
487 }
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
488
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
489 int load_all_posts(void)
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
490 {
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
491 const char *data_dir = str_cstr(config.data_dir);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
492 char path[FILENAME_MAX];
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
493 struct stat statbuf;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
494 struct dirent *de;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
495 uint32_t postid;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
496 uint64_t start_ts, end_ts;
798
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
497 unsigned nposts;
951
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
498 struct taskq *tq;
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
499 DIR *dir;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
500 int ret;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
501
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
502 snprintf(path, sizeof(path), "%s/posts", data_dir);
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
503 dir = opendir(path);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
504 if (!dir)
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
505 return -errno;
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
506
951
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
507 tq = taskq_create_fixed("load-all-posts", -1);
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
508 if (IS_ERR(tq)) {
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
509 closedir(dir);
951
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
510 return PTR_ERR(tq);
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
511 }
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
512
798
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
513 nposts = 0;
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
514 start_ts = gettime();
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
515
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
516 while ((de = readdir(dir))) {
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
517 if (!strcmp(de->d_name, ".") ||
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
518 !strcmp(de->d_name, ".."))
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
519 continue;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
520
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
521 ret = str2u32(de->d_name, &postid);
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
522 if (ret) {
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
523 cmn_err(CE_INFO, "skipping '%s/%s' - not a number",
755
f9fffc4cf249 post: print the full path to rejected posts during startup load
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 754
diff changeset
524 data_dir, de->d_name);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
525 continue;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
526 }
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
527
754
01de3d087410 config: use config file for data directory path setting
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 726
diff changeset
528 snprintf(path, FILENAME_MAX, "%s/posts/%u", data_dir, postid);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
529
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
530 /* check that it is a directory */
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
531 ret = xlstat(path, &statbuf);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
532 if (ret) {
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
533 cmn_err(CE_INFO, "skipping '%s' - failed to xlstat: %s",
792
8e67b54f5863 start using libjeffpc
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 790
diff changeset
534 path, xstrerror(ret));
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
535 continue;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
536 }
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
537
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
538 if (!S_ISDIR(statbuf.st_mode)) {
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
539 cmn_err(CE_INFO, "skipping '%s' - not a directory; "
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
540 "mode = %o", path,
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
541 (unsigned int) statbuf.st_mode);
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
542 continue;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
543 }
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
544
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
545 /* load the post asynchronously */
951
d8b647559c53 {helpers,post}: use libjeffpc's taskq implmentation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 814
diff changeset
546 if (taskq_dispatch(tq, __tq_load_post, (void *)(uintptr_t) postid))
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
547 __tq_load_post((void *)(uintptr_t) postid);
798
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
548
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
549 nposts++;
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
550 }
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
551
790
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
552 taskq_wait(tq);
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
553 taskq_destroy(tq);
ac018a9c72ee use a taskq to load posts in parallel
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 789
diff changeset
554
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
555 end_ts = gettime();
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
556
798
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
557 cmn_err(CE_INFO, "Loaded %u posts in %"PRIu64".%09"PRIu64" seconds",
76128b9294ff post: print the number of loaded posts on startup
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 794
diff changeset
558 nposts,
794
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
559 (end_ts - start_ts) / 1000000000UL,
475b1f4551ce Use cmn_err/panic/DBG as much as possible
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 793
diff changeset
560 (end_ts - start_ts) % 1000000000UL);
664
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
561
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
562 closedir(dir);
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
563
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
564 return 0;
2d47128ff5d3 post: support loading all posts into cache
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 663
diff changeset
565 }