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.108 - (show annotations) (download) (as text)
Thu Sep 8 05:40:21 2005 UTC (18 years, 7 months ago) by tani
Branch: MAIN
Changes since 1.107: +22 -6 lines
File MIME type: text/x-c++src
freeStringArrayを定義.
selectiveHarvesting:OAIPMHのidentifierを返す.
XNP_CONFIG_REPOSITORY_NIJC_CODEを定義.

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