]>
jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_db.c
4 * A replacement for Germania's ageing Operservice2
7 * Copyright (C) 2005 Chris Porter.
10 #include "../nick/nick.h"
11 #include "../core/error.h"
12 #include "../lib/irc_string.h"
13 #include "../core/schedule.h"
14 #include "../dbapi2/dbapi2.h"
16 #include "noperserv.h"
17 #include "noperserv_db.h"
22 unsigned long loadedusers
= 0;
24 unsigned long lastuserid
;
26 no_autheduser
*authedusers
= NULL
;
28 void noperserv_create_tables(void);
30 void noperserv_free_user(no_autheduser
*au
);
31 void noperserv_load_users(const DBAPIResult
*res
, void *arg
);
33 void noperserv_check_nick(nick
*np
);
34 void noperserv_nick_account(int hooknum
, void *arg
);
35 void noperserv_quit_account(int hooknum
, void *arg
);
37 void nopserserv_delete_from_autheduser(nick
*np
, no_autheduser
*au
);
39 static DBAPIConn
*nodb
;
41 int noperserv_load_db(void) {
43 nodb
= dbapi2open(DBAPI2_DEFAULT
, "noperserv");
45 Error("noperserv", ERR_STOP
, "Could not connect to database.");
54 noperserv_create_tables();
56 nodb
->query(nodb
, noperserv_load_users
, NULL
,
57 "SELECT ID, authname, flags, noticelevel FROM ?", "T", "users");
62 void noperserv_load_users(const DBAPIResult
*res
, void *arg
) {
71 Error("noperserv", ERR_ERROR
, "Error loading user list.");
78 while(res
->next(res
)) {
79 nu
= noperserv_new_autheduser(res
->get(res
, 1));
83 nu
->id
= strtoul(res
->get(res
, 0), NULL
, 10);
84 nu
->authlevel
= strtoul(res
->get(res
, 2), NULL
, 10);
85 nu
->noticelevel
= strtoul(res
->get(res
, 3), NULL
, 10);
87 if(nu
->id
> lastuserid
)
91 Error("noperserv", ERR_INFO
, "Loaded %lu users", loadedusers
);
93 for(i
=0;i
<NICKHASHSIZE
;i
++)
94 for(np
=nicktable
[i
];np
;np
=np
->next
)
96 noperserv_check_nick(np
);
98 registerhook(HOOK_NICK_ACCOUNT
, &noperserv_nick_account
);
99 registerhook(HOOK_NICK_NEWNICK
, &noperserv_nick_account
);
100 registerhook(HOOK_NICK_LOSTNICK
, &noperserv_quit_account
);
105 void noperserv_create_tables(void) {
106 nodb
->createtable(nodb
, NULL
, NULL
,
109 "authname VARCHAR(?) NOT NULL,"
110 "flags INT NOT NULL,"
111 "noticelevel INT NOT NULL,"
112 "PRIMARY KEY (ID))", "Td", "users", ACCOUNTLEN
);
115 void noperserv_cleanup_db(void) {
116 no_autheduser
*ap
, *np
;
118 deregisterhook(HOOK_NICK_LOSTNICK
, &noperserv_quit_account
);
119 deregisterhook(HOOK_NICK_NEWNICK
, &noperserv_nick_account
);
120 deregisterhook(HOOK_NICK_ACCOUNT
, &noperserv_nick_account
);
125 noperserv_free_user(ap
);
133 no_autheduser
*noperserv_new_autheduser(char *authname
) {
134 no_autheduser
*au
= (no_autheduser
*)malloc(sizeof(no_autheduser
));
138 au
->authname
= getsstring(authname
, ACCOUNTLEN
);
148 au
->next
= authedusers
;
154 void noperserv_delete_autheduser(no_autheduser
*au
) {
155 no_autheduser
*ap
= authedusers
, *lp
= NULL
;
158 nodb
->squery(nodb
, "DELETE FROM ? WHERE id = ?", "Tu", "users", au
->id
);
160 for(;ap
;lp
=ap
,ap
=ap
->next
) {
165 authedusers
= ap
->next
;
167 noperserv_free_user(ap
);
173 void noperserv_update_autheduser(no_autheduser
*au
) {
175 nodb
->squery(nodb
, "INSERT INTO ? (id, authname, flags, noticelevel) VALUES (?,?,?,?)", "Tusuu", "users", au
->id
, au
->authname
->content
, NOGetAuthLevel(au
), NOGetNoticeLevel(au
));
178 nodb
->squery(nodb
, "UPDATE ? SET flags = ?, noticelevel = ? WHERE id = ?", "Tuuu", "users", NOGetAuthLevel(au
), NOGetNoticeLevel(au
), au
->id
);
182 void noperserv_free_user(no_autheduser
*au
) {
183 no_nicklist
*cp
= au
->nick
, *np
;
186 cp
->nick
->exts
[noperserv_ext
] = NULL
;
192 freesstring(au
->authname
);
198 void noperserv_check_nick(nick
*np
) {
199 no_autheduser
*au
= noperserv_get_autheduser(np
->authname
);
201 noperserv_add_to_autheduser(np
, au
);
204 void noperserv_nick_account(int hooknum
, void *arg
) {
205 noperserv_check_nick((nick
*)arg
);
208 void noperserv_quit_account(int hooknum
, void *arg
) {
209 nick
*np
= (void *)arg
;
210 no_autheduser
*au
= NOGetAuthedUser(np
);
211 no_nicklist
*nl
, *ln
= NULL
;
215 for(nl
=au
->nick
;nl
;ln
=nl
,nl
=nl
->next
)
227 no_autheduser
*noperserv_get_autheduser(char *authname
) {
228 no_autheduser
*au
= authedusers
;
231 if(!ircd_strcmp(authname
, au
->authname
->content
))
237 unsigned long noperserv_get_autheduser_count(void) {
241 unsigned long noperserv_next_autheduser_id(void) {
245 void noperserv_add_to_autheduser(nick
*np
, no_autheduser
*au
) {
246 no_nicklist
*nl
= (no_nicklist
*)malloc(sizeof(no_nicklist
));
250 np
->exts
[noperserv_ext
] = au
;
258 void nopserserv_delete_from_autheduser(nick
*np
, no_autheduser
*au
) {
259 no_nicklist
*cp
= au
->nick
, *lp
= NULL
;
261 for(;cp
;lp
=cp
,cp
=cp
->next
)