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.42 - (hide annotations) (download) (as text)
Wed Jan 19 00:51:29 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.41: +10 -5 lines
File MIME type: text/x-c++src
・insertIndexでx_xnpaccount_index.index_idがおかしいのを修正.

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