/[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.8 by sysadm, Wed Oct 22 07:16:48 2025 UTC Revision 1.12 by sysadm, Wed Oct 22 14:25:15 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    
120  int user_list_load(MYSQL *db, USER_LIST *p_list)  int user_list_load(MYSQL *db, USER_LIST *p_list)
121  {  {
122            USER_INFO_INDEX_UID index_uid[BBS_max_user_count];
123          MYSQL_RES *rs = NULL;          MYSQL_RES *rs = NULL;
124          MYSQL_ROW row;          MYSQL_ROW row;
125          char sql[SQL_BUFFER_LEN];          char sql[SQL_BUFFER_LEN];
126          int ret = 0;          int ret = 0;
127          int i;          int i;
128            int32_t last_uid = -1;
129    
130          if (db == NULL || p_list == NULL)          if (db == NULL || p_list == NULL)
131          {          {
# Line 123  int user_list_load(MYSQL *db, USER_LIST Line 133  int user_list_load(MYSQL *db, USER_LIST
133                  return -1;                  return -1;
134          }          }
135    
136            if (p_list->user_count > 0)
137            {
138                    last_uid = p_list->users[p_list->user_count - 1].uid;
139            }
140    
141          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
142                           "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, "
143                           "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 163  int user_list_load(MYSQL *db, USER_LIST Line 178  int user_list_load(MYSQL *db, USER_LIST
178                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));
179    
180                  // index                  // index
181                  p_list->index_uid[i].uid = p_list->users[i].uid;                  index_uid[i].uid = p_list->users[i].uid;
182                  p_list->index_uid[i].id = i;                  index_uid[i].id = i;
183    
184                  i++;                  i++;
185                  if (i >= BBS_max_user_count)                  if (i >= BBS_max_user_count)
# Line 176  int user_list_load(MYSQL *db, USER_LIST Line 191  int user_list_load(MYSQL *db, USER_LIST
191          mysql_free_result(rs);          mysql_free_result(rs);
192          rs = NULL;          rs = NULL;
193    
         p_list->user_count = i;  
   
194          // Sort index          // Sort index
195          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
196            {
197                    qsort(index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
198                    memcpy(p_list->index_uid, index_uid, sizeof(USER_INFO_INDEX_UID) * (size_t)i);
199    
200    #ifdef _DEBUG
201                    log_error("Rebuild index of %d users, last_uid=%d\n", i, p_list->users[i - 1].uid);
202    #endif
203            }
204    
205            p_list->user_count = i;
206    
207  #ifdef _DEBUG  #ifdef _DEBUG
208          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d users\n", p_list->user_count);
# Line 208  int user_online_list_load(MYSQL *db, USE Line 231  int user_online_list_load(MYSQL *db, USE
231          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
232                           "SELECT SID, UID, ip, current_action, UNIX_TIMESTAMP(login_tm), "                           "SELECT SID, UID, ip, current_action, UNIX_TIMESTAMP(login_tm), "
233                           "UNIX_TIMESTAMP(last_tm) FROM user_online "                           "UNIX_TIMESTAMP(last_tm) FROM user_online "
234                           "WHERE last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND) "                           "WHERE last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND) AND UID <> 0 "
235                           "ORDER BY last_tm DESC",                           "ORDER BY last_tm DESC",
236                           BBS_user_off_line);                           BBS_user_off_line);
237    
# Line 233  int user_online_list_load(MYSQL *db, USE Line 256  int user_online_list_load(MYSQL *db, USE
256                  strncpy(p_list->users[i].session_id, row[0], sizeof(p_list->users[i].session_id) - 1);                  strncpy(p_list->users[i].session_id, row[0], sizeof(p_list->users[i].session_id) - 1);
257                  p_list->users[i].session_id[sizeof(p_list->users[i].session_id) - 1] = '\0';                  p_list->users[i].session_id[sizeof(p_list->users[i].session_id) - 1] = '\0';
258    
259                  if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) < 0)                  if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) <= 0)
260                  {                  {
261                          log_error("query_user_info(%d) error\n", atoi(row[1]));                          log_error("query_user_info_by_uid(%d) error\n", atoi(row[1]));
262                          continue;                          continue;
263                  }                  }
                 else if (ret == 0) // Guest  
                 {  
                         p_list->users[i].user_info.id = -1;  
                         p_list->users[i].user_info.uid = 0;  
                         strncpy(p_list->users[i].user_info.username, "guest", sizeof(p_list->users[i].user_info.username) - 1);  
                         p_list->users[i].user_info.username[sizeof(p_list->users[i].user_info.username) - 1] = '\0';  
                         strncpy(p_list->users[i].user_info.nickname, "Guest", sizeof(p_list->users[i].user_info.nickname) - 1);  
                         p_list->users[i].user_info.nickname[sizeof(p_list->users[i].user_info.nickname) - 1] = '\0';  
                         p_list->users[i].user_info.gender = 'M';  
                         p_list->users[i].user_info.gender_pub = 0;  
                         p_list->users[i].user_info.life = 150;  
                         p_list->users[i].user_info.exp = 0;  
                         p_list->users[i].user_info.signup_dt = 0;  
                         p_list->users[i].user_info.last_login_dt = 0;  
                         p_list->users[i].user_info.birthday = 0;  
                 }  
