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

Diff of /lbbs/src/user_list.c

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

Revision 1.9 by sysadm, Wed Oct 22 07:39:02 2025 UTC Revision 1.11 by sysadm, Wed Oct 22 11:48:04 2025 UTC
# Line 106  static int user_info_index_uid_comp(cons Line 106  static int user_info_index_uid_comp(cons
106          {          {
107                  return 1;                  return 1;
108          }          }
109            else if (p1->id < p2->id)
110            {
111                    return -1;
112            }
113            else if (p1->id > p2->id)
114            {
115                    return 1;
116            }
117          return 0;          return 0;
118  }  }
119    
# Line 116  int user_list_load(MYSQL *db, USER_LIST Line 124  int user_list_load(MYSQL *db, USER_LIST
124          char sql[SQL_BUFFER_LEN];          char sql[SQL_BUFFER_LEN];
125          int ret = 0;          int ret = 0;
126          int i;          int i;
127            int32_t last_uid = -1;
128    
129          if (db == NULL || p_list == NULL)          if (db == NULL || p_list == NULL)
130          {          {
# Line 123  int user_list_load(MYSQL *db, USER_LIST Line 132  int user_list_load(MYSQL *db, USER_LIST
132                  return -1;                  return -1;
133          }          }
134    
135            if (p_list->user_count > 0)
136            {
137                    last_uid = p_list->users[p_list->user_count - 1].uid;
138            }
139    
140          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
141                           "SELECT user_list.UID AS UID, username, nickname, gender, gender_pub, life, exp, "                           "SELECT user_list.UID AS UID, username, nickname, gender, gender_pub, life, exp, "
142                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "
# Line 176  int user_list_load(MYSQL *db, USER_LIST Line 190  int user_list_load(MYSQL *db, USER_LIST
190          mysql_free_result(rs);          mysql_free_result(rs);
191          rs = NULL;          rs = NULL;
192    
         p_list->user_count = i;  
   
