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

Diff of /lbbs/src/section_list_loader.c

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

Revision 1.8 by sysadm, Wed May 28 07:30:23 2025 UTC Revision 1.16 by sysadm, Sat May 31 12:00:00 2025 UTC
# Line 15  Line 15 
15   ***************************************************************************/   ***************************************************************************/
16    
17  #include "section_list_loader.h"  #include "section_list_loader.h"
18    #include "article_cache.h"
19  #include "log.h"  #include "log.h"
20  #include "database.h"  #include "database.h"
21  #include "menu.h"  #include "menu.h"
# Line 158  int load_section_config_from_db(void) Line 159  int load_section_config_from_db(void)
159          return ret;          return ret;
160  }  }
161    
162  int append_articles_from_db(int32_t start_aid, int global_lock)  int append_articles_from_db(int32_t start_aid, int global_lock, int article_count_limit)
163  {  {
164          MYSQL *db;          MYSQL *db;
165          MYSQL_RES *rs;          MYSQL_RES *rs;
# Line 168  int append_articles_from_db(int32_t star Line 169  int append_articles_from_db(int32_t star
169          ARTICLE *p_topic;          ARTICLE *p_topic;
170          SECTION_LIST *p_section = NULL;          SECTION_LIST *p_section = NULL;
171          int32_t last_sid = 0;          int32_t last_sid = 0;
172            char sub_ip[IP_ADDR_LEN];
173            int article_count = 0;
174          int ret = 0;          int ret = 0;
175          int i;          int i;
176    
# Line 179  int append_articles_from_db(int32_t star Line 182  int append_articles_from_db(int32_t star
182          }          }
183    
184          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
185                           "SELECT AID, TID, SID, CID, UID, visible, excerption, ontop, `lock`, "                           "SELECT bbs.AID, TID, SID, bbs.CID, UID, visible, excerption, ontop, `lock`, "
186                           "transship, username, nickname, title, UNIX_TIMESTAMP(sub_dt) AS sub_dt "                           "transship, username, nickname, title, UNIX_TIMESTAMP(sub_dt) AS sub_dt, "
187                           "FROM bbs WHERE AID >= %d ORDER BY AID",                           "sub_ip, bbs_content.content "
188                           start_aid);                           "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "
189                             "WHERE bbs.AID >= %d ORDER BY bbs.AID LIMIT %d",
190                             start_aid, article_count_limit);
191    
192          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
193          {          {
# Line 232  int append_articles_from_db(int32_t star Line 237  int append_articles_from_db(int32_t star
237    
238                  article.sub_dt = atol(row[i++]);                  article.sub_dt = atol(row[i++]);
239    
240                    strncpy(sub_ip, row[i++], sizeof(sub_ip) - 1);
241                    sub_ip[sizeof(sub_ip) - 1] = '\0';
242                    ip_mask(sub_ip, 1, '*');
243    
244                  // release lock of last section if different from current one                  // release lock of last section if different from current one
245                  if (!global_lock && article.sid != last_sid && last_sid != 0)                  if (!global_lock && article.sid != last_sid && last_sid != 0)
246                  {                  {
247                          if ((ret = section_list_rw_unlock(p_section)) < 0)                          if ((ret = section_list_rw_unlock(p_section)) < 0)
248                          {                          {
249                                  log_error("section_list_rw_unlock(sid = %d) error\n", p_section->sid);                                  log_error("section_list_rw_unlock(sid=%d) error\n", p_section->sid);
250                                  break;                                  break;
251                          }                          }
252                  }                  }
# Line 266  int append_articles_from_db(int32_t star Line 275  int append_articles_from_db(int32_t star
275                  {                  {
276                          if ((ret = section_list_rw_lock(p_section)) < 0)                          if ((ret = section_list_rw_lock(p_section)) < 0)
277                          {                          {
278                                  log_error("section_list_rw_lock(sid = 0) error\n");                                  log_error("section_list_rw_lock(sid=0) error\n");
279                                  break;                                  break;
280                          }                          }
281                  }                  }
# Line 276  int append_articles_from_db(int32_t star Line 285  int append_articles_from_db(int32_t star
285    
286                  if (section_list_append_article(p_section, &article) < 0)                  if (section_list_append_article(p_section, &article) < 0)
287                  {                  {
288                          log_error("section_list_append_article(sid = %d, aid = %d) error\n",                          log_error("section_list_append_article(sid=%d, aid=%d) error\n",
289                                            p_section->sid, article.aid);                                            p_section->sid, article.aid);
290                          ret = -3;                          ret = -3;
291                          break;                          break;
292                  }                  }
293    
294                    article_count++;
295    
296                    if (article_cache_generate(VAR_ARTICLE_CACHE_DIR, &article, p_section, row[i++], sub_ip, 0) < 0)
297                    {
298                            log_error("article_cache_generate(aid=%d, cid=%d) error\n", article.aid, article.cid);
299                            ret = -4;
300                            break;
301                    }
302          }          }
303    
304          // release lock of last section          // release lock of last section
# Line 288  int append_articles_from_db(int32_t star Line 306  int append_articles_from_db(int32_t star
306          {          {
307                  if ((ret = section_list_rw_unlock(p_section)) < 0)                  if ((ret = section_list_rw_unlock(p_section)) < 0)
308                  {                  {
309                          log_error("section_list_rw_unlock(sid = %d) error\n", p_section->sid);                          log_error("section_list_rw_unlock(sid=%d) error\n", p_section->sid);
310                  }                  }
311          }          }
312    
# Line 297  int append_articles_from_db(int32_t star Line 315  int append_articles_from_db(int32_t star
315          {          {
316                  if ((ret = section_list_rw_unlock(NULL)) < 0)                  if ((ret = section_list_rw_unlock(NULL)) < 0)
317                  {                  {
318                          log_error("section_list_rw_unlock(sid = 0) error\n");                          log_error("section_list_rw_unlock(sid=0) error\n");
319                  }                  }
320          }          }
321    
# Line 306  cleanup: Line 324  cleanup:
324    
325          mysql_close(db);          mysql_close(db);
326    
327          return ret;          return (ret < 0 ? ret : article_count);
328  }  }
329    
330  int set_last_article_op_log_from_db(void)  int set_last_article_op_log_from_db(void)
# Line 349  int set_last_article_op_log_from_db(void Line 367  int set_last_article_op_log_from_db(void
367          return last_article_op_log_mid;          return last_article_op_log_mid;
368  }  }
369    
370  int apply_article_op_log_from_db(void)  int apply_article_op_log_from_db(int op_count_limit)
371  {  {
372          MYSQL *db;          MYSQL *db;
373          MYSQL_RES *rs, *rs2;          MYSQL_RES *rs, *rs2;
# Line 358  int apply_article_op_log_from_db(void) Line 376  int apply_article_op_log_from_db(void)
376          ARTICLE *p_article;          ARTICLE *p_article;
377          SECTION_LIST *p_section = NULL;          SECTION_LIST *p_section = NULL;
378          SECTION_LIST *p_section_dest;          SECTION_LIST *p_section_dest;
379            char sub_ip[IP_ADDR_LEN];
380          int32_t last_sid = 0;          int32_t last_sid = 0;
381          int32_t sid_dest;          int32_t sid_dest;
382            int op_count = 0;
383          int ret = 0;          int ret = 0;
384    
385          db = db_open();          db = db_open();
# Line 371  int apply_article_op_log_from_db(void) Line 391  int apply_article_op_log_from_db(void)
391    
392          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
393                           "SELECT MID, AID, type FROM bbs_article_op "                           "SELECT MID, AID, type FROM bbs_article_op "
394                           "WHERE MID > %d AND type NOT IN ('A', 'M') ORDER BY MID",                           "WHERE MID > %d AND type NOT IN ('A') "
395                           last_article_op_log_mid);                           "ORDER BY MID LIMIT %d",
396                             last_article_op_log_mid, op_count_limit);
397    
398          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
399          {          {
# Line 451  int apply_article_op_log_from_db(void) Line 472  int apply_article_op_log_from_db(void)
472                          p_article->lock = 0;                          p_article->lock = 0;
473                          break;                          break;
474                  case 'M': // Modify article                  case 'M': // Modify article
475                          log_error("Operation type=M should not be found\n");                          snprintf(sql, sizeof(sql),
476                                             "SELECT bbs.CID, sub_ip, bbs_content.content "
477                                             "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "
478                                             "WHERE bbs.AID = %d",
479                                             p_article->aid);
480    
481                            if (mysql_query(db, sql) != 0)
482                            {
483                                    log_error("Query article error: %s\n", mysql_error(db));
484                                    ret = -3;
485                                    break;
486                            }
487                            if ((rs2 = mysql_use_result(db)) == NULL)
488                            {
489                                    log_error("Get article data failed\n");
490                                    ret = -3;
491                                    break;
492                            }
493                            if ((row2 = mysql_fetch_row(rs2)))
494                            {
495                                    p_article->cid = atoi(row2[0]);
496    
497                                    strncpy(sub_ip, row2[1], sizeof(sub_ip) - 1);
498                                    sub_ip[sizeof(sub_ip) - 1] = '\0';
499                                    ip_mask(sub_ip, 1, '*');
500    
501                                    if (article_cache_generate(VAR_ARTICLE_CACHE_DIR, p_article, p_section, row2[2], sub_ip, 0) < 0)
502                                    {
503                                            log_error("article_cache_generate(aid=%d, cid=%d) error\n", p_article->aid, p_article->cid);
504                                            ret = -4;
505                                    }
506                            }
507                            else
508                            {
509                                    p_article->cid = 0;
510                                    ret = -4;
511                            }
512                            mysql_free_result(rs2);
513                          break;                          break;
514                  case 'T': // Move article                  case 'T': // Move article
515                          snprintf(sql, sizeof(sql),                          snprintf(sql, sizeof(sql),
# Line 536  int apply_article_op_log_from_db(void) Line 594  int apply_article_op_log_from_db(void)
594    
595                  // Update MID with last successfully proceeded article_op_log                  // Update MID with last successfully proceeded article_op_log
596                  last_article_op_log_mid = atoi(row[0]);                  last_article_op_log_mid = atoi(row[0]);
597    
598                    op_count++;
599          }          }
600    
601          // release lock of last section          // release lock of last section
# Line 551  int apply_article_op_log_from_db(void) Line 611  int apply_article_op_log_from_db(void)
611    
612          mysql_close(db);          mysql_close(db);
613    
614          return ret;          return (ret < 0 ? ret : op_count);
615  }  }
616    
617  int section_list_loader_launch(void)  int section_list_loader_launch(void)
# Line 612  int section_list_loader_launch(void) Line 672  int section_list_loader_launch(void)
672                  }                  }
673    
674                  // Load section articles                  // Load section articles
                 last_aid = article_block_last_aid();  
