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.77 - (hide annotations) (download) (as text)
Sat Mar 5 01:48:35 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.76: +90 -1 lines
File MIME type: text/x-c++src
・getItemCountGroupByIndexを作成.

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