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.60 - (show annotations) (download) (as text)
Wed Feb 9 02:14:15 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.59: +8 -2 lines
File MIME type: text/x-c++src
・initializeDB()にdbtype引数を追加(SQLite用).

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