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.93 - (show annotations) (download) (as text)
Tue Jun 14 01:02:20 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.92: +251 -32 lines
File MIME type: text/x-c++src
・個人Binder向け修正. xnp_extract_public_item_id, xnp_extract_nonbinder_item_id の追加.

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