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.110 - (show annotations) (download) (as text)
Fri Sep 9 06:26:35 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.109: +16 -5 lines
File MIME type: text/x-c++src
・xnp_use_syslog()を作成.

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