porting over statserv to keeper interface for data. Kinda slow. need to find some speedups

This commit is contained in:
fishwaldo 2003-09-12 16:52:26 +00:00
parent 95ca5a0ef8
commit d3449b74d1
6 changed files with 250 additions and 8 deletions

View file

@ -5,6 +5,7 @@ NeoStats ChangeLog - Anything we add/remove/fix/change is in here (even our rant
- Fixed a compile problem with StatServ (BugID: 47)
- Strip Colors from clientversions in StatServ
- Output clientversions in the HTML output (ReqID: 40)
- First go and implementing Data API. SLOOOOW (DON'T USE THIS FOR PRODUCTION)
* NeoStats * Fish * Version 2.5.5
- Module API version number

7
conf.h
View file

@ -20,7 +20,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: conf.h,v 1.7 2003/08/01 14:32:12 fishwaldo Exp $
** $Id: conf.h,v 1.8 2003/09/12 16:52:26 fishwaldo Exp $
*/
@ -58,5 +58,10 @@ int GetConf (void **data, int type, const char *item);
int SetConf (void *data, int type, char *item);
int GetDir (char *item, char ***data);
int DelConf (char *item);
int DelRow (char *table, char *row);
int DelTable(char *table);
int SetData (void *data, int type, char *table, char *row, char *field);
int GetTableData (char *table, char ***data);
int GetData (void **data, int type, const char *table, const char *row, const char *field);
#endif

5
dl.c
View file

@ -20,7 +20,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: dl.c,v 1.65 2003/08/19 13:08:13 fishwaldo Exp $
** $Id: dl.c,v 1.66 2003/09/12 16:52:26 fishwaldo Exp $
*/
#include <dlfcn.h>
@ -804,11 +804,12 @@ unload_module (char *module_name, User * u)
i = get_mod_num (module_name);
list = hnode_get (modnode);
strcpy(segvinmodule, module_name);
dofini = dlsym ((int *) list->dl_handle, "__ModFini");
if (dofini) {
(*dofini) ();
}
strcpy(segvinmodule, "");
hash_delete (mh, modnode);

View file

@ -22,17 +22,85 @@
** USA
**
** NeoStats CVS Identification
** $Id: database.c,v 1.15 2003/06/13 14:49:33 fishwaldo Exp $
** $Id: database.c,v 1.16 2003/09/12 16:52:26 fishwaldo Exp $
*/
#include "stats.h"
#include "conf.h"
#include "statserv.h"
#include "log.h"
void SaveStats()
{
SStats *s;
CStats *c;
hnode_t *sn;
lnode_t *cn;
hscan_t ss;
strcpy(segv_location, "StatServ-SaveStats");
if (StatServ.newdb == 1) {
chanalert(s_StatServ, "Enabling Record yelling!");
StatServ.newdb = 0;
}
/* first thing we do is clear the old database */
DelTable("ServerStats");
DelTable("ChanStats");
DelTable("NetStats");
/* ok, run through the server stats, and save them */
hash_scan_begin(&ss, Shead);
while ((sn = hash_scan_next(&ss))) {
s = hnode_get(sn);
nlog(LOG_DEBUG1, LOG_MOD,
"Writing statistics to database for %s", s->name);
SetData((void *)s->numsplits, CFGINT, "ServerStats", s->name, "Splits");
SetData((void *)s->maxusers, CFGINT, "ServerStats", s->name, "MaxUsers");
SetData((void *)s->t_maxusers, CFGINT, "ServerStats", s->name, "MaxUsersTime");
SetData((void *)s->lastseen, CFGINT, "ServerStats", s->name, "LastSeen");
SetData((void *)s->starttime, CFGINT, "ServerStats", s->name, "StartTime");
SetData((void *)s->operkills, CFGINT, "ServerStats", s->name, "OperKills");
SetData((void *)s->serverkills, CFGINT, "ServerStats", s->name, "ServerKills");
SetData((void *)s->totusers, CFGINT, "ServerStats", s->name, "TotalUsers");
}
/* ok, Now Channel Stats */
cn = list_first(Chead);
while (cn) {
c = lnode_get(cn);
nlog(LOG_DEBUG1, LOG_MOD,
"Writting Statistics to database for %s", c->name);
SetData((void *)c->topics, CFGINT, "ChanStats", c->name, "Topics");
SetData((void *)c->totmem, CFGINT, "ChanStats", c->name, "TotalMems");
SetData((void *)c->kicks, CFGINT, "ChanStats", c->name, "Kicks");
SetData((void *)c->lastseen, CFGINT, "ChanStats", c->name, "LastSeen");
SetData((void *)c->maxmems, CFGINT, "ChanStats", c->name, "MaxMems");
SetData((void *)c->t_maxmems, CFGINT, "ChanStats", c->name, "MaxMemsTime");
SetData((void *)c->maxkicks, CFGINT, "ChanStats", c->name, "MaxKicks");
SetData((void *)c->t_maxkicks, CFGINT, "ChanStats", c->name, "MaxKicksTime");
SetData((void *)c->maxjoins, CFGINT, "ChanStats", c->name, "MaxJoins");
SetData((void *)c->t_maxjoins, CFGINT, "ChanStats", c->name, "MaxJoinsTime");
cn = list_next(Chead, cn);
}
/* and finally, the network data */
SetData((void *)stats_network.maxopers, CFGINT, "NetStats", "Global", "MaxOpers");
SetData((void *)stats_network.maxusers, CFGINT, "NetStats", "Global", "MaxUsers");
SetData((void *)stats_network.maxservers, CFGINT, "NetStats", "Global", "MaxServers");
SetData((void *)stats_network.t_maxopers, CFGINT, "NetStats", "Global", "MaxOpersTime");
SetData((void *)stats_network.t_maxusers, CFGINT, "NetStats", "Global", "MaxUsersTime");
SetData((void *)stats_network.t_maxservers, CFGINT, "NetStats", "Global", "MaxServersTime");
SetData((void *)stats_network.totusers, CFGINT, "NetStats", "Global", "TotalUsers");
SetData((void *)stats_network.maxchans, CFGINT, "NetStats", "Global", "MaxChans");
SetData((void *)stats_network.t_chans, CFGINT, "NetStats", "Global", "MaxChansTime");
/* old config file stuff follows*/
#if 0
FILE *fp = fopen("data/stats.db", "w");
SStats *s;
CStats *c;
@ -94,6 +162,7 @@ void SaveStats()
stats_network.totusers, stats_network.maxchans,
stats_network.t_chans);
fclose(fp);
#endif
}
void LoadStats()

View file

@ -20,7 +20,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: statserv.c,v 1.70 2003/09/11 12:55:40 fishwaldo Exp $
** $Id: statserv.c,v 1.71 2003/09/12 16:52:26 fishwaldo Exp $
*/
#include <stdio.h>
@ -166,7 +166,7 @@ int new_m_version(char *origin, char **av, int ac)
return 0;
}
void _init()
int __ModInit()
{
Server *ss;
User *u;
@ -247,9 +247,10 @@ void _init()
}
}
}
return 1;
}
void _fini()
void __ModFini()
{
SaveStats();

167
keeper.c
View file

@ -20,7 +20,7 @@
** USA
**
** NeoStats CVS Identification
** $Id: keeper.c,v 1.12 2003/08/01 14:32:12 fishwaldo Exp $
** $Id: keeper.c,v 1.13 2003/09/12 16:52:26 fishwaldo Exp $
*/
#include "stats.h"
@ -167,3 +167,168 @@ DelConf (char *item)
kp_flush ();
return 1;
}
/** @brief Gets Data of Type
*/
int
GetData (void **data, int type, const char *table, const char *row, const char *field)
{
char keypath[255];
int i = 0;
/* determine if its a module setting */
if (strlen (segvinmodule) > 0) {
snprintf (keypath, 255, "l/%s:/%s/%s/%s", segvinmodule, table, row, field);
} else {
snprintf (keypath, 255, "l/core:/%s/%s/%s", table, row, field);
}
switch (type) {
case CFGSTR:
i = kp_get_string (keypath, (char **) *&data);
break;
case CFGINT:
i = kp_get_int (keypath, (int *) *&data);
break;
case CFGFLOAT:
i = kp_get_float (keypath, (double *) *&data);
break;
case CFGBOOL:
i = kp_get_bool (keypath, (int *) *&data);
break;
default:
nlog (LOG_WARNING, LOG_CORE, "Keeper: Called GetData with invalid datatype %d", type);
return -1;
}
/* check for errors */
if (i != 0) {
/*
data = malloc(255);
*/
nlog (LOG_DEBUG1, LOG_CORE, "GetData: %s - Path: %s", kp_strerror (i), keypath);
return -1;
}
return 1;
}
/* @brief return a array of strings containing all rows in a database */
int
GetTableData (char *table, char ***data)
{
int i;
char keypath[255];
char **data1;
/* determine if its a module setting */
if (strlen (segvinmodule) > 0) {
snprintf (keypath, 255, "l/%s:/%s", segvinmodule, table);
} else {
snprintf (keypath, 255, "l/core:/%s", table);
}
i = kp_get_dir (keypath, &data1, NULL);
if (i == 0) {
*data = data1;
return 1;
}
*data = NULL;
nlog (LOG_DEBUG1, LOG_CORE, "GetTableData: %s - Path: %s", kp_strerror (i), keypath);
return -1;
}
/** @brief Sets Config Data of Type
*/
int
SetData (void *data, int type, char *table, char *row, char *field)
{
char keypath[255];
int i = 0;
/* determine if its a module setting */
if (strlen (segvinmodule) > 0) {
snprintf (keypath, 255, "l/%s:/%s/%s/%s", segvinmodule, table, row, field);
} else {
snprintf (keypath, 255, "l/core:/%s/%s/%s", table, row, field);
}
switch (type) {
case CFGSTR:
i = kp_set_string (keypath, (char *) data);
break;
case CFGINT:
i = kp_set_int (keypath, (int) data);
break;
case CFGFLOAT:
/*
i = kp_set_float(keypath, (double *)data);
*/
break;
case CFGBOOL:
i = kp_set_bool (keypath, (int) data);
break;
default:
nlog (LOG_WARNING, LOG_CORE, "Keeper: Called SetData with invalid datatype %d", type);
return -1;
}
/* check for errors */
if (i != 0) {
nlog (LOG_WARNING, LOG_CORE, "SetData: %s", kp_strerror (i));
return -1;
}
kp_flush ();
return 1;
}
/** @brief removes a row from the Database
*/
int
DelRow (char *table, char *row)
{
char keypath[255];
int i = 0;
/* determine if its a module setting */
if (strlen (segvinmodule) > 0) {
snprintf (keypath, 255, "l/%s:/%s/%s", segvinmodule, table, row);
} else {
snprintf (keypath, 255, "l/core:/%s/%s", table, row);
}
i = kp_recursive_do(keypath, (kp_func) kp_remove, 0, NULL);
/* check for errors */
if (i != 0) {
nlog (LOG_WARNING, LOG_CORE, "DelRow: %s (%s)", kp_strerror (i), keypath);
return -1;
}
kp_flush ();
return 1;
}
/** @brief removes a row from the Database
*/
int
DelTable (char *table)
{
char keypath[255];
int i = 0;
/* determine if its a module setting */
if (strlen (segvinmodule) > 0) {
snprintf (keypath, 255, "l/%s:/%s", segvinmodule, table);
} else {
snprintf (keypath, 255, "l/core:/%s", table);
}
i = kp_recursive_do(keypath, (kp_func) kp_remove, 0, NULL);
/* check for errors */
if (i != 0) {
nlog (LOG_WARNING, LOG_CORE, "DelTable: %s (%s)", kp_strerror (i), keypath);
return -1;
}
kp_flush ();
return 1;
}