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.95 - (hide annotations) (download) (as text)
Fri Jun 24 02:07:34 2005 UTC (18 years, 9 months ago) by tani
Branch: MAIN
Changes since 1.94: +38 -2 lines
File MIME type: text/x-c++src
insertItemDirectを定義(Import用)
getPrivateItemIDに,BINDERを無視する条件を追加(個人バインダー対応)

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