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.91 - (show annotations) (download) (as text)
Tue Jun 7 01:10:33 2005 UTC (18 years, 10 months ago) by tani
Branch: MAIN
Changes since 1.90: +20 -12 lines
File MIME type: text/x-c++src
SQLGetDataの引数を修正.
SQLExecDirectの代わりにSQLExecuteの利用.

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