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.113.2.3 - (hide annotations) (download) (as text)
Tue Nov 1 10:36:14 2005 UTC (18 years, 5 months ago) by tani
Branch: XOONIPS_STABLE
CVS Tags: MergePnt_20051116
Changes since 1.113.2.2: +11 -3 lines
File MIME type: text/x-c++src
_insertItem: dierctフラグによって書き込む日付情報の値を分岐する.

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