[NeoStats-Devel] [Commits] r34 - trunk

[email protected]
Newsgroups gmane.comp.neostats.devel
Message-ID <[email protected]>
Author: DNB
Date: Fri Jun 10 12:10:17 2005
New Revision: 34

Modified:
   trunk/ChangeLog
   trunk/seen.c
   trunk/seenserv.c
   trunk/seenserv.h
Log:
remove records based on age if they are displayed by a request
more optimising of limit and expiry checks
add timer for removing records based on age

Modified: trunk/ChangeLog
==============================================================================
--- trunk/ChangeLog	(original)
+++ trunk/ChangeLog	Fri Jun 10 12:10:17 2005
@@ -2,6 +2,9 @@
 Fish (F), Mark (M), DeadNotBuried (D)
 ==============================================================================
 3.0.a3-dev
+ - remove records based on age if they are displayed by a request (D)
+ - more optimising of limit and expiry checks (D)
+ - add timer for removing records based on age (D)
  - have Pseudo client join/part Channel when Seen Channel Enabled/Disabled (D)
  - remove verbose setting (D)
  - add segfault and debug reporting (D)

Modified: trunk/seen.c
==============================================================================
--- trunk/seen.c	(original)
+++ trunk/seen.c	Fri Jun 10 12:10:17 2005
@@ -52,42 +52,28 @@
 
 /*
  *  Removes SeenData for nickname if exists
+ *
+ * returns NS_SUCCESS if nick removed or NS_FAILURE if nick not in list
 */
-void removepreviousnick(char *nick)
+int removepreviousnick(char *nick)
 {
 	lnode_t *ln;
 	SeenData *sd;
 
-/*		for some reason this bit segfaults, so commented out for now
-		and manually searching for previous entries on the list
-		(it's not just the DBADelete)
-
-	ln = lnode_find( seenlist, nick, findnick );
-	if (!ln)
-		return;
-	sd = lnode_get(ln);
-	 * DBADelete( "seendata", sd->nick);
-	ns_free(sd);
-	list_delete(seenlist, ln);
-	lnode_destroy(ln);
-*/
 	ln = list_first( seenlist );
 	while ( ln )
 	{
 		sd = lnode_get( ln );
 		if (!ircstrcasecmp(nick, sd->nick)) 
 		{
-			/* commented out the delete due to segfaults
-			 *
-			 *  DBADelete( "seendata", sd->nick);
-			 */
 			ns_free( sd );
 			list_delete( seenlist, ln );
 			lnode_destroy( ln );
-			ln = list_last( seenlist );
+			return NS_SUCCESS;
 		}
 		ln = list_next( seenlist, ln );
 	}
+	return NS_FAILURE;
 }
 
 /*
@@ -96,8 +82,9 @@
 void addseenentry(char *nick, char *host, char *vhost, char *message, int type)
 {
 	SeenData *sd;
+	int nickremoved;
 	
-	removepreviousnick(nick);
+	nickremoved = removepreviousnick(nick);
 	sd = ns_calloc(sizeof(SeenData));
 	strlcpy(sd->nick, nick, MAXNICK);
 	strlcpy(sd->userhost, host, USERHOSTLEN);
@@ -107,13 +94,16 @@
 	sd->seentime = me.now;
 	lnode_create_append( seenlist, sd );
 	DBAStore( "seendata", sd->nick,( void * )sd, sizeof( SeenData ) );
-	checkseenlistlimit();
+	/* only check list limit if the nick wasn't already in the list */
+	if( nickremoved == NS_FAILURE )
+		checkseenlistlimit(SS_LISTLIMIT_COUNT);
+	return;
 }
 
 /*
  *  Removes SeenData if records past max entries setting
 */
