Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

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


Revision 1.113.2.2 - (show annotations) (download) (as text)
Fri Oct 28 07:02:52 2005 UTC (18 years, 5 months ago) by aga4096
Branch: XOONIPS_STABLE
Changes since 1.113.2.1: +8 -1 lines
File MIME type: text/x-c++src
・サブインデックスを含むインデックスの削除時にエラーが出ることがあるのを修正.

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