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.49 - (hide annotations) (download) (as text)
Sat Jan 22 09:30:58 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.48: +134 -28 lines
File MIME type: text/x-c++src
setLastErrorStringの宣言を追加した.

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