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.86 - (hide annotations) (download) (as text)
Tue Mar 15 04:49:40 2005 UTC (19 years ago) by tani
Branch: MAIN
Changes since 1.85: +74 -41 lines
File MIME type: text/x-c++src
ライセンス文を追加.

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