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.82 - (hide annotations) (download) (as text)
Fri Mar 11 07:11:30 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.81: +16 -90 lines
File MIME type: text/x-c++src
itemid_t配列の長さ(*iidsLen)の初期化処理を追加.

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