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