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.88 - (hide annotations) (download) (as text)
Thu Mar 17 16:02:40 2005 UTC (19 years ago) by orrisroot
Branch: MAIN
CVS Tags: RELEASE_1_0_0, RELEASE_1_0_1
Changes since 1.87: +9 -1 lines
File MIME type: text/x-c++src
UNIX において SQLLEN 型が宣言されていない場合に対処するため,configure
スクリプトで出力された config.h をインクルードするように変更.
→ これにより MacOS X でコンパイル可

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