264    
265                  strncpy(p_list->users[i].ip, row[2], sizeof(p_list->users[i].ip) - 1);                  strncpy(p_list->users[i].ip, row[2], sizeof(p_list->users[i].ip) - 1);
266                  p_list->users[i].ip[sizeof(p_list->users[i].ip) - 1] = '\0';                  p_list->users[i].ip[sizeof(p_list->users[i].ip) - 1] = '\0';
# Line 275  int user_online_list_load(MYSQL *db, USE Line 282  int user_online_list_load(MYSQL *db, USE
282                  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]));
283                  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]));
284    
285                    // index
286                    p_list->index_uid[i].uid = p_list->users[i].user_info.uid;
287                    p_list->index_uid[i].id = i;
288    
289                  i++;                  i++;
290                  if (i >= BBS_max_user_online_count)                  if (i >= BBS_max_user_online_count)
291                  {                  {
# Line 285  int user_online_list_load(MYSQL *db, USE Line 296  int user_online_list_load(MYSQL *db, USE
296          mysql_free_result(rs);          mysql_free_result(rs);
297          rs = NULL;          rs = NULL;
298    
299            // Sort index
300            if (i > 0)
301            {
302                    qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
303    #ifdef _DEBUG
304                    log_error("Rebuild index of %d online users\n", i);
305    #endif
306            }
307    
308          p_list->user_count = i;          p_list->user_count = i;
309    
310  #ifdef _DEBUG  #ifdef _DEBUG
311          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d online users\n", p_list->user_count);
312  #endif  #endif
313    
314  cleanup:  cleanup:
# Line 470  int user_list_pool_reload(int online_use Line 490  int user_list_pool_reload(int online_use
490          MYSQL *db = NULL;          MYSQL *db = NULL;
491          USER_LIST *p_tmp;          USER_LIST *p_tmp;
492          USER_ONLINE_LIST *p_online_tmp;          USER_ONLINE_LIST *p_online_tmp;
493            int ret = 0;
494    
495          if (p_user_list_pool == NULL)          if (p_user_list_pool == NULL)
496          {          {
# Line 489  int user_list_pool_reload(int online_use Line 510  int user_list_pool_reload(int online_use
510                  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)
511                  {                  {
512                          log_error("user_online_list_load() error\n");                          log_error("user_online_list_load() error\n");
513                          return -2;                          ret = -2;
514                            goto cleanup;
515                  }                  }
516          }          }
517          else          else
# Line 497  int user_list_pool_reload(int online_use Line 519  int user_list_pool_reload(int online_use
519                  if (user_list_load(db, p_user_list_pool->p_new) < 0)                  if (user_list_load(db, p_user_list_pool->p_new) < 0)
520                  {                  {
521                          log_error("user_list_load() error\n");                          log_error("user_list_load() error\n");
522                          return -2;                          ret = -2;
523                            goto cleanup;
524                  }                  }
525          }          }
526    
527          mysql_close(db);          mysql_close(db);
528            db = NULL;
529    
530          if (user_list_rw_lock(p_user_list_pool->semid) < 0)          if (user_list_rw_lock(p_user_list_pool->semid) < 0)
531          {          {
532                  log_error("user_list_rw_lock() error\n");                  log_error("user_list_rw_lock() error\n");
533                  return -3;                  ret = -3;
534                    goto cleanup;
535          }          }
536    
537          if (online_user)          if (online_user)
# Line 527  int user_list_pool_reload(int online_use Line 552  int user_list_pool_reload(int online_use
552          if (user_list_rw_unlock(p_user_list_pool->semid) < 0)          if (user_list_rw_unlock(p_user_list_pool->semid) < 0)
553          {          {
554                  log_error("user_list_rw_unlock() error\n");                  log_error("user_list_rw_unlock() error\n");
555                  return -3;                  ret = -3;
556                    goto cleanup;
557          }          }
558    
559          return 0;  cleanup:
560            mysql_close(db);
561    
562            return ret;
563  }  }
564    
565  int user_list_try_rd_lock(int semid, int wait_sec)  int user_list_try_rd_lock(int semid, int wait_sec)
# Line 695  int query_user_list(int page_id, USER_IN Line 724  int query_user_list(int page_id, USER_IN
724                  return -1;                  return -1;
725          }          }
726    
727            *p_user_count = 0;
728            *p_page_count = 0;
729    
730          // acquire lock of user list          // acquire lock of user list
731          if (user_list_rd_lock(p_user_list_pool->semid) < 0)          if (user_list_rd_lock(p_user_list_pool->semid) < 0)
732          {          {
# Line 748  int query_user_online_list(int page_id, Line 780  int query_user_online_list(int page_id,
780                  return -1;                  return -1;
781          }          }
782    
783            *p_user_count = 0;
784            *p_page_count = 0;
785    
786          // acquire lock of user list          // acquire lock of user list
787          if (user_list_rd_lock(p_user_list_pool->semid) < 0)          if (user_list_rd_lock(p_user_list_pool->semid) < 0)
788          {          {
# Line 845  int query_user_info_by_uid(int32_t uid, Line 880  int query_user_info_by_uid(int32_t uid,
880                  return -2;                  return -2;
881          }          }
882    
883            if (p_user_list_pool->p_current->index_uid[0].uid != 1)
884            {
885                    log_error("Incorrect index\n");
886            }
887    
888          left = 0;          left = 0;
889          right = p_user_list_pool->p_current->user_count - 1;          right = p_user_list_pool->p_current->user_count - 1;
890    
# Line 869  int query_user_info_by_uid(int32_t uid, Line 909  int query_user_info_by_uid(int32_t uid,
909          if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found          if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found
910          {          {
911                  id = p_user_list_pool->p_current->index_uid[left].id;                  id = p_user_list_pool->p_current->index_uid[left].id;
912                  if ((ret = query_user_info(id, p_user)) <= 0)                  *p_user = p_user_list_pool->p_current->users[id];
913                  {                  ret = 1;
                         log_error("query_user_info(id=%d) error: %d\n", id, ret);  
                 }  
                 else  
                 {  
                         ret = 1;  
                 }  
914          }          }
915    
916          // release lock of user list          // release lock of user list
# Line 913  int query_user_online_info(int32_t id, U Line 947  int query_user_online_info(int32_t id, U
947          }          }
948    
949          // release lock of user list          // release lock of user list
950            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
951            {
952                    log_error("user_list_rd_unlock() error\n");
953                    ret = -1;
954            }
955    
956            return ret;
957    }
958    
959    int query_user_online_info_by_uid(int32_t uid, USER_ONLINE_INFO *p_users, int *p_user_cnt, int start_id)
960    {
961            int left;
962            int right;
963            int mid;
964            int32_t id;
965            int ret = 0;
966            int i;
967    
968            if (p_users == NULL || p_user_cnt == NULL)
969            {
970                    log_error("NULL pointer error\n");
971                    return -1;
972            }
973    
974            // acquire lock of user list
975            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
976            {
977                    log_error("user_list_rd_lock() error\n");
978                    return -2;
979            }
980    
981            left = start_id;
982            right = p_user_list_pool->p_online_current->user_count - 1;
983    
984            while (left < right)
985            {
986                    mid = (left + right) / 2;
987                    if (uid < p_user_list_pool->p_online_current->index_uid[mid].uid)
988                    {
989                            right = mid;
990                    }
991                    else if (uid > p_user_list_pool->p_online_current->index_uid[mid].uid)
992                    {
993                            left = mid + 1;
994                    }
995                    else // if (uid == p_user_list_pool->p_online_current->index_uid[mid].uid)
996                    {
997                            left = mid;
998                            break;
999                    }
1000            }
1001    
1002            if (uid == p_user_list_pool->p_online_current->index_uid[left].uid)
1003            {
1004                    right = left;
1005                    left = start_id;
1006    
1007                    while (left < right)
1008                    {
1009                            mid = (left + right) / 2;
1010                            if (uid - 1 < p_user_list_pool->p_online_current->index_uid[mid].uid)
1011                            {
1012                                    right = mid;
1013                            }
1014                            else // if (uid - 1 >= p_user_list_pool->p_online_current->index_uid[mid].uid)
1015                            {
1016                                    left = mid + 1;
1017                            }
1018                    }
1019    
1020                    for (id = left, i = 0;
1021                             id < p_user_list_pool->p_online_current->user_count && i < *p_user_cnt &&
1022                             uid == p_user_list_pool->p_online_current->index_uid[id].uid;
1023                             id++, i++)
1024                    {
1025                            p_users[i] = p_user_list_pool->p_online_current->users[id];
1026                            log_error("Debug: i=%d id=%d users[i].id=%d\n", i, id, p_users[i].id);
1027                    }
1028    
1029                    if (i > 0)
1030                    {
1031                            *p_user_cnt = i;
1032                            ret = 1;
1033                    }
1034            }
1035    
1036            // release lock of user list
1037          if (user_list_rd_unlock(p_user_list_pool->semid) < 0)          if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
1038          {          {
1039                  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