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.118.2.7 - (show annotations) (download) (as text)
Wed Oct 4 09:25:21 2006 UTC (17 years, 6 months ago) by tani
Branch: XOONIPS_STABLE_2
CVS Tags: tag20061115, RELENG_2_0_0a_RELEASE
Changes since 1.118.2.6: +6 -1 lines
File MIME type: text/x-c++src
activate: accept only guest session or login user's session.

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