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.111 - (show annotations) (download) (as text)
Mon Sep 26 02:24:34 2005 UTC (18 years, 6 months ago) by aga4096
Branch: MAIN
Changes since 1.110: +5 -2 lines
File MIME type: text/x-c++src
・isAdmin()が誤動作するのを修正.

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