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.51 - (show annotations) (download) (as text)
Mon Jan 24 10:50:29 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.50: +80 -8 lines
File MIME type: text/x-c++src
freeItemType,getItemTypes関数を追加した.

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