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.85 - (show annotations) (download) (as text)
Mon Mar 14 09:30:50 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.84: +11 -5 lines
File MIME type: text/x-c++src
・getItemCountByIndexで、作成者・グループ管理者は未承認アイテムをカウントするよう修正.

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