Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.28 - (show annotations) (download) (as text)
Tue Dec 14 12:02:08 2004 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.27: +315 -218 lines
File MIME type: text/x-c++src
__WIN__を定義したときはwindowsのdll作成に必要な処理を行なう.
USE_SYSLOGを定義したときはsyslogdへメッセージを出力する.
getAccounts: uidsLenが0のときの処理を追加した.

1 /*
2 *
3 * $Revision: 1.27 $
4 * $Log: commonal.cc,v $
5 * Revision 1.27 2004/12/06 11:34:47 aga
6 * ??ninitializeDB()??菴遵??.
7 *
8 * Revision 1.26 2004/12/06 10:17:36 youi
9 * mysql_use_result????腟?????罧??????????冴??????鐚?
10 * while( row = mysql_fetch_row(result) );???水?ワ?
11 *
12 * Revision 1.25 2004/12/06 07:24:33 youi
13 * insertAccount, insertGroup:
14 * ?域?菴遵?????????宴???綽????????若??D鐚??違???若??ID??膃??綣??違???吾??莨若??.
15 *
16 * Revision 1.24 2004/12/06 01:45:50 aga
17 * ?祉?潟?<?潟???ゃ??.
18 * ?脂???上???篆??.
19 *
20 * Revision 1.23 2004/12/04 09:21:10 aga
21 * ??p_config ?? vpaccount_config.
22 *
23 * Revision 1.22 2004/12/03 07:17:21 youi
24 * isModerator?с?≪???祉?鴻???????若?帥???若?鴻???若????????篆??.
25 *
26 * Revision 1.21 2004/12/01 10:28:58 youi
27 * DB????????????眼??軸??篆??
28 * institute -> division
29 * organizaion -> company_name
30 *
31 * Revision 1.20 2004/12/01 04:37:04 youi
32 * freeResult: unsigned int* ?? int* ?娯信罩?
33 * ?潟?<?潟???????∽?違???????菴処?.
34 *
35 * Revision 1.19 2004/11/30 06:40:11 youi
36 * ?∽?違??菴遵??(gidExists, uidExists)
37 * getGroupCount??絎?臂?
38 * getGroupsByUid??絎?臂?
39 * isGroupAdmin??篆??.
40 * dumpGroupAdmins??絎?臂?
41 * deleteMember??絎?臂?
42 * insertMember??絎?臂?
43 * getMembers??絎?臂?
44 * isModerator??絎?臂?
45 *
46 * Revision 1.18 2004/11/30 05:46:32 aga
47 * ??ession????remoteHost??????
48 *
49 * Revision 1.17 2004/11/27 09:35:49 youi
50 * isActivated??絎?臂?
51 * activate??絎?臂?
52 * dumpUid??絎?臂?
53 *
54 * Revision 1.16 2004/11/27 06:29:29 youi
55 * getAccountCount??絎?臂?
56 * dumpGids??絎?臂?
57 * insertGroup, deleteGroup, updateGroup??絎?臂?
58 * getGroup, getGroups??絎?臂?
59 * ???若?帥???若?劫?????????弱?冴?????鐚?RES_DB_NOT_INITIALIZED??菴????????????∽?違??申??
60 * (???綽????∽?違??罧??c??????)
61 *
62 * Revision 1.15 2004/11/27 02:22:22 aga
63 * ??nitializeDB????ddSlashes()???若?吟???純?<??????篆??.
64 *
65 * Revision 1.14 2004/11/27 01:07:31 youi
66 * criteria2str: LIMIT??RDER BY?????????ャ???帥????.
67 *
68 * Revision 1.13 2004/11/27 00:35:39 youi
69 * getAccounts??絎?臂?
70 * getAccount??篆??鐚???????etAccounts???若?喝?冴??.
71 * criteria2str??絎?臂?
72 *
73 * Revision 1.12 2004/11/26 09:45:28 youi
74 * getAccount??絎?臂?
75 *
76 * Revision 1.11 2004/11/26 08:16:26 aga
77 * ??etSession, loginUser, createSession, freeResult(const session_t*) 篆??.
78 *
79 * Revision 1.10 2004/11/26 07:57:42 youi
80 * updateAccount, deleteAccount??絎?臂?
81 * mysql_query紊掩??????tderr?吾?????若?潟?若?????????若?<???祉?若?吾???阪??.
82 *
83 * Revision 1.9 2004/11/26 07:38:02 aga
84 * ??AILUE -> FAILURE.
85 *
86 * Revision 1.8 2004/11/26 06:36:55 aga
87 * ??reateSession, getSession ??篏???.
88 *
89 * Revision 1.7 2004/11/26 04:51:47 youi
90 * dbprefix??絎?臂?????.
91 * insertAccount??絎?臂?????.
92 * isValidSessionID??絎?臂?????.
93 *
94 * Revision 1.6 2004/11/26 04:35:55 aga
95 * ??oginUser(), logoutUser()??篏???.
96 *
97 * Revision 1.5 2004/11/26 01:08:25 aga
98 * ??ddSlashes()篏???.
99 *
100 * Revision 1.4 2004/11/25 12:14:29 youi
101 * getUid????????絎?臂?????.
102 *
103 * Revision 1.3 2004/11/25 11:13:59 youi
104 * getLastErrorString/setLastErrorString??絎?臂?
105 *
106 * Revision 1.2 2004/11/25 08:55:19 youi
107 * 綣??違??????篆??.
108 * freeResult??菴遵??.
109 *
110 * Revision 1.1 2004/11/25 05:14:58 youi
111 * initial version
112 *
113 *
114 */
115 #ifdef __WIN__
116 #include <winsock.h>
117 #define my_socket SOCKET
118 #else
119 typedef int my_socket;
120 #endif
121
122 #ifdef USE_SYSLOG
123 #include <syslog.h>
124 #endif
125
126 #include <stdio.h>
127 #include <stdlib.h>
128 #include <string.h>
129 #include <mysql.h>
130 #include <errmsg.h>
131 #include <string>
132 #include <assert.h>
133 using namespace std;
134
135 #include "common.h"
136 #include "account.h"
137 #include "group.h"
138 #include "session.h"
139 #include "criteria.h"
140 #include "commonal.h"
141
142 #ifdef __WIN__
143 typedef MYSQL* (__stdcall *mysql_init_t)(MYSQL *mysql);
144 typedef void (__stdcall *mysql_close_t)(MYSQL *mysql);
145 typedef MYSQL* (__stdcall *mysql_real_connect_t)(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag);
146 typedef unsigned long (__stdcall *mysql_real_escape_string_t)(MYSQL *mysql, char *to, const char *from, unsigned long length);
147 typedef MYSQL_RES* (__stdcall *mysql_store_result_t)(MYSQL *mysql);
148 typedef MYSQL_RES* (__stdcall *mysql_use_result_t)(MYSQL *mysql);
149 typedef int (__stdcall *mysql_query_t)(MYSQL *mysql, const char *query);
150 typedef my_ulonglong (__stdcall *mysql_num_rows_t)(MYSQL_RES *result);
151 typedef MYSQL_ROW (__stdcall *mysql_fetch_row_t)(MYSQL_RES *result);
152 typedef unsigned int (__stdcall *mysql_errno_t)(MYSQL *mysql);
153 typedef char* (__stdcall *mysql_error_t)(MYSQL *mysql);
154 typedef my_ulonglong (__stdcall *mysql_insert_id_t)(MYSQL *mysql);
155 typedef void (__stdcall *mysql_free_result_t)(MYSQL_RES *result);
156 typedef my_ulonglong (_stdcall* mysql_affected_rows_t)(MYSQL *mysql);
157
158 mysql_init_t fp_mysql_init = NULL;
159 mysql_close_t fp_mysql_close = NULL;
160 mysql_real_connect_t fp_mysql_real_connect = NULL;
161 mysql_real_escape_string_t fp_mysql_real_escape_string = NULL;
162 mysql_store_result_t fp_mysql_store_result = NULL;
163 mysql_use_result_t fp_mysql_use_result = NULL;
164 mysql_query_t fp_mysql_query = NULL;
165 mysql_num_rows_t fp_mysql_num_rows = NULL;
166 mysql_fetch_row_t fp_mysql_fetch_row = NULL;
167 mysql_errno_t fp_mysql_errno = NULL;
168 mysql_error_t fp_mysql_error = NULL;
169 mysql_insert_id_t fp_mysql_insert_id = NULL;
170 mysql_free_result_t fp_mysql_free_result = NULL;
171 mysql_affected_rows_t fp_mysql_affected_rows = NULL;
172 #else
173 #define fp_mysql_init mysql_init
174 #define fp_mysql_close mysql_close
175 #define fp_mysql_real_connect mysql_real_connect
176 #define fp_mysql_real_escape_string mysql_real_escape_string
177 #define fp_mysql_store_result mysql_store_result
178 #define fp_mysql_use_result mysql_use_result
179 #define fp_mysql_query mysql_query
180 #define fp_mysql_num_rows mysql_num_rows
181 #define fp_mysql_fetch_row mysql_fetch_row
182 #define fp_mysql_errno mysql_errno
183 #define fp_mysql_error mysql_error
184 #define fp_mysql_insert_id mysql_insert_id
185 #define fp_mysql_free_result mysql_free_result
186 #define fp_mysql_affected_rows mysql_affected_rows
187 #endif
188
189 static MYSQL* mysql = NULL; //!< MySQL????潟????/span>
190 static string dbprefix; //!< XOOPS???若?帥???若?鴻???若??????REFIX
191
192 /**
193 *
194 * php??ddslashes????????
195 *
196 * @param addslashes???鴻????絖?????NULL??絎?筝?????
197 * @return addslashes????????絖???
198 */
199 string addSlashes( const char *str )
200 {
201 if ( mysql == NULL ){
202 string s;
203 return s;
204 }
205 int len = strlen(str);
206 char *buf = new char[len*2+1];
207 int bufLen = fp_mysql_real_escape_string( mysql, buf, str, len );
208 string s( buf, bufLen );
209 return s;
210 }
211
212 /**
213 *
214 * gid??????????с????
215 * DB???≪???祉?劫け????????false??????鐚?/span>
216 *
217 * @param gid ???с??????????GID
218 * @return true 絖???????
219 * @return false 絖?????????
220 *
221 */
222 static bool gidExists( groupid_t gid )
223 {
224 string sql;
225 MYSQL_RES* result;
226 MYSQL_ROW row;
227
228 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
229 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
230 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
231 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
232 return false;
233 }
234 result = fp_mysql_store_result( mysql ) ;
235 if( !fp_mysql_fetch_row(result) ){
236 fp_mysql_free_result( result );
237 return false;
238 }
239 fp_mysql_free_result( result );
240 return true;
241 }
242
243
244 /**
245 *
246 * Platform???若?倶???宴??id??絖??????????????с????
247 * DB???≪???祉?劫け????????false??????鐚?/span>
248 *
249 * @param uid ???с??????????UID
250 * @return true 絖???????
251 * @return false 絖?????????
252 *
253 */
254 static bool uidExists( userid_t uid )
255 {
256 string sql;
257 MYSQL_RES* result;
258 MYSQL_ROW row;
259
260 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
261 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
262 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
263 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
264 return false;
265 }
266 result = fp_mysql_store_result( mysql ) ;
267 if( !fp_mysql_fetch_row(result) ){
268 fp_mysql_free_result( result );
269 return false;
270 }
271 fp_mysql_free_result( result );
272 return true;
273 }
274
275
276 /**
277 *
278 * criteria ?? SQL?????????
279 *
280 *
281 *
282 */
283 string criteria2str( criteria* cri )
284 {
285 string sql;
286
287 const orderby* odrby = cri -> headOrderBy( );
288 if( odrby != 0 ){
289 sql += " ORDER BY " + string( odrby -> getColumn( ) );
290 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
291 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
292 sql += ", " + string( odrby -> getColumn( ) );
293 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
294 }
295 }
296
297 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
298 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
299 + ", " + string( intToString( cri -> getLimitRows( ) ) );
300 }
301 return sql;
302 }
303
304 /**
305 *
306 * ???若?帥???若?鴻????????
307 *
308 * @param host ???若?帥???若?鴻?????鴻????
309 * @param user ???若?帥???若?鴻???≪???祉?鴻???????若?九??
310 * @param password 筝?荐????若?吟?????鴻???若??
311 * @param dbname ???若?帥???若?鴻??????
312 * @param prefix XOOPS???若?帥???若?鴻???若??????REFIX
313 * @return result_t
314 * @refer result_t
315 */
316 result_t initializeDB( const char* host, const char* user, const char* password, const char* dbname, const char* prefix )
317 {
318 // ?≪??・膓?筝???????筝???????/span>
319 if ( mysql != NULL )
320 fp_mysql_close( mysql );
321
322 dbprefix = prefix;
323
324
325 // ????????・膓?
326 mysql = fp_mysql_init(NULL);
327 if ( mysql == NULL ){
328 return RES_DB_INITIALIZE_ERROR;
329 }
330 char *unix_socket = NULL; // ?
331 unsigned int flag = 0; // ?
332 if ( NULL == fp_mysql_real_connect( mysql, host, user, password, dbname, 3306, unix_socket, flag ) ){
333 return RES_DB_CONNECT_ERROR;
334 }
335
336 return RES_OK;
337 }
338
339 /**
340 *
341 * DB?ョ????????違???????????障??????
342 *
343 * @param ????
344 * @return RES_OK
345 */
346 result_t uninitializeDB()
347 {
348 if ( mysql != NULL ){
349 fp_mysql_close( mysql );
350 mysql = NULL;
351 }
352
353 return RES_OK;
354 }
355
356
357 /**
358 *
359 * Platform???若?倶?粋??倶????緇?
360 *
361 * @param
362 * @return
363 *
364 */
365 bool isActivated( sessionid_t sid, userid_t uid )
366 {
367 if( mysql == NULL ) return false;
368 if( !isValidSessionID( sid ) ) return false;
369
370 string sql;
371 MYSQL_RES* result;
372 MYSQL_ROW row;
373
374 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
375 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
376 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
377 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
378 return false;
379 }
380 result = fp_mysql_store_result( mysql ) ;
381 if( row = fp_mysql_fetch_row(result) ){
382 fp_mysql_free_result( result );
383 return true;
384 }
385 return false;
386 }
387
388 /**
389 *
390 * Platform???若?倶?粋??倶??紊???/span>
391 *
392 * @param
393 * @return
394 *
395 */
396 result_t activate( sessionid_t sid, userid_t uid, bool activate )
397 {
398 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
399 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
400
401 string sql;
402 MYSQL_RES* result;
403 MYSQL_ROW row;
404
405 sql = "UPDATE " + dbprefix + "_vpaccount_users ";
406 sql += "SET activate=" + string( activate ? "1" : "0" );
407 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
408 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
409 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
410 return RES_DB_QUERY_ERROR;
411 }
412 if ( fp_mysql_affected_rows(mysql) == 0 ){
413 // ?贋?医け??
414 return RES_NO_SUCH_USER;
415 }
416 return RES_OK;
417 }
418
419 /**
420 *
421 * ?≪?????潟????/span>
422 *
423 * @param
424 * @return
425 *
426 */
427 int getAccountCount( sessionid_t sid )
428 {
429 if( mysql == NULL ) return 0;
430 if( !isValidSessionID( sid ) ) return 0;
431
432 int ret = 0;
433 string sql;
434 MYSQL_RES* result;
435 MYSQL_ROW row;
436
437 //?≪?????潟???違??羆?????
438 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
439 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
440 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
441 return 0;
442 }
443 result = fp_mysql_store_result( mysql ) ;
444 if( row = fp_mysql_fetch_row(result) ){
445 ret = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
446 }else{
447 fp_mysql_free_result( result );
448 return 0;
449 }
450 fp_mysql_free_result( result );
451 return ret;
452 }
453
454 /**
455 *
456 * ?≪?????潟??????/span>
457 *
458 * @param
459 * @return RES_OK
460 * @return RES_NO_SUCH_SESSION
461 * @return RES_DB_QUERY_ERROR
462 *
463 */
464 result_t deleteAccount( sessionid_t sid, userid_t uid )
465 {
466 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
467 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
468
469 string sql;
470 sql = "DELETE FROM " + dbprefix + "_users ";
471 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
472 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
473 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
474 return RES_DB_QUERY_ERROR;
475 }
476
477 sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
478 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
479 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
480 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
481 return RES_DB_QUERY_ERROR;
482 }
483
484 return RES_OK;
485 }
486
487 /**
488 *
489 * ?≪?????潟?????怨??
490 *
491 * @param sid ?祉???激?с??D
492 * @param uid ??緇??????????若?吟??ID
493 * @param acc ??緇??????≪?????潟??????account_t)?????ゃ?潟?帥???吾??莨若??綣???/span>
494 * @return RES_OK
495 * @return RES_NO_SUCH_USER
496 * @return RES_NO_SUCH_SESSION
497 * @return RES_DB_QUERY_ERROR
498 * @return RES_ERROR
499 *
500 */
501 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
502 {
503 int len;
504 static criteria c;
505 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
506 if( len == 0 ) return RES_NO_SUCH_USER;
507 return res;
508 }
509
510 /**
511 *
512 * ?≪?????潟?????怨??
513 *
514 * @param sid ?祉???激?с??D
515 * @param uids ??緇??????????若?吟??ID??????
516 * @param uidsLen uids???????膣???/span>
517 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
518 * @param accounts 罎?膣∝??????????????ゃ?潟?帥???吾??莨若??綣???/span>
519 * @param accountsLen 罎?膣∝???????????*accounts???膣???
520 * @return RES_OK| RES_DB_NOT_INITIALIZED| RES_NO_SUCH_SESSION
521 * @return RES_DB_QUERY_ERROR
522 *
523 */
524 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
525 {
526 #ifdef USE_SYSLOG
527 openlog( "commonal", LOG_ODELAY, LOG_USER );
528 #endif
529 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
530 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
531 if( uidsLen <= 0 ){
532 *accounts = new account_t[ 0 ];
533 *accountsLen = 0;
534 #ifdef USE_SYSLOG
535 closelog( );
536 #endif
537 return RES_OK;
538 }
539
540 string sql;
541 MYSQL_RES* result;
542 MYSQL_ROW row;
543 account_t* dst = new account_t[ uidsLen ];
544
545 sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.base_url, u2.notice_mail, u2.notice_mail_since ";
546 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 ";
547 sql += "WHERE u1.uid = u2.uid ";
548 if( uidsLen > 0 ){
549 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
550 for( int i = 1; i < uidsLen; i++ ){
551 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
552 }
553 sql += " ) ";
554 }
555 sql += criteria2str( cri );
556 #ifdef USE_SYSLOG
557 syslog( LOG_DEBUG, sql.c_str( ) );
558 #endif
559 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
560 fprintf( stderr, "%s\n", sql.c_str( ) );
561 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
562 #ifdef USE_SYSLOG
563 syslog( LOG_ERR, "query failed %d %s", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
564 closelog( );
565 #endif
566 return RES_DB_QUERY_ERROR;
567 }
568 #ifdef USE_SYSLOG
569 syslog( LOG_DEBUG, "query succeed" );
570 #endif
571 result = fp_mysql_use_result( mysql ) ;
572 *accountsLen=0;
573 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < uidsLen ; i++ ){
574 #ifdef USE_SYSLOG
575 syslog( LOG_DEBUG, "set to account_t %d", i );
576 #endif
577 dst[ i ].setUID( atoi( row[ 0 ] != NULL ? row[ 0 ] : "" ) );
578 dst[ i ].setName( row[ 1 ] );
579 dst[ i ].setUname( row[ 2 ] );
580 dst[ i ].setEmail( row[ 3 ] );
581 dst[ i ].setURL( row[ 4 ] );
582 dst[ i ].setUserAvatar( row[ 5 ] );
583 dst[ i ].setUserRegdate( atoi( row[ 6 ] != NULL ? row[ 6 ] : "" ) );
584 dst[ i ].setUserIcq( row[ 7 ] );
585 dst[ i ].setUserFrom( row[ 8 ] );
586 dst[ i ].setUserSig( row[ 9 ] );
587 dst[ i ].setUserViewemail( atoi( row[ 10 ] != NULL ? row[ 10 ] : "" ) );
588 dst[ i ].setActkey( row[ 11 ] );
589 dst[ i ].setUserAim( row[ 12 ] );
590 dst[ i ].setUserYim( row[ 13 ] );
591 dst[ i ].setUserMsnm( row[ 14 ] );
592 dst[ i ].setPass( row[ 15 ] );
593 dst[ i ].setPosts( atoi( row[ 16 ] != NULL ? row[ 16 ] : "" ) );
594 dst[ i ].setAttachsig( atoi( row[ 17 ] != NULL ? row[ 17 ] : "" ) );
595 dst[ i ].setRank( atoi( row[ 18 ] != NULL ? row[ 18 ] : "" ) );
596 dst[ i ].setLevel( atoi( row[ 19 ] != NULL ? row[ 19 ] : "" ) );
597 dst[ i ].setTheme( row[ 20 ] );
598 dst[ i ].setTimezoneOffset( atof( row[ 21 ] ) );
599 dst[ i ].setLastLogin( atoi( row[ 22 ] != NULL ? row[ 22 ] : "" ) );
600 dst[ i ].setUmode( row[ 23 ] );
601 dst[ i ].setUorder( atoi( row[ 24 ] != NULL ? row[ 24 ] : "" ) );
602 dst[ i ].setNotifyMethod( atoi( row[ 25 ] != NULL ? row[ 25 ] : "" ) );
603 dst[ i ].setNotifyMode( atoi( row[ 26 ] != NULL ? row[ 26 ] : "" ) );
604 dst[ i ].setUserOcc( row[ 27 ] );
605 dst[ i ].setBio( row[ 28 ] );
606 dst[ i ].setUserIntrest( row[ 29 ] );
607 dst[ i ].setUserMailok( atoi( row[ 30 ] != NULL ? row[ 30 ] : "" ) );
608 dst[ i ].setActivate( atoi( row[ 31 ] != NULL ? row[ 31 ] : "" ) );
609 dst[ i ].setAddress( row[ 32 ] );
610 dst[ i ].setDivision( row[ 33 ] );
611 dst[ i ].setTel( row[ 34 ] );
612 dst[ i ].setCompanyName( row[ 35 ] );
613 dst[ i ].setCountry( row[ 36 ] );
614 dst[ i ].setZipcode( row[ 37 ] );
615 dst[ i ].setFax( row[ 38 ] );
616 dst[ i ].setBaseURL( row[ 39 ] );
617 dst[ i ].setNoticeMail( atoi( row[ 40 ] != NULL ? row[ 40 ] : "" ) );
618 dst[ i ].setNoticeMailSince( atoi( row[ 41 ] != NULL ? row[ 41 ] : "" ) );
619 ( *accountsLen )++;
620 }
621 while( row = fp_mysql_fetch_row(result) );
622 fp_mysql_free_result( result );
623 *accounts = dst;
624 #ifdef USE_SYSLOG
625 syslog( LOG_DEBUG, "return RES_OK" );
626 closelog( );
627 #endif
628 return RES_OK;
629 }
630
631 /**
632 *
633 * ?≪?????潟???脂??
634 * ???若?倶???宴?????若?帥???若?鴻???脂?蚊???障??鐚?/span>
635 * ?脂?蚊???????若?倶???宴???綽????????若??D??uid???主????障??.
636 *
637 * @param sid ?祉???激?с??/span>
638 * @param account ?脂?蚊?????≪?????潟??????/span>
639 * @param uid ?脂?蚊?????≪?????潟?????宴???綽????????若??D
640 * @return RES_OK
641 * @return RES_NO_SUCH_SESSION
642 * @return RES_DB_QUERY_ERROR
643 * @return RES_ERROR
644 *
645 */
646 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
647 {
648 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
649 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
650
651 string sql;
652 string tmp;
653 char buf[ 12 ];
654
655 //xoops?????若?吟???若???????吾??莨若??
656 sql = "INSERT INTO " + dbprefix + "_users (uname, name, email, url, user_avatar, user_regdate, user_icq, user_from, user_sig, user_viewemail, actkey, user_aim, user_yim, user_msnm, pass, posts, attachsig, rank, level, theme, timezone_offset, last_login, umode, uorder, notify_method, notify_mode, user_occ, bio, user_intrest, user_mailok) VALUES (";
657 sql += "'" + string( addSlashes( account -> getUname( ) ) ) + "', ";
658 sql += "'" + string( addSlashes( account -> getName( ) ) ) + "', ";
659 sql += "'" + string( addSlashes( account -> getEmail( ) ) ) + "', ";
660 sql += "'" + string( addSlashes( account -> getURL( ) ) ) + "', ";
661 sql += "'" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";
662 snprintf( buf, 12, "%d", time( NULL ) );
663 sql += string( buf ) + ", ";
664 sql += "'" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";
665 sql += "'" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";
666 sql += "'" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";
667 snprintf( buf, 12, "%d", account -> getUserViewemail( ) );
668 sql += string( buf ) + ", ";
669 sql += "'" + string( addSlashes( account -> getActkey( ) ) ) + "', ";
670 sql += "'" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";
671 sql += "'" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";
672 sql += "'" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";
673 sql += "'" + string( addSlashes( account -> getPass( ) ) ) + "', ";
674 snprintf( buf, 12, "%d", account -> getPosts( ) );
675 sql += string( buf ) + ", ";
676 snprintf( buf, 12, "%d", account -> getAttachsig( ) );
677 sql += string( buf ) + ", ";
678 snprintf( buf, 12, "%d", account -> getRank( ) );
679 sql += string( buf ) + ", ";
680 snprintf( buf, 12, "%d", account -> getLevel( ) );
681 sql += string( buf ) + ", ";
682 sql += "'" + string( addSlashes( account -> getTheme( ) ) ) + "', ";
683 snprintf( buf, 12, "%lf", account -> getTimezoneOffset( ) );
684 sql += string( buf ) + ", ";
685 sql += "0, "; //last login
686 sql += "'" + string( addSlashes( account -> getUmode( ) ) ) + "', ";
687 snprintf( buf, 12, "%d", account -> getUorder( ) );
688 sql += string( buf ) + ", ";
689 snprintf( buf, 12, "%d", account -> getNotifyMethod( ) );
690 sql += string( buf ) + ", ";
691 snprintf( buf, 12, "%d", account -> getNotifyMode( ) );
692 sql += string( buf ) + ", ";
693 sql += "'" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";
694 sql += "'" + string( addSlashes( account -> getBio( ) ) ) + "', ";
695 sql += "'" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";
696 snprintf( buf, 12, "%d", account -> getUserMailok( ) );
697 sql += string( buf ) + ")";
698 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
699 fprintf( stderr, "%s\n", sql.c_str( ) );
700 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
701 return RES_DB_QUERY_ERROR;
702 }
703
704 //???若??D????緇?????
705 *uid = fp_mysql_insert_id( mysql );
706
707 //vpaccount?????若?吟???若??????????????宴???吾??莨若??
708 sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES (";
709 snprintf( buf, 12, "%d", *uid );
710 sql += string( buf ) + ", ";
711 if( account -> getActivate() ){
712 sql += "1, ";
713 }else{
714 sql += "0, ";
715 }
716 sql += "'" + string( addSlashes( account -> getAddress() ) ) + "', ";
717 sql += "'" + string( addSlashes( account -> getDivision() ) ) + "', ";
718 sql += "'" + string( addSlashes( account -> getTel() ) ) + "', ";
719 sql += "'" + string( addSlashes( account -> getCompanyName() ) ) + "', ";
720 sql += "'" + string( addSlashes( account -> getCountry() ) ) + "', ";
721 sql += "'" + string( addSlashes( account -> getZipcode() ) ) + "', ";
722 sql += "'" + string( addSlashes( account -> getFax() ) ) + "', ";
723 sql += "'" + string( addSlashes( account -> getBaseURL() ) ) + "', ";
724 snprintf( buf, 12, "%d", account -> getNoticeMail( ) );
725 sql += string( buf ) + ", ";
726 snprintf( buf, 12, "%d", account -> getNoticeMailSince( ) );
727 sql += string( buf ) + ")";
728 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
729 fprintf( stderr, "%s\n", sql.c_str( ) );
730 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
731 //xoops_users??nsert???????潟?若???????ゃ????
732 sql = "DELETE FROM " + dbprefix + "_users where uid=";
733 snprintf( buf, 12, "%d", *uid );
734 sql += string( buf );
735 fp_mysql_query( mysql, sql.c_str( ) );
736 return RES_DB_QUERY_ERROR;
737 }
738
739 return RES_OK;
740 }
741
742 /**
743 *
744 * ?≪?????潟?????宴??紊??眼????.
745 *
746 *
747 * @param sid ?祉???激?с??D
748 * @param account 紊??眼???????≪?????潟??????/span>
749 * @return RES_OK
750 * @return RES_NO_SUCH_SESSION
751 * @return RES_DB_QUERY_ERROR
752 * @return RES_NO_SUCH_USER
753 *
754 */
755 result_t updateAccount( sessionid_t sid, const account_t* account )
756 {
757 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
758 if( account == NULL ) return RES_ERROR;
759 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
760 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
761
762 string sql;
763 string tmp;
764 char buf[ 12 ];
765
766 //xoops?????若?吟???若???????吾??莨若??
767 sql = "UPDATE " + dbprefix + "_users SET ";
768 sql += "uname='" + string( addSlashes( account -> getUname( ) ) ) + "', ";
769 sql += "name='" + string( addSlashes( account -> getName( ) ) ) + "', ";
770 sql += "email='" + string( addSlashes( account -> getEmail( ) ) ) + "', ";
771 sql += "url='" + string( addSlashes( account -> getURL( ) ) ) + "', ";
772 sql += "user_avatar='" + string( addSlashes( account -> getUserAvatar( ) ) ) + "', ";
773 sql += "user_regdate=" + string( intToString( account -> getUserRegdate( ) ) ) + ", ";
774 sql += "user_icq='" + string( addSlashes( account -> getUserIcq( ) ) ) + "', ";
775 sql += "user_from='" + string( addSlashes( account -> getUserFrom( ) ) ) + "', ";
776 sql += "user_sig='" + string( addSlashes( account -> getUserSig( ) ) ) + "', ";
777 sql += "user_viewemail=" + string( intToString( account -> getUserViewemail( ) ) ) + ", ";
778 sql += "actkey='" + string( addSlashes( account -> getActkey( ) ) ) + "', ";
779 sql += "user_aim='" + string( addSlashes( account -> getUserAim( ) ) ) + "', ";
780 sql += "user_yim='" + string( addSlashes( account -> getUserYim( ) ) ) + "', ";
781 sql += "user_msnm='" + string( addSlashes( account -> getUserMsnm( ) ) ) + "', ";
782 sql += "pass='" + string( account -> getPass( ) ) + "', ";
783 sql += "posts=" + string( intToString( account -> getPosts( ) ) ) + ", ";
784 sql += "attachsig=" + string( intToString( account -> getAttachsig( ) ) ) + ", ";
785 sql += "rank=" + string( intToString( account -> getRank( ) ) ) + ", ";
786 sql += "level=" + string( intToString( account -> getLevel( ) ) ) + ", ";
787 sql += "theme='" + string( addSlashes( account -> getTheme( ) ) ) + "', ";
788 snprintf( buf, 12, "%.2f", account -> getTimezoneOffset( ) );
789 sql += "timezone_offset=" + string( buf ) + ", ";
790 sql += "last_login=" + string( unsignedIntToString( account -> getLastLogin( ) ) ) + ", ";
791 sql += "umode='" + string( account -> getUmode( ) ) + "', ";
792 sql += "uorder=" + string( intToString( account -> getUorder( ) ) ) + ", ";
793 sql += "notify_method=" + string( intToString( account -> getNotifyMethod( ) ) ) + ", ";
794 sql += "notify_mode=" + string( intToString( account -> getNotifyMode( ) ) ) + ", ";
795 sql += "user_occ='" + string( addSlashes( account -> getUserOcc( ) ) ) + "', ";
796 sql += "bio='" + string( addSlashes( account -> getBio( ) ) ) + "', ";
797 sql += "user_intrest='" + string( addSlashes( account -> getUserIntrest( ) ) ) + "', ";
798 sql += "user_mailok=" + string( intToString( account -> getUserMailok( ) ) );
799 sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );
800
801 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
802 fprintf( stderr, "%s\n", sql.c_str( ) );
803 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
804 return RES_DB_QUERY_ERROR;
805 }
806
807 //vpaccount?????若?吟???若??????????????宴??筝??吾??????
808 sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";
809 sql += "activate=";
810 if( account -> getActivate() ){
811 sql += "1, ";
812 }else{
813 sql += "0, ";
814 }
815 sql += "address='" + string( addSlashes( account -> getAddress() ) ) + "', ";
816 sql += "division='" + string( addSlashes( account -> getDivision() ) ) + "', ";
817 sql += "tel='" + string( addSlashes( account -> getTel() ) ) + "', ";
818 sql += "company_name='" + string( addSlashes( account -> getCompanyName() ) ) + "', ";
819 sql += "country='" + string( addSlashes( account -> getCountry() ) ) + "', ";
820 sql += "zipcode='" + string( addSlashes( account -> getZipcode() ) ) + "', ";
821 sql += "fax='" + string( addSlashes( account -> getFax() ) ) + "', ";
822 sql += "base_url='" + string( addSlashes( account -> getBaseURL() ) ) + "', ";
823 sql += "notice_mail=" + string( intToString( account -> getNoticeMail( ) ) ) + ", ";
824 sql += "notice_mail_since=" + string( intToString( account -> getNoticeMailSince( ) ) );
825 sql += " WHERE uid = " + string( intToString( account -> getUID( ) ) );
826
827 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
828 fprintf( stderr, "%s\n", sql.c_str( ) );
829 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
830 return RES_DB_QUERY_ERROR;
831 }
832
833 return RES_OK;
834 }
835
836 /**
837 *
838 * criteria_t?ф??絎???????膀??蚊?????若??D??菴???.
839 * ???若??D????????腆坂????????????吾??莨若?随????????≪?????鴻??*uids???吾??莨若??.
840 * ???????泣?ゃ?冴??*uidsLen???吾??莨若??
841 *
842 * @param sid ?祉???激?с??D
843 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
844 * @param uids ???若?吟??ID??????
845 * @param uidsLen uids???????膣???/span>
846 * @return RES_OK| RES_DB_NOT_INITIALIZED| RES_NO_SUCH_SESSION
847 * @return RES_DB_QUERY_ERROR| RES_ERROR
848 *
849 */
850 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
851 {
852 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
853 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
854
855 string sql;
856 MYSQL_RES* result;
857 MYSQL_ROW row;
858 userid_t* dst = 0;
859
860 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
861 sql += criteria2str( cri );
862 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
863 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
864 return RES_DB_QUERY_ERROR;
865 }
866 result = fp_mysql_store_result( mysql ) ;
867 if( result == NULL ){
868 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
869 return RES_DB_QUERY_ERROR;
870 }
871 *uidsLen = fp_mysql_num_rows( result );
872 dst = new userid_t[ *uidsLen ];
873 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){
874 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
875 }
876 fp_mysql_free_result( result );
877 *uids = dst;
878
879 return RES_OK;
880 }
881
882 /**
883 *
884 * ?違???若???違??菴???.
885 * 筝?罩c???祉???激?с??D????0??菴???.
886 *
887 * @param sid ?祉???激?с??D
888 * @return ?違???若????/span>
889 *
890 */
891 int getGroupCount( sessionid_t sid )
892 {
893 if( mysql == NULL ) return 0;
894 if( !isValidSessionID( sid ) ) return 0;
895
896 string sql;
897 MYSQL_RES* result;
898 MYSQL_ROW row;
899 int groupLen = 0;
900
901 //?違???若???違??羆?????
902 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
903 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
904 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
905 return RES_DB_QUERY_ERROR;
906 }
907 result = fp_mysql_store_result( mysql ) ;
908 if( row = fp_mysql_fetch_row(result) ){
909 groupLen = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
910 }
911 fp_mysql_free_result( result );
912 return groupLen;
913 }
914
915 /**
916 *
917 * ??絮??違???若??筝?荀у??
918 *
919 * @param
920 * @return
921 *
922 */
923 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
924 {
925 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
926 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
927 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
928
929 string sql;
930 MYSQL_RES* result;
931 MYSQL_ROW row;
932 groupid_t* dst = 0;
933 int len = 0;
934
935 //??絮??????違???若??????紊у???違??羆?????
936 sql = "SELECT count(*) FROM " + dbprefix + "_vpaccount_groups_users_link";
937 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
938 sql += criteria2str( cri );
939 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
940 fprintf( stderr, "%s\n", sql.c_str( ) );
941 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
942 return RES_DB_QUERY_ERROR;
943 }
944 result = fp_mysql_store_result( mysql ) ;
945 if( row = fp_mysql_fetch_row(result) ){
946 len = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
947 }
948 fp_mysql_free_result( result );
949
950 sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";
951 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
952 sql += criteria2str( cri );
953 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
954 fprintf( stderr, "%s\n", sql.c_str( ) );
955 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
956 return RES_DB_QUERY_ERROR;
957 }
958 *gidsLen = 0;
959 dst = new groupid_t[ len ];
960 result = fp_mysql_store_result( mysql ) ;
961 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < len ; i++ ){
962 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
963 ( *gidsLen )++;
964 }
965 fp_mysql_free_result( result );
966 *gids = dst;
967
968 return RES_OK;
969 }
970
971 /**
972 *
973 * ?違???若??膊∞??罔????????
974 *
975 * @param
976 * @return
977 *
978 */
979 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
980 {
981 if( mysql == NULL ) return false;
982 if( !isValidSessionID( sid ) ) return false;
983 if( !uidExists( uid ) ) return false;
984 if( !gidExists( gid ) ) return false;
985
986 string sql;
987 MYSQL_RES* result;
988 MYSQL_ROW row;
989 groupid_t* dst = 0;
990 result_t res;
991
992 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";
993 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
994 sql += " AND uid=" + string( unsignedIntToString( uid ) );
995 sql += " AND is_admin=1";
996 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
997 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
998 return false;
999 }
1000 result = fp_mysql_store_result( mysql );
1001 if( !fp_mysql_fetch_row(result) ){
1002 fp_mysql_free_result( result );
1003 return false;
1004 }
1005
1006 fp_mysql_free_result( result );
1007 return true;;
1008 }
1009
1010 /**
1011 *
1012 * ?違???若??ID筝?荀?/span>
1013 *
1014 * @param
1015 * @return
1016 *
1017 */
1018 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1019 {
1020 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1021 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1022
1023 string sql;
1024 MYSQL_RES* result;
1025 MYSQL_ROW row;
1026 groupid_t* dst = 0;
1027
1028 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
1029 sql += criteria2str( cri );
1030 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1031 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1032 return RES_DB_QUERY_ERROR;
1033 }
1034 result = fp_mysql_store_result( mysql ) ;
1035 if( result == NULL ){
1036 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1037 return RES_DB_QUERY_ERROR;
1038 }
1039 *gidsLen = fp_mysql_num_rows( result );
1040 dst = new groupid_t[ *gidsLen ];
1041 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){
1042 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1043 }
1044 fp_mysql_free_result( result );
1045 *gids = dst;
1046
1047 return RES_OK;
1048 /*
1049 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1050 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1051
1052 string sql;
1053 MYSQL_RES* result;
1054 MYSQL_ROW row;
1055 groupid_t* dst = 0;
1056
1057 //?違???若???違??羆?????
1058 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups ";
1059 sql += criteria2str( cri );
1060 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1061 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1062 return RES_DB_QUERY_ERROR;
1063 }
1064 result = fp_mysql_store_result( mysql ) ;
1065 if( row = fp_mysql_fetch_row(result) ){
1066 *gidsLen = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1067 dst = new groupid_t[ *gidsLen ];
1068 }else{
1069 fp_mysql_free_result( result );
1070 return RES_ERROR;
1071 }
1072 fp_mysql_free_result( result );
1073
1074 sql = "SELECT gid, gname, gdesc FROM " + dbprefix + "_vpaccount_groups ";
1075 sql += criteria2str( cri );
1076 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1077 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1078 return RES_DB_QUERY_ERROR;
1079 }
1080
1081 result = fp_mysql_use_result( mysql ) ;
1082 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *gidsLen ; i++ ){
1083 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1084 }
1085 fp_mysql_free_result( result );
1086 *gids = dst;
1087
1088 return RES_OK;
1089 */
1090 }
1091
1092 /**
1093 *
1094 * ?違???若??膊∞????ID????緇?????
1095 *
1096 * @param sid ?祉???激?с??D
1097 * @param gid ???????????違???若????ID?ф??絎?????
1098 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1099 * @param uids 膊∞??????ID???????????????????ゃ?潟??/span>
1100 * @param uidsLen uids???????膣???/span>
1101 * @return RES_OK
1102 * @return RES_DB_NOT_INITIALIZED
1103 * @return RES_NO_SUCH_SESSION
1104 * @return RES_DB_QUERY_ERROR
1105 * @return RES_ERROR
1106 *
1107 */
1108 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1109 {
1110 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1111 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1112
1113 string sql;
1114 MYSQL_RES* result;
1115 MYSQL_ROW row;
1116 userid_t* dst = 0;
1117
1118 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
1119 sql += " WHERE is_admin=1";
1120 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1121 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1122 return RES_DB_QUERY_ERROR;
1123 }
1124
1125 result = fp_mysql_store_result( mysql );
1126 if( result == NULL ){
1127 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1128 return RES_DB_QUERY_ERROR;
1129 }
1130
1131 *uidsLen = fp_mysql_num_rows( result );
1132 dst = new userid_t[ *uidsLen ];
1133 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < *uidsLen ; i++ ){
1134 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1135 }
1136 fp_mysql_free_result( result );
1137 *uids = dst;
1138
1139 return RES_OK;
1140 }
1141
1142 /**
1143 *
1144 * ?違???若????絮????若?九????/span>
1145 *
1146 * @param
1147 * @return
1148 *
1149 */
1150 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1151 {
1152 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1153 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1154 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1155 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1156
1157 string sql;
1158
1159 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1160 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1161 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1162 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1163 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1164 return RES_DB_QUERY_ERROR;
1165 }
1166 return RES_OK;
1167 }
1168
1169 /**
1170 *
1171 * ?違???若????絮????若?区申??
1172 *
1173 * @param sid ?祉???激?с??D
1174 * @param gid ??絮????違???若????D
1175 * @param uid ??絮??????????若?吟??D
1176 * @param admin 膊∞????罔?????筝?????????true
1177 * @return RES_OK
1178 * @return RES_DB_NOT_INITIALIZED
1179 * @return RES_NO_SUCH_SESSION
1180 * @return RES_DB_QUERY_ERROR
1181 * @return RES_ERROR
1182 *
1183 */
1184 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1185 {
1186 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1187 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1188 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1189 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1190
1191 string sql;
1192 MYSQL_RES* result;
1193 MYSQL_ROW row;
1194 groupid_t* dst = 0;
1195 result_t res;
1196
1197 //?<?潟???若??菴遵??
1198 sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
1199 sql += string( unsignedIntToString( gid ) ) + ", ";
1200 sql += string( unsignedIntToString( uid ) ) + ", ";
1201 sql += string( admin ? "1" : "0" ) + ") ";
1202 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1203 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1204 return RES_DB_QUERY_ERROR;
1205 }
1206 return RES_OK;
1207 }
1208
1209 /**
1210 *
1211 * ?違???若????絮????若?九??
1212 *
1213 * @param
1214 * @return
1215 *
1216 */
1217 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1218 {
1219 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1220 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1221 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1222
1223 string sql;
1224 MYSQL_RES* result;
1225 MYSQL_ROW row;
1226 userid_t* dst = 0;
1227 int len = 0;
1228
1229 //?<?潟???惹?違??羆??????<?≪??∈篆?
1230 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1231 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1232 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1233 fprintf( stderr, "%s\n", sql.c_str( ) );
1234 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1235 return RES_DB_QUERY_ERROR;
1236 }
1237 result = fp_mysql_store_result( mysql ) ;
1238 if( row = fp_mysql_fetch_row(result) ){
1239 len = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1240 dst = new userid_t[ len ];
1241 }else{
1242 fp_mysql_free_result( result );
1243 return RES_ERROR;
1244 }
1245 fp_mysql_free_result( result );
1246
1247 sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";
1248 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1249 sql += " " + string( criteria2str( cri ) );
1250 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1251 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1252 delete[] dst;
1253 *uidsLen = 0;
1254 return RES_DB_QUERY_ERROR;
1255 }
1256 *uidsLen = 0;
1257 result = fp_mysql_use_result( mysql ) ;
1258 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < len ; i++ ){
1259 dst[ i ] = atoi( row[ 0 ] != NULL ? row[ 0 ] : "" );
1260 ( *uidsLen )++;
1261 }
1262 while( row = fp_mysql_fetch_row(result) );
1263 fp_mysql_free_result( result );
1264 *uids = dst;
1265 return RES_OK;
1266 }
1267
1268 /**
1269 *
1270 * ?違???若????????/span>
1271 *
1272 * @param
1273 * @return RES_OK
1274 * @return RES_DB_QUERY_ERROR
1275 * @return RES_NO_SUCH_SESSION
1276 * @return RES_DB_NOT_INITIALIZED
1277 *
1278 */
1279 result_t deleteGroup( sessionid_t sid, groupid_t gid )
1280 {
1281 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1282 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1283
1284 string sql;
1285 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
1286 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
1287 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1288 fprintf( stderr, "%s\n", sql.c_str( ) );
1289 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1290 return RES_DB_QUERY_ERROR;
1291 }
1292 return RES_OK;
1293 }
1294
1295 /**
1296 *
1297 * ?違???若???脂??
1298 * ?違???若???????宴?????若?帥???若?鴻????蚊???障??.
1299 * ?脂?蚊?????違???若?????綽??????違???若??ID??gid???主????障??.
1300 *
1301 * @param sid ?祉???激?с??D
1302 * @param group ?脂?蚊???????違???若????????/span>
1303 * @param gid ?脂?蚊?????違???若?????綽??????違???若??ID
1304 * @return RES_OK
1305 * @return RES_DB_NOT_INITIALIZED
1306 * @return RES_NO_SUCH_SESSION
1307 * @return RES_DB_QUERY_ERROR
1308 *
1309 */
1310 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
1311 {
1312 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1313 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1314
1315 string sql;
1316 sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES (";
1317 sql += "'" + string( addSlashes( group -> getGname( ) ) ) + "', ";
1318 sql += "'" + string( addSlashes( group -> getDesc( ) ) ) + "' )";
1319 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1320 fprintf( stderr, "%s\n", sql.c_str( ) );
1321 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1322 return RES_DB_QUERY_ERROR;
1323 }
1324 *gid = fp_mysql_insert_id( mysql );
1325 return RES_OK;
1326 }
1327
1328 /**
1329 *
1330 * ?違???若?????宴??紊??眼????
1331 *
1332 * @param sid ?祉???激?с??D
1333 * @param group ?違?????違???若??????/span>
1334 * @return RES_OK
1335 * @return RES_ERROR
1336 * @return RES_DB_NOT_INITIALIZED
1337 * @return RES_NO_SUCH_SESSION
1338 * @return RES_NO_SUCH_GROUP
1339 * @return RES_DB_QUERY_ERROR
1340 *
1341 */
1342 result_t updateGroup( sessionid_t sid, const group_t* group )
1343 {
1344 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1345 if( group == NULL ) return RES_ERROR;
1346 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1347 if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
1348
1349 string sql;
1350 sql = "UPDATE " + dbprefix + "_vpaccount_groups SET ";
1351 sql += "gname='" + string( addSlashes( group -> getGname( ) ) ) + "', ";
1352 sql += "gdesc='" + string( addSlashes( group -> getDesc( ) ) ) + "' ";
1353 sql += "WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
1354 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1355 fprintf( stderr, "%s\n", sql.c_str( ) );
1356 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1357 return RES_DB_QUERY_ERROR;
1358 }
1359 return RES_OK;
1360 }
1361
1362 /**
1363 *
1364 * ?違???若?????怨??
1365 *
1366 * @param sid ?祉???激?с??D
1367 * @param gid ??緇????????違???若????ID
1368 * @param group ??緇??????違???若?????宴???≪?????鴻???吾??莨若?????ゃ?潟??/span>
1369 * @return RES_OK
1370 * @return RES_DB_NOT_INITIALIZED
1371 * @return RES_NO_SUCH_SESSION
1372 * @return RES_NO_SUCH_GROUP
1373 * @return RES_DB_QUERY_ERROR
1374 *
1375 */
1376 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
1377 {
1378 int len;
1379 static criteria c;
1380 result_t res = getGroups( sid, &gid, 1, &c, group, &len );
1381 if( len == 0 ) return RES_NO_SUCH_GROUP;
1382 return res;
1383 }
1384
1385 /**
1386 *
1387 * 茲??違???違???若?????宴??筝?綺?????????.
1388 *
1389 * @param sid ?祉???激?с??D
1390 * @param gids ??緇????????違???若????ID??????
1391 * @param gidsLen gids???????膣???/span>
1392 * @param cri 腟???????膀??駕??純?若???>散????絎?
1393 * @param groups ??緇?腟??????違???若?????宴?????????≪?????鴻???吾??莨若?????ゃ?潟??/span>
1394 * @param groupsLen ??緇?腟????????????膣???/span>
1395 * @return RES_OK
1396 * @return RES_DB_NOT_INITIALIZED
1397 * @return RES_NO_SUCH_SESSION
1398 * @return RES_DB_QUERY_ERROR
1399 *
1400 */
1401 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
1402 {
1403 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1404 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1405
1406 string sql;
1407 MYSQL_RES* result;
1408 MYSQL_ROW row;
1409 group_t* dst = new group_t[ gidsLen ];
1410
1411 sql += "SELECT gid, gname, gdesc ";
1412 sql += "FROM " + dbprefix + "_vpaccount_groups ";
1413 if( gidsLen > 0 ){
1414 sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) );
1415 for( int i = 1; i < gidsLen; i++ ){
1416 sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) );
1417 }
1418 }
1419 sql += criteria2str( cri );
1420 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1421 fprintf( stderr, "%s\n", sql.c_str( ) );
1422 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1423 return RES_DB_QUERY_ERROR;
1424 }
1425 result = fp_mysql_use_result( mysql ) ;
1426 *groupsLen=0;
1427 for( int i = 0; ( row = fp_mysql_fetch_row(result) ) != 0 && i < gidsLen ; i++ ){
1428 dst[ i ].setGID( atoi( row[ 0 ] != NULL ? row[ 0 ] : "" ) );
1429 dst[ i ].setGname( row[ 1 ] );
1430 dst[ i ].setDesc( row[ 2 ] );
1431 ( *groupsLen )++;
1432 }
1433 while( row = fp_mysql_fetch_row(result) );
1434 fp_mysql_free_result( result );
1435 *groups = dst;
1436 return RES_OK;
1437 }
1438
1439 /**
1440 *
1441 * ?≪?????若?炊┤???????<??菴???
1442 *
1443 * @param sid ?祉???激?с??D
1444 * @param uid ???????????????若?吟??ID
1445 * @return true 罔???????
1446 * @return false 罔???????
1447 *
1448 */
1449 bool isModerator( sessionid_t sid, userid_t uid )
1450 {
1451 if( mysql == NULL ) return false;
1452 if( !isValidSessionID( sid ) ) return false;
1453 //if( !uidExists( uid ) ) return false;
1454
1455 string sql;
1456 MYSQL_RES* result;
1457 MYSQL_ROW row;
1458 groupid_t* dst = 0;
1459 result_t res;
1460
1461 sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";
1462 sql += " WHERE name='moderator_gid'";
1463 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1464 fprintf( stderr, "%s\n", sql.c_str( ) );
1465 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1466 return false;
1467 }
1468 result = fp_mysql_store_result( mysql ) ;
1469 if( result == NULL ){
1470 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1471 return false;
1472 }
1473 if( row = fp_mysql_fetch_row(result) ){
1474 sql = "SELECT * from " + dbprefix + "_groups_users_link ";
1475 sql += "WHERE groupid=" + string( row[ 0 ] );
1476 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1477 fp_mysql_free_result( result );
1478
1479 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1480 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1481 return false;
1482 }
1483 result = fp_mysql_store_result( mysql );
1484 if( result == NULL ){
1485 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1486 return false;
1487 }
1488 if( !fp_mysql_fetch_row(result) ){
1489 fp_mysql_free_result( result );
1490 return false;
1491 }
1492 fp_mysql_free_result( result );
1493 return true;
1494 }else{
1495 fp_mysql_free_result( result );
1496 return false;
1497 }
1498 }
1499
1500 /**
1501 *
1502 * ???若??D??緇?
1503 *
1504 * @param uname ID????緇??????????若?吟?弱??
1505 * @param uid ID??篁e?ャ??????紊??違?????ゃ?潟??/span>
1506 * @return RES_ERROR
1507 * @return RES_OK
1508 * @refer result_t
1509 *
1510 */
1511 result_t getUid( const char* uname, userid_t* uid )
1512 {
1513 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1514 if( uname == NULL ) return RES_ERROR;
1515
1516 string sql;
1517 string uname2 = addSlashes( uname );
1518 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
1519 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1520 fprintf( stderr, "%d %s\n", fp_mysql_errno(mysql), fp_mysql_error(mysql) );
1521 return RES_DB_QUERY_ERROR;
1522 }
1523 MYSQL_RES* result = fp_mysql_store_result( mysql ) ;
1524 MYSQL_ROW row = fp_mysql_fetch_row(result);
1525 if( row ){
1526 *uid = atoi( row[0] != NULL ? row[0] : "" );
1527 fp_mysql_free_result( result );
1528 return RES_OK;
1529 }else{
1530 fp_mysql_free_result( result );
1531 return RES_NO_SUCH_USER;
1532 }
1533 }
1534
1535 /**
1536 *
1537 * ?祉???激?с?潟??篏?????xoops_vpaccount_session???吾??莨若???? sessionid_t??session???????
1538 *
1539 * @param uid xoops_users??id
1540 * @param session sessionid_t???????????????????ゃ?潟?帥??
1541 * @return RES_OK ????
1542 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
1543 */
1544 static result_t addSession( userid_t uid, sessionid_t* session )
1545 {
1546 result_t ret;
1547 string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" +
1548 unsignedIntToString(uid) + ")";
1549 if ( 0 == fp_mysql_query( mysql, sql.c_str() ) ){
1550 *session = (int)fp_mysql_insert_id(mysql);
1551 ret = RES_OK;
1552 }
1553 else {
1554 ret = RES_DB_QUERY_ERROR;
1555 }
1556 return ret;
1557 }
1558
1559
1560 /**
1561 *
1562 * ???違?ゃ?活?荐若???祉???激?с?割???
1563 *
1564 * @param uname ???違?ゃ?喝??
1565 * @param passwd ???鴻???若??
1566 * @param session sessionid_t???????????????????ゃ?潟?帥??
1567 * @return RES_OK ???違?ゃ?恰??????session??essionid_t???吾??莨若??????<br>
1568 * @return RES_LOGIN_FAILURE uname?障????asswd???医幻<br>
1569 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
1570 *
1571 */
1572 result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
1573 {
1574 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1575
1576 result_t ret;
1577 string sql;
1578
1579 // uname, passwd -> uid
1580 string escUname = addSlashes( uname );
1581 string escPasswd = addSlashes( passwd );
1582 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
1583 if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){
1584 MYSQL_RES* result = fp_mysql_store_result( mysql );
1585 if( result ){
1586 MYSQL_ROW row = fp_mysql_fetch_row(result);
1587 if( row ){
1588 userid_t uid = atoi( row[0] != NULL ? row[0] : "" );
1589 ret = addSession( uid, session );
1590 }else{
1591 ret = RES_LOGIN_FAILURE;
1592 }
1593 fp_mysql_free_result( result );
1594 }else {
1595 ret = RES_DB_QUERY_ERROR;
1596 }
1597 }else{
1598 ret = RES_DB_QUERY_ERROR;
1599 }
1600
1601 return ret;
1602 }
1603
1604 /**
1605 *
1606 * ???違?≪???????祉???激?с?括?篋?
1607 *
1608 * @param sid session id
1609 * @return ????
1610 *
1611 */
1612 void logoutUser( sessionid_t sid )
1613 {
1614 if( mysql == NULL ) return; // RES_DB_NOT_INITIALIZED;
1615
1616 result_t ret;
1617 string sql;
1618
1619 sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);
1620 if ( 0 == fp_mysql_query( mysql, sql.c_str() ) ){
1621 if ( fp_mysql_affected_rows(mysql) == 1 ){
1622 // ???違?≪????????
1623 }
1624 else {
1625 // sid???≦??/span>
1626 }
1627 }
1628 else {
1629 // DB????????筝?????????/span>
1630 }
1631 }
1632
1633 /**
1634 *
1635 * ?祉???激?с?潟?????.<br>
1636 * XOOPS??ession???若????????蚊??????sess_id?????ess_id??膈???????
1637 * ?逸?session_t??篏?????????
1638 * ???若?帥???若?鴻???祉???激?с?潟????違?????宴??荐??蚊????
1639 *
1640 * @param sessionid xoops??ession_id
1641 * @param uid xoops_users??id
1642 * @param session sessionid_t???????????????????ゃ?潟?帥??
1643 * @return RES_OK ??????<br>
1644 * @return RES_ERROR
1645 * @return RES_DB_QUERY_ERROR
1646 *
1647 */
1648 result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )
1649 {
1650 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1651
1652 result_t ret;
1653 string sql;
1654
1655 string escSess_id = addSlashes(sess_id);
1656 sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";
1657 if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){
1658 MYSQL_RES* result = fp_mysql_store_result( mysql );
1659 if( result ){
1660 MYSQL_ROW row = fp_mysql_fetch_row(result);
1661 if( row ){
1662 ret = addSession( uid, session );
1663 }else{
1664 ret = RES_ERROR;
1665 }
1666 fp_mysql_free_result( result );
1667 }else {
1668 ret = RES_DB_QUERY_ERROR;
1669 }
1670 }else{
1671 ret = RES_DB_QUERY_ERROR;
1672 }
1673
1674 return ret;
1675 }
1676
1677 /**
1678 *
1679 * ?祉???激?с?潟???膣違??session_t?у??????.<br>
1680 *
1681 * @param sid ?祉???激?с??D
1682 * @param ppsession sessionid_t*???????????????????ゃ?潟?帥??
1683 * @return RES_OK ??????freeResult(*ppsession)??綽?荀???<br>
1684 * @return RES_NO_SUCH_SESSION<br>
1685 * @return RES_DB_QUERY_ERROR<br>
1686 * @return RES_DB_NOT_INITIALIZED
1687 *
1688 */
1689 result_t getSession( sessionid_t sid, const session_t** ppsession )
1690 {
1691 if( mysql == NULL ) return RES_DB_NOT_INITIALIZED;
1692
1693 result_t ret;
1694 string sql;
1695
1696 sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
1697 "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
1698 if( 0 == fp_mysql_query( mysql, sql.c_str( ) ) ){
1699 MYSQL_RES* result = fp_mysql_store_result( mysql );
1700 if( result ){
1701 MYSQL_ROW row = fp_mysql_fetch_row(result);
1702 if( row ){
1703 session_t *p = new session[1];
1704 p->setSessionID(sid);
1705 p->setUserID(atoi( row[1] != NULL ? row[1] : "" ));
1706 p->setDate(atoi( row[2] != NULL ? row[2] : "" ));
1707 *ppsession = p;
1708 ret = RES_OK;
1709 }else{
1710 ret = RES_NO_SUCH_SESSION;
1711 }
1712 fp_mysql_free_result( result );
1713 }else {
1714 ret = RES_DB_QUERY_ERROR;
1715 }
1716 }else{
1717 ret = RES_DB_QUERY_ERROR;
1718 }
1719
1720 return ret;
1721 }
1722
1723 /**
1724 *
1725 * ?祉???激?с?潟???綵??с?????с????????.
1726 *
1727 * @param sid ???с??????????session
1728 * @return true 罩e?
1729 * @return false 筝?罩?/span>
1730 *
1731 */
1732 bool isValidSessionID( sessionid_t sid )
1733 {
1734 if( mysql == NULL ) return false;
1735
1736 bool ret;
1737 string sql;
1738 string sidstr;
1739 char buf[ 12 ];
1740 snprintf( buf, 12, "%d", sid );
1741
1742 sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf );
1743 if( fp_mysql_query( mysql, sql.c_str( ) ) ){
1744 return false;
1745 }
1746 MYSQL_RES* result = fp_mysql_store_result( mysql );
1747 if( result ){
1748 MYSQL_ROW row = fp_mysql_fetch_row(result);
1749 if( row ){
1750 ret = true;
1751 }else{
1752 ret = false;
1753 }
1754 fp_mysql_free_result( result );
1755 }
1756 return ret;
1757 }
1758
1759 void freeResult( const account_t* ptr ){ delete[] ( account_t* )ptr; }
1760 void freeResult( const group_t* ptr ){ delete[] ( group_t* )ptr; }
1761 void freeResult( const session_t* ptr ){ delete[] ( session_t* )ptr; }
1762 void freeResult( const int* ptr ){ delete[] ( int* )ptr; }
1763
1764 static string errstr;
1765 const char* getLastErrorString()
1766 {
1767 return errstr.c_str( );
1768 }
1769
1770 void setLastErrorString( const char* str )
1771 {
1772 errstr = str;
1773 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26