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.84 - (show annotations) (download) (as text)
Mon Mar 14 06:12:11 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.83: +8 -3 lines
File MIME type: text/x-c++src
__BORLANDC__対応.

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