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.76 - (show annotations) (download) (as text)
Fri Mar 4 06:13:28 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.75: +44 -71 lines
File MIME type: text/x-c++src
・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.

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