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.51 - (hide annotations) (download) (as text)
Mon Jan 24 10:50:29 2005 UTC (19 years, 2 months ago) by youi
Branch: MAIN
Changes since 1.50: +80 -8 lines
File MIME type: text/x-c++src
freeItemType,getItemTypes関数を追加した.

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