# HG changeset patch # User bears # Date 1003584226 -3600 # Node ID 28488e0e3630a39a10da5794e20eb90e0cbc5cd3 # Parent 47569cf4ad4a0947a88a88994a3f71a9a4b219cf [svn] * src/group.h,src/group.c,src/noffle.c,src/server.c: Grp_setLastAccess is only ever called with last param as time(NULL), so remove it and call time() inside the implementation of Grp_setLastAccess. * src/client.c,src/group.h,src/group.c,src/noffle.c,src/post.c: Groups are automatically unsubscribed when the last access to the group is older than a particular threshold. However, for very low traffic groups, the last access may exceed the threshold simply because there has been no new article posted. In this case, rather than unsubscribe, update the group last access time. This means that groups are now only unsubscribed if the last access exceeds the threshold AND articles have arrived in the group since. Add Grp_setLastPostTime() to track the last time an article arrived in the group. diff -r 47569cf4ad4a -r 28488e0e3630 ChangeLog --- a/ChangeLog Fri Oct 05 16:44:22 2001 +0100 +++ b/ChangeLog Sat Oct 20 14:23:46 2001 +0100 @@ -1,3 +1,18 @@ +Sat Oct 20 2001 Jim Hague + +* src/group.h,src/group.c,src/noffle.c,src/server.c: Grp_setLastAccess is + only ever called with last param as time(NULL), so remove it and call + time() inside the implementation of Grp_setLastAccess. +* src/client.c,src/group.h,src/group.c,src/noffle.c,src/post.c: Groups are + automatically unsubscribed when the last access to the group is older + than a particular threshold. However, for very low traffic groups, the + last access may exceed the threshold simply because there has been no new + article posted. In this case, rather than unsubscribe, update the group + last access time. This means that groups are now only unsubscribed if + the last access exceeds the threshold AND articles have arrived in the + group since. Add Grp_setLastPostTime() to track the last time an article + arrived in the group. + Fri Oct 05 2001 Markus Enzenberger * src/configfile.c: fix bug with missing initialization of user name and passwd diff -r 47569cf4ad4a -r 28488e0e3630 src/client.c --- a/src/client.c Fri Oct 05 16:44:22 2001 +0100 +++ b/src/client.c Sat Oct 20 14:23:46 2001 +0100 @@ -1,7 +1,7 @@ /* client.c - $Id: client.c 307 2001-09-12 20:33:44Z bears $ + $Id: client.c 310 2001-10-20 13:23:46Z bears $ */ #if HAVE_CONFIG_H @@ -1029,10 +1029,14 @@ Grp_setRmtNext( client.grp, rmtNumb + 1 ); } if ( oldLast != Cont_last() ) + { Log_inf( "Added %s %lu-%lu", client.grp, oldLast + 1, Cont_last() ); - Log_inf( "%u articles marked for download in %s", cntMarked, client.grp ); - Cont_write(); - Grp_setFirstLast( grp, Cont_first(), Cont_last() ); + Log_inf( "%u articles marked for download in %s", + cntMarked, client.grp ); + Cont_write(); + Grp_setFirstLast( grp, Cont_first(), Cont_last() ); + Grp_setLastPostTime( grp ); + } Lock_closeDatabases(); del_DynStr( response ); del_DynStr( newsgroups ); diff -r 47569cf4ad4a -r 28488e0e3630 src/group.c --- a/src/group.c Fri Oct 05 16:44:22 2001 +0100 +++ b/src/group.c Sat Oct 20 14:23:46 2001 +0100 @@ -7,7 +7,7 @@ loadGrp() and saveGrp(). This is done transparently. Access to the groups database is done by group name, by the functions defined in group.h. - $Id: group.c 300 2001-08-05 08:24:22Z bears $ + $Id: group.c 310 2001-10-20 13:23:46Z bears $ */ #if HAVE_CONFIG_H @@ -42,14 +42,15 @@ Str serv; /* server the group resides on */ Str dsc; /* description of the group */ char postAllow; /* Posting status */ + time_t lastPost; /* Time last article arrived */ GDBM_FILE dbf; -} grp = { "(no grp)", { 0, 0, 0, 0, 0 }, "", "", ' ', NULL }; +} grp = { "(no grp)", { 0, 0, 0, 0, 0 }, "", "", ' ', (time_t) 0, NULL }; /* - Note: postAllow should really go in Entry. But changing Entry would - make backwards group file format capability tricky, so it goes - where it is, and we test the length of the retrieved record to - determine if it exists. + Note: postAllow and lastPost should really go in Entry. But + changing Entry would make backwards group file format capability + tricky, so they go where they are, and we test the length of the + retrieved record to determine if they exist. Someday if we really change the record format this should be tidied up. */ @@ -111,10 +112,24 @@ p += strlen( p ) + 1; Utl_cpyStr( grp.dsc, p ); p += strlen( p) + 1; + + /* + * Extension items. Initialise to default first. + * We default to allowing posting, and the time + * of the last post being a second before the last + * access. + */ + grp.postAllow = 'y'; + grp.lastPost = grp.entry.lastAccess - 1; + if ( p - val.dptr < val.dsize ) + { grp.postAllow = p[ 0 ]; - else - grp.postAllow = 'y'; + p++; + if ( p - val.dptr < val.dsize ) + grp.lastPost = *((time_t *)p); + } + Utl_cpyStr( grp.name, name ); free( val.dptr ); return TRUE; @@ -132,7 +147,9 @@ ASSERT( grp.dbf ); lenServ = strlen( grp.serv ); lenDsc = strlen( grp.dsc ); - bufLen = sizeof( grp.entry ) + lenServ + lenDsc + 2 + sizeof( char ); + bufLen = + sizeof( grp.entry ) + lenServ + lenDsc + 2 + + sizeof( char ) + sizeof( time_t ); buf = malloc( bufLen ); memcpy( buf, (void *)&grp.entry, sizeof( grp.entry ) ); p = (char *)buf + sizeof( grp.entry ); @@ -141,6 +158,8 @@ strcpy( p, grp.dsc ); p += lenDsc + 1; p[ 0 ] = grp.postAllow; + p++; + *((time_t *) p) = grp.lastPost; key.dptr = (void *)grp.name; key.dsize = strlen( grp.name ) + 1; val.dptr = buf; @@ -267,6 +286,14 @@ } +time_t +Grp_lastPostTime( const char *name ) +{ + if ( ! loadGrp( name ) ) + return 0; + return grp.lastPost; +} + /* Replace group's description (only if value != ""). */ void Grp_setDsc( const char *name, const char *value ) @@ -305,11 +332,11 @@ } void -Grp_setLastAccess( const char *name, int value ) +Grp_setLastAccess( const char *name ) { if ( loadGrp( name ) ) { - grp.entry.lastAccess = value; + grp.entry.lastAccess = time( NULL ); saveGrp(); } } @@ -335,6 +362,16 @@ } } +void +Grp_setLastPostTime( const char *name ) +{ + if ( loadGrp( name ) ) + { + grp.lastPost = time( NULL ); + saveGrp(); + } +} + static datum cursor = { NULL, 0 }; Bool diff -r 47569cf4ad4a -r 28488e0e3630 src/group.h --- a/src/group.h Fri Oct 05 16:44:22 2001 +0100 +++ b/src/group.h Sat Oct 20 14:23:46 2001 +0100 @@ -3,7 +3,7 @@ Groups database - $Id: group.h 183 2000-07-25 12:14:54Z bears $ + $Id: group.h 310 2001-10-20 13:23:46Z bears $ */ #ifndef GRP_H @@ -89,6 +89,9 @@ char Grp_postAllow( const char *name ); +time_t +Grp_lastPostTime( const char *name ); + /* Replace group's description (only if value != ""). */ void Grp_setDsc( const char *name, const char *value ); @@ -103,7 +106,7 @@ Grp_setRmtNext( const char *name, int value ); void -Grp_setLastAccess( const char *name, int value ); +Grp_setLastAccess( const char *name ); void Grp_setFirstLast( const char *name, int first, int last ); @@ -111,6 +114,9 @@ void Grp_setPostAllow( const char *name, char postAllow ); +void +Grp_setLastPostTime( const char *name ); + /* Begin iterating trough the names of all groups. Store name of first group (or NULL if there aren't any) in name. Returns whether there are any groups. */ diff -r 47569cf4ad4a -r 28488e0e3630 src/noffle.c --- a/src/noffle.c Fri Oct 05 16:44:22 2001 +0100 +++ b/src/noffle.c Sat Oct 20 14:23:46 2001 +0100 @@ -10,7 +10,7 @@ received for some seconds (to allow multiple clients connect at the same time). - $Id: noffle.c 307 2001-09-12 20:33:44Z bears $ + $Id: noffle.c 310 2001-10-20 13:23:46Z bears $ */ #if HAVE_CONFIG_H @@ -272,12 +272,25 @@ && autoUnsubscribe && difftime( now, Grp_lastAccess( grp ) ) > maxAge ) { - Log_ntc( "Auto-unsubscribing from %s after %d " - "days without access", - grp, autoUnsubscribeDays ); - Pseudo_autoUnsubscribed( grp, autoUnsubscribeDays ); - Fetchlist_remove( grp ); - Grp_setRmtNext( grp, GRP_RMT_NEXT_NOT_SUBSCRIBED ); + /* If there have been recent posts, unsubscribe. */ + if ( difftime( now, Grp_lastPostTime( grp ) ) <= maxAge ) + { + Log_ntc( "Auto-unsubscribing from %s after %d " + "days without access", + grp, autoUnsubscribeDays ); + Pseudo_autoUnsubscribed( grp, autoUnsubscribeDays ); + Fetchlist_remove( grp ); + Grp_setRmtNext( grp, GRP_RMT_NEXT_NOT_SUBSCRIBED ); + } + else + { + /* + * Otherwise if no recent posts touch the access. + * This way we don't unsubscribe to low volume groups + * unread only because there are no recent posts. + */ + Grp_setLastAccess( grp ); + } } Cont_write(); Grp_setFirstLast( grp, Cont_first(), Cont_last() ); @@ -504,7 +517,7 @@ "thread" : "overview" ); if ( ! Fetchlist_write() ) fprintf( stderr, "Could not save fetchlist.\n" ); - Grp_setLastAccess( name, time( NULL ) ); + Grp_setLastAccess( name ); return TRUE; } diff -r 47569cf4ad4a -r 28488e0e3630 src/post.c --- a/src/post.c Fri Oct 05 16:44:22 2001 +0100 +++ b/src/post.c Sat Oct 20 14:23:46 2001 +0100 @@ -1,7 +1,7 @@ /* post.c - $Id: post.c 300 2001-08-05 08:24:22Z bears $ + $Id: post.c 310 2001-10-20 13:23:46Z bears $ */ #if HAVE_CONFIG_H @@ -99,6 +99,7 @@ Cont_write(); Grp_setFirstLast( Cont_grp(), Cont_first(), Cont_last() ); + Grp_setLastPostTime( Cont_grp() ); return TRUE; } diff -r 47569cf4ad4a -r 28488e0e3630 src/server.c --- a/src/server.c Fri Oct 05 16:44:22 2001 +0100 +++ b/src/server.c Sat Oct 20 14:23:46 2001 +0100 @@ -1,7 +1,7 @@ /* server.c - $Id: server.c 307 2001-09-12 20:33:44Z bears $ + $Id: server.c 310 2001-10-20 13:23:46Z bears $ */ #if HAVE_CONFIG_H @@ -128,7 +128,7 @@ { FetchMode mode; - Grp_setLastAccess( server.grp, time( NULL ) ); + Grp_setLastAccess( server.grp ); if ( ! Grp_local ( server.grp ) && ! Online_true() ) { Fetchlist_read(); @@ -1336,7 +1336,7 @@ Ov_date( ov ), Ov_msgId( ov ), Ov_ref( ov ), Ov_bytes( ov ), Ov_lines( ov ) ); putEndOfTxt(); - Grp_setLastAccess( server.grp, time( NULL ) ); + Grp_setLastAccess( server.grp ); return TRUE; }