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.73 - (show annotations) (download) (as text)
Fri Feb 25 07:41:35 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.72: +130 -12 lines
File MIME type: text/x-c++src
getGroupItemID追加.
item, indexのlimitフィールドを登録,更新処理に追加.

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