/[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.7 by sysadm, Wed Oct 22 05:50:13 2025 UTC Revision 1.9 by sysadm, Wed Oct 22 07:39:02 2025 UTC
# Line 93  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 112  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 131  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 144  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 156  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 183  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 204  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 ((ret = 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) // Guest                  else if (ret == 0) // skip Guest
242                  {                  {
243                          p_list->users[i].user_info.uid = 0;                          continue;
                         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;  
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);
# Line 764  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 790  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