675                  article_count = article_block_article_count();                  article_count = article_block_article_count();
676    
677                  if ((ret = append_articles_from_db(last_aid + 1, 0)) < 0)                  do
678                  {                  {
679                          log_error("append_articles_from_db(%d, 0) error\n", last_aid + 1);                          last_aid = article_block_last_aid();
680    
681                          if (ret == ERR_UNKNOWN_SECTION)                          if ((ret = append_articles_from_db(last_aid + 1, 0, LOAD_ARTICLE_COUNT_LIMIT)) < 0)
682                          {                          {
683                                  SYS_section_list_reload = 1; // Force reload section_list                                  log_error("append_articles_from_db(%d, 0, %d) error\n", last_aid + 1, LOAD_ARTICLE_COUNT_LIMIT);
684    
685                                    if (ret == ERR_UNKNOWN_SECTION)
686                                    {
687                                            SYS_section_list_reload = 1; // Force reload section_list
688                                    }
689                          }                          }
690                  }                  } while (ret == LOAD_ARTICLE_COUNT_LIMIT);
691    
692                  load_count = article_block_article_count() - article_count;                  load_count = article_block_article_count() - article_count;
   
693                  if (load_count > 0)                  if (load_count > 0)
694                  {                  {
695                          log_std("Incrementally load %d articles, last_aid = %d\n", load_count, article_block_last_aid());                          log_std("Incrementally load %d articles, last_aid = %d\n", load_count, article_block_last_aid());
# Line 640  int section_list_loader_launch(void) Line 703  int section_list_loader_launch(void)
703                  // Load article_op log                  // Load article_op log
704                  last_mid = last_article_op_log_mid;                  last_mid = last_article_op_log_mid;
705    
706                  if ((ret = apply_article_op_log_from_db()) < 0)                  do
707                  {                  {
708                          log_error("apply_article_op_log_from_db() error\n");                          if ((ret = apply_article_op_log_from_db(LOAD_ARTICLE_COUNT_LIMIT)) < 0)
   
                         if (ret == ERR_UNKNOWN_SECTION)  
709                          {                          {
710                                  SYS_section_list_reload = 1; // Force reload section_list                                  log_error("apply_article_op_log_from_db() error\n");
711    
712                                    if (ret == ERR_UNKNOWN_SECTION)
713                                    {
714                                            SYS_section_list_reload = 1; // Force reload section_list
715                                    }
716                          }                          }
717                  }                  } while (ret == LOAD_ARTICLE_COUNT_LIMIT);
718    
719                  if (last_article_op_log_mid > last_mid)                  if (last_article_op_log_mid > last_mid)
720                  {                  {
# Line 700  int section_list_loader_reload(void) Line 766  int section_list_loader_reload(void)
766          return 0;          return 0;
767  }  }
768    
769  int query_section_articles(SECTION_LIST *p_section, int32_t page_id, ARTICLE *p_articles[], int32_t *p_article_count)  int query_section_articles(SECTION_LIST *p_section, int page_id, ARTICLE *p_articles[], int *p_article_count, int *p_page_count)
770  {  {
771          ARTICLE *p_article;          ARTICLE *p_article;
772          ARTICLE *p_next_page_first_article;          ARTICLE *p_next_page_first_article;
773          int ret = 0;          int ret = 0;
774    
775          if (p_section == NULL || p_articles == NULL || p_article_count == NULL)          if (p_section == NULL || p_articles == NULL || p_article_count == NULL || p_page_count == NULL)
776          {          {
777                  log_error("query_section_articles() NULL pointer error\n");                  log_error("query_section_articles() NULL pointer error\n");
778                  return -1;                  return -1;
# Line 719  int query_section_articles(SECTION_LIST Line 785  int query_section_articles(SECTION_LIST
785                  return -2;                  return -2;
786          }          }
787    
788          if (page_id < 0 || page_id >= p_section->page_count)          *p_page_count = p_section->page_count;
789    
790            if (p_section->visible_article_count == 0)
791            {
792                    *p_article_count = 0;
793            }
794            else if (page_id < 0 || page_id >= p_section->page_count)
795          {          {
796                  log_error("Invalid page_id=%d, not in range [0, %d)\n", page_id, p_section->page_count);                  log_error("Invalid page_id=%d, not in range [0, %d)\n", page_id, p_section->page_count);
797                  ret = -3;                  ret = -3;
# Line 757  int query_section_articles(SECTION_LIST Line 829  int query_section_articles(SECTION_LIST
829    
830          return ret;          return ret;
831  }  }
832    
833    int locate_article_in_section(SECTION_LIST *p_section, const ARTICLE *p_article_cur, int direction,
834                                                              int *p_page_id, int *p_visible_offset, int *p_article_count)
835    {
836            const ARTICLE *p_article = NULL;
837            ARTICLE *p_tmp;
838            int32_t aid = 0;
839            int page_id;
840            int offset;
841            int ret = 0;
842            int i;
843    
844            if (p_section == NULL || p_article_cur == NULL || p_page_id == NULL || p_visible_offset == NULL || p_article_count == NULL)
845            {
846                    log_error("locate_article_in_section() NULL pointer error\n");
847                    return -1;
848            }
849    
850            // acquire lock of section
851            if ((ret = section_list_rd_lock(p_section)) < 0)
852            {
853                    log_error("section_list_rd_lock(sid = %d) error\n", p_section->sid);
854                    return -2;
855            }
856    
857            if (direction == 0)
858            {
859                    aid = p_article_cur->aid;
860            }
861            else if (direction == 1)
862            {
863                    p_article = p_article_cur;
864                    do
865                    {
866                            p_article = p_article->p_topic_next;
867                    } while (p_article != p_article_cur && p_article->visible == 0);
868    
869                    aid = (p_article->aid > p_article_cur->aid ? p_article->aid : 0);
870            }
871            else if (direction == -1)
872            {
873                    p_article = p_article_cur;
874                    do
875                    {
876                            p_article = p_article->p_topic_prior;
877                    } while (p_article != p_article_cur && p_article->visible == 0);
878    
879                    aid = (p_article->aid < p_article_cur->aid ? p_article->aid : 0);
880            }
881    
882            p_article = NULL;
883    
884            if (aid > 0)
885            {
886                    p_article = section_list_find_article_with_offset(p_section, aid, &page_id, &offset, &p_tmp);
887                    if (p_article != NULL)
888                    {
889                            *p_article_count = (page_id == p_section->page_count - 1 ? p_section->last_page_visible_article_count : BBS_article_limit_per_page);
890    
891                            p_article = p_section->p_page_first_article[page_id];
892                            for (i = 0; i < *p_article_count;)
893                            {
894                                    if (p_article->visible)
895                                    {
896                                            if (p_article->aid == aid)
897                                            {
898                                                    *p_page_id = page_id;
899                                                    *p_visible_offset = i;
900                                                    break;
901                                            }
902                                            i++;
903                                            if (i >= *p_article_count)
904                                            {
905                                                    log_error("Visible article (aid=%d) not found in page %d\n", aid, page_id);
906                                                    p_article = NULL;
907                                            }
908                                    }
909                                    p_article = p_article->p_next;
910                            }
911                    }
912            }
913    
914            // release lock of section
915            if (section_list_rd_unlock(p_section) < 0)
916            {
917                    log_error("section_list_rd_unlock(sid = %d) error\n", p_section->sid);
918                    ret = -2;
919            }
920    
921            return (ret < 0 ? ret : (p_article == NULL ? 0 : 1));
922    }


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

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