Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


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

1 /*
2 * --------------------------------------------------------------------------
3 * XooNiPs Xoops modules for Neuroinformatics Platforms
4 * Copyright (C) 2005 RIKEN, Japan. All rights reserved.
5 * http://sourceforge.jp/projects/xoonips/
6 * --------------------------------------------------------------------------
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * --------------------------------------------------------------------------
21 *
22 *
23 * $Revision: 1.110 $
24 * $Log: commonal.cc,v $
25 * Revision 1.110 2005/09/09 06:26:35 aga4096
26 * 鐃緒申xnp_use_syslog()鐃緒申鐃緒申鐃緒申.
27 *
28 * Revision 1.109 2005/09/09 01:29:27 aga4096
29 * 鐃緒申refresh_item_status, update_item_status鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
30 *
31 * Revision 1.108 2005/09/08 05:40:21 tani
32 * freeStringArray鐃緒申鐃緒申鐃緒申.
33 * selectiveHarvesting鐃緒申OAIPMH鐃緒申identifier鐃緒申鐃緒申鐃緒申.
34 * XNP_CONFIG_REPOSITORY_NIJC_CODE鐃緒申鐃緒申鐃緒申.
35 *
36 * Revision 1.107 2005/08/30 09:39:31 aga4096
37 * 鐃緒申xnp_get_item_status 鐃緒申鐃緒申鐃緒申.
38 *
39 * Revision 1.106 2005/08/29 07:11:05 aga4096
40 * 鐃緒申xnp_update_item_status, xnp_selective_harvesting鐃緒申鐃緒申鐃緒申.
41 *
42 * Revision 1.105 2005/08/29 05:27:37 aga4096
43 * 鐃緒申update_item_status鐃緒申鐃緒申鐃緒申.
44 *
45 * Revision 1.104 2005/08/29 02:05:34 aga4096
46 * 鐃緒申xnp_update_item_status(), xnp_refresh_item_status(), xnp_selective_harvesting() 鐃緒申鐃緒申鐃緒申.
47 *
48 * Revision 1.103 2005/08/23 07:34:24 tani
49 * Language鐃緒申鐃緒申: getItems, _insetItem, updateItem
50 *
51 * Revision 1.102 2005/08/23 02:19:10 tani
52 * getEventsForRSS鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
53 *
54 * Revision 1.101 2005/08/08 01:57:00 aga4096
55 * 鐃緒申2鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申initializeDB鐃緒申鐃緒申鐃緒申.
56 * 鐃緒申valgrind鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
57 *
58 * Revision 1.100 2005/07/21 01:47:57 tani
59 * getEventsForRSS鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
60 *
61 * Revision 1.99 2005/07/15 04:42:33 aga4096
62 * 鐃緒申getItemTypes鐃緒申鐃緒申DB鐃緒申NULL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
63 *
64 * Revision 1.98 2005/07/12 06:40:44 aga4096
65 * 鐃緒申setConfigValue鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
66 *
67 * Revision 1.97 2005/06/30 07:21:42 aga4096
68 * 鐃緒申get_all_index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
69 *
70 * Revision 1.96 2005/06/29 00:10:18 aga4096
71 * 鐃緒申login name -> additional info 鐃緒申鐃緒申鐃緒申.
72 *
73 * Revision 1.95 2005/06/24 02:07:34 tani
74 * insertItemDirect鐃緒申鐃緒申鐃緒申(Import鐃緒申)
75 * getPrivateItemID鐃緒申鐃緒申BINDER鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申)
76 *
77 * Revision 1.94 2005/06/23 07:58:12 aga4096
78 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
79 *
80 * Revision 1.93 2005/06/14 01:02:20 aga4096
81 * 鐃緒申鐃緒申鐃緒申Binder鐃緒申鐃緒申鐃緒申鐃緒申. xnp_extract_public_item_id, xnp_extract_nonbinder_item_id 鐃緒申鐃緒申鐃緒申.
82 *
83 * Revision 1.92 2005/06/08 04:27:08 tani
84 * default鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
85 *
86 * Revision 1.91 2005/06/07 01:10:33 tani
87 * SQLGetData鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
88 * SQLExecDirect鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申SQLExecute鐃緒申鐃緒申鐃緒申.
89 *
90 * Revision 1.90 2005/05/23 08:00:30 tani
91 * insertGroup, updateGroup: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
92 *
93 * Revision 1.89 2005/05/18 10:00:17 aga4096
94 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
95 *
96 * Revision 1.88 2005/03/17 16:02:40 orrisroot
97 * UNIX 鐃緒申鐃緒申鐃緒申鐃緒申 SQLLEN 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申configure
98 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 config.h 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
99 * 鐃緒申 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 MacOS X 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
100 *
101 * Revision 1.87 2005/03/15 12:09:39 tani
102 * deleteItem 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
103 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
104 *
105 * Revision 1.86 2005/03/15 04:49:40 tani
106 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
107 *
108 * Revision 1.85 2005/03/14 09:30:50 aga4096
109 * 鐃緒申getItemCountByIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
110 *
111 * Revision 1.84 2005/03/14 06:12:11 tani
112 * __BORLANDC__鐃緒申鐃緒申.
113 *
114 * Revision 1.83 2005/03/11 20:00:28 orrisroot
115 * - Autotoolized XooNiPs Abstract Layer projects.
116 * - changelog.cc commonal.cc index.cc item.cc :
117 * included <time.h> header file for undefined data type 'time_t' error.
118 *
119 * Revision 1.82 2005/03/11 07:11:30 tani
120 * itemid_t鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(*iidsLen)鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
121 *
122 * Revision 1.81 2005/03/11 00:34:57 tani
123 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申certify_state鐃緒申鐃緒申.
124 *
125 * Revision 1.80 2005/03/09 07:27:37 aga4096
126 * 鐃緒申activate=0鐃緒申鐃緒申loginUser鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
127 *
128 * Revision 1.79 2005/03/07 01:20:09 aga4096
129 * 鐃緒申getItemCountGroupByIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
130 *
131 * Revision 1.78 2005/03/05 02:28:05 aga4096
132 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 Private 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
133 *
134 * Revision 1.77 2005/03/05 01:48:35 aga4096
135 * 鐃緒申getItemCountGroupByIndex鐃緒申鐃緒申鐃緒申.
136 *
137 * Revision 1.76 2005/03/04 06:13:28 aga4096
138 * 鐃緒申updateIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
139 *
140 * Revision 1.75 2005/03/03 10:13:00 aga4096
141 * 鐃緒申isValidSession鐃緒申timestamp鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
142 * 鐃緒申session鐃緒申isValidSession鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申1鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
143 * 鐃緒申loginUser, createSession鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申session鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
144 *
145 * Revision 1.74 2005/02/26 05:11:31 tani
146 * getGroupItemID鐃緒申鐃緒申.
147 *
148 * Revision 1.73 2005/02/25 07:41:35 tani
149 * getGroupItemID鐃緒申鐃緒申.
150 * item, index鐃緒申limit鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
151 *
152 * Revision 1.72 2005/02/25 01:03:42 tani
153 * dbtype==DBTYPE_SQLITE鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
154 *
155 * Revision 1.71 2005/02/24 11:32:55 aga4096
156 * 鐃緒申updateGroup鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
157 *
158 * Revision 1.70 2005/02/23 06:39:28 tani
159 * isGuestEnabled: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
160 *
161 * Revision 1.69 2005/02/22 02:39:30 tani
162 * public_item_target_user_all鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
163 * SQL鐃緒申鐃緒申public_item_target_user_all鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申public_item_target_user_all鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
164 * session鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申LEFT JOIN鐃緒申鐃緒申鐃緒申鐃緒申sid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
165 * DB鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
166 *
167 * Revision 1.68 2005/02/21 05:46:18 tani
168 * getItemCount鐃緒申鐃緒申鐃緒申.
169 * dumpItemID, getItems鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
170 *
171 * Revision 1.67 2005/02/19 02:06:11 tani
172 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
173 *
174 * Revision 1.66 2005/02/16 10:03:13 youi
175 * publication_year/month/mday鐃緒申鐃緒申鐃緒申.
176 *
177 * Revision 1.65 2005/02/16 07:37:17 youi
178 * insertItem, updateItem, getItems: publication_date鐃緒申鐃緒申鐃緒申.
179 *
180 * Revision 1.64 2005/02/15 02:35:47 youi
181 * SQLINTEGER鐃緒申鐃緒申SQLLEN鐃緒申鐃緒申鐃緒申鐃緒申.
182 *
183 * Revision 1.63 2005/02/10 02:33:16 aga
184 * 鐃緒申zipCreate鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
185 *
186 * Revision 1.62 2005/02/09 11:11:52 youi
187 * deleteItem鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
188 *
189 * Revision 1.61 2005/02/09 07:23:50 aga
190 * 鐃緒申URL to My Personal Archive 鐃緒申DB鐃緒申AL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
191 *
192 * Revision 1.60 2005/02/09 02:14:15 aga
193 * 鐃緒申initializeDB()鐃緒申dbtype鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(SQLite鐃緒申).
194 *
195 * Revision 1.59 2005/02/08 07:15:02 youi
196 * pubmed鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申:
197 *
198 * Revision 1.58 2005/02/08 06:40:51 youi
199 * pubmedComplete:鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申pubmed_t鐃緒申鐃緒申鐃緒申鐃緒申.
200 *
201 * Revision 1.57 2005/02/03 12:04:58 youi
202 * getOwnPublicItemID鐃緒申鐃緒申鐃緒申.
203 * binder_item_link鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
204 *
205 * Revision 1.56 2005/01/29 09:49:22 youi
206 * syslog_printf: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
207 * getCertifyPermission: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申sql鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
208 * SQLINTEGER->SQLLEN鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
209 * getItemPermission: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
210 *
211 * Revision 1.55 2005/01/28 07:01:38 youi
212 * getItemIDByIndexID: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
213 * SQLAllocHandle鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
214 *
215 * Revision 1.54 2005/01/28 00:36:58 aga
216 * 鐃緒申freeString鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
217 *
218 * Revision 1.53 2005/01/27 08:30:35 youi
219 * getIndexIDByItemID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
220 *
221 * Revision 1.52 2005/01/25 06:46:50 aga
222 * 鐃緒申Binders鐃緒申鐃緒申鐃緒申index鐃緒申deleteIndex鐃緒申鐃緒申.
223 * 鐃緒申getItems鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
224 *
225 * Revision 1.51 2005/01/24 10:50:29 youi
226 * freeItemType,getItemTypes鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
227 *
228 * Revision 1.50 2005/01/24 01:54:38 youi
229 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
230 * dumpItemID, getItemIDByBinderID, getItemIDByIndexID
231 * 鐃緒申鐃緒申鐃緒申鐃緒申
232 * getPrivateItemID, getUncertifiedLink
233 *
234 * Revision 1.49 2005/01/22 09:30:58 youi
235 * setLastErrorString鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
236 *
237 * Revision 1.48 2005/01/22 04:18:22 aga
238 * 鐃緒申loginUser, insertAccount鐃緒申鐃緒申鐃緒申md5()鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
239 *
240 * Revision 1.47 2005/01/22 02:41:14 aga
241 * 鐃緒申amazon鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
242 *
243 * Revision 1.46 2005/01/21 01:36:11 youi
244 * pubmed鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
245 *
246 * Revision 1.45 2005/01/19 10:07:53 aga
247 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
248 *
249 * Revision 1.44 2005/01/19 06:01:59 youi
250 * 鐃緒申鐃緒申鐃緒申鐃緒申
251 * getConfigValue
252 * setConfigValue
253 * getChangeLogs
254 * insertChangeLog
255 * getItemIDByBinderID
256 * registerBinderItem
257 * unregisterBinderItem
258 * getIndexPermission
259 * freeString
260 * freeChangeLog
261 * 鐃緒申鐃緒申鐃緒申criteria_t鐃緒申鐃緒申鐃緒申
262 * getItemIDByIndexID
263 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
264 * getCertifyState
265 * setCertifyState
266 * getCertifyPermission
267 * sessionID2UID,querySimple,queryGetUnsignedInt鐃緒申鐃緒申鐃緒申
268 * insertItem鐃緒申鐃緒申鐃緒申鐃緒申PrivateIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
269 * getItems: getItemPermission鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
270 *
271 * Revision 1.43 2005/01/19 01:42:15 aga
272 * 鐃緒申x_xoonips_index鐃緒申gid,uid鐃緒申0鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
273 *
274 * Revision 1.42 2005/01/19 00:51:29 aga
275 * 鐃緒申insertIndex鐃緒申x_xoonips_index.index_id鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
276 *
277 * Revision 1.41 2005/01/19 00:06:51 aga
278 * 鐃緒申updateIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
279 * 鐃緒申createSession鐃緒申鐃緒申uid鐃緒申Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申activate鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
280 *
281 * Revision 1.40 2005/01/17 00:15:05 aga
282 * 鐃緒申deleteIndex, updateIndex鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
283 *
284 * Revision 1.39 2005/01/15 05:38:10 youi
285 * insertAccount: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
286 * updateAccount: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
287 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
288 * insertItem, getItem, getItems, dumpItemID, updateItem, deleteItem鐃緒申鐃緒申.
289 * freeGID, freeUID: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
290 *
291 * Revision 1.38 2005/01/15 00:39:16 aga
292 * 鐃緒申x_xoonips_item_basic鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
293 *
294 * Revision 1.37 2005/01/14 10:36:59 aga
295 * 鐃緒申index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
296 * 鐃緒申insertAccount鐃緒申private index鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
297 * 鐃緒申insertGroup鐃緒申group index 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
298 *
299 * Revision 1.36 2005/01/13 04:19:22 aga
300 * 鐃緒申VP鐃緒申XNP鐃緒申鐃緒申鐃緒申.
301 *
302 * Revision 1.35 2005/01/06 07:20:17 youi
303 * WIN32鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
304 * MySQL API鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
305 * deleteAccount: 鐃緒申鐃緒申鐃緒申鐃緒申Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
306 * insertAccount: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
307 * deleteMember: 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
308 * deleteMemberNoLimit鐃緒申鐃緒申鐃緒申.
309 *
310 * Revision 1.34 2004/12/28 04:38:14 aga
311 * 鐃緒申logoutUser()鐃緒申鐃緒申鐃緒申.
312 *
313 * Revision 1.33 2004/12/27 05:56:23 youi
314 * odbcDiagString: STMT鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
315 * syslog鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
316 *
317 * Revision 1.32 2004/12/25 09:46:47 youi
318 * MySQL+MyODBC鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
319 *
320 * Revision 1.31 2004/12/21 11:42:59 youi
321 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
322 *
323 * Revision 1.30 2004/12/18 10:24:54 youi
324 * IMPORT_MYSQLDLL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申MYSQL鐃緒申DLL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
325 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
326 *
327 * Revision 1.29 2004/12/18 01:12:29 youi
328 * freeResult鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申free<鐃緒申鐃緒申鐃緒申鐃緒申>鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
329 *
330 * Revision 1.28 2004/12/14 12:02:08 youi
331 * __WIN__鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申windows鐃緒申dll鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
332 * USE_SYSLOG鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申syslogd鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
333 * getAccounts: uidsLen鐃緒申0鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
334 *
335 * Revision 1.27 2004/12/06 11:34:47 aga
336 * 鐃緒申uninitializeDB()鐃緒申鐃緒申鐃緒申.
337 *
338 * Revision 1.26 2004/12/06 10:17:36 youi
339 * mysql_use_result鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
340 * while( row = mysql_fetch_row(result) );鐃緒申鐃緒申鐃緒申鐃緒申
341 *
342 * Revision 1.25 2004/12/06 07:24:33 youi
343 * insertAccount, insertGroup:
344 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
345 *
346 * Revision 1.24 2004/12/06 01:45:50 aga
347 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
348 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
349 *
350 * Revision 1.23 2004/12/04 09:21:10 aga
351 * 鐃緒申xnp_config 鐃緒申 xoonips_config.
352 *
353 * Revision 1.22 2004/12/03 07:17:21 youi
354 * isModerator鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
355 *
356 * Revision 1.21 2004/12/01 10:28:58 youi
357 * DB鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
358 * institute -> division
359 * organizaion -> company_name
360 *
361 * Revis1.20 2004/12/01 04:37:04 youi
362 * freeResult: unsigned int* 鐃緒申 int* 鐃緒申鐃緒申鐃緒申.
363 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
364 *
365 * Revision 1.19 2004/11/30 06:40:11 youi
366 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(gidExists, uidExists)
367 * getGroupCount鐃緒申鐃緒申鐃緒申.
368 * getGroupsByUid鐃緒申鐃緒申鐃緒申.
369 * isGroupAdmin鐃緒申鐃緒申鐃緒申.
370 * dumpGroupAdmins鐃緒申鐃緒申鐃緒申.
371 * deleteMember鐃緒申鐃緒申鐃緒申.
372 * insertMember鐃緒申鐃緒申鐃緒申.
373 * getMembers鐃緒申鐃緒申鐃緒申.
374 * isModerator鐃緒申鐃緒申鐃緒申.
375 *
376 * Revision 1.18 2004/11/30 05:46:32 aga
377 * 鐃緒申session鐃緒申鐃緒申remoteHost鐃緒申鐃緒申鐃緒申.
378 *
379 * Revision 1.17 2004/11/27 09:35:49 youi
380 * isActivated鐃緒申鐃緒申鐃緒申.
381 * activate鐃緒申鐃緒申鐃緒申.
382 * dumpUid鐃緒申鐃緒申鐃緒申.
383 *
384 * Revision 1.16 2004/11/27 06:29:29 youi
385 * getAccountCount鐃緒申鐃緒申鐃緒申.
386 * dumpGids鐃緒申鐃緒申鐃緒申.
387 * insertGroup, deleteGroup, updateGroup鐃緒申鐃緒申鐃緒申.
388 * getGroup, getGroups鐃緒申鐃緒申鐃緒申.
389 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申RES_DB_NOT_INITIALIZED鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
390 * (鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申)
391 *
392 * Revision 1.15 2004/11/27 02:22:22 aga
393 * 鐃緒申initializeDB鐃緒申鐃緒申addSlashes()鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
394 *
395 * Revision 1.14 2004/11/27 01:07:31 youi
396 * criteria2str: LIMIT鐃緒申ORDER BY鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
397 *
398 * Revision 1.13 2004/11/27 00:35:39 youi
399 * getAccounts鐃緒申鐃緒申鐃緒申.
400 * getAccount鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申getAccounts鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
401 * criteria2str鐃緒申鐃緒申鐃緒申.
402 *
403 * Revision 1.12 2004/11/26 09:45:28 youi
404 * getAccount鐃緒申鐃緒申鐃緒申.
405 *
406 * Revision 1.11 2004/11/26 08:16:26 aga
407 * 鐃緒申getSession, loginUser, createSession, freeResult(const session_t*) 鐃緒申鐃緒申.
408 *
409 * Revision 1.10 2004/11/26 07:57:42 youi
410 * updateAccount, deleteAccount鐃緒申鐃緒申鐃緒申.
411 * mysql_query鐃緒申鐃緒申鐃緒申鐃緒申stderr鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
412 *
413 * Revision 1.9 2004/11/26 07:38:02 aga
414 * 鐃緒申FAILUE -> FAILURE.
415 *
416 * Revision 1.8 2004/11/26 06:36:55 aga
417 * 鐃緒申createSession, getSession 鐃緒申鐃緒申鐃緒申.
418 *
419 * Revision 1.7 2004/11/26 04:51:47 youi
420 * dbprefix鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
421 * insertAccount鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
422 * isValidSessionID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
423 *
424 * Revision 1.6 2004/11/26 04:35:55 aga
425 * 鐃緒申loginUser(), logoutUser()鐃緒申鐃緒申鐃緒申.
426 *
427 * Revision 1.5 2004/11/26 01:08:25 aga
428 * 鐃緒申addSlashes()鐃緒申鐃緒申.
429 *
430 * Revision 1.4 2004/11/25 12:14:29 youi
431 * getUid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
432 *
433 * Revision 1.3 2004/11/25 11:13:59 youi
434 * getLastErrorString/setLastErrorString鐃緒申鐃緒申鐃緒申.
435 *
436 * Revision 1.2 2004/11/25 08:55:19 youi
437 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
438 * freeResult鐃緒申鐃緒申鐃緒申.
439 *
440 * Revision 1.1 2004/11/25 05:14:58 youi
441 * initial version
442 *
443 *
444 */
445 #ifdef HAVE_CONFIG_H
446 # include <config.h>
447 #endif
448
449 #ifdef WIN32
450 #include <windows.h>
451 #endif
452
453 #ifdef USE_SYSLOG
454 #include <syslog.h>
455 #endif
456
457 #include <stdio.h>
458 #include <stdlib.h>
459 #include <string.h>
460 #include <string>
461 #include <assert.h>
462 #include <time.h>
463 #include <sql.h>
464 #include <sqlext.h>
465 #include <libxml/xmlreader.h>
466
467 using namespace std;
468
469 #include "common.h"
470 #include "account.h"
471 #include "group.h"
472 #include "session.h"
473 #include "item.h"
474 #include "itemtype.h"
475 #include "criteria.h"
476 #include "commonal.h"
477 #include "item.h"
478 #include "index.h"
479 #include "changelog.h"
480 #include "pubmed.h"
481 #include "amazonbook.h"
482
483 static string dbprefix; //!< XOOPS鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申PREFIX
484 static dbtype_t dbtype; //!< MySQL/SQLite
485 static bool useSyslogFlag = false;
486
487 static SQLHANDLE henv = NULL;
488 static SQLHANDLE hdbc = NULL;
489
490
491 static bool processEsummary(xmlTextReaderPtr reader, pubmed_t* p);
492 static bool processEsearch(xmlTextReaderPtr reader, pubmed_t* p, int* DocID );
493 static void processEfetch(xmlTextReaderPtr reader, pubmed_t* p);
494 static int streamPubmedFile(const char *filename, pubmed_t* p);
495 static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid );
496 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode );
497 static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid );
498 static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value );
499 static void setLastErrorString( const char* str );
500 static result_t checkTitleConflict( sessionid_t sid, indexid_t parentIndexID, const char *title, bool *conflict );
501 static result_t _insertItem( sessionid_t sid, const item_t* item, itemid_t* itemid, bool direct );
502 static result_t getEvents(sessionid_t sid, event_t** events, int* eventsLen, string condition );
503 static result_t insertMetadataEvent( metadataevent_t me, itemid_t iid );
504 static result_t insertMetadataEventAuto( itemid_t iid, bool isCreate = false );
505
506 static void syslog_printf( char* format, ... )
507 {
508 #ifdef USE_SYSLOG
509 if ( useSyslogFlag ){
510 va_list ap;
511 va_start(ap, format);
512 openlog( "commonal", LOG_ODELAY, LOG_USER );
513 vsyslog( LOG_DEBUG, format, ap );
514 }
515 #endif
516 }
517
518 void useSyslog( bool f )
519 {
520 useSyslogFlag = f;
521 }
522
523 /** ',' . implode( ',', pi ) 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申comma鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
524 * @param pi int鐃緒申鐃緒申
525 * @param len 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
526 */
527 static string getCsvStr( const itemid_t *pi, int len ){
528 char *buf = new char[(sizeof(int)*3+1)*len+1];
529 buf[0] = '\0';
530 char *p = buf;
531 for ( int i = 0; i < len; i++ ){
532 int len = sprintf( p, ",%u", pi[i] );
533 p += len;
534 }
535 string iids_str(buf);
536 delete[] buf;
537 return iids_str;
538 }
539
540 /**
541 *
542 * public_item_target_user鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申'all'鐃緒申鐃緒申true鐃緒申鐃緒申鐃緒申鐃緒申
543 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申'all'鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申false鐃緒申鐃緒申鐃緒申鐃緒申
544 *
545 */
546 static bool public_item_target_user_all( )
547 {
548 char* value = 0;
549 bool public_item_target_user_all = false;
550 if( getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value ) == RES_OK ){
551 public_item_target_user_all = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 );
552 freeString( value );
553 }
554 return public_item_target_user_all;
555 }
556
557 static result_t countResultRows( const char* sql, SQLLEN* count )
558 {
559 result_t ret = RES_ERROR;
560 SQLRETURN sqlcode;
561 SQLHANDLE hstmt = NULL;
562 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
563 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){
564 *count = 0;
565 while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++;
566 ret = RES_OK;
567 }else{
568 string s( "SQLExecDirect in countResultRows " );
569 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
570 s += "sql=";
571 s += string( sql );
572 setLastErrorString( s.c_str( ) );
573 ret = RES_DB_QUERY_ERROR;
574 }
575 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
576 }
577 return ret;
578 }
579
580
581 /**
582 *
583 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
584 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
585 *
586 */
587 static certify_t getInitialCertifyStateFromConfig( )
588 {
589 char* certify_item_val;
590 certify_t ret = index::NOT_CERTIFIED;
591
592 if( getConfigValue( XNP_CONFIG_CERTIFY_ITEM_KEY, &certify_item_val ) == RES_OK ){
593 if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_AUTO ) == 0 ){
594 //certify automatic
595 ret = index::CERTIFIED;
596 }else if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_ON ) == 0 ){
597 //certify by moderator or group admin
598 ret = index::CERTIFY_REQUIRED;
599 }
600 syslog_printf( "\ngetInitialCertifyStateFromConfig certify_item_val=%s", certify_item_val );
601 freeString( certify_item_val );
602 }
603 return ret;
604 }
605
606 /**
607 *
608 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申Activate鐃緒申
609 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
610 *
611 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
612 * @return true Activate鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
613 * @return false Activate鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
614 *
615 */
616 static bool isActivatedBySession( sessionid_t sid )
617 {
618 const session_t* session;
619 if( getSession( sid, &session ) == RES_OK ){
620 userid_t sess_uid = session -> getUID( );
621 freeSession( session );
622 return isActivated( sid, sess_uid );
623 }
624 return false;
625 }
626
627 /**
628 *
629 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
630 *
631 *
632 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
633 * @return true 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
634 * @return false 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
635 *
636 */
637 static bool isModeratorBySession( sessionid_t sid )
638 {
639 const session_t* session;
640 if( getSession( sid, &session ) == RES_OK ){
641 userid_t sess_uid = session -> getUID( );
642 freeSession( session );
643 return isModerator( sid, sess_uid );
644 }
645 return false;
646 }
647
648
649 // SQLAllocHandle鐃緒申SQLExecDirect鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申hstmt鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
650 class sqlexec_t {
651 private:
652 SQLRETURN sqlcode;
653 SQLHANDLE hstmt;
654 public:
655 SQLRETURN getSqlcode(){ return sqlcode; }
656 SQLHANDLE getHstmt(){ return hstmt; }
657 //SQLRETURN SQLFetch(){ return sqlcode = SQLFetch(hstmt); } // 鐃緒申鐃緒申鐃緒申wrapper鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
658
659 /** 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申: SQLAllocHandle, SQLExecDirect鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申getSqlcode()==SQL_SUCCESS
660 * @param functionName 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
661 * @param sql 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申SQL
662 * @param ret 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
663 */
664 sqlexec_t( const char *functionName, string &sql, result_t *ret ){
665 sqlcode = 0;
666 hstmt = 0;
667
668 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
669 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
670 return;
671 }else {
672 string s( "SQLExecDirect in " );
673 s += functionName;
674 s += " ";
675 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
676 s += " sql=";
677 s += string( sql );
678 setLastErrorString( s.c_str( ) );
679 *ret = RES_DB_QUERY_ERROR;
680 return;
681 }
682 }else {
683 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in " );
684 s += functionName;
685 s += " ";
686 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
687 setLastErrorString( s.c_str( ) );
688 *ret = RES_ERROR;
689 return;
690 }
691 }
692 ~sqlexec_t(){
693 if ( hstmt )
694 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
695 }
696 };
697
698
699 /** SQL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
700 * @param sql sql
701 * @return result_t
702 */
703 static result_t querySimple( const char *functionName, string &sql ){
704 result_t ret = RES_ERROR;
705 SQLRETURN sqlcode;
706 SQLHANDLE hstmt = NULL;
707 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
708 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
709 ret = RES_OK;
710 }else{
711 string s( "SQLExecDirect in querySimple " );
712 s += functionName;
713 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
714 s += "sql=";
715 s += sql;
716 setLastErrorString( s.c_str( ) );
717 ret = RES_DB_QUERY_ERROR;
718 }
719 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
720 }
721 else {
722 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in querySimple " );
723 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
724 setLastErrorString( s.c_str( ) );
725 ret = RES_ERROR;
726 }
727 return ret;
728 }
729
730 /** SQL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申1鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(NULL鐃緒申鐃緒申0鐃緒申鐃緒申鐃緒申鐃緒申)鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
731 * @param sql sql
732 * @param u 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
733 * @return result_t
734 */
735 static result_t queryGetUnsignedInt( const char *functionName, string &sql, unsigned int *u ){
736 result_t ret = RES_ERROR;
737 SQLRETURN sqlcode;
738 SQLHANDLE hstmt = NULL;
739
740 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
741 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){
742 SQLUINTEGER sInt = 0;
743 SQLLEN len = 0;
744 SQLBindCol( hstmt, 1, SQL_C_ULONG, &sInt, 0, &len );
745 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
746 if ( len == SQL_NULL_DATA )
747 sInt = 0;
748 *u = sInt;
749 ret = RES_OK;
750 }else{
751 string s( "SQLFetch in queryGetUnsignedInt " );
752 s += functionName;
753 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
754 setLastErrorString( s.c_str( ) );
755 ret = RES_ERROR;
756 }
757 }else{
758 string s( "SQLExecDirect in queryGetUnsignedInt " );
759 s += functionName;
760 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
761 s += "sql=";
762 s += sql;
763 setLastErrorString( s.c_str( ) );
764 ret = RES_DB_QUERY_ERROR;
765 }
766 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
767 }
768 else {
769 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in queryGetUnsignedInt " );
770 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
771 setLastErrorString( s.c_str( ) );
772 ret = RES_ERROR;
773 }
774 return ret;
775 }
776
777 /**
778 *
779 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
780 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申NULL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
781 * ( dst鐃緒申鐃緒申鐃緒申鐃緒申 >= len + 1 )鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
782 *
783 */
784 static char* strncpy2( char* dst, const char* src, int len )
785 {
786 strncpy( dst, src, len );
787 dst[ len ] = '\0';
788 syslog_printf( "\nstrncpy2 '%s'\n", dst );
789 return dst;
790 }
791
792 /**
793 *
794 * SQL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
795 *
796 * @param hstmt SQL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
797 * @param sqlcode SQLExecDirect,SQLExecute鐃緒申鐃緒申鐃緒申鐃緒申
798 * @return 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
799 */
800 static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode )
801 {
802 string s;
803 if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){
804 SQLCHAR SQLState[6];
805 SQLINTEGER NativeError;
806 SQLCHAR MessageText[ 1024 ];
807 SQLSMALLINT TextLength;
808 SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength );
809
810 s += string( (char*)MessageText );
811 s += " SQLSTATE=";
812 s += string( (char*)SQLState );
813
814 }
815 s += " sqlcode=";
816 s += intToString( sqlcode );
817 return s;
818 }
819
820 /**
821 *
822 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
823 *
824 */
825 string getResultCol( SQLHANDLE hstmt, int col, SQLSMALLINT targetType = SQL_C_CHAR )
826 {
827 string s;
828 SQLRETURN sqlcode;
829 SQLCHAR BinaryPtr[5000];
830 SQLLEN BinaryLenOrInd;
831 SQLINTEGER NumBytes;
832
833 syslog_printf( "getResultCol" );
834 while ( ( sqlcode = SQLGetData(hstmt, col, targetType, BinaryPtr, sizeof(BinaryPtr),
835 &BinaryLenOrInd)) != SQL_NO_DATA) {
836 syslog_printf( "SQLGetData BinaryLenOrInd=%d", BinaryLenOrInd );
837 NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd;
838 if( NumBytes <= 0 ) break;
839 else if( NumBytes > 0 ){
840 s += string( (char*)BinaryPtr, NumBytes );
841 }
842 }
843 syslog_printf( "getResultCol returns %s", s.c_str() );
844 return s;
845 }
846
847
848 /**
849 *
850 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申\鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
851 *
852 * @param str addslashes鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申NULL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
853 * @return 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
854 */
855 string addSlashes( const char *str )
856 {
857 if ( hdbc == NULL ){
858 string s;
859 return s;
860 }else{
861 string s( str );
862 return s;
863 }
864
865 int len = strlen(str) * 3;
866 char* dst = new char[ len ];
867 const char* from = str;
868 char* to = dst;
869 while( *from != '\0' ){
870 switch( *from ){
871 case '\'':
872 case '\"':
873 case ';':
874 *to = '\\'; to++;
875 break;
876 }
877 *to = *from; to++;
878 from++;
879 }
880 *to = '\0';
881 string s( dst );
882 delete[] dst;
883 return s;
884 }
885
886 /** Xoops Module 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
887 * @param module 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申dirname
888 * @param key 鐃緒申鐃緒申鐃緒申key
889 * @param value 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
890 * @return
891 */
892 static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value ){
893 SQLRETURN sqlcode;
894 SQLHANDLE hstmt = NULL;
895 result_t result = RES_ERROR;
896
897 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
898 string sql = "SELECT conf_value "
899 " from " + dbprefix + "_config as tc, " + dbprefix + "_modules as tm "
900 " where tm.mid=tc.conf_modid and tm.dirname = ? and tc.conf_name = ? ";
901 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
902 SQLLEN cbModule = SQL_NTS, cbKey = SQL_NTS;
903 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(module), 0, (SQLCHAR *)module, 0, &cbModule );
904 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(key), 0, (SQLCHAR *)key, 0, &cbKey );
905 sqlcode = SQLExecute( hstmt );
906 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
907 if ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
908 string s = getResultCol( hstmt, 1 );
909 *value = new char[s.length()+1];
910 strcpy( *value, s.c_str() );
911 result = RES_OK;
912 }
913 else if ( sqlcode == SQL_NO_DATA ){
914 *value = 0;
915 result = RES_OK;
916 }
917 else {
918 string s( "SQLFetch in getXoopsModuleConfig " );
919 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
920 s += "sql=";
921 s += sql;
922 setLastErrorString( s.c_str( ) );
923 result = RES_ERROR;
924 }
925 }else{
926 string s( "SQLExecDirect in getXoopsModuleConfig " );
927 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
928 s += "sql=";
929 s += sql;
930 setLastErrorString( s.c_str( ) );
931 result = RES_DB_QUERY_ERROR;
932 }
933 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
934 }
935 else {
936 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getXoopsModuleConfig " );
937 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
938 setLastErrorString( s.c_str( ) );
939 result = RES_ERROR;
940 }
941 return result;
942 }
943
944 /** 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申XooNiPs鐃緒申Public鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
945 */
946 static bool isGuestEnabled(){
947 char *value = 0;
948 result_t result = getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value );
949 if ( result != RES_OK )
950 return false;
951 if ( value == 0 )
952 return false;
953 bool enabled = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 );
954 freeString( value );
955 return enabled;
956 }
957
958 /** sid鐃緒申鐃緒申uid鐃緒申鐃緒申鐃緒申鐃緒申
959 * @param sid session id
960 * @param uid uid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
961 * @return RES_OK
962 * sid鐃緒申鐃緒申鐃緒申鐃緒申sessionid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申*uid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申uid鐃緒申鐃緒申鐃緒申鐃緒申
963 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申XooNiPs鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申 鐃緒申鐃緒申sid鐃緒申session::SID_GUEST(=0)鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申*uid鐃緒申鐃緒申account::UID_GUEST(=0)鐃緒申鐃緒申鐃緒申鐃緒申
964 * @return 鐃緒申鐃緒申鐃緒申 鐃緒申鐃緒申鐃緒申
965 */
966 static result_t sessionID2UID( sessionid_t sid, userid_t *uid ){
967 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
968
969 if ( sid == session::SID_GUEST ){
970 if ( isGuestEnabled() ){
971 *uid = account::UID_GUEST;
972 return RES_OK;
973 }
974 return RES_NO_SUCH_SESSION;
975 }
976 else {
977 string sql = "SELECT uid FROM " + dbprefix + "_xoonips_session WHERE sid=" + unsignedIntToString(sid);
978 syslog_printf( "sql=%s", sql.c_str() );
979 return queryGetUnsignedInt( "sessionID2UID", sql, uid );
980 }
981 }
982
983
984
985 /**
986 *
987 * gid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
988 * DB鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申false鐃緒申鐃緒申鐃緒申鐃緒申
989 *
990 * @param gid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申GID
991 * @return true 鐃緒申鐃緒申鐃緒申鐃緒申
992 * @return false 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
993 *
994 */
995 static bool gidExists( groupid_t gid )
996 {
997 string sql;
998 SQLRETURN sqlcode;
999 SQLHANDLE hstmt = NULL;
1000
1001 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) {
1002 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" );
1003 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1004 setLastErrorString( s.c_str( ) );
1005 return false;
1006 }
1007
1008 sql = "SELECT * FROM " + dbprefix + "_xoonips_groups ";
1009 sql += "WHERE gid=" + string( unsignedIntToString( gid ) );
1010 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){
1011 setLastErrorString( "SQLExecDirect in gidExists" );
1012 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1013 return false;
1014 }
1015
1016 if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){
1017 setLastErrorString( "SQLFetch in gidExists" );
1018 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1019 return false;
1020 }
1021
1022 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1023 return true;
1024 }
1025
1026
1027 /**
1028 *
1029 * Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申uid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
1030 * DB鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申false鐃緒申鐃緒申鐃緒申鐃緒申
1031 *
1032 * @param uid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申UID
1033 * @return true 鐃緒申鐃緒申鐃緒申鐃緒申
1034 * @return false 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1035 *
1036 */
1037 static bool uidExists( userid_t uid )
1038 {
1039 bool ret = false;
1040 string sql;
1041 SQLHANDLE hstmt = NULL;
1042 SQLRETURN sqlcode;
1043
1044 sql = "SELECT * FROM " + dbprefix + "_xoonips_users ";
1045 sql += "WHERE uid=" + string( unsignedIntToString( uid ) );
1046 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1047 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1048 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1049 ret = true;
1050 }else{
1051 string s( "SQLFetch in uidExists ");
1052 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1053 s += string( ", sql=" ) + string( sql );
1054 setLastErrorString( s.c_str( ) );
1055 ret = false;
1056 }
1057 }else{
1058 string s( "SQLExecDirect in uidExists ");
1059 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1060 s += string( ", sql=" ) + string( sql );
1061 setLastErrorString( s.c_str( ) );
1062 ret = false;
1063 }
1064 }else{
1065 string s( "SQLAllocHandle in uidExists ");
1066 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1067 setLastErrorString( s.c_str( ) );
1068 ret = false;
1069 }
1070 return ret;
1071 }
1072
1073
1074 /**
1075 *
1076 * criteria 鐃緒申 SQL鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1077 *
1078 *
1079 *
1080 */
1081 string criteria2str( criteria* cri )
1082 {
1083 string sql;
1084
1085 const orderby* odrby = cri -> headOrderBy( );
1086 if( odrby != 0 ){
1087 sql += " ORDER BY " + string( odrby -> getColumn( ) );
1088 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
1089 while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){
1090 sql += ", " + string( odrby -> getColumn( ) );
1091 sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " ";
1092 }
1093 }
1094
1095 if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){
1096 sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) )
1097 + ", " + string( intToString( cri -> getLimitRows( ) ) );
1098 }
1099 return sql;
1100 }
1101
1102
1103 /**
1104 *
1105 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1106 *
1107 * @param dsn ODBC鐃緒申DSN
1108 * @param user 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1109 * @param password 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1110 * @param reserve 鐃緒申鐃緒申鐃緒申(NULL)
1111 * @param prefix XOOPS鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申PREFIX
1112 * @param type DBTYPE_MYSQL or DBTYPE_SQLITE
1113 * @return RES_OK
1114 * @return RES_DB_INITIALIZE_ERROR
1115 * @return RES_DB_CONNECT_ERROR
1116 * @see result_t
1117 */
1118 result_t initializeDB( const char* dsn, const char* user, const char* password, const char* reserve, const char* prefix, dbtype_t type )
1119 {
1120 SQLRETURN sqlcode;
1121
1122 // 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1123 if ( hdbc != NULL ){
1124 SQLDisconnect( hdbc );
1125 hdbc = NULL;
1126 }
1127
1128 dbprefix = prefix;
1129 dbtype = type;
1130
1131 // 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1132 // if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) {
1133 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ) != SQL_SUCCESS ) {
1134 string s( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" );
1135 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1136 setLastErrorString( s.c_str( ) );
1137 syslog_printf( "initializeDB %s", getLastErrorString( ) );
1138 return RES_DB_INITIALIZE_ERROR;
1139 }
1140 //ODBC Ver.3 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1141 SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
1142
1143 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) {
1144 string s( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" );
1145 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1146 setLastErrorString( s.c_str( ) );
1147 syslog_printf( "initializeDB %s", getLastErrorString( ) );
1148 return RES_DB_INITIALIZE_ERROR;
1149 }
1150 //鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申5鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1151 //SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
1152
1153 if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){
1154 string s( "SQLConnect in initializeDB " );
1155 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1156 setLastErrorString( s.c_str( ) );
1157 syslog_printf( "initializeDB %s", getLastErrorString( ) );
1158 return RES_DB_CONNECT_ERROR;
1159 }
1160 syslog_printf( "initializeDB succeed" );
1161 return RES_OK;
1162 }
1163
1164 /**
1165 *
1166 * 鐃緒申鐃緒申DB鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1167 *
1168 * @param 鐃緒申鐃緒申
1169 * @return RES_OK
1170 */
1171 result_t uninitializeDB()
1172 {
1173 if ( hdbc != NULL ){
1174 SQLDisconnect( hdbc );
1175 hdbc = NULL;
1176 }
1177 return RES_OK;
1178 }
1179
1180 /**
1181 *
1182 * Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1183 *
1184 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1185 * @param uid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申UID
1186 * @return true 鐃緒申鐃緒申鐃緒申鐃緒申
1187 * @return false 鐃緒申鐃緒申鐃緒申
1188 *
1189 */
1190 bool isActivated( sessionid_t sid, userid_t uid )
1191 {
1192 if( hdbc == NULL ) return false;
1193 if( !isValidSessionID( sid ) ) return false;
1194
1195 bool ret = false;
1196 string sql;
1197 SQLRETURN sqlcode;
1198 SQLHANDLE hstmt = NULL;
1199
1200 sql = "SELECT * FROM " + dbprefix + "_xoonips_users ";
1201 sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) );
1202 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1203 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1204 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1205 ret = true;
1206 }else{
1207 string s( "SQLFetch in isActivated " );
1208 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1209 s += ", sql=" + sql;
1210 setLastErrorString( s.c_str() );
1211 ret = false;
1212 }
1213 }else{
1214 string s( "SQLExecDirect in isActivated " );
1215 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1216 s += ", sql=" + sql;
1217 setLastErrorString( s.c_str() );
1218 ret = false;
1219 }
1220 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1221 }else{
1222 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" );
1223 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1224 setLastErrorString( s.c_str( ) );
1225 ret = false;
1226 }
1227 return ret;
1228 }
1229
1230 /**
1231 *
1232 * Platform鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1233 *
1234 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1235 * @param uid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申UID
1236 * @param activate 鐃緒申鐃緒申(true) / 鐃緒申鐃緒申鐃緒申(false)鐃緒申鐃緒申鐃緒申
1237 * @return RES_OK
1238 * @return RES_ERROR
1239 * @return RES_DB_QUERY_ERROR
1240 * @return RES_NO_SUCH_USER
1241 * @return RES_NO_SUCH_SESSION
1242 * @return RES_DB_NOT_INITIALIZED;
1243 */
1244 result_t activate( sessionid_t sid, userid_t uid, bool activate )
1245 {
1246 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1247 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1248
1249 string sql;
1250 SQLHANDLE hstmt = NULL;
1251 SQLRETURN sqlcode;
1252 result_t ret = RES_ERROR;
1253
1254 sql = "UPDATE " + dbprefix + "_xoonips_users ";
1255 sql += "SET activate=" + string( activate ? "1" : "0" );
1256 sql += " WHERE uid=" + string( unsignedIntToString( uid ) );
1257 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1258 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1259 SQLLEN count = 0;
1260 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1261 ret = RES_OK;
1262 }else{
1263 string s( "SQLRowCount in activate ");
1264 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1265 s += string( ", sql=" ) + string( sql );
1266 setLastErrorString( s.c_str( ) );
1267 ret = RES_NO_SUCH_USER;
1268 }
1269 }else{
1270 string s( "SQLExecDirect in activate " );
1271 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1272 s += ", sql=";
1273 s += string( sql );
1274 setLastErrorString( s.c_str( ) );
1275 ret = RES_DB_QUERY_ERROR;
1276 }
1277 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1278 }else{
1279 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" );
1280 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1281 setLastErrorString( s.c_str( ) );
1282 ret = RES_ERROR;
1283 }
1284 return ret;
1285 }
1286
1287 /**
1288 *
1289 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1290 *
1291 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1292 * @return 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(鐃緒申鐃緒申鐃緒申鐃緒申0)
1293 *
1294 */
1295 int getAccountCount( sessionid_t sid )
1296 {
1297 if( hdbc == NULL ) return 0;
1298 if( !isValidSessionID( sid ) ) return 0;
1299
1300 int ret = 0;
1301 string sql;
1302 SQLRETURN sqlcode;
1303 SQLHANDLE hstmt = NULL;
1304
1305 //鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1306 sql = "SELECT COUNT(*) FROM " + dbprefix + "_xoonips_users ";
1307 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1308 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1309 SQLUINTEGER count = 0;
1310 SQLLEN len = 0;
1311 SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len );
1312 if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
1313 ret = count;
1314 }else {
1315 string s( "SQLFetch in getAccountCount sql=" );
1316 s += string( sql );
1317 setLastErrorString( s.c_str( ) );
1318 ret = 0;
1319 }
1320 }else{
1321 setLastErrorString( "SQLExecDirect in getAccountCount" );
1322 ret = 0;
1323 }
1324 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1325 }else{
1326 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" );
1327 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1328 setLastErrorString( s.c_str( ) );
1329 ret = 0;
1330 }
1331 return ret;
1332 }
1333
1334 /**
1335 *
1336 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1337 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1338 *
1339 * @param
1340 * @return RES_OK
1341 * @return RES_ERROR
1342 * @return RES_DB_NOT_INITIALIZED
1343 * @return RES_NO_SUCH_SESSION
1344 * @return RES_DB_QUERY_ERROR
1345 *
1346 */
1347 result_t deleteAccount( sessionid_t sid, userid_t uid )
1348 {
1349 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1350 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1351
1352 result_t ret1 = RES_ERROR, ret2 = RES_ERROR;
1353 criteria_t c;
1354 string sql;
1355 groupid_t* gids;
1356 int gidsLen;
1357 SQLRETURN sqlcode;
1358 SQLHANDLE hstmt = NULL;
1359
1360 /*
1361 1. delete user from default platform group
1362 2. delete user profile from xoops_users
1363 3. delete platform user from xoonips_users
1364 */
1365
1366 //1. delete user from platform groups
1367 c.clearAll();
1368 if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){
1369 for( int i = 0; i < gidsLen; i++ )
1370 deleteMemberNoLimit( sid, gids[ i ], uid );
1371 freeGID( gids );
1372 }
1373
1374 //2. delete user profile from xoops_users
1375 sql = "DELETE FROM " + dbprefix + "_users ";
1376 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1377 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1378 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1379 SQLLEN count = 0;
1380 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1381 ret1 = RES_OK;
1382 }else{
1383 string s( "SQLRowCount in deleteAccount" );
1384 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1385 s += string( ", sql=" ) + string( sql );
1386 setLastErrorString( s.c_str( ) );
1387 ret1 = RES_NO_SUCH_USER;
1388 }
1389 }else{
1390 string s( "SQLExecDirect in deleteAccount" );
1391 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1392 s += ", sql=";
1393 s += string( sql );
1394 setLastErrorString( s.c_str( ) );
1395 ret1 = RES_DB_QUERY_ERROR;
1396 }
1397 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1398 }else{
1399 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1400 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1401 setLastErrorString( s.c_str( ) );
1402 ret1 = RES_ERROR;
1403 }
1404
1405 //3. delete platform user from xoonips_users
1406 sql = "DELETE FROM " + dbprefix + "_xoonips_users ";
1407 sql += "WHERE uid = " + string( unsignedIntToString( uid ) );
1408 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1409 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1410 SQLLEN count = 0;
1411 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1412 ret2 = RES_OK;
1413 }else{
1414 string s( "SQLRowCount in deleteAccount" );
1415 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1416 s += string( ", sql=" ) + string( sql );
1417 setLastErrorString( s.c_str( ) );
1418 ret2 = RES_NO_SUCH_USER;
1419 }
1420 }else{
1421 string s( "SQLExecDirect in deleteAccount" );
1422 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1423 s += ", sql=";
1424 s += string( sql );
1425 setLastErrorString( s.c_str( ) );
1426 ret2 = RES_DB_QUERY_ERROR;
1427 }
1428 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1429 }else{
1430 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" );
1431 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1432 setLastErrorString( s.c_str( ) );
1433 ret2 = RES_ERROR;
1434 }
1435
1436 //鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1437 return ret1 != RES_OK ? ret1 : ret2;
1438 }
1439
1440 /**
1441 *
1442 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1443 *
1444 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1445 * @param uid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申UID
1446 * @param acc 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(account_t)鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1447 * @return RES_OK
1448 * @return RES_DB_NOT_INITIALIZED
1449 * @return RES_NO_SUCH_USER
1450 * @return RES_NO_SUCH_SESSION
1451 * @return RES_DB_QUERY_ERROR
1452 * @see freeAccount
1453 *
1454 */
1455 result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc )
1456 {
1457 int len = 0;
1458 static criteria c;
1459 result_t res = getAccounts( sid, &uid, 1, &c, acc, &len );
1460 if( res == RES_OK && len == 0 ) return RES_NO_SUCH_USER;
1461 return res;
1462 }
1463
1464 /**
1465 *
1466 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1467 *
1468 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1469 * @param uids 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申UID鐃緒申鐃緒申鐃緒申
1470 * @param uidsLen uids鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1471 * @param cri 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1472 * @param accounts 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1473 * @param accountsLen 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申(鐃緒申鐃緒申*accounts鐃緒申鐃緒申鐃緒申鐃緒申)
1474 * @return RES_OK
1475 * @return RES_DB_NOT_INITIALIZED
1476 * @return RES_NO_SUCH_SESSION
1477 * @return RES_DB_QUERY_ERROR
1478 * @see freeAccount
1479 *
1480 */
1481 result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen )
1482 {
1483 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1484 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1485 if( uidsLen <= 0 ){
1486 *accounts = new account_t[ 0 ];
1487 *accountsLen = 0;
1488 syslog_printf( "getAccounts succeed len=0" );
1489 return RES_OK;
1490 }
1491
1492 syslog_printf( "begin of getAccounts" );
1493 result_t ret = RES_ERROR;
1494 SQLRETURN sqlcode;
1495 SQLHANDLE hstmt = NULL;
1496 string sql;
1497 account_t* dst = new account_t[ uidsLen ];
1498
1499 sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.notice_mail, u2.notice_mail_since, u2.private_index_id, u2.private_item_number_limit, u2.private_index_number_limit, u2.private_item_storage_limit ";
1500 sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_xoonips_users AS u2 ";
1501 sql += "WHERE u1.uid = u2.uid ";
1502 if( uidsLen > 0 ){
1503 syslog_printf( "set uid[%d] value=%d to ...", 0, uids[0] );
1504 sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) );
1505 for( int i = 1; i < uidsLen; i++ ){
1506 syslog_printf( "set uid[%d] value=%d to ...", i, uids[i] );
1507 sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) );
1508 }
1509 sql += " ) ";
1510 }
1511 sql += criteria2str( cri );
1512 syslog_printf( "sql=%s", sql.c_str() );
1513
1514 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1515 syslog_printf( "SQLAllocHandle" );
1516 if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
1517 syslog_printf( "SQLExecDirect" );
1518 SQLLEN cbUid = 0, cbStorageLimit = 0;
1519 userid_t uid = 0;
1520 SQLDOUBLE storage_limit = 0;
1521 SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &cbUid );
1522 SQLBindCol( hstmt, 45, SQL_C_DOUBLE, &storage_limit, 0, &cbStorageLimit );
1523 syslog_printf( "SQLBindCol" );
1524 *accountsLen=0;
1525 for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){
1526 syslog_printf( "SQLFetch" );
1527 dst[ i ].setUID( uid );
1528 dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() );
1529 dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() );
1530 dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() );
1531 dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() );
1532 dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() );
1533 dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) );
1534 dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() );
1535 dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() );
1536 dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() );
1537 dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() ));
1538 dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() );
1539 dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() );
1540 dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() );
1541 dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() );
1542 dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() );
1543 dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() ));
1544 dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() ));
1545 dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() ));
1546 dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() ));
1547 dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() );
1548 dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) );
1549 dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() ));
1550 dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() );
1551 dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() ));
1552 dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() ));
1553 dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() ));
1554 dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() );
1555 dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() );
1556 dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() );
1557 dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() ));
1558 dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() ));
1559 dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() );
1560 dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() );
1561 dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() );
1562 dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() );
1563 dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() );
1564 dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() );
1565 dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() );
1566 dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 40 ).c_str() ));
1567 dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 41 ).c_str() ));
1568 dst[ i ].setPrivateIndexID( atoi( getResultCol( hstmt, 42 ).c_str() ));
1569 dst[ i ].setItemNumberLimit( atoi( getResultCol( hstmt, 43 ).c_str() ));
1570 dst[ i ].setIndexNumberLimit( atoi( getResultCol( hstmt, 44 ).c_str() ));
1571 dst[ i ].setItemStorageLimit( storage_limit );
1572 ( *accountsLen )++;
1573 }
1574 *accounts = dst;
1575 syslog_printf( "getAccounts succeed" );
1576 ret = RES_OK;
1577 }else{
1578 string s( "SQLExecDirect in getAccounts" );
1579 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1580 s += string( ", sql=" ) + string( sql );
1581 setLastErrorString( s.c_str( ) );
1582 syslog_printf( "getAccounts %s", getLastErrorString( ) );
1583 ret = RES_DB_QUERY_ERROR;
1584 }
1585 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1586 }else{
1587 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" );
1588 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1589 setLastErrorString( s.c_str( ) );
1590 syslog_printf( "getAccounts %s", getLastErrorString( ) );
1591 ret = RES_DB_QUERY_ERROR;
1592 }
1593 return ret;
1594 }
1595
1596 /**
1597 *
1598 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1599 *
1600 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1601 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID鐃緒申uid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1602 *
1603 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1604 * @param account 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1605 * @param uid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1606 * @return RES_OK
1607 * @return RES_NO_SUCH_SESSION
1608 * @return RES_DB_QUERY_ERROR
1609 * @return RES_DB_NOT_INITIALIZED
1610 *
1611 */
1612 result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid )
1613 {
1614 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1615 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1616
1617 string sql;
1618 string tmp;
1619 SQLHANDLE hstmt = NULL;
1620 SQLRETURN sqlcode;
1621 result_t ret = RES_ERROR;
1622
1623 /*
1624 1. insert user profile into xoops_users
1625 2. insert platform user profile into xoonips_users
1626 3. add user to default platform group
1627 4. create private index
1628 5. update account set private_index_id=...
1629 */
1630
1631 //1.xoops鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1632 SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1633 SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1634 SQLDOUBLE timezone_offset;
1635
1636 SQLLEN cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
1637 SQLLEN cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
1638
1639 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1640 string sql;
1641 sql = "INSERT INTO " + dbprefix + "_users (uname, name, email, url, user_avatar, user_regdate, user_icq, user_from, user_sig, user_viewemail, actkey, user_aim, user_yim, user_msnm, pass, posts, attachsig, rank, level, theme, timezone_offset, last_login, umode, uorder, notify_method, notify_mode, user_occ, bio, user_intrest, user_mailok) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
1642 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1643 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1644 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1645 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1646 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1647 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1648 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1649 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1650 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1651 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1652 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1653 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1654 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1655 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1656 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1657 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1658 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1659 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1660 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1661 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1662 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1663 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1664 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1665 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1666 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1667 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1668 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1669 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1670 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1671 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1672 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1673 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1674
1675 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1676 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
1677 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
1678 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
1679 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
1680 user_regdate = time( NULL );
1681 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
1682 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
1683 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
1684 user_viewemail = account -> getUserViewemail( );
1685 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
1686 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );
1687 strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN );
1688 strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN );
1689 strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN );
1690 posts = account -> getPosts( );
1691 attachsig = account -> getAttachsig( );
1692 rank = account -> getRank( );
1693 level = account -> getLevel( );
1694 strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN );
1695 timezone_offset = account -> getTimezoneOffset( );
1696 last_login = 0;
1697 strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN );
1698 uorder = account -> getUorder( );
1699 notify_method = account -> getNotifyMethod( );
1700 notify_mode = account -> getNotifyMode( );
1701 strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN );
1702 strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN );
1703 strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN );
1704 user_mailok = account -> getUserMailok( );
1705
1706 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1707 SQLLEN count = 0;
1708 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1709 //鐃緒申鐃緒申鐃緒申ID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1710 if( dbtype == DBTYPE_MYSQL ){
1711 sql = "SELECT LAST_INSERT_ID()";
1712 }else if( dbtype == DBTYPE_SQLITE ){
1713 sql = "SELECT LAST_INSERT_ROWID()";
1714 }
1715 ret = queryGetUnsignedInt( "insertAccount", sql, (unsigned int*)uid );
1716 }else{
1717 string s( "SQLRowCount in insertAccount sql=" );
1718 s += string( sql );
1719 setLastErrorString( s.c_str( ) );
1720 ret = RES_DB_QUERY_ERROR;
1721 }
1722 }else{
1723 string s( "SQLExecute in insertAccount " );
1724 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1725 setLastErrorString( s.c_str( ) );
1726 ret = RES_DB_QUERY_ERROR;
1727 }
1728 }else{
1729 string s( "SQLPrepare in insertAccount " );
1730 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1731 setLastErrorString( s.c_str( ) );
1732 ret = RES_ERROR;
1733 }
1734 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1735 }else{
1736 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1737 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1738 setLastErrorString( s.c_str( ) );
1739 ret = RES_ERROR;
1740 }
1741
1742 if( ret == RES_OK ){
1743 //2.xoonips鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1744 SQLUINTEGER activate;
1745 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1746 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1747 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1748 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1749 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1750 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1751 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1752 SQLLEN cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS;
1753 SQLLEN cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0, cbItem_number_limit = 0, cbIndex_number_limit = 0, cbItem_storage_limit = 0;
1754 SQLUINTEGER notice_mail;
1755 SQLUINTEGER notice_mail_since;
1756 SQLINTEGER item_number_limit;
1757 SQLINTEGER index_number_limit;
1758 SQLDOUBLE item_storage_limit;
1759
1760 if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1761 string sql;
1762 sql = "INSERT INTO " + dbprefix + "_xoonips_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, notice_mail, notice_mail_since, private_item_number_limit, private_index_number_limit, private_item_storage_limit) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
1763 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1764 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1765 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid);
1766 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate);
1767 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress);
1768 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision);
1769 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel);
1770 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name);
1771 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry);
1772 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode);
1773 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax);
1774 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail, 0, &cbNotice_mail);
1775 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &notice_mail_since, 0, &cbNotice_mail_since);
1776 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &item_number_limit, 0, &cbItem_number_limit);
1777 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &index_number_limit, 0, &cbIndex_number_limit);
1778 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &item_storage_limit, 0, &cbItem_storage_limit);
1779
1780 activate = account -> getActivate() ? 1 : 0;
1781 strncpy2( (char*)address, account -> getAddress(), XNP_ACCOUNT_ADDRESS_LEN );
1782 strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN );
1783 strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN );
1784 strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN );
1785 strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN );
1786 strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN );
1787 strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN );
1788 notice_mail = account -> getNoticeMail( );
1789 notice_mail_since = time( NULL );
1790 item_number_limit = account -> getItemNumberLimit( );
1791 index_number_limit = account -> getIndexNumberLimit( );
1792 item_storage_limit = account -> getItemStorageLimit( );
1793
1794 if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){
1795 SQLLEN count = 0;
1796 if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){
1797 ret = RES_OK;
1798 if( ret == RES_OK ){
1799 //3.add new user to default group(not a group admin)
1800 ret = insertMember( sid, group_t::GID_DEFAULT, *uid, false );
1801 }else{
1802 //xoops_users鐃緒申insert鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1803 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1804 sql += unsignedIntToString( *uid );
1805 SQLHANDLE hstmt2 = NULL;
1806 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1807 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1808 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1809 }
1810 setLastErrorString( "insertMember in insertAccount" );
1811 ret = RES_DB_QUERY_ERROR;
1812 }
1813 }else{
1814 string s( "SQLRowCount in insertAccount sql=" );
1815 s += string( sql );
1816 setLastErrorString( s.c_str( ) );
1817 ret = RES_DB_QUERY_ERROR;
1818 }
1819 }else{
1820 string s( "SQLExecute in insertAccount " );
1821 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
1822 setLastErrorString( s.c_str( ) );
1823 ret = RES_DB_QUERY_ERROR;
1824 }
1825 }else{
1826 //xoops_users鐃緒申insert鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1827 sql = "DELETE FROM " + dbprefix + "_users where uid=";
1828 sql += unsignedIntToString( *uid );
1829 SQLHANDLE hstmt2 = NULL;
1830 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) {
1831 SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() );
1832 SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 );
1833 }
1834 string s( "SQLExecDirect in insertAccount sql=" );
1835 s += string( sql );
1836 setLastErrorString( s.c_str( ) );
1837 ret = RES_DB_QUERY_ERROR;
1838 }
1839 SQLFreeHandle( SQL_HANDLE_STMT, hstmt );
1840 }else{
1841 string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" );
1842 s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
1843 setLastErrorString( s.c_str( ) );
1844 ret = RES_ERROR;
1845 }
1846 }
1847
1848 if ( ret == RES_OK ){
1849 //4.private index鐃緒申鐃緒申鐃緒申
1850
1851 // private index鐃緒申鐃緒申sort_number鐃緒申鐃緒申
1852 string sql = "select min(sort_number) from " +
1853 dbprefix + "_xoonips_index where parent_index_id=" + unsignedIntToString(item::IID_ROOT) +
1854 " and open_level=" + unsignedIntToString(index::OL_PRIVATE);
1855 unsigned int sortNumber;
1856 ret = queryGetUnsignedInt( "insertAccount", sql, &sortNumber );
1857 sortNumber--;
1858 if ( ret == RES_OK ){
1859 // private index鐃緒申鐃緒申
1860 index_t index;
1861 index.setItemTypeID(item::ITID_INDEX);
1862 index.setContributorUID(*uid);
1863 index.setParentIndexID(item::IID_ROOT);
1864 index.setOwnerUID(*uid);
1865 index.setOpenLevel(index::OL_PRIVATE);
1866 index.setSortNumber(sortNumber);
1867 index.setTitle(account->getUname());
1868 indexid_t privateXID;
1869 ret = insertIndexInternal( sid, &index, &privateXID );
1870 if ( ret == RES_OK ){
1871 // xnpaccuont_users鐃緒申private_index_id鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1872 sql = "UPDATE " + dbprefix + "_xoonips_users SET private_index_id="
1873 + unsignedIntToString(privateXID) + " WHERE uid=" + unsignedIntToString(*uid);
1874 ret = querySimple( "insertAccount", sql );
1875 }
1876 }
1877 }
1878
1879 return ret;
1880 }
1881
1882 /**
1883 *
1884 * 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申.
1885 * account鐃緒申uid鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1886 *
1887 * @param sid 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申ID
1888 * @param account 鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1889 * @return RES_OK
1890 * @return RES_DB_NOT_INITIALIZED
1891 * @return RES_NO_SUCH_SESSION
1892 * @return RES_DB_QUERY_ERROR
1893 * @return RES_NO_SUCH_USER
1894 * @return RES_ERROR
1895 *
1896 */
1897 result_t updateAccount( sessionid_t sid, const account_t* account )
1898 {
1899 if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED;
1900 if( account == NULL ) return RES_ERROR;
1901 if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION;
1902 if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER;
1903
1904 SQLRETURN sqlcode;
1905 result_t ret = RES_ERROR;
1906 SQLHANDLE hstmt = NULL;
1907
1908 //xoops鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申鐃緒申
1909 SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1];
1910 SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok;
1911 SQLDOUBLE timezone_offset;
1912
1913 SQLLEN cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS;
1914 SQLLEN cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0;
1915
1916 SQLUINTEGER activate;
1917 SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1];
1918 SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1];
1919 SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1];
1920 SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1];
1921 SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1];
1922 SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1];
1923 SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1];
1924 SQLLEN cbActivate = 0, cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS;
1925 SQLUINTEGER notice_mail, notice_mail_since;
1926 SQLLEN cbNotice_mail = 0, cbNotice_mail_since = 0;
1927
1928 if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
1929 string sql;
1930
1931 sql = "UPDATE " + dbprefix + "_users SET ";
1932 sql += "uname=?";
1933 sql += ", name=?";
1934 sql += ", email=?";
1935 sql += ", url=?";
1936 sql += ", user_avatar=?";
1937 sql += ", user_regdate=?";
1938 sql += ", user_icq=?";
1939 sql += ", user_from=?";
1940 sql += ", user_sig=?";
1941 sql += ", user_viewemail=?";
1942 sql += ", actkey=?";
1943 sql += ", user_aim=?";
1944 sql += ", user_yim=?";
1945 sql += ", user_msnm=?";
1946 sql += ", pass=?";
1947 sql += ", posts=?";
1948 sql += ", attachsig=?";
1949 sql += ", rank=?";
1950 sql += ", level=?";
1951 sql += ", theme=?";
1952 sql += ", timezone_offset=?";
1953 sql += ", last_login=?";
1954 sql += ", umode=?";
1955 sql += ", uorder=?";
1956 sql += ", notify_method=?";
1957 sql += ", notify_mode=?";
1958 sql += ", user_occ=?";
1959 sql += ", bio=?";
1960 sql += ", user_intrest=?";
1961 sql += ", user_mailok=? ";
1962 sql += " WHERE uid = ?";
1963
1964 sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS);
1965 if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){
1966 SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname );
1967 SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName );
1968 SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail );
1969 SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl );
1970 SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar );
1971 SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate );
1972 SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq );
1973 SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from );
1974 SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig );
1975 SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail );
1976 SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey );
1977 SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim );
1978 SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim );
1979 SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm );
1980 SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass );
1981 SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts );
1982 SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig );
1983 SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank );
1984 SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel );
1985 SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme );
1986 SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset );
1987 SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login );
1988 SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode );
1989 SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder );
1990 SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_method, 0, &cbNotify_method );
1991 SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &notify_mode, 0, &cbNotify_mode );
1992 SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ );
1993 SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio );
1994 SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest );
1995 SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok );
1996 SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid );
1997
1998 strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN );
1999 strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN );
2000 strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN );
2001 strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN );
2002 strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN );
2003 user_regdate = time( NULL );
2004 strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN );
2005 strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN );
2006 strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN );
2007 user_viewemail = account -> getUserViewemail( );
2008 strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN );
2009 strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN );