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.63 - (show annotations) (download) (as text)
Thu Feb 10 02:33:16 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.62: +6 -3 lines
File MIME type: text/x-c++src
・zipCreateをコメントアウトしていたのを戻した.

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