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.112 - (hide annotations) (download) (as text)
Fri Oct 7 06:22:46 2005 UTC (18 years, 6 months ago) by aga4096
Branch: MAIN
Changes since 1.111: +6 -3 lines
File MIME type: text/x-c++src
・updateAccount()がエラーを出すことがあるのを修正.

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