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.76 - (hide annotations) (download) (as text)
Fri Mar 4 06:13:28 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.75: +44 -71 lines
File MIME type: text/x-c++src
・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした.

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