Diff
Not logged in

Differences From Artifact [837951be05]:

To Artifact [e4b9310a41]:


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
30
31
32
33
34
35
36

37
38
39
40
41
42
43







-







/*
** Each instance of the following object represents a single message -
** either the initial post, an edit to a post, a reply, or an edit to
** a reply.
*/
struct ForumEntry {
  int fpid;              /* rid for this entry */
  int mfirt;             /* Root in-reply-to */
  int sid;               /* Serial ID number */
  char *zUuid;           /* Artifact hash */
  ForumEntry *pIrt;      /* This entry replies to pIrt */
  ForumEntry *pEditHead; /* Original, unedited entry */
  ForumEntry *pEditTail; /* Most recent edit for this entry */
  ForumEntry *pEditNext; /* This entry is edited by pEditNext */
  ForumEntry *pEditPrev; /* This entry is an edit of pEditPrev */
127
128
129
130
131
132
133

134
135
136
137
138
139
140
141










142
143
144
145
146
147
148
126
127
128
129
130
131
132
133
134







135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151







+

-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+







*/
static void forumthread_display_order(
  ForumThread *pThread,    /* The complete thread */
  ForumEntry *pBase        /* Add replies to this entry */
){
  ForumEntry *p;
  ForumEntry *pPrev = 0;
  ForumEntry *pBaseIrt;
  for(p=pBase->pNext; p; p=p->pNext){
    if( !p->pEditPrev && p->mfirt==pBase->fpid ){
      if( pPrev ){
        pPrev->nIndent = pBase->nIndent + 1;
        forumentry_add_to_display(pThread, pPrev);
        forumthread_display_order(pThread, pPrev);
      }
      pPrev = p;
    if( !p->pEditPrev && p->pIrt ){
      pBaseIrt = p->pIrt->pEditHead ? p->pIrt->pEditHead : p->pIrt;
      if( pBaseIrt==pBase ){
        if( pPrev ){
          pPrev->nIndent = pBase->nIndent + 1;
          forumentry_add_to_display(pThread, pPrev);
          forumthread_display_order(pThread, pPrev);
        }
        pPrev = p;
      }
    }
  }
  if( pPrev ){
    pPrev->nIndent = pBase->nIndent + 1;
    if( pPrev->nIndent>pThread->mxIndent ) pThread->mxIndent = pPrev->nIndent;
    forumentry_add_to_display(pThread, pPrev);
    forumthread_display_order(pThread, pPrev);
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

203
204
205
206
207
208
209
210
211
212
213
214
173
174
175
176
177
178
179

180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

198
199
200
201


202
203




204
205
206
207
208
209
210







-


















-




-
-
+

-
-
-
-







  while( db_step(&q)==SQLITE_ROW ){
    pEntry = fossil_malloc( sizeof(*pEntry) );
    memset(pEntry, 0, sizeof(*pEntry));
    pEntry->fpid = db_column_int(&q, 0);
    firt = db_column_int(&q, 1);
    fprev = db_column_int(&q, 2);
    pEntry->zUuid = fossil_strdup(db_column_text(&q,3));
    pEntry->mfirt = firt;
    pEntry->sid = sid++;
    pEntry->pPrev = pThread->pLast;
    pEntry->pNext = 0;
    if( pThread->pLast==0 ){
      pThread->pFirst = pEntry;
    }else{
      pThread->pLast->pNext = pEntry;
    }
    if( firt ){
      pEntry->pIrt = pThread->pFirst;
      for(p=pThread->pFirst; p; p=p->pNext){
        if( p->fpid==firt ){
          pEntry->pIrt = p;
          break;
        }
      }
    }
    if( fprev ){
      ForumEntry *pBase = 0;
      p = forumentry_backward(pEntry->pPrev, fprev);
      p->pEditNext = pEntry;
      pEntry->pEditPrev = p;
      pEntry->pEditHead = p->pEditHead ? p->pEditHead : p;
      while( p ){
        pBase = p;
      for(; p; p=p->pEditPrev ){
        p->pEditTail = pEntry;
        p = p->pEditPrev;
      }
      for(p=pEntry->pNext; p; p=p->pNext){
        if( p->mfirt==pEntry->fpid ) p->mfirt = pBase->fpid;
      }
    }
    pThread->pLast = pEntry;
  }
  db_finalize(&q);

  if( computeHierarchy ){
289
290
291
292
293
294
295
296

297
298

299
300
301
302
303
304
305
306
307
308
285
286
287
288
289
290
291

292
293

294
295
296

297
298
299
300
301
302
303







-
+

-
+


-







  fossil_print("fpid  = %d\n", fpid);
  fossil_print("froot = %d\n", froot);
  pThread = forumthread_create(froot, 1);
  fossil_print("Chronological:\n");
  fossil_print(
/* 0         1         2         3         4         5         6         7    */
/*  123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 */
  " sid      fpid      pIrt pEditPrev     mfirt pEditTail hash\n");
  " sid      fpid      pIrt pEditPrev pEditTail hash\n");
  for(p=pThread->pFirst; p; p=p->pNext){
    fossil_print("%4d %9d %9d %9d %9d %9d %8.8s\n", p->sid,
    fossil_print("%4d %9d %9d %9d %9d %8.8s\n", p->sid,
       p->fpid, p->pIrt ? p->pIrt->fpid : 0,
       p->pEditPrev ? p->pEditPrev->fpid : 0,
       p->mfirt,
       p->pEditTail ? p->pEditTail->fpid : 0, p->zUuid);
  }
  fossil_print("\nDisplay\n");
  for(p=pThread->pDisplay; p; p=p->pDisplay){
    fossil_print("%*s", (p->nIndent-1)*3, "");
    if( p->pEditTail ){
      fossil_print("%d->%d\n", p->fpid, p->pEditTail->fpid);
511
512
513
514
515
516
517
518

519
520
521
522
523
524
525
526
527
528
529
530
506
507
508
509
510
511
512

513
514
515
516
517

518
519
520
521
522
523
524







-
+




-








  /* Undocumented "threadtable" query parameter causes thread table
  ** to be displayed for debugging purposes.
  */
  if( PB("threadtable") ){
    @ <hr>
    @ <table border="1" cellpadding="3" cellspacing="0">
    @ <tr><th>sid<th>fpid<th>pIrt<th>mfirt<th>pEditHead<th>pEditTail\
    @ <tr><th>sid<th>fpid<th>pIrt<th>pEditHead<th>pEditTail\
    @ <th>pEditNext<th>pEditPrev<th>hash
    for(p=pThread->pFirst; p; p=p->pNext){
      @ <tr><td>%d(p->sid)<td>%d(p->fpid)\
      @ <td>%d(p->pIrt?p->pIrt->fpid:0)\
      @ <td>%d(p->mfirt)\
      @ <td>%d(p->pEditHead?p->pEditHead->fpid:0)\
      @ <td>%d(p->pEditTail?p->pEditTail->fpid:0)\
      @ <td>%d(p->pEditNext?p->pEditNext->fpid:0)\
      @ <td>%d(p->pEditPrev?p->pEditPrev->fpid:0)\
      @ <td>%S(p->zUuid)</tr>
    }
    @ </table>