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.87 - (hide annotations) (download) (as text)
Tue Mar 15 12:09:39 2005 UTC (19 years ago) by tani
Branch: MAIN
Changes since 1.86: +23 -5 lines
File MIME type: text/x-c++src
deleteItem 削除権限チェックを強化.
グループインデックスに属するアイテムへのアクセス権チェックを強化.

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