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.40 - (hide annotations) (download) (as text)
Mon Jan 17 00:15:05 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.39: +51 -39 lines
File MIME type: text/x-c++src
・deleteIndex, updateIndexに失敗することがあるのを修正.

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