Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.32 - (show 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 /*
2 *
3 * $Revision: 1.31 $
4 * $Log: commonal.cc,v $
5 * Revision 1.31 2004/12/21 11:42:59 youi
6 * 繧ウ繝。繝ウ繝医?蠑墓焚?梧綾繧雁?、縺ョ隱ャ譏弱↑縺ゥ繧定ソス蜉?.
7 *
8 * Revision 1.30 2004/12/18 10:24:54 youi
9 * IMPORT_MYSQLDLL繧貞ョ夂セゥ縺励◆縺ィ縺搾シ勲YSQL縺ョDLL繧貞虚逧?Μ繝ウ繧ッ縺吶k繝励Ο繝医ち繧、繝怜ョ」險?縺?/span>
10 * 譛牙柑縺ォ縺ェ繧九h縺?↓菫ョ豁」縺励◆.
11 *
12 * Revision 1.29 2004/12/18 01:12:29 youi
13 * freeResult縺ョ髢「謨ー蜷阪rfree<繝??繧ソ蝙?gt;縺ォ螟画峩縺励◆.
14 *
15 * 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 * Revision 1.27 2004/12/06 11:34:47 aga
21 * 繝サuninitializeDB()繧定ソス蜉?.
22 *
23 * 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 * Revision 1.25 2004/12/06 07:24:33 youi
28 * insertAccount, insertGroup:
29 * 譁ー隕剰ソス蜉?縺励◆諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID?後げ繝ォ繝シ繝悠D繧堤ャャ荳牙シ墓焚縺ォ譖ク縺崎セシ繧?.
30 *
31 * Revision 1.24 2004/12/06 01:45:50 aga
32 * 繝サ繧ウ繝。繝ウ繝医▽縺?
33 * 繝サ髢区叛蠢倥l菫ョ豁」.
34 *
35 * Revision 1.23 2004/12/04 09:21:10 aga
36 * 繝サvp_config 竊 vpaccount_config.
37 *
38 * Revision 1.22 2004/12/03 07:17:21 youi
39 * isModerator縺ァ繧「繧ッ繧サ繧ケ縺吶k繝??繧ソ繝吶?繧ケ繝??繝悶Ν蜷阪r菫ョ豁」.
40 *
41 * Revision 1.21 2004/12/01 10:28:58 youi
42 * DB繧ォ繝ゥ繝?蜷阪?螟画峩縺ォ莨エ縺?ソョ豁」
43 * institute -> division
44 * organizaion -> company_name
45 *
46 * Revision 1.20 2004/12/01 04:37:04 youi
47 * freeResult: unsigned int* 繧 int* 縺ク菫ョ豁」.
48 * 繧ウ繝。繝ウ繝磯Κ縺ォ髢「謨ー縺ョ隱ャ譏弱r霑ス險?
49 *
50 * 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 * Revision 1.18 2004/11/30 05:46:32 aga
62 * 繝サsession縺九iremoteHost繧貞炎髯、.
63 *
64 * Revision 1.17 2004/11/27 09:35:49 youi
65 * isActivated繧貞ョ夂セゥ.
66 * activate繧貞ョ夂セゥ.
67 * dumpUid繧貞ョ夂セゥ.
68 *
69 * 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 * Revision 1.15 2004/11/27 02:22:22 aga
78 * 繝サinitializeDB蜑阪↓addSlashes()繧貞他縺カ縺ィ關ス縺。繧九?繧剃ソョ豁」.
79 *
80 * Revision 1.14 2004/11/27 01:07:31 youi
81 * criteria2str: LIMIT縺ィORDER BY縺ョ鬆?分繧貞?繧梧崛縺医◆.
82 *
83 * Revision 1.13 2004/11/27 00:35:39 youi
84 * getAccounts繧貞ョ夂セゥ.
85 * getAccount繧剃ソョ豁」?悟?驛ィ縺ァgetAccounts繧貞他縺ウ蜃コ縺?
86 * criteria2str繧貞ョ夂セゥ.
87 *
88 * Revision 1.12 2004/11/26 09:45:28 youi
89 * getAccount繧貞ョ夂セゥ.
90 *
91 * Revision 1.11 2004/11/26 08:16:26 aga
92 * 繝サgetSession, loginUser, createSession, freeResult(const session_t*) 菫ョ豁」.
93 *
94 * Revision 1.10 2004/11/26 07:57:42 youi
95 * updateAccount, deleteAccount繧貞ョ夂セゥ.
96 * mysql_query螟ア謨玲凾縺ッstderr縺ク繧ィ繝ゥ繝シ繧ウ繝シ繝峨→繧ィ繝ゥ繝シ繝。繝?そ繝シ繧ク繧貞?蜉?
97 *
98 * Revision 1.9 2004/11/26 07:38:02 aga
99 * 繝サFAILUE -> FAILURE.
100 *
101 * Revision 1.8 2004/11/26 06:36:55 aga
102 * 繝サcreateSession, getSession 繧剃ス懈?.
103 *
104 * Revision 1.7 2004/11/26 04:51:47 youi
105 * dbprefix繧貞ョ夂セゥ縺励◆.
106 * insertAccount繧貞ョ夂セゥ縺励◆.
107 * isValidSessionID繧貞ョ夂セゥ縺励◆.
108 *
109 * Revision 1.6 2004/11/26 04:35:55 aga
110 * 繝サloginUser(), logoutUser()繧剃ス懈?.
111 *
112 * Revision 1.5 2004/11/26 01:08:25 aga
113 * 繝サaddSlashes()菴懈?.
114 *
115 * Revision 1.4 2004/11/25 12:14:29 youi
116 * getUid縺ョ蜃ヲ逅?r螳夂セゥ縺励◆.
117 *
118 * Revision 1.3 2004/11/25 11:13:59 youi
119 * getLastErrorString/setLastErrorString繧貞ョ夂セゥ.
120 *
121 * Revision 1.2 2004/11/25 08:55:19 youi
122 * 蠑墓焚縺ョ蝙九r菫ョ豁」.
123 * freeResult繧定ソス蜉?.
124 *
125 * Revision 1.1 2004/11/25 05:14:58 youi
126 * initial version
127 *
128 *
129 */
130 #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 #include <stdio.h>
142 #include <stdlib.h>
143 #include <string.h>
144 #include <mysql.h>
145 #include <errmsg.h>
146 #include <string>
147 #include <assert.h>
148 #include <sql.h>
149 #include <sqlext.h>
150 using namespace std;
151
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 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
257
258 /**
259 *
260 * 繧ッ繧ゥ繝シ繝医↑縺ゥ繧箪險伜捷縺ァ繧ィ繧ケ繧ア繝シ繝励☆繧?/span>
261 *
262 * @param str addslashes縺吶∋縺肴枚蟄怜?縲?ULL謖?ョ壻ク榊庄縲?/span>
263 * @return 螟画鋤蠕後?譁?ュ怜?
264 */
265 string addSlashes( const char *str )
266 {
267 if ( hdbc == NULL ){
268 string s;
269 return s;
270 }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 return s;
294 }
295
296 /**
297 *
298 * 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 SQLRETURN sqlcode;
310 SQLHANDLE hstmt = NULL;
311
312 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
313 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
314 return false;
315 }
316
317 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
318 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
319 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
320 setLastErrorString( "SQLExecDirect in gidExists" );
321 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
322 return false;
323 }
324
325 if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
326 setLastErrorString( "SQLFetch in gidExists" );
327 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
328 return false;
329 }
330
331 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
332 return true;
333 }
334
335
336 /**
337 *
338 * Platform繝ヲ繝シ繧カ諠??ア縺ォuid縺悟ュ伜惠縺吶k縺九r繝√ぉ繝?け.
339 * 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 bool ret = false;
349 string sql;
350 SQLRETURN sqlcode;
351 SQLINTEGER count = 0;
352
353 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
354 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
355 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 }
379 return ret;
380 }
381
382
383 /**
384 *
385 * 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 }
403
404 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
405 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
406 + ", " + string( intToString( cri -> getLimitRows( ) ) );
407 }
408 return sql;
409 }
410
411
412 /**
413 *
414 * 繝??繧ソ繝吶?繧ケ縺ョ蛻晄悄蛹?/span>
415 *
416 * @param dsn DSN
417 * @param user 繝??繧ソ繝吶?繧ケ縺ォ繧「繧ッ繧サ繧ケ縺吶k繝ヲ繝シ繧カ蜷?/span>
418 * @param password 荳願ィ倥Θ繝シ繧カ縺ョ繝代せ繝ッ繝シ繝?/span>
419 * @param dbname 繝?繝溘?
420 * @param prefix XOOPS繝??繧ソ繝吶?繧ケ繝??繝悶Ν縺ョPREFIX
421 * @return RES_OK
422 * @return RES_DB_INITIALIZE_ERROR
423 * @return RES_DB_CONNECT_ERROR
424 * @refer result_t
425 */
426 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix )
427 {
428 SQLRETURN sqlcode;
429
430 // 譌「縺ォ謗・邯壻クュ縺ェ繧峨?∽ク?譌ヲ蛻?妙
431 if ( hdbc != NULL )
432 SQLDisconnect( hdbc );
433
434 dbprefix = prefix;
435
436 // 蛻晄悄蛹悶→謗・邯?/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
445 // 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 return RES_DB_INITIALIZE_ERROR;
449 }
450 //繝ュ繧ー繧、繝ウ縺ォ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 return RES_DB_CONNECT_ERROR;
456 }
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 if ( hdbc != NULL ){
470 SQLDisconnect( hdbc );
471 hdbc = NULL;
472 }
473 return RES_OK;
474 }
475
476 /**
477 *
478 * Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句叙蠕?/span>
479 *
480 * @param sid 繧サ繝?す繝ァ繝ウID
481 * @param uid 迥カ諷九r蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID
482 * @return true 謇ソ隱肴ク医∩
483 * @return false 譛ェ謇ソ隱?/span>
484 *
485 */
486 bool isActivated( sessionid_t sid, userid_t uid )
487 {
488 if( hdbc == NULL ) return false;
489 if( !isValidSessionID( sid ) ) return false;
490
491 bool ret = false;
492 string sql;
493 SQLRETURN sqlcode;
494 SQLHANDLE hstmt = NULL;
495
496 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
497 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
498 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 }
521 return ret;
522 }
523
524 /**
525 *
526 * Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句、画峩
527 *
528 * @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 */
535 result_t activate( sessionid_t sid, userid_t uid, bool activate )
536 {
537 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
538 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
539
540 string sql;
541 SQLRETURN sqlcode;
542 result_t ret = RES_ERROR;
543
544 sql = "UPDATE " + dbprefix + "_vpaccount_users ";
545 sql += "SET activate=" + string( activate ? "1" : "0" );
546 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
547 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 }
572 return ret;
573 }
574
575 /**
576 *
577 * 繧「繧ォ繧ヲ繝ウ繝域焚繧貞叙蠕励☆繧具シ?/span>
578 *
579 * @param sid 繧サ繝?す繝ァ繝ウID
580 * @return 繧「繧ォ繧ヲ繝ウ繝域焚
581 *
582 */
583 int getAccountCount( sessionid_t sid )
584 {
585 if( hdbc == NULL ) return 0;
586 if( !isValidSessionID( sid ) ) return 0;
587
588 int ret = 0;
589 string sql;
590 SQLRETURN sqlcode;
591 SQLHANDLE hstmt = NULL;
592
593 //繧「繧ォ繧ヲ繝ウ繝域焚繧呈アゅa繧?/span>
594 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
595 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 }else{
614 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
615 ret = 0;
616 }
617 return ret;
618 }
619
620 /**
621 *
622 * 繧「繧ォ繧ヲ繝ウ繝亥炎髯、
623 *
624 * @param
625 * @return RES_OK
626 * @return RES_DB_NOT_INITIALIZED
627 * @return RES_NO_SUCH_SESSION
628 * @return RES_DB_QUERY_ERROR
629 *
630 */
631 result_t deleteAccount( sessionid_t sid, userid_t uid )
632 {
633 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
634 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
635
636 result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
637 string sql;
638 SQLRETURN sqlcode;
639 SQLHANDLE hstmt = NULL;
640
641 sql = "DELETE FROM " + dbprefix + "_users ";
642 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
643 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 }
668
669 sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
670 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
671 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 }
696
697 //荳?譁ケ縺ァ繧ゅお繝ゥ繝シ縺ェ繧峨お繝ゥ繝シ繧定ソ斐☆
698 return ret1 != RES_OK ? ret1 : ret2;
699 }
700
701 /**
702 *
703 * 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア蜿門セ?/span>
704 *
705 * @param sid 繧サ繝?す繝ァ繝ウID
706 * @param uid 蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID
707 * @param acc 蜿門セ励@縺溘い繧ォ繧ヲ繝ウ繝域ュ蝣ア(account_t)縺ョ繝昴う繝ウ繧ソ繧呈嶌縺崎セシ繧?蠑墓焚
708 * @return RES_OK
709 * @return RES_DB_NOT_INITIALIZED
710 * @return RES_NO_SUCH_USER
711 * @return RES_NO_SUCH_SESSION
712 * @return RES_DB_QUERY_ERROR
713 *
714 */
715 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
716 {
717 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 * @return RES_OK
735 * @return RES_DB_NOT_INITIALIZED
736 * @return RES_NO_SUCH_SESSION
737 * @return RES_DB_QUERY_ERROR
738 *
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 #ifdef USE_SYSLOG
743 openlog( "commonal", LOG_ODELAY, LOG_USER );
744 #endif
745 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
746 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
747 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
756 result_t ret = RES_ERROR;
757 SQLRETURN sqlcode;
758 SQLHANDLE hstmt = NULL;
759 string sql;
760 account_t* dst = new account_t[ uidsLen ];
761
762 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 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 ";
764 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 }
772 sql += criteria2str( cri );
773
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 }
836 return ret;
837 }
838
839 /**
840 *
841 * 繧「繧ォ繧ヲ繝ウ繝育匳骭イ.
842 * 繝ヲ繝シ繧カ諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ逋サ骭イ縺励∪縺呻シ?/span>
843 * 逋サ骭イ縺励◆繝ヲ繝シ繧カ諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID繧置id縺ォ譬シ邏阪@縺セ縺?
844 *
845 * @param sid 繧サ繝?す繝ァ繝ウ
846 * @param account 逋サ骭イ縺吶k繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア
847 * @param uid 逋サ骭イ縺励◆繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID
848 * @return RES_OK
849 * @return RES_NO_SUCH_SESSION
850 * @return RES_DB_QUERY_ERROR
851 * @return RES_DB_NOT_INITIALIZED
852 *
853 */
854 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
855 {
856 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
857 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
858
859 string sql;
860 string tmp;
861 char buf[ 12 ];
862 SQLRETURN sqlcode;
863 result_t ret = RES_ERROR;
864
865 //xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧?
866 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 }
992
993 //vpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧呈嶌縺崎セシ繧?
994 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 }
1073
1074 return ret;
1075 }
1076
1077 /**
1078 *
1079 * 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア繧貞、画峩縺吶k.
1080 *
1081 *
1082 * @param sid 繧サ繝?す繝ァ繝ウID
1083 * @param account 螟画峩縺励◆縺?い繧ォ繧ヲ繝ウ繝域ュ蝣ア
1084 * @return RES_OK
1085 * @return RES_DB_NOT_INITIALIZED
1086 * @return RES_NO_SUCH_SESSION
1087 * @return RES_DB_QUERY_ERROR
1088 * @return RES_NO_SUCH_USER
1089 * @return RES_ERROR
1090 *
1091 */
1092 result_t updateAccount( sessionid_t sid, const account_t* account )
1093 {
1094 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1095 if( account == NULL ) return RES_ERROR;
1096 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1097 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1098 SQLRETURN sqlcode;
1099 result_t ret = RES_ERROR;
1100
1101 //xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧?
1102 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 }
1250
1251 //vpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧剃ク頑嶌縺阪☆繧?/span>
1252 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 }
1322 return ret;
1323 }
1324
1325 /**
1326 *
1327 * criteria_t縺ァ謖?ョ壹&繧後◆遽?峇縺ョ繝ヲ繝シ繧カID繧定ソ斐☆.
1328 * 繝ヲ繝シ繧カID縺ョ驟榊?繧堤「コ菫昴@縺ヲ縺昴%縺ォ譖ク縺崎セシ縺ソ?碁?蛻励?繧「繝峨Ξ繧ケ繧?uids縺ォ譖ク縺崎セシ繧?.
1329 * 驟榊?縺ョ繧オ繧、繧コ繧?uidsLen縺ォ譖ク縺崎セシ繧?
1330 *
1331 * @param sid 繧サ繝?す繝ァ繝ウID
1332 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
1333 * @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 *
1340 */
1341 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1342 {
1343 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1344 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1345
1346 result_t ret = RES_ERROR;
1347 userid_t* dst = 0;
1348 string sql;
1349 SQLRETURN sqlcode;
1350 SQLINTEGER count = 0;
1351
1352
1353 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
1354 sql += criteria2str( cri );
1355 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 }
1386 return ret;
1387 }
1388
1389 /**
1390 *
1391 * 繧ー繝ォ繝シ繝玲焚繧定ソ斐☆.
1392 * 荳肴ュ」縺ェ繧サ繝?す繝ァ繝ウID縺ェ繧?繧定ソ斐☆.
1393 *
1394 * @param sid 繧サ繝?す繝ァ繝ウID
1395 * @return 繧ー繝ォ繝シ繝玲焚
1396 *
1397 */
1398 int getGroupCount( sessionid_t sid )
1399 {
1400 if( hdbc == NULL ) return 0;
1401 if( !isValidSessionID( sid ) ) return 0;
1402
1403 SQLRETURN sqlcode;
1404 SQLHANDLE hstmt = NULL;
1405 string sql;
1406 int ret = 0;
1407
1408 //繧ー繝ォ繝シ繝玲焚繧呈アゅa繧?/span>
1409 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
1410 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 }
1432 return ret;
1433 }
1434
1435 /**
1436 *
1437 * 謇?螻槭げ繝ォ繝シ繝嶺ク?隕ァ蜿門セ?
1438 * 繝ヲ繝シ繧カ縺梧園螻槭@縺ヲ縺?k繧ー繝ォ繝シ繝励?ID繧貞叙蠕励☆繧?/span>
1439 *
1440 * @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 *
1451 */
1452 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1453 {
1454 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1455 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1456 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け
1457
1458 result_t ret = RES_ERROR;
1459 string sql;
1460 SQLRETURN sqlcode;
1461 SQLHANDLE hstmt = NULL;
1462 SQLINTEGER count = 0;
1463 groupid_t* dst = 0;
1464 int len = 0;
1465
1466 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups_users_link";
1467 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1468 sql += criteria2str( cri );
1469 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 }
1476
1477 //謇?螻槭☆繧九げ繝ォ繝シ繝励?譛?螟ァ蛟区焚繧呈アゅ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 }
1520 return ret;
1521 }
1522
1523 /**
1524 *
1525 * 繧ー繝ォ繝シ繝礼ョ。逅?ィゥ髯仙撫蜷医○.
1526 * 繝ヲ繝シ繧カ縺ォ繝ォ繝シ繝励?邂。逅?ィゥ髯舌′縺ゅk縺?繧ー繝ォ繝シ繝礼ョ。逅???〒縺ゅk縺?繧貞撫縺?粋繧上○繧?
1527 * 繝ヲ繝シ繧カ繧?げ繝ォ繝シ繝励′蟄伜惠縺励↑縺?↑縺ゥ縺ョ逡ー蟶ク縺ョ蝣エ蜷茨シ掲alse繧定ソ斐☆.
1528 *
1529 * @param sid 繧サ繝?す繝ァ繝ウID
1530 * @param gid 繧ー繝ォ繝シ繝励?UID
1531 * @param uid 繝ヲ繝シ繧カ縺ョUID
1532 * @return true 邂。逅?ィゥ髯舌≠繧?/span>
1533 * @return false 邂。逅?ィゥ髯舌↑縺暦シ後∪縺溘?荳肴?
1534 *
1535 */
1536 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
1537 {
1538 if( hdbc == NULL ) return false;
1539 if( !isValidSessionID( sid ) ) return false;
1540 if( !uidExists( uid ) ) return false;
1541 if( !gidExists( gid ) ) return false;
1542
1543 bool ret = false;
1544 string sql;
1545 SQLRETURN sqlcode;
1546 SQLINTEGER count = 0;
1547
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 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 }
1561 return ret;
1562 }
1563
1564 /**
1565 *
1566 * 繧ー繝ォ繝シ繝悠D荳?隕ァ.
1567 * 逋サ骭イ縺輔l縺ヲ縺?k繧ー繝ォ繝シ繝励?ID荳?隕ァ繧貞叙蠕励☆繧?
1568 *
1569 * @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 *
1578 */
1579 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1580 {
1581 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1582 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1583
1584 result_t ret = RES_ERROR;
1585 groupid_t* dst = 0;
1586 string sql;
1587 SQLRETURN sqlcode;
1588 SQLINTEGER count = 0;
1589
1590 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
1591 sql += criteria2str( cri );
1592 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1593 *gidsLen = count;
1594 dst = new groupid_t[ *gidsLen ];
1595 *gids = dst;
1596 }else{
1597 return RES_ERROR;
1598 }
1599
1600 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 }
1620 return ret;
1621 }
1622
1623 /**
1624 *
1625 * 繧ー繝ォ繝シ繝礼ョ。逅???D繧貞叙蠕励☆繧?
1626 * 縺ゅk繧ー繝ォ繝シ繝励?邂。逅????繝ヲ繝シ繧カID繧貞叙蠕励☆繧?
1627 *
1628 * @param sid 繧サ繝?す繝ァ繝ウID
1629 * @param gid 蝠上>蜷医o縺帙k繧ー繝ォ繝シ繝励rID縺ァ謖?ョ壹☆繧?/span>
1630 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
1631 * @param uids 邂。逅????UID縺ョ驟榊?繧貞女縺大叙繧九?繧、繝ウ繧ソ
1632 * @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー
1633 * @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 *
1639 */
1640 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1641 {
1642 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1643 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1644
1645 result_t ret = RES_ERROR;
1646 groupid_t* dst = 0;
1647 string sql;
1648 SQLRETURN sqlcode;
1649 SQLINTEGER count = 0;
1650
1651 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
1652 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 }
1659 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 }
1678 return ret;
1679 }
1680
1681 /**
1682 *
1683 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜑企勁.
1684 * 繧ー繝ォ繝シ繝励↓謇?螻槭☆繧九Θ繝シ繧カ繧抵シ後げ繝ォ繝シ繝励°繧牙炎髯、縺吶k.
1685 *
1686 * @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 *
1696 */
1697 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1698 {
1699 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1700 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 result_t ret = RES_ERROR;
1705 string sql;
1706 SQLRETURN sqlcode;
1707 SQLHANDLE hstmt = NULL;
1708
1709 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1710 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1711 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1712 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 }
1737 return ret;
1738 }
1739
1740 /**
1741 *
1742 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ霑ス蜉?.
1743 * 繧ー繝ォ繝シ繝励?繝。繝ウ繝舌?縺ォ繝ヲ繝シ繧カ繧定ソス蜉?縺吶k.
1744 *
1745 * @param sid 繧サ繝?す繝ァ繝ウID
1746 * @param gid 謇?螻槫?繧ー繝ォ繝シ繝励?ID
1747 * @param uid 謇?螻槭&縺帙k繝ヲ繝シ繧カ縺ョID
1748 * @param admin 邂。逅???ィゥ髯舌r荳弱∴繧九↑繧液rue
1749 * @return RES_OK
1750 * @return RES_DB_NOT_INITIALIZED
1751 * @return RES_NO_SUCH_SESSION
1752 * @return RES_NO_SUCH_USER
1753 * @return RES_NO_SUCH_GROUP
1754 * @return RES_DB_QUERY_ERROR
1755 *
1756 */
1757 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1758 {
1759 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1760 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 result_t ret = RES_ERROR;
1765 string sql;
1766 SQLRETURN sqlcode;
1767
1768 //繝。繝ウ繝舌?繧定ソス蜉?
1769 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 }
1797 return ret;
1798 }
1799
1800 /**
1801 *
1802 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜿門セ?
1803 * 縺ゅk繧ー繝ォ繝シ繝励?謇?螻槭@縺ヲ縺?k繝ヲ繝シ繧カ縺ョ繝ヲ繝シ繧カID繧貞叙蠕励☆繧?/span>
1804 *
1805 * @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 *
1817 */
1818 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1819 {
1820 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1821 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1822 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け
1823
1824 result_t ret = RES_ERROR;
1825 string sql;
1826 SQLRETURN sqlcode;
1827 SQLHANDLE hstmt = NULL;
1828 userid_t* dst = 0;
1829
1830 //how many members ?
1831 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1832 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1833 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 }else{
1881 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
1882 ret = RES_DB_QUERY_ERROR;
1883 }
1884 return ret;
1885 }
1886
1887 /**
1888 *
1889 * 繧ー繝ォ繝シ繝励?蜑企勁.
1890 * 繝??繧ソ繝吶?繧ケ縺九i繧ー繝ォ繝シ繝励r蜑企勁縺励∪縺?
1891 *
1892 * @param sid 繧サ繝?す繝ァ繝ウID
1893 * @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励?謇?螻槭Θ繝シ繧カ繧貞撫縺?粋繧上○繧九°繧偵げ繝ォ繝シ繝励rID縺ァ謖?ョ?/span>
1894 * @return RES_OK
1895 * @return RES_DB_QUERY_ERROR
1896 * @return RES_NO_SUCH_SESSION
1897 * @return RES_DB_NOT_INITIALIZED
1898 *
1899 */
1900 result_t deleteGroup( sessionid_t sid, groupid_t gid )
1901 {
1902 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1903 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1904
1905 result_t ret = RES_ERROR;
1906 string sql;
1907 SQLRETURN sqlcode;
1908 SQLHANDLE hstmt = NULL;
1909
1910 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
1911 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
1912 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 }
1937 return ret;
1938 }
1939
1940 /**
1941 *
1942 * 繧ー繝ォ繝シ繝礼匳骭イ.
1943 * 繧ー繝ォ繝シ繝励?諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ險倬鹸縺吶k??/span>
1944 * 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D繧暖id縺ォ譬シ邏阪☆繧具シ?/span>
1945 *
1946 * @param sid 繧サ繝?す繝ァ繝ウID
1947 * @param group 逋サ骭イ縺励◆縺?げ繝ォ繝シ繝励?諠??ア
1948 * @param gid 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D
1949 * @return RES_OK
1950 * @return RES_DB_NOT_INITIALIZED
1951 * @return RES_NO_SUCH_SESSION
1952 * @return RES_DB_QUERY_ERROR
1953 *
1954 */
1955 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
1956 {
1957 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1958 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1959
1960 result_t ret = RES_ERROR;
1961 string sql;
1962 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 }
2026 return ret;
2027 }
2028
2029 /**
2030 *
2031 * 繧ー繝ォ繝シ繝玲ュ蝣ア繧貞、画峩縺吶k
2032 *
2033 * @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 *
2042 */
2043 result_t updateGroup( sessionid_t sid, const group_t* group )
2044 {
2045 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2046 if( group == NULL ) return RES_ERROR;
2047 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2048 if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
2049
2050 result_t ret = RES_ERROR;
2051 string sql;
2052 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 }
2089 return RES_OK;
2090 }
2091
2092 /**
2093 *
2094 * 繧ー繝ォ繝シ繝玲ュ蝣ア蜿門セ?/span>
2095 *
2096 * @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 *
2105 */
2106 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
2107 {
2108 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 }
2114
2115 /**
2116 *
2117 * 隍?焚縺ョ繧ー繝ォ繝シ繝玲ュ蝣ア繧剃ク?蠎ヲ縺ォ蜿門セ励☆繧?
2118 *
2119 * @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 *
2130 */
2131 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
2132 {
2133 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2134 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2135
2136 SQLRETURN sqlcode;
2137 SQLHANDLE hstmt = NULL;
2138 result_t ret = RES_ERROR;
2139 string sql;
2140 group_t* dst = new group_t[ gidsLen ];
2141
2142 sql += "SELECT gid, gname, gdesc ";
2143 sql += "FROM " + dbprefix + "_vpaccount_groups ";
2144 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 }
2150 sql += criteria2str( cri );
2151
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 }
2164 *groups = dst;
2165 ret = RES_OK;
2166 }else{
2167 setLastErrorString( "SQLExecDirect in getAccounts" );
2168 ret = RES_DB_QUERY_ERROR;
2169 }
2170 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2171 }else{
2172 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
2173 ret = RES_DB_QUERY_ERROR;
2174 }
2175 return ret;
2176 }
2177
2178 /**
2179 *
2180 * 繝「繝?Ξ繝シ繧ソ讓ゥ髯舌?譛臥┌繧定ソ斐☆
2181 *
2182 * @param sid 繧サ繝?す繝ァ繝ウID
2183 * @param uid 蝠上>蜷医o縺帙◆縺?Θ繝シ繧カ縺ョUID
2184 * @return true 讓ゥ髯舌≠繧?/span>
2185 * @return false 讓ゥ髯舌↑縺?/span>
2186 *
2187 */
2188 bool isModerator( sessionid_t sid, userid_t uid )
2189 {
2190 if( hdbc == NULL ) return false;
2191 if( !isValidSessionID( sid ) ) return false;
2192 if( !uidExists( uid ) ) return false;
2193
2194 bool ret = false;
2195 SQLRETURN sqlcode;
2196 SQLHANDLE hstmt = NULL;
2197 SQLINTEGER count = 0;
2198 string sql;
2199 groupid_t moderator_gid;
2200
2201 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2202 sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";
2203 sql += " WHERE name='moderator_gid'";
2204 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2205 SQLINTEGER len = 0;
2206 SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len );
2207 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2208 sql = "SELECT * from " + dbprefix + "_groups_users_link ";
2209 sql += "WHERE groupid=" + unsignedIntToString( moderator_gid );
2210 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2211 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2212 if( count > 0 ){
2213 ret = true;
2214 }
2215 }
2216 }else{
2217 setLastErrorString( "SQLFetch in isModerator " );
2218 }
2219 }else{
2220 string s( "SQLExecDirect in isModerator " );
2221 s += odbcDiagString( hstmt, sqlcode );
2222 s += ", sql=";
2223 s += string( sql );
2224 setLastErrorString( s.c_str( ) );
2225 }
2226 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2227 }else{
2228 setLastErrorString( "SQLAllocHandle in isModerator " );
2229 }
2230 return ret;
2231 }
2232
2233 /**
2234 *
2235 * 繝ヲ繝シ繧カID蜿門セ?/span>
2236 *
2237 * @param uname ID繧貞叙蠕励@縺溘>繝ヲ繝シ繧カ繝シ蜷?/span>
2238 * @param uid ID繧剃サ」蜈・縺励◆縺?、画焚縺ョ繝昴う繝ウ繧ソ
2239 * @return RES_ERROR
2240 * @return RES_OK
2241 * @refer result_t
2242 *
2243 */
2244 result_t getUid( const char* uname, userid_t* uid )
2245 {
2246 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2247 if( uname == NULL ) return RES_ERROR;
2248
2249 result_t ret = RES_ERROR;
2250 SQLRETURN sqlcode;
2251 SQLHANDLE hstmt = NULL;
2252 string sql;
2253 string uname2 = addSlashes( uname );
2254
2255 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
2256 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2257 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2258 userid_t _uid = 0;
2259 SQLINTEGER len;
2260 SQLBindCol( hstmt, 1, SQL_C_ULONG, &_uid, 0, &len );
2261 sqlcode = SQLFetch( hstmt );
2262 if( sqlcode == SQL_SUCCESS ){
2263 *uid = _uid;
2264 ret = RES_OK;
2265 }else {
2266 string s( "SQLFetch in getUid sql=" );
2267 s += string( sql );
2268 setLastErrorString( s.c_str( ) );
2269 ret = RES_NO_SUCH_USER;
2270 }
2271 }else{
2272 setLastErrorString( "SQLExecDirect in getUid" );
2273 ret = RES_DB_QUERY_ERROR;
2274 }
2275 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2276 }else{
2277 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUid" );
2278 ret = RES_DB_QUERY_ERROR;
2279 }
2280
2281 return ret;
2282 }
2283
2284 /**
2285 *
2286 * 繧サ繝?す繝ァ繝ウ繧剃ス懈?縺踊oops_vpaccount_session縺ォ譖ク縺崎セシ繧?縲 sessionid_t繧痴ession縺ォ霑斐☆縲?/span>
2287 *
2288 * @param uid xoops_users縺ョuid
2289 * @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span>
2290 * @return RES_OK 謌仙粥
2291 * @return RES_DB_QUERY_ERROR DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ
2292 */
2293 static result_t addSession( userid_t uid, sessionid_t* session )
2294 {
2295 result_t ret = RES_DB_QUERY_ERROR;
2296 SQLRETURN sqlcode;
2297 string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" +
2298 unsignedIntToString(uid) + ")";
2299 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2300 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2301 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2302 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2303 sql = "SELECT LAST_INSERT_ID()";
2304 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2305 sessionid_t sid;
2306 SQLINTEGER len;
2307 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sid, 0, &len );
2308 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2309 *session = sid;
2310 ret = RES_OK;
2311 }
2312 }
2313 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2314 }
2315 }else{
2316 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2317 }
2318 }
2319 return ret;
2320 }
2321
2322
2323 /**
2324 *
2325 * 繝ュ繧ー繧、繝ウ隱崎ィシ縺ィ繧サ繝?す繝ァ繝ウ菴懈?
2326 *
2327 * @param uname 繝ュ繧ー繧、繝ウ蜷?/span>
2328 * @param passwd 繝代せ繝ッ繝シ繝?/span>
2329 * @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span>
2330 * @return RES_OK 繝ュ繧ー繧、繝ウ謌仙粥縲Tession縺ォsessionid_t繧呈嶌縺崎セシ繧薙□縲?lt;br>
2331 * @return RES_LOGIN_FAILURE uname縺セ縺溘?passwd縺檎焚蟶ク<br>
2332 * @return RES_DB_QUERY_ERROR DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ
2333 *
2334 */
2335 result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
2336 {
2337 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2338
2339 result_t ret;
2340 string sql;
2341 SQLRETURN sqlcode;
2342
2343 // uname, passwd -> uid
2344 string escUname = addSlashes( uname );
2345 string escPasswd = addSlashes( passwd );
2346 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
2347
2348 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2349 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2350 userid_t uid = 0;
2351 SQLINTEGER len;
2352 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
2353 sqlcode = SQLFetch( hstmt );
2354 if( sqlcode == SQL_SUCCESS ){
2355 ret = addSession( uid, session );
2356 }else {
2357 string s( "SQLFetch in loginUser" );
2358 setLastErrorString( s.c_str( ) );
2359 ret = RES_LOGIN_FAILURE;//illegal loginname or password
2360 }
2361 }else{
2362 setLastErrorString( "SQLExecDirect in loginUser" );
2363 ret = RES_DB_QUERY_ERROR;
2364 }
2365 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2366 }else{
2367 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in loginUser" );
2368 ret = RES_DB_QUERY_ERROR;
2369 }
2370
2371 return ret;
2372 }
2373
2374 /**
2375 *
2376 * 繝ュ繧ー繧「繧ヲ繝医→繧サ繝?す繝ァ繝ウ邨ゆコ?/span>
2377 *
2378 * @param sid session id
2379 * @return 縺ェ縺?/span>
2380 *
2381 */
2382 void logoutUser( sessionid_t sid )
2383 {
2384 if( hdbc == NULL ) return; // RES_DB_NOT_INITIALIZED;
2385
2386 result_t ret;
2387 string sql;
2388
2389 sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);
2390 if ( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){
2391 /*
2392 if ( fp_mysql_affected_rows(mysql) == 1 ){
2393 // 繝ュ繧ー繧「繧ヲ繝医@縺?/span>
2394 }
2395 else {
2396 // sid縺檎┌蜉ケ
2397 }
2398 */
2399 }
2400 else {
2401 // DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ
2402 }
2403 }
2404
2405 /**
2406 *
2407 * 繧サ繝?す繝ァ繝ウ縺ョ菴懈?.<br>
2408 * XOOPS縺ョsession繝??繝悶Ν縺ォ險倬鹸縺輔l縺殱ess_id縺ィ蠑墓焚sess_id縺檎ュ峨@縺代l
2409 * 縺ー?茎ession_t繧剃ス懈?縺吶k縲?/span>
2410 * 繝??繧ソ繝吶?繧ケ縺ォ繧サ繝?す繝ァ繝ウ縺ィ蠑墓焚縺ョ諠??ア繧定ィ倬鹸縺吶k
2411 *
2412 * @param sessionid xoops縺ョsession_id
2413 * @param uid xoops_users縺ョuid
2414 * @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span>
2415 * @return RES_OK
2416 * @return RES_ERROR
2417 * @return RES_DB_QUERY_ERROR
2418 *
2419 */
2420 result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )
2421 {
2422 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2423
2424 result_t ret;
2425 string sql;
2426 SQLHANDLE hstmt = NULL;
2427 SQLRETURN sqlcode;
2428
2429 string escSess_id = addSlashes(sess_id);
2430 sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";
2431 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2432 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2433 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2434 ret = addSession( uid, session );
2435 }else{
2436 ret = RES_ERROR;
2437 }
2438 }else {
2439 ret = RES_DB_QUERY_ERROR;
2440 }
2441 }else{
2442 ret = RES_DB_QUERY_ERROR;
2443 }
2444 return ret;
2445 }
2446
2447 /**
2448 *
2449 * 繧サ繝?す繝ァ繝ウ縺ョ隧ウ邏ー繧痴ession_t縺ァ蜿門セ励☆繧?<br>
2450 *
2451 * @param sid 繧サ繝?す繝ァ繝ウID
2452 * @param ppsession sessionid_t*繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span>
2453 * @return RES_OK 謌仙粥縲GreeResult(*ppsession)縺悟ソ?ヲ√??lt;br>
2454 * @return RES_NO_SUCH_SESSION<br>
2455 * @return RES_DB_QUERY_ERROR<br>
2456 * @return RES_DB_NOT_INITIALIZED
2457 *
2458 */
2459 result_t getSession( sessionid_t sid, const session_t** ppsession )
2460 {
2461 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2462
2463 result_t ret;
2464 string sql;
2465
2466 /*
2467 sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
2468 "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
2469 if( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){
2470 MYSQL_RES* result = fp_mysql_store_result( mysql );
2471 if( result ){
2472 MYSQL_ROW row = fp_mysql_fetch_row(result);
2473 if( row ){
2474 session_t *p = new session[1];
2475 p->setSessionID(sid);
2476 p->setUserID(atoi( row[1] != NULL ? row[1] : "" ));
2477 p->setDate(atoi( row[2] != NULL ? row[2] : "" ));
2478 *ppsession = p;
2479 ret = RES_OK;
2480 }else{
2481 ret = RES_NO_SUCH_SESSION;
2482 }
2483 fp_mysql_free_result( result );
2484 }else {
2485 ret = RES_DB_QUERY_ERROR;
2486 }
2487 }else{
2488 ret = RES_DB_QUERY_ERROR;
2489 }
2490
2491 */
2492 return ret;
2493 }
2494
2495 /**
2496 *
2497 * 繧サ繝?す繝ァ繝ウ縺ョ豁」蠖捺?ァ繧偵メ繧ァ繝?け縺吶k.
2498 *
2499 * @param sid 繝√ぉ繝?け縺励◆縺гession
2500 * @return true 豁」蠖?/span>
2501 * @return false 荳肴ュ」
2502 *
2503 */
2504 bool isValidSessionID( sessionid_t sid )
2505 {
2506 if( hdbc == NULL ) return false;
2507
2508 bool ret = false;
2509 string sql;
2510 char buf[ 12 ];
2511 snprintf( buf, 12, "%d", sid );
2512 SQLRETURN sqlcode;
2513 SQLHANDLE hstmt = NULL;
2514
2515 sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf );
2516 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2517 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2518 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2519 ret = true;
2520 }else{
2521 snprintf( buf, 12, "%d", sqlcode );
2522 string s( "SQLFetch in isValidSessionID(sqlcode=" );
2523 s += string( buf ) + ", sql=" + sql + ")";
2524 setLastErrorString( s.c_str() );
2525 ret = false;
2526 }
2527 }else{
2528 setLastErrorString( "SQLExecDirect in isValidSessionID" );
2529 ret = false;
2530 }
2531 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2532 }else{
2533 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isValidSessionID" );
2534 ret = false;
2535 }
2536 return ret;
2537 }
2538
2539 void freeAccount( const account_t* ptr ){ delete[] ( account_t* )ptr; }
2540 void freeGroup( const group_t* ptr ){ delete[] ( group_t* )ptr; }
2541 void freeSession( const session_t* ptr ){ delete[] ( session_t* )ptr; }
2542 void freeUID( const int* ptr ){ delete[] ( int* )ptr; }
2543 void freeGID( const int* ptr ){ delete[] ( int* )ptr; }
2544
2545 static string errstr;
2546 const char* getLastErrorString()
2547 {
2548 return errstr.c_str( );
2549 }
2550
2551 void setLastErrorString( const char* str )
2552 {
2553 errstr = str;
2554 // fprintf( stderr, "setLastErrorString( '%s' );\n", str );
2555 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26