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.99 - (show annotations) (download) (as text)
Fri Jul 15 04:42:33 2005 UTC (18 years, 8 months ago) by aga4096
Branch: MAIN
Changes since 1.98: +7 -1 lines
File MIME type: text/x-c++src
・getItemTypesで、DBにNULLが書かれているとおかしくなるのを修正.

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