Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.113 - (show annotations) (download) (as text)
Tue Oct 11 16:20:22 2005 UTC (18 years, 6 months ago) by orrisroot
Branch: MAIN
CVS Tags: XOONIPS_RC1
Branch point for: XOONIPS_STABLE
Changes since 1.112: +6 -3 lines
File MIME type: text/x-c++src
SQLRowCount の戻り値チェックを元にもどした.

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