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.78 - (show annotations) (download) (as text)
Sat Mar 5 02:28:05 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.77: +8 -2 lines
File MIME type: text/x-c++src
・個人領域のインデックスが Private と表示されるよう修正.

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