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.55 - (show annotations) (download) (as text)
Fri Jan 28 07:01:38 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
CVS Tags: demo20050128
Changes since 1.54: +153 -54 lines
File MIME type: text/x-c++src
getItemIDByIndexID: 対象となるアイテムの条件見直し.
SQLAllocHandle失敗時のメッセージを追加.

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