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.47 - (hide annotations) (download) (as text)
Sat Jan 22 02:41:14 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.46: +110 -1 lines
File MIME type: text/x-c++src
・amazon補完を作成.

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