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.35 - (show annotations) (download) (as text)
Thu Jan 6 07:20:17 2005 UTC (19 years, 3 months ago) by youi
Branch: MAIN
Changes since 1.34: +194 -91 lines
File MIME type: text/x-c++src
WIN32定義時のインクルードの追加.
MySQL APIに関するヘッダファイルを削除.
deleteAccount: 所属するPlatformグループからの削除を内蔵した.
insertAccount: ユーザ登録と同時にデフォルトPlatformグループへ登録する.
deleteMember: デフォルトPlatformグループからの削除を禁止する.
deleteMemberNoLimitの定義.

1 /*
2 *
3 * $Revision: 1.34 $
4 * $Log: commonal.cc,v $
5 * Revision 1.34 2004/12/28 04:38:14 aga
6 * ??ogoutUser()??信罩?
7 *
8 * Revision 1.33 2004/12/27 05:56:23 youi
9 * odbcDiagString: STMT篁ュ?????潟??????????????????????眼????.
10 * syslog?<???祉?若?吾????????菴遵??????.
11 *
12 * Revision 1.32 2004/12/25 09:46:47 youi
13 * MySQL+MyODBC?у??篏???????????信罩c????.
14 *
15 * Revision 1.31 2004/12/21 11:42:59 youi
16 * ?潟?<?潟??????逸??祉???ゃ???????????菴遵??.
17 *
18 * Revision 1.30 2004/12/18 10:24:54 youi
19 * IMPORT_MYSQLDLL??絎?臂?????????鐚?MYSQL??LL?????????潟?????????????帥?ゃ??絎h???
20 * ???鴻????????????信罩c????.
21 *
22 * Revision 1.29 2004/12/18 01:12:29 youi
23 * freeResult???∽?医????free<???若?水??>????眼????.
24 *
25 * Revision 1.28 2004/12/14 12:02:08 youi
26 * __WIN__??絎?臂???????????indows??ll篏??????荀?????????茵?????.
27 * USE_SYSLOG??絎?臂???????????yslogd?吾?<???祉?若?吾???阪??????.
28 * getAccounts: uidsLen??0??????????????菴遵??????.
29 *
30 * Revision 1.27 2004/12/06 11:34:47 aga
31 * ??ninitializeDB()??菴遵??.
32 *
33 * Revision 1.26 2004/12/06 10:17:36 youi
34 * mysql_use_result????腟?????罧??????????冴??????鐚?
35 * while( row = mysql_fetch_row(result) );???水?ワ?
36 *
37 * Revision 1.25 2004/12/06 07:24:33 youi
38 * insertAccount, insertGroup:
39 * ?域?菴遵?????????宴???綽????????若??D鐚??違???若??ID??膃??綣??違???吾??莨若??.
40 *
41 * Revision 1.24 2004/12/06 01:45:50 aga
42 * ?祉?潟?<?潟???ゃ??.
43 * ?脂???上???篆??.
44 *
45 * Revision 1.23 2004/12/04 09:21:10 aga
46 * ??p_config ?? vpaccount_config.
47 *
48 * Revision 1.22 2004/12/03 07:17:21 youi
49 * isModerator?с?≪???祉?鴻???????若?帥???若?鴻???若????????篆??.
50 *
51 * Revision 1.21 2004/12/01 10:28:58 youi
52 * DB????????????眼??軸??篆??
53 * institute -> division
54 * organizaion -> company_name
55 *
56 * Revision 1.20 2004/12/01 04:37:04 youi
57 * freeResult: unsigned int* ?? int* ?娯信罩?
58 * ?潟?<?潟???????∽?違???????菴処?.
59 *
60 * Revision 1.19 2004/11/30 06:40:11 youi
61 * ?∽?違??菴遵??(gidExists, uidExists)
62 * getGroupCount??絎?臂?
63 * getGroupsByUid??絎?臂?
64 * isGroupAdmin??篆??.
65 * dumpGroupAdmins??絎?臂?
66 * deleteMember??絎?臂?
67 * insertMember??絎?臂?
68 * getMembers??絎?臂?
69 * isModerator??絎?臂?
70 *
71 * Revision 1.18 2004/11/30 05:46:32 aga
72 * ??ession????remoteHost??????
73 *
74 * Revision 1.17 2004/11/27 09:35:49 youi
75 * isActivated??絎?臂?
76 * activate??絎?臂?
77 * dumpUid??絎?臂?
78 *
79 * Revision 1.16 2004/11/27 06:29:29 youi
80 * getAccountCount??絎?臂?
81 * dumpGids??絎?臂?
82 * insertGroup, deleteGroup, updateGroup??絎?臂?
83 * getGroup, getGroups??絎?臂?
84 * ???若?帥???若?劫?????????弱?冴?????鐚?RES_DB_NOT_INITIALIZED??菴????????????∽?違??申??
85 * (???綽????∽?違??罧??c??????)
86 *
87 * Revision 1.15 2004/11/27 02:22:22 aga
88 * ??nitializeDB????ddSlashes()???若?吟???純?<??????篆??.
89 *
90 * Revision 1.14 2004/11/27 01:07:31 youi
91 * criteria2str: LIMIT??RDER BY?????????ャ???帥????.
92 *
93 * Revision 1.13 2004/11/27 00:35:39 youi
94 * getAccounts??絎?臂?
95 * getAccount??篆??鐚???????etAccounts???若?喝?冴??.
96 * criteria2str??絎?臂?
97 *
98 * Revision 1.12 2004/11/26 09:45:28 youi
99 * getAccount??絎?臂?
100 *
101 * Revision 1.11 2004/11/26 08:16:26 aga
102 * ??etSession, loginUser, createSession, freeResult(const session_t*) 篆??.
103 *
104 * Revision 1.10 2004/11/26 07:57:42 youi
105 * updateAccount, deleteAccount??絎?臂?
106 * mysql_query紊掩??????tderr?吾?????若?潟?若?????????若?<???祉?若?吾???阪??.
107 *
108 * Revision 1.9 2004/11/26 07:38:02 aga
109 * ??AILUE -> FAILURE.
110 *
111 * Revision 1.8 2004/11/26 06:36:55 aga
112 * ??reateSession, getSession ??篏???.
113 *
114 * Revision 1.7 2004/11/26 04:51:47 youi
115 * dbprefix??絎?臂?????.
116 * insertAccount??絎?臂?????.
117 * isValidSessionID??絎?臂?????.
118 *
119 * Revision 1.6 2004/11/26 04:35:55 aga
120 * ??oginUser(), logoutUser()??篏???.
121 *
122 * Revision 1.5 2004/11/26 01:08:25 aga
123 * ??ddSlashes()篏???.
124 *
125 * Revision 1.4 2004/11/25 12:14:29 youi
126 * getUid????????絎?臂?????.
127 *
128 * Revision 1.3 2004/11/25 11:13:59 youi
129 * getLastErrorString/setLastErrorString??絎?臂?
130 *
131 * Revision 1.2 2004/11/25 08:55:19 youi
132 * 綣??違??????篆??.
133 * freeResult??菴遵??.
134 *
135 * Revision 1.1 2004/11/25 05:14:58 youi
136 * initial version
137 *
138 *
139 */
140 #ifdef WIN32
141 #include <windows.h>
142 #endif
143
144 #ifdef USE_SYSLOG
145 #include <syslog.h>
146 #endif
147
148 #include <stdio.h>
149 #include <stdlib.h>
150 #include <string.h>
151 #include <string>
152 #include <assert.h>
153 #include <sql.h>
154 #include <sqlext.h>
155 using namespace std;
156
157 #include "common.h"
158 #include "account.h"
159 #include "group.h"
160 #include "session.h"
161 #include "criteria.h"
162 #include "commonal.h"
163
164 static string dbprefix; //!< XOOPS???若?帥???若?鴻???若??????REFIX
165
166 static SQLHANDLE henv = NULL;
167 static SQLHANDLE hdbc = NULL;
168 static SQLHANDLE hstmt = NULL;
169
170 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
171 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
172
173 static result_t countResultRows( const char* sql, SQLINTEGER* count )
174 {
175 result_t ret = RES_ERROR;
176 SQLRETURN sqlcode;
177 SQLHANDLE hstmt = NULL;
178 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
179 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
180 *count = 0;
181 while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
182 ret = RES_OK;
183 }else{
184 string s( "SQLExecDirect in countResultRows " );
185 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
186 s += "sql=";
187 s += string( sql );
188 setLastErrorString( s.c_str( ) );
189 ret = RES_DB_QUERY_ERROR;
190 }
191 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
192 }
193 return ret;
194 }
195
196 /**
197 *
198 * ??絖????潟???種?
199 * ??絎???絖??違???潟???若??鐚????????<????緇???NULL腟?腴?????鐚?/span>
200 * ( dst???泣?ゃ? >= len + 1 )?с????????/span>
201 *
202 */
203 static char* strncpy2( char* dst, const char* src, int len )
204 {
205 strncpy( dst, src, len );
206 dst[ len ] = '\0';
207 // fprintf( stderr, "strncpy2 '%s'\n", dst );
208 return dst;
209 }
210
211 /**
212 *
213 * SQL???茵?腟????????????惹??絖?????????????
214 *
215 * @param hstmt SQL??????潟????/span>
216 * @param sqlcode SQLExecDirect,SQLExecute???祉????/span>
217 * @return ?????惹??絖???
218 */
219 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
220 {
221 string s;
222 if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
223 SQLCHAR SQLState[6];
224 SQLINTEGER NativeError;
225 SQLCHAR MessageText[ 1024 ];
226 SQLSMALLINT BufferLength;
227 SQLSMALLINT TextLength;
228 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
229
230 s += string( (char*)MessageText );
231 s += " SQLSTATE=";
232 s += string( (char*)SQLState );
233
234 }
235 s += " sqlcode=";
236 s += intToString( sqlcode );
237 return s;
238 }
239
240 /**
241 *
242 * ??絎??????????ゃ???????冴??????????絖?????菴???
243 *
244 */
245 string getResultCol( SQLHANDLE hstmt, int col )
246 {
247 string s;
248 SQLRETURN sqlcode;
249 SQLCHAR BinaryPtr[5000];
250 SQLUINTEGER PartID;
251 SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes;
252 SQLRETURN rc;
253
254 while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
255 &BinaryLenOrInd)) != SQL_NO_DATA) {
256 NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
257 if( NumBytes >= 0 ){
258 s += string( (char*)BinaryPtr, NumBytes );
259 }
260 }
261 #ifdef USE_SYSLOG
262 // openlog( "commonal", LOG_ODELAY, LOG_USER );
263 // syslog( LOG_DEBUG, "getResultCol col=%d ret='%s'\n", col, s.c_str());
264 // closelog( );
265 #endif
266 return s;
267 }
268
269
270 /**
271 *
272 * ?????若????????\荐??激?с???鴻?宴?若??????
273 *
274 * @param str addslashes???鴻????絖?????NULL??絎?筝?????
275 * @return 紊???緇?????絖???
276 */
277 string addSlashes( const char *str )
278 {
279 if ( hdbc == NULL ){
280 string s;
281 return s;
282 }else{
283 string s( str );
284 return s;
285 }
286
287 int len = strlen(str) * 3;
288 char* dst = new char[ len ];
289 const char* from = str;
290 char* to = dst;
291 while( *from != '\0' ){
292 switch( *from ){
293 case '\'':
294 case '\"':
295 case ';':
296 *to = '\\'; to++;
297 break;
298 }
299 *to = *from; to++;
300 from++;
301 }
302 *to = '\0';
303 string s( dst );
304 delete[] dst;
305 return s;
306 }
307
308 /**
309 *
310 * gid??????????с????
311 * DB???≪???祉?劫け????????false??????鐚?/span>
312 *
313 * @param gid ???с??????????GID
314 * @return true 絖???????
315 * @return false 絖?????????
316 *
317 */
318 static bool gidExists( groupid_t gid )
319 {
320 string sql;
321 SQLRETURN sqlcode;
322 SQLHANDLE hstmt = NULL;
323
324 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
325 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
326 return false;
327 }
328
329 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups ";
330 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
331 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
332 setLastErrorString( "SQLExecDirect in gidExists" );
333 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
334 return false;
335 }
336
337 if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
338 setLastErrorString( "SQLFetch in gidExists" );
339 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
340 return false;
341 }
342
343 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
344 return true;
345 }
346
347
348 /**
349 *
350 * Platform???若?倶???宴??id??絖??????????????с????
351 * DB???≪???祉?劫け????????false??????鐚?/span>
352 *
353 * @param uid ???с??????????UID
354 * @return true 絖???????
355 * @return false 絖?????????
356 *
357 */
358 static bool uidExists( userid_t uid )
359 {
360 bool ret = false;
361 string sql;
362 SQLRETURN sqlcode;
363 SQLINTEGER count = 0;
364
365 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
366 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
367 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
368 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
369 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
370 ret = true;
371 }else{
372 string s( "SQLFetch in uidExists ");
373 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
374 s += string( ", sql=" ) + string( sql );
375 setLastErrorString( s.c_str( ) );
376 ret = false;
377 }
378 }else{
379 string s( "SQLExecDirect in uidExists ");
380 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
381 s += string( ", sql=" ) + string( sql );
382 setLastErrorString( s.c_str( ) );
383 ret = false;
384 }
385 }else{
386 string s( "SQLAllocHandle in uidExists ");
387 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
388 setLastErrorString( s.c_str( ) );
389 ret = false;
390 }
391 return ret;
392 }
393
394
395 /**
396 *
397 * criteria ?? SQL?????????
398 *
399 *
400 *
401 */
402 string criteria2str( criteria* cri )
403 {
404 string sql;
405
406 const orderby* odrby = cri -> headOrderBy( );
407 if( odrby != 0 ){
408 sql += " ORDER BY " + string( odrby -> getColumn( ) );
409 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
410 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
411 sql += ", " + string( odrby -> getColumn( ) );
412 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
413 }
414 }
415
416 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
417 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
418 + ", " + string( intToString( cri -> getLimitRows( ) ) );
419 }
420 return sql;
421 }
422
423
424 /**
425 *
426 * ???若?帥???若?鴻????????
427 *
428 * @param dsn DSN
429 * @param user ???若?帥???若?鴻???≪???祉?鴻???????若?九??
430 * @param password 筝?荐????若?吟?????鴻???若??
431 * @param dbname ??????/span>
432 * @param prefix XOOPS???若?帥???若?鴻???若??????REFIX
433 * @return RES_OK
434 * @return RES_DB_INITIALIZE_ERROR
435 * @return RES_DB_CONNECT_ERROR
436 * @refer result_t
437 */
438 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix )
439 {
440 SQLRETURN sqlcode;
441
442 #ifdef USE_SYSLOG
443 openlog( "commonal", LOG_ODELAY, LOG_USER );
444 #endif
445 // ?≪??・膓?筝???????筝???????/span>
446 if ( hdbc != NULL )
447 SQLDisconnect( hdbc );
448
449 dbprefix = prefix;
450
451 // ????????・膓?
452 // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
453 if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) != SQL_SUCCESS ) {
454 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
455 #ifdef USE_SYSLOG
456 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
457 closelog( );
458 #endif
459 return RES_DB_INITIALIZE_ERROR;
460 }
461 //ODBC Ver.3 ????????????????????с??荐??
462 SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
463
464 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
465 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
466 #ifdef USE_SYSLOG
467 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
468 closelog( );
469 #endif
470 return RES_DB_INITIALIZE_ERROR;
471 }
472 //???違?ゃ?潟??腱?篁ヤ?荀????????帥?ゃ???≪????????荐??
473 SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
474
475 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
476 string s( "SQLConnect in initializeDB " );
477 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
478 setLastErrorString( s.c_str( ) );
479 #ifdef USE_SYSLOG
480 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
481 closelog( );
482 #endif
483 return RES_DB_CONNECT_ERROR;
484 }
485 #ifdef USE_SYSLOG
486 syslog( LOG_DEBUG, "initializeDB succeed" );
487 closelog( );
488 #endif
489 return RES_OK;
490 }
491
492 /**
493 *
494 * DB?ョ????????違???????????障??????
495 *
496 * @param ????
497 * @return RES_OK
498 */
499 result_t uninitializeDB()
500 {
501 if ( hdbc != NULL ){
502 SQLDisconnect( hdbc );
503 hdbc = NULL;
504 }
505 return RES_OK;
506 }
507
508 /**
509 *
510 * Platform???若?倶?粋??倶????緇?
511 *
512 * @param sid ?祉???激?с??D
513 * @param uid ?倶??????緇??????????若?吟??ID
514 * @return true ?粋?羝???/span>
515 * @return false ???粋?
516 *
517 */
518 bool isActivated( sessionid_t sid, userid_t uid )
519 {
520 if( hdbc == NULL ) return false;
521 if( !isValidSessionID( sid ) ) return false;
522
523 bool ret = false;
524 string sql;
525 SQLRETURN sqlcode;
526 SQLHANDLE hstmt = NULL;
527
528 sql = "SELECT * FROM " + dbprefix + "_vpaccount_users ";
529 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
530 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
531 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
532 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
533 ret = true;
534 }else{
535 string s( "SQLFetch in isActivated " );
536 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
537 s += ", sql=" + sql;
538 setLastErrorString( s.c_str() );
539 ret = false;
540 }
541 }else{
542 string s( "SQLExecDirect in isActivated " );
543 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
544 s += ", sql=" + sql;
545 setLastErrorString( s.c_str() );
546 ret = false;
547 }
548 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
549 }else{
550 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
551 ret = false;
552 }
553 return ret;
554 }
555
556 /**
557 *
558 * Platform???若?倶?粋??倶??紊???/span>
559 *
560 * @param sid ?祉???激?с??D
561 * @param uid 紊??眼?????????若?吟??ID
562 * @param activate ?粋?(true) / ???粋?(false)????絎?
563 * @return RES_OK
564 * @return RES_DB_QUERY_ERROR
565 * @return RES_NO_SUCH_USER
566 */
567 result_t activate( sessionid_t sid, userid_t uid, bool activate )
568 {
569 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
570 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
571
572 string sql;
573 SQLRETURN sqlcode;
574 result_t ret = RES_ERROR;
575
576 sql = "UPDATE " + dbprefix + "_vpaccount_users ";
577 sql += "SET activate=" + string( activate ? "1" : "0" );
578 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
579 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
580 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
581 SQLINTEGER count = 0;
582 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
583 ret = RES_OK;
584 }else{
585 string s( "SQLRowCount in activate ");
586 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
587 s += string( ", sql=" ) + string( sql );
588 setLastErrorString( s.c_str( ) );
589 ret = RES_NO_SUCH_USER;
590 }
591 }else{
592 string s( "SQLExecDirect in activate " );
593 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
594 s += ", sql=";
595 s += string( sql );
596 setLastErrorString( s.c_str( ) );
597 ret = RES_DB_QUERY_ERROR;
598 }
599 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
600 }else{
601 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
602 ret = RES_ERROR;
603 }
604 return ret;
605 }
606
607 /**
608 *
609 * ?≪?????潟???違????緇?????鐚?/span>
610 *
611 * @param sid ?祉???激?с??D
612 * @return ?≪?????潟????/span>
613 *
614 */
615 int getAccountCount( sessionid_t sid )
616 {
617 if( hdbc == NULL ) return 0;
618 if( !isValidSessionID( sid ) ) return 0;
619
620 int ret = 0;
621 string sql;
622 SQLRETURN sqlcode;
623 SQLHANDLE hstmt = NULL;
624
625 //?≪?????潟???違??羆?????
626 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users ";
627 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
628 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
629 SQLUINTEGER count = 0;
630 SQLINTEGER len;
631 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
632 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
633 ret = count;
634 }else {
635 string s( "SQLFetch in getAccountCount sql=" );
636 s += string( sql );
637 setLastErrorString( s.c_str( ) );
638 ret = 0;
639 }
640 }else{
641 setLastErrorString( "SQLExecDirect in getAccountCount" );
642 ret = 0;
643 }
644 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
645 }else{
646 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
647 ret = 0;
648 }
649 return ret;
650 }
651
652 /**
653 *
654 * ?≪?????潟??????/span>
655 * ?違???若???????????ゃ?????若?倶???宴?????ゃ??茵??????障??鐚?/span>
656 *
657 * @param
658 * @return RES_OK
659 * @return RES_ERROR
660 * @return RES_DB_NOT_INITIALIZED
661 * @return RES_NO_SUCH_SESSION
662 * @return RES_DB_QUERY_ERROR
663 *
664 */
665 result_t deleteAccount( sessionid_t sid, userid_t uid )
666 {
667 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
668 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
669
670 result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
671 criteria_t c;
672 string sql;
673 groupid_t* gids;
674 int gidsLen;
675 SQLRETURN sqlcode;
676 SQLHANDLE hstmt = NULL;
677
678 /*
679 1. delete user from default platform group
680 2. delete user profile from xoops_users
681 3. delete platform user from vpaccount_users
682 */
683
684 //1. delete user from platform groups
685 c.clearAll();
686 if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
687 for( int i = 0; i < gidsLen; i++ )
688 deleteMemberNoLimit( sid, gids[ i ], uid );
689 freeGID( gids );
690 }
691
692 //2. delete user profile from xoops_users
693 sql = "DELETE FROM " + dbprefix + "_users ";
694 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
695 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
696 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
697 SQLINTEGER count = 0;
698 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
699 ret1 = RES_OK;
700 }else{
701 string s( "SQLRowCount in deleteAccount" );
702 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
703 s += string( ", sql=" ) + string( sql );
704 setLastErrorString( s.c_str( ) );
705 ret1 = RES_NO_SUCH_USER;
706 }
707 }else{
708 string s( "SQLExecDirect in deleteAccount" );
709 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
710 s += ", sql=";
711 s += string( sql );
712 setLastErrorString( s.c_str( ) );
713 ret1 = RES_DB_QUERY_ERROR;
714 }
715 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
716 }else{
717 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
718 ret1 = RES_ERROR;
719 }
720
721 //3. delete platform user from vpaccount_users
722 sql = "DELETE FROM " + dbprefix + "_vpaccount_users ";
723 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
724 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
725 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
726 SQLINTEGER count = 0;
727 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
728 ret2 = RES_OK;
729 }else{
730 string s( "SQLRowCount in deleteAccount" );
731 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
732 s += string( ", sql=" ) + string( sql );
733 setLastErrorString( s.c_str( ) );
734 ret2 = RES_NO_SUCH_USER;
735 }
736 }else{
737 string s( "SQLExecDirect in deleteAccount" );
738 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
739 s += ", sql=";
740 s += string( sql );
741 setLastErrorString( s.c_str( ) );
742 ret2 = RES_DB_QUERY_ERROR;
743 }
744 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
745 }else{
746 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
747 ret2 = RES_ERROR;
748 }
749
750 //筝??鴻?с???????若?????????若??菴???
751 return ret1 != RES_OK ? ret1 : ret2;
752 }
753
754 /**
755 *
756 * ?≪?????潟?????怨??
757 *
758 * @param sid ?祉???激?с??D
759 * @param uid ??緇??????????若?吟??ID
760 * @param acc ??緇??????≪?????潟??????account_t)?????ゃ?潟?帥???吾??莨若??綣???/span>
761 * @return RES_OK
762 * @return RES_DB_NOT_INITIALIZED
763 * @return RES_NO_SUCH_USER
764 * @return RES_NO_SUCH_SESSION
765 * @return RES_DB_QUERY_ERROR
766 *
767 */
768 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
769 {
770 int len;
771 static criteria c;
772 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
773 if( len == 0 ) return RES_NO_SUCH_USER;
774 return res;
775 }
776
777 /**
778 *
779 * ?≪?????潟?????怨??
780 *
781 * @param sid ?祉???激?с??D
782 * @param uids ??緇??????????若?吟??ID??????
783 * @param uidsLen uids???????膣???/span>
784 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
785 * @param accounts 罎?膣∝??????????????ゃ?潟?帥???吾??莨若??綣???/span>
786 * @param accountsLen 罎?膣∝???????????*accounts???膣???
787 * @return RES_OK
788 * @return RES_DB_NOT_INITIALIZED
789 * @return RES_NO_SUCH_SESSION
790 * @return RES_DB_QUERY_ERROR
791 *
792 */
793 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
794 {
795 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
796 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
797 if( uidsLen <= 0 ){
798 *accounts = new account_t[ 0 ];
799 *accountsLen = 0;
800 #ifdef USE_SYSLOG
801 openlog( "commonal", LOG_ODELAY, LOG_USER );
802 syslog( LOG_DEBUG, "getAccounts succeed len=0" );
803 closelog( );
804 #endif
805 return RES_OK;
806 }
807
808 #ifdef USE_SYSLOG
809 openlog( "commonal", LOG_ODELAY, LOG_USER );
810 syslog( LOG_DEBUG, "begin of getAccounts" );
811 #endif
812 result_t ret = RES_ERROR;
813 SQLRETURN sqlcode;
814 SQLHANDLE hstmt = NULL;
815 string sql;
816 account_t* dst = new account_t[ uidsLen ];
817
818 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 ";
819 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 ";
820 sql += "WHERE u1.uid = u2.uid ";
821 if( uidsLen > 0 ){
822 #ifdef USE_SYSLOG
823 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", 0, uids[0] );
824 #endif
825 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
826 for( int i = 1; i < uidsLen; i++ ){
827 #ifdef USE_SYSLOG
828 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", i, uids[i] );
829 #endif
830 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
831 }
832 sql += " ) ";
833 }
834 sql += criteria2str( cri );
835 #ifdef USE_SYSLOG
836 syslog( LOG_DEBUG, "sql=%s", sql.c_str() );
837 #endif
838
839 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
840 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
841 SQLINTEGER len;
842 userid_t uid = 0;
843 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
844 *accountsLen=0;
845 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
846 dst[ i ].setUID( uid );
847 dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
848 dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
849 dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
850 dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
851 dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
852 dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
853 dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
854 dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
855 dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
856 dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
857 dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
858 dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
859 dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
860 dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
861 dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
862 dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
863 dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
864 dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
865 dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
866 dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
867 dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
868 dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
869 dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
870 dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
871 dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
872 dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
873 dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
874 dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
875 dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
876 dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
877 dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
878 dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
879 dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
880 dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
881 dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
882 dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
883 dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
884 dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
885 dst[ i ].setBaseURL( getResultCol( hstmt, 40 ).c_str() );
886 dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 41 ).c_str() ));
887 dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 42 ).c_str() ));
888 #ifdef USE_SYSLOG
889 syslog( LOG_DEBUG, "set to account_t %d", i );
890 #endif
891 ( *accountsLen )++;
892 }
893 *accounts = dst;
894 #ifdef USE_SYSLOG
895 syslog( LOG_DEBUG, "getAccounts succeed" );
896 #endif
897 ret = RES_OK;
898 }else{
899 string s( "SQLExecDirect in getAccounts" );
900 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
901 s += string( ", sql=" ) + string( sql );
902 setLastErrorString( s.c_str( ) );
903 #ifdef USE_SYSLOG
904 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
905 #endif
906 ret = RES_DB_QUERY_ERROR;
907 }
908 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
909 }else{
910 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
911 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
912 setLastErrorString( s.c_str( ) );
913 #ifdef USE_SYSLOG
914 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
915 #endif
916 ret = RES_DB_QUERY_ERROR;
917 }
918 #ifdef USE_SYSLOG
919 closelog( );
920 #endif
921 return ret;
922 }
923
924 /**
925 *
926 * ?≪?????潟???脂??
927 *
928 * ???若?倶???宴?????若?帥???若?鴻???脂?蚊???障??鐚?/span>
929 * ?脂?蚊???????若?倶???宴???綽????????若??D??uid???主????障??鐚?/span>
930 *
931 * @param sid ?祉???激?с??/span>
932 * @param account ?脂?蚊?????≪?????潟??????/span>
933 * @param uid ?脂?蚊?????≪?????潟?????宴???綽????????若??D
934 * @return RES_OK
935 * @return RES_NO_SUCH_SESSION
936 * @return RES_DB_QUERY_ERROR
937 * @return RES_DB_NOT_INITIALIZED
938 *
939 */
940 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
941 {
942 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
943 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
944
945 string sql;
946 string tmp;
947 char buf[ 12 ];
948 SQLRETURN sqlcode;
949 result_t ret = RES_ERROR;
950
951 /*
952 1. insert user profile into xoops_users
953 2. insert platform user profile into vpaccount_users
954 3. add user to default platform group
955 */
956
957 //1.xoops?????若?吟???若???????吾??莨若??
958 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];
959 SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
960 SQLDOUBLE timezone_offset;
961
962 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;
963 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;
964
965 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
966 string sql;
967 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
968 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
969 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
970 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
971 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
972 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
973 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
974 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
975 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
976 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
977 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
978 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
979 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
980 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
981 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
982 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
983 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
984 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
985 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
986 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
987 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
988 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
989 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
990 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
991 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
992 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
993 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
994 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
995 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
996 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
997 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
998 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
999 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1000
1001 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1002 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1003 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1004 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1005 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1006 user_regdate = time( NULL );
1007 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1008 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1009 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1010 user_viewemail = account -> getUserViewemail( );
1011 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1012 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1013 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1014 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1015 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1016 posts = account -> getPosts( );
1017 attachsig = account -> getAttachsig( );
1018 rank = account -> getRank( );
1019 level = account -> getLevel( );
1020 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1021 timezone_offset = account -> getTimezoneOffset( );
1022 last_login = 0;
1023 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1024 uorder = account -> getUorder( );
1025 notify_method = account -> getNotifyMethod( );
1026 notify_mode = account -> getNotifyMode( );
1027 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1028 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1029 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1030 user_mailok = account -> getUserMailok( );
1031
1032 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1033 SQLINTEGER count = 0;
1034 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1035 //???若??D????緇?????
1036 SQLHANDLE hstmt2 = NULL;
1037 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1038 sql = "SELECT LAST_INSERT_ID()"; // MySQL
1039 // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
1040 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1041 SQLUINTEGER last_insert_id;
1042 SQLINTEGER len;
1043 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
1044 if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
1045 *uid = last_insert_id;
1046 ret = RES_OK;
1047 }else{
1048 ret = RES_DB_QUERY_ERROR;
1049 string s( "SQLFetch in insertAccount " );
1050 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1051 setLastErrorString( s.c_str( ) );
1052 }
1053 }else{
1054 string s( "SQLExecDirect in insertAccount " );
1055 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1056 setLastErrorString( s.c_str( ) );
1057 ret = RES_DB_QUERY_ERROR;
1058 }
1059 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1060 }
1061 }else{
1062 string s( "SQLRowCount in insertAccount sql=" );
1063 s += string( sql );
1064 setLastErrorString( s.c_str( ) );
1065 ret = RES_DB_QUERY_ERROR;
1066 }
1067 }else{
1068 string s( "SQLExecute in insertAccount " );
1069 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1070 setLastErrorString( s.c_str( ) );
1071 ret = RES_DB_QUERY_ERROR;
1072 }
1073 }else{
1074 string s( "SQLPrepare in insertAccount " );
1075 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1076 setLastErrorString( s.c_str( ) );
1077 ret = RES_ERROR;
1078 }
1079 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1080 }else{
1081 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1082 ret = RES_ERROR;
1083 }
1084
1085 if( ret == RES_OK ){
1086 //2.vpaccount?????若?吟???若??????????????宴???吾??莨若??
1087 SQLUINTEGER activate;
1088 SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
1089 SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1090 SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1091 SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1092 SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1093 SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1094 SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1095 SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1096 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;
1097 SQLINTEGER cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0;
1098 SQLUINTEGER notice_mail;
1099 SQLUINTEGER notice_mail_since;
1100 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1101 string sql;
1102 sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1103 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1104 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1105 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1106 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1107 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1108 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1109 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1110 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1111 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1112 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1113 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1114 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1115 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1116 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1117
1118 activate = account -> getActivate() ? 1 : 0;
1119 strncpy2( (char*)address, account -> getAddress(), VP_ACCOUNT_ADDRESS_LEN );
1120 strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1121 strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1122 strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1123 strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1124 strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1125 strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1126 strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1127 notice_mail = account -> getNoticeMail( );
1128 notice_mail_since = account -> getNoticeMailSince( );
1129
1130 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1131 SQLINTEGER count = 0;
1132 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1133 ret = RES_OK;
1134 if( ret == RES_OK ){
1135 //3.add new user to default group(not a group admin)
1136 ret = insertMember( sid, DEFAULT_PLATFORM_GROUP_ID, *uid, false );
1137 }else{
1138 //xoops_users??nsert???????潟?若???????ゃ????
1139 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1140 sql += unsignedIntToString( *uid );
1141 SQLHANDLE hstmt2 = NULL;
1142 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1143 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1144 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1145 }
1146 setLastErrorString( "insertMember in insertAccount" );
1147 ret = RES_DB_QUERY_ERROR;
1148 }
1149 }else{
1150 string s( "SQLRowCount in insertAccount sql=" );
1151 s += string( sql );
1152 setLastErrorString( s.c_str( ) );
1153 ret = RES_DB_QUERY_ERROR;
1154 }
1155 }else{
1156 string s( "SQLExecute in insertAccount " );
1157 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1158 setLastErrorString( s.c_str( ) );
1159 ret = RES_DB_QUERY_ERROR;
1160 }
1161 }else{
1162 //xoops_users??nsert???????潟?若???????ゃ????
1163 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1164 sql += unsignedIntToString( *uid );
1165 SQLHANDLE hstmt2 = NULL;
1166 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1167 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1168 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1169 }
1170 string s( "SQLExecDirect in insertAccount sql=" );
1171 s += string( sql );
1172 setLastErrorString( s.c_str( ) );
1173 ret = RES_DB_QUERY_ERROR;
1174 }
1175 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1176 }else{
1177 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1178 ret = RES_ERROR;
1179 }
1180 }
1181 return ret;
1182 }
1183
1184 /**
1185 *
1186 * ?≪?????潟?????宴??紊??眼????.
1187 *
1188 *
1189 * @param sid ?祉???激?с??D
1190 * @param account 紊??眼???????≪?????潟??????/span>
1191 * @return RES_OK
1192 * @return RES_DB_NOT_INITIALIZED
1193 * @return RES_NO_SUCH_SESSION
1194 * @return RES_DB_QUERY_ERROR
1195 * @return RES_NO_SUCH_USER
1196 * @return RES_ERROR
1197 *
1198 */
1199 result_t updateAccount( sessionid_t sid, const account_t* account )
1200 {
1201 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1202 if( account == NULL ) return RES_ERROR;
1203 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1204 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1205 SQLRETURN sqlcode;
1206 result_t ret = RES_ERROR;
1207
1208 //xoops?????若?吟???若???????吾??莨若??
1209 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];
1210 SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1211 SQLDOUBLE timezone_offset;
1212
1213 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;
1214 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;
1215
1216 SQLUINTEGER activate;
1217 SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1];
1218 SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1];
1219 SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1];
1220 SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1];
1221 SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1];
1222 SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1];
1223 SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1];
1224 SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1];
1225 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;
1226 SQLUINTEGER notice_mail;
1227 SQLUINTEGER notice_mail_since;
1228 SQLINTEGER len = 0;
1229
1230 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1231 string sql;
1232
1233 sql = "UPDATE " + dbprefix + "_users SET ";
1234 sql += "uname=?, ";
1235 sql += "name=?, ";
1236 sql += "email=?, ";
1237 sql += "url=?, ";
1238 sql += "user_avatar=?, ";
1239 sql += "user_regdate=?, ";
1240 sql += "user_icq=?, ";
1241 sql += "user_from=?, ";
1242 sql += "user_sig=?, ";
1243 sql += "user_viewemail=?, ";
1244 sql += "actkey=?, ";
1245 sql += "user_aim=?, ";
1246 sql += "user_yim=?, ";
1247 sql += "user_msnm=?, ";
1248 sql += "pass=?, ";
1249 sql += "posts=?, ";
1250 sql += "attachsig=?, ";
1251 sql += "rank=?, ";
1252 sql += "level=?, ";
1253 sql += "theme=?, ";
1254 sql += "timezone_offset=?, ";
1255 sql += "last_login=?, ";
1256 sql += "umode=?, ";
1257 sql += "uorder=?, ";
1258 sql += "notify_method=?, ";
1259 sql += "notify_mode=?, ";
1260 sql += "user_occ=?, ";
1261 sql += "bio=?, ";
1262 sql += "user_intrest=?, ";
1263 sql += "user_mailok=? ";
1264 sql += " WHERE uid = ?";
1265
1266 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1267 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1268 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1269 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1270 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1271 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1272 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1273 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1274 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1275 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1276 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1277 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1278 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1279 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1280 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1281 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1282 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1283 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1284 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1285 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1286 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1287 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1288 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1289 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1290 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1291 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1292 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1293 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1294 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1295 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1296 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1297 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1298 SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1299
1300 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1301 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1302 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1303 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1304 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1305 user_regdate = time( NULL );
1306 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1307 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1308 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1309 user_viewemail = account -> getUserViewemail( );
1310 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1311 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1312 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1313 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1314 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1315 posts = account -> getPosts( );
1316 attachsig = account -> getAttachsig( );
1317 rank = account -> getRank( );
1318 level = account -> getLevel( );
1319 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1320 timezone_offset = account -> getTimezoneOffset( );
1321 last_login = 0;
1322 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1323 uorder = account -> getUorder( );
1324 notify_method = account -> getNotifyMethod( );
1325 notify_mode = account -> getNotifyMode( );
1326 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1327 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1328 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1329 user_mailok = account -> getUserMailok( );
1330 uid = account -> getUID( );
1331
1332 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1333 SQLINTEGER count = 0;
1334 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1335 ret = RES_OK;
1336 }else{
1337 string s( "SQLRowCount in updateAccount sql=" );
1338 s += string( sql );
1339 setLastErrorString( s.c_str( ) );
1340 ret = RES_DB_QUERY_ERROR;
1341 }
1342 }else{
1343 string s( "SQLExecute in updateAccount " );
1344 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1345 setLastErrorString( s.c_str( ) );
1346 ret = RES_DB_QUERY_ERROR;
1347 }
1348 }else{
1349 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1350 ret = RES_ERROR;
1351 }
1352 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1353 }else{
1354 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1355 ret = RES_ERROR;
1356 }
1357
1358 //vpaccount?????若?吟???若??????????????宴??筝??吾??????
1359 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1360 string sql;
1361
1362 sql = "UPDATE " + dbprefix + "_vpaccount_users SET ";
1363 sql += "activate=?, ";
1364 sql += "address=?, ";
1365 sql += "division=?, ";
1366 sql += "tel=?, ";
1367 sql += "company_name=?, ";
1368 sql += "country=?, ";
1369 sql += "zipcode=?, ";
1370 sql += "fax=?, ";
1371 sql += "base_url=?, ";
1372 sql += "notice_mail=?, ";
1373 sql += "notice_mail_since=? ";
1374 sql += "WHERE uid=?";
1375
1376 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1377 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1378 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len);
1379 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1380 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1381 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1382 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1383 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1384 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1385 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1386 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url);
1387 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &len);
1388 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &len);
1389 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1390
1391 activate = account -> getActivate() ? 1 : 0;
1392 strncpy2( (char*)address, account -> getAddress( ) , VP_ACCOUNT_ADDRESS_LEN );
1393 strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN );
1394 strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN );
1395 strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN );
1396 strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN );
1397 strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN );
1398 strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN );
1399 strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN );
1400 notice_mail = account -> getNoticeMail( );
1401 notice_mail_since = account -> getNoticeMailSince( );
1402 uid = account -> getUID( );
1403
1404 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1405 SQLINTEGER count = 0;
1406 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1407 ret = RES_OK;
1408 }else{
1409 string s( "SQLRowCount in updateAccount sql=" );
1410 s += string( sql );
1411 setLastErrorString( s.c_str( ) );
1412 ret = RES_DB_QUERY_ERROR;
1413 }
1414 }else{
1415 string s( "SQLExecute in updateAccount " );
1416 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1417 setLastErrorString( s.c_str( ) );
1418 ret = RES_DB_QUERY_ERROR;
1419 }
1420 }else{
1421 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1422 ret = RES_ERROR;
1423 }
1424 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1425 }else{
1426 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1427 ret = RES_ERROR;
1428 }
1429 return ret;
1430 }
1431
1432 /**
1433 *
1434 * criteria_t?ф??絎???????膀??蚊?????若??D??菴???.
1435 * ???若??D????????腆坂????????????吾??莨若?随????????≪?????鴻??*uids???吾??莨若??.
1436 * ???????泣?ゃ?冴??*uidsLen???吾??莨若??
1437 *
1438 * @param sid ?祉???激?с??D
1439 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1440 * @param uids ???若?吟??ID?????????阪????
1441 * @param uidsLen uids???????膣??違???阪????
1442 * @return RES_OK
1443 * @return RES_DB_NOT_INITIALIZED
1444 * @return RES_NO_SUCH_SESSION
1445 * @return RES_DB_QUERY_ERROR
1446 *
1447 */
1448 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1449 {
1450 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1451 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1452
1453 #ifdef USE_SYSLOG
1454 openlog( "commonal", LOG_ODELAY, LOG_USER );
1455 #endif
1456
1457 result_t ret = RES_ERROR;
1458 userid_t* dst = 0;
1459 string sql;
1460 SQLRETURN sqlcode;
1461 SQLINTEGER count = 0;
1462
1463
1464 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users ";
1465 sql += criteria2str( cri );
1466 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1467 *uidsLen = count;
1468 dst = new userid_t[ *uidsLen ];
1469 *uids = dst;
1470 }else{
1471 return RES_ERROR;
1472 }
1473 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1474 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1475 userid_t uid;
1476 SQLINTEGER len = 0;
1477 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1478
1479 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1480 dst[ i ] = uid;
1481 }
1482
1483 #ifdef USE_SYSLOG
1484 syslog( LOG_DEBUG, "dumpUids succeed" );
1485 #endif
1486 ret = RES_OK;
1487 }else{
1488 string s( "SQLExecDirect in dumpUids " );
1489 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1490 s += "sql=";
1491 s += string( sql );
1492 setLastErrorString( s.c_str( ) );
1493 #ifdef USE_SYSLOG
1494 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1495 #endif
1496 ret = RES_DB_QUERY_ERROR;
1497 }
1498 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1499 }else{
1500 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" );
1501 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1502 setLastErrorString( s.c_str( ) );
1503 #ifdef USE_SYSLOG
1504 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1505 #endif
1506 ret = RES_DB_QUERY_ERROR;
1507 }
1508 return ret;
1509 }
1510
1511 /**
1512 *
1513 * ?違???若???違??菴???.
1514 * 筝?罩c???祉???激?с??D????0??菴???.
1515 *
1516 * @param sid ?祉???激?с??D
1517 * @return ?違???若????/span>
1518 *
1519 */
1520 int getGroupCount( sessionid_t sid )
1521 {
1522 if( hdbc == NULL ) return 0;
1523 if( !isValidSessionID( sid ) ) return 0;
1524
1525 SQLRETURN sqlcode;
1526 SQLHANDLE hstmt = NULL;
1527 string sql;
1528 int ret = 0;
1529
1530 //?違???若???違??羆?????
1531 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups";
1532 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1533 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1534 SQLUINTEGER count = 0;
1535 SQLINTEGER len;
1536 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1537 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1538 ret = count;
1539 }else {
1540 string s( "SQLFetch in getGroupCount sql=" );
1541 s += string( sql );
1542 setLastErrorString( s.c_str( ) );
1543 ret = 0;
1544 }
1545 }else{
1546 setLastErrorString( "SQLExecDirect in getGroupCount" );
1547 ret = 0;
1548 }
1549 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1550 }else{
1551 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
1552 ret = 0;
1553 }
1554 return ret;
1555 }
1556
1557 /**
1558 *
1559 * ??絮??違???若??筝?荀у??.
1560 * ???若?吟????絮??????????違???若????D????緇?????
1561 *
1562 * @param sid ?祉???激?с??D
1563 * @param uid ???若?吟??ID
1564 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1565 * @param gids ?違???若??ID?????????阪????
1566 * @param gidsLen gids???????膣??違???阪????
1567 * @return RES_DB_NOT_INITIALIZED
1568 * @return RES_NO_SUCH_SESSION
1569 * @return RES_NO_SUCH_USER
1570 * @return RES_DB_QUERY_ERROR
1571 * @return RES_OK
1572 *
1573 */
1574 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1575 {
1576 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1577 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1578 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1579
1580 result_t ret = RES_ERROR;
1581 string sql;
1582 SQLRETURN sqlcode;
1583 SQLHANDLE hstmt = NULL;
1584 SQLINTEGER count = 0;
1585 groupid_t* dst = 0;
1586 int len = 0;
1587
1588 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups_users_link";
1589 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1590 sql += criteria2str( cri );
1591 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1592 *gidsLen = count;
1593 dst = new groupid_t[ *gidsLen ];
1594 *gids = dst;
1595 }else{
1596 return RES_ERROR;
1597 }
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 if( count > 0 ){
1603 SQLHANDLE hstmt2 = NULL;
1604 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1605 sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link";
1606 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1607 sql += criteria2str( cri );
1608 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1609 SQLINTEGER len;
1610 groupid_t gid = 0;
1611 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1612 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1613 dst[ i ] = gid;
1614 }
1615 ret = RES_OK;
1616 }else{
1617 string s( "SQLExecDirect in getGroupsByUid " );
1618 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1619 s += string( ", sql=" ) + string( sql );
1620 ret = RES_DB_QUERY_ERROR;
1621 }
1622 }else{
1623 string s( "SQLAllocHandle in getGroupsByUid " );
1624 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1625 ret = RES_DB_QUERY_ERROR;
1626 }
1627 }else{
1628 ret = RES_OK;
1629 }
1630 }else{
1631 string s( "SQLExecDirect in getGroupsByUid " );
1632 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1633 s += string( ", sql=" ) + string( sql );
1634 ret = RES_DB_QUERY_ERROR;
1635 }
1636 }else{
1637 string s( "SQLAllocHandle in getGroupsByUid " );
1638 setLastErrorString( s.c_str( ) );
1639 ret = RES_DB_QUERY_ERROR;
1640 }
1641 return ret;
1642 }
1643
1644 /**
1645 *
1646 * ?違???若??膊∞??罔????????.
1647 * ???若?吟?????若???????罔???????????(?違???若??膊∞?????с??????)????????????.
1648 * ???若?吟???違???若????絖????????????????医幻???翫??鐚?false??菴???.
1649 *
1650 * @param sid ?祉???激?с??D
1651 * @param gid ?違???若????ID
1652 * @param uid ???若?吟??ID
1653 * @return true 膊∞??罔???????
1654 * @return false 膊∞??罔???????鐚??障???????/span>
1655 *
1656 */
1657 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
1658 {
1659 if( hdbc == NULL ) return false;
1660 if( !isValidSessionID( sid ) ) return false;
1661 if( !uidExists( uid ) ) return false;
1662 if( !gidExists( gid ) ) return false;
1663
1664 bool ret = false;
1665 string sql;
1666 SQLRETURN sqlcode;
1667 SQLINTEGER count = 0;
1668
1669 sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link ";
1670 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1671 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1672 sql += " AND is_admin=1";
1673 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1674 if( count > 0 ){
1675 ret = true;
1676 }else{
1677 ret = false;
1678 }
1679 }else{
1680 ret = false;
1681 }
1682 return ret;
1683 }
1684
1685 /**
1686 *
1687 * ?違???若??ID筝?荀?
1688 * ?脂?蚊???????????違???若????D筝?荀с????緇?????.
1689 *
1690 * @param sid ?祉???激?с??D
1691 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1692 * @param gids ?違???若??ID?????????阪????
1693 * @param gidsLen gids???????膣??違???阪????
1694 * @return RES_DB_NOT_INITIALIZED
1695 * @return RES_NO_SUCH_SESSION
1696 * @return RES_DB_QUERY_ERROR
1697 * @return RES_OK
1698 *
1699 */
1700 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
1701 {
1702 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1703 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1704
1705 result_t ret = RES_ERROR;
1706 groupid_t* dst = 0;
1707 string sql;
1708 SQLRETURN sqlcode;
1709 SQLINTEGER count = 0;
1710
1711 sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups ";
1712 sql += criteria2str( cri );
1713 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1714 *gidsLen = count;
1715 dst = new groupid_t[ *gidsLen ];
1716 *gids = dst;
1717 }else{
1718 return RES_ERROR;
1719 }
1720
1721 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1722 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1723 groupid_t gid;
1724 SQLINTEGER len = 0;
1725 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
1726 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
1727 dst[ i ] = gid;
1728 }
1729
1730 ret = RES_OK;
1731 }else{
1732 string s( "SQLExecDirect in dumpGids " );
1733 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1734 s += "sql=";
1735 s += string( sql );
1736 setLastErrorString( s.c_str( ) );
1737 ret = RES_DB_QUERY_ERROR;
1738 }
1739 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1740 }
1741 return ret;
1742 }
1743
1744 /**
1745 *
1746 * ?違???若??膊∞????ID????緇?????.
1747 * ?????違???若??????????????若??D????緇?????.
1748 *
1749 * @param sid ?祉???激?с??D
1750 * @param gid ???????????違???若????ID?ф??絎?????
1751 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1752 * @param uids 膊∞??????ID???????????????????ゃ?潟??/span>
1753 * @param uidsLen uids???????膣???/span>
1754 * @return RES_OK
1755 * @return RES_DB_NOT_INITIALIZED
1756 * @return RES_NO_SUCH_SESSION
1757 * @return RES_DB_QUERY_ERROR
1758 * @return RES_ERROR
1759 *
1760 */
1761 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1762 {
1763 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1764 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1765
1766 result_t ret = RES_ERROR;
1767 groupid_t* dst = 0;
1768 string sql;
1769 SQLRETURN sqlcode;
1770 SQLINTEGER count = 0;
1771
1772 sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link ";
1773 sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid );
1774 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1775 *uidsLen = count;
1776 *uids = new groupid_t[ *uidsLen ];
1777 }else{
1778 return RES_ERROR;
1779 }
1780 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1781 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1782 userid_t uid;
1783 SQLINTEGER len = 0;
1784 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1785 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1786 (*uids)[ i ] = uid;
1787 }
1788 ret = RES_OK;
1789 }else{
1790 string s( "SQLExecDirect in dumpGroupAdmins " );
1791 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1792 s += "sql=";
1793 s += string( sql );
1794 setLastErrorString( s.c_str( ) );
1795 ret = RES_DB_QUERY_ERROR;
1796 }
1797 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1798 }
1799 return ret;
1800 }
1801
1802 /**
1803 *
1804 * ?違???若????絮????若?九????
1805 * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1806 * ???????????違???若???????????ゃ?с??????
1807 *
1808 * @param sid ?祉???激?с??D
1809 * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1810 * @param uid ???ゅ?莟<?????若?吟??D
1811 * @return RES_DB_NOT_INITIALIZED
1812 * @return RES_NO_SUCH_SESSION
1813 * @return RES_NO_SUCH_USER
1814 * @return RES_NO_SUCH_GROUP
1815 * @return RES_DB_QUERY_ERROR
1816 * @return RES_OK
1817 * @return RES_ERROR
1818 *
1819 */
1820 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
1821 {
1822 if( gid == DEFAULT_PLATFORM_GROUP_ID ) return RES_ERROR;
1823 return deleteMemberNoLimit( sid, gid, uid );
1824 }
1825
1826 /**
1827 *
1828 * ?違???若????絮????若?九????
1829 * ?違???若??????絮????????若?吟??鐚??違???若?????????ゃ????.
1830 * ???????????違???若???????????ゃ?с?????鴻??鐚?deleteMember???違????
1831 *
1832 * @param sid ?祉???激?с??D
1833 * @param gid ?????違???若?????????ゃ??????????絎??????違???若??ID
1834 * @param uid ???ゅ?莟<?????若?吟??D
1835 * @return RES_DB_NOT_INITIALIZED
1836 * @return RES_NO_SUCH_SESSION
1837 * @return RES_NO_SUCH_USER
1838 * @return RES_NO_SUCH_GROUP
1839 * @return RES_DB_QUERY_ERROR
1840 * @return RES_OK
1841 * @return RES_ERROR
1842 *
1843 */
1844 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid )
1845 {
1846 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1847 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1848 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1849 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1850
1851 result_t ret = RES_ERROR;
1852 string sql;
1853 SQLRETURN sqlcode;
1854 SQLHANDLE hstmt = NULL;
1855
1856 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link ";
1857 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1858 sql += " AND uid=" + string( unsignedIntToString( uid ) );
1859 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1860 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1861 SQLINTEGER count = 0;
1862 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1863 ret = RES_OK;
1864 }else{
1865 string s( "SQLRowCount in deleteMember" );
1866 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1867 s += string( ", sql=" ) + string( sql );
1868 setLastErrorString( s.c_str( ) );
1869 ret = RES_NO_SUCH_USER;
1870 }
1871 }else{
1872 string s( "SQLExecDirect in deleteMember" );
1873 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1874 s += ", sql=";
1875 s += string( sql );
1876 setLastErrorString( s.c_str( ) );
1877 ret = RES_DB_QUERY_ERROR;
1878 }
1879 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1880 }else{
1881 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" );
1882 ret = RES_ERROR;
1883 }
1884 return ret;
1885 }
1886
1887 /**
1888 *
1889 * ?違???若????絮????若?区申??.
1890 * ?違???若?????<?潟???若?????若?吟??菴遵??????.
1891 *
1892 * @param sid ?祉???激?с??D
1893 * @param gid ??絮????違???若????D
1894 * @param uid ??絮??????????若?吟??D
1895 * @param admin 膊∞????罔?????筝?????????true
1896 * @return RES_OK
1897 * @return RES_DB_NOT_INITIALIZED
1898 * @return RES_NO_SUCH_SESSION
1899 * @return RES_NO_SUCH_USER
1900 * @return RES_NO_SUCH_GROUP
1901 * @return RES_DB_QUERY_ERROR
1902 *
1903 */
1904 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
1905 {
1906 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1907 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1908 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid??????????с????/span>
1909 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1910
1911 result_t ret = RES_ERROR;
1912 string sql;
1913 SQLRETURN sqlcode;
1914
1915 //?<?潟???若??菴遵??
1916 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1917 sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
1918 sql += string( unsignedIntToString( gid ) ) + ", ";
1919 sql += string( unsignedIntToString( uid ) ) + ", ";
1920 sql += string( admin ? "1" : "0" ) + ") ";
1921 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1922 SQLINTEGER count = 0;
1923 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1924 ret = RES_OK;
1925 }else{
1926 string s( "SQLRowCount in insertMember " );
1927 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1928 s += string( ", sql=" ) + string( sql );
1929 setLastErrorString( s.c_str( ) );
1930 ret = RES_DB_QUERY_ERROR;
1931 }
1932 }else{
1933 string s( "SQLExecDirect in insertMember " );
1934 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1935 s += string( ", sql=" ) + string( sql );
1936 setLastErrorString( s.c_str( ) );
1937 ret = RES_DB_QUERY_ERROR;
1938 }
1939 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1940 }else{
1941 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" );
1942 ret = RES_DB_QUERY_ERROR;
1943 }
1944 return ret;
1945 }
1946
1947 /**
1948 *
1949 * ?違???若????絮????若?九??.
1950 * ?????違???若??????絮????????????若?吟?????若??D????緇?????
1951 *
1952 * @param sid ?祉???激?с??D
1953 * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
1954 * @param cri 腟???????我??絎?鐚??純?若???>散??絎?
1955 * @param uids ??絮????若?吟??ID???????????????????ゃ?潟??/span>
1956 * @param uidsLen uids???????膣???/span>
1957 * @return RES_OK
1958 * @return RES_DB_NOT_INITIALIZED
1959 * @return RES_NO_SUCH_SESSION
1960 * @return RES_NO_SUCH_GROUP
1961 * @return RES_DB_QUERY_ERROR
1962 * @return RES_ERROR
1963 *
1964 */
1965 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
1966 {
1967 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1968 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1969 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid??????????с????/span>
1970
1971 result_t ret = RES_ERROR;
1972 string sql;
1973 SQLRETURN sqlcode;
1974 SQLHANDLE hstmt = NULL;
1975 userid_t* dst = 0;
1976
1977 //how many members ?
1978 sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link ";
1979 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1980 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1981 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1982 SQLUINTEGER count = 0;
1983 SQLINTEGER len;
1984 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1985 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1986 dst = new userid_t[ count ];
1987 *uids = dst;
1988 *uidsLen = count;
1989 if( count > 0 ){
1990 //retrive member's IDs
1991 SQLHANDLE hstmt2 = NULL;
1992 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1993 sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link ";
1994 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
1995 sql += " " + string( criteria2str( cri ) );
1996 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1997 SQLUINTEGER uid = 0;
1998 SQLINTEGER len;
1999 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len );
2000 for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){
2001 dst[ i ] = uid;
2002 }
2003 ret = RES_OK;
2004 }else{
2005 setLastErrorString( "SQLExecDirect in getMembers" );
2006 ret = RES_DB_QUERY_ERROR;
2007 }
2008 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2009 }else{
2010 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2011 ret = RES_DB_QUERY_ERROR;
2012 }
2013 }else{
2014 ret = RES_OK;
2015 }
2016 }else{
2017 string s( "SQLFetch in getMembers sql=" );
2018 s += string( sql );
2019 setLastErrorString( s.c_str( ) );
2020 ret = RES_DB_QUERY_ERROR;
2021 }
2022 }else{
2023 setLastErrorString( "SQLExecDirect in getMembers" );
2024 ret = RES_DB_QUERY_ERROR;
2025 }
2026 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2027 }else{
2028 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2029 ret = RES_DB_QUERY_ERROR;
2030 }
2031 return ret;
2032 }
2033
2034 /**
2035 *
2036 * ?違???若????????
2037 * ???若?帥???若?鴻?????違???若???????ゃ???障??.
2038 *
2039 * @param sid ?祉???激?с??D
2040 * @param gid ?????違???若??????絮????若?吟?????????????????違???若????ID?ф??絎?
2041 * @return RES_OK
2042 * @return RES_DB_QUERY_ERROR
2043 * @return RES_NO_SUCH_SESSION
2044 * @return RES_DB_NOT_INITIALIZED
2045 *
2046 */
2047 result_t deleteGroup( sessionid_t sid, groupid_t gid )
2048 {
2049 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2050 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2051
2052 result_t ret = RES_ERROR;
2053 string sql;
2054 SQLRETURN sqlcode;
2055 SQLHANDLE hstmt = NULL;
2056
2057 sql = "DELETE FROM " + dbprefix + "_vpaccount_groups ";
2058 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
2059 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2060 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2061 SQLINTEGER count = 0;
2062 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2063 ret = RES_OK;
2064 }else{
2065 string s( "SQLRowCount in deleteGroup" );
2066 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2067 s += string( ", sql=" ) + string( sql );
2068 setLastErrorString( s.c_str( ) );
2069 ret = RES_NO_SUCH_USER;
2070 }
2071 }else{
2072 string s( "SQLExecDirect in deleteGroup" );
2073 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2074 s += ", sql=";
2075 s += string( sql );
2076 setLastErrorString( s.c_str( ) );
2077 ret = RES_DB_QUERY_ERROR;
2078 }
2079 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2080 }else{
2081 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" );
2082 ret = RES_ERROR;
2083 }
2084 return ret;
2085 }
2086
2087 /**
2088 *
2089 * ?違???若???脂??
2090 * ?違???若???????宴?????若?帥???若?鴻????蚊????鐚?/span>
2091 * ?脂?蚊?????違???若?????綽??????違???若??ID??gid???主?????鐚?/span>
2092 *
2093 * @param sid ?祉???激?с??D
2094 * @param group ?脂?蚊???????違???若????????/span>
2095 * @param gid ?脂?蚊?????違???若?????綽??????違???若??ID
2096 * @return RES_OK
2097 * @return RES_DB_NOT_INITIALIZED
2098 * @return RES_NO_SUCH_SESSION
2099 * @return RES_DB_QUERY_ERROR
2100 *
2101 */
2102 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
2103 {
2104 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2105 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2106
2107 result_t ret = RES_ERROR;
2108 string sql;
2109 SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1];
2110 SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2111 SQLRETURN sqlcode;
2112
2113 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2114 sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )";
2115 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2116 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2117 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2118 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2119 strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN );
2120 strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN );
2121 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2122 SQLINTEGER count = 0;
2123 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2124 //?違???若??ID????緇?????
2125 SQLHANDLE hstmt2 = NULL;
2126 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2127 sql = "SELECT LAST_INSERT_ID()"; // MySQL
2128 // sql = "SELECT LAST_INSERT_ROWID()"; // SQLite
2129 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2130 SQLUINTEGER last_insert_id;
2131 SQLINTEGER len;
2132 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len );
2133 if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){
2134 *gid = last_insert_id;
2135 ret = RES_OK;
2136 }else{
2137 ret = RES_DB_QUERY_ERROR;
2138 string s( "SQLFetch in insertGroup " );
2139 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2140 setLastErrorString( s.c_str( ) );
2141 }
2142 }else{
2143 string s( "SQLExecDirect in insertGroup " );
2144 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2145 setLastErrorString( s.c_str( ) );
2146 ret = RES_DB_QUERY_ERROR;
2147 }
2148 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2149 }
2150 }else{
2151 string s( "SQLRowCount in insertGroup sql=" );
2152 s += string( sql );
2153 setLastErrorString( s.c_str( ) );
2154 ret = RES_DB_QUERY_ERROR;
2155 }
2156 }else{
2157 string s( "SQLExecute in insertGroup " );
2158 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2159 setLastErrorString( s.c_str( ) );
2160 ret = RES_DB_QUERY_ERROR;
2161 }
2162 }else{
2163 string s( "SQLPrepare in insertGroup " );
2164 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2165 setLastErrorString( s.c_str( ) );
2166 ret = RES_ERROR;
2167 }
2168 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2169 }else{
2170 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertGroup" );
2171 ret = RES_ERROR;
2172 }
2173 return ret;
2174 }
2175
2176 /**
2177 *
2178 * ?違???若?????宴??紊??眼????
2179 *
2180 * @param sid ?祉???激?с??D
2181 * @param group ?違?????違???若??????/span>
2182 * @return RES_OK
2183 * @return RES_ERROR
2184 * @return RES_DB_NOT_INITIALIZED
2185 * @return RES_NO_SUCH_SESSION
2186 * @return RES_NO_SUCH_GROUP
2187 * @return RES_DB_QUERY_ERROR
2188 *
2189 */
2190 result_t updateGroup( sessionid_t sid, const group_t* group )
2191 {
2192 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2193 if( group == NULL ) return RES_ERROR;
2194 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2195 if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
2196
2197 result_t ret = RES_ERROR;
2198 string sql;
2199 SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1];
2200 SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2201 SQLRETURN sqlcode;
2202
2203 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2204 sql = "UPDATE " + dbprefix + "_vpaccount_groups SET gname=?, gdesc=? WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
2205 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2206 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2207 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2208 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2209 strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN );
2210 strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN );
2211 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2212 SQLINTEGER count = 0;
2213 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2214 ret = RES_OK;
2215 }else{
2216 string s( "SQLRowCount in updateGroup sql=" );
2217 s += string( sql );
2218 setLastErrorString( s.c_str( ) );
2219 ret = RES_DB_QUERY_ERROR;
2220 }
2221 }else{
2222 string s( "SQLExecute in updateGroup " );
2223 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2224 setLastErrorString( s.c_str( ) );
2225 ret = RES_DB_QUERY_ERROR;
2226 }
2227 }else{
2228 setLastErrorString( "SQLPrepare in updateGroup sql=" );
2229 ret = RES_ERROR;
2230 }
2231 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2232 }else{
2233 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateGroup" );
2234 ret = RES_ERROR;
2235 }
2236 return RES_OK;
2237 }
2238
2239 /**
2240 *
2241 * ?違???若?????怨??
2242 *
2243 * @param sid ?祉???激?с??D
2244 * @param gid ??緇????????違???若????ID
2245 * @param group ??緇??????違???若?????宴???≪?????鴻???吾??莨若?????ゃ?潟??/span>
2246 * @return RES_OK
2247 * @return RES_DB_NOT_INITIALIZED
2248 * @return RES_NO_SUCH_SESSION
2249 * @return RES_NO_SUCH_GROUP
2250 * @return RES_DB_QUERY_ERROR
2251 *
2252 */
2253 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
2254 {
2255 int len;
2256 static criteria c;
2257 result_t res = getGroups( sid, &gid, 1, &c, group, &len );
2258 if( len == 0 ) return RES_NO_SUCH_GROUP;
2259 return res;
2260 }
2261
2262 /**
2263 *
2264 * 茲??違???違???若?????宴??筝?綺?????????.
2265 *
2266 * @param sid ?祉???激?с??D
2267 * @param gids ??緇????????違???若????ID??????
2268 * @param gidsLen gids???????膣???/span>
2269 * @param cri 腟???????膀??駕??純?若???>散????絎?
2270 * @param groups ??緇?腟??????違???若?????宴?????????≪?????鴻???吾??莨若?????ゃ?潟??/span>
2271 * @param groupsLen ??緇?腟????????????膣???/span>
2272 * @return RES_OK
2273 * @return RES_DB_NOT_INITIALIZED
2274 * @return RES_NO_SUCH_SESSION
2275 * @return RES_DB_QUERY_ERROR
2276 *
2277 */
2278 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
2279 {
2280 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2281 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2282
2283 #ifdef USE_SYSLOG
2284 openlog( "commonal", LOG_ODELAY, LOG_USER );
2285 #endif
2286
2287 SQLRETURN sqlcode;
2288 SQLHANDLE hstmt = NULL;
2289 result_t ret = RES_ERROR;
2290 string sql;
2291 group_t* dst = new group_t[ gidsLen ];
2292
2293 sql += "SELECT gid, gname, gdesc ";
2294 sql += "FROM " + dbprefix + "_vpaccount_groups ";
2295 if( gidsLen > 0 ){
2296 sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) );
2297 for( int i = 1; i < gidsLen; i++ ){
2298 sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) );
2299 }
2300 }
2301 sql += criteria2str( cri );
2302
2303 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2304 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2305 SQLINTEGER len;
2306 groupid_t gid = 0;
2307 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2308 *groupsLen=0;
2309 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < gidsLen ; i++ ){
2310 dst[ i ].setGID( gid );
2311 dst[ i ].setGname( getResultCol( hstmt, 2 ).c_str() );
2312 dst[ i ].setDesc( getResultCol( hstmt, 3 ).c_str() );
2313 ( *groupsLen )++;
2314 }
2315 *groups = dst;
2316 #ifdef USE_SYSLOG
2317 syslog( LOG_DEBUG, "getGroups succeed" );
2318 #endif
2319 ret = RES_OK;
2320 }else{
2321 string s( "SQLExecDirect in getGroups" );
2322 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2323 s += string( ", sql=" ) + string( sql );
2324 setLastErrorString( s.c_str( ) );
2325 #ifdef USE_SYSLOG
2326 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2327 #endif
2328 ret = RES_DB_QUERY_ERROR;
2329 }
2330 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2331 }else{
2332 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroups" );
2333 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2334 setLastErrorString( s.c_str( ) );
2335 #ifdef USE_SYSLOG
2336 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2337 #endif
2338 ret = RES_DB_QUERY_ERROR;
2339 }
2340 #ifdef USE_SYSLOG
2341 closelog( );
2342 #endif
2343 return ret;
2344 }
2345
2346 /**
2347 *
2348 * ?≪?????若?炊┤???????<??菴???
2349 *
2350 * @param sid ?祉???激?с??D
2351 * @param uid ???????????????若?吟??ID
2352 * @return true 罔???????
2353 * @return false 罔???????
2354 *
2355 */
2356 bool isModerator( sessionid_t sid, userid_t uid )
2357 {
2358 if( hdbc == NULL ) return false;
2359 if( !isValidSessionID( sid ) ) return false;
2360 if( !uidExists( uid ) ) return false;
2361
2362 bool ret = false;
2363 SQLRETURN sqlcode;
2364 SQLHANDLE hstmt = NULL;
2365 SQLINTEGER count = 0;
2366 string sql;
2367 groupid_t moderator_gid;
2368
2369 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2370 sql = "SELECT value FROM " + dbprefix + "_vpaccount_config";
2371 sql += " WHERE name='moderator_gid'";
2372 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2373 SQLINTEGER len = 0;
2374 SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len );
2375 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2376 sql = "SELECT * from " + dbprefix + "_groups_users_link ";
2377 sql += "WHERE groupid=" + unsignedIntToString( moderator_gid );
2378 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2379 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2380 if( count > 0 ){
2381 ret = true;
2382 }
2383 }
2384 }else{
2385 setLastErrorString( "SQLFetch in isModerator " );
2386 }
2387 }else{
2388 string s( "SQLExecDirect in isModerator " );
2389 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2390 s += ", sql=";
2391 s += string( sql );
2392 setLastErrorString( s.c_str( ) );
2393 }
2394 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2395 }else{
2396 setLastErrorString( "SQLAllocHandle in isModerator " );
2397 }
2398 return ret;
2399 }
2400
2401 /**
2402 *
2403 * ???若??D??緇?
2404 *
2405 * @param uname ID????緇??????????若?吟?弱??
2406 * @param uid ID??篁e?ャ??????紊??違?????ゃ?潟??/span>
2407 * @return RES_ERROR
2408 * @return RES_OK
2409 * @refer result_t
2410 *
2411 */
2412 result_t getUid( const char* uname, userid_t* uid )
2413 {
2414 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2415 if( uname == NULL ) return RES_ERROR;
2416
2417 result_t ret = RES_ERROR;
2418 SQLRETURN sqlcode;
2419 SQLHANDLE hstmt = NULL;
2420 string sql;
2421 string uname2 = addSlashes( uname );
2422
2423 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';";
2424 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2425 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2426 userid_t _uid = 0;
2427 SQLINTEGER len;
2428 SQLBindCol( hstmt, 1, SQL_C_ULONG, &_uid, 0, &len );
2429 sqlcode = SQLFetch( hstmt );
2430 if( sqlcode == SQL_SUCCESS ){
2431 *uid = _uid;
2432 ret = RES_OK;
2433 }else {
2434 string s( "SQLFetch in getUid sql=" );
2435 s += string( sql );
2436 setLastErrorString( s.c_str( ) );
2437 ret = RES_NO_SUCH_USER;
2438 }
2439 }else{
2440 setLastErrorString( "SQLExecDirect in getUid" );
2441 ret = RES_DB_QUERY_ERROR;
2442 }
2443 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2444 }else{
2445 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUid" );
2446 ret = RES_DB_QUERY_ERROR;
2447 }
2448
2449 return ret;
2450 }
2451
2452 /**
2453 *
2454 * ?祉???激?с?潟??篏?????xoops_vpaccount_session???吾??莨若???? sessionid_t??session???????
2455 *
2456 * @param uid xoops_users??id
2457 * @param session sessionid_t???????????????????ゃ?潟?帥??
2458 * @return RES_OK ????
2459 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
2460 */
2461 static result_t addSession( userid_t uid, sessionid_t* session )
2462 {
2463 result_t ret = RES_DB_QUERY_ERROR;
2464 SQLRETURN sqlcode;
2465 string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" +
2466 unsignedIntToString(uid) + ")";
2467 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2468 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2469 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2470 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2471 sql = "SELECT LAST_INSERT_ID()";
2472 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2473 sessionid_t sid;
2474 SQLINTEGER len;
2475 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sid, 0, &len );
2476 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2477 *session = sid;
2478 ret = RES_OK;
2479 }
2480 }
2481 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2482 }
2483 }else{
2484 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2485 }
2486 }
2487 return ret;
2488 }
2489
2490
2491 /**
2492 *
2493 * ???違?ゃ?活?荐若???祉???激?с?割???
2494 *
2495 * @param uname ???違?ゃ?喝??
2496 * @param passwd ???鴻???若??
2497 * @param session sessionid_t???????????????????ゃ?潟?帥??
2498 * @return RES_OK ???違?ゃ?恰??????session??essionid_t???吾??莨若??????<br>
2499 * @return RES_LOGIN_FAILURE uname?障????asswd???医幻<br>
2500 * @return RES_DB_QUERY_ERROR DB????????筝?????????/span>
2501 *
2502 */
2503 result_t loginUser(const char* uname, const char* passwd, sessionid_t* session )
2504 {
2505 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2506
2507 result_t ret;
2508 string sql;
2509 SQLRETURN sqlcode;
2510
2511 // uname, passwd -> uid
2512 string escUname = addSlashes( uname );
2513 string escPasswd = addSlashes( passwd );
2514 sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')";
2515
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 userid_t uid = 0;
2519 SQLINTEGER len;
2520 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
2521 sqlcode = SQLFetch( hstmt );
2522 if( sqlcode == SQL_SUCCESS ){
2523 ret = addSession( uid, session );
2524 }else {
2525 string s( "SQLFetch in loginUser" );
2526 setLastErrorString( s.c_str( ) );
2527 ret = RES_LOGIN_FAILURE;//illegal loginname or password
2528 }
2529 }else{
2530 setLastErrorString( "SQLExecDirect in loginUser" );
2531 ret = RES_DB_QUERY_ERROR;
2532 }
2533 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2534 }else{
2535 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in loginUser" );
2536 ret = RES_DB_QUERY_ERROR;
2537 }
2538
2539 return ret;
2540 }
2541
2542 /**
2543 *
2544 * ???違?≪???????祉???激?с?括?篋?
2545 *
2546 * @param sid session id
2547 * @return ????
2548 *
2549 */
2550 void logoutUser( sessionid_t sid )
2551 {
2552 if( hdbc == NULL ) return; // RES_DB_NOT_INITIALIZED;
2553
2554 result_t ret;
2555 string sql;
2556 SQLRETURN sqlcode;
2557 SQLHANDLE hstmt = NULL;
2558
2559 sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid);
2560 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2561 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2562 ;
2563 }
2564 else {
2565 setLastErrorString( "SQLExecDirect in logoutUser" );
2566 }
2567 }
2568 else {
2569 setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in logoutUser" );
2570 }
2571 }
2572
2573 /**
2574 *
2575 * ?祉???激?с?潟?????.<br>
2576 * XOOPS??ession???若????????蚊??????sess_id?????ess_id??膈???????
2577 * ?逸?session_t??篏?????????
2578 * ???若?帥???若?鴻???祉???激?с?潟????違?????宴??荐??蚊????
2579 *
2580 * @param sessionid xoops??ession_id
2581 * @param uid xoops_users??id
2582 * @param session sessionid_t???????????????????ゃ?潟?帥??
2583 * @return RES_OK
2584 * @return RES_ERROR
2585 * @return RES_DB_QUERY_ERROR
2586 *
2587 */
2588 result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session )
2589 {
2590 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2591
2592 result_t ret;
2593 string sql;
2594 SQLHANDLE hstmt = NULL;
2595 SQLRETURN sqlcode;
2596
2597 string escSess_id = addSlashes(sess_id);
2598 sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'";
2599 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2600 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2601 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2602 ret = addSession( uid, session );
2603 }else{
2604 ret = RES_ERROR;
2605 }
2606 }else {
2607 ret = RES_DB_QUERY_ERROR;
2608 }
2609 }else{
2610 ret = RES_DB_QUERY_ERROR;
2611 }
2612 return ret;
2613 }
2614
2615 /**
2616 *
2617 * ?祉???激?с?潟???膣違??session_t?у??????.<br>
2618 *
2619 * @param sid ?祉???激?с??D
2620 * @param ppsession sessionid_t*???????????????????ゃ?潟?帥??
2621 * @return RES_OK ??????freeSession(*ppsession)??綽?荀???<br>
2622 * @return RES_NO_SUCH_SESSION<br>
2623 * @return RES_DB_QUERY_ERROR<br>
2624 * @return RES_DB_NOT_INITIALIZED
2625 *
2626 */
2627 result_t getSession( sessionid_t sid, const session_t** ppsession )
2628 {
2629 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2630 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2631
2632 result_t ret = RES_ERROR;
2633 string sql;
2634 SQLHANDLE hstmt = NULL;
2635 SQLRETURN sqlcode;
2636
2637 sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
2638 "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
2639 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2640 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2641 userid_t uid = 0;
2642 SQLINTEGER cbUid = 0;
2643 unsigned long date = 0;
2644 SQLINTEGER cbDate = 0;
2645 SQLBindCol( hstmt, 2, SQL_C_ULONG, &uid, 0, &cbUid );
2646 SQLBindCol( hstmt, 3, SQL_C_ULONG, &date, 0, &cbDate );
2647 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2648 session_t *p = new session[ 1 ];
2649 p->setSessionID( sid );
2650 p->setUID( uid );
2651 p->setDate( date );
2652 *ppsession = p;
2653 ret = RES_OK;
2654 }else{
2655 string s( "SQLFetch in getSession " );
2656 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2657 setLastErrorString( s.c_str( ) );
2658 ret = RES_ERROR;
2659 }
2660 }else {
2661 string s( "SQLExecDirect in getSession " );
2662 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2663 s += ", sql=";
2664 s += string( sql );
2665 setLastErrorString( s.c_str( ) );
2666 ret = RES_DB_QUERY_ERROR;
2667 }
2668 }else{
2669 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getSession" );
2670 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2671 setLastErrorString( s.c_str( ) );
2672 ret = RES_DB_QUERY_ERROR;
2673 }
2674 return ret;
2675
2676 /*
2677 sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix +
2678 "_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid);
2679 if( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){
2680 MYSQL_RES* result = fp_mysql_store_result( mysql );
2681 if( result ){
2682 MYSQL_ROW row = fp_mysql_fetch_row(result);
2683 if( row ){
2684 session_t *p = new session[1];
2685 p->setSessionID(sid);
2686 p->setUserID(atoi( row[1] != NULL ? row[1] : "" ));
2687 p->setDate(atoi( row[2] != NULL ? row[2] : "" ));
2688 *ppsession = p;
2689 ret = RES_OK;
2690 }else{
2691 ret = RES_NO_SUCH_SESSION;
2692 }
2693 fp_mysql_free_result( result );
2694 }else {
2695 ret = RES_DB_QUERY_ERROR;
2696 }
2697 }else{
2698 ret = RES_DB_QUERY_ERROR;
2699 }
2700 return ret;
2701 */
2702 }
2703
2704 /**
2705 *
2706 * ?祉???激?с?潟???綵??с?????с????????.
2707 *
2708 * @param sid ???с??????????session
2709 * @return true 罩e?
2710 * @return false 筝?罩?/span>
2711 *
2712 */
2713 bool isValidSessionID( sessionid_t sid )
2714 {
2715 if( hdbc == NULL ) return false;
2716
2717 bool ret = false;
2718 string sql;
2719 SQLRETURN sqlcode;
2720 SQLHANDLE hstmt = NULL;
2721
2722 #ifdef USE_SYSLOG
2723 openlog( "commonal", LOG_ODELAY, LOG_USER );
2724 #endif
2725 sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + unsignedIntToString( sid );
2726 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2727 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2728 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2729 #ifdef USE_SYSLOG
2730 syslog( LOG_DEBUG, "isValidSessionID succeed" );
2731 #endif
2732 ret = true;
2733 }else{
2734 string s( "SQLFetch in isValidSessionID " );
2735 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2736 s += string( ", sql=" ) + string( sql );
2737 setLastErrorString( s.c_str() );
2738 #ifdef USE_SYSLOG
2739 syslog( LOG_DEBUG, "isValidSessionID %s", getLastErrorString( ) );
2740 #endif
2741 ret = false;
2742 }
2743 }else{
2744 string s( "SQLExecDirect in isValidSessionID " );
2745 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2746 s += string( ", sql=" ) + string( sql );
2747 setLastErrorString( s.c_str( ) );
2748 #ifdef USE_SYSLOG
2749 syslog( LOG_DEBUG, "isValidSessionID %s", getLastErrorString( ) );
2750 #endif
2751 ret = false;
2752 }
2753 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2754 }else{
2755 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isValidSessionID " );
2756 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2757 setLastErrorString( s.c_str( ) );
2758 #ifdef USE_SYSLOG
2759 syslog( LOG_DEBUG, "isValidSessionID %s", getLastErrorString( ) );
2760 #endif
2761 ret = false;
2762 }
2763 #ifdef USE_SYSLOG
2764 closelog( );
2765 #endif
2766 return ret;
2767 }
2768
2769 void freeAccount( const account_t* ptr ){ delete[] ( account_t* )ptr; }
2770 void freeGroup( const group_t* ptr ){ delete[] ( group_t* )ptr; }
2771 void freeSession( const session_t* ptr ){ delete[] ( session_t* )ptr; }
2772 void freeUID( const int* ptr ){ delete[] ( int* )ptr; }
2773 void freeGID( const int* ptr ){ delete[] ( int* )ptr; }
2774
2775 static string errstr;
2776 const char* getLastErrorString()
2777 {
2778 return errstr.c_str( );
2779 }
2780
2781 void setLastErrorString( const char* str )
2782 {
2783 errstr = str;
2784 #ifdef USE_SYSLOG
2785 openlog( "commonal", LOG_ODELAY, LOG_USER );
2786 syslog( LOG_DEBUG, "%s", str );
2787 closelog( );
2788 #endif
2789 // fprintf( stderr, "setLastErrorString( '%s' );\n", str );
2790 }

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