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.50 - (show annotations) (download) (as text)
Mon Jan 24 01:54:38 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.49: +161 -48 lines
File MIME type: text/x-c++src
引数の型修飾を変更.
 dumpItemID, getItemIDByBinderID, getItemIDByIndexID
関数追加
 getPrivateItemID, getUncertifiedLink

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