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.80 - (show annotations) (download) (as text)
Wed Mar 9 07:27:37 2005 UTC (19 years, 1 month ago) by aga4096
Branch: MAIN
Changes since 1.79: +19 -2 lines
File MIME type: text/x-c++src
。ヲactivate=0、ハ、駘oginUser、ヒシコヌヤ、ケ、?隍ヲス、タオ.

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