/[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.6 by sysadm, Wed Oct 22 04:48:53 2025 UTC Revision 1.9 by sysadm, Wed Oct 22 07:39:02 2025 UTC
# Line 71  const USER_ACTION_MAP user_action_map[] Line 71  const USER_ACTION_MAP user_action_map[]
71                  {"BBS_NET", "站点穿梭"},                  {"BBS_NET", "站点穿梭"},
72                  {"CHICKEN", "电子小鸡"},                  {"CHICKEN", "电子小鸡"},
73                  {"EDIT_ARTICLE", "修改文章"},                  {"EDIT_ARTICLE", "修改文章"},
74                    {"LOGIN", "进入大厅"},
75                  {"MENU", "菜单选择"},                  {"MENU", "菜单选择"},
76                  {"POST_ARTICLE", "撰写文章"},                  {"POST_ARTICLE", "撰写文章"},
77                  {"REPLY_ARTICLE", "回复文章"},                  {"REPLY_ARTICLE", "回复文章"},
78                  {"USER_LIST", "查花名册"},                  {"USER_LIST", "查花名册"},
79                  {"USER_ONLINE", "环顾四周"},                  {"USER_ONLINE", "环顾四周"},
80                  {"VIEW_ARTICLE", "阅读文章"},                  {"VIEW_ARTICLE", "阅读文章"},
81                  {"VIEW_FILE", "查看文档"}};                  {"VIEW_FILE", "查看文档"},
82                    {"WWW", "Web浏览"}};
83    
84  const int user_action_map_size = 11;  const int user_action_map_size = sizeof(user_action_map) / sizeof(USER_ACTION_MAP);
85    
86  static int user_list_try_rd_lock(int semid, int wait_sec);  static int user_list_try_rd_lock(int semid, int wait_sec);
87  static int user_list_try_rw_lock(int semid, int wait_sec);  static int user_list_try_rw_lock(int semid, int wait_sec);
# Line 91  static int user_list_rw_lock(int semid); Line 93  static int user_list_rw_lock(int semid);
93  static int user_list_load(MYSQL *db, USER_LIST *p_list);  static int user_list_load(MYSQL *db, USER_LIST *p_list);
94  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_list);  static int user_online_list_load(MYSQL *db, USER_ONLINE_LIST *p_list);
95    
96    static int user_info_index_uid_comp(const void *ptr1, const void *ptr2)
97    {
98            const USER_INFO_INDEX_UID *p1 = ptr1;
99            const USER_INFO_INDEX_UID *p2 = ptr2;
100    
101            if (p1->uid < p2->uid)
102            {
103                    return -1;
104            }
105            else if (p1->uid > p2->uid)
106            {
107                    return 1;
108            }
109            return 0;
110    }
111    
112  int user_list_load(MYSQL *db, USER_LIST *p_list)  int user_list_load(MYSQL *db, USER_LIST *p_list)
113  {  {
114          MYSQL_RES *rs = NULL;          MYSQL_RES *rs = NULL;
# Line 110  int user_list_load(MYSQL *db, USER_LIST Line 128  int user_list_load(MYSQL *db, USER_LIST
128                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "                           "UNIX_TIMESTAMP(signup_dt), UNIX_TIMESTAMP(last_login_dt), UNIX_TIMESTAMP(birthday) "
129                           "FROM user_list INNER JOIN user_pubinfo ON user_list.UID = user_pubinfo.UID "                           "FROM user_list INNER JOIN user_pubinfo ON user_list.UID = user_pubinfo.UID "
130                           "INNER JOIN user_reginfo ON user_list.UID = user_reginfo.UID "                           "INNER JOIN user_reginfo ON user_list.UID = user_reginfo.UID "
131                           "WHERE enable ORDER BY UID");                           "WHERE enable ORDER BY username");
132    
133          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
134          {          {
# Line 129  int user_list_load(MYSQL *db, USER_LIST Line 147  int user_list_load(MYSQL *db, USER_LIST
147          i = 0;          i = 0;
148          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
149          {          {
150                    // record
151                    p_list->users[i].id = i;
152                  p_list->users[i].uid = atoi(row[0]);                  p_list->users[i].uid = atoi(row[0]);
153                  strncpy(p_list->users[i].username, row[1], sizeof(p_list->users[i].username) - 1);                  strncpy(p_list->users[i].username, row[1], sizeof(p_list->users[i].username) - 1);
154                  p_list->users[i].username[sizeof(p_list->users[i].username) - 1] = '\0';                  p_list->users[i].username[sizeof(p_list->users[i].username) - 1] = '\0';
# Line 142  int user_list_load(MYSQL *db, USER_LIST Line 162  int user_list_load(MYSQL *db, USER_LIST
162                  p_list->users[i].last_login_dt = (row[8] == NULL ? 0 : atol(row[8]));                  p_list->users[i].last_login_dt = (row[8] == NULL ? 0 : atol(row[8]));
163                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));                  p_list->users[i].birthday = (row[9] == NULL ? 0 : atol(row[9]));
164    
165                    // index
166                    p_list->index_uid[i].uid = p_list->users[i].uid;
167                    p_list->index_uid[i].id = i;
168    
169                  i++;                  i++;
170                  if (i >= BBS_max_user_count)                  if (i >= BBS_max_user_count)
171                  {                  {
# Line 154  int user_list_load(MYSQL *db, USER_LIST Line 178  int user_list_load(MYSQL *db, USER_LIST
178    
179          p_list->user_count = i;          p_list->user_count = i;
180    
181            // Sort index
182            qsort(p_list->index_uid, (size_t)i, sizeof(USER_INFO_INDEX_UID), user_info_index_uid_comp);
183    
184  #ifdef _DEBUG  #ifdef _DEBUG
185          log_error("Loaded %d users\n", p_list->user_count);          log_error("Loaded %d users\n", p_list->user_count);
186  #endif  #endif
# Line 181  int user_online_list_load(MYSQL *db, USE Line 208  int user_online_list_load(MYSQL *db, USE
208          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
209                           "SELECT SID, UID, ip, current_action, UNIX_TIMESTAMP(login_tm), "                           "SELECT SID, UID, ip, current_action, UNIX_TIMESTAMP(login_tm), "
210                           "UNIX_TIMESTAMP(last_tm) FROM user_online "                           "UNIX_TIMESTAMP(last_tm) FROM user_online "
211                           "WHERE last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND) "                           "WHERE last_tm >= SUBDATE(NOW(), INTERVAL %d SECOND) AND UID <> 0 "
212                           "ORDER BY last_tm DESC",                           "ORDER BY last_tm DESC",
213                           BBS_user_off_line);                           BBS_user_off_line);
214    
# Line 202  int user_online_list_load(MYSQL *db, USE Line 229  int user_online_list_load(MYSQL *db, USE
229          i = 0;          i = 0;
230          while ((row = mysql_fetch_row(rs)))          while ((row = mysql_fetch_row(rs)))
231          {          {
232                    p_list->users[i].id = i;
233                  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);
   
234                  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';
235                  if (query_user_info(atoi(row[1]), &(p_list->users[i].user_info)) <= 0)  
236                    if ((ret = query_user_info_by_uid(atoi(row[1]), &(p_list->users[i].user_info))) < 0)
237                  {                  {
238                          log_error("query_user_info(%d) error\n", atoi(row[1]));                          log_error("query_user_info(%d) error\n", atoi(row[1]));
239                          continue;                          continue;
240                  }                  }
241                    else if (ret == 0) // skip Guest
242                    {
243                            continue;
244                    }
245    
246                  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);
247                  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 219  int user_online_list_load(MYSQL *db, USE Line 251  int user_online_list_load(MYSQL *db, USE
251                  p_list->users[i].current_action_title = NULL;                  p_list->users[i].current_action_title = NULL;
252                  if (p_list->users[i].current_action[0] == '\0')                  if (p_list->users[i].current_action[0] == '\0')
253                  {                  {
254                          p_list->users[i].current_action_title = "Web浏览";                          p_list->users[i].current_action_title = "";
255                  }                  }
256                  else if (trie_dict_get(p_trie_action_dict, p_list->users[i].current_action, (int64_t *)(&(p_list->users[i].current_action_title))) < 0)                  else if (trie_dict_get(p_trie_action_dict, p_list->users[i].current_action, (int64_t *)(&(p_list->users[i].current_action_title))) < 0)
257                  {                  {
# Line 747  cleanup: Line 779  cleanup:
779          return ret;          return ret;
780  }  }
781    
782  int query_user_info(int32_t uid, USER_INFO *p_user)  int query_user_info(int32_t id, USER_INFO *p_user)
783    {
784            int ret = 0;
785    
786            if (p_user == NULL)
787            {
788                    log_error("NULL pointer error\n");
789                    return -1;
790            }
791    
792            // acquire lock of user list
793            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
794            {
795                    log_error("user_list_rd_lock() error\n");
796                    return -2;
797            }
798    
799            if (id >= 0 && id < p_user_list_pool->p_current->user_count) // Found
800            {
801                    *p_user = p_user_list_pool->p_current->users[id];
802                    ret = 1;
803            }
804    
805            // release lock of user list
806            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
807            {
808                    log_error("user_list_rd_unlock() error\n");
809                    ret = -1;
810            }
811    
812            return ret;
813    }
814    
815    int query_user_info_by_uid(int32_t uid, USER_INFO *p_user)
816  {  {
817          int left;          int left;
818          int right;          int right;
819          int mid;          int mid;
820            int32_t id;
821          int ret = 0;          int ret = 0;
822    
823          if (p_user == NULL)          if (p_user == NULL)
# Line 773  int query_user_info(int32_t uid, USER_IN Line 839  int query_user_info(int32_t uid, USER_IN
839          while (left < right)          while (left < right)
840          {          {
841                  mid = (left + right) / 2;                  mid = (left + right) / 2;
842                  if (uid < p_user_list_pool->p_current->users[mid].uid)                  if (uid < p_user_list_pool->p_current->index_uid[mid].uid)
843                  {                  {
844                          right = mid;                          right = mid;
845                  }                  }
846                  else if (uid > p_user_list_pool->p_current->users[mid].uid)                  else if (uid > p_user_list_pool->p_current->index_uid[mid].uid)
847                  {                  {
848                          left = mid + 1;                          left = mid + 1;
849                  }                  }
850                  else // if (uid == p_user_list_pool->p_current->users[mid].uid)                  else // if (uid == p_user_list_pool->p_current->index_uid[mid].uid)
851                  {                  {
852                          left = mid;                          left = mid;
853                          break;                          break;
854                  }                  }
855          }          }
856    
857          if (uid == p_user_list_pool->p_current->users[left].uid) // Found          if (uid == p_user_list_pool->p_current->index_uid[left].uid) // Found
858            {
859                    id = p_user_list_pool->p_current->index_uid[left].id;
860                    if ((ret = query_user_info(id, p_user)) <= 0)
861                    {
862                            log_error("query_user_info(id=%d) error: %d\n", id, ret);
863                    }
864                    else
865                    {
866                            ret = 1;
867                    }
868            }
869    
870            // release lock of user list
871            if (user_list_rd_unlock(p_user_list_pool->semid) < 0)
872            {
873                    log_error("user_list_rd_unlock() error\n");
874                    ret = -1;
875            }
876    
877            return ret;
878    }
879    
880    int query_user_online_info(int32_t id, USER_ONLINE_INFO *p_user)
881    {
882            int ret = 0;
883    
884            if (p_user == NULL)
885            {
886                    log_error("NULL pointer error\n");
887                    return -1;
888            }
889    
890            // acquire lock of user list
891            if (user_list_rd_lock(p_user_list_pool->semid) < 0)
892            {
893                    log_error("user_list_rd_lock() error\n");
894                    return -2;
895            }
896    
897            if (id >= 0 && id < p_user_list_pool->p_online_current->user_count) // Found
898          {          {
899                  *p_user = p_user_list_pool->p_current->users[left];                  *p_user = p_user_list_pool->p_online_current->users[id];
900                  ret = 1;                  ret = 1;
901          }          }
902    


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

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