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.74 - (show annotations) (download) (as text)
Sat Feb 26 05:11:31 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.73: +8 -2 lines
File MIME type: text/x-c++src
getGroupItemIDトノイテ.

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