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.97 - (hide annotations) (download) (as text)
Thu Jun 30 07:21:42 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.96: +6 -2 lines
File MIME type: text/x-c++src
・get_all_index等で得られるindexが少ないことがあるのを修正.

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