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.87 - (show annotations) (download) (as text)
Tue Mar 15 12:09:39 2005 UTC (19 years ago) by tani
Branch: MAIN
Changes since 1.86: +23 -5 lines
File MIME type: text/x-c++src
deleteItem 削除権限チェックを強化.
グループインデックスに属するアイテムへのアクセス権チェックを強化.

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