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.53 - (show annotations) (download) (as text)
Thu Jan 27 08:30:35 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.52: +51 -2 lines
File MIME type: text/x-c++src
getIndexIDByItemIDを定義した.

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