Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

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


Revision 1.92 - (hide annotations) (download) (as text)
Wed Jun 8 04:27:08 2005 UTC (18 years, 10 months ago) by tani
Branch: MAIN
Changes since 1.91: +29 -13 lines
File MIME type: text/x-c++src
defaultグループの存在を秘匿した.

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