text-garb.c 2.52 KB
Newer Older
Per Cederqvist's avatar
Per Cederqvist committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * This file contains the functions that deletes old texts.
 *
 * Author: Per Cederqvist.
 */

#include <time.h>
#include <kom-types.h>
#include "cache.h"
#include "log.h"
#include "internal-services.h"
#include "lyskomd.h"
#include <debug.h>


/*
 * Delete old texts.
 *
 * Return value is TRUE if there is nothing more to do right now,
 * FALSE if this function should be called again as soon as the
 * server has some time over.
 */

Bool
garb_text(void)
{
    static Text_no last_checked = 0;
    static time_t  last_start = NO_TIME;
    static long	   deleted_texts = 0;
    BUGDECL;

    Text_stat	  *text_s;
    Misc_info 	  *misc;
    u_short 	   nmisc;
    double	   age;			/* How many seconds is this text? */
    double	   limit = 24 * 3600;
                    
    if ( last_checked == 0 )
    {
	if ( last_start != NO_TIME
	    && difftime(time(NULL), last_start) < GARB_INTERVAL * 60 )
	{
	    return TRUE;
	}
	
	log("MSG: garb started.\n");
	time( &last_start );
    }
    
    last_checked = traverse_text( last_checked );

    if ( last_checked == 0 )
    {
	log("MSG: garb ready. %lu texts deleted.\n", (u_long)deleted_texts);
	return FALSE;
    }
    
    if ( (text_s = cached_get_text_stat( last_checked )) == NULL )
    {
	log("ERROR: garb_text(): Can't get text-stat.\n");
	return FALSE;
    }

    age = difftime( time(NULL), text_s->creation_time );
    
    if ( text_s->no_of_marks > 0 || age < 24 * 3600 )
    {
	return FALSE;
    }

    for (nmisc = text_s->no_of_misc, misc = text_s->misc_items;
	 nmisc > 0;
	 --nmisc, ++misc )
    {
	switch ( misc->type )
	{
	case recpt:
78
79
80
81
82
83
84
85
	    if ( cached_conf_exists( misc->datum.recipient ) )
	    {
		limit = (24 * 3600 *
			 cached_get_garb_nice( misc->datum.recipient ));
		if ( age < limit )	
		    return FALSE;
	    }

Per Cederqvist's avatar
Per Cederqvist committed
86
87
88
	    break;

	case cc_recpt:
89
90
91
92
93
94
95
	    if ( cached_conf_exists( misc->datum.cc_recipient ))
	    {
		limit = ( 24 * 3600
			 * cached_get_garb_nice( misc->datum.cc_recipient ));
		if ( age < limit )
		    return FALSE;
	    }
Per Cederqvist's avatar
Per Cederqvist committed
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

	    break;

	case comm_to:
	case comm_in:
	case footn_to:
	case footn_in:
	    limit = 24 * 3600;
	    break;
	    
	case loc_no:
	case rec_time:
	case sent_by:
	    break;
	    
	case sent_at:
	    if ( difftime ( time(NULL), misc->datum.sent_at )
		< limit )
	    {
		return FALSE;
	    }
	    		
	    break;

#ifndef COMPILE_CHECKS
	default:
	    restart_kom("garb_text(): Illegal misc-item.\n");
#endif
	}
    }

    VBUG(("garb_text: deleting %d\n", last_checked));
    do_delete_text ( last_checked, text_s );
    deleted_texts++;
    return FALSE;
}