Develop and Download Open Source Software

Browse CVS Repository

Contents of /xoonips/AL/commonal.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.102 - (show annotations) (download) (as text)
Tue Aug 23 02:19:10 2005 UTC (18 years, 7 months ago) by tani
Branch: MAIN
Changes since 1.101: +57 -10 lines
File MIME type: text/x-c++src
getEventsForRSSの権限チェックを変更.

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