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.90 - (hide annotations) (download) (as text)
Mon May 23 08:00:30 2005 UTC (18 years, 10 months ago) by tani
Branch: MAIN
Changes since 1.89: +83 -3 lines
File MIME type: text/x-c++src
insertGroup, updateGroup: グループ名が重複した場合はエラーコードを返す.

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