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.88 - (show annotations) (download) (as text)
Thu Mar 17 16:02:40 2005 UTC (19 years ago) by orrisroot
Branch: MAIN
CVS Tags: RELEASE_1_0_0, RELEASE_1_0_1
Changes since 1.87: +9 -1 lines
File MIME type: text/x-c++src
UNIX において SQLLEN 型が宣言されていない場合に対処するため,configure
スクリプトで出力された config.h をインクルードするように変更.
→ これにより MacOS X でコンパイル可

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