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.47 - (show annotations) (download) (as text)
Sat Jan 22 02:41:14 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.46: +110 -1 lines
File MIME type: text/x-c++src
・amazon補完を作成.

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