/[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.10 by sysadm, Thu May 29 02:21:31 2025 UTC Revision 1.17 by sysadm, Wed Jun 4 13:42:53 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 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;          int article_count = 0;
174          int ret = 0;          int ret = 0;
175          int i;          int i;
# Line 180  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 LIMIT %d",                           "sub_ip, bbs_content.content "
188                             "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);                           start_aid, article_count_limit);
191    
192          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
# Line 190  int append_articles_from_db(int32_t star Line 194  int append_articles_from_db(int32_t star
194                  log_error("Query article list error: %s\n", mysql_error(db));                  log_error("Query article list error: %s\n", mysql_error(db));
195                  return -3;                  return -3;
196          }          }
197          if ((rs = mysql_store_result(db)) == NULL)          if ((rs = mysql_use_result(db)) == NULL)
198          {          {
199                  log_error("Get article list data failed\n");                  log_error("Get article list data failed\n");
200                  return -3;                  return -3;
# Line 233  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 267  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 277  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;
# Line 285  int append_articles_from_db(int32_t star Line 293  int append_articles_from_db(int32_t star
293    
294                  article_count++;                  article_count++;
295    
296                  // TODO: generate content cache                  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 293  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 302  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 363  int apply_article_op_log_from_db(int op_ Line 376  int apply_article_op_log_from_db(int op_
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;          int op_count = 0;
# Line 459  int apply_article_op_log_from_db(int op_ Line 473  int apply_article_op_log_from_db(int op_
473                          break;                          break;
474                  case 'M': // Modify article                  case 'M': // Modify article
475                          snprintf(sql, sizeof(sql),                          snprintf(sql, sizeof(sql),
476                                           "SELECT CID FROM bbs WHERE AID = %d",                                           "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);                                           p_article->aid);
480    
481                          if (mysql_query(db, sql) != 0)                          if (mysql_query(db, sql) != 0)
# Line 468  int apply_article_op_log_from_db(int op_ Line 484  int apply_article_op_log_from_db(int op_
484                                  ret = -3;                                  ret = -3;
485                                  break;                                  break;
486                          }                          }
487                          if ((rs2 = mysql_store_result(db)) == NULL)                          if ((rs2 = mysql_use_result(db)) == NULL)
488                          {                          {
489                                  log_error("Get article data failed\n");                                  log_error("Get article data failed\n");
490                                  ret = -3;                                  ret = -3;
# Line 477  int apply_article_op_log_from_db(int op_ Line 493  int apply_article_op_log_from_db(int op_
493                          if ((row2 = mysql_fetch_row(rs2)))                          if ((row2 = mysql_fetch_row(rs2)))
494                          {                          {
495                                  p_article->cid = atoi(row2[0]);                                  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                          else
508                          {                          {
# Line 484  int apply_article_op_log_from_db(int op_ Line 510  int apply_article_op_log_from_db(int op_
510                                  ret = -4;                                  ret = -4;
511                          }                          }
512                          mysql_free_result(rs2);                          mysql_free_result(rs2);
   
                         if (p_article->cid > 0)  
                         {  
                                 // TODO: generate content cache  
                         }  
   
513                          break;                          break;
514                  case 'T': // Move article                  case 'T': // Move article
515                          snprintf(sql, sizeof(sql),                          snprintf(sql, sizeof(sql),
# Line 616  int section_list_loader_launch(void) Line 636  int section_list_loader_launch(void)
636          {          {
637                  SYS_child_process_count++;                  SYS_child_process_count++;
638                  section_list_loader_pid = pid;                  section_list_loader_pid = pid;
639                  log_std("Section list loader process (%d) start\n", pid);                  log_common("Section list loader process (%d) start\n", pid);
640                  return 0;                  return 0;
641          }          }
642          else if (pid < 0) // Error          else if (pid < 0) // Error
# Line 672  int section_list_loader_launch(void) Line 692  int section_list_loader_launch(void)
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_common("Incrementally load %d articles, last_aid = %d\n", load_count, article_block_last_aid());
696                  }                  }
697    
698                  if (SYS_section_list_reload)                  if (SYS_section_list_reload)
# Line 698  int section_list_loader_launch(void) Line 718  int section_list_loader_launch(void)
718    
719                  if (last_article_op_log_mid > last_mid)                  if (last_article_op_log_mid > last_mid)
720                  {                  {
721                          log_std("Proceeded %d article logs, last_mid = %d\n", last_article_op_log_mid - last_mid, last_article_op_log_mid);                          log_common("Proceeded %d article logs, last_mid = %d\n", last_article_op_log_mid - last_mid, last_article_op_log_mid);
722                  }                  }
723    
724                  if (SYS_section_list_reload)                  if (SYS_section_list_reload)
# Line 719  int section_list_loader_launch(void) Line 739  int section_list_loader_launch(void)
739          detach_article_block_shm();          detach_article_block_shm();
740          detach_trie_dict_shm();          detach_trie_dict_shm();
741    
742          log_std("Section list loader process exit normally\n");          log_common("Section list loader process exit normally\n");
743          log_end();          log_end();
744    
745          section_list_loader_pid = 0;          section_list_loader_pid = 0;
# Line 809  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