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.118.2.1 - (show annotations) (download) (as text)
Tue Feb 14 05:13:17 2006 UTC (18 years, 1 month ago) by aga4096
Branch: XOONIPS_STABLE_2
Changes since 1.118: +38 -29 lines
File MIME type: text/x-c++src
・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正.

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