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.90 - (show annotations) (download) (as text)
Mon May 23 08:00:30 2005 UTC (18 years, 10 months ago) by tani
Branch: MAIN
Changes since 1.89: +83 -3 lines
File MIME type: text/x-c++src
insertGroup, updateGroup: グループ名が重複した場合はエラーコードを返す.

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