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.94 - (show annotations) (download) (as text)
Thu Jun 23 07:58:12 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.93: +169 -3 lines
File MIME type: text/x-c++src
・イベントログ機能の追加.

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