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.116 - (show annotations) (download) (as text)
Tue Nov 22 11:29:54 2005 UTC (18 years, 4 months ago) by tani
Branch: MAIN
CVS Tags: REL20051226
Changes since 1.115: +16 -5 lines
File MIME type: text/x-c++src
deleteItem: アイテム削除と同時にRelated toも削除する.
getRelatedTo: isActivatedBySessionのチェックを外す(冗長なので).

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