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.95 - (show annotations) (download) (as text)
Fri Jun 24 02:07:34 2005 UTC (18 years, 9 months ago) by tani
Branch: MAIN
Changes since 1.94: +38 -2 lines
File MIME type: text/x-c++src
insertItemDirectを定義(Import用)
getPrivateItemIDに,BINDERを無視する条件を追加(個人バインダー対応)

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