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.107 - (show annotations) (download) (as text)
Tue Aug 30 09:39:31 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.106: +5 -16 lines
File MIME type: text/x-c++src
・xnp_get_item_status を作成.

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