/[LeafOK_CVS]/lbbs/src/section_list.c
ViewVC logotype

Diff of /lbbs/src/section_list.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.7 by sysadm, Thu May 22 06:20:47 2025 UTC Revision 1.10 by sysadm, Fri May 23 00:12:59 2025 UTC
# Line 368  SECTION_LIST *section_list_create(const Line 368  SECTION_LIST *section_list_create(const
368  void section_list_reset_articles(SECTION_LIST *p_section)  void section_list_reset_articles(SECTION_LIST *p_section)
369  {  {
370          p_section->article_count = 0;          p_section->article_count = 0;
371            p_section->topic_count = 0;
372            p_section->visible_article_count = 0;
373            p_section->visible_topic_count = 0;
374          p_section->p_article_head = NULL;          p_section->p_article_head = NULL;
375          p_section->p_article_tail = NULL;          p_section->p_article_tail = NULL;
376    
377          p_section->page_count = 0;          p_section->page_count = 0;
378          p_section->last_page_article_count = 0;          p_section->last_page_visible_article_count = 0;
379  }  }
380    
381  void section_list_cleanup(void)  void section_list_cleanup(void)
# Line 431  int section_list_append_article(SECTION_ Line 434  int section_list_append_article(SECTION_
434                  return -1;                  return -1;
435          }          }
436    
437            if (p_section->article_count >= BBS_article_limit_per_section)
438            {
439                    log_error("section_list_append_article() error: article_count reach limit in section %d\n", p_section->sid);
440                    return -2;
441            }
442    
443          if (p_article_block_pool->block_count == 0 ||          if (p_article_block_pool->block_count == 0 ||
444                  p_article_block_pool->p_block[p_article_block_pool->block_count - 1]->article_count >= ARTICLE_PER_BLOCK)                  p_article_block_pool->p_block[p_article_block_pool->block_count - 1]->article_count >= ARTICLE_PER_BLOCK)
445          {          {
# Line 468  int section_list_append_article(SECTION_ Line 477  int section_list_append_article(SECTION_
477          // Copy article data          // Copy article data
478          *p_article = *p_article_src;          *p_article = *p_article_src;
479    
480            if (p_article->visible)
481            {
482                    p_section->visible_article_count++;
483            }
484    
485          // Link appended article as tail node of topic bi-directional list          // Link appended article as tail node of topic bi-directional list
486          if (p_article->tid != 0)          if (p_article->tid != 0)
487          {          {
# Line 487  int section_list_append_article(SECTION_ Line 501  int section_list_append_article(SECTION_
501          }          }
502          else          else
503          {          {
504                    p_section->topic_count++;
505    
506                    if (p_article->visible)
507                    {
508                            p_section->visible_topic_count++;
509                    }
510    
511                  p_topic_head = p_article;                  p_topic_head = p_article;
512                  p_topic_tail = p_article;                  p_topic_tail = p_article;
513          }          }
# Line 509  int section_list_append_article(SECTION_ Line 530  int section_list_append_article(SECTION_
530          p_section->p_article_tail = p_article;          p_section->p_article_tail = p_article;
531    
532          // Update page          // Update page
533          if (p_section->last_page_article_count % BBS_article_limit_per_page == 0)          if (p_article->visible && p_section->last_page_visible_article_count % BBS_article_limit_per_page == 0)
534          {          {
535                  p_section->p_page_first_article[p_section->page_count] = p_article;                  p_section->p_page_first_article[p_section->page_count] = p_article;
536                  p_section->page_count++;                  p_section->page_count++;
537                  p_section->last_page_article_count = 0;                  p_section->last_page_visible_article_count = 0;
538            }
539    
540            if (p_article->visible)
541            {
542                    p_section->last_page_visible_article_count++;
543          }          }
         p_section->last_page_article_count++;  
544    
545          return 0;          return 0;
546  }  }
# Line 523  int section_list_append_article(SECTION_ Line 548  int section_list_append_article(SECTION_
548  int section_list_set_article_visible(SECTION_LIST *p_section, int32_t aid, int8_t visible)  int section_list_set_article_visible(SECTION_LIST *p_section, int32_t aid, int8_t visible)
549  {  {
550          ARTICLE *p_article;          ARTICLE *p_article;
551            ARTICLE *p_reply;
552            int affected_count = 0;
553    
554          if (p_section == NULL)          if (p_section == NULL)
555          {          {
# Line 541  int section_list_set_article_visible(SEC Line 568  int section_list_set_article_visible(SEC
568                  return 0; // Already set                  return 0; // Already set
569          }          }
570    
571            if (visible == 0) // 1 -> 0
572            {
573                    p_section->visible_article_count--;
574    
575                    if (p_article->tid == 0)
576                    {
577                            p_section->visible_topic_count--;
578    
579                            // Set related visible replies to invisible
580                            for (p_reply = p_article->p_topic_next; p_reply->tid != 0; p_reply = p_reply->p_topic_next)
581                            {
582                                    if (p_reply->tid != aid)
583                                    {
584                                            log_error("Inconsistent tid = %d found in reply %d of topic %d\n", p_reply->tid, p_reply->aid, aid);
585                                            continue;
586                                    }
587    
588                                    if (p_reply->visible == 1)
589                                    {
590                                            p_reply->visible = 0;
591                                            p_section->visible_article_count--;
592                                            affected_count++;
593                                    }
594                            }
595                    }
596            }
597            else // 0 -> 1
598            {
599                    p_section->visible_article_count++;
600    
601                    if (p_article->tid == 0)
602                    {
603                            p_section->visible_topic_count++;
604                    }
605            }
606    
607          p_article->visible = visible;          p_article->visible = visible;
608            affected_count++;
609    
610          // TODO:          return affected_count;
611    }
612    
613    ARTICLE *section_list_find_article_with_offset(SECTION_LIST *p_section, int32_t aid, int32_t *p_page, int32_t *p_offset)
614    {
615            ARTICLE *p_article;
616            int left;
617            int right;
618            int mid;
619    
620            *p_page = -1;
621            *p_offset = -1;
622    
623            if (p_section == NULL)
624            {
625                    log_error("section_list_find_article_with_offset() NULL pointer error\n");
626                    return NULL;
627            }
628    
629            if (p_section->article_count == 0) // empty
630            {
631                    *p_page = 0;
632                    *p_offset = 0;
633                    return NULL;
634            }
635    
636            left = 0;
637            right = p_section->page_count;
638    
639            // aid in the range [ head aid of pages[left], tail aid of pages[right - 1] ]
640            while (left < right - 1)
641            {
642                    // get page id no less than mid value of left page id and right page id
643                    mid = (left + right) / 2 + (right - left) % 2;
644    
645                    if (mid >= p_section->page_count)
646                    {
647                            log_error("page id (mid = %d) is out of boundary\n", mid);
648                            return NULL;
649                    }
650    
651                    if (aid < p_section->p_page_first_article[mid]->aid)
652                    {
653                            right = mid;
654                    }
655                    else
656                    {
657                            left = mid;
658                    }
659            }
660    
661          return 1;          *p_page = left;
662    
663            p_article = p_section->p_page_first_article[*p_page];
664    
665            // p_section->p_page_first_article[*p_page]->aid <= aid < p_section->p_page_first_article[*p_page + 1]->aid
666            right = (*p_page == MAX(1, p_section->page_count) - 1 ? INT32_MAX : p_section->p_page_first_article[*p_page + 1]->aid);
667    
668            // left will be the offset of article found or offset to insert
669            left = 0;
670    
671            while (aid > p_article->aid)
672            {
673                    // aid > p_article->aid
674                    p_article = p_article->p_next;
675                    left++;
676    
677                    // over last article in the page
678                    if (p_article == p_section->p_article_head || p_article->aid >= right)
679                    {
680                            break;
681                    }
682            }
683    
684            if (aid != p_article->aid) // not exist
685            {
686                    p_article = NULL;
687            }
688    
689            *p_offset = left;
690    
691            return p_article;
692    }
693    
694    int section_list_calculate_page(SECTION_LIST *p_section, int32_t start_aid)
695    {
696            ARTICLE *p_article;
697            int32_t page;
698            int32_t offset;
699            int visible_article_count;
700            int page_head_set;
701    
702            if (p_section == NULL)
703            {
704                    log_error("section_list_calculate_page() NULL pointer error\n");
705                    return -1;
706            }
707    
708            p_article = section_list_find_article_with_offset(p_section, start_aid, &page, &offset);
709            if (p_article == NULL)
710            {
711                    if (page < 0)
712                    {
713                            return 0;
714                    }
715    
716                    log_error("section_list_calculate_page() aid = %d not found in section sid = %d\n", start_aid, p_section->sid);
717            }
718    
719            if (offset > 0)
720            {
721                    p_article = p_section->p_page_first_article[page];
722            }
723    
724            visible_article_count = 0;
725            page_head_set = 0;
726    
727            do
728            {
729                    if (!page_head_set && visible_article_count == 0)
730                    {
731                            p_section->p_page_first_article[page] = p_article;
732                            page_head_set = 1;
733                    }
734    
735                    if (p_article->visible)
736                    {
737                            visible_article_count++;
738                    }
739    
740                    p_article = p_article->p_next;
741    
742                    // skip remaining invisible articles
743                    while (p_article->visible == 0 && p_article != p_section->p_article_head)
744                    {
745                            p_article = p_article->p_next;
746                    }
747    
748                    if (visible_article_count >= BBS_article_limit_per_page && p_article != p_section->p_article_head)
749                    {
750                            page++;
751                            visible_article_count = 0;
752                            page_head_set = 0;
753    
754                            if (page >= BBS_article_limit_per_section / BBS_article_limit_per_page && p_article != p_section->p_article_head)
755                            {
756                                    log_error("Count of page exceed limit in section %d\n", p_section->sid);
757                                    break;
758                            }
759                    }
760            } while (p_article != p_section->p_article_head);
761    
762            p_section->page_count = page + (visible_article_count > 0 ? 1 : 0);
763            p_section->last_page_visible_article_count = visible_article_count;
764    
765            return 0;
766  }  }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1