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.2 - (hide annotations) (download) (as text)
Fri Oct 28 07:02:52 2005 UTC (18 years, 5 months ago) by aga4096
Branch: XOONIPS_STABLE
Changes since 1.113.2.1: +8 -1 lines
File MIME type: text/x-c++src
・サブインデックスを含むインデックスの削除時にエラーが出ることがあるのを修正.

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