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.86 - (show annotations) (download) (as text)
Tue Mar 15 04:49:40 2005 UTC (19 years ago) by tani
Branch: MAIN
Changes since 1.85: +74 -41 lines
File MIME type: text/x-c++src
ライセンス文を追加.

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