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.92 - (show annotations) (download) (as text)
Wed Jun 8 04:27:08 2005 UTC (18 years, 10 months ago) by tani
Branch: MAIN
Changes since 1.91: +29 -13 lines
File MIME type: text/x-c++src
defaultグループの存在を秘匿した.

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