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.97 - (show annotations) (download) (as text)
Thu Jun 30 07:21:42 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.96: +6 -2 lines
File MIME type: text/x-c++src
・get_all_index等で得られるindexが少ないことがあるのを修正.

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