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.112 - (show annotations) (download) (as text)
Fri Oct 7 06:22:46 2005 UTC (18 years, 6 months ago) by aga4096
Branch: MAIN
Changes since 1.111: +6 -3 lines
File MIME type: text/x-c++src
・updateAccount()がエラーを出すことがあるのを修正.

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