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.32 - (hide annotations) (download) (as text)
Sat Dec 25 09:46:47 2004 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.31: +1437 -726 lines
File MIME type: text/x-c++src
MySQL+MyODBC、ヌニーコ?ケ、?隍ヲ、ヒス、タオ、キ、ソ.

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