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.120 - (hide annotations) (download) (as text)
Tue Apr 11 10:31:27 2006 UTC (18 years ago) by tani
Branch: MAIN
CVS Tags: AL_PORTING, tag20070307current, tag20061130, merge_to_20060605, tag20070307, HEAD
Branch point for: XOONIPS_STABLE_32, XOONIPS_STABLE_3
Changes since 1.119: +57 -29 lines
File MIME type: text/x-c++src
merge to main trunk (from REL20060213 to merge_to_20060411)
REL20060213からmerge_to_20060411までのSTABLE_2の差分をCURRENTにマージ.

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