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.46 - (hide annotations) (download) (as text)
Fri Jan 21 01:36:11 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.45: +259 -19 lines
File MIME type: text/x-c++src
pubmed補完機能を追加した.

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