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.98 - (hide annotations) (download) (as text)
Tue Jul 12 06:40:44 2005 UTC (18 years, 9 months ago) by aga4096
Branch: MAIN
Changes since 1.97: +12 -2 lines
File MIME type: text/x-c++src
・setConfigValueに失敗するのを修正.

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