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.114 - (hide annotations) (download) (as text)
Wed Nov 16 03:59:06 2005 UTC (18 years, 4 months ago) by tani
Branch: MAIN
Changes since 1.113: +85 -40 lines
File MIME type: text/x-c++src
XOONIPS_STABLEの分岐点〜MergePnt_20051116間のXooNIps_STABLE上の修正をCURRENTにマージ.

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