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.118.2.7 - (hide annotations) (download) (as text)
Wed Oct 4 09:25:21 2006 UTC (17 years, 6 months ago) by tani
Branch: XOONIPS_STABLE_2
CVS Tags: tag20061115, RELENG_2_0_0a_RELEASE
Changes since 1.118.2.6: +6 -1 lines
File MIME type: text/x-c++src
activate: accept only guest session or login user's session.

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