[srvx-commits] CVS: services/src chanserv.c,1.274,1.275 common.h,1.80,1.81 gline.c,1.29,1.30 global.
Brought to you by:
entrope
|
From: Entrope <en...@us...> - 2002-08-18 05:50:27
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv8265/src
Modified Files:
chanserv.c common.h gline.c global.c helpserv.c main.c
modcmd.c nickserv.c opserv.c recdb.c recdb.h sendmail.c
Log Message:
convert all services to use saxdb for writing (and reading)
remove old "write" (and "?writeall") commands
remove recdb write code
Index: chanserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.c,v
retrieving revision 1.274
retrieving revision 1.275
diff -C2 -r1.274 -r1.275
*** chanserv.c 14 Aug 2002 21:55:48 -0000 1.274
--- chanserv.c 18 Aug 2002 05:50:23 -0000 1.275
***************
*** 25,35 ****
#include "opserv.h" /* for opserv_bad_channel() */
#include "policer.h"
#include "timeq.h"
#define CHANSERV_CONF_NAME "services/chanserv"
- #define CHANSERV_DB_NAME "chanserv.db"
- #define TEMP_DB_NAME "chanserv.db.new"
-
/* ChanServ options */
#define KEY_DEBUG_CHANNEL "debug_channel"
--- 25,33 ----
#include "opserv.h" /* for opserv_bad_channel() */
#include "policer.h"
+ #include "saxdb.h"
#include "timeq.h"
#define CHANSERV_CONF_NAME "services/chanserv"
/* ChanServ options */
#define KEY_DEBUG_CHANNEL "debug_channel"
***************
*** 340,345 ****
#define CSMSG_SERVICES_UPTIME "$bServices Uptime: $b%s"
#define CSMSG_BURST_LENGTH "$bLast Burst Length: $b%s"
- #define CSMSG_NO_LAST_WRITE "$bLast Database Write: $bNever"
- #define CSMSG_LAST_WRITE "$bLast Database Write: $b%s ago"
/* Staff list */
--- 338,341 ----
***************
*** 515,519 ****
struct userData *helperList;
struct chanData *channelList;
- static time_t lastwrite;
static struct module *chanserv_module;
static struct service *chanserv_service;
--- 511,514 ----
***************
*** 4129,4143 ****
intervalString(interval, burst_length);
chanserv_notice(user, CSMSG_BURST_LENGTH, interval);
-
- if(lastwrite)
- {
- intervalString(interval, now - lastwrite);
- chanserv_notice(user, CSMSG_LAST_WRITE, interval);
- }
- else
- {
- chanserv_notice(user, CSMSG_NO_LAST_WRITE);
- }
-
return 1;
}
--- 4124,4127 ----
***************
*** 6233,6237 ****
chanserv_conf.max_owned = str ? atoi(str) : 5;
strlist = database_get_data(conf_node, KEY_8BALL_RESPONSES, RECDB_STRING_LIST);
! if (strlist) {
strlist = string_list_copy(strlist);
} else {
--- 6217,6221 ----
chanserv_conf.max_owned = str ? atoi(str) : 5;
strlist = database_get_data(conf_node, KEY_8BALL_RESPONSES, RECDB_STRING_LIST);
! if(strlist) {
strlist = string_list_copy(strlist);
} else {
***************
*** 6512,6516 ****
}
! if ((cData->suspended = suspended)) suspended->cData = cData;
str = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
cData->registered = str ? (time_t)strtoul(str, NULL, 0) : now;
--- 6496,6500 ----
}
! if((cData->suspended = suspended)) suspended->cData = cData;
str = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
cData->registered = str ? (time_t)strtoul(str, NULL, 0) : now;
***************
*** 6526,6530 ****
cData->topic_mask = str ? strdup(str) : NULL;
str = database_get_data(channel, KEY_TOPIC, RECDB_QSTRING);
! if (str) safestrncpy(cData->topic, str, sizeof(cData->topic));
if((str = database_get_data(channel, KEY_MODES, RECDB_QSTRING)))
--- 6510,6514 ----
cData->topic_mask = str ? strdup(str) : NULL;
str = database_get_data(channel, KEY_TOPIC, RECDB_QSTRING);
! if(str) safestrncpy(cData->topic, str, sizeof(cData->topic));
if((str = database_get_data(channel, KEY_MODES, RECDB_QSTRING)))
***************
*** 6609,6622 ****
}
! static void
! chanserv_db_read(const char *fname)
{
! dict_t database, section;
dict_iterator_t it;
- database = parse_database(fname);
-
- if(!database) return;
-
if((section = database_get_data(database, KEY_NOTE_TYPES, RECDB_OBJECT)))
{
--- 6593,6602 ----
}
! static int
! chanserv_saxdb_read(struct dict *database)
{
! struct dict *section;
dict_iterator_t it;
if((section = database_get_data(database, KEY_NOTE_TYPES, RECDB_OBJECT)))
{
***************
*** 6642,6892 ****
}
}
!
! free_database(database);
}
static void
! chanserv_write_users(dict_t channel, struct userData *uData)
{
! dict_t users = alloc_object();
! char str[16];
!
! while(uData)
{
! dict_t user = alloc_object();
!
! snprintf(str, sizeof(str), "%d", levelMap[uData->access]);
! dict_insert(user, KEY_LEVEL, alloc_record_data_qstring(str));
!
! snprintf(str, sizeof(str), FMT_TIME_T, uData->seen);
! dict_insert(user, KEY_SEEN, alloc_record_data_qstring(str));
!
! if(uData->flags)
! {
! snprintf(str, sizeof(str), "%u", uData->flags);
! dict_insert(user, KEY_FLAGS, alloc_record_data_qstring(str));
! }
!
! if(uData->info) dict_insert(user, KEY_INFO, alloc_record_data_qstring(uData->info));
!
! dict_insert(users, uData->handle->handle, alloc_record_data_object(user));
! uData = uData->next;
}
!
! dict_insert(channel, KEY_USERS, alloc_record_data_object(users));
}
static void
! chanserv_write_bans(dict_t channel, struct banData *bData)
{
! dict_t bans = alloc_object();
! char str[16];
!
! while(bData)
{
! dict_t ban = alloc_object();
!
! snprintf(str, sizeof(str), FMT_TIME_T, bData->set);
! dict_insert(ban, KEY_SET, alloc_record_data_qstring(str));
!
! if(bData->triggered)
! {
! snprintf(str, sizeof(str), FMT_TIME_T, bData->triggered);
! dict_insert(ban, KEY_TRIGGERED, alloc_record_data_qstring(str));
! }
!
! if(bData->expires)
! {
! snprintf(str, sizeof(str), FMT_TIME_T, bData->expires);
! dict_insert(ban, KEY_EXPIRES, alloc_record_data_qstring(str));
! }
!
! if(bData->owner[0]) dict_insert(ban, KEY_OWNER, alloc_record_data_qstring(bData->owner));
! if(bData->reason) dict_insert(ban, KEY_REASON, alloc_record_data_qstring(bData->reason));
!
! dict_insert(bans, bData->mask, alloc_record_data_object(ban));
! bData = bData->next;
}
!
! dict_insert(channel, KEY_BANS, alloc_record_data_object(bans));
}
! static dict_t
! chanserv_write_suspended(struct suspended *susp)
{
! dict_t obj = alloc_object();
! char buf[16];
!
! dict_insert(obj, KEY_SUSPENDER, alloc_record_data_qstring(susp->suspender));
! dict_insert(obj, KEY_REASON, alloc_record_data_qstring(susp->reason));
! if(susp->issued)
! {
! sprintf(buf, FMT_TIME_T, susp->issued);
! dict_insert(obj, KEY_ISSUED, alloc_record_data_qstring(buf));
! }
! if(susp->expires)
! {
! sprintf(buf, FMT_TIME_T, susp->expires);
! dict_insert(obj, KEY_EXPIRES, alloc_record_data_qstring(buf));
! }
! if(susp->revoked)
! {
! sprintf(buf, FMT_TIME_T, susp->revoked);
! dict_insert(obj, KEY_REVOKED, alloc_record_data_qstring(buf));
! }
! if (susp->previous)
! {
! dict_insert(obj, KEY_PREVIOUS, alloc_record_data_object(chanserv_write_suspended(susp->previous)));
! }
! return obj;
}
static void
! chanserv_write_channel(dict_t db, struct chanData *channel)
{
! dict_t obj = alloc_object();
! char str[16], flags[FLAGS_STRING_LENGTH + OPTION_STRING_SIZE], *channame;
!
! snprintf(str, sizeof(str), FMT_TIME_T, channel->registered);
! dict_insert(obj, KEY_REGISTERED, alloc_record_data_qstring(str));
!
! snprintf(str, sizeof(str), FMT_TIME_T, channel->visited);
! dict_insert(obj, KEY_VISITED, alloc_record_data_qstring(str));
!
! snprintf(str, sizeof(str), "%d", channel->max);
! dict_insert(obj, KEY_MAX, alloc_record_data_qstring(str));
! if(channel->topic[0])
! {
! dict_insert(obj, KEY_TOPIC, alloc_record_data_qstring(channel->topic));
! }
!
! if(channel->registrar)
! {
! dict_insert(obj, KEY_REGISTRAR, alloc_record_data_qstring(channel->registrar));
! }
!
! if(channel->greeting)
! {
! dict_insert(obj, KEY_GREETING, alloc_record_data_qstring(channel->greeting));
! }
!
! if(channel->user_greeting)
! {
! dict_insert(obj, KEY_USER_GREETING, alloc_record_data_qstring(channel->user_greeting));
! }
!
! if(channel->topic_mask)
! {
! dict_insert(obj, KEY_TOPIC_MASK, alloc_record_data_qstring(channel->topic_mask));
! }
!
! if(channel->suspended)
! {
! dict_insert(obj, KEY_SUSPENDED, alloc_record_data_object(chanserv_write_suspended(channel->suspended)));
! }
! inttobase64(flags, channel->flags, FLAGS_STRING_LENGTH);
! safestrncpy(flags + FLAGS_STRING_LENGTH, channel->options, sizeof(flags) - (FLAGS_STRING_LENGTH + 1));
! dict_insert(obj, KEY_FLAGS, alloc_record_data_qstring(flags));
if(channel->mode_on || channel->mode_off)
{
! char modes[MODELEN];
!
! create_mode_lock(modes, channel);
! dict_insert(obj, KEY_MODES, alloc_record_data_qstring(modes));
}
! chanserv_write_users(obj, channel->users);
!
! if(channel->banCount)
! {
! chanserv_write_bans(obj, channel->bans);
! }
if(dict_size(channel->notes))
{
- dict_t subobj = alloc_object();
dict_iterator_t it;
for(it = dict_first(channel->notes); it; it = iter_next(it))
{
struct note *note = iter_data(it);
! dict_t nobj = alloc_object();
!
! dict_insert(nobj, KEY_NOTE_SETTER, alloc_record_data_qstring(note->setter));
! dict_insert(nobj, KEY_NOTE_NOTE, alloc_record_data_qstring(note->note));
!
! dict_insert(subobj, iter_key(it), alloc_record_data_object(nobj));
!
}
! dict_insert(obj, KEY_NOTES, alloc_record_data_object(subobj));
}
!
! channame = IsSuspended(channel) ? channel->suspended->name : channel->channel->name;
! dict_insert(db, channame, alloc_record_data_object(obj));
}
static void
! chanserv_write_channels(dict_t db)
{
! struct chanData *channel;
! dict_t channels = alloc_object();
!
! dict_insert(db, KEY_CHANNELS, alloc_record_data_object(channels));
! for(channel = channelList; channel; channel = channel->next)
{
! chanserv_write_channel(channels, channel);
}
! }
!
! static void
! chanserv_write_note_types(dict_t db)
! {
! dict_t types, type_obj;
! dict_iterator_t it;
! struct note_type *ntype;
! char buffer[16];
! const char *str;
!
! types = alloc_object();
! for(it = dict_first(note_types); it; it = iter_next(it))
{
! ntype = iter_data(it);
! type_obj = alloc_object();
! switch(ntype->set_access_type)
! {
! case NOTE_SET_CHANNEL_ACCESS:
! snprintf(buffer, sizeof(buffer), "%d", levelMap[ntype->set_access.min_ulevel]);
! dict_insert(type_obj, KEY_NOTE_CHANNEL_ACCESS, alloc_record_data_qstring(buffer));
! break;
! case NOTE_SET_CHANNEL_SETTER:
! dict_insert(type_obj, KEY_NOTE_SETTER_ACCESS, alloc_record_data_qstring("1"));
! break;
! case NOTE_SET_PRIVILEGED: default:
! snprintf(buffer, sizeof(buffer), "%d", ntype->set_access.min_opserv);
! dict_insert(type_obj, KEY_NOTE_OPSERV_ACCESS, alloc_record_data_qstring(buffer));
! break;
! }
! switch(ntype->visible_type)
! {
! case NOTE_VIS_ALL: str = KEY_NOTE_VIS_ALL; break;
! case NOTE_VIS_CHANNEL_USERS: str = KEY_NOTE_VIS_CHANNEL_USERS; break;
! case NOTE_VIS_PRIVILEGED: default: str = KEY_NOTE_VIS_PRIVILEGED; break;
! }
! dict_insert(type_obj, KEY_NOTE_VISIBILITY, alloc_record_data_qstring(str));
! snprintf(buffer, sizeof(buffer), "%u", ntype->max_length);
! dict_insert(type_obj, KEY_NOTE_MAX_LENGTH, alloc_record_data_qstring(buffer));
! dict_insert(types, iter_key(it), alloc_record_data_object(type_obj));
}
! dict_insert(db, KEY_NOTE_TYPES, alloc_record_data_object(types));
}
static void
! write_dnrs_helper(dict_t db, dict_t dnrs)
{
- dict_t dnr_obj;
struct do_not_register *dnr;
dict_iterator_t it;
--- 6622,6756 ----
}
}
! return 0;
}
static void
! chanserv_write_users(struct saxdb_context *ctx, struct userData *uData)
{
! saxdb_start_record(ctx, KEY_USERS, 1);
! for(; uData; uData = uData->next)
{
! saxdb_start_record(ctx, uData->handle->handle, 0);
! saxdb_write_int(ctx, KEY_LEVEL, levelMap[uData->access]);
! saxdb_write_int(ctx, KEY_SEEN, uData->seen);
! if(uData->flags) saxdb_write_int(ctx, KEY_FLAGS, uData->flags);
! if(uData->info) saxdb_write_string(ctx, KEY_INFO, uData->info);
! saxdb_end_record(ctx);
}
! saxdb_end_record(ctx);
}
static void
! chanserv_write_bans(struct saxdb_context *ctx, struct banData *bData)
{
! if(!bData) return;
! saxdb_start_record(ctx, KEY_BANS, 1);
! for(; bData; bData = bData->next)
{
! saxdb_start_record(ctx, bData->mask, 0);
! saxdb_write_int(ctx, KEY_SET, bData->set);
! if(bData->triggered) saxdb_write_int(ctx, KEY_TRIGGERED, bData->triggered);
! if(bData->expires) saxdb_write_int(ctx, KEY_EXPIRES, bData->expires);
! if(bData->owner[0]) saxdb_write_string(ctx, KEY_OWNER, bData->owner);
! if(bData->reason) saxdb_write_string(ctx, KEY_REASON, bData->reason);
! saxdb_end_record(ctx);
}
! saxdb_end_record(ctx);
}
! static void
! chanserv_write_suspended(struct saxdb_context *ctx, const char *name, struct suspended *susp)
{
! saxdb_start_record(ctx, name, 0);
! saxdb_write_string(ctx, KEY_SUSPENDER, susp->suspender);
! saxdb_write_string(ctx, KEY_REASON, susp->reason);
! if(susp->issued) saxdb_write_int(ctx, KEY_ISSUED, susp->issued);
! if(susp->expires) saxdb_write_int(ctx, KEY_EXPIRES, susp->expires);
! if(susp->revoked) saxdb_write_int(ctx, KEY_REVOKED, susp->revoked);
! if(susp->previous) chanserv_write_suspended(ctx, KEY_PREVIOUS, susp->previous);
! saxdb_end_record(ctx);
}
static void
! chanserv_write_channel(struct saxdb_context *ctx, struct chanData *channel)
{
! char buf[MAXLEN], *channame;
! channame = IsSuspended(channel) ? channel->suspended->name : channel->channel->name;
! saxdb_start_record(ctx, channame, 1);
! saxdb_write_int(ctx, KEY_REGISTERED, channel->registered);
! saxdb_write_int(ctx, KEY_VISITED, channel->visited);
! saxdb_write_int(ctx, KEY_MAX, channel->max);
! if(channel->topic[0]) saxdb_write_string(ctx, KEY_TOPIC, channel->topic);
! if(channel->registrar) saxdb_write_string(ctx, KEY_REGISTRAR, channel->registrar);
! if(channel->greeting) saxdb_write_string(ctx, KEY_GREETING, channel->greeting);
! if(channel->user_greeting) saxdb_write_string(ctx, KEY_USER_GREETING, channel->user_greeting);
! if(channel->topic_mask) saxdb_write_string(ctx, KEY_TOPIC_MASK, channel->topic_mask);
! if(channel->suspended) chanserv_write_suspended(ctx, "suspended", channel->suspended);
!
! inttobase64(buf, channel->flags, FLAGS_STRING_LENGTH);
! safestrncpy(buf + FLAGS_STRING_LENGTH, channel->options, sizeof(buf)-FLAGS_STRING_LENGTH-1);
! saxdb_write_string(ctx, KEY_FLAGS, buf);
if(channel->mode_on || channel->mode_off)
{
! create_mode_lock(buf, channel);
! saxdb_write_string(ctx, KEY_MODES, buf);
}
! chanserv_write_users(ctx, channel->users);
! chanserv_write_bans(ctx, channel->bans);
if(dict_size(channel->notes))
{
dict_iterator_t it;
+ saxdb_start_record(ctx, KEY_NOTES, 1);
for(it = dict_first(channel->notes); it; it = iter_next(it))
{
struct note *note = iter_data(it);
! saxdb_start_record(ctx, iter_key(it), 0);
! saxdb_write_string(ctx, KEY_NOTE_SETTER, note->setter);
! saxdb_write_string(ctx, KEY_NOTE_NOTE, note->note);
! saxdb_end_record(ctx);
}
! saxdb_end_record(ctx);
}
! saxdb_end_record(ctx);
}
static void
! chanserv_write_note_type(struct saxdb_context *ctx, struct note_type *ntype)
{
! const char *str;
! saxdb_start_record(ctx, ntype->name, 0);
! switch(ntype->set_access_type)
{
! case NOTE_SET_CHANNEL_ACCESS:
! saxdb_write_int(ctx, KEY_NOTE_CHANNEL_ACCESS, levelMap[ntype->set_access.min_ulevel]);
! break;
! case NOTE_SET_CHANNEL_SETTER:
! saxdb_write_int(ctx, KEY_NOTE_SETTER_ACCESS, 1);
! break;
! case NOTE_SET_PRIVILEGED: default:
! saxdb_write_int(ctx, KEY_NOTE_OPSERV_ACCESS, ntype->set_access.min_opserv);
! break;
}
! switch(ntype->visible_type)
{
! case NOTE_VIS_ALL: str = KEY_NOTE_VIS_ALL; break;
! case NOTE_VIS_CHANNEL_USERS: str = KEY_NOTE_VIS_CHANNEL_USERS; break;
! case NOTE_VIS_PRIVILEGED: default: str = KEY_NOTE_VIS_PRIVILEGED; break;
}
! saxdb_write_string(ctx, KEY_NOTE_VISIBILITY, str);
! saxdb_write_int(ctx, KEY_NOTE_MAX_LENGTH, ntype->max_length);
! saxdb_end_record(ctx);
}
static void
! write_dnrs_helper(struct saxdb_context *ctx, struct dict *dnrs)
{
struct do_not_register *dnr;
dict_iterator_t it;
***************
*** 6895,6966 ****
{
dnr = iter_data(it);
! dnr_obj = alloc_object();
! dict_insert(dnr_obj, KEY_DNR_SETTER, alloc_record_data_qstring(dnr->setter));
! dict_insert(dnr_obj, KEY_DNR_REASON, alloc_record_data_qstring(dnr->reason));
! dict_insert(db, dnr->chan_name, alloc_record_data_object(dnr_obj));
}
}
! static void
! chanserv_write_dnrs(dict_t db)
! {
! dict_t dnrs;
!
! dnrs = alloc_object();
! write_dnrs_helper(dnrs, handle_dnrs);
! write_dnrs_helper(dnrs, plain_dnrs);
! write_dnrs_helper(dnrs, mask_dnrs);
! dict_insert(db, KEY_DNR, alloc_record_data_object(dnrs));
! }
!
! static void
! chanserv_db_write(void)
{
! FILE *f = fopen(TEMP_DB_NAME, "w+");
! dict_t db = alloc_database();
!
! chanserv_write_note_types(db);
! chanserv_write_dnrs(db);
! chanserv_write_channels(db);
!
! write_database(f, db);
! fclose(f);
!
! free_database(db);
! if(rename(TEMP_DB_NAME, CHANSERV_DB_NAME) == -1)
{
! log(CS_LOG, LOG_ERROR, "Error renaming database: %s\n", strerror(errno));
}
! lastwrite = now;
! }
! void
! chanserv_timed_write(void *data)
! {
! (void)data;
!
! chanserv_db_write();
! log(CS_LOG, LOG_INFO, "Made automatic backup of ChanServ database.\n");
! timeq_add(now + chanserv_conf.db_backup_frequency, chanserv_timed_write, NULL);
! }
!
! static CHANSERV_FUNC(cmd_write)
! {
! struct timeval start, stop;
! (void)channel;(void)argc;(void)argv;
! gettimeofday(&start, NULL);
! chanserv_db_write();
! gettimeofday(&stop, NULL);
! stop.tv_sec -= start.tv_sec;
! stop.tv_usec -= start.tv_usec;
! if (stop.tv_usec < 0) {
! stop.tv_sec -= 1;
! stop.tv_usec += 1000000;
}
! chanserv_notice(user, CSMSG_WRITE_SUCCESS, stop.tv_sec, stop.tv_usec/1000);
! log(CS_LOG, LOG_INFO, "%s ordered a ChanServ database write.\n", user->handle_info->handle);
! return 1;
}
--- 6759,6799 ----
{
dnr = iter_data(it);
! saxdb_start_record(ctx, dnr->chan_name, 0);
! saxdb_write_string(ctx, KEY_DNR_SETTER, dnr->setter);
! saxdb_write_string(ctx, KEY_DNR_REASON, dnr->reason);
! saxdb_end_record(ctx);
}
}
! static int
! chanserv_saxdb_write(struct saxdb_context *ctx)
{
! dict_iterator_t it;
! struct chanData *channel;
! /* Notes */
! saxdb_start_record(ctx, KEY_NOTE_TYPES, 1);
! for(it = dict_first(note_types); it; it = iter_next(it))
{
! chanserv_write_note_type(ctx, iter_data(it));
}
! saxdb_end_record(ctx);
! /* DNRs */
! saxdb_start_record(ctx, KEY_DNR, 1);
! write_dnrs_helper(ctx, handle_dnrs);
! write_dnrs_helper(ctx, plain_dnrs);
! write_dnrs_helper(ctx, mask_dnrs);
! saxdb_end_record(ctx);
! /* Channels */
! saxdb_start_record(ctx, KEY_CHANNELS, 1);
! for(channel = channelList; channel; channel = channel->next)
! {
! chanserv_write_channel(ctx, channel);
}
! saxdb_end_record(ctx);
!
! return 0;
}
***************
*** 6969,6973 ****
unreg_part_func(handle_part);
dict_delete(sChannels);
! while (channelList) unregister_channel(channelList);
dict_delete(set_func_dict);
dict_delete(handle_dnrs);
--- 6802,6806 ----
unreg_part_func(handle_part);
dict_delete(sChannels);
! while(channelList) unregister_channel(channelList);
dict_delete(set_func_dict);
dict_delete(handle_dnrs);
***************
*** 6977,6981 ****
free(chanserv_conf.ctcp_short_ban_duration);
free(chanserv_conf.ctcp_long_ban_duration);
! if (chanserv_conf.eightball) free_string_list(chanserv_conf.eightball);
}
--- 6810,6814 ----
free(chanserv_conf.ctcp_short_ban_duration);
free(chanserv_conf.ctcp_long_ban_duration);
! if(chanserv_conf.eightball) free_string_list(chanserv_conf.eightball);
}
***************
*** 7092,7096 ****
DEFINE_COMMAND(emote, 2, 0, "flags", "+oper,+acceptchan", NULL);
DEFINE_COMMAND(expire, 1, 0, "flags", "+oper", NULL);
- DEFINE_COMMAND(write, 1, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL);
DEFINE_COMMAND(last, 1, 0, "account_flags", "+g", "flags", "+nolog", NULL);
DEFINE_COMMAND(search, 3, 0, "account_flags", "+g", "flags", "+nolog", NULL);
--- 6925,6928 ----
***************
*** 7131,7143 ****
note_types = dict_new();
dict_set_free_data(note_types, chanserv_deref_note_type);
! chanserv_db_read(CHANSERV_DB_NAME);
chanserv_service = service_register(chanserv, chanserv_conf.trigger_char);
reg_chanmsg_func('\001', chanserv, chanserv_ctcp_check);
- if(chanserv_conf.db_backup_frequency)
- {
- timeq_add(now + chanserv_conf.db_backup_frequency, chanserv_timed_write, NULL);
- }
-
if(chanserv_conf.channel_expire_frequency)
{
--- 6963,6970 ----
note_types = dict_new();
dict_set_free_data(note_types, chanserv_deref_note_type);
! saxdb_register("ChanServ", chanserv_saxdb_read, chanserv_saxdb_write);
chanserv_service = service_register(chanserv, chanserv_conf.trigger_char);
reg_chanmsg_func('\001', chanserv, chanserv_ctcp_check);
if(chanserv_conf.channel_expire_frequency)
{
***************
*** 7151,7156 ****
timeq_add(next_refresh, chanserv_refresh_topics, NULL);
}
!
reg_exit_func(chanserv_db_cleanup);
- reg_db_write_func(chanserv_db_write);
}
--- 6978,6982 ----
timeq_add(next_refresh, chanserv_refresh_topics, NULL);
}
!
reg_exit_func(chanserv_db_cleanup);
}
Index: common.h
===================================================================
RCS file: /cvsroot/srvx/services/src/common.h,v
retrieving revision 1.80
retrieving revision 1.81
diff -C2 -r1.80 -r1.81
*** common.h 14 Aug 2002 20:25:08 -0000 1.80
--- common.h 18 Aug 2002 05:50:23 -0000 1.81
***************
*** 79,86 ****
void call_exit_funcs(void);
- typedef void (*db_write_func_t)(void);
- void reg_db_write_func(db_write_func_t handler);
- void write_databases(void);
-
const char *inttobase64(char *buf, unsigned int v, unsigned int count);
unsigned long base64toint(const unsigned char *s, int count);
--- 79,82 ----
Index: gline.c
===================================================================
RCS file: /cvsroot/srvx/services/src/gline.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -C2 -r1.29 -r1.30
*** gline.c 15 Aug 2002 03:50:09 -0000 1.29
--- gline.c 18 Aug 2002 05:50:23 -0000 1.30
***************
*** 22,32 ****
#include "helpfile.h"
#include "log.h"
! #include "recdb.h"
#include "timeq.h"
#include "gline.h"
- #define GLINE_DB_NAME "gline.db"
- #define TEMP_DB_NAME "gline.db.new"
-
#define KEY_REASON "reason"
#define KEY_EXPIRES "expires"
--- 22,29 ----
#include "helpfile.h"
#include "log.h"
! #include "saxdb.h"
#include "timeq.h"
#include "gline.h"
#define KEY_REASON "reason"
#define KEY_EXPIRES "expires"
***************
*** 213,256 ****
}
! static void
! gline_db_read(void)
{
! dict_t db;
! if ((db = parse_database(GLINE_DB_NAME))) {
! dict_foreach(db, gline_add_record, 0);
! free_database(db);
! }
}
static int
! gline_insert_entry(void *key, void *data, void *extra)
{
struct gline *ent = data;
! dict_t node = alloc_object();
! char expstr[16];
(void)key;
! snprintf(expstr, sizeof(expstr), FMT_TIME_T, ent->expires);
! dict_insert(node, KEY_EXPIRES, alloc_record_data_qstring(expstr));
! snprintf(expstr, sizeof(expstr), FMT_TIME_T, ent->issued);
! dict_insert(node, KEY_ISSUED, alloc_record_data_qstring(expstr));
! dict_insert(node, KEY_REASON, alloc_record_data_qstring(ent->reason));
! dict_insert(node, KEY_ISSUER, alloc_record_data_qstring(ent->issuer));
! dict_insert(extra, ent->target, alloc_record_data_object(node));
return 0;
}
! static void
! gline_db_write(void)
{
! FILE *dbfile;
! dict_t db = alloc_database();
! heap_remove_pred(gline_heap, gline_insert_entry, db);
! dbfile = fopen(TEMP_DB_NAME, "w+");
! write_database(dbfile, db);
! fclose(dbfile);
! if (rename(TEMP_DB_NAME, GLINE_DB_NAME) == -1) {
! log(MAIN_LOG, LOG_ERROR, "unable to rename new gline db to old: %s\n", strerror(errno));
! }
! free_database(db);
}
--- 210,240 ----
}
! static int
! gline_saxdb_read(struct dict *db)
{
! return dict_foreach(db, gline_add_record, 0) == NULL;
}
static int
! gline_write_entry(void *key, void *data, void *extra)
{
struct gline *ent = data;
! struct saxdb_context *ctx = extra;
!
(void)key;
! saxdb_start_record(ctx, ent->target, 0);
! saxdb_write_int(ctx, KEY_EXPIRES, ent->expires);
! saxdb_write_int(ctx, KEY_ISSUED, ent->issued);
! saxdb_write_string(ctx, KEY_REASON, ent->reason);
! saxdb_write_string(ctx, KEY_ISSUER, ent->issuer);
! saxdb_end_record(ctx);
return 0;
}
! static int
! gline_saxdb_write(struct saxdb_context *ctx)
{
! heap_remove_pred(gline_heap, gline_write_entry, ctx);
! return 0;
}
***************
*** 268,274 ****
gline_dict = dict_new();
dict_set_free_data(gline_dict, free_gline_from_dict);
! gline_db_read();
reg_exit_func(gline_db_cleanup);
- reg_db_write_func(gline_db_write);
}
--- 252,257 ----
gline_dict = dict_new();
dict_set_free_data(gline_dict, free_gline_from_dict);
! saxdb_register("gline", gline_saxdb_read, gline_saxdb_write);
reg_exit_func(gline_db_cleanup);
}
Index: global.c
===================================================================
RCS file: /cvsroot/srvx/services/src/global.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -C2 -r1.49 -r1.50
*** global.c 11 Aug 2002 03:26:16 -0000 1.49
--- global.c 18 Aug 2002 05:50:23 -0000 1.50
***************
*** 24,27 ****
--- 24,28 ----
#include "nickserv.h"
#include "policer.h"
+ #include "saxdb.h"
#include "timeq.h"
***************
*** 641,657 ****
}
! static void
! global_db_read(void)
{
struct record_data *hir;
! time_t posted = 0;
! long flags = 0;
! unsigned long duration = 0;
char *str, *from, *message;
- dict_t db;
dict_iterator_t it;
- db = parse_database(GLOBAL_DB);
- if (!db) return;
for(it=dict_first(db); it; it=iter_next(it))
{
--- 642,655 ----
}
! static int
! global_saxdb_read(struct dict *db)
{
struct record_data *hir;
! time_t posted;
! long flags;
! unsigned long duration;
char *str, *from, *message;
dict_iterator_t it;
for(it=dict_first(db); it; it=iter_next(it))
{
***************
*** 677,752 ****
message_add(flags, posted, duration, from, message);
}
! free_database(db);
! }
!
! static void
! write_message(FILE *db, struct globalMessage *message)
! {
! dict_t obj = alloc_object();
! struct record_data *rd;
! char str[16];
!
! snprintf(str, sizeof(str), "%li", message->flags);
! dict_insert(obj, KEY_FLAGS, alloc_record_data_qstring(str));
!
! snprintf(str, sizeof(str), FMT_TIME_T, message->posted);
! dict_insert(obj, KEY_POSTED, alloc_record_data_qstring(str));
!
! snprintf(str, sizeof(str), "%li", message->duration);
! dict_insert(obj, KEY_DURATION, alloc_record_data_qstring(str));
!
! dict_insert(obj, KEY_FROM, alloc_record_data_qstring(message->from));
! dict_insert(obj, KEY_MESSAGE, alloc_record_data_qstring(message->message));
!
! rd = alloc_record_data_object(obj);
! snprintf(str, sizeof(str), "%li", message->id);
! write_record(db, str, rd);
! free_record_data(rd);
}
! static void
! global_db_write(void)
{
- FILE *f = fopen(GLOBAL_TEMP_DB, "w");
struct globalMessage *message;
! for(message = messageList; message; message = message->next)
! {
! write_message(f, message);
! }
!
! fclose(f);
! if (rename(GLOBAL_TEMP_DB, GLOBAL_DB) == -1) {
! log(G_LOG, LOG_ERROR, "Unable to rename new db to old: %s\n", strerror(errno));
! }
! }
!
! void
! global_timed_write(void *data)
! {
! (void)data;
!
! global_db_write();
! log(G_LOG, LOG_INFO, "Successfully made scheduled backup of Global database.\n");
! timeq_add(now + global_conf.db_backup_frequency, global_timed_write, NULL);
! }
!
! static GLOBAL_FUNC(cmd_write)
! {
! struct timeval start, stop;
! (void)argc;(void)argv;
!
! gettimeofday(&start, NULL);
! global_db_write();
! gettimeofday(&stop, NULL);
! stop.tv_sec -= start.tv_sec;
! stop.tv_usec -= start.tv_usec;
! if (stop.tv_usec < 0) {
! stop.tv_sec -= 1;
! stop.tv_usec += 1000000;
}
! global_notice(user, GMSG_WRITE_SUCCESS, stop.tv_sec, stop.tv_usec/1000);
! log(G_LOG, LOG_INFO, "%s ordered a Global database write.\n", user->nick);
! return 1;
}
--- 675,698 ----
message_add(flags, posted, duration, from, message);
}
! return 0;
}
! static int
! global_saxdb_write(struct saxdb_context *ctx)
{
struct globalMessage *message;
+ char str[16];
! for(message = messageList; message; message = message->next) {
! snprintf(str, sizeof(str), "%li", message->id);
! saxdb_start_record(ctx, str, 0);
! saxdb_write_int(ctx, KEY_FLAGS, message->flags);
! saxdb_write_int(ctx, KEY_POSTED, message->posted);
! saxdb_write_int(ctx, KEY_DURATION, message->duration);
! saxdb_write_string(ctx, KEY_FROM, message->from);
! saxdb_write_string(ctx, KEY_MESSAGE, message->message);
! saxdb_end_record(ctx);
}
! return 0;
}
***************
*** 774,785 ****
modcmd_register(global_module, "REMOVE", cmd_remove, 2, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL);
modcmd_register(global_module, "VERSION", cmd_version, 1, 0, NULL);
- modcmd_register(global_module, "WRITE", cmd_write, 1, 0, "flags", "+oper", NULL);
- global_db_read();
global_service = service_register(global, 0);
!
! if(global_conf.db_backup_frequency) timeq_add(now + global_conf.db_backup_frequency, global_timed_write, NULL);
!
! reg_db_write_func(global_db_write);
reg_exit_func(global_db_cleanup);
}
--- 720,726 ----
modcmd_register(global_module, "REMOVE", cmd_remove, 2, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL);
modcmd_register(global_module, "VERSION", cmd_version, 1, 0, NULL);
global_service = service_register(global, 0);
! saxdb_register("Global", global_saxdb_read, global_saxdb_write);
reg_exit_func(global_db_cleanup);
}
Index: helpserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/helpserv.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -r1.25 -r1.26
*** helpserv.c 15 Aug 2002 02:49:26 -0000 1.25
--- helpserv.c 18 Aug 2002 05:50:23 -0000 1.26
***************
*** 56,65 ****
#include "opserv.h"
#include "policer.h"
#include "timeq.h"
#define HELPSERV_CONF_NAME "services/helpserv"
-
- #define HELPSERV_DB_NAME "helpserv.db"
- #define TEMP_DB_NAME "helpserv.db.new"
#define HELPSERV_HELPFILE_NAME "helpserv.help"
--- 56,63 ----
#include "opserv.h"
#include "policer.h"
+ #include "saxdb.h"
#include "timeq.h"
#define HELPSERV_CONF_NAME "services/helpserv"
#define HELPSERV_HELPFILE_NAME "helpserv.help"
***************
*** 483,487 ****
struct helpfile *helpserv_helpfile;
- static time_t lastwrite;
static dict_t helpserv_func_dict;
static dict_t helpserv_option_dict;
--- 481,484 ----
***************
*** 2555,2606 ****
static int user_write_helper(const char *key, void *data, void *extra) {
- dict_t db = alloc_object();
- dict_t stats_db = alloc_object();
- dict_t users_db = extra;
struct helpserv_user *hs_user = data;
! struct string_list *strlist;
! char str[12];
! int i;
!
! dict_insert(users_db, key, alloc_record_data_object(db));
!
! dict_insert(db, KEY_HELPER_LEVEL, alloc_record_data_qstring(helpserv_level2str(hs_user->level)));
! dict_insert(db, KEY_HELPER_HELPMODE, alloc_record_data_qstring((hs_user->help_mode ? "1" : "0")));
! dict_insert(db, KEY_HELPER_STATS, alloc_record_data_object(stats_db));
! /* Stats */
! strlist = alloc_string_list(4);
! for (i=0; i < 4; i++) {
unsigned int week_time = hs_user->time_per_week[i];
if ((i==0) && hs_user->join_time) week_time += now - hs_user->join_time;
! sprintf(str, "%u", week_time);
! string_list_append(strlist, strdup(str));
! }
! dict_insert(stats_db, KEY_HELPER_STATS_TIME, alloc_record_data_string_list(strlist));
! strlist = alloc_string_list(2);
! for (i=0; i < 2; i++) {
! sprintf(str, "%u", hs_user->picked_up[i]);
! string_list_append(strlist, strdup(str));
! }
! dict_insert(stats_db, KEY_HELPER_STATS_PICKUP, alloc_record_data_string_list(strlist));
! strlist = alloc_string_list(2);
! for (i=0; i < 2; i++) {
! sprintf(str, "%u", hs_user->closed[i]);
! string_list_append(strlist, strdup(str));
! }
! dict_insert(stats_db, KEY_HELPER_STATS_CLOSE, alloc_record_data_string_list(strlist));
! strlist = alloc_string_list(2);
! for (i=0; i < 2; i++) {
! sprintf(str, "%u", hs_user->reassigned_from[i]);
! string_list_append(strlist, strdup(str));
! }
! dict_insert(stats_db, KEY_HELPER_STATS_REASSIGNFROM, alloc_record_data_string_list(strlist));
! strlist = alloc_string_list(2);
! for (i=0; i < 2; i++) {
! sprintf(str, "%u", hs_user->reassigned_to[i]);
! string_list_append(strlist, strdup(str));
}
! dict_insert(stats_db, KEY_HELPER_STATS_REASSIGNTO, alloc_record_data_string_list(strlist));
!
return 0;
}
--- 2552,2596 ----
static int user_write_helper(const char *key, void *data, void *extra) {
struct helpserv_user *hs_user = data;
! struct saxdb_context *ctx = extra;
! struct string_list strlist;
! char str[4][16], *strs[4];
! unsigned int i;
! saxdb_start_record(ctx, key, 0);
! /* Helper identification. */
! saxdb_write_string(ctx, KEY_HELPER_LEVEL, helpserv_level2str(hs_user->level));
! saxdb_write_string(ctx, KEY_HELPER_HELPMODE, (hs_user->help_mode ? "1" : "0"));
! /* Helper stats */
! saxdb_start_record(ctx, KEY_HELPER_STATS, 0);
! for (i=0; i < ArrayLength(strs); ++i) strs[i] = str[i];
! strlist.list = strs;
! /* Time in help channel */
! strlist.used = 4;
! for (i=0; i < strlist.used; i++) {
unsigned int week_time = hs_user->time_per_week[i];
if ((i==0) && hs_user->join_time) week_time += now - hs_user->join_time;
! sprintf(str[i], "%u", week_time);
}
! saxdb_write_string_list(ctx, KEY_HELPER_STATS_TIME, &strlist);
! /* Requests picked up */
! strlist.used = 2;
! for (i=0; i < strlist.used; i++) sprintf(str[i], "%u", hs_user->picked_up[i]);
! saxdb_write_string_list(ctx, KEY_HELPER_STATS_PICKUP, &strlist);
! /* Requests closed */
! strlist.used = 2;
! for (i=0; i < strlist.used; i++) sprintf(str[i], "%u", hs_user->closed[i]);
! saxdb_write_string_list(ctx, KEY_HELPER_STATS_CLOSE, &strlist);
! /* Requests reassigned from user */
! strlist.used = 2;
! for (i=0; i < strlist.used; i++) sprintf(str[i], "%u", hs_user->reassigned_from[i]);
! saxdb_write_string_list(ctx, KEY_HELPER_STATS_REASSIGNFROM, &strlist);
! /* Requests reassigned to user */
! strlist.used = 2;
! for (i=0; i < 2; i++) sprintf(str[i], "%u", hs_user->reassigned_to[i]);
! saxdb_write_string_list(ctx, KEY_HELPER_STATS_REASSIGNTO, &strlist);
! /* End of stats and whole record. */
! saxdb_end_record(ctx);
! saxdb_end_record(ctx);
return 0;
}
***************
*** 2663,2683 ****
static int request_write_helper(const char *key, void *data, void *extra) {
- dict_t db = alloc_object();
- dict_t requests_db = extra;
struct helpserv_request *request = data;
! char str[12];
!
! if (!request->handle) {
! return 0;
! }
!
! dict_insert(requests_db, key, alloc_record_data_object(db));
! if (request->helper) dict_insert(db, KEY_REQUEST_HELPER, alloc_record_data_qstring(request->helper->handle->handle));
! dict_insert(db, KEY_REQUEST_HANDLE, alloc_record_data_qstring(request->handle->handle));
! sprintf(str, FMT_TIME_T, request->opened);
! dict_insert(db, KEY_REQUEST_OPENED, alloc_record_data_qstring(str));
! dict_insert(db, KEY_REQUEST_TEXT, alloc_record_data_string_list(string_list_copy(request->text)));
return 0;
}
--- 2653,2667 ----
static int request_write_helper(const char *key, void *data, void *extra) {
struct helpserv_request *request = data;
! struct saxdb_context *ctx = extra;
! if (!request->handle) return 0;
+ saxdb_start_record(ctx, key, 0);
+ if (request->helper) saxdb_write_string(ctx, KEY_REQUEST_HELPER, request->helper->handle->handle);
+ saxdb_write_string(ctx, KEY_REQUEST_HANDLE, request->handle->handle);
+ saxdb_write_int(ctx, KEY_REQUEST_OPENED, request->opened);
+ saxdb_write_string_list(ctx, KEY_REQUEST_TEXT, request->text);
+ saxdb_end_record(ctx);
return 0;
}
***************
*** 2756,2766 ****
}
! static int helpserv_bot_write(const char *key, void *data, void *extra) {
! dict_t users = alloc_object();
! dict_t requests = alloc_object();
! dict_t db = alloc_object();
! dict_t bots_db = extra;
const struct helpserv_bot *hs = data;
! char str[12];
enum page_source pagesrc;
enum message_type msgtype;
--- 2740,2747 ----
}
! static int
! helpserv_bot_write(const char *key, void *data, void *extra) {
const struct helpserv_bot *hs = data;
! struct saxdb_context *ctx = extra;
enum page_source pagesrc;
enum message_type msgtype;
***************
*** 2769,2783 ****
struct string_list *slist;
! dict_insert(bots_db, key, alloc_record_data_object(db));
! dict_insert(db, KEY_HELPERS, alloc_record_data_object(users));
! dict_foreach(hs->users, user_write_helper, users);
! dict_insert(db, KEY_REQUESTS, alloc_record_data_object(requests));
if (hs->persist_types[PERSIST_T_REQUEST] == PERSIST_CLOSE) {
! dict_foreach(hs->requests, request_write_helper, requests);
}
! dict_insert(db, KEY_HELP_CHANNEL, alloc_record_data_qstring(hs->helpchan->name));
slist = alloc_string_list(PGSRC_COUNT);
for (pagesrc=0; pagesrc<PGSRC_COUNT; pagesrc++) {
--- 2750,2770 ----
struct string_list *slist;
! /* Entire bot */
! saxdb_start_record(ctx, key, 1);
! /* Helper list */
! saxdb_start_record(ctx, KEY_HELPERS, 1);
! dict_foreach(hs->users, user_write_helper, ctx);
! saxdb_end_record(ctx);
! /* Open requests */
if (hs->persist_types[PERSIST_T_REQUEST] == PERSIST_CLOSE) {
! saxdb_start_record(ctx, KEY_REQUESTS, 0);
! dict_foreach(hs->requests, request_write_helper, ctx);
! saxdb_end_record(ctx);
}
! /* Other settings and state */
! saxdb_write_string(ctx, KEY_HELP_CHANNEL, hs->helpchan->name);
slist = alloc_string_list(PGSRC_COUNT);
for (pagesrc=0; pagesrc<PGSRC_COUNT; pagesrc++) {
***************
*** 2785,2815 ****
string_list_append(slist, strdup(target ? target->name : "*"));
}
! dict_insert(db, KEY_PAGE_DEST, alloc_record_data_string_list(slist));
for (pagesrc=0; pagesrc<PGSRC_COUNT; pagesrc++) {
const char *src = page_type_names[hs->page_types[pagesrc]];
! dict_insert(db, page_source_names[pagesrc], alloc_record_data_qstring(src));
}
for (msgtype=0; msgtype<MSGTYPE_COUNT; msgtype++) {
const char *msg = hs->messages[msgtype];
! if (msg) dict_insert(db, message_type_names[msgtype], alloc_record_data_qstring(msg));
}
for (inttype=0; inttype<INTERVAL_COUNT; inttype++) {
if (!hs->intervals[inttype]) continue;
! snprintf(str, sizeof(str), "%lu", hs->intervals[inttype]);
! dict_insert(db, interval_type_names[inttype], alloc_record_data_qstring(str));
}
for (persisttype=0; persisttype<PERSIST_T_COUNT; persisttype++) {
const char *persist = persistence_length_names[hs->persist_types[persisttype]];
! dict_insert(db, persistence_type_names[persisttype], alloc_record_data_qstring(persist));
}
! dict_insert(db, KEY_NOTIFICATION, alloc_record_data_qstring(notification_type_names[hs->notify]));
! snprintf(str, 12, FMT_TIME_T, hs->registered);
! dict_insert(db, KEY_REGISTERED, alloc_record_data_qstring(str));
! if (hs->registrar) dict_insert(db, KEY_REGISTRAR, alloc_record_data_qstring(hs->registrar));
! snprintf(str, 12, "%lu", hs->id_wrap);
! dict_insert(db, KEY_IDWRAP, alloc_record_data_qstring(str));
! snprintf(str, 12, "%lu", hs->last_requestid);
! dict_insert(db, KEY_LAST_REQUESTID, alloc_record_data_qstring(str));
return 0;
}
--- 2772,2809 ----
string_list_append(slist, strdup(target ? target->name : "*"));
}
! saxdb_write_string_list(ctx, KEY_PAGE_DEST, slist);
for (pagesrc=0; pagesrc<PGSRC_COUNT; pagesrc++) {
const char *src = page_type_names[hs->page_types[pagesrc]];
! saxdb_write_string(ctx, page_source_names[pagesrc], src);
}
for (msgtype=0; msgtype<MSGTYPE_COUNT; msgtype++) {
const char *msg = hs->messages[msgtype];
! if (msg) saxdb_write_string(ctx, message_type_names[msgtype], msg);
}
for (inttype=0; inttype<INTERVAL_COUNT; inttype++) {
if (!hs->intervals[inttype]) continue;
! saxdb_write_int(ctx, interval_type_names[inttype], hs->intervals[inttype]);
}
for (persisttype=0; persisttype<PERSIST_T_COUNT; persisttype++) {
const char *persist = persistence_length_names[hs->persist_types[persisttype]];
! saxdb_write_string(ctx, persistence_type_names[persisttype], persist);
}
! saxdb_write_string(ctx, KEY_NOTIFICATION, notification_type_names[hs->notify]);
! saxdb_write_int(ctx, KEY_REGISTERED, hs->registered);
! saxdb_write_int(ctx, KEY_IDWRAP, hs->id_wrap);
! saxdb_write_int(ctx, KEY_LAST_REQUESTID, hs->last_requestid);
! if (hs->registrar) saxdb_write_string(ctx, KEY_REGISTRAR, hs->registrar);
+ /* End bot record */
+ saxdb_end_record(ctx);
+ return 0;
+ }
+
+ static int
+ helpserv_saxdb_write(struct saxdb_context *ctx) {
+ saxdb_start_record(ctx, KEY_BOTS, 1);
+ dict_foreach(helpserv_bots_dict, helpserv_bot_write, ctx);
+ saxdb_end_record(ctx);
+ saxdb_write_int(ctx, KEY_LAST_STATS_UPDATE, last_stats_update);
return 0;
}
***************
*** 2901,2948 ****
requests = database_get_data(GET_RECORD_OBJECT(br), KEY_REQUESTS, RECDB_OBJECT);
! if (requests) {
! dict_foreach(requests, request_read_helper, hs);
! }
return 0;
}
! static void helpserv_db_write(void) {
! FILE *f;
! char str[12];
!
! dict_t db = alloc_database(), subdb = alloc_object();
!
! dict_foreach(helpserv_bots_dict, helpserv_bot_write, subdb);
! dict_insert(db, KEY_BOTS, alloc_record_data_object(subdb));
!
! sprintf(str, FMT_TIME_T, last_stats_update);
! dict_insert(db, KEY_LAST_STATS_UPDATE, alloc_record_data_qstring(str));
!
! /* now write the entire database */
! f = fopen(TEMP_DB_NAME, "w+");
! write_database(f, db);
! fclose(f);
! free_database(db);
! if (rename(TEMP_DB_NAME, HELPSERV_DB_NAME) == -1) {
! log(NS_LOG, LOG_ERROR, "unable to rename new db to old: %s\n", strerror(errno));
! }
! lastwrite = now;
! }
!
! static void helpserv_timed_write(void *data) {
! (void)data;
!
! helpserv_db_write();
! log(HS_LOG, LOG_INFO, "Successfully made scheduled backup of HelpServ database.\n");
! timeq_add(now + helpserv_conf.db_backup_frequency, helpserv_timed_write, NULL);
! }
!
! static void helpserv_db_read(void) {
! dict_t conf_db, object;
char *str;
- conf_db = parse_database(HELPSERV_DB_NAME);
- if (!conf_db) return;
if ((object = database_get_data(conf_db, KEY_BOTS, RECDB_OBJECT))) {
dict_foreach(object, helpserv_bot_read, NULL);
--- 2895,2908 ----
requests = database_get_data(GET_RECORD_OBJECT(br), KEY_REQUESTS, RECDB_OBJECT);
! if (requests) dict_foreach(requests, request_read_helper, hs);
return 0;
}
! static int
! helpserv_saxdb_read(struct dict *conf_db) {
! dict_t object;
char *str;
if ((object = database_get_data(conf_db, KEY_BOTS, RECDB_OBJECT))) {
dict_foreach(object, helpserv_bot_read, NULL);
***************
*** 2950,2976 ****
str = database_get_data(conf_db, KEY_LAST_STATS_UPDATE, RECDB_QSTRING);
! if (str) last_stats_update = TIME_T_CAST strtol(str, NULL, 0);
! else last_stats_update = now;
!
! free_database(conf_db);
! }
!
! static HELPSERV_FUNC(cmd_write) {
! struct timeval start, stop;
!
! (void)argc; (void)argv;
!
! gettimeofday(&start, NULL);
! helpserv_db_write();
! gettimeofday(&stop, NULL);
! stop.tv_sec -= start.tv_sec;
! stop.tv_usec -= start.tv_usec;
! if (stop.tv_usec < 0) {
! stop.tv_sec -= 1;
! stop.tv_usec += 1000000;
! }
! helpserv_notice(user, HSMSG_WRITE_SUCCESS, stop.tv_sec, stop.tv_usec/1000);
!
! return 1;
}
--- 2910,2915 ----
str = database_get_data(conf_db, KEY_LAST_STATS_UPDATE, RECDB_QSTRING);
! last_stats_update = str ? (time_t)strtol(str, NULL, 0) : now;
! return 0;
}
***************
*** 3712,3716 ****
helpserv_define_func("VERSION", cmd_version, HlNone, CMD_NOT_OVERRIDE|CMD_IGNORE_EVENT);
helpserv_define_func("READHELP", cmd_readhelp, HlOper, CMD_FROM_OPSERV_ONLY);
- helpserv_define_func("WRITE", cmd_write, HlOper, CMD_FROM_OPSERV_ONLY);
helpserv_define_func("REGISTER", cmd_register, HlOper, CMD_FROM_OPSERV_ONLY);
helpserv_define_func("MOVE", cmd_move, HlOper, CMD_FROM_OPSERV_ONLY|CMD_NEED_BOT);
--- 3651,3654 ----
***************
*** 3753,3763 ****
dict_set_free_data(helpserv_users_byhand_dict, helpserv_userlist_free);
! helpserv_db_read();
helpserv_helpfile_read();
- if (helpserv_conf.db_backup_frequency) {
- timeq_add(now + helpserv_conf.db_backup_frequency, helpserv_timed_write, NULL);
- }
-
/* Make up for downtime... though this will only really affect the
* time_per_week */
--- 3691,3697 ----
dict_set_free_data(helpserv_users_byhand_dict, helpserv_userlist_free);
! saxdb_register("HelpServ", helpserv_saxdb_read, helpserv_saxdb_write);
helpserv_helpfile_read();
/* Make up for downtime... though this will only really affect the
* time_per_week */
***************
*** 3781,3784 ****
reg_exit_func(helpserv_db_cleanup);
- reg_db_write_func(helpserv_db_write);
}
--- 3715,3717 ----
Index: main.c
===================================================================
RCS file: /cvsroot/srvx/services/src/main.c,v
retrieving revision 1.135
retrieving revision 1.136
diff -C2 -r1.135 -r1.136
*** main.c 17 Aug 2002 14:31:15 -0000 1.135
--- main.c 18 Aug 2002 05:50:24 -0000 1.136
***************
*** 381,385 ****
log(MAIN_LOG, LOG_INFO, "%s -- writing databases.\n", strsignal(x));
#endif
! write_databases();
}
--- 381,385 ----
log(MAIN_LOG, LOG_INFO, "%s -- writing databases.\n", strsignal(x));
#endif
! saxdb_write_all();
}
***************
*** 447,477 ****
}
- static db_write_func_t *dw_list;
- static unsigned int dw_size = 0, dw_used = 0;
-
- void reg_db_write_func(db_write_func_t handler)
- {
- if (dw_used == dw_size) {
- if (dw_size) {
- dw_size <<= 1;
- dw_list = realloc(dw_list, dw_size*sizeof(db_write_func_t));
- } else {
- dw_size = 8;
- dw_list = malloc(dw_size*sizeof(db_write_func_t));
- }
- }
- dw_list[dw_used++] = handler;
- }
-
- void write_databases(void)
- {
- unsigned int n = dw_used;
-
- /* Order shouldn't matter, and this is a cut-n-paste hack job anyway. */
- while (n > 0) {
- dw_list[--n]();
- }
- }
-
int
set_policer_param(const char *param, void *data, void *extra)
--- 447,450 ----
***************
*** 599,603 ****
conf_close();
remove(PID_FILE);
- if (dw_list) free(dw_list);
policer_params_delete(god_policer_params);
policer_params_delete(oper_policer_params);
--- 572,575 ----
***************
*** 813,817 ****
/* The first exit func to be called *should* be write_databases(). */
! reg_exit_func(write_databases);
if (!replay_file) now = time(NULL);
--- 785,789 ----
/* The first exit func to be called *should* be write_databases(). */
! reg_exit_func(saxdb_write_all);
if (!replay_file) now = time(NULL);
Index: modcmd.c
===================================================================
RCS file: /cvsroot/srvx/services/src/modcmd.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -r1.17 -r1.18
*** modcmd.c 15 Aug 2002 02:49:26 -0000 1.17
--- modcmd.c 18 Aug 2002 05:50:24 -0000 1.18
***************
*** 19,29 ****
*/
- #include "modcmd.h"
#include "chanserv.h"
#include "conf.h"
#include "policer.h"
!
! #define TEMP_DB_NAME "modcmd.db.tmp"
! #define MODCMD_DB_NAME "modcmd.db"
#define MCMSG_BARE_FLAG "Flag %.*s must be preceeded by a + or -."
--- 19,27 ----
*/
#include "chanserv.h"
#include "conf.h"
+ #include "modcmd.h"
#include "policer.h"
! #include "saxdb.h"
#define MCMSG_BARE_FLAG "Flag %.*s must be preceeded by a + or -."
***************
*** 925,1024 ****
}
- static dict_t
- modcmd_db_write_command(struct svccmd *cmd) {
- dict_t obj;
- char buf[MAXLEN];
- struct modcmd *modcmd;
- unsigned int nn, len, pos;
-
- obj = alloc_database();
- modcmd = cmd->command;
- sprintf(buf, "%s.%s", modcmd->parent->name, modcmd->name);
- dict_insert(obj, "command", alloc_record_data_qstring(buf));
- if (cmd->alias.used) {
- struct string_list *slist = string_list_copy(&cmd->alias);
- dict_insert(obj, "aliased", alloc_record_data_string_list(slist));
- }
- if (cmd->min_opserv_level > 0) {
- sprintf(buf, "%u", cmd->min_opserv_level);
- dict_insert(obj, "opserv_level", alloc_record_data_qstring(buf));
- }
- if (cmd->min_channel_access > ulNone) {
- dict_insert(obj, "chanserv_level", alloc_record_data_qstring(user_level_from_level(cmd->min_channel_access)));
- }
- if (cmd->flags) {
- for (nn=pos=0; flags[nn].name; ++nn) {
- if (cmd->flags & flags[nn].flag) {
- buf[pos++] = '+';
- len = strlen(flags[nn].name);
- memcpy(buf+pos, flags[nn].name, len);
- pos += len;
- buf[pos++] = ',';
- }
- }
- buf[--pos] = 0;
- dict_insert(obj, "flags", alloc_record_data_qstring(buf));
- }
- if (cmd->req_account_flags || cmd->deny_account_flags) {
- pos = 0;
- if (cmd->req_account_flags) {
- buf[pos++] = '+';
- for (nn=0; nn<32; nn++) {
- if (cmd->req_account_flags & (1 << nn)) buf[pos++] = handle_flags[nn];
- }
- }
- if (cmd->deny_account_flags) {
- buf[pos++] = '-';
- for (nn=0; nn<32; nn++) {
- if (cmd->deny_account_flags & (1 << nn)) buf[pos++] = handle_flags[nn];
- }
- }
- buf[pos] = 0;
- dict_insert(obj, "account_flags", alloc_record_data_qstring(buf));
- }
- if (cmd->template != modcmd->defaults) {
- if (!cmd->template) {
- strcpy(buf, "*");
- } else if (cmd->template->parent == cmd->parent) {
- sprintf(buf, "%s", cmd->template->name);
- } else if (cmd->template->parent) {
- sprintf(buf, "%s.%s", cmd->template->parent->bot->nick, cmd->template->name);
- } else {
- sprintf(buf, "*%s.%s", cmd->template->command->parent->name, cmd->template->command->name);
- }
- dict_insert(obj, "template", alloc_record_data_qstring(buf));
- }
- return obj;
- }
-
- static void
- modcmd_db_write(void) {
- FILE *dbfile;
- struct service *service;
- dict_t db, db2, obj;
- dict_iterator_t it, it2;
-
- db = alloc_database();
- for (it = dict_first(services); it; it = iter_next(it)) {
- service = iter_data(it);
- db2 = alloc_database();
- for (it2 = dict_first(service->commands); it2; it2 = iter_next(it2)) {
- obj = modcmd_db_write_command(iter_data(it2));
- dict_insert(db2, iter_key(it2), alloc_record_data_object(obj));
- }
- dict_insert(db, service->bot->nick, alloc_record_data_object(db2));
- }
- db2 = alloc_database();
- dict_insert(db2, "services", alloc_record_data_object(db));
-
- dbfile = fopen(TEMP_DB_NAME, "w+");
- write_database(dbfile, db2);
- fclose(dbfile);
- if (rename(TEMP_DB_NAME, MODCMD_DB_NAME) == -1) {
- log(MAIN_LOG, LOG_ERROR, "unable to rename new modcmd db to old: %s\n", strerror(errno));
- }
- free_database(db2);
- }
-
static MODCMD_FUNC(cmd_readhelp) {
const char *modname;
--- 923,926 ----
***************
*** 1222,1225 ****
--- 1124,1200 ----
}
+ static void
+ modcmd_saxdb_write_command(struct saxdb_context *ctx, struct svccmd *cmd) {
+ char buf[MAXLEN];
+ unsigned int nn, len, pos;
+
+ saxdb_start_record(ctx, cmd->name, 0);
+ sprintf(buf, "%s.%s", cmd->command->parent->name, cmd->command->name);
+ saxdb_write_string(ctx, "command", buf);
+ if (cmd->alias.used) saxdb_write_string_list(ctx, "aliased", &cmd->alias);
+ if (cmd->min_opserv_level > 0) saxdb_write_int(ctx, "opserv_level", cmd->min_opserv_level);
+ if (cmd->min_channel_access > ulNone) saxdb_write_string(ctx, "chanserv_level", user_level_from_level(cmd->min_channel_access));
+ if (cmd->flags) {
+ for (nn=pos=0; flags[nn].name; ++nn) {
+ if (cmd->flags & flags[nn].flag) {
+ buf[pos++] = '+';
+ len = strlen(flags[nn].name);
+ memcpy(buf+pos, flags[nn].name, len);
+ pos += len;
+ buf[pos++] = ',';
+ }
+ }
+ buf[--pos] = 0;
+ saxdb_write_string(ctx, "flags", buf);
+ }
+ if (cmd->req_account_flags || cmd->deny_account_flags) {
+ pos = 0;
+ if (cmd->req_account_flags) {
+ buf[pos++] = '+';
+ for (nn=0; nn<32; nn++) {
+ if (cmd->req_account_flags & (1 << nn)) buf[pos++] = handle_flags[nn];
+ }
+ }
+ if (cmd->deny_account_flags) {
+ buf[pos++] = '-';
+ for (nn=0; nn<32; nn++) {
+ if (cmd->deny_account_flags & (1 << nn)) buf[pos++] = handle_flags[nn];
+ }
+ }
+ buf[pos] = 0;
+ saxdb_write_string(ctx, "account_flags", buf);
+ }
+ if (cmd->template != cmd->command->defaults) {
+ if (!cmd->template) {
+ strcpy(buf, "*");
+ } else if (cmd->template->parent == cmd->parent) {
+ sprintf(buf, "%s", cmd->template->name);
+ } else if (cmd->template->parent) {
+ sprintf(buf, "%s.%s", cmd->template->parent->bot->nick, cmd->template->name);
+ } else {
+ sprintf(buf, "*%s.%s", cmd->template->command->parent->name, cmd->template->command->name);
+ }
+ saxdb_write_string(ctx, "template", buf);
+ }
+ saxdb_end_record(ctx);
+ }
+
+ static int
+ modcmd_saxdb_write(struct saxdb_context *ctx) {
+ dict_iterator_t it, it2;
+
+ saxdb_start_record(ctx, "services", 1);
+ for (it = dict_first(services); it; it = iter_next(it)) {
+ struct service *service = iter_data(it);
+ saxdb_start_record(ctx, service->bot->nick, 1);
+ for (it2 = dict_first(service->commands); it2; it2 = iter_next(it2)) {
+ modcmd_saxdb_write_command(ctx, iter_data(it2));
+ }
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+ return 0;
+ }
+
void
modcmd_init(void) {
***************
*** 1333,1443 ****
}
! void
! modcmd_finalize(void) {
! dict_t db, db2;
dict_iterator_t it, it2;
struct record_data *rd, *rd2;
struct service *service;
- struct module *module;
- struct svccmd *svccmd;
! /* Look for the current modcmd.db; if it's missing, use some defaults */
! if ((db = parse_database(MODCMD_DB_NAME))) {
! if ((db2 = database_get_data(db, "services", RECDB_OBJECT))) {
! for (it = dict_first(db2); it; it = iter_next(it)) {
! rd = iter_data(it);
! if (rd->type != RECDB_OBJECT) {
! log(MAIN_LOG, LOG_ERROR, "Bad type for 'services/%s' in modcmd.db (expected object)\n", iter_key(it));
! continue;
! }
! if (!(service = service_find(iter_key(it)))) {
! log(MAIN_LOG, LOG_ERROR, "Unknown service '%s' listed in modcmd.db\n", iter_key(it));
! continue;
! }
! for (it2 = dict_first(rd->d.object); it2; it2 = iter_next(it2)) {
! rd2 = iter_data(it2);
! if (rd2->type != RECDB_OBJECT) {
! log(MAIN_LOG, LOG_ERROR, "Bad type for 'services/%s/%s' in modcmd.db (expected object)\n", iter_key(it), iter_key(it2));
! continue;
! }
! modcmd_db_load_command(service, iter_key(it2), rd2->d.object);
! }
! }
! } else {
! log(MAIN_LOG, LOG_ERROR, "Missing section 'services' in modcmd.db\n");
}
! dict_delete(db);
! } else {
! /* Which services should import which modules by default? */
! struct {
! const char *svcname;
! /* C is lame and requires a fixed size for this array.
! * Be sure you NULL-terminate each array and increment the
! * size here if you add more default modules to any
! * service. */
! const char *modnames[4];
! } def_binds[] = {
! { "ChanServ", { "ChanServ", NULL } },
! { "Global", { "Global", N...
[truncated message content] |