Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.64 - (show annotations) (download) (as text)
Tue Feb 15 02:35:47 2005 UTC (19 years, 1 month ago) by youi
Branch: MAIN
Changes since 1.63: +44 -40 lines
File MIME type: text/x-c++src
SQLINTEGER、ォ、餞QLLEN、リキソハムケケ.

1 /*
2 *
3 * $Revision: 1.63 $
4 * $Log: commonal.cc,v $
5 * Revision 1.63 2005/02/10 02:33:16 aga
6 * 繝サzipCreate繧偵さ繝。繝ウ繝医い繧ヲ繝医@縺ヲ縺?◆縺ョ繧呈綾縺励◆.
7 *
8 * Revision 1.62 2005/02/09 11:11:52 youi
9 * deleteItem縺ォ繧「繧、繝?Β縺ォ髢「菫ゅ☆繧九お繝ウ繝医Μ縺ョ蜑企勁蜃ヲ逅?r霑ス蜉?.
10 *
11 * Revision 1.61 2005/02/09 07:23:50 aga
12 * 繝サURL to My Personal Archive 繧奪B繝サAL縺九i豸医@縺?
13 *
14 * Revision 1.60 2005/02/09 02:14:15 aga
15 * 繝サinitializeDB()縺ォdbtype蠑墓焚繧定ソス蜉?(SQLite逕ィ).
16 *
17 * Revision 1.59 2005/02/08 07:15:02 youi
18 * pubmed繝代?繧ケ蜃ヲ逅?
19 *
20 * Revision 1.58 2005/02/08 06:40:51 youi
21 * pubmedComplete:繧ク繝」繝シ繝翫Ν縺ョ螳悟?縺ェ繧ソ繧、繝医Ν繧貞叙蠕励@縺ヲpubmed_t縺ォ繧サ繝?ヨ.
22 *
23 * Revision 1.57 2005/02/03 12:04:58 youi
24 * getOwnPublicItemID繧貞ョ夂セゥ.
25 * binder_item_link縺ョ繝??繝悶Ν蜷阪r菫ョ豁」.
26 *
27 * Revision 1.56 2005/01/29 09:49:22 youi
28 * syslog_printf: 繝?ヰ繝?げ繝。繝?そ繝シ繧ク蜃コ蜉幃未謨ー繧貞ョ夂セゥ縺励◆.
29 * getCertifyPermission: 繝√ぉ繝?け逕ィ縺ョsql繧貞ョ夂セゥ縺励◆.
30 * SQLINTEGER->SQLLEN縺ク蝙九r螟画峩縺励◆.
31 * getItemPermission: 繝「繝?Ξ繝シ繧ソ縺ァ縺ゅk縺具シ溘?蛻、譁ュ譚。莉カ繧剃ソョ豁」.
32 *
33 * Revision 1.55 2005/01/28 07:01:38 youi
34 * getItemIDByIndexID: 蟇セ雎。縺ィ縺ェ繧九い繧、繝?Β縺ョ譚。莉カ隕狗峩縺?
35 * SQLAllocHandle螟ア謨玲凾縺ョ繝。繝?そ繝シ繧ク繧定ソス蜉?.
36 *
37 * Revision 1.54 2005/01/28 00:36:58 aga
38 * 繝サfreeString縺ァ關ス縺。繧九%縺ィ縺後≠繧九?繧剃ソョ豁」.
39 *
40 * Revision 1.53 2005/01/27 08:30:35 youi
41 * getIndexIDByItemID繧貞ョ夂セゥ縺励◆.
42 *
43 * Revision 1.52 2005/01/25 06:46:50 aga
44 * 繝サBinders繧貞性繧?index縺ッdeleteIndex荳榊庄.
45 * 繝サgetItems縺後お繝ゥ繝シ繧貞?縺吶%縺ィ縺後≠繧九?繧剃ソョ豁」.
46 *
47 * Revision 1.51 2005/01/24 10:50:29 youi
48 * freeItemType,getItemTypes髢「謨ー繧定ソス蜉?縺励◆.
49 *
50 * Revision 1.50 2005/01/24 01:54:38 youi
51 * 蠑墓焚縺ョ蝙倶ソョ鬟セ繧貞、画峩.
52 * dumpItemID, getItemIDByBinderID, getItemIDByIndexID
53 * 髢「謨ー霑ス蜉?
54 * getPrivateItemID, getUncertifiedLink
55 *
56 * Revision 1.49 2005/01/22 09:30:58 youi
57 * setLastErrorString縺ョ螳」險?繧定ソス蜉?縺励◆.
58 *
59 * Revision 1.48 2005/01/22 04:18:22 aga
60 * 繝サloginUser, insertAccount蜀?〒縺ッmd5()繧定。後o縺ェ縺?h縺?ソョ豁」.
61 *
62 * Revision 1.47 2005/01/22 02:41:14 aga
63 * 繝サamazon陬懷ョ後r菴懈?.
64 *
65 * Revision 1.46 2005/01/21 01:36:11 youi
66 * pubmed陬懷ョ梧ゥ溯?繧定ソス蜉?縺励◆.
67 *
68 * Revision 1.45 2005/01/19 10:07:53 aga
69 * 繝サ繧イ繧ケ繝医Θ繝シ繧カ蜷代¢縺ョ菫ョ豁」.
70 *
71 * Revision 1.44 2005/01/19 06:01:59 youi
72 * 髢「謨ー霑ス蜉?
73 * getConfigValue
74 * setConfigValue
75 * getChangeLogs
76 * insertChangeLog
77 * getItemIDByBinderID
78 * registerBinderItem
79 * unregisterBinderItem
80 * getIndexPermission
81 * freeString
82 * freeChangeLog
83 * 蠑墓焚縺ォcriteria_t繧定ソス蜉?
84 * getItemIDByIndexID
85 * 蠑墓焚縺ョ鬆?コ上r螟画峩
86 * getCertifyState
87 * setCertifyState
88 * getCertifyPermission
89 * sessionID2UID,querySimple,queryGetUnsignedInt縺ョ蛻ゥ逕ィ
90 * insertItem縺ョ蜀?Κ縺ァPrivateIndex縺ク逋サ骭イ繧定。後↑縺?/span>
91 * getItems: getItemPermission繧剃スソ縺」縺溯ェュ縺ソ霎シ縺ソ讓ゥ髯舌メ繧ァ繝?け.
92 *
93 * Revision 1.43 2005/01/19 01:42:15 aga
94 * 繝サx_xnpaccount_index縺ョgid,uid縺?縺ォ縺ェ繧峨↑縺?h縺?ソョ豁」.
95 *
96 * Revision 1.42 2005/01/19 00:51:29 aga
97 * 繝サinsertIndex縺ァx_xnpaccount_index.index_id縺後♀縺九@縺??繧剃ソョ豁」.
98 *
99 * Revision 1.41 2005/01/19 00:06:51 aga
100 * 繝サupdateIndex縺ァ縲∝酔縺伜錐蜑阪?蜈?シ溘′縺ゅk縺句錐蜑阪′遨コ縺ァ縺ゅk縺ェ繧峨お繝ゥ繝シ縺ォ縺励◆.
101 * 繝サcreateSession縺ァ縲「id縺訓latform繝ヲ繝シ繧カ縺ァ縺ェ縺?°activate縺輔l縺ヲ縺?↑縺?↑繧峨お繝ゥ繝シ縺ォ縺励◆.
102 *
103 * Revision 1.40 2005/01/17 00:15:05 aga
104 * 繝サdeleteIndex, updateIndex縺ォ螟ア謨励☆繧九%縺ィ縺後≠繧九?繧剃ソョ豁」.
105 *
106 * Revision 1.39 2005/01/15 05:38:10 youi
107 * insertAccount: 譁?ュ怜?繝舌ャ繝輔ぃ縺ョ繧オ繧、繧コ隱ソ謨エ縺ェ縺ゥ.
108 * updateAccount: 譁?ュ怜?繝舌ャ繝輔ぃ縺ョ繧オ繧、繧コ隱ソ謨エ縺ェ縺ゥ.
109 * 繧「繧、繝?Β邂。逅?未謨ー繧貞ョ夂セゥ縺励◆.
110 * insertItem, getItem, getItems, dumpItemID, updateItem, deleteItem縺ェ縺ゥ.
111 * freeGID, freeUID: 蠑墓焚縺ョ蝙九r菫ョ豁」.
112 *
113 * Revision 1.38 2005/01/15 00:39:16 aga
114 * 繝サx_xnpaccount_item_basic縺ョ讒矩??繧貞、画峩.
115 *
116 * Revision 1.37 2005/01/14 10:36:59 aga
117 * 繝サindex髢「菫ゅ?蜃ヲ逅?r霑ス蜉?.
118 * 繝サinsertAccount縺ァprivate index繧剃ス懈?縺吶k繧医≧菫ョ豁」.
119 * 繝サinsertGroup縺ァgroup index 繧剃ス懈?縺吶k繧医≧菫ョ豁」.
120 *
121 * Revision 1.36 2005/01/13 04:19:22 aga
122 * 繝サVP繧湛NP縺ォ螟画鋤.
123 *
124 * Revision 1.35 2005/01/06 07:20:17 youi
125 * WIN32螳夂セゥ譎ゅ?繧、繝ウ繧ッ繝ォ繝シ繝峨?霑ス蜉?.
126 * MySQL API縺ォ髢「縺吶k繝倥ャ繝?繝輔ぃ繧、繝ォ繧貞炎髯、.
127 * deleteAccount: 謇?螻槭☆繧輝latform繧ー繝ォ繝シ繝励°繧峨?蜑企勁繧貞?阡オ縺励◆.
128 * insertAccount: 繝ヲ繝シ繧カ逋サ骭イ縺ィ蜷梧凾縺ォ繝?ヵ繧ゥ繝ォ繝?latform繧ー繝ォ繝シ繝励∈逋サ骭イ縺吶k.
129 * deleteMember: 繝?ヵ繧ゥ繝ォ繝?latform繧ー繝ォ繝シ繝励°繧峨?蜑企勁繧堤ヲ∵ュ「縺吶k.
130 * deleteMemberNoLimit縺ョ螳夂セゥ.
131 *
132 * Revision 1.34 2004/12/28 04:38:14 aga
133 * 繝サlogoutUser()縺ョ菫ョ豁」.
134 *
135 * Revision 1.33 2004/12/27 05:56:23 youi
136 * odbcDiagString: STMT莉・螟悶?繝上Φ繝峨Ν繧ょ?逅?☆繧九h縺?↓螟画峩縺励◆.
137 * syslog繝。繝?そ繝シ繧ク縺ョ蜃ヲ逅?r霑ス蜉?縺励◆.
138 *
139 * Revision 1.32 2004/12/25 09:46:47 youi
140 * MySQL+MyODBC縺ァ蜍穂ス懊☆繧九h縺?↓菫ョ豁」縺励◆.
141 *
142 * Revision 1.31 2004/12/21 11:42:59 youi
143 * 繧ウ繝。繝ウ繝医?蠑墓焚?梧綾繧雁?、縺ョ隱ャ譏弱↑縺ゥ繧定ソス蜉?.
144 *
145 * Revision 1.30 2004/12/18 10:24:54 youi
146 * IMPORT_MYSQLDLL繧貞ョ夂セゥ縺励◆縺ィ縺搾シ勲YSQL縺ョDLL繧貞虚逧?Μ繝ウ繧ッ縺吶k繝励Ο繝医ち繧、繝怜ョ」險?縺?/span>
147 * 譛牙柑縺ォ縺ェ繧九h縺?↓菫ョ豁」縺励◆.
148 *
149 * Revision 1.29 2004/12/18 01:12:29 youi
150 * freeResult縺ョ髢「謨ー蜷阪rfree<繝??繧ソ蝙?gt;縺ォ螟画峩縺励◆.
151 *
152 * Revision 1.28 2004/12/14 12:02:08 youi
153 * __WIN__繧貞ョ夂セゥ縺励◆縺ィ縺阪?windows縺ョdll菴懈?縺ォ蠢?ヲ√↑蜃ヲ逅?r陦後↑縺?
154 * USE_SYSLOG繧貞ョ夂セゥ縺励◆縺ィ縺阪?syslogd縺ク繝。繝?そ繝シ繧ク繧貞?蜉帙☆繧?
155 * getAccounts: uidsLen縺?縺ョ縺ィ縺阪?蜃ヲ逅?r霑ス蜉?縺励◆.
156 *
157 * Revision 1.27 2004/12/06 11:34:47 aga
158 * 繝サuninitializeDB()繧定ソス蜉?.
159 *
160 * Revision 1.26 2004/12/06 10:17:36 youi
161 * mysql_use_result縺ョ蜿門セ礼オ先棡繧呈ョ九&縺壼叙繧雁?縺吶◆繧?シ?/span>
162 * while( row = mysql_fetch_row(result) );繧呈諺蜈・??/span>
163 *
164 * Revision 1.25 2004/12/06 07:24:33 youi
165 * insertAccount, insertGroup:
166 * 譁ー隕剰ソス蜉?縺励◆諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID?後げ繝ォ繝シ繝悠D繧堤ャャ荳牙シ墓焚縺ォ譖ク縺崎セシ繧?.
167 *
168 * Revision 1.24 2004/12/06 01:45:50 aga
169 * 繝サ繧ウ繝。繝ウ繝医▽縺?
170 * 繝サ髢区叛蠢倥l菫ョ豁」.
171 *
172 * Revision 1.23 2004/12/04 09:21:10 aga
173 * 繝サxnp_config 竊 xnpaccount_config.
174 *
175 * Revision 1.22 2004/12/03 07:17:21 youi
176 * isModerator縺ァ繧「繧ッ繧サ繧ケ縺吶k繝??繧ソ繝吶?繧ケ繝??繝悶Ν蜷阪r菫ョ豁」.
177 *
178 * Revision 1.21 2004/12/01 10:28:58 youi
179 * DB繧ォ繝ゥ繝?蜷阪?螟画峩縺ォ莨エ縺?ソョ豁」
180 * institute -> division
181 * organizaion -> company_name
182 *
183 * Revis1.20 2004/12/01 04:37:04 youi
184 * freeResult: unsigned int* 繧 int* 縺ク菫ョ豁」.
185 * 繧ウ繝。繝ウ繝磯Κ縺ォ髢「謨ー縺ョ隱ャ譏弱r霑ス險?
186 *
187 * Revision 1.19 2004/11/30 06:40:11 youi
188 * 髢「謨ー繧定ソス蜉?(gidExists, uidExists)
189 * getGroupCount繧貞ョ夂セゥ.
190 * getGroupsByUid繧貞ョ夂セゥ.
191 * isGroupAdmin繧剃ソョ豁」.
192 * dumpGroupAdmins繧貞ョ夂セゥ.
193 * deleteMember繧貞ョ夂セゥ.
194 * insertMember繧貞ョ夂セゥ.
195 * getMembers繧貞ョ夂セゥ.
196 * isModerator繧貞ョ夂セゥ.
197 *
198 * Revision 1.18 2004/11/30 05:46:32 aga
199 * 繝サsession縺九iremoteHost繧貞炎髯、.
200 *
201 * Revision 1.17 2004/11/27 09:35:49 youi
202 * isActivated繧貞ョ夂セゥ.
203 * activate繧貞ョ夂セゥ.
204 * dumpUid繧貞ョ夂セゥ.
205 *
206 * Revision 1.16 2004/11/27 06:29:29 youi
207 * getAccountCount繧貞ョ夂セゥ.
208 * dumpGids繧貞ョ夂セゥ.
209 * insertGroup, deleteGroup, updateGroup繧貞ョ夂セゥ.
210 * getGroup, getGroups繧貞ョ夂セゥ.
211 * 繝??繧ソ繝吶?繧ケ蛻晄悄蜑阪?蜻シ蜃コ縺ォ蟇セ縺暦シ軍ES_DB_NOT_INITIALIZED繧定ソ斐☆蜃ヲ逅?r蜷?未謨ー縺ォ霑ス蜉?
212 * (譛ェ蟇セ蠢懊?髢「謨ー縺梧ョ九▲縺ヲ縺?k)
213 *
214 * Revision 1.15 2004/11/27 02:22:22 aga
215 * 繝サinitializeDB蜑阪↓addSlashes()繧貞他縺カ縺ィ關ス縺。繧九?繧剃ソョ豁」.
216 *
217 * Revision 1.14 2004/11/27 01:07:31 youi
218 * criteria2str: LIMIT縺ィORDER BY縺ョ鬆?分繧貞?繧梧崛縺医◆.
219 *
220 * Revision 1.13 2004/11/27 00:35:39 youi
221 * getAccounts繧貞ョ夂セゥ.
222 * getAccount繧剃ソョ豁」?悟?驛ィ縺ァgetAccounts繧貞他縺ウ蜃コ縺?
223 * criteria2str繧貞ョ夂セゥ.
224 *
225 * Revision 1.12 2004/11/26 09:45:28 youi
226 * getAccount繧貞ョ夂セゥ.
227 *
228 * Revision 1.11 2004/11/26 08:16:26 aga
229 * 繝サgetSession, loginUser, createSession, freeResult(const session_t*) 菫ョ豁」.
230 *
231 * Revision 1.10 2004/11/26 07:57:42 youi
232 * updateAccount, deleteAccount繧貞ョ夂セゥ.
233 * mysql_query螟ア謨玲凾縺ッstderr縺ク繧ィ繝ゥ繝シ繧ウ繝シ繝峨→繧ィ繝ゥ繝シ繝。繝?そ繝シ繧ク繧貞?蜉?
234 *
235 * Revision 1.9 2004/11/26 07:38:02 aga
236 * 繝サFAILUE -> FAILURE.
237 *
238 * Revision 1.8 2004/11/26 06:36:55 aga
239 * 繝サcreateSession, getSession 繧剃ス懈?.
240 *
241 * Revision 1.7 2004/11/26 04:51:47 youi
242 * dbprefix繧貞ョ夂セゥ縺励◆.
243 * insertAccount繧貞ョ夂セゥ縺励◆.
244 * isValidSessionID繧貞ョ夂セゥ縺励◆.
245 *
246 * Revision 1.6 2004/11/26 04:35:55 aga
247 * 繝サloginUser(), logoutUser()繧剃ス懈?.
248 *
249 * Revision 1.5 2004/11/26 01:08:25 aga
250 * 繝サaddSlashes()菴懈?.
251 *
252 * Revision 1.4 2004/11/25 12:14:29 youi
253 * getUid縺ョ蜃ヲ逅?r螳夂セゥ縺励◆.
254 *
255 * Revision 1.3 2004/11/25 11:13:59 youi
256 * getLastErrorString/setLastErrorString繧貞ョ夂セゥ.
257 *
258 * Revision 1.2 2004/11/25 08:55:19 youi
259 * 蠑墓焚縺ョ蝙九r菫ョ豁」.
260 * freeResult繧定ソス蜉?.
261 *
262 * Revision 1.1 2004/11/25 05:14:58 youi
263 * initial version
264 *
265 *
266 */
267 #ifdef WIN32
268 #include <windows.h>
269 #endif
270
271 #ifdef USE_SYSLOG
272 #include <syslog.h>
273 #endif
274
275 #include <stdio.h>
276 #include <stdlib.h>
277 #include <string.h>
278 #include <string>
279 #include <assert.h>
280 #include <sql.h>
281 #include <sqlext.h>
282 #include <libxml/xmlreader.h>
283
284 using namespace std;
285
286 #include "common.h"
287 #include "account.h"
288 #include "group.h"
289 #include "session.h"
290 #include "item.h"
291 #include "itemtype.h"
292 #include "criteria.h"
293 #include "commonal.h"
294 #include "item.h"
295 #include "index.h"
296 #include "changelog.h"
297 #include "pubmed.h"
298 #include "amazonbook.h"
299
300 static string dbprefix; //!< XOOPS繝??繧ソ繝吶?繧ケ繝??繝悶Ν縺ョPREFIX
301 static dbtype_t dbtype; //!< MySQL/SQLite
302
303 static SQLHANDLE henv = NULL;
304 static SQLHANDLE hdbc = NULL;
305 static SQLHANDLE hstmt = NULL;
306
307 static bool processEsummary(xmlTextReaderPtr reader, pubmed_t* p);
308 static bool processEsearch(xmlTextReaderPtr reader, pubmed_t* p, int* DocID );
309 static void processEfetch(xmlTextReaderPtr reader, pubmed_t* p);
310 static int streamPubmedFile(const char *filename, pubmed_t* p);
311 static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid );
312 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
313 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
314 static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value );
315 static void setLastErrorString( const char* str );
316
317 void syslog_printf( char* format, ... )
318 {
319 #ifdef USE_SYSLOG
320 va_list ap;
321 va_start(ap, format);
322 openlog( "commonal", LOG_ODELAY, LOG_USER );
323 vsyslog( LOG_DEBUG, format, ap );
324 closelog( );
325 #endif
326 }
327
328 static result_t countResultRows( const char* sql, SQLLEN* count )
329 {
330 result_t ret = RES_ERROR;
331 SQLRETURN sqlcode;
332 SQLHANDLE hstmt = NULL;
333 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
334 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
335 *count = 0;
336 while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
337 ret = RES_OK;
338 }else{
339 string s( "SQLExecDirect in countResultRows " );
340 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
341 s += "sql=";
342 s += string( sql );
343 setLastErrorString( s.c_str( ) );
344 ret = RES_DB_QUERY_ERROR;
345 }
346 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
347 }
348 return ret;
349 }
350
351
352 /**
353 *
354 * 繧、繝ウ繝?ャ繧ッ繧ケ逋サ骭イ?後い繧、繝?Β譖エ譁ー繧定。後↑縺」縺溘→縺阪?謇ソ隱咲憾諷九?蛻晄悄蛟、繧抵シ?/span>
355 * 繧キ繧ケ繝?Β險ュ螳壹↓縺励◆縺後▲縺ヲ霑斐@縺セ縺呻シ?/span>
356 *
357 */
358 static certify_t getInitialCertifyStateFromConfig( )
359 {
360 char* certify_item_val;
361 certify_t ret = index::NOT_CERTIFIED;
362
363 if( getConfigValue( XNP_CONFIG_CERTIFY_ITEM_KEY, &certify_item_val ) == RES_OK ){
364 if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_AUTO ) == 0 ){
365 //certify automatic
366 ret = index::CERTIFIED;
367 }else if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_ON ) == 0 ){
368 //certify by moderator or group admin
369 ret = index::CERTIFY_REQUIRED;
370 }
371 freeString( certify_item_val );
372 }
373 return ret;
374 }
375
376 /**
377 *
378 * 繧サ繝?す繝ァ繝ウ縺ォ蟇セ蠢應サ倥¢繧峨l縺溘Θ繝シ繧カ縺鯉シ訓latform繝ヲ繝シ繧カ縺ィ縺励※Activate縺?/span>
379 * 繧後※縺?k縺九r霑斐☆
380 *
381 * @param sid 繧サ繝?す繝ァ繝ウID
382 * @return true Activate縺輔l縺ヲ縺?k
383 * @return false Activate縺輔l縺ヲ縺?k?後∪縺溘?繧ィ繝ゥ繝シ
384 *
385 */
386 static bool isActivatedBySession( sessionid_t sid )
387 {
388 const session_t* session;
389 if( getSession( sid, &session ) == RES_OK ){
390 userid_t sess_uid = session -> getUID( );
391 freeSession( session );
392 return isActivated( sid, sess_uid );
393 }
394 return false;
395 }
396
397 /**
398 *
399 * 繧サ繝?す繝ァ繝ウ縺ォ蟇セ蠢應サ倥¢繧峨l縺溘Θ繝シ繧カ縺鯉シ後Δ繝?Ξ繝シ繧ソ縺ァ縺ゅk縺具シ?/span>
400 *
401 *
402 * @param sid 繧サ繝?す繝ァ繝ウID
403 * @return true 繝「繝?Ξ繝シ繧ソ
404 * @return false 繝「繝?Ξ繝シ繧ソ縺ァ縺ェ縺?シ後∪縺溘?繧ィ繝ゥ繝シ
405 *
406 */
407 static bool isModeratorBySession( sessionid_t sid )
408 {
409 const session_t* session;
410 if( getSession( sid, &session ) == RES_OK ){
411 userid_t sess_uid = session -> getUID( );
412 freeSession( session );
413 return isModerator( sid, sess_uid );
414 }
415 return false;
416 }
417
418
419
420
421 /** SQL繧貞ョ溯。後☆繧九?らオ先棡縺ッ謐ィ縺ヲ繧九??/span>
422 * @param sql sql
423 * @return result_t
424 */
425 static result_t querySimple( const char *functionName, string &sql ){
426 result_t ret = RES_ERROR;
427 SQLRETURN sqlcode;
428 SQLHANDLE hstmt = NULL;
429 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
430 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
431 ret = RES_OK;
432 }else{
433 string s( "SQLExecDirect in querySimple " );
434 s += functionName;
435 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
436 s += "sql=";
437 s += sql;
438 setLastErrorString( s.c_str( ) );
439 ret = RES_DB_QUERY_ERROR;
440 }
441 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
442 }
443 else {
444 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in querySimple " );
445 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
446 setLastErrorString( s.c_str( ) );
447 ret = RES_ERROR;
448 }
449 return ret;
450 }
451
452 /** SQL繧貞ョ溯。後@縲?陦檎岼縺ョ譛?蛻昴?謨エ謨ー蛟、(NULL縺ェ繧?縺ィ縺ソ縺ェ縺?縺ョ縺ソ蜿励¢蜿悶k縲?/span>
453 * @param sql sql
454 * @param u 謨エ謨ー蛟、繧貞女縺大叙繧句、画焚縲?/span>
455 * @return result_t
456 */
457 static result_t queryGetUnsignedInt( const char *functionName, string &sql, unsigned int *u ){
458 result_t ret = RES_ERROR;
459 SQLRETURN sqlcode;
460 SQLHANDLE hstmt = NULL;
461
462 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
463 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
464 SQLUINTEGER sInt = 0;
465 SQLLEN len = 0;
466 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sInt, 0, &len );
467 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
468 if ( len == SQL_NULL_DATA )
469 sInt = 0;
470 *u = sInt;
471 ret = RES_OK;
472 }else{
473 string s( "SQLFetch in queryGetUnsignedInt " );
474 s += functionName;
475 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
476 setLastErrorString( s.c_str( ) );
477 ret = RES_ERROR;
478 }
479 }else{
480 string s( "SQLExecDirect in queryGetUnsignedInt " );
481 s += functionName;
482 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
483 s += "sql=";
484 s += sql;
485 setLastErrorString( s.c_str( ) );
486 ret = RES_DB_QUERY_ERROR;
487 }
488 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
489 }
490 else {
491 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in queryGetUnsignedInt " );
492 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
493 setLastErrorString( s.c_str( ) );
494 ret = RES_ERROR;
495 }
496 return ret;
497 }
498
499 /**
500 *
501 * 譁?ュ怜?繧ウ繝斐???/span>
502 * 謖?ョ壽枚蟄玲焚繧偵さ繝斐?縺暦シ後ヰ繝?ヵ繧。縺ョ譛?蠕後rNULL邨らォッ縺吶k??/span>
503 * ( dst縺ョ繧オ繧、繧コ >= len + 1 )縺ァ縺ゅk縺薙→
504 *
505 */
506 static char* strncpy2( char* dst, const char* src, int len )
507 {
508 strncpy( dst, src, len );
509 dst[ len ] = '\0';
510 syslog_printf( "\nstrncpy2 '%s'\n", dst );
511 return dst;
512 }
513
514 /**
515 *
516 * SQL縺ョ螳溯。檎オ先棡縺九i繧ィ繝ゥ繝シ譁?ュ怜?繧堤函謌舌☆繧?/span>
517 *
518 * @param hstmt SQL譁??繝上Φ繝峨Ν
519 * @param sqlcode SQLExecDirect,SQLExecute縺ョ謌サ繧雁?、
520 * @return 繧ィ繝ゥ繝シ譁?ュ怜?
521 */
522 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
523 {
524 string s;
525 if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
526 SQLCHAR SQLState[6];
527 SQLINTEGER NativeError;
528 SQLCHAR MessageText[ 1024 ];
529 SQLSMALLINT TextLength;
530 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
531
532 s += string( (char*)MessageText );
533 s += " SQLSTATE=";
534 s += string( (char*)SQLState );
535
536 }
537 s += " sqlcode=";
538 s += intToString( sqlcode );
539 return s;
540 }
541
542 /**
543 *
544 * 謖?ョ壹き繝ゥ繝?縺ョ蛟、繧貞叙繧雁?縺励※縺昴?譁?ュ怜?繧定ソ斐☆
545 *
546 */
547 string getResultCol( SQLHANDLE hstmt, int col )
548 {
549 string s;
550 SQLRETURN sqlcode;
551 SQLCHAR BinaryPtr[5000];
552 SQLLEN BinaryLenOrInd;
553 SQLINTEGER NumBytes;
554
555 while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr),
556 &BinaryLenOrInd)) != SQL_NO_DATA) {
557 NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
558 if( NumBytes >= 0 ){
559 s += string( (char*)BinaryPtr, NumBytes );
560 }
561 }
562 #ifdef USE_SYSLOG
563 // openlog( "commonal", LOG_ODELAY, LOG_USER );
564 // syslog( LOG_DEBUG, "getResultCol col=%d ret='%s'\n", col, s.c_str());
565 // closelog( );
566 #endif
567 return s;
568 }
569
570
571 /**
572 *
573 * 繧ッ繧ゥ繝シ繝医↑縺ゥ繧箪險伜捷縺ァ繧ィ繧ケ繧ア繝シ繝励☆繧?/span>
574 *
575 * @param str addslashes縺吶∋縺肴枚蟄怜?縲?ULL謖?ョ壻ク榊庄縲?/span>
576 * @return 螟画鋤蠕後?譁?ュ怜?
577 */
578 string addSlashes( const char *str )
579 {
580 if ( hdbc == NULL ){
581 string s;
582 return s;
583 }else{
584 string s( str );
585 return s;
586 }
587
588 int len = strlen(str) * 3;
589 char* dst = new char[ len ];
590 const char* from = str;
591 char* to = dst;
592 while( *from != '\0' ){
593 switch( *from ){
594 case '\'':
595 case '\"':
596 case ';':
597 *to = '\\'; to++;
598 break;
599 }
600 *to = *from; to++;
601 from++;
602 }
603 *to = '\0';
604 string s( dst );
605 delete[] dst;
606 return s;
607 }
608
609 /** Xoops Module 縺ョ險ュ螳壹r隱ソ縺ケ繧?/span>
610 * @param module 繝「繧ク繝・繝シ繝ォ縺ョdirname
611 * @param key 險ュ螳壹?key
612 * @param value 險ュ螳壹r霑斐☆螟画焚縲?/span>
613 * @return
614 */
615 static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value ){
616 SQLRETURN sqlcode;
617 SQLHANDLE hstmt = NULL;
618 result_t result = RES_ERROR;
619
620 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
621 string sql = "SELECT conf_value "
622 " from " + dbprefix + "_config as tc, " + dbprefix + "_modules as tm "
623 " where tm.mid=tc.conf_modid and tm.dirname = ? and tc.conf_name = ? ";
624 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
625 SQLLEN cbModule = SQL_NTS, cbKey = SQL_NTS;
626 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(module), 0, (SQLCHAR *)module, 0, &cbModule );
627 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(key), 0, (SQLCHAR *)key, 0, &cbKey );
628 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
629 if ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
630 string s = getResultCol( hstmt, 1 );
631 *value = new char[s.length()+1];
632 strcpy( *value, s.c_str() );
633 result = RES_OK;
634 }
635 else if ( sqlcode == SQL_NO_DATA ){
636 *value = 0;
637 result = RES_OK;
638 }
639 else {
640 string s( "SQLFetch in getXoopsModuleConfig " );
641 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
642 s += "sql=";
643 s += sql;
644 setLastErrorString( s.c_str( ) );
645 result = RES_ERROR;
646 }
647 }else{
648 string s( "SQLExecDirect in getXoopsModuleConfig " );
649 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
650 s += "sql=";
651 s += sql;
652 setLastErrorString( s.c_str( ) );
653 result = RES_DB_QUERY_ERROR;
654 }
655 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
656 }
657 else {
658 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getXoopsModuleConfig " );
659 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
660 setLastErrorString( s.c_str( ) );
661 result = RES_ERROR;
662 }
663 return result;
664 }
665
666 /** 繧イ繧ケ繝医Θ繝シ繧カ縺傾ooNiPs縺ョPublic縺ェ繧「繧、繝?Β繧定ヲ九k縺薙→縺後〒縺阪k縺九←縺?°繧定ソ斐☆縲?/span>
667 */
668 static bool isGuestEnabled(){
669 char *value = 0;
670 result_t result = getXoopsModuleConfigValue( "xnpaccount", "public_item_target_user", &value );
671 if ( result != RES_OK )
672 return false;
673 if ( value == 0 )
674 return false;
675 bool enabled = ( strcmp( value, "all" ) == 0 );
676 freeString( value );
677 return enabled;
678 }
679
680 /** sid縺九iuid繧貞セ励k縲?/span>
681 * @param sid session id
682 * @param uid uid繧貞女縺大叙繧句、画焚
683 * @return RES_OK
684 * sid縺ッ譛牙柑縺ェsessionid縺ァ縺ゅk縲ゅ%縺ョ蝣エ蜷?uid縺ォ縺ッ譛牙柑縺ェuid縺悟?繧九??/span>
685 * 縺ゅk縺??縲∝?髢九い繧、繝?Β繧帝撼XooNiPs繝ヲ繝シ繧カ縺ォ蜈ャ髢 縺九▽sid縺茎ession::SID_GUEST(=0)縺ァ縺ゅk縲ゅ%縺ョ蝣エ蜷医??uid縺ォ縺ッaccount::UID_GUEST(=0)縺悟?繧九??/span>
686 * @return 縺昴?莉 繧ィ繝ゥ繝シ
687 */
688 static result_t sessionID2UID( sessionid_t sid, userid_t *uid ){
689 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
690
691 if ( sid == session::SID_GUEST ){
692 if ( isGuestEnabled() ){
693 *uid = account::UID_GUEST;
694 return RES_OK;
695 }
696 return RES_NO_SUCH_SESSION;
697 }
698 else {
699 string sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_session WHERE sid=" + unsignedIntToString(sid);
700 return queryGetUnsignedInt( "sessionID2UID", sql, uid );
701 }
702 }
703
704
705
706 /**
707 *
708 * gid縺ョ蟄伜惠繧偵メ繧ァ繝?け.
709 * DB縺ョ繧「繧ッ繧サ繧ケ螟ア謨励↑縺ゥ繧Galse縺ィ縺ェ繧具シ?/span>
710 *
711 * @param gid 繝√ぉ繝?け縺励◆縺ЖID
712 * @return true 蟄伜惠縺吶k
713 * @return false 蟄伜惠縺励↑縺?/span>
714 *
715 */
716 static bool gidExists( groupid_t gid )
717 {
718 string sql;
719 SQLRETURN sqlcode;
720 SQLHANDLE hstmt = NULL;
721
722 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
723 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
724 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
725 setLastErrorString( s.c_str( ) );
726 return false;
727 }
728
729 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups ";
730 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
731 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
732 setLastErrorString( "SQLExecDirect in gidExists" );
733 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
734 return false;
735 }
736
737 if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
738 setLastErrorString( "SQLFetch in gidExists" );
739 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
740 return false;
741 }
742
743 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
744 return true;
745 }
746
747
748 /**
749 *
750 * Platform繝ヲ繝シ繧カ諠??ア縺ォuid縺悟ュ伜惠縺吶k縺九r繝√ぉ繝?け.
751 * DB縺ョ繧「繧ッ繧サ繧ケ螟ア謨励↑縺ゥ繧Galse縺ィ縺ェ繧具シ?/span>
752 *
753 * @param uid 繝√ぉ繝?け縺励◆縺ФID
754 * @return true 蟄伜惠縺吶k
755 * @return false 蟄伜惠縺励↑縺?/span>
756 *
757 */
758 static bool uidExists( userid_t uid )
759 {
760 bool ret = false;
761 string sql;
762 SQLRETURN sqlcode;
763
764 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
765 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
766 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
767 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
768 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
769 ret = true;
770 }else{
771 string s( "SQLFetch in uidExists ");
772 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
773 s += string( ", sql=" ) + string( sql );
774 setLastErrorString( s.c_str( ) );
775 ret = false;
776 }
777 }else{
778 string s( "SQLExecDirect in uidExists ");
779 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
780 s += string( ", sql=" ) + string( sql );
781 setLastErrorString( s.c_str( ) );
782 ret = false;
783 }
784 }else{
785 string s( "SQLAllocHandle in uidExists ");
786 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
787 setLastErrorString( s.c_str( ) );
788 ret = false;
789 }
790 return ret;
791 }
792
793
794 /**
795 *
796 * criteria 繧 SQL縺ォ螟画鋤縺吶k
797 *
798 *
799 *
800 */
801 string criteria2str( criteria* cri )
802 {
803 string sql;
804
805 const orderby* odrby = cri -> headOrderBy( );
806 if( odrby != 0 ){
807 sql += " ORDER BY " + string( odrby -> getColumn( ) );
808 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
809 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
810 sql += ", " + string( odrby -> getColumn( ) );
811 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
812 }
813 }
814
815 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
816 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
817 + ", " + string( intToString( cri -> getLimitRows( ) ) );
818 }
819 return sql;
820 }
821
822
823 /**
824 *
825 * 繝??繧ソ繝吶?繧ケ縺ョ蛻晄悄蛹?/span>
826 *
827 * @param dsn DSN
828 * @param user 繝??繧ソ繝吶?繧ケ縺ォ繧「繧ッ繧サ繧ケ縺吶k繝ヲ繝シ繧カ蜷?/span>
829 * @param password 荳願ィ倥Θ繝シ繧カ縺ョ繝代せ繝ッ繝シ繝?/span>
830 * @param dbname 繝?繝溘?
831 * @param prefix XOOPS繝??繧ソ繝吶?繧ケ繝??繝悶Ν縺ョPREFIX
832 * @param dbtype DBTYPE_MYSQL or DBTYPE_SQLITE
833 * @return RES_OK
834 * @return RES_DB_INITIALIZE_ERROR
835 * @return RES_DB_CONNECT_ERROR
836 * @refer result_t
837 */
838 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix, dbtype_t type )
839 {
840 SQLRETURN sqlcode;
841
842 #ifdef USE_SYSLOG
843 openlog( "commonal", LOG_ODELAY, LOG_USER );
844 #endif
845 // 譌「縺ォ謗・邯壻クュ縺ェ繧峨?∽ク?譌ヲ蛻?妙
846 if ( hdbc != NULL )
847 SQLDisconnect( hdbc );
848
849 dbprefix = prefix;
850 dbtype = type;
851
852 // 蛻晄悄蛹悶→謗・邯?/span>
853 // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
854 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ) != SQL_SUCCESS ) {
855 string s( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
856 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
857 setLastErrorString( s.c_str( ) );
858 #ifdef USE_SYSLOG
859 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
860 closelog( );
861 #endif
862 return RES_DB_INITIALIZE_ERROR;
863 }
864 //ODBC Ver.3 縺ィ縺励※謖ッ闊槭≧繧医≧縺ォ螻樊?ァ繧定ィュ螳?/span>
865 SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
866
867 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
868 string s( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
869 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
870 setLastErrorString( s.c_str( ) );
871 #ifdef USE_SYSLOG
872 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
873 closelog( );
874 #endif
875 return RES_DB_INITIALIZE_ERROR;
876 }
877 //繝ュ繧ー繧、繝ウ縺ォ5遘剃サ・荳願ヲ√@縺溘i繧ソ繧、繝?繧「繧ヲ繝医☆繧玖ィュ螳?/span>
878 SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
879
880 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
881 string s( "SQLConnect in initializeDB " );
882 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
883 setLastErrorString( s.c_str( ) );
884 #ifdef USE_SYSLOG
885 syslog( LOG_DEBUG, "initializeDB %s", getLastErrorString( ) );
886 closelog( );
887 #endif
888 return RES_DB_CONNECT_ERROR;
889 }
890 #ifdef USE_SYSLOG
891 syslog( LOG_DEBUG, "initializeDB succeed" );
892 closelog( );
893 #endif
894 return RES_OK;
895 }
896
897 /**
898 *
899 * DB謗・邯壹′縺ゅl縺ー縲√◎繧後r髢区叛縺吶k縲?/span>
900 *
901 * @param 縺ェ縺?/span>
902 * @return RES_OK
903 */
904 result_t uninitializeDB()
905 {
906 if ( hdbc != NULL ){
907 SQLDisconnect( hdbc );
908 hdbc = NULL;
909 }
910 return RES_OK;
911 }
912
913 /**
914 *
915 * Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句叙蠕?/span>
916 *
917 * @param sid 繧サ繝?す繝ァ繝ウID
918 * @param uid 迥カ諷九r蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID
919 * @return true 謇ソ隱肴ク医∩
920 * @return false 譛ェ謇ソ隱?/span>
921 *
922 */
923 bool isActivated( sessionid_t sid, userid_t uid )
924 {
925 if( hdbc == NULL ) return false;
926 if( !isValidSessionID( sid ) ) return false;
927
928 bool ret = false;
929 string sql;
930 SQLRETURN sqlcode;
931 SQLHANDLE hstmt = NULL;
932
933 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users ";
934 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
935 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
936 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
937 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
938 ret = true;
939 }else{
940 string s( "SQLFetch in isActivated " );
941 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
942 s += ", sql=" + sql;
943 setLastErrorString( s.c_str() );
944 ret = false;
945 }
946 }else{
947 string s( "SQLExecDirect in isActivated " );
948 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
949 s += ", sql=" + sql;
950 setLastErrorString( s.c_str() );
951 ret = false;
952 }
953 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
954 }else{
955 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
956 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
957 setLastErrorString( s.c_str( ) );
958 ret = false;
959 }
960 return ret;
961 }
962
963 /**
964 *
965 * Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句、画峩
966 *
967 * @param sid 繧サ繝?す繝ァ繝ウID
968 * @param uid 螟画峩縺励◆縺?Θ繝シ繧カ縺ョUID
969 * @param activate 謇ソ隱?true) / 譛ェ謇ソ隱?false)縺ョ謖?ョ?/span>
970 * @return RES_OK
971 * @return RES_DB_QUERY_ERROR
972 * @return RES_NO_SUCH_USER
973 */
974 result_t activate( sessionid_t sid, userid_t uid, bool activate )
975 {
976 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
977 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
978
979 string sql;
980 SQLRETURN sqlcode;
981 result_t ret = RES_ERROR;
982
983 sql = "UPDATE " + dbprefix + "_xnpaccount_users ";
984 sql += "SET activate=" + string( activate ? "1" : "0" );
985 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
986 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
987 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
988 SQLLEN count = 0;
989 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
990 ret = RES_OK;
991 }else{
992 string s( "SQLRowCount in activate ");
993 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
994 s += string( ", sql=" ) + string( sql );
995 setLastErrorString( s.c_str( ) );
996 ret = RES_NO_SUCH_USER;
997 }
998 }else{
999 string s( "SQLExecDirect in activate " );
1000 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1001 s += ", sql=";
1002 s += string( sql );
1003 setLastErrorString( s.c_str( ) );
1004 ret = RES_DB_QUERY_ERROR;
1005 }
1006 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1007 }else{
1008 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
1009 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1010 setLastErrorString( s.c_str( ) );
1011 ret = RES_ERROR;
1012 }
1013 return ret;
1014 }
1015
1016 /**
1017 *
1018 * 繧「繧ォ繧ヲ繝ウ繝域焚繧貞叙蠕励☆繧具シ?/span>
1019 *
1020 * @param sid 繧サ繝?す繝ァ繝ウID
1021 * @return 繧「繧ォ繧ヲ繝ウ繝域焚
1022 *
1023 */
1024 int getAccountCount( sessionid_t sid )
1025 {
1026 if( hdbc == NULL ) return 0;
1027 if( !isValidSessionID( sid ) ) return 0;
1028
1029 int ret = 0;
1030 string sql;
1031 SQLRETURN sqlcode;
1032 SQLHANDLE hstmt = NULL;
1033
1034 //繧「繧ォ繧ヲ繝ウ繝域焚繧呈アゅa繧?/span>
1035 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_users ";
1036 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1037 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1038 SQLUINTEGER count = 0;
1039 SQLLEN len = 0;
1040 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1041 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1042 ret = count;
1043 }else {
1044 string s( "SQLFetch in getAccountCount sql=" );
1045 s += string( sql );
1046 setLastErrorString( s.c_str( ) );
1047 ret = 0;
1048 }
1049 }else{
1050 setLastErrorString( "SQLExecDirect in getAccountCount" );
1051 ret = 0;
1052 }
1053 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1054 }else{
1055 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
1056 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1057 setLastErrorString( s.c_str( ) );
1058 ret = 0;
1059 }
1060 return ret;
1061 }
1062
1063 /**
1064 *
1065 * 繧「繧ォ繧ヲ繝ウ繝亥炎髯、
1066 * 繧ー繝ォ繝シ繝励°繧峨?蜑企勁縺ィ繝ヲ繝シ繧カ諠??ア縺ョ蜑企勁繧定。後↑縺?∪縺呻シ?/span>
1067 *
1068 * @param
1069 * @return RES_OK
1070 * @return RES_ERROR
1071 * @return RES_DB_NOT_INITIALIZED
1072 * @return RES_NO_SUCH_SESSION
1073 * @return RES_DB_QUERY_ERROR
1074 *
1075 */
1076 result_t deleteAccount( sessionid_t sid, userid_t uid )
1077 {
1078 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1079 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1080
1081 result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
1082 criteria_t c;
1083 string sql;
1084 groupid_t* gids;
1085 int gidsLen;
1086 SQLRETURN sqlcode;
1087 SQLHANDLE hstmt = NULL;
1088
1089 /*
1090 1. delete user from default platform group
1091 2. delete user profile from xoops_users
1092 3. delete platform user from xnpaccount_users
1093 */
1094
1095 //1. delete user from platform groups
1096 c.clearAll();
1097 if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
1098 for( int i = 0; i < gidsLen; i++ )
1099 deleteMemberNoLimit( sid, gids[ i ], uid );
1100 freeGID( gids );
1101 }
1102
1103 //2. delete user profile from xoops_users
1104 sql = "DELETE FROM " + dbprefix + "_users ";
1105 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1106 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1107 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1108 SQLLEN count = 0;
1109 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1110 ret1 = RES_OK;
1111 }else{
1112 string s( "SQLRowCount in deleteAccount" );
1113 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1114 s += string( ", sql=" ) + string( sql );
1115 setLastErrorString( s.c_str( ) );
1116 ret1 = RES_NO_SUCH_USER;
1117 }
1118 }else{
1119 string s( "SQLExecDirect in deleteAccount" );
1120 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1121 s += ", sql=";
1122 s += string( sql );
1123 setLastErrorString( s.c_str( ) );
1124 ret1 = RES_DB_QUERY_ERROR;
1125 }
1126 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1127 }else{
1128 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1129 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1130 setLastErrorString( s.c_str( ) );
1131 ret1 = RES_ERROR;
1132 }
1133
1134 //3. delete platform user from xnpaccount_users
1135 sql = "DELETE FROM " + dbprefix + "_xnpaccount_users ";
1136 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1137 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1138 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1139 SQLLEN count = 0;
1140 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1141 ret2 = RES_OK;
1142 }else{
1143 string s( "SQLRowCount in deleteAccount" );
1144 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1145 s += string( ", sql=" ) + string( sql );
1146 setLastErrorString( s.c_str( ) );
1147 ret2 = RES_NO_SUCH_USER;
1148 }
1149 }else{
1150 string s( "SQLExecDirect in deleteAccount" );
1151 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1152 s += ", sql=";
1153 s += string( sql );
1154 setLastErrorString( s.c_str( ) );
1155 ret2 = RES_DB_QUERY_ERROR;
1156 }
1157 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1158 }else{
1159 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1160 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1161 setLastErrorString( s.c_str( ) );
1162 ret2 = RES_ERROR;
1163 }
1164
1165 //荳?譁ケ縺ァ繧ゅお繝ゥ繝シ縺ェ繧峨お繝ゥ繝シ繧定ソ斐☆
1166 return ret1 != RES_OK ? ret1 : ret2;
1167 }
1168
1169 /**
1170 *
1171 * 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア蜿門セ?/span>
1172 *
1173 * @param sid 繧サ繝?す繝ァ繝ウID
1174 * @param uid 蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID
1175 * @param acc 蜿門セ励@縺溘い繧ォ繧ヲ繝ウ繝域ュ蝣ア(account_t)縺ョ繝昴う繝ウ繧ソ繧呈嶌縺崎セシ繧?蠑墓焚
1176 * @return RES_OK
1177 * @return RES_DB_NOT_INITIALIZED
1178 * @return RES_NO_SUCH_USER
1179 * @return RES_NO_SUCH_SESSION
1180 * @return RES_DB_QUERY_ERROR
1181 *
1182 */
1183 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
1184 {
1185 int len;
1186 static criteria c;
1187 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
1188 if( len == 0 ) return RES_NO_SUCH_USER;
1189 return res;
1190 }
1191
1192 /**
1193 *
1194 * 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア蜿門セ?/span>
1195 *
1196 * @param sid 繧サ繝?す繝ァ繝ウID
1197 * @param uids 蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID縺ョ驟榊?
1198 * @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー
1199 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
1200 * @param accounts 讀懃エ「邨先棡縺ョ驟榊?縺ョ繝昴う繝ウ繧ソ繧呈嶌縺崎セシ繧?蠑墓焚
1201 * @param accountsLen 讀懃エ「邨先棡縺ョ謨ー(驟榊?*accounts縺ョ隕∫エ?謨ー)
1202 * @return RES_OK
1203 * @return RES_DB_NOT_INITIALIZED
1204 * @return RES_NO_SUCH_SESSION
1205 * @return RES_DB_QUERY_ERROR
1206 *
1207 */
1208 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
1209 {
1210 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1211 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1212 if( uidsLen <= 0 ){
1213 *accounts = new account_t[ 0 ];
1214 *accountsLen = 0;
1215 #ifdef USE_SYSLOG
1216 openlog( "commonal", LOG_ODELAY, LOG_USER );
1217 syslog( LOG_DEBUG, "getAccounts succeed len=0" );
1218 closelog( );
1219 #endif
1220 return RES_OK;
1221 }
1222
1223 #ifdef USE_SYSLOG
1224 openlog( "commonal", LOG_ODELAY, LOG_USER );
1225 syslog( LOG_DEBUG, "begin of getAccounts" );
1226 #endif
1227 result_t ret = RES_ERROR;
1228 SQLRETURN sqlcode;
1229 SQLHANDLE hstmt = NULL;
1230 string sql;
1231 account_t* dst = new account_t[ uidsLen ];
1232
1233 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 ";
1234 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_xnpaccount_users AS u2 ";
1235 sql += "WHERE u1.uid = u2.uid ";
1236 if( uidsLen > 0 ){
1237 #ifdef USE_SYSLOG
1238 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", 0, uids[0] );
1239 #endif
1240 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
1241 for( int i = 1; i < uidsLen; i++ ){
1242 #ifdef USE_SYSLOG
1243 syslog( LOG_DEBUG, "set uid[%d] value=%d to ...", i, uids[i] );
1244 #endif
1245 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
1246 }
1247 sql += " ) ";
1248 }
1249 sql += criteria2str( cri );
1250 #ifdef USE_SYSLOG
1251 syslog( LOG_DEBUG, "sql=%s", sql.c_str() );
1252 #endif
1253
1254 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1255 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1256 SQLLEN len = 0;
1257 userid_t uid = 0;
1258 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1259 *accountsLen=0;
1260 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
1261 dst[ i ].setUID( uid );
1262 dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
1263 dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
1264 dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
1265 dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
1266 dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
1267 dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
1268 dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
1269 dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
1270 dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
1271 dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
1272 dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
1273 dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
1274 dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
1275 dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
1276 dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
1277 dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
1278 dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
1279 dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
1280 dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
1281 dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
1282 dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
1283 dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
1284 dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
1285 dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
1286 dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
1287 dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
1288 dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
1289 dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
1290 dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
1291 dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
1292 dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
1293 dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
1294 dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
1295 dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
1296 dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
1297 dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
1298 dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
1299 dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
1300 dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 40 ).c_str() ));
1301 dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 41 ).c_str() ));
1302 dst[ i ].setPrivateIndexID( atoi( getResultCol( hstmt, 42 ).c_str() ));
1303 #ifdef USE_SYSLOG
1304 syslog( LOG_DEBUG, "set to account_t %d", i );
1305 #endif
1306 ( *accountsLen )++;
1307 }
1308 *accounts = dst;
1309 #ifdef USE_SYSLOG
1310 syslog( LOG_DEBUG, "getAccounts succeed" );
1311 #endif
1312 ret = RES_OK;
1313 }else{
1314 string s( "SQLExecDirect in getAccounts" );
1315 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1316 s += string( ", sql=" ) + string( sql );
1317 setLastErrorString( s.c_str( ) );
1318 #ifdef USE_SYSLOG
1319 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
1320 #endif
1321 ret = RES_DB_QUERY_ERROR;
1322 }
1323 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1324 }else{
1325 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
1326 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1327 setLastErrorString( s.c_str( ) );
1328 #ifdef USE_SYSLOG
1329 syslog( LOG_DEBUG, "getAccounts %s", getLastErrorString( ) );
1330 #endif
1331 ret = RES_DB_QUERY_ERROR;
1332 }
1333 #ifdef USE_SYSLOG
1334 closelog( );
1335 #endif
1336 return ret;
1337 }
1338
1339 /**
1340 *
1341 * 繧「繧ォ繧ヲ繝ウ繝育匳骭イ.
1342 *
1343 * 繝ヲ繝シ繧カ諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ逋サ骭イ縺励∪縺呻シ?/span>
1344 * 逋サ骭イ縺励◆繝ヲ繝シ繧カ諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID繧置id縺ォ譬シ邏阪@縺セ縺呻シ?/span>
1345 *
1346 * @param sid 繧サ繝?す繝ァ繝ウ
1347 * @param account 逋サ骭イ縺吶k繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア
1348 * @param uid 逋サ骭イ縺励◆繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID
1349 * @return RES_OK
1350 * @return RES_NO_SUCH_SESSION
1351 * @return RES_DB_QUERY_ERROR
1352 * @return RES_DB_NOT_INITIALIZED
1353 *
1354 */
1355 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
1356 {
1357 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1358 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1359
1360 string sql;
1361 string tmp;
1362 SQLRETURN sqlcode;
1363 result_t ret = RES_ERROR;
1364
1365 /*
1366 1. insert user profile into xoops_users
1367 2. insert platform user profile into xnpaccount_users
1368 3. add user to default platform group
1369 4. create private index
1370 5. update account set private_index_id=...
1371 */
1372
1373 //1.xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧?
1374 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];
1375 SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1376 SQLDOUBLE timezone_offset;
1377
1378 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;
1379 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;
1380
1381 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1382 string sql;
1383 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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
1384 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1385 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1386 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1387 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1388 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1389 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1390 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1391 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1392 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1393 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1394 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1395 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1396 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1397 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1398 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1399 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1400 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1401 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1402 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1403 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1404 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1405 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1406 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1407 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1408 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1409 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1410 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1411 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1412 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1413 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1414 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1415 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1416
1417 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1418 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1419 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1420 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1421 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1422 user_regdate = time( NULL );
1423 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1424 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1425 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1426 user_viewemail = account -> getUserViewemail( );
1427 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1428 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1429 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1430 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1431 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1432 posts = account -> getPosts( );
1433 attachsig = account -> getAttachsig( );
1434 rank = account -> getRank( );
1435 level = account -> getLevel( );
1436 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1437 timezone_offset = account -> getTimezoneOffset( );
1438 last_login = 0;
1439 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1440 uorder = account -> getUorder( );
1441 notify_method = account -> getNotifyMethod( );
1442 notify_mode = account -> getNotifyMode( );
1443 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1444 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1445 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1446 user_mailok = account -> getUserMailok( );
1447
1448 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1449 SQLLEN count = 0;
1450 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1451 //繝ヲ繝シ繧カID繧貞叙蠕励☆繧?/span>
1452 sql = "SELECT LAST_INSERT_ID()";
1453 ret = queryGetUnsignedInt( "insertAccount", sql, (unsigned int*)uid );
1454 }else{
1455 string s( "SQLRowCount in insertAccount sql=" );
1456 s += string( sql );
1457 setLastErrorString( s.c_str( ) );
1458 ret = RES_DB_QUERY_ERROR;
1459 }
1460 }else{
1461 string s( "SQLExecute in insertAccount " );
1462 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1463 setLastErrorString( s.c_str( ) );
1464 ret = RES_DB_QUERY_ERROR;
1465 }
1466 }else{
1467 string s( "SQLPrepare in insertAccount " );
1468 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1469 setLastErrorString( s.c_str( ) );
1470 ret = RES_ERROR;
1471 }
1472 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1473 }else{
1474 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1475 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1476 setLastErrorString( s.c_str( ) );
1477 ret = RES_ERROR;
1478 }
1479
1480 if( ret == RES_OK ){
1481 //2.xnpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧呈嶌縺崎セシ繧?
1482 SQLUINTEGER activate;
1483 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1484 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1485 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1486 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1487 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1488 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1489 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1490 SQLLEN cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS;
1491 SQLLEN cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0;
1492 SQLUINTEGER notice_mail;
1493 SQLUINTEGER notice_mail_since;
1494 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1495 string sql;
1496 sql = "INSERT INTO " + dbprefix + "_xnpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1497 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1498 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1499 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1500 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1501 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1502 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1503 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1504 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1505 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1506 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1507 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1508 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1509 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1510
1511 activate = account -> getActivate() ? 1 : 0;
1512 strncpy2( (char*)address, account -> getAddress(), XNP_ACCOUNT_ADDRESS_LEN );
1513 strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1514 strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1515 strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1516 strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1517 strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1518 strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1519 notice_mail = account -> getNoticeMail( );
1520 notice_mail_since = account -> getNoticeMailSince( );
1521
1522 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1523 SQLLEN count = 0;
1524 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1525 ret = RES_OK;
1526 if( ret == RES_OK ){
1527 //3.add new user to default group(not a group admin)
1528 ret = insertMember( sid, group_t::GID_DEFAULT, *uid, false );
1529 }else{
1530 //xoops_users縺クinsert縺励◆繝ャ繧ウ繝シ繝峨r蜑企勁縺吶k
1531 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1532 sql += unsignedIntToString( *uid );
1533 SQLHANDLE hstmt2 = NULL;
1534 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1535 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1536 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1537 }
1538 setLastErrorString( "insertMember in insertAccount" );
1539 ret = RES_DB_QUERY_ERROR;
1540 }
1541 }else{
1542 string s( "SQLRowCount in insertAccount sql=" );
1543 s += string( sql );
1544 setLastErrorString( s.c_str( ) );
1545 ret = RES_DB_QUERY_ERROR;
1546 }
1547 }else{
1548 string s( "SQLExecute in insertAccount " );
1549 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1550 setLastErrorString( s.c_str( ) );
1551 ret = RES_DB_QUERY_ERROR;
1552 }
1553 }else{
1554 //xoops_users縺クinsert縺励◆繝ャ繧ウ繝シ繝峨r蜑企勁縺吶k
1555 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1556 sql += unsignedIntToString( *uid );
1557 SQLHANDLE hstmt2 = NULL;
1558 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1559 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1560 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1561 }
1562 string s( "SQLExecDirect in insertAccount sql=" );
1563 s += string( sql );
1564 setLastErrorString( s.c_str( ) );
1565 ret = RES_DB_QUERY_ERROR;
1566 }
1567 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1568 }else{
1569 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1570 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1571 setLastErrorString( s.c_str( ) );
1572 ret = RES_ERROR;
1573 }
1574 }
1575
1576 if ( ret == RES_OK ){
1577 //4.private index繧剃ス懈?
1578
1579 // private index逕ィ縺ョsort_number逕滓?
1580 string sql = "select min(sort_number) from " +
1581 dbprefix + "_xnpaccount_index where parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
1582 " and open_level=" + unsignedIntToString(index::OL_PRIVATE);
1583 unsigned int sortNumber;
1584 ret = queryGetUnsignedInt( "insertAccount", sql, &sortNumber );
1585 sortNumber--;
1586 if ( ret == RES_OK ){
1587 // private index菴懈?
1588 index_t index;
1589 index.setItemTypeID(item::ITID_INDEX);
1590 index.setContributorUID(*uid);
1591 index.setParentIndexID(item::IID_ROOT);
1592 index.setOwnerUID(*uid);
1593 index.setOpenLevel(index::OL_PRIVATE);
1594 index.setSortNumber(sortNumber);
1595 index.setTitle(account->getUname());
1596 indexid_t privateXID;
1597 ret = insertIndexInternal( sid, &index, &privateXID );
1598 if ( ret == RES_OK ){
1599 // xnpaccuont_users縺ョprivate_index_id縺ョ譖ク縺肴鋤縺?/span>
1600 sql = "UPDATE " + dbprefix + "_xnpaccount_users SET private_index_id="
1601 + unsignedIntToString(privateXID) + " WHERE uid=" + unsignedIntToString(*uid);
1602 ret = querySimple( "insertAccount", sql );
1603 }
1604 }
1605 }
1606
1607 return ret;
1608 }
1609
1610 /**
1611 *
1612 * 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア繧貞、画峩縺吶k.
1613 *
1614 *
1615 * @param sid 繧サ繝?す繝ァ繝ウID
1616 * @param account 螟画峩縺励◆縺?い繧ォ繧ヲ繝ウ繝域ュ蝣ア
1617 * @return RES_OK
1618 * @return RES_DB_NOT_INITIALIZED
1619 * @return RES_NO_SUCH_SESSION
1620 * @return RES_DB_QUERY_ERROR
1621 * @return RES_NO_SUCH_USER
1622 * @return RES_ERROR
1623 *
1624 */
1625 result_t updateAccount( sessionid_t sid, const account_t* account )
1626 {
1627 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1628 if( account == NULL ) return RES_ERROR;
1629 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1630 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1631
1632 SQLRETURN sqlcode;
1633 result_t ret = RES_ERROR;
1634 SQLHANDLE hstmt = NULL;
1635
1636 //xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧?
1637 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];
1638 SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1639 SQLDOUBLE timezone_offset;
1640
1641 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;
1642 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;
1643
1644 SQLUINTEGER activate;
1645 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1646 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1647 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1648 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1649 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1650 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1651 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1652 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;
1653 SQLUINTEGER notice_mail, notice_mail_since;
1654 SQLLEN cbNotice_mail = 0, cbNotice_mail_since = 0;
1655
1656 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1657 string sql;
1658
1659 sql = "UPDATE " + dbprefix + "_users SET ";
1660 sql += "uname=?";
1661 sql += ", name=?";
1662 sql += ", email=?";
1663 sql += ", url=?";
1664 sql += ", user_avatar=?";
1665 sql += ", user_regdate=?";
1666 sql += ", user_icq=?";
1667 sql += ", user_from=?";
1668 sql += ", user_sig=?";
1669 sql += ", user_viewemail=?";
1670 sql += ", actkey=?";
1671 sql += ", user_aim=?";
1672 sql += ", user_yim=?";
1673 sql += ", user_msnm=?";
1674 sql += ", pass=?";
1675 sql += ", posts=?";
1676 sql += ", attachsig=?";
1677 sql += ", rank=?";
1678 sql += ", level=?";
1679 sql += ", theme=?";
1680 sql += ", timezone_offset=?";
1681 sql += ", last_login=?";
1682 sql += ", umode=?";
1683 sql += ", uorder=?";
1684 sql += ", notify_method=?";
1685 sql += ", notify_mode=?";
1686 sql += ", user_occ=?";
1687 sql += ", bio=?";
1688 sql += ", user_intrest=?";
1689 sql += ", user_mailok=? ";
1690 sql += " WHERE uid = ?";
1691
1692 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1693 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1694 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1695 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1696 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1697 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1698 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1699 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1700 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1701 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1702 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1703 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1704 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1705 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1706 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1707 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1708 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1709 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1710 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1711 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1712 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1713 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1714 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1715 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1716 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1717 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1718 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1719 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1720 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1721 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1722 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1723 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1724 SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1725
1726 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1727 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1728 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1729 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1730 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1731 user_regdate = time( NULL );
1732 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1733 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1734 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1735 user_viewemail = account -> getUserViewemail( );
1736 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1737 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1738 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1739 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1740 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1741 posts = account -> getPosts( );
1742 attachsig = account -> getAttachsig( );
1743 rank = account -> getRank( );
1744 level = account -> getLevel( );
1745 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1746 timezone_offset = account -> getTimezoneOffset( );
1747 last_login = 0;
1748 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1749 uorder = account -> getUorder( );
1750 notify_method = account -> getNotifyMethod( );
1751 notify_mode = account -> getNotifyMode( );
1752 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1753 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1754 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1755 user_mailok = account -> getUserMailok( );
1756 uid = account -> getUID( );
1757
1758 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1759 SQLLEN count = 0;
1760 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1761 ret = RES_OK;
1762 }else{
1763 string s( "SQLRowCount in updateAccount sql=" );
1764 s += string( sql );
1765 setLastErrorString( s.c_str( ) );
1766 ret = RES_DB_QUERY_ERROR;
1767 }
1768 }else{
1769 string s( "SQLExecute in updateAccount 1 " );
1770 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1771 setLastErrorString( s.c_str( ) );
1772 ret = RES_DB_QUERY_ERROR;
1773 }
1774 }else{
1775 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1776 ret = RES_ERROR;
1777 }
1778 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1779 hstmt = NULL;
1780 }else{
1781 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1782 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1783 setLastErrorString( s.c_str( ) );
1784 ret = RES_ERROR;
1785 }
1786
1787 if( ret != RES_OK ){
1788 return ret;
1789 }
1790
1791 //xnpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧剃ク頑嶌縺阪☆繧?/span>
1792 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1793 string sql;
1794
1795 sql = "UPDATE " + dbprefix + "_xnpaccount_users SET ";
1796 sql += "activate=?, ";
1797 sql += "address=?, ";
1798 sql += "division=?, ";
1799 sql += "tel=?, ";
1800 sql += "company_name=?, ";
1801 sql += "country=?, ";
1802 sql += "zipcode=?, ";
1803 sql += "fax=?, ";
1804 sql += "notice_mail=?, ";
1805 sql += "notice_mail_since=? ";
1806 sql += "WHERE uid=?";
1807
1808 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1809 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1810 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1811 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1812 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1813 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1814 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1815 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1816 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1817 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1818 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1819 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1820 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1821
1822 activate = account -> getActivate() ? 1 : 0;
1823 strncpy2( (char*)address, account -> getAddress( ) , XNP_ACCOUNT_ADDRESS_LEN );
1824 strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1825 strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1826 strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1827 strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1828 strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1829 strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1830 notice_mail = account -> getNoticeMail( );
1831 notice_mail_since = account -> getNoticeMailSince( );
1832 uid = account -> getUID( );
1833
1834 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1835 SQLLEN count = 0;
1836 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1837 ret = RES_OK;
1838 }else{
1839 string s( "SQLRowCount in updateAccount sql=" );
1840 s += string( sql );
1841 setLastErrorString( s.c_str( ) );
1842 ret = RES_DB_QUERY_ERROR;
1843 }
1844 }else{
1845 string s( "SQLExecute in updateAccount 2 " );
1846 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1847 setLastErrorString( s.c_str( ) );
1848 ret = RES_DB_QUERY_ERROR;
1849 }
1850 }else{
1851 setLastErrorString( "SQLPrepare in updateAccount sql=" );
1852 ret = RES_ERROR;
1853 }
1854 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1855 }else{
1856 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" );
1857 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1858 setLastErrorString( s.c_str( ) );
1859 ret = RES_ERROR;
1860 }
1861 return ret;
1862 }
1863
1864 /**
1865 *
1866 * criteria_t縺ァ謖?ョ壹&繧後◆遽?峇縺ョ繝ヲ繝シ繧カID繧定ソ斐☆.
1867 * 繝ヲ繝シ繧カID縺ョ驟榊?繧堤「コ菫昴@縺ヲ縺昴%縺ォ譖ク縺崎セシ縺ソ?碁?蛻励?繧「繝峨Ξ繧ケ繧?uids縺ォ譖ク縺崎セシ繧?.
1868 * 驟榊?縺ョ繧オ繧、繧コ繧?uidsLen縺ォ譖ク縺崎セシ繧?
1869 *
1870 * @param sid 繧サ繝?す繝ァ繝ウID
1871 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
1872 * @param uids 繝ヲ繝シ繧カ縺ョUID縺ョ驟榊?縺ョ蜃コ蜉帛?
1873 * @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛?
1874 * @return RES_OK
1875 * @return RES_DB_NOT_INITIALIZED
1876 * @return RES_NO_SUCH_SESSION
1877 * @return RES_DB_QUERY_ERROR
1878 *
1879 */
1880 result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen )
1881 {
1882 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1883 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1884
1885 #ifdef USE_SYSLOG
1886 openlog( "commonal", LOG_ODELAY, LOG_USER );
1887 #endif
1888
1889 result_t ret = RES_ERROR;
1890 userid_t* dst = 0;
1891 string sql;
1892 SQLRETURN sqlcode;
1893 SQLLEN count = 0;
1894
1895
1896 sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_users ";
1897 sql += criteria2str( cri );
1898 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
1899 *uidsLen = count;
1900 dst = new userid_t[ *uidsLen ];
1901 *uids = dst;
1902 }else{
1903 return RES_ERROR;
1904 }
1905 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1906 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1907 userid_t uid = 0;
1908 SQLLEN len = 0;
1909 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
1910
1911 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
1912 dst[ i ] = uid;
1913 }
1914
1915 #ifdef USE_SYSLOG
1916 syslog( LOG_DEBUG, "dumpUids succeed" );
1917 #endif
1918 ret = RES_OK;
1919 }else{
1920 string s( "SQLExecDirect in dumpUids " );
1921 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1922 s += "sql=";
1923 s += string( sql );
1924 setLastErrorString( s.c_str( ) );
1925 #ifdef USE_SYSLOG
1926 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1927 #endif
1928 ret = RES_DB_QUERY_ERROR;
1929 }
1930 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1931 }else{
1932 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" );
1933 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1934 setLastErrorString( s.c_str( ) );
1935 #ifdef USE_SYSLOG
1936 syslog( LOG_DEBUG, "dumpUids %s", getLastErrorString( ) );
1937 #endif
1938 ret = RES_ERROR;
1939 }
1940 return ret;
1941 }
1942
1943 /**
1944 *
1945 * 繧ー繝ォ繝シ繝玲焚繧定ソ斐☆.
1946 * 荳肴ュ」縺ェ繧サ繝?す繝ァ繝ウID縺ェ繧?繧定ソ斐☆.
1947 *
1948 * @param sid 繧サ繝?す繝ァ繝ウID
1949 * @return 繧ー繝ォ繝シ繝玲焚
1950 *
1951 */
1952 int getGroupCount( sessionid_t sid )
1953 {
1954 if( hdbc == NULL ) return 0;
1955 if( !isValidSessionID( sid ) ) return 0;
1956
1957 SQLRETURN sqlcode;
1958 SQLHANDLE hstmt = NULL;
1959 string sql;
1960 int ret = 0;
1961
1962 //繧ー繝ォ繝シ繝玲焚繧呈アゅa繧?/span>
1963 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups";
1964 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1965 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1966 SQLUINTEGER count = 0;
1967 SQLLEN len = 0;
1968 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1969 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1970 ret = count;
1971 }else {
1972 string s( "SQLFetch in getGroupCount sql=" );
1973 s += string( sql );
1974 setLastErrorString( s.c_str( ) );
1975 ret = 0;
1976 }
1977 }else{
1978 setLastErrorString( "SQLExecDirect in getGroupCount" );
1979 ret = 0;
1980 }
1981 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1982 }else{
1983 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" );
1984 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1985 setLastErrorString( s.c_str( ) );
1986 ret = 0;
1987 }
1988 return ret;
1989 }
1990
1991 /**
1992 *
1993 * 謇?螻槭げ繝ォ繝シ繝嶺ク?隕ァ蜿門セ?
1994 * 繝ヲ繝シ繧カ縺梧園螻槭@縺ヲ縺?k繧ー繝ォ繝シ繝励?ID繧貞叙蠕励☆繧?/span>
1995 *
1996 * @param sid 繧サ繝?す繝ァ繝ウID
1997 * @param uid 繝ヲ繝シ繧カ縺ョUID
1998 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
1999 * @param gids 繧ー繝ォ繝シ繝悠D縺ョ驟榊?縺ョ蜃コ蜉帛?
2000 * @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛?
2001 * @return RES_DB_NOT_INITIALIZED
2002 * @return RES_NO_SUCH_SESSION
2003 * @return RES_NO_SUCH_USER
2004 * @return RES_DB_QUERY_ERROR
2005 * @return RES_OK
2006 *
2007 */
2008 result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen )
2009 {
2010 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2011 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2012 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2013
2014 result_t ret = RES_ERROR;
2015 string sql;
2016 SQLRETURN sqlcode;
2017 SQLHANDLE hstmt = NULL;
2018 SQLLEN count = 0;
2019 groupid_t* dst = 0;
2020
2021 sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups_users_link";
2022 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
2023 sql += criteria2str( cri );
2024 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2025 *gidsLen = count;
2026 dst = new groupid_t[ *gidsLen ];
2027 *gids = dst;
2028 }else{
2029 return RES_ERROR;
2030 }
2031
2032 //謇?螻槭☆繧九げ繝ォ繝シ繝励?譛?螟ァ蛟区焚繧呈アゅa繧?/span>
2033 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2034 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2035 if( count > 0 ){
2036 SQLHANDLE hstmt2 = NULL;
2037 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2038 sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link";
2039 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
2040 sql += criteria2str( cri );
2041 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2042 SQLLEN len = 0;
2043 groupid_t gid = 0;
2044 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2045 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
2046 dst[ i ] = gid;
2047 }
2048 ret = RES_OK;
2049 }else{
2050 string s( "SQLExecDirect in getGroupsByUid " );
2051 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2052 s += string( ", sql=" ) + string( sql );
2053 setLastErrorString( s.c_str( ) );
2054 ret = RES_DB_QUERY_ERROR;
2055 }
2056 }else{
2057 string s( "SQLAllocHandle in getGroupsByUid " );
2058 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2059 setLastErrorString( s.c_str( ) );
2060 ret = RES_ERROR;
2061 }
2062 }else{
2063 ret = RES_OK;
2064 }
2065 }else{
2066 string s( "SQLExecDirect in getGroupsByUid " );
2067 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2068 s += string( ", sql=" ) + string( sql );
2069 setLastErrorString( s.c_str( ) );
2070 ret = RES_DB_QUERY_ERROR;
2071 }
2072 }else{
2073 string s( "SQLAllocHandle in getGroupsByUid " );
2074 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2075 setLastErrorString( s.c_str( ) );
2076 ret = RES_ERROR;
2077 }
2078 return ret;
2079 }
2080
2081 /**
2082 *
2083 * 繧ー繝ォ繝シ繝礼ョ。逅?ィゥ髯仙撫蜷医○.
2084 * 繝ヲ繝シ繧カ縺ォ繝ォ繝シ繝励?邂。逅?ィゥ髯舌′縺ゅk縺?繧ー繝ォ繝シ繝礼ョ。逅???〒縺ゅk縺?繧貞撫縺?粋繧上○繧?
2085 * 繝ヲ繝シ繧カ繧?げ繝ォ繝シ繝励′蟄伜惠縺励↑縺?↑縺ゥ縺ョ逡ー蟶ク縺ョ蝣エ蜷茨シ掲alse繧定ソ斐☆.
2086 *
2087 * @param sid 繧サ繝?す繝ァ繝ウID
2088 * @param gid 繧ー繝ォ繝シ繝励?UID
2089 * @param uid 繝ヲ繝シ繧カ縺ョUID
2090 * @return true 邂。逅?ィゥ髯舌≠繧?/span>
2091 * @return false 邂。逅?ィゥ髯舌↑縺暦シ後∪縺溘?荳肴?
2092 *
2093 */
2094 bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid )
2095 {
2096 if( hdbc == NULL ) return false;
2097 if( !isValidSessionID( sid ) ) return false;
2098 if( !uidExists( uid ) ) return false;
2099 if( !gidExists( gid ) ) return false;
2100
2101 bool ret = false;
2102 string sql;
2103 SQLLEN count = 0;
2104
2105 sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2106 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
2107 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2108 sql += " AND is_admin=1";
2109 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2110 if( count > 0 ){
2111 ret = true;
2112 }else{
2113 ret = false;
2114 }
2115 }else{
2116 ret = false;
2117 }
2118 return ret;
2119 }
2120
2121 /**
2122 *
2123 * 繧ー繝ォ繝シ繝悠D荳?隕ァ.
2124 * 逋サ骭イ縺輔l縺ヲ縺?k繧ー繝ォ繝シ繝励?ID荳?隕ァ繧貞叙蠕励☆繧?
2125 *
2126 * @param sid 繧サ繝?す繝ァ繝ウID
2127 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
2128 * @param gids 繧ー繝ォ繝シ繝悠D縺ョ驟榊?縺ョ蜃コ蜉帛?
2129 * @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛?
2130 * @return RES_DB_NOT_INITIALIZED
2131 * @return RES_NO_SUCH_SESSION
2132 * @return RES_DB_QUERY_ERROR
2133 * @return RES_OK
2134 *
2135 */
2136 result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen )
2137 {
2138 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2139 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2140
2141 result_t ret = RES_ERROR;
2142 groupid_t* dst = 0;
2143 string sql;
2144 SQLRETURN sqlcode;
2145 SQLLEN count = 0;
2146
2147 sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups ";
2148 sql += criteria2str( cri );
2149 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2150 *gidsLen = count;
2151 dst = new groupid_t[ *gidsLen ];
2152 *gids = dst;
2153 }else{
2154 return RES_ERROR;
2155 }
2156
2157 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2158 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2159 groupid_t gid = 0;
2160 SQLLEN len = 0;
2161 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2162 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){
2163 dst[ i ] = gid;
2164 }
2165
2166 ret = RES_OK;
2167 }else{
2168 string s( "SQLExecDirect in dumpGids " );
2169 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2170 s += "sql=";
2171 s += string( sql );
2172 setLastErrorString( s.c_str( ) );
2173 ret = RES_DB_QUERY_ERROR;
2174 }
2175 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2176 }
2177 return ret;
2178 }
2179
2180 /**
2181 *
2182 * 繧ー繝ォ繝シ繝礼ョ。逅???D繧貞叙蠕励☆繧?
2183 * 縺ゅk繧ー繝ォ繝シ繝励?邂。逅????繝ヲ繝シ繧カID繧貞叙蠕励☆繧?
2184 *
2185 * @param sid 繧サ繝?す繝ァ繝ウID
2186 * @param gid 蝠上>蜷医o縺帙k繧ー繝ォ繝シ繝励rID縺ァ謖?ョ壹☆繧?/span>
2187 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
2188 * @param uids 邂。逅????UID縺ョ驟榊?繧貞女縺大叙繧九?繧、繝ウ繧ソ
2189 * @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー
2190 * @return RES_OK
2191 * @return RES_DB_NOT_INITIALIZED
2192 * @return RES_NO_SUCH_SESSION
2193 * @return RES_DB_QUERY_ERROR
2194 * @return RES_ERROR
2195 *
2196 */
2197 result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
2198 {
2199 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2200 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2201
2202 result_t ret = RES_ERROR;
2203 string sql;
2204 SQLRETURN sqlcode;
2205 SQLLEN count = 0;
2206
2207 sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2208 sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid );
2209 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2210 *uidsLen = count;
2211 *uids = new groupid_t[ *uidsLen ];
2212 }else{
2213 return RES_ERROR;
2214 }
2215 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2216 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2217 userid_t uid;
2218 SQLLEN len = 0;
2219 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len );
2220 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){
2221 (*uids)[ i ] = uid;
2222 }
2223 ret = RES_OK;
2224 }else{
2225 string s( "SQLExecDirect in dumpGroupAdmins " );
2226 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2227 s += "sql=";
2228 s += string( sql );
2229 setLastErrorString( s.c_str( ) );
2230 ret = RES_DB_QUERY_ERROR;
2231 }
2232 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2233 }
2234 return ret;
2235 }
2236
2237 /**
2238 *
2239 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜑企勁.
2240 * 繧ー繝ォ繝シ繝励↓謇?螻槭☆繧九Θ繝シ繧カ繧抵シ後げ繝ォ繝シ繝励°繧牙炎髯、縺吶k.
2241 * 繝?ヵ繧ゥ繝ォ繝医げ繝ォ繝シ繝励°繧峨?蜑企勁縺ァ縺阪↑縺?/span>
2242 *
2243 * @param sid 繧サ繝?す繝ァ繝ウID
2244 * @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励°繧牙炎髯、縺吶k縺九r謖?ョ壹☆繧九げ繝ォ繝シ繝悠D
2245 * @param uid 蜑企勁蟇セ雎。縺ョ繝ヲ繝シ繧カ縺ョID
2246 * @return RES_DB_NOT_INITIALIZED
2247 * @return RES_NO_SUCH_SESSION
2248 * @return RES_NO_SUCH_USER
2249 * @return RES_NO_SUCH_GROUP
2250 * @return RES_DB_QUERY_ERROR
2251 * @return RES_OK
2252 * @return RES_ERROR
2253 *
2254 */
2255 result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid )
2256 {
2257 if( gid == group_t::GID_DEFAULT ) return RES_ERROR;
2258 return deleteMemberNoLimit( sid, gid, uid );
2259 }
2260
2261 /**
2262 *
2263 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜑企勁.
2264 * 繧ー繝ォ繝シ繝励↓謇?螻槭☆繧九Θ繝シ繧カ繧抵シ後げ繝ォ繝シ繝励°繧牙炎髯、縺吶k.
2265 * 繝?ヵ繧ゥ繝ォ繝医げ繝ォ繝シ繝励°繧峨b蜑企勁縺ァ縺阪k轤ケ縺鯉シ慧eleteMember縺ィ逡ー縺ェ繧?/span>
2266 *
2267 * @param sid 繧サ繝?す繝ァ繝ウID
2268 * @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励°繧牙炎髯、縺吶k縺九r謖?ョ壹☆繧九げ繝ォ繝シ繝悠D
2269 * @param uid 蜑企勁蟇セ雎。縺ョ繝ヲ繝シ繧カ縺ョID
2270 * @return RES_DB_NOT_INITIALIZED
2271 * @return RES_NO_SUCH_SESSION
2272 * @return RES_NO_SUCH_USER
2273 * @return RES_NO_SUCH_GROUP
2274 * @return RES_DB_QUERY_ERROR
2275 * @return RES_OK
2276 * @return RES_ERROR
2277 *
2278 */
2279 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid )
2280 {
2281 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2282 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2283 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2284 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2285
2286 result_t ret = RES_ERROR;
2287 string sql;
2288 SQLRETURN sqlcode;
2289 SQLHANDLE hstmt = NULL;
2290
2291 sql = "DELETE FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2292 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
2293 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2294 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2295 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2296 SQLLEN count = 0;
2297 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2298 ret = RES_OK;
2299 }else{
2300 string s( "SQLRowCount in deleteMember" );
2301 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2302 s += string( ", sql=" ) + string( sql );
2303 setLastErrorString( s.c_str( ) );
2304 ret = RES_NO_SUCH_USER;
2305 }
2306 }else{
2307 string s( "SQLExecDirect in deleteMember" );
2308 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2309 s += ", sql=";
2310 s += string( sql );
2311 setLastErrorString( s.c_str( ) );
2312 ret = RES_DB_QUERY_ERROR;
2313 }
2314 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2315 }else{
2316 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" );
2317 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2318 setLastErrorString( s.c_str( ) );
2319 ret = RES_ERROR;
2320 }
2321 return ret;
2322 }
2323
2324 /**
2325 *
2326 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ霑ス蜉?.
2327 * 繧ー繝ォ繝シ繝励?繝。繝ウ繝舌?縺ォ繝ヲ繝シ繧カ繧定ソス蜉?縺吶k.
2328 *
2329 * @param sid 繧サ繝?す繝ァ繝ウID
2330 * @param gid 謇?螻槫?繧ー繝ォ繝シ繝励?ID
2331 * @param uid 謇?螻槭&縺帙k繝ヲ繝シ繧カ縺ョID
2332 * @param admin 邂。逅???ィゥ髯舌r荳弱∴繧九↑繧液rue
2333 * @return RES_OK
2334 * @return RES_DB_NOT_INITIALIZED
2335 * @return RES_NO_SUCH_SESSION
2336 * @return RES_NO_SUCH_USER
2337 * @return RES_NO_SUCH_GROUP
2338 * @return RES_DB_QUERY_ERROR
2339 *
2340 */
2341 result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin )
2342 {
2343 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2344 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2345 if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2346 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2347
2348 result_t ret = RES_ERROR;
2349 string sql;
2350 SQLRETURN sqlcode;
2351
2352 //繝。繝ウ繝舌?繧定ソス蜉?
2353 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2354 sql = "INSERT INTO " + dbprefix + "_xnpaccount_groups_users_link ( gid, uid, is_admin ) VALUES (";
2355 sql += string( unsignedIntToString( gid ) ) + ", ";
2356 sql += string( unsignedIntToString( uid ) ) + ", ";
2357 sql += string( admin ? "1" : "0" ) + ") ";
2358 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2359 SQLLEN count = 0;
2360 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2361 ret = RES_OK;
2362 }else{
2363 string s( "SQLRowCount in insertMember " );
2364 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2365 s += string( ", sql=" ) + string( sql );
2366 setLastErrorString( s.c_str( ) );
2367 ret = RES_DB_QUERY_ERROR;
2368 }
2369 }else{
2370 string s( "SQLExecDirect in insertMember " );
2371 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2372 s += string( ", sql=" ) + string( sql );
2373 setLastErrorString( s.c_str( ) );
2374 ret = RES_DB_QUERY_ERROR;
2375 }
2376 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2377 }else{
2378 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" );
2379 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2380 setLastErrorString( s.c_str( ) );
2381 ret = RES_ERROR;
2382 }
2383 return ret;
2384 }
2385
2386 /**
2387 *
2388 * 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜿門セ?
2389 * 縺ゅk繧ー繝ォ繝シ繝励?謇?螻槭@縺ヲ縺?k繝ヲ繝シ繧カ縺ョ繝ヲ繝シ繧カID繧貞叙蠕励☆繧?/span>
2390 *
2391 * @param sid 繧サ繝?す繝ァ繝ウID
2392 * @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励?謇?螻槭Θ繝シ繧カ繧貞撫縺?粋繧上○繧九°繧偵げ繝ォ繝シ繝励rID縺ァ謖?ョ?/span>
2393 * @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span>
2394 * @param uids 謇?螻槭Θ繝シ繧カ縺ョUID縺ョ驟榊?繧貞女縺大叙繧九?繧、繝ウ繧ソ
2395 * @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー
2396 * @return RES_OK
2397 * @return RES_DB_NOT_INITIALIZED
2398 * @return RES_NO_SUCH_SESSION
2399 * @return RES_NO_SUCH_GROUP
2400 * @return RES_DB_QUERY_ERROR
2401 * @return RES_ERROR
2402 *
2403 */
2404 result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen )
2405 {
2406 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2407 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2408 if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け
2409
2410 result_t ret = RES_ERROR;
2411 string sql;
2412 SQLRETURN sqlcode;
2413 SQLHANDLE hstmt = NULL;
2414 userid_t* dst = 0;
2415
2416 //how many members ?
2417 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2418 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
2419 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2420 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2421 SQLUINTEGER count = 0;
2422 SQLLEN len = 0;
2423 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
2424 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2425 dst = new userid_t[ count ];
2426 *uids = dst;
2427 *uidsLen = count;
2428 if( count > 0 ){
2429 //retrieve member's IDs
2430 SQLHANDLE hstmt2 = NULL;
2431 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
2432 sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link ";
2433 sql += " WHERE gid=" + string( unsignedIntToString( gid ) );
2434 sql += " " + string( criteria2str( cri ) );
2435 if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2436 SQLUINTEGER uid = 0;
2437 SQLLEN len = 0;
2438 SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len );
2439 for( SQLUINTEGER i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){
2440 dst[ i ] = uid;
2441 }
2442 ret = RES_OK;
2443 }else{
2444 setLastErrorString( "SQLExecDirect in getMembers" );
2445 ret = RES_DB_QUERY_ERROR;
2446 }
2447 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
2448 }else{
2449 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2450 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2451 setLastErrorString( s.c_str( ) );
2452 ret = RES_ERROR;
2453 }
2454 }else{
2455 ret = RES_OK;
2456 }
2457 }else{
2458 string s( "SQLFetch in getMembers sql=" );
2459 s += string( sql );
2460 setLastErrorString( s.c_str( ) );
2461 ret = RES_DB_QUERY_ERROR;
2462 }
2463 }else{
2464 setLastErrorString( "SQLExecDirect in getMembers" );
2465 ret = RES_DB_QUERY_ERROR;
2466 }
2467 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2468 }else{
2469 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" );
2470 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2471 setLastErrorString( s.c_str( ) );
2472 ret = RES_ERROR;
2473 }
2474 return ret;
2475 }
2476
2477 /**
2478 *
2479 * 繧ー繝ォ繝シ繝励?蜑企勁.
2480 * 繝??繧ソ繝吶?繧ケ縺九i繧ー繝ォ繝シ繝励r蜑企勁縺励∪縺?
2481 *
2482 * @param sid 繧サ繝?す繝ァ繝ウID
2483 * @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励?謇?螻槭Θ繝シ繧カ繧貞撫縺?粋繧上○繧九°繧偵げ繝ォ繝シ繝励rID縺ァ謖?ョ?/span>
2484 * @return RES_OK
2485 * @return RES_DB_QUERY_ERROR
2486 * @return RES_NO_SUCH_SESSION
2487 * @return RES_DB_NOT_INITIALIZED
2488 *
2489 */
2490 result_t deleteGroup( sessionid_t sid, groupid_t gid )
2491 {
2492 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2493 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2494
2495 result_t ret = RES_ERROR;
2496 string sql;
2497 SQLRETURN sqlcode;
2498 SQLHANDLE hstmt = NULL;
2499
2500 sql = "DELETE FROM " + dbprefix + "_xnpaccount_groups ";
2501 sql += "WHERE gid = " + string( unsignedIntToString( gid ) );
2502 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2503 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2504 SQLLEN count = 0;
2505 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2506 ret = RES_OK;
2507 }else{
2508 string s( "SQLRowCount in deleteGroup" );
2509 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2510 s += string( ", sql=" ) + string( sql );
2511 setLastErrorString( s.c_str( ) );
2512 ret = RES_NO_SUCH_USER;
2513 }
2514 }else{
2515 string s( "SQLExecDirect in deleteGroup" );
2516 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2517 s += ", sql=";
2518 s += string( sql );
2519 setLastErrorString( s.c_str( ) );
2520 ret = RES_DB_QUERY_ERROR;
2521 }
2522 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2523 }else{
2524 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" );
2525 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2526 setLastErrorString( s.c_str( ) );
2527 ret = RES_ERROR;
2528 }
2529 return ret;
2530 }
2531
2532 /**
2533 *
2534 * 繧ー繝ォ繝シ繝礼匳骭イ.
2535 * 繧ー繝ォ繝シ繝励?諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ險倬鹸縺吶k??/span>
2536 * 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D繧暖id縺ォ譬シ邏阪☆繧具シ?/span>
2537 *
2538 * @param sid 繧サ繝?す繝ァ繝ウID
2539 * @param group 逋サ骭イ縺励◆縺?げ繝ォ繝シ繝励?諠??ア
2540 * @param gid 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D
2541 * @return RES_OK
2542 * @return RES_DB_NOT_INITIALIZED
2543 * @return RES_NO_SUCH_SESSION
2544 * @return RES_DB_QUERY_ERROR
2545 *
2546 */
2547 result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid )
2548 {
2549 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2550 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2551
2552 result_t ret = RES_ERROR;
2553 string sql;
2554 SQLCHAR gname[XNP_GROUP_GNAME_LEN+1], gdesc[XNP_GROUP_GDESC_LEN+1];
2555 SQLLEN cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2556 SQLRETURN sqlcode;
2557
2558 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2559 sql = "INSERT INTO " + dbprefix + "_xnpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )";
2560 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2561 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2562 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2563 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2564 strncpy2( (char*)gname, group -> getGname( ), XNP_GROUP_GNAME_LEN );
2565 strncpy2( (char*)gdesc, group -> getDesc( ), XNP_GROUP_GDESC_LEN );
2566 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2567 SQLLEN count = 0;
2568 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2569 //繧ー繝ォ繝シ繝悠D繧貞叙蠕励☆繧?/span>
2570 sql = "SELECT LAST_INSERT_ID()";
2571 ret = queryGetUnsignedInt( "insertGroup", sql, (unsigned int*)gid );
2572 }else{
2573 string s( "SQLRowCount in insertGroup sql=" );
2574 s += string( sql );
2575 setLastErrorString( s.c_str( ) );
2576 ret = RES_DB_QUERY_ERROR;
2577 }
2578 }else{
2579 string s( "SQLExecute in insertGroup " );
2580 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2581 setLastErrorString( s.c_str( ) );
2582 ret = RES_DB_QUERY_ERROR;
2583 }
2584 }else{
2585 string s( "SQLPrepare in insertGroup " );
2586 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2587 setLastErrorString( s.c_str( ) );
2588 ret = RES_ERROR;
2589 }
2590 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2591 }else{
2592 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertGroup" );
2593 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2594 setLastErrorString( s.c_str( ) );
2595 ret = RES_ERROR;
2596 }
2597
2598 //
2599 if ( ret == RES_OK ){
2600 //group index繧剃ス懈?
2601
2602 //group index逕ィ縺ョsort_num逕滓?
2603 string sql = "SELECT MAX(sort_number) FROM " +
2604 dbprefix + "_xnpaccount_index WHERE parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
2605 " AND (open_level=" + unsignedIntToString(index::OL_GROUP_ONLY) +
2606 " OR open_level=" + unsignedIntToString(index::OL_PUBLIC) + ")";
2607 unsigned int sortNumber;
2608 ret = queryGetUnsignedInt( "insertGroup", sql, &sortNumber );
2609 sortNumber++;
2610 if ( ret == RES_OK ){
2611 // group index菴懈?
2612 index_t index;
2613 userid_t uid;
2614 ret = sessionID2UID( sid, &uid );
2615 if ( ret == RES_OK ){
2616 index.setItemTypeID(item::ITID_INDEX);
2617 index.setContributorUID(uid);
2618 index.setParentIndexID(item::IID_ROOT);
2619 index.setOwnerGID(*gid);
2620 index.setOpenLevel(index::OL_GROUP_ONLY);
2621 index.setSortNumber(sortNumber);
2622 index.setTitle(group->getGname());
2623 indexid_t groupXID;
2624 ret = insertIndexInternal( sid, &index, &groupXID );
2625 if ( ret == RES_OK ){
2626 // xnpaccuont_groups縺ョgroup_index_id縺ョ譖ク縺肴鋤縺?/span>
2627 sql = "UPDATE " + dbprefix + "_xnpaccount_groups SET group_index_id="
2628 + unsignedIntToString(groupXID) + " WHERE gid=" + unsignedIntToString(*gid);
2629 ret = querySimple( "insertGroup", sql );
2630 }
2631 }
2632 }
2633 }
2634
2635 return ret;
2636 }
2637
2638 /**
2639 *
2640 * 繧ー繝ォ繝シ繝玲ュ蝣ア繧貞、画峩縺吶k
2641 *
2642 * @param sid 繧サ繝?す繝ァ繝ウID
2643 * @param group 譁ー縺励>繧ー繝ォ繝シ繝玲ュ蝣ア
2644 * @return RES_OK
2645 * @return RES_ERROR
2646 * @return RES_DB_NOT_INITIALIZED
2647 * @return RES_NO_SUCH_SESSION
2648 * @return RES_NO_SUCH_GROUP
2649 * @return RES_DB_QUERY_ERROR
2650 *
2651 */
2652 result_t updateGroup( sessionid_t sid, const group_t* group )
2653 {
2654 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2655 if( group == NULL ) return RES_ERROR;
2656 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2657 if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP;
2658
2659 result_t ret = RES_ERROR;
2660 string sql;
2661 SQLCHAR gname[XNP_GROUP_GNAME_LEN+1], gdesc[XNP_GROUP_GDESC_LEN+1];
2662 SQLLEN cbGname = SQL_NTS, cbGdesc = SQL_NTS;
2663 SQLRETURN sqlcode;
2664
2665 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2666 sql = "UPDATE " + dbprefix + "_xnpaccount_groups SET gname=?, gdesc=? WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) );
2667 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
2668 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
2669 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname );
2670 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc );
2671 strncpy2( (char*)gname, group -> getGname( ), XNP_GROUP_GNAME_LEN );
2672 strncpy2( (char*)gdesc, group -> getDesc( ), XNP_GROUP_GDESC_LEN );
2673 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
2674 SQLLEN count = 0;
2675 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
2676 ret = RES_OK;
2677 }else{
2678 string s( "SQLRowCount in updateGroup sql=" );
2679 s += string( sql );
2680 setLastErrorString( s.c_str( ) );
2681 ret = RES_DB_QUERY_ERROR;
2682 }
2683 }else{
2684 string s( "SQLExecute in updateGroup " );
2685 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2686 setLastErrorString( s.c_str( ) );
2687 ret = RES_DB_QUERY_ERROR;
2688 }
2689 }else{
2690 setLastErrorString( "SQLPrepare in updateGroup sql=" );
2691 ret = RES_ERROR;
2692 }
2693 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2694 }else{
2695 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateGroup" );
2696 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2697 setLastErrorString( s.c_str( ) );
2698 ret = RES_ERROR;
2699 }
2700 return RES_OK;
2701 }
2702
2703 /**
2704 *
2705 * 繧ー繝ォ繝シ繝玲ュ蝣ア蜿門セ?/span>
2706 *
2707 * @param sid 繧サ繝?す繝ァ繝ウID
2708 * @param gid 蜿門セ励@縺溘>繧ー繝ォ繝シ繝励?GID
2709 * @param group 蜿門セ励@縺溘げ繝ォ繝シ繝玲ュ蝣ア縺ョ繧「繝峨Ξ繧ケ繧呈嶌縺崎セシ繧?繝昴う繝ウ繧ソ
2710 * @return RES_OK
2711 * @return RES_DB_NOT_INITIALIZED
2712 * @return RES_NO_SUCH_SESSION
2713 * @return RES_NO_SUCH_GROUP
2714 * @return RES_DB_QUERY_ERROR
2715 *
2716 */
2717 result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group )
2718 {
2719 int len;
2720 static criteria c;
2721 result_t res = getGroups( sid, &gid, 1, &c, group, &len );
2722 if( len == 0 ) return RES_NO_SUCH_GROUP;
2723 return res;
2724 }
2725
2726 /**
2727 *
2728 * 隍?焚縺ョ繧ー繝ォ繝シ繝玲ュ蝣ア繧剃ク?蠎ヲ縺ォ蜿門セ励☆繧?
2729 *
2730 * @param sid 繧サ繝?す繝ァ繝ウID
2731 * @param gids 蜿門セ励@縺溘>繧ー繝ォ繝シ繝励?GID縺ョ驟榊?
2732 * @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー
2733 * @param cri 邨先棡縺ョ蜿門セ礼ッ?峇?後た繝シ繝域擅莉カ繧呈欠螳?/span>
2734 * @param groups 蜿門セ礼オ先棡縺ョ繧ー繝ォ繝シ繝玲ュ蝣ア縺ョ驟榊?縺ョ繧「繝峨Ξ繧ケ繧呈嶌縺崎セシ繧?繝昴う繝ウ繧ソ
2735 * @param groupsLen 蜿門セ礼オ先棡縺ョ驟榊?縺ョ隕∫エ?謨ー
2736 * @return RES_OK
2737 * @return RES_DB_NOT_INITIALIZED
2738 * @return RES_NO_SUCH_SESSION
2739 * @return RES_DB_QUERY_ERROR
2740 *
2741 */
2742 result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen )
2743 {
2744 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
2745 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
2746
2747 #ifdef USE_SYSLOG
2748 openlog( "commonal", LOG_ODELAY, LOG_USER );
2749 #endif
2750
2751 SQLRETURN sqlcode;
2752 SQLHANDLE hstmt = NULL;
2753 result_t ret = RES_ERROR;
2754 string sql;
2755 group_t* dst = new group_t[ gidsLen ];
2756
2757 sql += "SELECT gid, gname, gdesc, group_index_id ";
2758 sql += "FROM " + dbprefix + "_xnpaccount_groups ";
2759 if( gidsLen > 0 ){
2760 sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) );
2761 for( int i = 1; i < gidsLen; i++ ){
2762 sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) );
2763 }
2764 }
2765 sql += criteria2str( cri );
2766
2767 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2768 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2769 SQLLEN len = 0;
2770 groupid_t gid = 0;
2771 SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len );
2772 *groupsLen=0;
2773 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < gidsLen ; i++ ){
2774 dst[ i ].setGID( gid );
2775 dst[ i ].setGname( getResultCol( hstmt, 2 ).c_str() );
2776 dst[ i ].setDesc( getResultCol( hstmt, 3 ).c_str() );
2777 dst[ i ].setGroupIndexID( atoi(getResultCol( hstmt, 4 ).c_str()) );
2778 ( *groupsLen )++;
2779 }
2780 *groups = dst;
2781 #ifdef USE_SYSLOG
2782 syslog( LOG_DEBUG, "getGroups succeed" );
2783 #endif
2784 ret = RES_OK;
2785 }else{
2786 string s( "SQLExecDirect in getGroups" );
2787 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2788 s += string( ", sql=" ) + string( sql );
2789 setLastErrorString( s.c_str( ) );
2790 #ifdef USE_SYSLOG
2791 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2792 #endif
2793 ret = RES_DB_QUERY_ERROR;
2794 }
2795 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
2796 }else{
2797 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroups" );
2798 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
2799 setLastErrorString( s.c_str( ) );
2800 #ifdef USE_SYSLOG
2801 syslog( LOG_DEBUG, "getGroups %s", getLastErrorString( ) );
2802 #endif
2803 ret = RES_ERROR;
2804 }
2805 #ifdef USE_SYSLOG
2806 closelog( );
2807 #endif
2808 return ret;
2809 }
2810
2811 /**
2812 *
2813 * 繝「繝?Ξ繝シ繧ソ讓ゥ髯舌?譛臥┌繧定ソ斐☆
2814 *
2815 * @param sid 繧サ繝?す繝ァ繝ウID
2816 * @param uid 蝠上>蜷医o縺帙◆縺?Θ繝シ繧カ縺ョUID
2817 * @return true 讓ゥ髯舌≠繧?/span>
2818 * @return false 讓ゥ髯舌↑縺?/span>
2819 *
2820 */
2821 bool isModerator( sessionid_t sid, userid_t uid )
2822 {
2823 if( hdbc == NULL ) return false;
2824 if( !isValidSessionID( sid ) ) return false;
2825 if( !uidExists( uid ) ) return false;
2826
2827 bool ret = false;
2828 SQLRETURN sqlcode;
2829 SQLHANDLE hstmt = NULL;
2830 SQLLEN count = 0;
2831 string sql;
2832 groupid_t moderator_gid;
2833
2834 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
2835 sql = "SELECT value FROM " + dbprefix + "_xnpaccount_config";
2836 sql += " WHERE name='moderator_gid'";
2837 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
2838 SQLLEN len = 0;
2839 SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len );
2840 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
2841 sql = "SELECT * from " + dbprefix + "_groups_users_link ";
2842 sql += "WHERE groupid=" + unsignedIntToString( moderator_gid );
2843 sql += " AND uid=" + string( unsignedIntToString( uid ) );
2844 if( countResultRows( sql.c_str(), &count ) == RES_OK ){
2845 if( count > 0 ){
2846 ret = true;
2847 }
2848 }
2849 }else{
2850 /*
2851 string s( "SQLFetch in isModerator " );
2852 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2853 s += ", sql=";
2854 s += string( sql );
2855 setLastErrorString( s.c_str( ) );
2856 */
2857 }
2858 }else{
2859 string s( "SQLExecDirect in isModerator " );
2860 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
2861 s += ", sql=";
2862 s += string( sql );
2863 setLastErrorString( s.c_str( ) );