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.1 - (show annotations) (download) (as text)
Tue Oct 18 09:19:53 2005 UTC (18 years, 5 months ago) by aga4096
Branch: XOONIPS_STABLE
Changes since 1.113: +65 -38 lines
File MIME type: text/x-c++src
・PubMed補完が正しくないことがあるのを修正.

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