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.4 - (show annotations) (download) (as text)
Tue Dec 6 05:09:38 2005 UTC (18 years, 4 months ago) by aga4096
Branch: XOONIPS_STABLE
CVS Tags: MergePnt_20051220
Changes since 1.113.2.3: +6 -1 lines
File MIME type: text/x-c++src
・開放忘れを修正.

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