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.109 - (show annotations) (download) (as text)
Fri Sep 9 01:29:27 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.108: +8 -1 lines
File MIME type: text/x-c++src
・refresh_item_status, update_item_statusがエラーになることがあるのを修正.

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