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.110 - (hide annotations) (download) (as text)
Fri Sep 9 06:26:35 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.109: +16 -5 lines
File MIME type: text/x-c++src
・xnp_use_syslog()を作成.

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