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.103 - (show annotations) (download) (as text)
Tue Aug 23 07:34:24 2005 UTC (18 years, 7 months ago) by tani
Branch: MAIN
Changes since 1.102: +21 -8 lines
File MIME type: text/x-c++src
Language対応: getItems, _insetItem, updateItem

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