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.115 - (show annotations) (download) (as text)
Thu Nov 17 10:59:36 2005 UTC (18 years, 4 months ago) by tani
Branch: MAIN
Changes since 1.114: +226 -1 lines
File MIME type: text/x-c++src
アイテム間リンク機能: insertRelatedTo, deleteRelatedTo, getRelatedToを追加.

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