@@ -90,11 +90,11 @@
90 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** no active tag is found.
91 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
92 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If bCheckParents is true then p's thread parents are checked
93 93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (recursively) for closure, else only p is checked.
94 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int forum_post_is_closed(ForumPost *p, int bCheckParents){
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int forum_post_is_closed(ForumPost *p, int bCheckParents){
96 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !p ) return 0;
97 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pEditTail ) p = p->pEditTail;
98 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->iClosed || !bCheckParents ) return p->iClosed;
99 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else if( p->pIrt ){
100 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return forum_post_is_closed(p->pIrt->pEditTail
@@ -142,10 +142,100 @@
142 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rid ){
143 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = forum_rid_is_closed(rid, 1);
144 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
145 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc>0 ? -rc : rc;
146 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** UNTESTED!
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Closes or re-opens the given forum RID via addition of a new
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** control artifact into the repository.
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If doClose is true then a propagating "closed" tag is added, except
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as noted below, with the given optional zReason string as the tag's
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value. If doClose is false then any active "closed" tag on frid is
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cancelled, except as noted below. zReason is ignored if doClose is
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** false or if zReason is NULL or starts with a NUL byte.
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function only adds a "closed" tag to frid if
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** forum_rid_is_closed() indicates that frid is not closed. If a
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parent post is already closed, no tag is added. Similarly, it will
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only remove a "closed" tag from a post which has its own "closed"
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** tag, and will not remove an inherited one from a parent post.
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If doClose is true and frid is closed (directly or inherited), this
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is a no-op. Likewise, if doClose is false and frid itself is not
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** closed (not accounting for an inherited closed tag), this is a
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no-op.
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns true if it actually creates a new tag, else false. Fails
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fatally on error. If it returns true then any ForumPost::iClosed
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** values from previously loaded posts are invalidated if they refer
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the amended post or a response to it.
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Sidebars:
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - Unless the caller has a transaction open, via
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** db_begin_transaction(), there is a very tiny race condition
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** window during which the caller's idea of whether or not the forum
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** post is closed may differ from the current repository state.
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - This routine assumes that frid really does refer to a forum post.
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - This routine assumes that frid is not private or pending
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** moderation.
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - Closure of a forum post requires a propagating "closed" tag to
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** account for how edits of posts are handled. This differs from
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** closure of a branch, where a non-propagating tag is used.
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*static*/ int forumpost_close(int frid, int doClose, const char *zReason){
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob artifact = BLOB_INITIALIZER; /* Output artifact */
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob cksum = BLOB_INITIALIZER; /* Z-card */
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iClosed; /* true if frid is closed */
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int trid; /* RID of new control artifact */
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_begin_transaction();
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iClosed = forum_rid_is_closed(frid, 1);
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (iClosed && doClose
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Already closed, noting that in the case of (iClosed<0), it's
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** actually a parent which is closed. */)
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (iClosed<=0 && !doClose
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This entry is not closed, but a parent post may be. */) ){
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_end_transaction(0);
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( doClose==0 || (zReason && !zReason[0]) ){
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zReason = 0;
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&artifact, "D %z\n", date_in_standard_format( "now" ));
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&artifact,
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "T %cclosed %z%s%F\n",
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doClose ? '*' : '-', rid_to_uuid(frid),
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zReason ? " " : "", zReason ? zReason : "");
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&artifact, "U %F\n", login_name());
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ md5sum_blob(&artifact, &cksum);
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&artifact, "Z %b\n", &cksum);
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&cksum);
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trid = content_put_ex(&artifact, 0, 0, 0, 0);
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( trid==0 ){
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("Error saving tag artifact: %s", g.zErrMsg);
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( manifest_crosslink(trid, &artifact,
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MC_NONE /*MC_PERMIT_HOOKS?*/)==0 ){
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("%s", g.zErrMsg);
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( blob_is_reset(&artifact) );
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_add_unsent(trid);
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Potential TODO: if (iClosed>0) then we could find the initial tag
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** artifact and content_deltify(thatRid,&trid,1,0). Given the tiny
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** size of these artifacts, however, that would save little space,
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if any. */
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_end_transaction(0);
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
147 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
148 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
149 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If iClosed is true and the current user has admin privileges, this
150 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** renders either a checkbox to unlock forum post fpid (if iClosed>0)
151 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or a SPAN.warning element that the given post inherits the CLOSED
@@ -407,14 +497,18 @@
407 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
408 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("\nDisplay\n");
409 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(p=pThread->pDisplay; p; p=p->pDisplay){
410 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%*s", (p->nIndent-1)*3, "");
411 501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pEditTail ){
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("%d->%d\n", p->fpid, p->pEditTail->fpid);
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%d->%d", p->fpid, p->pEditTail->fpid);
413 503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_print("%d\n", p->fpid);
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%d", p->fpid);
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->iClosed ){
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print(" [closed%s]", p->iClosed<0 ? " via parent" : "");
415 508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("\n");
416 510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
417 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
forumthread_delete(pThread);
418 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
419 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
420 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
421 515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!