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.89 - (show annotations) (download) (as text)
Wed May 18 10:00:17 2005 UTC (18 years, 10 months ago) by aga4096
Branch: MAIN
Changes since 1.88: +186 -175 lines
File MIME type: text/x-c++src
・モジュール統合に対応.

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