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.117 - (hide annotations) (download) (as text)
Fri Jan 6 05:50:32 2006 UTC (18 years, 3 months ago) by aga4096
Branch: MAIN
Changes since 1.116: +6 -1 lines
File MIME type: text/x-c++src
・ ctype.h をinclude.

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