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