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

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

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