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.52 - (hide annotations) (download) (as text)
Tue Jan 25 06:46:50 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.51: +15 -3 lines
File MIME type: text/x-c++src
・Bindersを含むindexはdeleteIndex不可.
・getItemsがエラーを出すことがあるのを修正.

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