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.54 - (show annotations) (download) (as text)
Fri Jan 28 00:36:58 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.53: +5 -2 lines
File MIME type: text/x-c++src
・freeStringで落ちることがあるのを修正.

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