porting over statserv to keeper interface for data. Kinda slow. need to find some speedups
This commit is contained in:
parent
95ca5a0ef8
commit
d3449b74d1
6 changed files with 250 additions and 8 deletions
|
@ -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
7
conf.h
|
@ -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
5
dl.c
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
167
keeper.c
|
@ -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;
|
||||
}
|
||||
|
|
Reference in a new issue