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.61 - (show annotations) (download) (as text)
Wed Feb 9 07:23:50 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.60: +19 -24 lines
File MIME type: text/x-c++src
・URL to My Personal Archive をDB・ALから消した.

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