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.20 - (show annotations) (download) (as text)
Wed Dec 1 04:37:04 2004 UTC (19 years, 4 months ago) by youi
Branch: MAIN
Changes since 1.19: +92 -25 lines
File MIME type: text/x-c++src
freeResult: unsigned int* を int* へ修正.
コメント部に関数の説明を追記.

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

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