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.35 - (hide annotations) (download) (as text)
Thu Jan 6 07:20:17 2005 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.34: +194 -91 lines
File MIME type: text/x-c++src
WIN32定義時のインクルードの追加.
MySQL APIに関するヘッダファイルを削除.
deleteAccount: 所属するPlatformグループからの削除を内蔵した.
insertAccount: ユーザ登録と同時にデフォルトPlatformグループへ登録する.
deleteMember: デフォルトPlatformグループからの削除を禁止する.
deleteMemberNoLimitの定義.

1 youi 1.1 /*
2     *
3 youi 1.35 * $Revision: 1.34 $
4 youi 1.2 * $Log: commonal.cc,v $
5 youi 1.35 * Revision 1.34 2004/12/28 04:38:14 aga
6     * ??ogoutUser()??信罩?
7     *
8 aga 1.34 * Revision 1.33 2004/12/27 05:56:23 youi
9     * odbcDiagString: STMT篁ュ?????潟??????????????????????眼????.
10     * syslog?<???祉?若?吾????????菴遵??????.
11     *
12 youi 1.33 * Revision 1.32 2004/12/25 09:46:47 youi
13     * MySQL+MyODBC?у??篏???????????信罩c????.
14     *
15 youi 1.32 * Revision 1.31 2004/12/21 11:42:59 youi
16     * ?潟?<?潟??????逸??祉???ゃ???????????菴遵??.
17     *
18 youi 1.31 * Revision 1.30 2004/12/18 10:24:54 youi
19     * IMPORT_MYSQLDLL??絎?臂?????????鐚?MYSQL??LL?????????潟?????????????帥?ゃ??絎h???
20     * ???鴻????????????信罩c????.
21     *
22 youi 1.30 * Revision 1.29 2004/12/18 01:12:29 youi
23     * freeResult???∽?医????free<???若?水??>????眼????.
24     *
25 youi 1.29 * Revision 1.28 2004/12/14 12:02:08 youi
26     * __WIN__??絎?臂???????????indows??ll篏??????荀?????????茵?????.
27     * USE_SYSLOG??絎?臂???????????yslogd?吾?<???祉?若?吾???阪??????.
28     * getAccounts: uidsLen??0??????????????菴遵??????.
29     *
30 youi 1.28 * Revision 1.27 2004/12/06 11:34:47 aga
31     * ??ninitializeDB()??菴遵??.
32     *
33 aga 1.27 * Revision 1.26 2004/12/06 10:17:36 youi
34     * mysql_use_result????腟?????罧??????????冴??????鐚?
35     * while( row = mysql_fetch_row(result) );???水?ワ?
36     *
37 youi 1.26 * Revision 1.25 2004/12/06 07:24:33 youi
38     * insertAccount, insertGroup:
39     * ?域?菴遵?????????宴???綽????????若??D鐚??違???若??ID??膃??綣??違???吾??莨若??.
40     *
41 youi 1.25 * Revision 1.24 2004/12/06 01:45:50 aga
42     * ?祉?潟?<?潟???ゃ??.
43     * ?脂???上???篆??.
44     *
45 aga 1.24 * Revision 1.23 2004/12/04 09:21:10 aga
46     * ??p_config ?? vpaccount_config.
47     *
48 aga 1.23 * Revision 1.22 2004/12/03 07:17:21 youi
49     * isModerator?с?≪???祉?鴻???????若?帥???若?鴻???若????????篆??.
50     *
51 youi 1.22 * Revision 1.21 2004/12/01 10:28:58 youi
52     * DB????????????眼??軸??篆??
53     * institute -> division
54     * organizaion -> company_name
55     *
56 youi 1.21 * Revision 1.20 2004/12/01 04:37:04 youi
57     * freeResult: unsigned int* ?? int* ?娯信罩?
58     * ?潟?<?潟???????∽?違???????菴処?.
59     *
60 youi 1.20 * Revision 1.19 2004/11/30 06:40:11 youi
61     * ?∽?違??菴遵??(gidExists, uidExists)
62     * getGroupCount??絎?臂?
63     * getGroupsByUid??絎?臂?
64     * isGroupAdmin??篆??.
65     * dumpGroupAdmins??絎?臂?
66     * deleteMember??絎?臂?
67     * insertMember??絎?臂?
68     * getMembers??絎?臂?
69     * isModerator??絎?臂?
70     *
71 youi 1.19 * Revision 1.18 2004/11/30 05:46:32 aga
72     * ??ession????remoteHost??????
73     *
74 aga 1.18 * Revision 1.17 2004/11/27 09:35:49 youi
75     * isActivated??絎?臂?
76     * activate??絎?臂?
77     * dumpUid??絎?臂?
78     *
79 youi 1.17 * Revision 1.16 2004/11/27 06:29:29 youi
80     * getAccountCount??絎?臂?
81     * dumpGids??絎?臂?
82     * insertGroup, deleteGroup, updateGroup??絎?臂?
83     * getGroup, getGroups??絎?臂?
84     * ???若?帥???若?劫?????????弱?冴?????鐚?RES_DB_NOT_INITIALIZED??菴????????????∽?違??申??
85     * (???綽????∽?違??罧??c??????)
86     *
87 youi 1.16 * Revision 1.15 2004/11/27 02:22:22 aga
88     * ??nitializeDB????ddSlashes()???若?吟???純?<??????篆??.
89     *
90 aga 1.15 * Revision 1.14 2004/11/27 01:07:31 youi
91     * criteria2str: LIMIT??RDER BY?????????ャ???帥????.
92     *
93 youi 1.14 * Revision 1.13 2004/11/27 00:35:39 youi
94     * getAccounts??絎?臂?
95     * getAccount??篆??鐚???????etAccounts???若?喝?冴??.
96     * criteria2str??絎?臂?
97     *
98 youi 1.13 * Revision 1.12 2004/11/26 09:45:28 youi
99     * getAccount??絎?臂?
100     *
101 youi 1.12 * Revision 1.11 2004/11/26 08:16:26 aga
102     * ??etSession, loginUser, createSession, freeResult(const session_t*) 篆??.
103     *
104 aga 1.11 * Revision 1.10 2004/11/26 07:57:42 youi
105     * updateAccount, deleteAccount??絎?臂?
106     * mysql_query紊掩??????tderr?吾?????若?潟?若?????????若?<???祉?若?吾???阪??.
107     *
108 youi 1.10 * Revision 1.9 2004/11/26 07:38:02 aga
109     * ??AILUE -> FAILURE.
110     *
111 aga 1.9 * Revision 1.8 2004/11/26 06:36:55 aga
112     * ??reateSession, getSession ??篏???.
113     *
114 aga 1.8 * Revision 1.7 2004/11/26 04:51:47 youi
115     * dbprefix??絎?臂?????.
116     * insertAccount??絎?臂?????.
117     * isValidSessionID??絎?臂?????.
118     *
119 youi 1.7 * Revision 1.6 2004/11/26 04:35:55 aga
120     * ??oginUser(), logoutUser()??篏???.
121     *
122 aga 1.6 * Revision 1.5 2004/11/26 01:08:25 aga
123     * ??ddSlashes()篏???.
124     *
125 aga 1.5 * Revision 1.4 2004/11/25 12:14:29 youi
126     * getUid????????絎?臂?????.
127     *
128 youi 1.4 * Revision 1.3 2004/11/25 11:13:59 youi
129     * getLastErrorString/setLastErrorString??絎?臂?
130     *
131 youi 1.3 * Revision 1.2 2004/11/25 08:55:19 youi
132     * 綣??違??????篆??.
133     * freeResult??菴遵??.
134     *
135 youi 1.2 * Revision 1.1 2004/11/25 05:14:58 youi
136     * initial version
137     *
138 youi 1.1 *
139     */
140 youi 1.35 #ifdef WIN32
141     #include <windows.h>
142 youi 1.28 #endif
143    
144     #ifdef USE_SYSLOG
145     #include <syslog.h>
146     #endif
147    
148 youi 1.1 #include <stdio.h>
149 aga 1.6 #include <stdlib.h>
150 youi 1.1 #include <string.h>
151 youi 1.3 #include <string>
152 aga 1.27 #include <assert.h>
153 youi 1.32 #include <sql.h>
154     #include <sqlext.h>
155 youi 1.7 using namespace std;
156 youi 1.1
157     #include "common.h"
158     #include "account.h"
159     #include "group.h"
160     #include "session.h"
161     #include "criteria.h"
162     #include "commonal.h"
163    
164 youi 1.32 static string dbprefix; //!< XOOPS???若?帥???若?鴻???若??????REFIX
165    
166     static SQLHANDLE henv = NULL;
167     static SQLHANDLE hdbc = NULL;
168     static SQLHANDLE hstmt = NULL;
169    
170 youi 1.33 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
171 youi 1.35 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
172 youi 1.32
173     static result_t countResultRows( const char* sql, SQLINTEGER* count )
174     {
175     result_t ret = RES_ERROR;
176     SQLRETURN sqlcode;
177     SQLHANDLE hstmt = NULL;
178     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
179     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
180     *count = 0;
181     while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
182     ret = RES_OK;
183     }else{
184     string s( "SQLExecDirect in countResultRows " );
185 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
186 youi 1.32 s += "sql=";
187     s += string( sql );
188     setLastErrorString( s.c_str( ) );
189     ret = RES_DB_QUERY_ERROR;
190     }
191     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
192     }
193     return ret;
194     }
195    
196     /**
197     *
198     * ??絖????潟???種?
199     * ??絎???絖??違???潟???若??鐚????????<????緇???NULL腟?腴?????鐚?/span>
200     * ( dst???泣?ゃ? >= len + 1 )?с????????/span>
201     *
202     */
203     static char* strncpy2( char* dst, const char* src, int len )
204     {
205     strncpy( dst, src, len );
206     dst[ len ] = '\0';
207     // fprintf( stderr, "strncpy2 '%s'\n", dst );
208     return dst;
209     }
210    
211     /**
212     *
213     * SQL???茵?腟????????????惹??絖?????????????
214     *
215     * @param hstmt SQL??????潟????/span>
216     * @param sqlcode SQLExecDirect,SQLExecute???祉????/span>
217     * @return ?????惹??絖???
218     */
219 youi 1.33 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
220 youi 1.32 {
221     string s;
222     if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
223     SQLCHAR SQLState[6];
224     SQLINTEGER NativeError;
225     SQLCHAR MessageText[ 1024 ];
226     SQLSMALLINT BufferLength;
227     SQLSMALLINT TextLength;
228 youi 1.33 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
229 youi 1.32
230     s += string( (char*)MessageText );
231     s += " SQLSTATE=";
232     s += string( (char*)SQLState );
233    
234     }
235     s += " sqlcode=";
236     s += intToString( sqlcode );
237     return s;
238     }
239    
240     /**
241     *
242     * ??絎??????????ゃ???????冴??????????絖?????菴???
243     *
244     */
245     string getResultCol( SQLHANDLE hstmt, int col )
246     {
247     string s;
248     SQLRETURN sqlcode;
249     SQLCHAR BinaryPtr[5000];
250     SQLUINTEGER PartID;
251     SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes;
252     SQLRETURN rc;
253    
254     while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
255     &BinaryLenOrInd)) != SQL_NO_DATA) {
256     NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
257 youi 1.33 if( NumBytes >= 0 ){
258     s += string( (char*)BinaryPtr, NumBytes );
259     }
260 youi 1.32 }
261 youi 1.33 #ifdef USE_SYSLOG
262     // openlog( "commonal", LOG_ODELAY, LOG_USER );
263     // syslog( LOG_DEBUG, "getResultCol col=%d ret='%s'\n", col, s.c_str());
264     // closelog( );
265     #endif
266 youi 1.32 return s;
267     }
268 youi 1.7
269 aga 1.5
270     /**
271     *
272 youi 1.32 * ?????若????????\荐??激?с???鴻?宴?若??????
273 aga 1.5 *
274 youi 1.32 * @param str addslashes???鴻????絖?????NULL??絎?筝?????
275     * @return 紊???緇?????絖???
276 aga 1.5 */
277     string addSlashes( const char *str )
278     {
279 youi 1.32 if ( hdbc == NULL ){
280 aga 1.15 string s;
281     return s;
282 youi 1.32 }else{
283     string s( str );
284     return s;
285     }
286    
287     int len = strlen(str) * 3;
288     char* dst = new char[ len ];
289     const char* from = str;
290     char* to = dst;
291     while( *from != '\0' ){
292     switch( *from ){
293     case '\'':
294     case '\"':
295     case ';':
296     *to = '\\'; to++;
297     break;
298     }
299     *to = *from; to++;
300     from++;
301     }
302     *to = '\0';
303     string s( dst );
304     delete[] dst;
305 aga 1.5 return s;
306     }
307    
308 youi 1.13 /**
309     *
310 youi 1.19 * gid??????????с????
311     * DB???≪???祉?劫け????????false??????鐚?/span>
312     *
313     * @param gid ???с??????????GID
314     * @return true 絖???????
315     * @return false 絖?????????
316     *
317     */
318     static bool gidExists( groupid_t gid )
319     {
320     string sql;
321 youi 1.32 SQLRETURN sqlcode;
322     SQLHANDLE hstmt = NULL;
323 youi 1.19
324 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
325     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
326     return false;
327     }
328    
329 youi 1.19 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
330     sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
331 youi 1.32 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
332     setLastErrorString( "SQLExecDirect in gidExists" );
333     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
334 youi 1.19 return false;
335     }
336 youi 1.32
337     if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
338     setLastErrorString( "SQLFetch in gidExists" );
339     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
340 youi 1.19 return false;
341     }
342 youi 1.32
343     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
344 youi 1.19 return true;
345     }
346    
347    
348     /**
349     *
350 youi 1.20 * Platform???若?倶???宴??id??絖??????????????с????
351 youi 1.19 * DB???≪???祉?劫け????????false??????鐚?/span>
352     *
353     * @param uid ???с??????????UID
354     * @return true 絖???????
355     * @return false 絖?????????
356     *
357     */
358     static bool uidExists( userid_t uid )
359     {
360 youi 1.32 bool ret = false;
361 youi 1.19 string sql;
362 youi 1.32 SQLRETURN sqlcode;
363     SQLINTEGER count = 0;
364 youi 1.19
365     sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
366     sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
367 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
368     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
369     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
370     ret = true;
371     }else{
372     string s( "SQLFetch in uidExists ");
373 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
374 youi 1.32 s += string( ", sql=" ) + string( sql );
375     setLastErrorString( s.c_str( ) );
376     ret = false;
377     }
378     }else{
379     string s( "SQLExecDirect in uidExists ");
380 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
381 youi 1.32 s += string( ", sql=" ) + string( sql );
382     setLastErrorString( s.c_str( ) );
383     ret = false;
384     }
385     }else{
386     string s( "SQLAllocHandle in uidExists ");
387 youi 1.35 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
388 youi 1.32 setLastErrorString( s.c_str( ) );
389     ret = false;
390 youi 1.19 }
391 youi 1.32 return ret;
392 youi 1.19 }
393    
394    
395     /**
396     *
397 youi 1.13 * criteria ?? SQL?????????
398     *
399     *
400     *
401     */
402     string criteria2str( criteria* cri )
403     {
404     string sql;
405    
406     const orderby* odrby = cri -> headOrderBy( );
407     if( odrby != 0 ){
408     sql += " ORDER BY " + string( odrby -> getColumn( ) );
409     sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
410     while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
411     sql += ", " + string( odrby -> getColumn( ) );
412     sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
413     }
414 youi 1.14 }
415    
416     if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
417     sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
418     + ", " + string( intToString( cri -> getLimitRows( ) ) );
419 youi 1.13 }
420     return sql;
421     }
422 youi 1.1
423 youi 1.32
424 youi 1.1 /**
425     *
426     * ???若?帥???若?鴻????????
427     *
428 youi 1.32 * @param dsn DSN
429 youi 1.1 * @param user ???若?帥???若?鴻???≪???祉?鴻???????若?九??
430     * @param password 筝?荐????若?吟?????鴻???若??
431 youi 1.32 * @param dbname ??????/span>
432 youi 1.1 * @param prefix XOOPS???若?帥???若?鴻???若??????REFIX
433 youi 1.31 * @return RES_OK
434     * @return RES_DB_INITIALIZE_ERROR
435     * @return RES_DB_CONNECT_ERROR
436 youi 1.1 * @refer result_t
437     */
438 youi 1.32 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix )
439 youi 1.1 {
440 youi 1.32 SQLRETURN sqlcode;
441    
442 youi 1.33 #ifdef USE_SYSLOG
443     openlog( "commonal", LOG_ODELAY, LOG_USER );
444     #endif
445 youi 1.1 // ?≪??・膓?筝???????筝???????/span>
446 youi 1.32 if ( hdbc != NULL )
447     SQLDisconnect( hdbc );
448 youi 1.1
449 youi 1.7 dbprefix = prefix;
450    
451 youi 1.32 // ????????・膓?
452     // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
453     if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) != SQL_SUCCESS ) {
454     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
455 youi 1.33 #ifdef USE_SYSLOG
456     syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
457     closelog( );
458     #endif
459 youi 1.32 return RES_DB_INITIALIZE_ERROR;
460     }
461     //ODBC Ver.3 ????????????????????с??荐??
462     SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
463 aga 1.27
464 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
465     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
466 youi 1.33 #ifdef USE_SYSLOG
467     syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
468     closelog( );
469     #endif
470 youi 1.1 return RES_DB_INITIALIZE_ERROR;
471     }
472 youi 1.32 //???違?ゃ?潟??腱?篁ヤ?荀????????帥?ゃ???≪????????荐??
473     SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
474 youi 1.33
475 youi 1.32 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
476 youi 1.33 string s( "SQLConnect in initializeDB " );
477     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
478     setLastErrorString( s.c_str( ) );
479     #ifdef USE_SYSLOG
480     syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
481     closelog( );
482     #endif
483 youi 1.1 return RES_DB_CONNECT_ERROR;
484 aga 1.27 }
485 youi 1.33 #ifdef USE_SYSLOG
486     syslog( LOG_DEBUG, "initializeDB succeed" );
487     closelog( );
488     #endif
489 aga 1.27 return RES_OK;
490     }
491    
492     /**
493     *
494     * DB?ョ????????違???????????障??????
495     *
496     * @param ????
497     * @return RES_OK
498     */
499     result_t uninitializeDB()
500     {
501 youi 1.32 if ( hdbc != NULL ){
502     SQLDisconnect( hdbc );
503     hdbc = NULL;
504 youi 1.1 }
505 youi 1.2 return RES_OK;
506 youi 1.1 }
507    
508     /**
509     *
510     * Platform???若?倶?粋??倶????緇?
511     *
512 youi 1.31 * @param sid ?祉???激?с??D
513     * @param uid ?倶??????緇??????????若?吟??ID
514     * @return true ?粋?羝???/span>
515     * @return false ???粋?
516 youi 1.1 *
517     */
518 youi 1.2 bool isActivated( sessionid_t sid, userid_t uid )
519 youi 1.1 {
520 youi 1.32 if( hdbc == NULL ) return false;
521 youi 1.17 if( !isValidSessionID( sid ) ) return false;
522    
523 youi 1.32 bool ret = false;
524 youi 1.17 string sql;
525 youi 1.32 SQLRETURN sqlcode;
526     SQLHANDLE hstmt = NULL;
527 youi 1.17
528     sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
529     sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
530 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
531     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
532     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
533     ret = true;
534     }else{
535     string s( "SQLFetch in isActivated " );
536 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
537 youi 1.32 s += ", sql=" + sql;
538     setLastErrorString( s.c_str() );
539     ret = false;
540     }
541     }else{
542     string s( "SQLExecDirect in isActivated " );
543 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
544 youi 1.32 s += ", sql=" + sql;
545     setLastErrorString( s.c_str() );
546     ret = false;
547     }
548     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
549     }else{
550     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
551     ret = false;
552 youi 1.17 }
553 youi 1.32 return ret;
554 youi 1.1 }
555    
556     /**
557     *
558     * Platform???若?倶?粋??倶??紊???/span>
559     *
560 youi 1.31 * @param sid ?祉???激?с??D
561     * @param uid 紊??眼?????????若?吟??ID
562     * @param activate ?粋?(true) / ???粋?(false)????絎?
563     * @return RES_OK
564     * @return RES_DB_QUERY_ERROR
565     * @return RES_NO_SUCH_USER
566 youi 1.1 */
567 youi 1.2 result_t activate( sessionid_t sid, userid_t uid, bool activate )
568 youi 1.1 {
569 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
570 youi 1.17 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
571    
572     string sql;
573 youi 1.32 SQLRETURN sqlcode;
574     result_t ret = RES_ERROR;
575 youi 1.17
576     sql = "UPDATE " + dbprefix + "_vpaccount_users ";
577     sql += "SET activate=" + string( activate ? "1" : "0" );
578     sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
579 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
580     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
581     SQLINTEGER count = 0;
582     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
583     ret = RES_OK;
584     }else{
585     string s( "SQLRowCount in activate ");
586 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
587 youi 1.32 s += string( ", sql=" ) + string( sql );
588     setLastErrorString( s.c_str( ) );
589     ret = RES_NO_SUCH_USER;
590     }
591     }else{
592     string s( "SQLExecDirect in activate " );
593 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
594 youi 1.32 s += ", sql=";
595     s += string( sql );
596     setLastErrorString( s.c_str( ) );
597     ret = RES_DB_QUERY_ERROR;
598     }
599     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
600     }else{
601     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
602     ret = RES_ERROR;
603 youi 1.17 }
604 youi 1.32 return ret;
605 youi 1.1 }
606    
607     /**
608     *
609 youi 1.31 * ?≪?????潟???違????緇?????鐚?/span>
610 youi 1.1 *
611 youi 1.31 * @param sid ?祉???激?с??D
612     * @return ?≪?????潟????/span>
613 youi 1.1 *
614     */
615 youi 1.2 int getAccountCount( sessionid_t sid )
616 youi 1.1 {
617 youi 1.32 if( hdbc == NULL ) return 0;
618 youi 1.16 if( !isValidSessionID( sid ) ) return 0;
619    
620     int ret = 0;
621     string sql;
622 youi 1.32 SQLRETURN sqlcode;
623     SQLHANDLE hstmt = NULL;
624 youi 1.16
625     //?≪?????潟???違??羆?????
626     sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
627 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
628     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
629     SQLUINTEGER count = 0;
630     SQLINTEGER len;
631     SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
632     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
633     ret = count;
634     }else {
635     string s( "SQLFetch in getAccountCount sql=" );
636     s += string( sql );
637     setLastErrorString( s.c_str( ) );
638     ret = 0;
639     }
640     }else{
641     setLastErrorString( "SQLExecDirect in getAccountCount" );
642     ret = 0;
643     }
644     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
645 youi 1.16 }else{
646 youi 1.32 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
647     ret = 0;
648 youi 1.16 }
649     return ret;
650 youi 1.1 }
651    
652     /**
653     *
654     * ?≪?????潟??????/span>
655 youi 1.35 * ?違???若???????????ゃ?????若?倶???宴?????ゃ??茵??????障??鐚?/span>
656 youi 1.1 *
657     * @param
658 youi 1.20 * @return RES_OK
659 youi 1.35 * @return RES_ERROR
660 youi 1.31 * @return RES_DB_NOT_INITIALIZED
661 youi 1.20 * @return RES_NO_SUCH_SESSION
662     * @return RES_DB_QUERY_ERROR
663 youi 1.1 *
664     */
665 youi 1.2 result_t deleteAccount( sessionid_t sid, userid_t uid )
666 youi 1.1 {
667 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
668 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
669 youi 1.32
670     result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
671 youi 1.35 criteria_t c;
672 youi 1.32 string sql;
673 youi 1.35 groupid_t* gids;
674     int gidsLen;
675 youi 1.32 SQLRETURN sqlcode;
676     SQLHANDLE hstmt = NULL;
677 youi 1.10
678 youi 1.35 /*
679     1. delete user from default platform group
680     2. delete user profile from xoops_users
681     3. delete platform user from vpaccount_users
682     */
683    
684     //1. delete user from platform groups
685     c.clearAll();
686     if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
687     for( int i = 0; i < gidsLen; i++ )
688     deleteMemberNoLimit( sid, gids[ i ], uid );
689     freeGID( gids );
690     }
691    
692     //2. delete user profile from xoops_users
693 youi 1.10 sql = "DELETE FROM " + dbprefix + "_users ";
694     sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
695 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
696     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
697     SQLINTEGER count = 0;
698     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
699     ret1 = RES_OK;
700     }else{
701     string s( "SQLRowCount in deleteAccount" );
702 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
703 youi 1.32 s += string( ", sql=" ) + string( sql );
704     setLastErrorString( s.c_str( ) );
705     ret1 = RES_NO_SUCH_USER;
706     }
707     }else{
708     string s( "SQLExecDirect in deleteAccount" );
709 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
710 youi 1.32 s += ", sql=";
711     s += string( sql );
712     setLastErrorString( s.c_str( ) );
713     ret1 = RES_DB_QUERY_ERROR;
714     }
715     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
716     }else{
717     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
718     ret1 = RES_ERROR;
719 youi 1.10 }
720    
721 youi 1.35 //3. delete platform user from vpaccount_users
722 youi 1.10 sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
723     sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
724 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
725     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
726     SQLINTEGER count = 0;
727     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
728     ret2 = RES_OK;
729     }else{
730     string s( "SQLRowCount in deleteAccount" );
731 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
732 youi 1.32 s += string( ", sql=" ) + string( sql );
733     setLastErrorString( s.c_str( ) );
734     ret2 = RES_NO_SUCH_USER;
735     }
736     }else{
737     string s( "SQLExecDirect in deleteAccount" );
738 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
739 youi 1.32 s += ", sql=";
740     s += string( sql );
741     setLastErrorString( s.c_str( ) );
742     ret2 = RES_DB_QUERY_ERROR;
743     }
744     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
745     }else{
746     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
747     ret2 = RES_ERROR;
748 youi 1.10 }
749    
750 youi 1.32 //筝??鴻?с???????若?????????若??菴???
751     return ret1 != RES_OK ? ret1 : ret2;
752 youi 1.1 }
753    
754     /**
755     *
756     * ?≪?????潟?????怨??
757     *
758 youi 1.13 * @param sid ?祉???激?с??D
759     * @param uid ??緇??????????若?吟??ID
760     * @param acc ??緇??????≪?????潟??????account_t)?????ゃ?潟?帥???吾??莨若??綣???/span>
761 youi 1.20 * @return RES_OK
762 youi 1.31 * @return RES_DB_NOT_INITIALIZED
763 youi 1.20 * @return RES_NO_SUCH_USER
764     * @return RES_NO_SUCH_SESSION
765     * @return RES_DB_QUERY_ERROR
766 youi 1.1 *
767     */
768 youi 1.12 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
769 youi 1.1 {
770 youi 1.13 int len;
771     static criteria c;
772     result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
773     if( len == 0 ) return RES_NO_SUCH_USER;
774     return res;
775     }
776    
777     /**
778     *
779     * ?≪?????潟?????怨??
780     *
781     * @param sid ?祉???激?с??D
782     * @param uids ??緇??????????若?吟??ID??????
783     * @param uidsLen uids???????膣???/span>
784     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
785     * @param accounts 罎?膣∝??????????????ゃ?潟?帥???吾??莨若??綣???/span>
786     * @param accountsLen 罎?膣∝???????????*accounts???膣???
787 youi 1.31 * @return RES_OK
788     * @return RES_DB_NOT_INITIALIZED
789     * @return RES_NO_SUCH_SESSION
790 youi 1.20 * @return RES_DB_QUERY_ERROR
791 youi 1.13 *
792     */
793     result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
794     {
795 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
796 youi 1.12 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
797 youi 1.28 if( uidsLen <= 0 ){
798     *accounts = new account_t[ 0 ];
799     *accountsLen = 0;
800     #ifdef USE_SYSLOG
801 youi 1.33 openlog( "commonal", LOG_ODELAY, LOG_USER );
802     syslog( LOG_DEBUG, "getAccounts succeed len=0" );
803     closelog( );
804 youi 1.28 #endif
805     return RES_OK;
806     }
807 youi 1.12
808 youi 1.33 #ifdef USE_SYSLOG
809     openlog( "commonal", LOG_ODELAY, LOG_USER );
810     syslog( LOG_DEBUG, "begin of getAccounts" );
811     #endif
812 youi 1.32 result_t ret = RES_ERROR;
813     SQLRETURN sqlcode;
814     SQLHANDLE hstmt = NULL;
815 youi 1.12 string sql;
816 youi 1.13 account_t* dst = new account_t[ uidsLen ];
817 youi 1.12
818 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 ";
819 youi 1.13 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 ";
820 youi 1.28 sql += "WHERE u1.uid = u2.uid ";
821     if( uidsLen > 0 ){
822 youi 1.33 #ifdef USE_SYSLOG
823     syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", 0, uids[0] );
824     #endif
825 youi 1.28 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
826     for( int i = 1; i < uidsLen; i++ ){
827 youi 1.33 #ifdef USE_SYSLOG
828     syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", i, uids[i] );
829     #endif
830 youi 1.28 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
831     }
832     sql += " ) ";
833 youi 1.12 }
834 youi 1.13 sql += criteria2str( cri );
835 youi 1.33 #ifdef USE_SYSLOG
836     syslog( LOG_DEBUG, "sql=%s", sql.c_str() );
837     #endif
838 youi 1.32
839     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
840     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
841     SQLINTEGER len;
842     userid_t uid = 0;
843     SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
844     *accountsLen=0;
845     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
846     dst[ i ].setUID( uid );
847     dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
848     dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
849     dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
850     dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
851     dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
852     dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
853     dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
854     dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
855     dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
856     dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
857     dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
858     dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
859     dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
860     dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
861     dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
862     dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
863     dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
864     dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
865     dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
866     dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
867     dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
868     dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
869     dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
870     dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
871     dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
872     dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
873     dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
874     dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
875     dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
876     dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
877     dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
878     dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
879     dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
880     dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
881     dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
882     dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
883     dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
884     dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
885     dst[ i ].setBaseURL( getResultCol( hstmt, 40 ).c_str() );
886     dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 41 ).c_str() ));
887     dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 42 ).c_str() ));
888 youi 1.33 #ifdef USE_SYSLOG
889     syslog( LOG_DEBUG, "set to account_t %d", i );
890     #endif
891 youi 1.32 ( *accountsLen )++;
892     }
893     *accounts = dst;
894 youi 1.33 #ifdef USE_SYSLOG
895     syslog( LOG_DEBUG, "getAccounts succeed" );
896     #endif
897 youi 1.32 ret = RES_OK;
898     }else{
899 youi 1.33 string s( "SQLExecDirect in getAccounts" );
900     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
901     s += string( ", sql=" ) + string( sql );
902     setLastErrorString( s.c_str( ) );
903     #ifdef USE_SYSLOG
904     syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
905     #endif
906 youi 1.32 ret = RES_DB_QUERY_ERROR;
907     }
908     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
909     }else{
910 youi 1.33 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
911     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
912     setLastErrorString( s.c_str( ) );
913     #ifdef USE_SYSLOG
914     syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
915     #endif
916 youi 1.32 ret = RES_DB_QUERY_ERROR;
917 youi 1.12 }
918 youi 1.33 #ifdef USE_SYSLOG
919     closelog( );
920     #endif
921 youi 1.32 return ret;
922 youi 1.1 }
923    
924     /**
925     *
926 youi 1.25 * ?≪?????潟???脂??
927 youi 1.35 *
928 youi 1.25 * ???若?倶???宴?????若?帥???若?鴻???脂?蚊???障??鐚?/span>
929 youi 1.35 * ?脂?蚊???????若?倶???宴???綽????????若??D??uid???主????障??鐚?/span>
930 youi 1.1 *
931 youi 1.7 * @param sid ?祉???激?с??/span>
932 youi 1.10 * @param account ?脂?蚊?????≪?????潟??????/span>
933 youi 1.25 * @param uid ?脂?蚊?????≪?????潟?????宴???綽????????若??D
934 youi 1.20 * @return RES_OK
935     * @return RES_NO_SUCH_SESSION
936     * @return RES_DB_QUERY_ERROR
937 youi 1.31 * @return RES_DB_NOT_INITIALIZED
938 youi 1.1 *
939     */
940 youi 1.25 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
941 youi 1.1 {
942 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
943 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
944    
945 youi 1.7 string sql;
946     string tmp;
947     char buf[ 12 ];
948 youi 1.32 SQLRETURN sqlcode;
949     result_t ret = RES_ERROR;
950 youi 1.7
951 youi 1.35 /*
952     1. insert user profile into xoops_users
953     2. insert platform user profile into vpaccount_users
954     3. add user to default platform group
955     */
956    
957     //1.xoops?????若?吟???若???????吾??莨若??
958 youi 1.32 SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];
959     SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
960     SQLDOUBLE timezone_offset;
961    
962     SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
963     SQLINTEGER cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
964    
965     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
966     string sql;
967     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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
968     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
969     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
970     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
971     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
972     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
973     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
974     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
975     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
976     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
977     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
978     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
979     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
980     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
981     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
982     SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
983     SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
984     SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
985     SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
986     SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
987     SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
988     SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
989     SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
990     SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
991     SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
992     SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
993     SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
994     SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
995     SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
996     SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
997     SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
998     SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
999     SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1000    
1001     strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1002     strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1003     strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1004     strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1005     strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1006     user_regdate = time( NULL );
1007     strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1008     strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1009     strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1010     user_viewemail = account -> getUserViewemail( );
1011     strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1012     strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1013     strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1014     strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1015     strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1016     posts = account -> getPosts( );
1017     attachsig = account -> getAttachsig( );
1018     rank = account -> getRank( );
1019     level = account -> getLevel( );
1020     strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1021     timezone_offset = account -> getTimezoneOffset( );
1022     last_login = 0;
1023     strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1024     uorder = account -> getUorder( );
1025     notify_method = account -> getNotifyMethod( );
1026     notify_mode = account -> getNotifyMode( );
1027     strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1028     strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1029     strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1030     user_mailok = account -> getUserMailok( );
1031    
1032     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1033     SQLINTEGER count = 0;
1034     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1035     //???若??D????緇?????
1036     SQLHANDLE hstmt2 = NULL;
1037     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1038     sql = "SELECT LAST_INSERT_ID()"; // MySQL
1039     // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
1040     if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1041     SQLUINTEGER last_insert_id;
1042     SQLINTEGER len;
1043     SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
1044     if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
1045     *uid = last_insert_id;
1046     ret = RES_OK;
1047     }else{
1048     ret = RES_DB_QUERY_ERROR;
1049     string s( "SQLFetch in insertAccount " );
1050 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1051 youi 1.32 setLastErrorString( s.c_str( ) );
1052     }
1053     }else{
1054     string s( "SQLExecDirect in insertAccount " );
1055 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1056 youi 1.32 setLastErrorString( s.c_str( ) );
1057     ret = RES_DB_QUERY_ERROR;
1058     }
1059     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1060     }
1061     }else{
1062     string s( "SQLRowCount in insertAccount sql=" );
1063     s += string( sql );
1064     setLastErrorString( s.c_str( ) );
1065     ret = RES_DB_QUERY_ERROR;
1066     }
1067     }else{
1068     string s( "SQLExecute in insertAccount " );
1069 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1070 youi 1.32 setLastErrorString( s.c_str( ) );
1071     ret = RES_DB_QUERY_ERROR;
1072     }
1073     }else{
1074     string s( "SQLPrepare in insertAccount " );
1075 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1076 youi 1.32 setLastErrorString( s.c_str( ) );
1077     ret = RES_ERROR;
1078     }
1079     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1080     }else{
1081     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1082     ret = RES_ERROR;
1083 youi 1.7 }
1084    
1085 youi 1.35 if( ret == RES_OK ){
1086     //2.vpaccount?????若?吟???若??????????????宴???吾??莨若??
1087     SQLUINTEGER activate;
1088     SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
1089     SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1090     SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1091     SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1092     SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1093     SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1094     SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1095     SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1096     SQLINTEGER cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;
1097     SQLINTEGER cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0;
1098     SQLUINTEGER notice_mail;
1099     SQLUINTEGER notice_mail_since;
1100     if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1101     string sql;
1102     sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1103     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1104     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1105     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1106     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1107     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1108     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1109     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1110     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1111     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1112     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1113     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1114     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1115     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1116     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1117 youi 1.32
1118 youi 1.35 activate = account -> getActivate() ? 1 : 0;
1119     strncpy2( (char*)address, account -> getAddress(), VP_ACCOUNT_ADDRESS_LEN );
1120     strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1121     strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1122     strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1123     strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1124     strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1125     strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1126     strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1127     notice_mail = account -> getNoticeMail( );
1128     notice_mail_since = account -> getNoticeMailSince( );
1129 youi 1.32
1130 youi 1.35 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1131     SQLINTEGER count = 0;
1132     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1133     ret = RES_OK;
1134     if( ret == RES_OK ){
1135     //3.add new user to default group(not a group admin)
1136     ret = insertMember( sid, DEFAULT_PLATFORM_GROUP_ID, *uid, false );
1137     }else{
1138     //xoops_users??nsert???????潟?若???????ゃ????
1139     sql = "DELETE FROM " + dbprefix + "_users where uid=";
1140     sql += unsignedIntToString( *uid );
1141     SQLHANDLE hstmt2 = NULL;
1142     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1143     SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1144     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1145     }
1146     setLastErrorString( "insertMember in insertAccount" );
1147     ret = RES_DB_QUERY_ERROR;
1148     }
1149     }else{
1150     string s( "SQLRowCount in insertAccount sql=" );
1151     s += string( sql );
1152     setLastErrorString( s.c_str( ) );
1153     ret = RES_DB_QUERY_ERROR;
1154     }
1155 youi 1.32 }else{
1156 youi 1.35 string s( "SQLExecute in insertAccount " );
1157     s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1158 youi 1.32 setLastErrorString( s.c_str( ) );
1159     ret = RES_DB_QUERY_ERROR;
1160     }
1161     }else{
1162 youi 1.35 //xoops_users??nsert???????潟?若???????ゃ????
1163     sql = "DELETE FROM " + dbprefix + "_users where uid=";
1164     sql += unsignedIntToString( *uid );
1165     SQLHANDLE hstmt2 = NULL;
1166     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1167     SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1168     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1169     }
1170     string s( "SQLExecDirect in insertAccount sql=" );
1171     s += string( sql );
1172 youi 1.32 setLastErrorString( s.c_str( ) );
1173     ret = RES_DB_QUERY_ERROR;
1174     }
1175 youi 1.35 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1176 youi 1.32 }else{
1177 youi 1.35 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1178     ret = RES_ERROR;
1179 youi 1.32 }
1180 youi 1.7 }
1181 youi 1.32 return ret;
1182 youi 1.1 }
1183    
1184     /**
1185     *
1186 youi 1.20 * ?≪?????潟?????宴??紊??眼????.
1187     *
1188 youi 1.1 *
1189 youi 1.20 * @param sid ?祉???激?с??D
1190     * @param account 紊??眼???????≪?????潟??????/span>
1191     * @return RES_OK
1192 youi 1.31 * @return RES_DB_NOT_INITIALIZED
1193 youi 1.20 * @return RES_NO_SUCH_SESSION
1194     * @return RES_DB_QUERY_ERROR
1195     * @return RES_NO_SUCH_USER
1196 youi 1.31 * @return RES_ERROR
1197 youi 1.1 *
1198     */
1199 youi 1.2 result_t updateAccount( sessionid_t sid, const account_t* account )
1200 youi 1.1 {
1201 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1202 youi 1.20 if( account == NULL ) return RES_ERROR;
1203 youi 1.10 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1204 youi 1.20 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1205 youi 1.32 SQLRETURN sqlcode;
1206     result_t ret = RES_ERROR;
1207 youi 1.10
1208     //xoops?????若?吟???若???????吾??莨若??
1209 youi 1.32 SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN];
1210     SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1211     SQLDOUBLE timezone_offset;
1212    
1213     SQLINTEGER cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
1214     SQLINTEGER cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode, cbUser_mailok = 0, cbTimezone_offset = 0;
1215    
1216     SQLUINTEGER activate;
1217     SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
1218     SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1219     SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1220     SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1221     SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1222     SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1223     SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1224     SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1225     SQLINTEGER cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS, cbBase_url = SQL_NTS;
1226     SQLUINTEGER notice_mail;
1227     SQLUINTEGER notice_mail_since;
1228     SQLINTEGER len = 0;
1229    
1230     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1231     string sql;
1232    
1233     sql = "UPDATE " + dbprefix + "_users SET ";
1234     sql += "uname=?, ";
1235     sql += "name=?, ";
1236     sql += "email=?, ";
1237     sql += "url=?, ";
1238     sql += "user_avatar=?, ";
1239     sql += "user_regdate=?, ";
1240     sql += "user_icq=?, ";
1241     sql += "user_from=?, ";
1242     sql += "user_sig=?, ";
1243     sql += "user_viewemail=?, ";
1244     sql += "actkey=?, ";
1245     sql += "user_aim=?, ";
1246     sql += "user_yim=?, ";
1247     sql += "user_msnm=?, ";
1248     sql += "pass=?, ";
1249     sql += "posts=?, ";
1250     sql += "attachsig=?, ";
1251     sql += "rank=?, ";
1252     sql += "level=?, ";
1253     sql += "theme=?, ";
1254     sql += "timezone_offset=?, ";
1255     sql += "last_login=?, ";
1256     sql += "umode=?, ";
1257     sql += "uorder=?, ";
1258     sql += "notify_method=?, ";
1259     sql += "notify_mode=?, ";
1260     sql += "user_occ=?, ";
1261     sql += "bio=?, ";
1262     sql += "user_intrest=?, ";
1263     sql += "user_mailok=? ";
1264     sql += " WHERE uid = ?";
1265    
1266     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1267     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1268     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1269     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1270     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1271     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1272     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1273     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1274     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1275     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1276     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1277     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1278     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1279     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1280     SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1281     SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1282     SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1283     SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1284     SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1285     SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1286     SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1287     SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1288     SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1289     SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1290     SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1291     SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1292     SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1293     SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1294     SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1295     SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1296     SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1297     SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1298     SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1299    
1300     strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1301     strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1302     strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1303     strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1304     strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1305     user_regdate = time( NULL );
1306     strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1307     strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1308     strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1309     user_viewemail = account -> getUserViewemail( );
1310     strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1311     strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1312     strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1313     strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1314     strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1315     posts = account -> getPosts( );
1316     attachsig = account -> getAttachsig( );
1317     rank = account -> getRank( );
1318     level = account -> getLevel( );
1319     strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1320     timezone_offset = account -> getTimezoneOffset( );
1321     last_login = 0;
1322     strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1323     uorder = account -> getUorder( );
1324     notify_method = account -> getNotifyMethod( );
1325     notify_mode = account -> getNotifyMode( );
1326     strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1327     strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1328     strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1329     user_mailok = account -> getUserMailok( );
1330     uid = account -> getUID( );
1331    
1332     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1333     SQLINTEGER count = 0;
1334     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1335     ret = RES_OK;
1336     }else{
1337     string s( "SQLRowCount in updateAccount sql=" );
1338     s += string( sql );
1339     setLastErrorString( s.c_str( ) );
1340     ret = RES_DB_QUERY_ERROR;
1341     }
1342     }else{
1343     string s( "SQLExecute in updateAccount " );
1344 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1345 youi 1.32 setLastErrorString( s.c_str( ) );
1346     ret = RES_DB_QUERY_ERROR;
1347     }
1348     }else{
1349     setLastErrorString( "SQLPrepare in updateAccount sql=" );
1350     ret = RES_ERROR;
1351     }
1352     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1353     }else{
1354     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1355     ret = RES_ERROR;
1356 youi 1.10 }
1357    
1358     //vpaccount?????若?吟???若??????????????宴??筝??吾??????
1359 youi 1.32 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1360     string sql;
1361    
1362     sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";
1363     sql += "activate=?, ";
1364     sql += "address=?, ";
1365     sql += "division=?, ";
1366     sql += "tel=?, ";
1367     sql += "company_name=?, ";
1368     sql += "country=?, ";
1369     sql += "zipcode=?, ";
1370     sql += "fax=?, ";
1371     sql += "base_url=?, ";
1372     sql += "notice_mail=?, ";
1373     sql += "notice_mail_since=? ";
1374     sql += "WHERE uid=?";
1375    
1376     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1377     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1378     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len);
1379     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1380     SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1381     SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1382     SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1383     SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1384     SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1385     SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1386     SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1387     SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &len);
1388     SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &len);
1389     SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1390    
1391     activate = account -> getActivate() ? 1 : 0;
1392     strncpy2( (char*)address, account -> getAddress( ) , VP_ACCOUNT_ADDRESS_LEN );
1393     strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1394     strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1395     strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1396     strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1397     strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1398     strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1399     strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1400     notice_mail = account -> getNoticeMail( );
1401     notice_mail_since = account -> getNoticeMailSince( );
1402     uid = account -> getUID( );
1403    
1404     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1405     SQLINTEGER count = 0;
1406     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1407     ret = RES_OK;
1408     }else{
1409     string s( "SQLRowCount in updateAccount sql=" );
1410     s += string( sql );
1411     setLastErrorString( s.c_str( ) );
1412     ret = RES_DB_QUERY_ERROR;
1413     }
1414     }else{
1415     string s( "SQLExecute in updateAccount " );
1416 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1417 youi 1.32 setLastErrorString( s.c_str( ) );
1418     ret = RES_DB_QUERY_ERROR;
1419     }
1420     }else{
1421     setLastErrorString( "SQLPrepare in updateAccount sql=" );
1422     ret = RES_ERROR;
1423     }
1424     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1425     }else{
1426     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1427     ret = RES_ERROR;
1428 youi 1.10 }
1429 youi 1.32 return ret;
1430 youi 1.1 }
1431    
1432     /**
1433     *
1434 youi 1.17 * criteria_t?ф??絎???????膀??蚊?????若??D??菴???.
1435     * ???若??D????????腆坂????????????吾??莨若?随????????≪?????鴻??*uids???吾??莨若??.
1436     * ???????泣?ゃ?冴??*uidsLen???吾??莨若??
1437 youi 1.1 *
1438 youi 1.17 * @param sid ?祉???激?с??D
1439     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1440 youi 1.31 * @param uids ???若?吟??ID?????????阪????
1441     * @param uidsLen uids???????膣??違???阪????
1442     * @return RES_OK
1443     * @return RES_DB_NOT_INITIALIZED
1444     * @return RES_NO_SUCH_SESSION
1445     * @return RES_DB_QUERY_ERROR
1446 youi 1.1 *
1447     */
1448 youi 1.13 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1449 youi 1.1 {
1450 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1451 youi 1.17 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1452    
1453 youi 1.33 #ifdef USE_SYSLOG
1454     openlog( "commonal", LOG_ODELAY, LOG_USER );
1455     #endif
1456    
1457 youi 1.32 result_t ret = RES_ERROR;
1458     userid_t* dst = 0;
1459 youi 1.17 string sql;
1460 youi 1.32 SQLRETURN sqlcode;
1461     SQLINTEGER count = 0;
1462    
1463    
1464 youi 1.19 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
1465 youi 1.17 sql += criteria2str( cri );
1466 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1467     *uidsLen = count;
1468     dst = new userid_t[ *uidsLen ];
1469     *uids = dst;
1470     }else{
1471     return RES_ERROR;
1472     }
1473     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1474     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1475     userid_t uid;
1476     SQLINTEGER len = 0;
1477     SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1478    
1479     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1480     dst[ i ] = uid;
1481     }
1482    
1483 youi 1.33 #ifdef USE_SYSLOG
1484     syslog( LOG_DEBUG, "dumpUids succeed" );
1485     #endif
1486 youi 1.32 ret = RES_OK;
1487     }else{
1488     string s( "SQLExecDirect in dumpUids " );
1489 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1490 youi 1.32 s += "sql=";
1491     s += string( sql );
1492     setLastErrorString( s.c_str( ) );
1493 youi 1.33 #ifdef USE_SYSLOG
1494     syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1495     #endif
1496 youi 1.32 ret = RES_DB_QUERY_ERROR;
1497     }
1498     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1499     }else{
1500 youi 1.33 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" );
1501     s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1502     setLastErrorString( s.c_str( ) );
1503     #ifdef USE_SYSLOG
1504     syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1505     #endif
1506 youi 1.32 ret = RES_DB_QUERY_ERROR;
1507 youi 1.17 }
1508 youi 1.32 return ret;
1509 youi 1.1 }
1510    
1511     /**
1512     *
1513 youi 1.19 * ?違???若???違??菴???.
1514     * 筝?罩c???祉???激?с??D????0??菴???.
1515 youi 1.1 *
1516 youi 1.19 * @param sid ?祉???激?с??D
1517     * @return ?違???若????/span>
1518 youi 1.1 *
1519     */
1520 youi 1.2 int getGroupCount( sessionid_t sid )
1521 youi 1.1 {
1522 youi 1.32 if( hdbc == NULL ) return 0;
1523 youi 1.19 if( !isValidSessionID( sid ) ) return 0;
1524    
1525 youi 1.32 SQLRETURN sqlcode;
1526     SQLHANDLE hstmt = NULL;
1527 youi 1.19 string sql;
1528 youi 1.32 int ret = 0;
1529 youi 1.19
1530     //?違???若???違??羆?????
1531     sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
1532 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1533     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1534     SQLUINTEGER count = 0;
1535     SQLINTEGER len;
1536     SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1537     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1538     ret = count;
1539     }else {
1540     string s( "SQLFetch in getGroupCount sql=" );
1541     s += string( sql );
1542     setLastErrorString( s.c_str( ) );
1543     ret = 0;
1544     }
1545     }else{
1546     setLastErrorString( "SQLExecDirect in getGroupCount" );
1547     ret = 0;
1548     }
1549     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1550     }else{
1551     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
1552     ret = 0;
1553 youi 1.19 }
1554 youi 1.32 return ret;
1555 youi 1.1 }
1556    
1557     /**
1558     *
1559 youi 1.31 * ??絮??違???若??筝?荀у??.
1560     * ???若?吟????絮??????????違???若????D????緇?????
1561 youi 1.1 *
1562 youi 1.31 * @param sid ?祉???激?с??D
1563     * @param uid ???若?吟??ID
1564     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1565     * @param gids ?違???若??ID?????????阪????
1566     * @param gidsLen gids???????膣??違???阪????
1567     * @return RES_DB_NOT_INITIALIZED
1568     * @return RES_NO_SUCH_SESSION
1569     * @return RES_NO_SUCH_USER
1570     * @return RES_DB_QUERY_ERROR
1571     * @return RES_OK
1572 youi 1.1 *
1573     */
1574 youi 1.13 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1575 youi 1.1 {
1576 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1577 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1578     if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1579    
1580 youi 1.32 result_t ret = RES_ERROR;
1581 youi 1.19 string sql;
1582 youi 1.32 SQLRETURN sqlcode;
1583     SQLHANDLE hstmt = NULL;
1584     SQLINTEGER count = 0;
1585 youi 1.19 groupid_t* dst = 0;
1586     int len = 0;
1587    
1588 youi 1.32 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups_users_link";
1589 youi 1.19 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1590     sql += criteria2str( cri );
1591 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1592     *gidsLen = count;
1593     dst = new groupid_t[ *gidsLen ];
1594     *gids = dst;
1595     }else{
1596     return RES_ERROR;
1597 youi 1.19 }
1598    
1599 youi 1.32 //??絮??????違???若??????紊у???違??羆?????
1600     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1601     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1602     if( count > 0 ){
1603     SQLHANDLE hstmt2 = NULL;
1604     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1605     sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";
1606     sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1607     sql += criteria2str( cri );
1608     if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1609     SQLINTEGER len;
1610     groupid_t gid = 0;
1611     SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1612     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1613     dst[ i ] = gid;
1614     }
1615     ret = RES_OK;
1616     }else{
1617     string s( "SQLExecDirect in getGroupsByUid " );
1618 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1619 youi 1.32 s += string( ", sql=" ) + string( sql );
1620     ret = RES_DB_QUERY_ERROR;
1621     }
1622     }else{
1623     string s( "SQLAllocHandle in getGroupsByUid " );
1624 youi 1.35 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1625 youi 1.32 ret = RES_DB_QUERY_ERROR;
1626     }
1627     }else{
1628     ret = RES_OK;
1629     }
1630     }else{
1631     string s( "SQLExecDirect in getGroupsByUid " );
1632 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1633 youi 1.32 s += string( ", sql=" ) + string( sql );
1634     ret = RES_DB_QUERY_ERROR;
1635     }
1636     }else{
1637     string s( "SQLAllocHandle in getGroupsByUid " );
1638     setLastErrorString( s.c_str( ) );
1639     ret = RES_DB_QUERY_ERROR;
1640 youi 1.19 }
1641 youi 1.32 return ret;
1642 youi 1.1 }
1643    
1644     /**
1645     *
1646 youi 1.31 * ?違???若??膊∞??罔????????.
1647     * ???若?吟?????若???????罔???????????(?違???若??膊∞?????с??????)????????????.
1648     * ???若?吟???違???若????絖????????????????医幻???翫??鐚?false??菴???.
1649 youi 1.1 *
1650 youi 1.31 * @param sid ?祉???激?с??D
1651     * @param gid ?違???若????ID
1652     * @param uid ???若?吟??ID
1653     * @return true 膊∞??罔???????
1654     * @return false 膊∞??罔???????鐚??障???????/span>
1655 youi 1.1 *
1656     */
1657 youi 1.2 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
1658 youi 1.1 {
1659 youi 1.32 if( hdbc == NULL ) return false;
1660 youi 1.19 if( !isValidSessionID( sid ) ) return false;
1661     if( !uidExists( uid ) ) return false;
1662     if( !gidExists( gid ) ) return false;
1663    
1664 youi 1.32 bool ret = false;
1665 youi 1.19 string sql;
1666 youi 1.32 SQLRETURN sqlcode;
1667     SQLINTEGER count = 0;
1668 youi 1.19
1669     sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";
1670     sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1671     sql += " AND uid=" + string( unsignedIntToString( uid ) );
1672     sql += " AND is_admin=1";
1673 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1674     if( count > 0 ){
1675     ret = true;
1676     }else{
1677     ret = false;
1678     }
1679     }else{
1680     ret = false;
1681 youi 1.19 }
1682 youi 1.32 return ret;
1683 youi 1.1 }
1684    
1685     /**
1686     *
1687 youi 1.31 * ?違???若??ID筝?荀?
1688     * ?脂?蚊???????????違???若????D筝?荀с????緇?????.
1689 youi 1.1 *
1690 youi 1.31 * @param sid ?祉???激?с??D
1691     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1692     * @param gids ?違???若??ID?????????阪????
1693     * @param gidsLen gids???????膣??違???阪????
1694     * @return RES_DB_NOT_INITIALIZED
1695     * @return RES_NO_SUCH_SESSION
1696     * @return RES_DB_QUERY_ERROR
1697     * @return RES_OK
1698 youi 1.1 *
1699     */
1700 youi 1.13 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1701 youi 1.1 {
1702 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1703 youi 1.16 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1704    
1705 youi 1.32 result_t ret = RES_ERROR;
1706     groupid_t* dst = 0;
1707 youi 1.16 string sql;
1708 youi 1.32 SQLRETURN sqlcode;
1709     SQLINTEGER count = 0;
1710    
1711 youi 1.19 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
1712     sql += criteria2str( cri );
1713 youi 1.32 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1714     *gidsLen = count;
1715 youi 1.16 dst = new groupid_t[ *gidsLen ];
1716 youi 1.32 *gids = dst;
1717 youi 1.16 }else{
1718     return RES_ERROR;
1719     }
1720    
1721 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1722     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1723     groupid_t gid;
1724     SQLINTEGER len = 0;
1725     SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1726     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1727     dst[ i ] = gid;
1728     }
1729    
1730     ret = RES_OK;
1731     }else{
1732     string s( "SQLExecDirect in dumpGids " );
1733 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1734 youi 1.32 s += "sql=";
1735     s += string( sql );
1736     setLastErrorString( s.c_str( ) );
1737     ret = RES_DB_QUERY_ERROR;
1738     }
1739     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1740 youi 1.16 }
1741 youi 1.32 return ret;
1742 youi 1.1 }
1743    
1744     /**
1745     *
1746 youi 1.31 * ?違???若??膊∞????ID????緇?????.
1747     * ?????違???若??????????????若??D????緇?????.
1748 youi 1.1 *
1749 youi 1.19 * @param sid ?祉???激?с??D
1750     * @param gid ???????????違???若????ID?ф??絎?????
1751     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1752     * @param uids 膊∞??????ID???????????????????ゃ?潟??/span>
1753     * @param uidsLen uids???????膣???/span>
1754 youi 1.20 * @return RES_OK
1755     * @return RES_DB_NOT_INITIALIZED
1756     * @return RES_NO_SUCH_SESSION
1757     * @return RES_DB_QUERY_ERROR
1758     * @return RES_ERROR
1759 youi 1.1 *
1760     */
1761 youi 1.13 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1762 youi 1.1 {
1763 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1764 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1765    
1766 youi 1.32 result_t ret = RES_ERROR;
1767     groupid_t* dst = 0;
1768 youi 1.19 string sql;
1769 youi 1.32 SQLRETURN sqlcode;
1770     SQLINTEGER count = 0;
1771    
1772 youi 1.19 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
1773 youi 1.32 sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid );
1774     if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1775     *uidsLen = count;
1776     *uids = new groupid_t[ *uidsLen ];
1777     }else{
1778     return RES_ERROR;
1779 youi 1.19 }
1780 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1781     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1782     userid_t uid;
1783     SQLINTEGER len = 0;
1784     SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1785     for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1786     (*uids)[ i ] = uid;
1787     }
1788     ret = RES_OK;
1789     }else{
1790     string s( "SQLExecDirect in dumpGroupAdmins " );
1791 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1792 youi 1.32 s += "sql=";
1793     s += string( sql );
1794     setLastErrorString( s.c_str( ) );
1795     ret = RES_DB_QUERY_ERROR;
1796     }
1797     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1798 youi 1.19 }
1799 youi 1.32 return ret;
1800 youi 1.1 }
1801    
1802     /**
1803     *
1804 youi 1.31 * ?違???若????絮????若?九????
1805     * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1806 youi 1.35 * ???????????違???若???????????ゃ?с??????
1807 youi 1.1 *
1808 youi 1.31 * @param sid ?祉???激?с??D
1809     * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1810     * @param uid ???ゅ?莟<?????若?吟??D
1811     * @return RES_DB_NOT_INITIALIZED
1812     * @return RES_NO_SUCH_SESSION
1813     * @return RES_NO_SUCH_USER
1814     * @return RES_NO_SUCH_GROUP
1815     * @return RES_DB_QUERY_ERROR
1816 youi 1.35 * @return RES_OK
1817     * @return RES_ERROR
1818 youi 1.1 *
1819     */
1820 youi 1.2 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1821 youi 1.1 {
1822 youi 1.35 if( gid == DEFAULT_PLATFORM_GROUP_ID ) return RES_ERROR;
1823     return deleteMemberNoLimit( sid, gid, uid );
1824     }
1825    
1826     /**
1827     *
1828     * ?違???若????絮????若?九????
1829     * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1830     * ???????????違???若???????????ゃ?с?????鴻??鐚?deleteMember???違????
1831     *
1832     * @param sid ?祉???激?с??D
1833     * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1834     * @param uid ???ゅ?莟<?????若?吟??D
1835     * @return RES_DB_NOT_INITIALIZED
1836     * @return RES_NO_SUCH_SESSION
1837     * @return RES_NO_SUCH_USER
1838     * @return RES_NO_SUCH_GROUP
1839     * @return RES_DB_QUERY_ERROR
1840     * @return RES_OK
1841     * @return RES_ERROR
1842     *
1843     */
1844     static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid )
1845     {
1846 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1847 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1848     if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1849     if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1850    
1851 youi 1.32 result_t ret = RES_ERROR;
1852 youi 1.19 string sql;
1853 youi 1.32 SQLRETURN sqlcode;
1854     SQLHANDLE hstmt = NULL;
1855 youi 1.19
1856     sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1857     sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1858     sql += " AND uid=" + string( unsignedIntToString( uid ) );
1859 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1860     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1861     SQLINTEGER count = 0;
1862     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1863     ret = RES_OK;
1864     }else{
1865     string s( "SQLRowCount in deleteMember" );
1866 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1867 youi 1.32 s += string( ", sql=" ) + string( sql );
1868     setLastErrorString( s.c_str( ) );
1869     ret = RES_NO_SUCH_USER;
1870     }
1871     }else{
1872     string s( "SQLExecDirect in deleteMember" );
1873 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1874 youi 1.32 s += ", sql=";
1875     s += string( sql );
1876     setLastErrorString( s.c_str( ) );
1877     ret = RES_DB_QUERY_ERROR;
1878     }
1879     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1880     }else{
1881     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" );
1882     ret = RES_ERROR;
1883 youi 1.19 }
1884 youi 1.32 return ret;
1885 youi 1.1 }
1886    
1887     /**
1888     *
1889 youi 1.31 * ?違???若????絮????若?区申??.
1890     * ?違???若?????<?潟???若?????若?吟??菴遵??????.
1891 youi 1.1 *
1892 youi 1.19 * @param sid ?祉???激?с??D
1893     * @param gid ??絮????違???若????D
1894     * @param uid ??絮??????????若?吟??D
1895     * @param admin 膊∞????罔?????筝?????????true
1896 youi 1.20 * @return RES_OK
1897     * @return RES_DB_NOT_INITIALIZED
1898     * @return RES_NO_SUCH_SESSION
1899 youi 1.31 * @return RES_NO_SUCH_USER
1900     * @return RES_NO_SUCH_GROUP
1901 youi 1.20 * @return RES_DB_QUERY_ERROR
1902 youi 1.1 *
1903     */
1904 youi 1.19 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1905 youi 1.1 {
1906 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1907 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1908     if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1909     if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1910    
1911 youi 1.32 result_t ret = RES_ERROR;
1912 youi 1.19 string sql;
1913 youi 1.32 SQLRETURN sqlcode;
1914 youi 1.19
1915     //?<?潟???若??菴遵??
1916 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1917     sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
1918     sql += string( unsignedIntToString( gid ) ) + ", ";
1919     sql += string( unsignedIntToString( uid ) ) + ", ";
1920     sql += string( admin ? "1" : "0" ) + ") ";
1921     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1922     SQLINTEGER count = 0;
1923     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1924     ret = RES_OK;
1925     }else{
1926     string s( "SQLRowCount in insertMember " );
1927 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1928 youi 1.32 s += string( ", sql=" ) + string( sql );
1929     setLastErrorString( s.c_str( ) );
1930     ret = RES_DB_QUERY_ERROR;
1931     }
1932     }else{
1933     string s( "SQLExecDirect in insertMember " );
1934 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1935 youi 1.32 s += string( ", sql=" ) + string( sql );
1936     setLastErrorString( s.c_str( ) );
1937     ret = RES_DB_QUERY_ERROR;
1938     }
1939     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1940     }else{
1941     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" );
1942     ret = RES_DB_QUERY_ERROR;
1943 youi 1.19 }
1944 youi 1.32 return ret;
1945 youi 1.1 }
1946    
1947     /**
1948     *
1949 youi 1.31 * ?違???若????絮????若?九??.
1950     * ?????違???若??????絮????????????若?吟?????若??D????緇?????
1951 youi 1.1 *
1952 youi 1.31 * @param sid ?祉???激?с??D
1953     * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
1954     * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1955     * @param uids ??絮????若?吟??ID???????????????????ゃ?潟??/span>
1956     * @param uidsLen uids???????膣???/span>
1957     * @return RES_OK
1958     * @return RES_DB_NOT_INITIALIZED
1959     * @return RES_NO_SUCH_SESSION
1960     * @return RES_NO_SUCH_GROUP
1961     * @return RES_DB_QUERY_ERROR
1962     * @return RES_ERROR
1963 youi 1.1 *
1964     */
1965 youi 1.13 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1966 youi 1.1 {
1967 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1968 youi 1.19 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1969     if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1970    
1971 youi 1.32 result_t ret = RES_ERROR;
1972 youi 1.19 string sql;
1973 youi 1.32 SQLRETURN sqlcode;
1974     SQLHANDLE hstmt = NULL;
1975 youi 1.19 userid_t* dst = 0;
1976    
1977 youi 1.32 //how many members ?
1978 youi 1.19 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1979     sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1980 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1981     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1982     SQLUINTEGER count = 0;
1983     SQLINTEGER len;
1984     SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1985     if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1986     dst = new userid_t[ count ];
1987     *uids = dst;
1988     *uidsLen = count;
1989     if( count > 0 ){
1990     //retrive member's IDs
1991     SQLHANDLE hstmt2 = NULL;
1992     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1993     sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";
1994     sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1995     sql += " " + string( criteria2str( cri ) );
1996     if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1997     SQLUINTEGER uid = 0;
1998     SQLINTEGER len;
1999     SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len );
2000     for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){
2001     dst[ i ] = uid;
2002     }
2003     ret = RES_OK;
2004     }else{
2005     setLastErrorString( "SQLExecDirect in getMembers" );
2006     ret = RES_DB_QUERY_ERROR;
2007     }
2008     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2009     }else{
2010     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2011     ret = RES_DB_QUERY_ERROR;
2012     }
2013     }else{
2014     ret = RES_OK;
2015     }
2016     }else{
2017     string s( "SQLFetch in getMembers sql=" );
2018     s += string( sql );
2019     setLastErrorString( s.c_str( ) );
2020     ret = RES_DB_QUERY_ERROR;
2021     }
2022     }else{
2023     setLastErrorString( "SQLExecDirect in getMembers" );
2024     ret = RES_DB_QUERY_ERROR;
2025     }
2026     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2027 youi 1.19 }else{
2028 youi 1.32 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2029     ret = RES_DB_QUERY_ERROR;
2030 youi 1.19 }
2031 youi 1.32 return ret;
2032 youi 1.1 }
2033    
2034     /**
2035     *
2036 youi 1.31 * ?違???若????????
2037     * ???若?帥???若?鴻?????違???若???????ゃ???障??.
2038 youi 1.1 *
2039 youi 1.31 * @param sid ?祉???激?с??D
2040     * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
2041 youi 1.20 * @return RES_OK
2042     * @return RES_DB_QUERY_ERROR
2043     * @return RES_NO_SUCH_SESSION
2044     * @return RES_DB_NOT_INITIALIZED
2045 youi 1.1 *
2046     */
2047 youi 1.2 result_t deleteGroup( sessionid_t sid, groupid_t gid )
2048 youi 1.1 {
2049 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2050 youi 1.16 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2051    
2052 youi 1.32 result_t ret = RES_ERROR;
2053 youi 1.16 string sql;
2054 youi 1.32 SQLRETURN sqlcode;
2055     SQLHANDLE hstmt = NULL;
2056    
2057 youi 1.16 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
2058     sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
2059 youi 1.32 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2060     if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2061     SQLINTEGER count = 0;
2062     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2063     ret = RES_OK;
2064     }else{
2065     string s( "SQLRowCount in deleteGroup" );
2066 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2067 youi 1.32 s += string( ", sql=" ) + string( sql );
2068     setLastErrorString( s.c_str( ) );
2069     ret = RES_NO_SUCH_USER;
2070     }
2071     }else{
2072     string s( "SQLExecDirect in deleteGroup" );
2073 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2074 youi 1.32 s += ", sql=";
2075     s += string( sql );
2076     setLastErrorString( s.c_str( ) );
2077     ret = RES_DB_QUERY_ERROR;
2078     }
2079     SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2080     }else{
2081     setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" );
2082     ret = RES_ERROR;
2083 youi 1.16 }
2084 youi 1.32 return ret;
2085 youi 1.1 }
2086    
2087     /**
2088     *
2089 youi 1.25 * ?違???若???脂??
2090 youi 1.31 * ?違???若???????宴?????若?帥???若?鴻????蚊????鐚?/span>
2091     * ?脂?蚊?????違???若?????綽??????違???若??ID??gid???主?????鐚?/span>
2092 youi 1.1 *
2093 youi 1.20 * @param sid ?祉???激?с??D
2094     * @param group ?脂?蚊???????違???若????????/span>
2095 youi 1.25 * @param gid ?脂?蚊?????違???若?????綽??????違???若??ID
2096 youi 1.20 * @return RES_OK
2097     * @return RES_DB_NOT_INITIALIZED
2098     * @return RES_NO_SUCH_SESSION
2099     * @return RES_DB_QUERY_ERROR
2100 youi 1.1 *
2101     */
2102 youi 1.25 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
2103 youi 1.1 {
2104 youi 1.32 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2105 youi 1.16 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2106    
2107 youi 1.32 result_t ret = RES_ERROR;
2108 youi 1.16 string sql;
2109 youi 1.32 SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1];
2110     SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2111     SQLRETURN sqlcode;
2112    
2113     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2114     sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )";
2115     sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2116     if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2117     SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2118     SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2119     strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN );
2120     strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN );
2121     if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2122     SQLINTEGER count = 0;
2123     if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2124     //?違???若??ID????緇?????
2125     SQLHANDLE hstmt2 = NULL;
2126     if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2127     sql = "SELECT LAST_INSERT_ID()"; // MySQL
2128     // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
2129     if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2130     SQLUINTEGER last_insert_id;
2131     SQLINTEGER len;
2132     SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
2133     if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
2134     *gid = last_insert_id;
2135     ret = RES_OK;
2136     }else{
2137     ret = RES_DB_QUERY_ERROR;
2138     string s( "SQLFetch in insertGroup " );
2139 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2140 youi 1.32 setLastErrorString( s.c_str( ) );
2141     }
2142     }else{
2143     string s( "SQLExecDirect in insertGroup " );
2144 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2145 youi 1.32 setLastErrorString( s.c_str( ) );
2146     ret = RES_DB_QUERY_ERROR;
2147     }
2148     SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2149     }
2150     }else{
2151     string s( "SQLRowCount in insertGroup sql=" );
2152     s += string( sql );
2153     setLastErrorString( s.c_str( ) );
2154     ret = RES_DB_QUERY_ERROR;
2155     }
2156     }else{
2157     string s( "SQLExecute in insertGroup " );
2158 youi 1.33 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2159 youi