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.81 - (show annotations) (download) (as text)
Fri Mar 11 00:34:57 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.80: +50 -11 lines
File MIME type: text/x-c++src
・「・、・ニ・爨ホ・「・ッ・サ・ケク「・チ・ァ・テ・ッ、ヒcertify_stateトノイテ.

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