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.104 - (hide annotations) (download) (as text)
Mon Aug 29 02:05:34 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.103: +472 -101 lines
File MIME type: text/x-c++src
・xnp_update_item_status(), xnp_refresh_item_status(), xnp_selective_harvesting() を追加.

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