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.117 - (show annotations) (download) (as text)
Fri Jan 6 05:50:32 2006 UTC (18 years, 3 months ago) by aga4096
Branch: MAIN
Changes since 1.116: +6 -1 lines
File MIME type: text/x-c++src
・ ctype.h をinclude.

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