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.54 - (hide annotations) (download) (as text)
Fri Jan 28 00:36:58 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.53: +5 -2 lines
File MIME type: text/x-c++src
・freeStringで落ちることがあるのを修正.

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