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.69 - (show annotations) (download) (as text)
Tue Feb 22 02:39:30 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.68: +64 -49 lines
File MIME type: text/x-c++src
public_item_target_user_all関数を追加.
SQL中のpublic_item_target_user_allの比較式をpublic_item_target_user_all関数に置換.
sessionテーブルのLEFT JOINの条件にsidのチェックを追加.
DB問合せ処理の高速化.

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