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