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.59 - (show annotations) (download) (as text)
Tue Feb 8 07:15:02 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.58: +10 -3 lines
File MIME type: text/x-c++src
pubmedパース処理:

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