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.115 - (hide annotations) (download) (as text)
Thu Nov 17 10:59:36 2005 UTC (18 years, 4 months ago) by tani
Branch: MAIN
Changes since 1.114: +226 -1 lines
File MIME type: text/x-c++src
アイテム間リンク機能: insertRelatedTo, deleteRelatedTo, getRelatedToを追加.

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