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.33 - (hide annotations) (download) (as text)
Mon Dec 27 05:56:23 2004 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.32: +190 -62 lines
File MIME type: text/x-c++src
odbcDiagString: STMT以外のハンドルも処理するように変更した.
syslogメッセージの処理を追加した.

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