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.43 - (hide annotations) (download) (as text)
Wed Jan 19 01:42:15 2005 UTC (19 years, 2 months ago) by aga
Branch: MAIN
Changes since 1.42: +19 -12 lines
File MIME type: text/x-c++src
。ヲx_xnpaccount_index、ホgid,uid、ャ0、ヒ、ハ、鬢ハ、、、隍ヲス、タオ.

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