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.98 - (show annotations) (download) (as text)
Tue Jul 12 06:40:44 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.97: +12 -2 lines
File MIME type: text/x-c++src
・setConfigValueに失敗するのを修正.

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