Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.71 - (hide annotations) (download) (as text)
Thu Feb 24 11:32:55 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.70: +54 -1 lines
File MIME type: text/x-c++src
・updateGroupでグループインデックスの名前を変更するよう修正.

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