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.77 - (show annotations) (download) (as text)
Sat Mar 5 01:48:35 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.76: +90 -1 lines
File MIME type: text/x-c++src
・getItemCountGroupByIndexを作成.

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