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.66 - (show annotations) (download) (as text)
Wed Feb 16 10:03:13 2005 UTC (19 years, 1 month ago) by youi
Branch: MAIN
CVS Tags: mv_to_sourceforge_20050217
Changes since 1.65: +36 -17 lines
File MIME type: text/x-c++src
publication_year/month/mdayに対応.

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