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.79 - (hide annotations) (download) (as text)
Mon Mar 7 01:20:09 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.78: +24 -10 lines
File MIME type: text/x-c++src
・getItemCountGroupByIndexで未承認アイテム・インデックスを数えないよう修正.

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