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.82 - (show annotations) (download) (as text)
Fri Mar 11 07:11:30 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.81: +16 -90 lines
File MIME type: text/x-c++src
itemid_t配列の長さ(*iidsLen)の初期化処理を追加.

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