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.57 - (show annotations) (download) (as text)
Thu Feb 3 12:04:58 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.56: +118 -21 lines
File MIME type: text/x-c++src
getOwnPublicItemIDを定義.
binder_item_linkのテーブル名を修正.

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