Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

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


Revision 1.74 - (hide annotations) (download) (as text)
Sat Feb 26 05:11:31 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.73: +8 -2 lines
File MIME type: text/x-c++src
getGroupItemIDトノイテ.

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