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.39 - (show annotations) (download) (as text)
Sat Jan 15 05:38:10 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.38: +648 -54 lines
File MIME type: text/x-c++src
insertAccount: 文字列バッファのサイズ調整など.
updateAccount: 文字列バッファのサイズ調整など.
アイテム管理関数を定義した.
    insertItem, getItem, getItems, dumpItemID, updateItem, deleteItemなど.
freeGID, freeUID: 引数の型を修正.

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