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.75 - (show annotations) (download) (as text)
Thu Mar 3 10:13:00 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.74: +38 -2 lines
File MIME type: text/x-c++src
・isValidSessionでtimestampを更新するよう修正.
・sessionはisValidSessionしない限り1時間でタイムアウトするよう修正.
・loginUser, createSessionでタイムアウトしたsessionを削除するよう修正.

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