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.68 - (show annotations) (download) (as text)
Mon Feb 21 05:46:18 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.67: +189 -25 lines
File MIME type: text/x-c++src
getItemCountを追加.
dumpItemID, getItemsの問合せを高速化.

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