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