Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

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


Revision 1.29 - (hide annotations) (download) (as text)
Sat Dec 18 01:12:29 2004 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.28: +11 -5 lines
File MIME type: text/x-c++src
freeResultの関数名をfree<データ型>に変更した.

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

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