Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

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


Revision 1.113.2.3 - (show annotations) (download) (as text)
Tue Nov 1 10:36:14 2005 UTC (18 years, 5 months ago) by tani
Branch: XOONIPS_STABLE
CVS Tags: MergePnt_20051116
Changes since 1.113.2.2: +11 -3 lines
File MIME type: text/x-c++src
_insertItem: dierctフラグによって書き込む日付情報の値を分岐する.

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