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.61 - (hide annotations) (download) (as text)
Wed Feb 9 07:23:50 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.60: +19 -24 lines
File MIME type: text/x-c++src
・URL to My Personal Archive をDB・ALから消した.

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