Mercurial > blahgd > fmt4
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 |
rev | line source |
---|---|
594 | 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 | 3 * |
4 * Permission is hereby granted, free of charge, to any person obtaining a copy | |
5 * of this software and associated documentation files (the "Software"), to deal | |
6 * in the Software without restriction, including without limitation the rights | |
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 * copies of the Software, and to permit persons to whom the Software is | |
9 * furnished to do so, subject to the following conditions: | |
10 * | |
11 * The above copyright notice and this permission notice shall be included in | |
12 * all copies or substantial portions of the Software. | |
13 * | |
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
20 * SOFTWARE. | |
21 */ | |
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 } |