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.39 - (hide annotations) (download) (as text)
Sat Jan 15 05:38:10 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.38: +648 -54 lines
File MIME type: text/x-c++src
insertAccount: 文字列バッファのサイズ調整など.
updateAccount: 文字列バッファのサイズ調整など.
アイテム管理関数を定義した.
    insertItem, getItem, getItems, dumpItemID, updateItem, deleteItemなど.
freeGID, freeUID: 引数の型を修正.

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