193          // Sort index          // Sort index
194          qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);          if (i != p_list->user_count || p_list->users[i - 1].uid != last_uid) // Count of users changed
195            {
196                    qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
197    #ifdef _DEBUG
198                    log_error("Rebuild index of %d users, last_uid=%d\n", i, p_list->users[i - 1].uid);
199    #endif
200            }
201    
202            p_list->user_count = i;
203    
204  #ifdef _DEBUG  #ifdef _DEBUG
205          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d users\n", p_list->user_count);
# Line 263  int user_online_list_load(MYSQL *db, USE Line 283  int user_online_list_load(MYSQL *db, USE
283                  p_list->users[i].login_tm = (row[4] == NULL ? 0 : atol(row[4]));                  p_list->users[i].login_tm = (row[4] == NULL ? 0 : atol(row[4]));
284                  p_list->users[i].last_tm = (row[5] == NULL ? 0 : atol(row[5]));                  p_list->users[i].last_tm = (row[5] == NULL ? 0 : atol(row[5]));
285    
286                    // index
287                    p_list->index_uid[i].uid = p_list->users[i].user_info.uid;
288                    p_list->index_uid[i].id = i;
289    
290                  i++;                  i++;
291                  if (i >= BBS_max_user_online_count)                  if (i >= BBS_max_user_online_count)
292                  {                  {
# Line 273  int user_online_list_load(MYSQL *db, USE Line 297  int user_online_list_load(MYSQL *db, USE
297          mysql_free_result(rs);          mysql_free_result(rs);
298          rs = NULL;          rs = NULL;
299    
300            // Sort index
301            if (i > 0)
302            {
303                    qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
304    #ifdef _DEBUG
305                    log_error("Rebuild index of %d online users\n", i);
306    #endif
307            }
308    
309          p_list->user_count = i;          p_list->user_count = i;
310    
311  #ifdef _DEBUG  #ifdef _DEBUG
312          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d online users\n", p_list->user_count);
313  #endif  #endif
314    
315  cleanup:  cleanup:
# Line 458  int user_list_pool_reload(int online_use Line 491  int user_list_pool_reload(int online_use
491          MYSQL *db = NULL;          MYSQL *db = NULL;
492          USER_LIST *p_tmp;          USER_LIST *p_tmp;
493          USER_ONLINE_LIST *p_online_tmp;          USER_ONLINE_LIST *p_online_tmp;
494            int ret = 0;
495    
496          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
497          {          {
# Line 477  int user_list_pool_reload(int online_use Line 511  int user_list_pool_reload(int online_use
511                  if (user_online_list_load(db, p_user_list_pool->p_online_new) < 0)                  if (user_online_list_load(db, p_user_list_pool->p_online_new) < 0)
512                  {                  {
513                          log_error("user_online_list_load() error\n");                          log_error("user_online_list_load() error\n");
514                          return -2;                          ret = -2;
515                            goto cleanup;
516                    }
517    
518                    // No online user, no need to swap lists
519                    if (p_user_list_pool->p_online_current->user_count == 0 && p_user_list_pool->p_online_new->user_count == 0)
520                    {
521                            goto cleanup;
522                  }                  }
523          }          }
524          else          else
# Line 485  int user_list_pool_reload(int online_use Line 526  int user_list_pool_reload(int online_use
526                  if (user_list_load(db, p_user_list_pool->p_new) < 0)                  if (user_list_load(db, p_user_list_pool->p_new) < 0)
527                  {                  {
528                          log_error("user_list_load() error\n");                          log_error("user_list_load() error\n");
529                          return -2;                          ret = -2;
530                            goto cleanup;
531                  }                  }
532          }          }
533    
534          mysql_close(db);          mysql_close(db);
535            db = NULL;
536    
537          if (user_list_rw_lock(p_user_list_pool->semid) < 0)          if (user_list_rw_lock(p_user_list_pool->semid) < 0)
538          {          {
539                  log_error("user_list_rw_lock() error\n");                  log_error("user_list_rw_lock() error\n");
540                  return -3;                  ret = -3;
541                    goto cleanup;
542          }          }
543    
544          if (online_user)          if (online_user)
# Line 515  int user_list_pool_reload(int online_use Line 559  int user_list_pool_reload(int online_use
559          if (user_list_rw_unlock(p_user_list_pool->semid) < 0)          if (user_list_rw_unlock(p_user_list_pool->semid) < 0)
560          {          {
561                  log_error("user_list_rw_unlock() error\n");                  log_error("user_list_rw_unlock() error\n");
562                  return -3;                  ret = -3;
563                    goto cleanup;
564          }          }
565    
566          return 0;  cleanup:
567            mysql_close(db);
568    
569            return ret;
570  }  }
571    
572  int user_list_try_rd_lock(int semid, int wait_sec)  int user_list_try_rd_lock(int semid, int wait_sec)
# Line 901  int query_user_online_info(int32_t id, U Line 949  int query_user_online_info(int32_t id, U
949          }          }
950    
951          // release lock of user list          // release lock of user list
952            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
953            {
954                    log_error("user_list_rd_unlock() error\n");
955                    ret = -1;
956            }
957    
958            return ret;
959    }
960    
961    int query_user_online_info_by_uid(int32_t uid, USER_ONLINE_INFO *p_users, int *p_user_cnt, int start_id)
962    {
963            int left;
964            int right;
965            int mid;
966            int32_t id;
967            int ret = 0;
968            int i;
969    
970            if (p_users == NULL || p_user_cnt == NULL)
971            {
972                    log_error("NULL pointer error\n");
973                    return -1;
974            }
975    
976            // acquire lock of user list
977            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
978            {
979                    log_error("user_list_rd_lock() error\n");
980                    return -2;
981            }
982    
983            left = start_id;
984            right = p_user_list_pool->p_online_current->user_count - 1;
985    
986            while (left < right)
987            {
988                    mid = (left + right) / 2;
989                    if (uid < p_user_list_pool->p_online_current->index_uid[mid].uid)
990                    {
991                            right = mid;
992                    }
993                    else if (uid > p_user_list_pool->p_online_current->index_uid[mid].uid)
994                    {
995                            left = mid + 1;
996                    }
997                    else // if (uid == p_user_list_pool->p_online_current->index_uid[mid].uid)
998                    {
999                            left = mid;
1000                            break;
1001                    }
1002            }
1003    
1004            if (uid == p_user_list_pool->p_online_current->index_uid[left].uid)
1005            {
1006                    right = left;
1007                    left = start_id;
1008    
1009                    while (left < right)
1010                    {
1011                            mid = (left + right) / 2;
1012                            if (uid - 1 < p_user_list_pool->p_online_current->index_uid[mid].uid)
1013                            {
1014                                    right = mid;
1015                            }
1016                            else // if (uid - 1 >= p_user_list_pool->p_online_current->index_uid[mid].uid)
1017                            {
1018                                    left = mid + 1;
1019                            }
1020                    }
1021    
1022                    for (id = left, i = 0;
1023                             id < p_user_list_pool->p_online_current->user_count && i < *p_user_cnt &&
1024                             uid == p_user_list_pool->p_online_current->index_uid[id].uid;
1025                             id++, i++)
1026                    {
1027                            if ((ret = query_user_online_info(id, &(p_users[i]))) <= 0)
1028                            {
1029                                    log_error("query_user_info(id=%d) error: %d\n", id, ret);
1030                                    ret = -3;
1031                                    break;
1032                            }
1033                    }
1034    
1035                    if (ret > 0 && i > 0)
1036                    {
1037                            *p_user_cnt = i;
1038                            ret = 1;
1039                    }
1040            }
1041    
1042            // release lock of user list
1043          if (user_list_rd_unlock(p_user_list_pool->semid) < 0)          if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
1044          {          {
1045                  log_error("user_list_rd_unlock() error\n");                  log_error("user_list_rd_unlock() error\n");


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

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