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.30 - (show annotations) (download) (as text)
Sat Dec 18 10:24:54 2004 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.29: +5 -2 lines
File MIME type: text/x-c++src
IMPORT_MYSQLDLLを定義したとき,MYSQLのDLLを動的リンクするプロトタイプ宣言が
有効になるように修正した.

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

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