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.60 - (hide annotations) (download) (as text)
Wed Feb 9 02:14:15 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.59: +8 -2 lines
File MIME type: text/x-c++src
・initializeDB()にdbtype引数を追加(SQLite用).

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