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.100 - (show annotations) (download) (as text)
Thu Jul 21 01:47:57 2005 UTC (18 years, 8 months ago) by tani
Branch: MAIN
Changes since 1.99: +76 -21 lines
File MIME type: text/x-c++src
getEventsForRSSを定義した.

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