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.56 - (show annotations) (download) (as text)
Sat Jan 29 09:49:22 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.55: +156 -137 lines
File MIME type: text/x-c++src
syslog_printf: デバッグメッセージ出力関数を定義した.
getCertifyPermission: チェック用のsqlを定義した.
SQLINTEGER->SQLLENへ型を変更した.
getItemPermission: モデレータであるか?の判断条件を修正.

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