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.44 - (hide annotations) (download) (as text)
Wed Jan 19 06:01:59 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.43: +988 -231 lines
File MIME type: text/x-c++src
関数追加
 getConfigValue
 setConfigValue
 getChangeLogs
 insertChangeLog
 getItemIDByBinderID
 registerBinderItem
 unregisterBinderItem
 getIndexPermission
 freeString
 freeChangeLog
引数にcriteria_tを追加
 getItemIDByIndexID
引数の順序を変更
 getCertifyState
 setCertifyState
 getCertifyPermission
sessionID2UID,querySimple,queryGetUnsignedIntの利用
insertItemの内部でPrivateIndexへ登録を行なう
getItems: getItemPermissionを使った読み込み権限チェック.

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