/[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.11 by sysadm, Thu May 29 09:44:01 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            int article_count = 0;
173          int ret = 0;          int ret = 0;
174          int i;          int i;
175    
# Line 179  int append_articles_from_db(int32_t star Line 181  int append_articles_from_db(int32_t star
181          }          }
182    
183          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
184                           "SELECT AID, TID, SID, CID, UID, visible, excerption, ontop, `lock`, "                           "SELECT bbs.AID, TID, SID, bbs.CID, UID, visible, excerption, ontop, `lock`, "
185                           "transship, username, nickname, title, UNIX_TIMESTAMP(sub_dt) AS sub_dt "                           "transship, username, nickname, title, UNIX_TIMESTAMP(sub_dt) AS sub_dt, "
186                           "FROM bbs WHERE AID >= %d ORDER BY AID",                           "bbs_content.content "
187                           start_aid);                           "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "
188                             "WHERE bbs.AID >= %d ORDER BY bbs.AID LIMIT %d",
189                             start_aid, article_count_limit);
190    
191          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
192          {          {
# Line 237  int append_articles_from_db(int32_t star Line 241  int append_articles_from_db(int32_t star
241                  {                  {
242                          if ((ret = section_list_rw_unlock(p_section)) < 0)                          if ((ret = section_list_rw_unlock(p_section)) < 0)
243                          {                          {
244                                  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);
245                                  break;                                  break;
246                          }                          }
247                  }                  }
# Line 266  int append_articles_from_db(int32_t star Line 270  int append_articles_from_db(int32_t star
270                  {                  {
271                          if ((ret = section_list_rw_lock(p_section)) < 0)                          if ((ret = section_list_rw_lock(p_section)) < 0)
272                          {                          {
273                                  log_error("section_list_rw_lock(sid = 0) error\n");                                  log_error("section_list_rw_lock(sid=0) error\n");
274                                  break;                                  break;
275                          }                          }
276                  }                  }
# Line 276  int append_articles_from_db(int32_t star Line 280  int append_articles_from_db(int32_t star
280    
281                  if (section_list_append_article(p_section, &article) < 0)                  if (section_list_append_article(p_section, &article) < 0)
282                  {                  {
283                          log_error("section_list_append_article(sid = %d, aid = %d) error\n",                          log_error("section_list_append_article(sid=%d, aid=%d) error\n",
284                                            p_section->sid, article.aid);                                            p_section->sid, article.aid);
285                          ret = -3;                          ret = -3;
286                          break;                          break;
287                  }                  }
288    
289                    article_count++;
290    
291                    if (article_cache_generate(VAR_ARTICLE_CACHE_DIR, &article, row[i++]) < 0)
292                    {
293                            log_error("article_cache_generate(aid=%d, cid=%d) error\n", article.aid, article.cid);
294                            ret = -4;
295                            break;
296                    }
297          }          }
298    
299          // release lock of last section          // release lock of last section
# Line 288  int append_articles_from_db(int32_t star Line 301  int append_articles_from_db(int32_t star
301          {          {
302                  if ((ret = section_list_rw_unlock(p_section)) < 0)                  if ((ret = section_list_rw_unlock(p_section)) < 0)
303                  {                  {
304                          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);
305                  }                  }
306          }          }
307    
# Line 297  int append_articles_from_db(int32_t star Line 310  int append_articles_from_db(int32_t star
310          {          {
311                  if ((ret = section_list_rw_unlock(NULL)) < 0)                  if ((ret = section_list_rw_unlock(NULL)) < 0)
312                  {                  {
313                          log_error("section_list_rw_unlock(sid = 0) error\n");                          log_error("section_list_rw_unlock(sid=0) error\n");
314                  }                  }
315          }          }
316    
# Line 306  cleanup: Line 319  cleanup:
319    
320          mysql_close(db);          mysql_close(db);
321    
322          return ret;          return (ret < 0 ? ret : article_count);
323  }  }
324    
325  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 362  int set_last_article_op_log_from_db(void
362          return last_article_op_log_mid;          return last_article_op_log_mid;
363  }  }
364    
365  int apply_article_op_log_from_db(void)  int apply_article_op_log_from_db(int op_count_limit)
366  {  {
367          MYSQL *db;          MYSQL *db;
368          MYSQL_RES *rs, *rs2;          MYSQL_RES *rs, *rs2;
# Line 360  int apply_article_op_log_from_db(void) Line 373  int apply_article_op_log_from_db(void)
373          SECTION_LIST *p_section_dest;          SECTION_LIST *p_section_dest;
374          int32_t last_sid = 0;          int32_t last_sid = 0;
375          int32_t sid_dest;          int32_t sid_dest;
376            int op_count = 0;
377          int ret = 0;          int ret = 0;
378    
379          db = db_open();          db = db_open();
# Line 371  int apply_article_op_log_from_db(void) Line 385  int apply_article_op_log_from_db(void)
385    
386          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
387                           "SELECT MID, AID, type FROM bbs_article_op "                           "SELECT MID, AID, type FROM bbs_article_op "
388                           "WHERE MID > %d AND type NOT IN ('A', 'M') ORDER BY MID",                           "WHERE MID > %d AND type NOT IN ('A') "
389                           last_article_op_log_mid);                           "ORDER BY MID LIMIT %d",
390                             last_article_op_log_mid, op_count_limit);
391    
392          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
393          {          {
# Line 451  int apply_article_op_log_from_db(void) Line 466  int apply_article_op_log_from_db(void)
466                          p_article->lock = 0;                          p_article->lock = 0;
467                          break;                          break;
468                  case 'M': // Modify article                  case 'M': // Modify article
469                          log_error("Operation type=M should not be found\n");                          snprintf(sql, sizeof(sql),
470                                             "SELECT bbs.CID, bbs_content.content "
471                                             "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "
472                                             "WHERE bbs.AID = %d",
473                                             p_article->aid);
474    
475                            if (mysql_query(db, sql) != 0)
476                            {
477                                    log_error("Query article error: %s\n", mysql_error(db));
478                                    ret = -3;
479                                    break;
480                            }
481                            if ((rs2 = mysql_store_result(db)) == NULL)
482                            {
483                                    log_error("Get article data failed\n");
484                                    ret = -3;
485                                    break;
486                            }
487                            if ((row2 = mysql_fetch_row(rs2)))
488                            {
489                                    p_article->cid = atoi(row2[0]);
490    
491                                    if (article_cache_generate(VAR_ARTICLE_CACHE_DIR, p_article, row2[1]) < 0)
492                                    {
493                                            log_error("article_cache_generate(aid=%d, cid=%d) error\n", p_article->aid, p_article->cid);
494                                            ret = -4;
495                                    }
496                            }
497                            else
498                            {
499                                    p_article->cid = 0;
500                                    ret = -4;
501                            }
502                            mysql_free_result(rs2);
503                          break;                          break;
504                  case 'T': // Move article                  case 'T': // Move article
505                          snprintf(sql, sizeof(sql),                          snprintf(sql, sizeof(sql),
# Line 536  int apply_article_op_log_from_db(void) Line 584  int apply_article_op_log_from_db(void)
584    
585                  // Update MID with last successfully proceeded article_op_log                  // Update MID with last successfully proceeded article_op_log
586                  last_article_op_log_mid = atoi(row[0]);                  last_article_op_log_mid = atoi(row[0]);
587    
588                    op_count++;
589          }          }
590    
591          // release lock of last section          // release lock of last section
# Line 551  int apply_article_op_log_from_db(void) Line 601  int apply_article_op_log_from_db(void)
601    
602          mysql_close(db);          mysql_close(db);
603    
604          return ret;          return (ret < 0 ? ret : op_count);
605  }  }
606    
607  int section_list_loader_launch(void)  int section_list_loader_launch(void)
# Line 612  int section_list_loader_launch(void) Line 662  int section_list_loader_launch(void)
662                  }                  }
663    
664                  // Load section articles                  // Load section articles
                 last_aid = article_block_last_aid();  
