]> git.ipfire.org Git - thirdparty/sarg.git/blame - totday.c
Fix the reported year in the extended log
[thirdparty/sarg.git] / totday.c
CommitLineData
25697a35 1/*
94ff9470 2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
61d965f3 3 * 1998, 2012
25697a35
GS
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
1164c474
FM
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
25697a35
GS
9 * ---------------------------------------------------------------------
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
24 *
25 */
26
27#include "include/conf.h"
5f3cfd1d 28#include "include/defs.h"
25697a35 29
026ddd8b
FM
30//! The daily statistics for one user.
31struct DayStruct
25697a35 32{
026ddd8b
FM
33 int ndaylist;
34 int maxindex;
35 int daylist[MAX_DATETIME_DAYS];
36 long long int bytes[MAX_DATETIME_DAYS*24];
37 long long int elap[MAX_DATETIME_DAYS*24];
38};
39
40/*!
41Prepare the object to store the daily statistics of one user.
42
43\return The object to pass to other functions in this module.
44The object must be freed with a call to day_cleanup().
45*/
46DayObject day_prepare(void)
47{
48 DayObject ddata;
49
50 ddata=(DayObject)malloc(sizeof(*ddata));
51 if (!ddata)
52 {
53 debuga(_("Not enough memory to store the daily statistics\n"));
54 exit(EXIT_FAILURE);
55 }
56
57 return(ddata);
58}
25697a35 59
026ddd8b
FM
60/*!
61Free the memory allocated by day_prepare().
62
63\param ddata The object returned by day_prepare().
64*/
65void day_cleanup(DayObject ddata)
66{
67 if (ddata) free(ddata);
68}
69
70/*!
71Prepare the object for a new user.
72
73\param ddata The object created by day_prepare().
74*/
75void day_newuser(DayObject ddata)
76{
77 if (ddata)
78 {
79 ddata->ndaylist=0;
80 ddata->maxindex=0;
81 memset(ddata->bytes,0,sizeof(ddata->bytes));
82 memset(ddata->elap,0,sizeof(ddata->elap));
83 }
84}
85
86/*!
87Store one data point in the statistics.
88
89\param ddata The object to store the statistics.
90\param date The date of the data point formated as day/month/year.
91\param time The time of the data point.
92\param elap The time spent processing the user's request on the proxy.
93\param bytes The number of bytes transfered by the user.
94*/
95void day_addpoint(DayObject ddata,const char *date, const char *time, long long int elap, long long int bytes)
96{
44bdeb60 97 int hour;
9bd92830 98 int day,month,year;
9bd92830
FM
99 int daynum;
100 int dayidx;
101 int i;
120d768c 102
026ddd8b
FM
103 if (sscanf(date,"%d/%d/%d",&day,&month,&year)!=3) {
104 debuga(_("Invalid date \"%s\" for the hourly statistics\n"),date);
9bd92830
FM
105 exit(EXIT_FAILURE);
106 }
026ddd8b
FM
107 if (day<1 || day>31 || month<1 || month>12 || year>9999) {
108 debuga(_("Invalid date component in \"%s\" for the hourly statistics\n"),date);
9bd92830
FM
109 exit(EXIT_FAILURE);
110 }
026ddd8b
FM
111 hour=atoi(time);
112 if (hour<0 || hour>=24) {
113 debuga(_("Invalid hour %d for the hourly statistics\n"),hour);
9bd92830
FM
114 exit(EXIT_FAILURE);
115 }
026ddd8b
FM
116 daynum=(year*10000)+(month*100)+day;
117 for (dayidx=ddata->ndaylist-1 ; dayidx>=0 && daynum!=ddata->daylist[dayidx] ; dayidx--);
118 if (dayidx<0) {
119 dayidx=ddata->ndaylist++;
120 if (dayidx>=sizeof(ddata->daylist)/sizeof(*ddata->daylist)) {
121 debuga(_("Too many different dates for the hourly statistics\n"));
9bd92830
FM
122 exit(EXIT_FAILURE);
123 }
026ddd8b
FM
124 ddata->daylist[dayidx]=daynum;
125 }
126 i=dayidx*24+hour;
127 if (i>=ddata->maxindex) ddata->maxindex=i+1;
128 ddata->bytes[i]+=bytes;
129 ddata->elap[i]+=elap;
130}
131
132/*!
133Store the dayly statistics in the file.
134
135\param ddata The object containing the statistics.
136\param tmp The temporary directory to store the file into.
137\param uinfo The user's data.
138*/
139void day_totalize(DayObject ddata,const char *tmp, const struct userinfostruct *uinfo)
140{
141 FILE *fp_ou;
142 int hour;
143 int day,month,year;
144 int i;
145 int daynum;
146 int dayidx;
147 char arqout[2048];
148
149 if (datetimeby==0) return;
150 if (!ddata) return;
151
152 if (snprintf(arqout,sizeof(arqout),"%s/%s.day",tmp,uinfo->filename)>=sizeof(arqout)) {
153 debuga(_("File name too long: %s/%s%s\n"),tmp,uinfo->filename,".day");
154 exit(EXIT_FAILURE);
9bd92830 155 }
25697a35 156
9bd92830 157 if((fp_ou=fopen(arqout,"w"))==NULL) {
007905af
FM
158 debuga(_("(totday) Cannot open log file %s\n"),arqout);
159 exit(EXIT_FAILURE);
9bd92830 160 }
25697a35 161
026ddd8b
FM
162 for (i=0 ; i<ddata->maxindex ; i++) {
163 if (ddata->bytes[i]==0 && ddata->elap[i]==0) continue;
9bd92830 164 dayidx=i/24;
026ddd8b
FM
165 if (dayidx>=sizeof(ddata->daylist)/sizeof(*ddata->daylist)) {
166 debuga(_("Invalid day index found in the hourly statistics\n"));
44bdeb60
FM
167 exit(EXIT_FAILURE);
168 }
9bd92830 169 hour=i%24;
026ddd8b 170 daynum=ddata->daylist[dayidx];
9bd92830
FM
171 day=daynum%100;
172 month=(daynum/100)%100;
173 year=daynum/10000;
44bdeb60 174 fprintf(fp_ou,"%d/%d/%d\t%d",day,month,year,hour);
026ddd8b
FM
175 if ((datetimeby & DATETIME_BYTE)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)ddata->bytes[i]);
176 if ((datetimeby & DATETIME_ELAP)!=0) fprintf(fp_ou,"\t%"PRIu64"",(uint64_t)ddata->elap[i]);
9bd92830
FM
177 fputs("\n",fp_ou);
178 }
25697a35 179
9bd92830
FM
180 if (fclose(fp_ou)==EOF) {
181 debuga(_("Failed to close file %s - %s\n"),arqout,strerror(errno));
182 exit(EXIT_FAILURE);
183 }
9bd92830 184 return;
25697a35 185}