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.58 - (show annotations) (download) (as text)
Tue Feb 8 06:40:51 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.57: +134 -36 lines
File MIME type: text/x-c++src
pubmedComplete:ジャーナルの完全なタイトルを取得してpubmed_tにセット.

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