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.6 - (show annotations) (download) (as text)
Wed Oct 4 08:31:05 2006 UTC (17 years, 6 months ago) by tani
Branch: XOONIPS_STABLE_2
Changes since 1.118.2.5: +4 -2 lines
File MIME type: text/x-c++src
activate: don't valid session for activation by user.

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