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.94 - (hide annotations) (download) (as text)
Thu Jun 23 07:58:12 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.93: +169 -3 lines
File MIME type: text/x-c++src
・イベントログ機能の追加.

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