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.36 - (hide annotations) (download) (as text)
Thu Jan 13 04:19:22 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.35: +104 -96 lines
File MIME type: text/x-c++src
・VPをXNPに変換.

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