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.65 - (hide annotations) (download) (as text)
Wed Feb 16 07:37:17 2005 UTC (19 years, 1 month ago) by youi
Branch: MAIN
Changes since 1.64: +20 -45 lines
File MIME type: text/x-c++src
insertItem, updateItem, getItems: publication_dateに対応.

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