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.119 - (hide annotations) (download) (as text)
Fri Apr 7 08:19:51 2006 UTC (18 years ago) by tani
Branch: MAIN
Changes since 1.118: +9 -2 lines
File MIME type: text/x-c++src
doiをDBから取得する時の型指定をBLOBにあわせて修正.

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