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.52 - (show annotations) (download) (as text)
Tue Jan 25 06:46:50 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.51: +15 -3 lines
File MIME type: text/x-c++src
・Bindersを含むindexはdeleteIndex不可.
・getItemsがエラーを出すことがあるのを修正.

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