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

Annotation of /lbbs/src/user_stat.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (hide annotations)
Tue Nov 4 14:58:56 2025 UTC (4 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.4: +1 -1 lines
Content type: text/x-csrc
Refine file header information comments

1 sysadm 1.4 /* SPDX-License-Identifier: GPL-3.0-or-later */
2     /*
3     * user_stat
4     * - data model and basic operations of user related statistics
5     *
6 sysadm 1.5 * Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com>
7 sysadm 1.4 */
8 sysadm 1.1
9     #include "log.h"
10     #include "section_list.h"
11     #include "user_list.h"
12     #include "user_stat.h"
13    
14     int user_stat_map_init(USER_STAT_MAP *p_map)
15     {
16     if (p_map == NULL)
17     {
18     log_error("NULL pointer error\n");
19     return -1;
20     }
21    
22     p_map->user_count = 0;
23     p_map->last_uid = -1;
24     p_map->last_article_index = -1;
25    
26     return 0;
27     }
28    
29     int user_stat_map_update(USER_STAT_MAP *p_map)
30     {
31     int32_t uid_list[BBS_max_user_count];
32     int user_cnt = BBS_max_user_count;
33     int article_cnt;
34     int i;
35     ARTICLE *p_article;
36    
37     if (p_map == NULL)
38     {
39     log_error("NULL pointer error\n");
40     return -1;
41     }
42    
43     // Load uid_list
44     if (get_user_id_list(uid_list, &user_cnt, p_map->last_uid + 1) < 0)
45     {
46     log_error("get_user_id_list(%d, 0) error\n", user_cnt);
47     return -2;
48     }
49    
50     for (i = 0; i < user_cnt && p_map->user_count + i < BBS_max_user_count; i++)
51     {
52     p_map->stat_list[p_map->user_count + i].uid = uid_list[i];
53     p_map->stat_list[p_map->user_count + i].article_count = 0;
54     }
55    
56     p_map->user_count += i;
57     p_map->last_uid = uid_list[i - 1];
58    
59     // Scan articles
60     article_cnt = article_block_article_count();
61     for (i = p_map->last_article_index + 1; i < article_cnt; i++)
62     {
63     p_article = article_block_find_by_index(i);
64     if (p_article == NULL)
65     {
66     log_error("article_block_find_by_index(index=%d) error\n", i);
67     break;
68     }
69 sysadm 1.4
70 sysadm 1.2 if (p_article->visible == 0)
71     {
72     continue;
73     }
74 sysadm 1.1
75     if (p_article->uid > p_map->last_uid)
76     {
77     #ifdef _DEBUG
78 sysadm 1.2 log_error("uid=%d of article(aid=%d) is greater than last_uid=%d\n",
79 sysadm 1.1 p_article->uid, p_article->aid, p_map->last_uid);
80     #endif
81 sysadm 1.2 continue;
82 sysadm 1.1 }
83    
84     if (user_stat_article_cnt_inc(p_map, p_article->uid, 1) < 0)
85     {
86     log_error("user_stat_article_cnt_inc(uid=%d, 1) error\n", p_article->uid);
87     break;
88     }
89     }
90    
91     p_map->last_article_index = i - 1;
92    
93     return 0;
94     }
95    
96     int user_stat_article_cnt_inc(USER_STAT_MAP *p_map, int32_t uid, int n)
97     {
98     int left;
99     int right;
100     int mid;
101    
102     if (p_map == NULL)
103     {
104     log_error("NULL pointer error\n");
105     return -1;
106     }
107    
108     left = 0;
109     right = p_map->user_count - 1;
110    
111     while (left < right)
112     {
113     mid = (left + right) / 2;
114     if (uid < p_map->stat_list[mid].uid)
115     {
116 sysadm 1.3 right = mid - 1;
117 sysadm 1.1 }
118     else if (uid > p_map->stat_list[mid].uid)
119     {
120     left = mid + 1;
121     }
122     else // if (uid == p_map->stat_list[mid].uid)
123     {
124     left = mid;
125     break;
126     }
127     }
128    
129     if (uid == p_map->stat_list[left].uid) // found
130     {
131     p_map->stat_list[left].article_count += n;
132     return 1;
133     }
134    
135     return 0; // not found
136     }
137    
138     int user_stat_get(USER_STAT_MAP *p_map, int32_t uid, const USER_STAT **pp_stat)
139     {
140     int left;
141     int right;
142     int mid;
143    
144     if (p_map == NULL)
145     {
146     log_error("NULL pointer error\n");
147     return -1;
148     }
149    
150     left = 0;
151     right = p_map->user_count - 1;
152    
153     while (left < right)
154     {
155     mid = (left + right) / 2;
156     if (uid < p_map->stat_list[mid].uid)
157     {
158 sysadm 1.3 right = mid - 1;
159 sysadm 1.1 }
160     else if (uid > p_map->stat_list[mid].uid)
161     {
162     left = mid + 1;
163     }
164     else // if (uid == p_map->stat_list[mid].uid)
165     {
166     left = mid;
167     break;
168     }
169     }
170    
171     if (uid == p_map->stat_list[left].uid) // found
172     {
173     *pp_stat = &(p_map->stat_list[left]);
174     return 1;
175     }
176    
177     // not found
178     *pp_stat = NULL;
179     return 0;
180     }

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