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.96 - (show annotations) (download) (as text)
Wed Jun 29 00:10:18 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.95: +15 -11 lines
File MIME type: text/x-c++src
・login name -> additional info に修正.

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