-void checkseenlistlimit(void)
+void checkseenlistlimit(int checktype)
 {
 	int currentlistcount;
 	int maxageallowed;
@@ -124,7 +114,7 @@
 	maxageallowed = me.now - ( SeenServ.expiretime * TS_ONE_DAY );
 	ln = list_first( seenlist );
 	sd = lnode_get( ln );
-	while( ( currentlistcount > SeenServ.maxentries ) || ( SeenServ.expiretime > 0 && ( maxageallowed > sd->seentime ) ) )
+	while( ( checktype == SS_LISTLIMIT_COUNT && currentlistcount > SeenServ.maxentries ) || ( checktype == SS_LISTLIMIT_AGE && SeenServ.expiretime > 0 && maxageallowed > sd->seentime ) )
 	{
 		ln2 = list_next( seenlist, ln );
 		DBADelete( "seendata", sd->nick );
@@ -135,6 +125,7 @@
 		sd = lnode_get( ln );
 		currentlistcount --;
 	}
+	return;
 }
 
 /*
@@ -155,6 +146,7 @@
 	seenlist = list_create( -1 );
 	DBAFetchRows( "seendata", loadseenrecords );
 	list_sort( seenlist, sortlistbytime );
+	return;
 }
 
 int sortlistbytime( const void *key1, const void *key2 )
@@ -172,10 +164,6 @@
 	lnode_t *ln, *ln2;
 	SeenData *sd;
 
-	/*
-	 * Destroy the Seen List just to ensure
-	 * all memory is free'd
-	*/
 	ln = list_first(seenlist);
 	while( ln )
 	{
@@ -323,16 +311,18 @@
 */
 int CheckSeenData(CmdParams *cmdparams, SEEN_CHECK checktype)
 {
-	lnode_t *ln;
+	lnode_t *ln, *oln[MAX_NICK_HISTORY];
 	SeenData *sd, *sdo;
 	Client *u;
 	Channel *c;
-	int matchfound = 0, seenentriesfound = 0;
-	int isopersource = 0;
+	int matchfound = 0, seenentriesfound = 0, maxageallowed = 0;
+	int isopersource = 0, i;
 	
 	if( cmdparams->source->user->ulevel >= NS_ULEVEL_LOCOPER )
 		isopersource = 1;
-
+	/* used for expiring records on age if shown in request */
+	for( i = 0 ; i < MAX_NICK_HISTORY ; i++ )
+		oln[i] = NULL;
 	seenentrynick[0] = '\0';
 	currentlyconnectedtext[0] = '\0';
 	if (checktype == SS_CHECK_WILDCARD) 
@@ -363,6 +353,7 @@
 		}
 		if (matchfound) 
 		{
+			oln[seenentriesfound] = ln;
 			seenentriesfound++;
 			if( seenentriesfound == 1 ) 
 			{
@@ -455,6 +446,25 @@
 				seen_report( cmdparams, "%s%s was last seen Kicked From %s %s", matchednickstr, sdo->uservhost, sdo->message, combinedtimetext);
 			break;
 	}
+	/* expire displayed records on age if required */
+	if( SeenServ.expiretime > 0 )
+	{
+		maxageallowed = me.now - ( SeenServ.expiretime * TS_ONE_DAY );
+		i = 0;
+		while( i < MAX_NICK_HISTORY && oln[i] != NULL )
+		{
+			ln = oln[i];
+			sd = lnode_get( ln );
+			if( maxageallowed > sd->seentime )
+			{
+				DBADelete( "seendata", sd->nick );
+				ns_free( sd );
+				list_delete( seenlist, ln );
+				lnode_destroy( ln );
+			}
+			i++;
+		}
+	}
 	return NS_SUCCESS;
 }
 

Modified: trunk/seenserv.c
==============================================================================
--- trunk/seenserv.c	(original)
+++ trunk/seenserv.c	Fri Jun 10 12:10:17 2005
@@ -128,6 +128,7 @@
 	} else {
 		irc_chanalert (sns_bot, "Seen Channel Not Enabled");
 	}
+	AddTimer (TIMER_TYPE_DAILY, removeagedseenrecords, "removeagedseenrecords", 0);
 	return NS_SUCCESS;
 };
 
@@ -146,6 +147,7 @@
 */
 int ModFini( void )
 {
+	DelTimer ("removeagedseenrecords");
 	destroyseenlist();
 	return NS_SUCCESS;
 }
@@ -204,7 +206,7 @@
 {
 	if (reason == SET_CHANGE) 
 	{
-		checkseenlistlimit();
+		checkseenlistlimit(SS_LISTLIMIT_COUNT);
 		return NS_SUCCESS;
 	}
 	return NS_SUCCESS;
@@ -322,8 +324,20 @@
 {
 	if (reason == SET_CHANGE && SeenServ.expiretime > 0) 
 	{
-		checkseenlistlimit();
+		checkseenlistlimit(SS_LISTLIMIT_AGE);
 		return NS_SUCCESS;
 	}
 	return NS_SUCCESS;
 }
+
+/*
+ * Remove Aged Records if required
+*/
+int removeagedseenrecords(void) 
+{
+	SET_SEGV_LOCATION();
+	if( SeenServ.expiretime > 0 )
+		checkseenlistlimit(SS_LISTLIMIT_AGE);
+	return NS_SUCCESS;
+}
+

Modified: trunk/seenserv.h
==============================================================================
--- trunk/seenserv.h	(original)
+++ trunk/seenserv.h	Fri Jun 10 12:10:17 2005
@@ -40,6 +40,13 @@
 	SEEN_TYPE_MAX,
 } SEEN_TYPE;
 
+typedef enum SEEN_LISTLIMIT
+{
+	SS_LISTLIMIT_COUNT,	/* Check List Limit by Record Count */
+	SS_LISTLIMIT_AGE,	/* Check List Limit by Record Age */
+	SEEN_LISTLIMIT_MAX,
+} SEEN_LISTLIMIT;
+
 #define SS_MESSAGESIZE	300	/* Message Field Size */
 #define SS_GENCHARLEN	128	/* General Character Field Length */
 
@@ -112,10 +119,12 @@
 static int sns_set_eventpart( CmdParams *cmdparams, SET_REASON reason );
 static int sns_set_eventkick( CmdParams *cmdparams, SET_REASON reason );
 static int sns_set_expiretime (CmdParams *cmdparams, SET_REASON reason);
+int removeagedseenrecords(void);
 
 /* seen.c */
+int removepreviousnick(char *nick);
 void addseenentry(char *nick, char *host, char *vhost, char *message, int type);
-void checkseenlistlimit(void);
+void checkseenlistlimit(int checktype);
 void loadseendata(void);
 int sortlistbytime(const void *key1, const void *key2);
 void destroyseenlist(void);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.