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.59 - (hide annotations) (download) (as text)
Tue Feb 8 07:15:02 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.58: +10 -3 lines
File MIME type: text/x-c++src
pubmedパース処理:

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