665                  article_count = article_block_article_count();                  article_count = article_block_article_count();
666    
667                  if ((ret = append_articles_from_db(last_aid + 1, 0)) < 0)                  do
668                  {                  {
669                          log_error("append_articles_from_db(%d, 0) error\n", last_aid + 1);                          last_aid = article_block_last_aid();
670    
671                          if (ret == ERR_UNKNOWN_SECTION)                          if ((ret = append_articles_from_db(last_aid + 1, 0, LOAD_ARTICLE_COUNT_LIMIT)) < 0)
672                          {                          {
673                                  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);
674    
675                                    if (ret == ERR_UNKNOWN_SECTION)
676                                    {
677                                            SYS_section_list_reload = 1; // Force reload section_list
678                                    }
679                          }                          }
680                  }                  } while (ret == LOAD_ARTICLE_COUNT_LIMIT);
681    
682                  load_count = article_block_article_count() - article_count;                  load_count = article_block_article_count() - article_count;
   
683                  if (load_count > 0)                  if (load_count > 0)
684                  {                  {
685                          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 693  int section_list_loader_launch(void)
693                  // Load article_op log                  // Load article_op log
694                  last_mid = last_article_op_log_mid;                  last_mid = last_article_op_log_mid;
695    
696                  if ((ret = apply_article_op_log_from_db()) < 0)                  do
697                  {                  {
698                          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)  
699                          {                          {
700                                  SYS_section_list_reload = 1; // Force reload section_list                                  log_error("apply_article_op_log_from_db() error\n");
701    
702                                    if (ret == ERR_UNKNOWN_SECTION)
703                                    {
704                                            SYS_section_list_reload = 1; // Force reload section_list
705                                    }
706                          }                          }
707                  }                  } while (ret == LOAD_ARTICLE_COUNT_LIMIT);
708    
709                  if (last_article_op_log_mid > last_mid)                  if (last_article_op_log_mid > last_mid)
710                  {                  {
# Line 700  int section_list_loader_reload(void) Line 756  int section_list_loader_reload(void)
756          return 0;          return 0;
757  }  }
758    
759  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)
760  {  {
761          ARTICLE *p_article;          ARTICLE *p_article;
762          ARTICLE *p_next_page_first_article;          ARTICLE *p_next_page_first_article;
763          int ret = 0;          int ret = 0;
764    
765          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)
766          {          {
767                  log_error("query_section_articles() NULL pointer error\n");                  log_error("query_section_articles() NULL pointer error\n");
768                  return -1;                  return -1;
# Line 719  int query_section_articles(SECTION_LIST Line 775  int query_section_articles(SECTION_LIST
775                  return -2;                  return -2;
776          }          }
777    
778          if (page_id < 0 || page_id >= p_section->page_count)          *p_page_count = p_section->page_count;
779    
780            if (p_section->visible_article_count == 0)
781            {
782                    *p_article_count = 0;
783            }
784            else if (page_id < 0 || page_id >= p_section->page_count)
785          {          {
786                  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);
787                  ret = -3;                  ret = -3;


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

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