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.106 - (show annotations) (download) (as text)
Mon Aug 29 07:11:05 2005 UTC (18 years, 7 months ago) by aga4096
Branch: MAIN
Changes since 1.105: +13 -8 lines
File MIME type: text/x-c++src
・xnp_update_item_status, xnp_selective_harvestingの修正.

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