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.73 - (hide annotations) (download) (as text)
Fri Feb 25 07:41:35 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.72: +130 -12 lines
File MIME type: text/x-c++src
getGroupItemID追加.
item, indexのlimitフィールドを登録,更新処理に追加.

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