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.65 - (show annotations) (download) (as text)
Wed Feb 16 07:37:17 2005 UTC (19 years, 1 month ago) by youi
Branch: MAIN
Changes since 1.64: +20 -45 lines
File MIME type: text/x-c++src
insertItem, updateItem, getItems: publication_dateに対応.

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