]>
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"
15 #include "noperserv.h"
16 #include "noperserv_psql.h"
17 #include "noperserv_db.h"
23 int odb_connected
= 0; /* seperate from the db one */
24 unsigned long loadedusers
= 0;
26 unsigned long lastuserid
;
28 no_autheduser
*authedusers
= NULL
;
30 void noperserv_free_user(no_autheduser
*au
);
31 void noperserv_load_users(PGconn
*dbconn
, 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
);
38 void noperserv_create_tables(void);
40 void noperserv_load_db(void) {
43 noperserv_cleanup_db();
45 if(noperserv_connect_db(&noperserv_create_tables
)) {
46 Error("noperserv", ERR_ERROR
, "Unable to connect to database!");
55 noperserv_async_query(noperserv_load_users
, NULL
,
56 "SELECT ID, authname, flags, noticelevel FROM users");
59 void noperserv_load_users(PGconn
*dbconn
, void *arg
) {
60 PGresult
*pgres
= PQgetResult(dbconn
);
65 if(PQresultStatus(pgres
) != PGRES_TUPLES_OK
) {
66 Error("noperserv", ERR_ERROR
, "Error loading user list.");
70 rows
= PQntuples(pgres
);
74 nu
= noperserv_new_autheduser(PQgetvalue(pgres
, i
, 1));
78 nu
->id
= strtoul(PQgetvalue(pgres
, i
, 0), NULL
, 10);
79 nu
->authlevel
= strtoul(PQgetvalue(pgres
, i
, 2), NULL
, 10);
80 nu
->noticelevel
= strtoul(PQgetvalue(pgres
, i
, 3), NULL
, 10);
82 if(nu
->id
> lastuserid
)
86 Error("noperserv", ERR_INFO
, "Loaded %d users", loadedusers
);
88 for(i
=0;i
<NICKHASHSIZE
;i
++)
89 for(np
=nicktable
[i
];np
;np
=np
->next
)
91 noperserv_check_nick(np
);
93 registerhook(HOOK_NICK_ACCOUNT
, &noperserv_nick_account
);
94 registerhook(HOOK_NICK_NEWNICK
, &noperserv_nick_account
);
95 registerhook(HOOK_NICK_LOSTNICK
, &noperserv_quit_account
);
98 void noperserv_create_tables(void) {
100 "CREATE TABLE users ("
102 "authname VARCHAR(%d) NOT NULL,"
103 "flags INT NOT NULL,"
104 "noticelevel INT NOT NULL,"
105 "PRIMARY KEY (ID))", ACCOUNTLEN
);
108 void noperserv_cleanup_db(void) {
109 no_autheduser
*ap
, *np
;
111 deregisterhook(HOOK_NICK_LOSTNICK
, &noperserv_quit_account
);
112 deregisterhook(HOOK_NICK_NEWNICK
, &noperserv_nick_account
);
113 deregisterhook(HOOK_NICK_ACCOUNT
, &noperserv_nick_account
);
118 noperserv_free_user(ap
);
123 if(!dontclose
&& odb_connected
)
124 noperserv_disconnect_db();
129 no_autheduser
*noperserv_new_autheduser(char *authname
) {
130 no_autheduser
*au
= (no_autheduser
*)malloc(sizeof(no_autheduser
));
134 au
->authname
= getsstring(authname
, ACCOUNTLEN
);
144 au
->next
= authedusers
;
150 void noperserv_delete_autheduser(no_autheduser
*au
) {
151 no_autheduser
*ap
= authedusers
, *lp
= NULL
;
154 noperserv_query("DELETE FROM users WHERE id = %d", au
->id
);
156 for(;ap
;lp
=ap
,ap
=ap
->next
) {
161 authedusers
= ap
->next
;
163 noperserv_free_user(ap
);
169 void noperserv_update_autheduser(no_autheduser
*au
) {
171 char escapedauthname
[ACCOUNTLEN
* 2 + 1];
172 PQescapeString(escapedauthname
, au
->authname
->content
, au
->authname
->length
);
173 noperserv_query("INSERT INTO users (id, authname, flags, noticelevel) VALUES (%lu,'%s',%lu,%lu)", au
->id
, au
->authname
->content
, NOGetAuthLevel(au
), NOGetNoticeLevel(au
));
176 noperserv_query("UPDATE users SET flags = %lu, noticelevel = %lu WHERE id = %lu", NOGetAuthLevel(au
), NOGetNoticeLevel(au
), au
->id
);
180 void noperserv_free_user(no_autheduser
*au
) {
181 no_nicklist
*cp
= au
->nick
, *np
;
184 cp
->nick
->exts
[noperserv_ext
] = NULL
;
190 freesstring(au
->authname
);
196 void noperserv_check_nick(nick
*np
) {
197 no_autheduser
*au
= noperserv_get_autheduser(np
->authname
);
199 noperserv_add_to_autheduser(np
, au
);
202 void noperserv_nick_account(int hooknum
, void *arg
) {
203 noperserv_check_nick((nick
*)arg
);
206 void noperserv_quit_account(int hooknum
, void *arg
) {
207 nick
*np
= (void *)arg
;
208 no_autheduser
*au
= NOGetAuthedUser(np
);
209 no_nicklist
*nl
, *ln
= NULL
;
213 for(nl
=au
->nick
;nl
;ln
=nl
,nl
=nl
->next
)
225 no_autheduser
*noperserv_get_autheduser(char *authname
) {
226 no_autheduser
*au
= authedusers
;
229 if(!ircd_strcmp(authname
, au
->authname
->content
))
235 unsigned long noperserv_get_autheduser_count(void) {
239 unsigned long noperserv_next_autheduser_id(void) {
243 void noperserv_add_to_autheduser(nick
*np
, no_autheduser
*au
) {
244 no_nicklist
*nl
= (no_nicklist
*)malloc(sizeof(no_nicklist
));
248 np
->exts
[noperserv_ext
] = au
;
256 void nopserserv_delete_from_autheduser(nick
*np
, no_autheduser
*au
) {
257 no_nicklist
*cp
= au
->nick
, *lp
= NULL
;
259 for(;cp
;lp
=cp
,cp
=cp
->next
)