| 1 |
/* |
| 2 |
* |
| 3 |
* $Revision: 1.31 $ |
| 4 |
* $Log: commonal.cc,v $ |
| 5 |
* Revision 1.31 2004/12/21 11:42:59 youi |
| 6 |
* 繧ウ繝。繝ウ繝医?蠑墓焚?梧綾繧雁?、縺ョ隱ャ譏弱↑縺ゥ繧定ソス蜉?. |
| 7 |
* |
| 8 |
* Revision 1.30 2004/12/18 10:24:54 youi |
| 9 |
* IMPORT_MYSQLDLL繧貞ョ夂セゥ縺励◆縺ィ縺搾シ勲YSQL縺ョDLL繧貞虚逧?Μ繝ウ繧ッ縺吶k繝励Ο繝医ち繧、繝怜ョ」險?縺?/span> |
| 10 |
* 譛牙柑縺ォ縺ェ繧九h縺?↓菫ョ豁」縺励◆. |
| 11 |
* |
| 12 |
* Revision 1.29 2004/12/18 01:12:29 youi |
| 13 |
* freeResult縺ョ髢「謨ー蜷阪rfree<繝??繧ソ蝙?gt;縺ォ螟画峩縺励◆. |
| 14 |
* |
| 15 |
* Revision 1.28 2004/12/14 12:02:08 youi |
| 16 |
* __WIN__繧貞ョ夂セゥ縺励◆縺ィ縺阪?windows縺ョdll菴懈?縺ォ蠢?ヲ√↑蜃ヲ逅?r陦後↑縺? |
| 17 |
* USE_SYSLOG繧貞ョ夂セゥ縺励◆縺ィ縺阪?syslogd縺ク繝。繝?そ繝シ繧ク繧貞?蜉帙☆繧? |
| 18 |
* getAccounts: uidsLen縺?縺ョ縺ィ縺阪?蜃ヲ逅?r霑ス蜉?縺励◆. |
| 19 |
* |
| 20 |
* Revision 1.27 2004/12/06 11:34:47 aga |
| 21 |
* 繝サuninitializeDB()繧定ソス蜉?. |
| 22 |
* |
| 23 |
* Revision 1.26 2004/12/06 10:17:36 youi |
| 24 |
* mysql_use_result縺ョ蜿門セ礼オ先棡繧呈ョ九&縺壼叙繧雁?縺吶◆繧?シ?/span> |
| 25 |
* while( row = mysql_fetch_row(result) );繧呈諺蜈・??/span> |
| 26 |
* |
| 27 |
* Revision 1.25 2004/12/06 07:24:33 youi |
| 28 |
* insertAccount, insertGroup: |
| 29 |
* 譁ー隕剰ソス蜉?縺励◆諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID?後げ繝ォ繝シ繝悠D繧堤ャャ荳牙シ墓焚縺ォ譖ク縺崎セシ繧?. |
| 30 |
* |
| 31 |
* Revision 1.24 2004/12/06 01:45:50 aga |
| 32 |
* 繝サ繧ウ繝。繝ウ繝医▽縺? |
| 33 |
* 繝サ髢区叛蠢倥l菫ョ豁」. |
| 34 |
* |
| 35 |
* Revision 1.23 2004/12/04 09:21:10 aga |
| 36 |
* 繝サvp_config 竊 vpaccount_config. |
| 37 |
* |
| 38 |
* Revision 1.22 2004/12/03 07:17:21 youi |
| 39 |
* isModerator縺ァ繧「繧ッ繧サ繧ケ縺吶k繝??繧ソ繝吶?繧ケ繝??繝悶Ν蜷阪r菫ョ豁」. |
| 40 |
* |
| 41 |
* Revision 1.21 2004/12/01 10:28:58 youi |
| 42 |
* DB繧ォ繝ゥ繝?蜷阪?螟画峩縺ォ莨エ縺?ソョ豁」 |
| 43 |
* institute -> division |
| 44 |
* organizaion -> company_name |
| 45 |
* |
| 46 |
* Revision 1.20 2004/12/01 04:37:04 youi |
| 47 |
* freeResult: unsigned int* 繧 int* 縺ク菫ョ豁」. |
| 48 |
* 繧ウ繝。繝ウ繝磯Κ縺ォ髢「謨ー縺ョ隱ャ譏弱r霑ス險? |
| 49 |
* |
| 50 |
* Revision 1.19 2004/11/30 06:40:11 youi |
| 51 |
* 髢「謨ー繧定ソス蜉?(gidExists, uidExists) |
| 52 |
* getGroupCount繧貞ョ夂セゥ. |
| 53 |
* getGroupsByUid繧貞ョ夂セゥ. |
| 54 |
* isGroupAdmin繧剃ソョ豁」. |
| 55 |
* dumpGroupAdmins繧貞ョ夂セゥ. |
| 56 |
* deleteMember繧貞ョ夂セゥ. |
| 57 |
* insertMember繧貞ョ夂セゥ. |
| 58 |
* getMembers繧貞ョ夂セゥ. |
| 59 |
* isModerator繧貞ョ夂セゥ. |
| 60 |
* |
| 61 |
* Revision 1.18 2004/11/30 05:46:32 aga |
| 62 |
* 繝サsession縺九iremoteHost繧貞炎髯、. |
| 63 |
* |
| 64 |
* Revision 1.17 2004/11/27 09:35:49 youi |
| 65 |
* isActivated繧貞ョ夂セゥ. |
| 66 |
* activate繧貞ョ夂セゥ. |
| 67 |
* dumpUid繧貞ョ夂セゥ. |
| 68 |
* |
| 69 |
* Revision 1.16 2004/11/27 06:29:29 youi |
| 70 |
* getAccountCount繧貞ョ夂セゥ. |
| 71 |
* dumpGids繧貞ョ夂セゥ. |
| 72 |
* insertGroup, deleteGroup, updateGroup繧貞ョ夂セゥ. |
| 73 |
* getGroup, getGroups繧貞ョ夂セゥ. |
| 74 |
* 繝??繧ソ繝吶?繧ケ蛻晄悄蜑阪?蜻シ蜃コ縺ォ蟇セ縺暦シ軍ES_DB_NOT_INITIALIZED繧定ソ斐☆蜃ヲ逅?r蜷?未謨ー縺ォ霑ス蜉? |
| 75 |
* (譛ェ蟇セ蠢懊?髢「謨ー縺梧ョ九▲縺ヲ縺?k) |
| 76 |
* |
| 77 |
* Revision 1.15 2004/11/27 02:22:22 aga |
| 78 |
* 繝サinitializeDB蜑阪↓addSlashes()繧貞他縺カ縺ィ關ス縺。繧九?繧剃ソョ豁」. |
| 79 |
* |
| 80 |
* Revision 1.14 2004/11/27 01:07:31 youi |
| 81 |
* criteria2str: LIMIT縺ィORDER BY縺ョ鬆?分繧貞?繧梧崛縺医◆. |
| 82 |
* |
| 83 |
* Revision 1.13 2004/11/27 00:35:39 youi |
| 84 |
* getAccounts繧貞ョ夂セゥ. |
| 85 |
* getAccount繧剃ソョ豁」?悟?驛ィ縺ァgetAccounts繧貞他縺ウ蜃コ縺? |
| 86 |
* criteria2str繧貞ョ夂セゥ. |
| 87 |
* |
| 88 |
* Revision 1.12 2004/11/26 09:45:28 youi |
| 89 |
* getAccount繧貞ョ夂セゥ. |
| 90 |
* |
| 91 |
* Revision 1.11 2004/11/26 08:16:26 aga |
| 92 |
* 繝サgetSession, loginUser, createSession, freeResult(const session_t*) 菫ョ豁」. |
| 93 |
* |
| 94 |
* Revision 1.10 2004/11/26 07:57:42 youi |
| 95 |
* updateAccount, deleteAccount繧貞ョ夂セゥ. |
| 96 |
* mysql_query螟ア謨玲凾縺ッstderr縺ク繧ィ繝ゥ繝シ繧ウ繝シ繝峨→繧ィ繝ゥ繝シ繝。繝?そ繝シ繧ク繧貞?蜉? |
| 97 |
* |
| 98 |
* Revision 1.9 2004/11/26 07:38:02 aga |
| 99 |
* 繝サFAILUE -> FAILURE. |
| 100 |
* |
| 101 |
* Revision 1.8 2004/11/26 06:36:55 aga |
| 102 |
* 繝サcreateSession, getSession 繧剃ス懈?. |
| 103 |
* |
| 104 |
* Revision 1.7 2004/11/26 04:51:47 youi |
| 105 |
* dbprefix繧貞ョ夂セゥ縺励◆. |
| 106 |
* insertAccount繧貞ョ夂セゥ縺励◆. |
| 107 |
* isValidSessionID繧貞ョ夂セゥ縺励◆. |
| 108 |
* |
| 109 |
* Revision 1.6 2004/11/26 04:35:55 aga |
| 110 |
* 繝サloginUser(), logoutUser()繧剃ス懈?. |
| 111 |
* |
| 112 |
* Revision 1.5 2004/11/26 01:08:25 aga |
| 113 |
* 繝サaddSlashes()菴懈?. |
| 114 |
* |
| 115 |
* Revision 1.4 2004/11/25 12:14:29 youi |
| 116 |
* getUid縺ョ蜃ヲ逅?r螳夂セゥ縺励◆. |
| 117 |
* |
| 118 |
* Revision 1.3 2004/11/25 11:13:59 youi |
| 119 |
* getLastErrorString/setLastErrorString繧貞ョ夂セゥ. |
| 120 |
* |
| 121 |
* Revision 1.2 2004/11/25 08:55:19 youi |
| 122 |
* 蠑墓焚縺ョ蝙九r菫ョ豁」. |
| 123 |
* freeResult繧定ソス蜉?. |
| 124 |
* |
| 125 |
* Revision 1.1 2004/11/25 05:14:58 youi |
| 126 |
* initial version |
| 127 |
* |
| 128 |
* |
| 129 |
*/ |
| 130 |
#ifdef __WIN__ |
| 131 |
#include <winsock.h> |
| 132 |
#define my_socket SOCKET |
| 133 |
#else |
| 134 |
typedef int my_socket; |
| 135 |
#endif |
| 136 |
|
| 137 |
#ifdef USE_SYSLOG |
| 138 |
#include <syslog.h> |
| 139 |
#endif |
| 140 |
|
| 141 |
#include <stdio.h> |
| 142 |
#include <stdlib.h> |
| 143 |
#include <string.h> |
| 144 |
#include <mysql.h> |
| 145 |
#include <errmsg.h> |
| 146 |
#include <string> |
| 147 |
#include <assert.h> |
| 148 |
#include <sql.h> |
| 149 |
#include <sqlext.h> |
| 150 |
using namespace std; |
| 151 |
|
| 152 |
#include "common.h" |
| 153 |
#include "account.h" |
| 154 |
#include "group.h" |
| 155 |
#include "session.h" |
| 156 |
#include "criteria.h" |
| 157 |
#include "commonal.h" |
| 158 |
|
| 159 |
static string dbprefix; //!< XOOPS繝??繧ソ繝吶?繧ケ繝??繝悶Ν縺ョPREFIX |
| 160 |
|
| 161 |
static SQLHANDLE henv = NULL; |
| 162 |
static SQLHANDLE hdbc = NULL; |
| 163 |
static SQLHANDLE hstmt = NULL; |
| 164 |
|
| 165 |
static string odbcDiagString( SQLHANDLE hstmt, SQLRETURN sqlcode ); |
| 166 |
|
| 167 |
static result_t countResultRows( const char* sql, SQLINTEGER* count ) |
| 168 |
{ |
| 169 |
result_t ret = RES_ERROR; |
| 170 |
SQLRETURN sqlcode; |
| 171 |
SQLHANDLE hstmt = NULL; |
| 172 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 173 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){ |
| 174 |
*count = 0; |
| 175 |
while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++; |
| 176 |
ret = RES_OK; |
| 177 |
}else{ |
| 178 |
string s( "SQLExecDirect in countResultRows " ); |
| 179 |
s += odbcDiagString( hstmt, sqlcode ); |
| 180 |
s += "sql="; |
| 181 |
s += string( sql ); |
| 182 |
setLastErrorString( s.c_str( ) ); |
| 183 |
ret = RES_DB_QUERY_ERROR; |
| 184 |
} |
| 185 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 186 |
} |
| 187 |
return ret; |
| 188 |
} |
| 189 |
|
| 190 |
/** |
| 191 |
* |
| 192 |
* 譁?ュ怜?繧ウ繝斐???/span> |
| 193 |
* 謖?ョ壽枚蟄玲焚繧偵さ繝斐?縺暦シ後ヰ繝?ヵ繧。縺ョ譛?蠕後rNULL邨らォッ縺吶k??/span> |
| 194 |
* ( dst縺ョ繧オ繧、繧コ >= len + 1 )縺ァ縺ゅk縺薙→ |
| 195 |
* |
| 196 |
*/ |
| 197 |
static char* strncpy2( char* dst, const char* src, int len ) |
| 198 |
{ |
| 199 |
strncpy( dst, src, len ); |
| 200 |
dst[ len ] = '\0'; |
| 201 |
// fprintf( stderr, "strncpy2 '%s'\n", dst ); |
| 202 |
return dst; |
| 203 |
} |
| 204 |
|
| 205 |
/** |
| 206 |
* |
| 207 |
* SQL縺ョ螳溯。檎オ先棡縺九i繧ィ繝ゥ繝シ譁?ュ怜?繧堤函謌舌☆繧?/span> |
| 208 |
* |
| 209 |
* @param hstmt SQL譁??繝上Φ繝峨Ν |
| 210 |
* @param sqlcode SQLExecDirect,SQLExecute縺ョ謌サ繧雁?、 |
| 211 |
* @return 繧ィ繝ゥ繝シ譁?ュ怜? |
| 212 |
*/ |
| 213 |
static string odbcDiagString( SQLHANDLE hstmt, SQLRETURN sqlcode ) |
| 214 |
{ |
| 215 |
string s; |
| 216 |
if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 217 |
SQLCHAR SQLState[6]; |
| 218 |
SQLINTEGER NativeError; |
| 219 |
SQLCHAR MessageText[ 1024 ]; |
| 220 |
SQLSMALLINT BufferLength; |
| 221 |
SQLSMALLINT TextLength; |
| 222 |
SQLGetDiagRec( SQL_HANDLE_STMT, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength ); |
| 223 |
|
| 224 |
s += string( (char*)MessageText ); |
| 225 |
s += " SQLSTATE="; |
| 226 |
s += string( (char*)SQLState ); |
| 227 |
|
| 228 |
} |
| 229 |
s += " sqlcode="; |
| 230 |
s += intToString( sqlcode ); |
| 231 |
return s; |
| 232 |
} |
| 233 |
|
| 234 |
/** |
| 235 |
* |
| 236 |
* 謖?ョ壹き繝ゥ繝?縺ョ蛟、繧貞叙繧雁?縺励※縺昴?譁?ュ怜?繧定ソ斐☆ |
| 237 |
* |
| 238 |
*/ |
| 239 |
string getResultCol( SQLHANDLE hstmt, int col ) |
| 240 |
{ |
| 241 |
string s; |
| 242 |
SQLRETURN sqlcode; |
| 243 |
SQLCHAR BinaryPtr[5000]; |
| 244 |
SQLUINTEGER PartID; |
| 245 |
SQLINTEGER PartIDInd, BinaryLenOrInd, NumBytes; |
| 246 |
SQLRETURN rc; |
| 247 |
|
| 248 |
while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr), |
| 249 |
&BinaryLenOrInd)) != SQL_NO_DATA) { |
| 250 |
NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd; |
| 251 |
s += string( (char*)BinaryPtr, NumBytes ); |
| 252 |
} |
| 253 |
// fprintf( stderr, "getResultCol col=%d ret='%s'\n", col, s.c_str()); |
| 254 |
return s; |
| 255 |
} |
| 256 |
|
| 257 |
|
| 258 |
/** |
| 259 |
* |
| 260 |
* 繧ッ繧ゥ繝シ繝医↑縺ゥ繧箪險伜捷縺ァ繧ィ繧ケ繧ア繝シ繝励☆繧?/span> |
| 261 |
* |
| 262 |
* @param str addslashes縺吶∋縺肴枚蟄怜?縲?ULL謖?ョ壻ク榊庄縲?/span> |
| 263 |
* @return 螟画鋤蠕後?譁?ュ怜? |
| 264 |
*/ |
| 265 |
string addSlashes( const char *str ) |
| 266 |
{ |
| 267 |
if ( hdbc == NULL ){ |
| 268 |
string s; |
| 269 |
return s; |
| 270 |
}else{ |
| 271 |
string s( str ); |
| 272 |
return s; |
| 273 |
} |
| 274 |
|
| 275 |
int len = strlen(str) * 3; |
| 276 |
char* dst = new char[ len ]; |
| 277 |
const char* from = str; |
| 278 |
char* to = dst; |
| 279 |
while( *from != '\0' ){ |
| 280 |
switch( *from ){ |
| 281 |
case '\'': |
| 282 |
case '\"': |
| 283 |
case ';': |
| 284 |
*to = '\\'; to++; |
| 285 |
break; |
| 286 |
} |
| 287 |
*to = *from; to++; |
| 288 |
from++; |
| 289 |
} |
| 290 |
*to = '\0'; |
| 291 |
string s( dst ); |
| 292 |
delete[] dst; |
| 293 |
return s; |
| 294 |
} |
| 295 |
|
| 296 |
/** |
| 297 |
* |
| 298 |
* gid縺ョ蟄伜惠繧偵メ繧ァ繝?け. |
| 299 |
* DB縺ョ繧「繧ッ繧サ繧ケ螟ア謨励↑縺ゥ繧Galse縺ィ縺ェ繧具シ?/span> |
| 300 |
* |
| 301 |
* @param gid 繝√ぉ繝?け縺励◆縺ЖID |
| 302 |
* @return true 蟄伜惠縺吶k |
| 303 |
* @return false 蟄伜惠縺励↑縺?/span> |
| 304 |
* |
| 305 |
*/ |
| 306 |
static bool gidExists( groupid_t gid ) |
| 307 |
{ |
| 308 |
string sql; |
| 309 |
SQLRETURN sqlcode; |
| 310 |
SQLHANDLE hstmt = NULL; |
| 311 |
|
| 312 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) { |
| 313 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" ); |
| 314 |
return false; |
| 315 |
} |
| 316 |
|
| 317 |
sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups "; |
| 318 |
sql += "WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 319 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){ |
| 320 |
setLastErrorString( "SQLExecDirect in gidExists" ); |
| 321 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 322 |
return false; |
| 323 |
} |
| 324 |
|
| 325 |
if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){ |
| 326 |
setLastErrorString( "SQLFetch in gidExists" ); |
| 327 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 328 |
return false; |
| 329 |
} |
| 330 |
|
| 331 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 332 |
return true; |
| 333 |
} |
| 334 |
|
| 335 |
|
| 336 |
/** |
| 337 |
* |
| 338 |
* Platform繝ヲ繝シ繧カ諠??ア縺ォuid縺悟ュ伜惠縺吶k縺九r繝√ぉ繝?け. |
| 339 |
* DB縺ョ繧「繧ッ繧サ繧ケ螟ア謨励↑縺ゥ繧Galse縺ィ縺ェ繧具シ?/span> |
| 340 |
* |
| 341 |
* @param uid 繝√ぉ繝?け縺励◆縺ФID |
| 342 |
* @return true 蟄伜惠縺吶k |
| 343 |
* @return false 蟄伜惠縺励↑縺?/span> |
| 344 |
* |
| 345 |
*/ |
| 346 |
static bool uidExists( userid_t uid ) |
| 347 |
{ |
| 348 |
bool ret = false; |
| 349 |
string sql; |
| 350 |
SQLRETURN sqlcode; |
| 351 |
SQLINTEGER count = 0; |
| 352 |
|
| 353 |
sql = "SELECT * FROM " + dbprefix + "_vpaccount_users "; |
| 354 |
sql += "WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 355 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 356 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 357 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 358 |
ret = true; |
| 359 |
}else{ |
| 360 |
string s( "SQLFetch in uidExists "); |
| 361 |
s += odbcDiagString( hstmt, sqlcode ); |
| 362 |
s += string( ", sql=" ) + string( sql ); |
| 363 |
setLastErrorString( s.c_str( ) ); |
| 364 |
ret = false; |
| 365 |
} |
| 366 |
}else{ |
| 367 |
string s( "SQLExecDirect in uidExists "); |
| 368 |
s += odbcDiagString( hstmt, sqlcode ); |
| 369 |
s += string( ", sql=" ) + string( sql ); |
| 370 |
setLastErrorString( s.c_str( ) ); |
| 371 |
ret = false; |
| 372 |
} |
| 373 |
}else{ |
| 374 |
string s( "SQLAllocHandle in uidExists "); |
| 375 |
s += odbcDiagString( hstmt, sqlcode ); |
| 376 |
setLastErrorString( s.c_str( ) ); |
| 377 |
ret = false; |
| 378 |
} |
| 379 |
return ret; |
| 380 |
} |
| 381 |
|
| 382 |
|
| 383 |
/** |
| 384 |
* |
| 385 |
* criteria 繧 SQL縺ォ螟画鋤縺吶k |
| 386 |
* |
| 387 |
* |
| 388 |
* |
| 389 |
*/ |
| 390 |
string criteria2str( criteria* cri ) |
| 391 |
{ |
| 392 |
string sql; |
| 393 |
|
| 394 |
const orderby* odrby = cri -> headOrderBy( ); |
| 395 |
if( odrby != 0 ){ |
| 396 |
sql += " ORDER BY " + string( odrby -> getColumn( ) ); |
| 397 |
sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " "; |
| 398 |
while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){ |
| 399 |
sql += ", " + string( odrby -> getColumn( ) ); |
| 400 |
sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " "; |
| 401 |
} |
| 402 |
} |
| 403 |
|
| 404 |
if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){ |
| 405 |
sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) ) |
| 406 |
+ ", " + string( intToString( cri -> getLimitRows( ) ) ); |
| 407 |
} |
| 408 |
return sql; |
| 409 |
} |
| 410 |
|
| 411 |
|
| 412 |
/** |
| 413 |
* |
| 414 |
* 繝??繧ソ繝吶?繧ケ縺ョ蛻晄悄蛹?/span> |
| 415 |
* |
| 416 |
* @param dsn DSN |
| 417 |
* @param user 繝??繧ソ繝吶?繧ケ縺ォ繧「繧ッ繧サ繧ケ縺吶k繝ヲ繝シ繧カ蜷?/span> |
| 418 |
* @param password 荳願ィ倥Θ繝シ繧カ縺ョ繝代せ繝ッ繝シ繝?/span> |
| 419 |
* @param dbname 繝?繝溘? |
| 420 |
* @param prefix XOOPS繝??繧ソ繝吶?繧ケ繝??繝悶Ν縺ョPREFIX |
| 421 |
* @return RES_OK |
| 422 |
* @return RES_DB_INITIALIZE_ERROR |
| 423 |
* @return RES_DB_CONNECT_ERROR |
| 424 |
* @refer result_t |
| 425 |
*/ |
| 426 |
result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix ) |
| 427 |
{ |
| 428 |
SQLRETURN sqlcode; |
| 429 |
|
| 430 |
// 譌「縺ォ謗・邯壻クュ縺ェ繧峨?∽ク?譌ヲ蛻?妙 |
| 431 |
if ( hdbc != NULL ) |
| 432 |
SQLDisconnect( hdbc ); |
| 433 |
|
| 434 |
dbprefix = prefix; |
| 435 |
|
| 436 |
// 蛻晄悄蛹悶→謗・邯?/span> |
| 437 |
// if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) { |
| 438 |
if( SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) != SQL_SUCCESS ) { |
| 439 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" ); |
| 440 |
return RES_DB_INITIALIZE_ERROR; |
| 441 |
} |
| 442 |
//ODBC Ver.3 縺ィ縺励※謖ッ闊槭≧繧医≧縺ォ螻樊?ァ繧定ィュ螳?/span> |
| 443 |
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); |
| 444 |
|
| 445 |
// if( ( sqlcode = SQLAllocConnect( henv, &hdbc ) ) != SQL_SUCCESS ) { |
| 446 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) { |
| 447 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" ); |
| 448 |
return RES_DB_INITIALIZE_ERROR; |
| 449 |
} |
| 450 |
//繝ュ繧ー繧、繝ウ縺ォ5遘剃サ・荳願ヲ√@縺溘i繧ソ繧、繝?繧「繧ヲ繝医☆繧玖ィュ螳?/span> |
| 451 |
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0); |
| 452 |
|
| 453 |
if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){ |
| 454 |
setLastErrorString( "SQLConnect in initializeDB" ); |
| 455 |
return RES_DB_CONNECT_ERROR; |
| 456 |
} |
| 457 |
return RES_OK; |
| 458 |
} |
| 459 |
|
| 460 |
/** |
| 461 |
* |
| 462 |
* DB謗・邯壹′縺ゅl縺ー縲√◎繧後r髢区叛縺吶k縲?/span> |
| 463 |
* |
| 464 |
* @param 縺ェ縺?/span> |
| 465 |
* @return RES_OK |
| 466 |
*/ |
| 467 |
result_t uninitializeDB() |
| 468 |
{ |
| 469 |
if ( hdbc != NULL ){ |
| 470 |
SQLDisconnect( hdbc ); |
| 471 |
hdbc = NULL; |
| 472 |
} |
| 473 |
return RES_OK; |
| 474 |
} |
| 475 |
|
| 476 |
/** |
| 477 |
* |
| 478 |
* Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句叙蠕?/span> |
| 479 |
* |
| 480 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 481 |
* @param uid 迥カ諷九r蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID |
| 482 |
* @return true 謇ソ隱肴ク医∩ |
| 483 |
* @return false 譛ェ謇ソ隱?/span> |
| 484 |
* |
| 485 |
*/ |
| 486 |
bool isActivated( sessionid_t sid, userid_t uid ) |
| 487 |
{ |
| 488 |
if( hdbc == NULL ) return false; |
| 489 |
if( !isValidSessionID( sid ) ) return false; |
| 490 |
|
| 491 |
bool ret = false; |
| 492 |
string sql; |
| 493 |
SQLRETURN sqlcode; |
| 494 |
SQLHANDLE hstmt = NULL; |
| 495 |
|
| 496 |
sql = "SELECT * FROM " + dbprefix + "_vpaccount_users "; |
| 497 |
sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) ); |
| 498 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 499 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 500 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 501 |
ret = true; |
| 502 |
}else{ |
| 503 |
string s( "SQLFetch in isActivated " ); |
| 504 |
s += odbcDiagString( hstmt, sqlcode ); |
| 505 |
s += ", sql=" + sql; |
| 506 |
setLastErrorString( s.c_str() ); |
| 507 |
ret = false; |
| 508 |
} |
| 509 |
}else{ |
| 510 |
string s( "SQLExecDirect in isActivated " ); |
| 511 |
s += odbcDiagString( hstmt, sqlcode ); |
| 512 |
s += ", sql=" + sql; |
| 513 |
setLastErrorString( s.c_str() ); |
| 514 |
ret = false; |
| 515 |
} |
| 516 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 517 |
}else{ |
| 518 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" ); |
| 519 |
ret = false; |
| 520 |
} |
| 521 |
return ret; |
| 522 |
} |
| 523 |
|
| 524 |
/** |
| 525 |
* |
| 526 |
* Platform繝ヲ繝シ繧カ謇ソ隱咲憾諷句、画峩 |
| 527 |
* |
| 528 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 529 |
* @param uid 螟画峩縺励◆縺?Θ繝シ繧カ縺ョUID |
| 530 |
* @param activate 謇ソ隱?true) / 譛ェ謇ソ隱?false)縺ョ謖?ョ?/span> |
| 531 |
* @return RES_OK |
| 532 |
* @return RES_DB_QUERY_ERROR |
| 533 |
* @return RES_NO_SUCH_USER |
| 534 |
*/ |
| 535 |
result_t activate( sessionid_t sid, userid_t uid, bool activate ) |
| 536 |
{ |
| 537 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 538 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 539 |
|
| 540 |
string sql; |
| 541 |
SQLRETURN sqlcode; |
| 542 |
result_t ret = RES_ERROR; |
| 543 |
|
| 544 |
sql = "UPDATE " + dbprefix + "_vpaccount_users "; |
| 545 |
sql += "SET activate=" + string( activate ? "1" : "0" ); |
| 546 |
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 547 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 548 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 549 |
SQLINTEGER count = 0; |
| 550 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 551 |
ret = RES_OK; |
| 552 |
}else{ |
| 553 |
string s( "SQLRowCount in activate "); |
| 554 |
s += odbcDiagString( hstmt, sqlcode ); |
| 555 |
s += string( ", sql=" ) + string( sql ); |
| 556 |
setLastErrorString( s.c_str( ) ); |
| 557 |
ret = RES_NO_SUCH_USER; |
| 558 |
} |
| 559 |
}else{ |
| 560 |
string s( "SQLExecDirect in activate " ); |
| 561 |
s += odbcDiagString( hstmt, sqlcode ); |
| 562 |
s += ", sql="; |
| 563 |
s += string( sql ); |
| 564 |
setLastErrorString( s.c_str( ) ); |
| 565 |
ret = RES_DB_QUERY_ERROR; |
| 566 |
} |
| 567 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 568 |
}else{ |
| 569 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" ); |
| 570 |
ret = RES_ERROR; |
| 571 |
} |
| 572 |
return ret; |
| 573 |
} |
| 574 |
|
| 575 |
/** |
| 576 |
* |
| 577 |
* 繧「繧ォ繧ヲ繝ウ繝域焚繧貞叙蠕励☆繧具シ?/span> |
| 578 |
* |
| 579 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 580 |
* @return 繧「繧ォ繧ヲ繝ウ繝域焚 |
| 581 |
* |
| 582 |
*/ |
| 583 |
int getAccountCount( sessionid_t sid ) |
| 584 |
{ |
| 585 |
if( hdbc == NULL ) return 0; |
| 586 |
if( !isValidSessionID( sid ) ) return 0; |
| 587 |
|
| 588 |
int ret = 0; |
| 589 |
string sql; |
| 590 |
SQLRETURN sqlcode; |
| 591 |
SQLHANDLE hstmt = NULL; |
| 592 |
|
| 593 |
//繧「繧ォ繧ヲ繝ウ繝域焚繧呈アゅa繧?/span> |
| 594 |
sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_users "; |
| 595 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 596 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 597 |
SQLUINTEGER count = 0; |
| 598 |
SQLINTEGER len; |
| 599 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len ); |
| 600 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 601 |
ret = count; |
| 602 |
}else { |
| 603 |
string s( "SQLFetch in getAccountCount sql=" ); |
| 604 |
s += string( sql ); |
| 605 |
setLastErrorString( s.c_str( ) ); |
| 606 |
ret = 0; |
| 607 |
} |
| 608 |
}else{ |
| 609 |
setLastErrorString( "SQLExecDirect in getAccountCount" ); |
| 610 |
ret = 0; |
| 611 |
} |
| 612 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 613 |
}else{ |
| 614 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" ); |
| 615 |
ret = 0; |
| 616 |
} |
| 617 |
return ret; |
| 618 |
} |
| 619 |
|
| 620 |
/** |
| 621 |
* |
| 622 |
* 繧「繧ォ繧ヲ繝ウ繝亥炎髯、 |
| 623 |
* |
| 624 |
* @param |
| 625 |
* @return RES_OK |
| 626 |
* @return RES_DB_NOT_INITIALIZED |
| 627 |
* @return RES_NO_SUCH_SESSION |
| 628 |
* @return RES_DB_QUERY_ERROR |
| 629 |
* |
| 630 |
*/ |
| 631 |
result_t deleteAccount( sessionid_t sid, userid_t uid ) |
| 632 |
{ |
| 633 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 634 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 635 |
|
| 636 |
result_t ret1 = RES_ERROR, ret2 = RES_ERROR; |
| 637 |
string sql; |
| 638 |
SQLRETURN sqlcode; |
| 639 |
SQLHANDLE hstmt = NULL; |
| 640 |
|
| 641 |
sql = "DELETE FROM " + dbprefix + "_users "; |
| 642 |
sql += "WHERE uid = " + string( unsignedIntToString( uid ) ); |
| 643 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 644 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 645 |
SQLINTEGER count = 0; |
| 646 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 647 |
ret1 = RES_OK; |
| 648 |
}else{ |
| 649 |
string s( "SQLRowCount in deleteAccount" ); |
| 650 |
s += odbcDiagString( hstmt, sqlcode ); |
| 651 |
s += string( ", sql=" ) + string( sql ); |
| 652 |
setLastErrorString( s.c_str( ) ); |
| 653 |
ret1 = RES_NO_SUCH_USER; |
| 654 |
} |
| 655 |
}else{ |
| 656 |
string s( "SQLExecDirect in deleteAccount" ); |
| 657 |
s += odbcDiagString( hstmt, sqlcode ); |
| 658 |
s += ", sql="; |
| 659 |
s += string( sql ); |
| 660 |
setLastErrorString( s.c_str( ) ); |
| 661 |
ret1 = RES_DB_QUERY_ERROR; |
| 662 |
} |
| 663 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 664 |
}else{ |
| 665 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" ); |
| 666 |
ret1 = RES_ERROR; |
| 667 |
} |
| 668 |
|
| 669 |
sql = "DELETE FROM " + dbprefix + "_vpaccount_users "; |
| 670 |
sql += "WHERE uid = " + string( unsignedIntToString( uid ) ); |
| 671 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 672 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 673 |
SQLINTEGER count = 0; |
| 674 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 675 |
ret2 = RES_OK; |
| 676 |
}else{ |
| 677 |
string s( "SQLRowCount in deleteAccount" ); |
| 678 |
s += odbcDiagString( hstmt, sqlcode ); |
| 679 |
s += string( ", sql=" ) + string( sql ); |
| 680 |
setLastErrorString( s.c_str( ) ); |
| 681 |
ret2 = RES_NO_SUCH_USER; |
| 682 |
} |
| 683 |
}else{ |
| 684 |
string s( "SQLExecDirect in deleteAccount" ); |
| 685 |
s += odbcDiagString( hstmt, sqlcode ); |
| 686 |
s += ", sql="; |
| 687 |
s += string( sql ); |
| 688 |
setLastErrorString( s.c_str( ) ); |
| 689 |
ret2 = RES_DB_QUERY_ERROR; |
| 690 |
} |
| 691 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 692 |
}else{ |
| 693 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" ); |
| 694 |
ret2 = RES_ERROR; |
| 695 |
} |
| 696 |
|
| 697 |
//荳?譁ケ縺ァ繧ゅお繝ゥ繝シ縺ェ繧峨お繝ゥ繝シ繧定ソ斐☆ |
| 698 |
return ret1 != RES_OK ? ret1 : ret2; |
| 699 |
} |
| 700 |
|
| 701 |
/** |
| 702 |
* |
| 703 |
* 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア蜿門セ?/span> |
| 704 |
* |
| 705 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 706 |
* @param uid 蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID |
| 707 |
* @param acc 蜿門セ励@縺溘い繧ォ繧ヲ繝ウ繝域ュ蝣ア(account_t)縺ョ繝昴う繝ウ繧ソ繧呈嶌縺崎セシ繧?蠑墓焚 |
| 708 |
* @return RES_OK |
| 709 |
* @return RES_DB_NOT_INITIALIZED |
| 710 |
* @return RES_NO_SUCH_USER |
| 711 |
* @return RES_NO_SUCH_SESSION |
| 712 |
* @return RES_DB_QUERY_ERROR |
| 713 |
* |
| 714 |
*/ |
| 715 |
result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc ) |
| 716 |
{ |
| 717 |
int len; |
| 718 |
static criteria c; |
| 719 |
result_t res = getAccounts( sid, &uid, 1, &c, acc, &len ); |
| 720 |
if( len == 0 ) return RES_NO_SUCH_USER; |
| 721 |
return res; |
| 722 |
} |
| 723 |
|
| 724 |
/** |
| 725 |
* |
| 726 |
* 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア蜿門セ?/span> |
| 727 |
* |
| 728 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 729 |
* @param uids 蜿門セ励@縺溘>繝ヲ繝シ繧カ縺ョUID縺ョ驟榊? |
| 730 |
* @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー |
| 731 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 732 |
* @param accounts 讀懃エ「邨先棡縺ョ驟榊?縺ョ繝昴う繝ウ繧ソ繧呈嶌縺崎セシ繧?蠑墓焚 |
| 733 |
* @param accountsLen 讀懃エ「邨先棡縺ョ謨ー(驟榊?*accounts縺ョ隕∫エ?謨ー) |
| 734 |
* @return RES_OK |
| 735 |
* @return RES_DB_NOT_INITIALIZED |
| 736 |
* @return RES_NO_SUCH_SESSION |
| 737 |
* @return RES_DB_QUERY_ERROR |
| 738 |
* |
| 739 |
*/ |
| 740 |
result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen ) |
| 741 |
{ |
| 742 |
#ifdef USE_SYSLOG |
| 743 |
openlog( "commonal", LOG_ODELAY, LOG_USER ); |
| 744 |
#endif |
| 745 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 746 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 747 |
if( uidsLen <= 0 ){ |
| 748 |
*accounts = new account_t[ 0 ]; |
| 749 |
*accountsLen = 0; |
| 750 |
#ifdef USE_SYSLOG |
| 751 |
closelog( ); |
| 752 |
#endif |
| 753 |
return RES_OK; |
| 754 |
} |
| 755 |
|
| 756 |
result_t ret = RES_ERROR; |
| 757 |
SQLRETURN sqlcode; |
| 758 |
SQLHANDLE hstmt = NULL; |
| 759 |
string sql; |
| 760 |
account_t* dst = new account_t[ uidsLen ]; |
| 761 |
|
| 762 |
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 "; |
| 763 |
sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_vpaccount_users AS u2 "; |
| 764 |
sql += "WHERE u1.uid = u2.uid "; |
| 765 |
if( uidsLen > 0 ){ |
| 766 |
sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) ); |
| 767 |
for( int i = 1; i < uidsLen; i++ ){ |
| 768 |
sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) ); |
| 769 |
} |
| 770 |
sql += " ) "; |
| 771 |
} |
| 772 |
sql += criteria2str( cri ); |
| 773 |
|
| 774 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 775 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 776 |
SQLINTEGER len; |
| 777 |
userid_t uid = 0; |
| 778 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 779 |
*accountsLen=0; |
| 780 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){ |
| 781 |
dst[ i ].setUID( uid ); |
| 782 |
dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() ); |
| 783 |
dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() ); |
| 784 |
dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() ); |
| 785 |
dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() ); |
| 786 |
dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() ); |
| 787 |
dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) ); |
| 788 |
dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() ); |
| 789 |
dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() ); |
| 790 |
dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() ); |
| 791 |
dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() )); |
| 792 |
dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() ); |
| 793 |
dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() ); |
| 794 |
dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() ); |
| 795 |
dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() ); |
| 796 |
dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() ); |
| 797 |
dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() )); |
| 798 |
dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() )); |
| 799 |
dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() )); |
| 800 |
dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() )); |
| 801 |
dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() ); |
| 802 |
dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) ); |
| 803 |
dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() )); |
| 804 |
dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() ); |
| 805 |
dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() )); |
| 806 |
dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() )); |
| 807 |
dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() )); |
| 808 |
dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() ); |
| 809 |
dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() ); |
| 810 |
dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() ); |
| 811 |
dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() )); |
| 812 |
dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() )); |
| 813 |
dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() ); |
| 814 |
dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() ); |
| 815 |
dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() ); |
| 816 |
dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() ); |
| 817 |
dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() ); |
| 818 |
dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() ); |
| 819 |
dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() ); |
| 820 |
dst[ i ].setBaseURL( getResultCol( hstmt, 40 ).c_str() ); |
| 821 |
dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 41 ).c_str() )); |
| 822 |
dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 42 ).c_str() )); |
| 823 |
( *accountsLen )++; |
| 824 |
} |
| 825 |
*accounts = dst; |
| 826 |
ret = RES_OK; |
| 827 |
}else{ |
| 828 |
setLastErrorString( "SQLExecDirect in getAccounts" ); |
| 829 |
ret = RES_DB_QUERY_ERROR; |
| 830 |
} |
| 831 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 832 |
}else{ |
| 833 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" ); |
| 834 |
ret = RES_DB_QUERY_ERROR; |
| 835 |
} |
| 836 |
return ret; |
| 837 |
} |
| 838 |
|
| 839 |
/** |
| 840 |
* |
| 841 |
* 繧「繧ォ繧ヲ繝ウ繝育匳骭イ. |
| 842 |
* 繝ヲ繝シ繧カ諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ逋サ骭イ縺励∪縺呻シ?/span> |
| 843 |
* 逋サ骭イ縺励◆繝ヲ繝シ繧カ諠??ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID繧置id縺ォ譬シ邏阪@縺セ縺? |
| 844 |
* |
| 845 |
* @param sid 繧サ繝?す繝ァ繝ウ |
| 846 |
* @param account 逋サ骭イ縺吶k繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア |
| 847 |
* @param uid 逋サ骭イ縺励◆繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア縺ォ蟇セ蠢懊☆繧九Θ繝シ繧カID |
| 848 |
* @return RES_OK |
| 849 |
* @return RES_NO_SUCH_SESSION |
| 850 |
* @return RES_DB_QUERY_ERROR |
| 851 |
* @return RES_DB_NOT_INITIALIZED |
| 852 |
* |
| 853 |
*/ |
| 854 |
result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid ) |
| 855 |
{ |
| 856 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 857 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 858 |
|
| 859 |
string sql; |
| 860 |
string tmp; |
| 861 |
char buf[ 12 ]; |
| 862 |
SQLRETURN sqlcode; |
| 863 |
result_t ret = RES_ERROR; |
| 864 |
|
| 865 |
//xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧? |
| 866 |
SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN]; |
| 867 |
SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok; |
| 868 |
SQLDOUBLE timezone_offset; |
| 869 |
|
| 870 |
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; |
| 871 |
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; |
| 872 |
|
| 873 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 874 |
string sql; |
| 875 |
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
| 876 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 877 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 878 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname ); |
| 879 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName ); |
| 880 |
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail ); |
| 881 |
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl ); |
| 882 |
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar ); |
| 883 |
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate ); |
| 884 |
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq ); |
| 885 |
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from ); |
| 886 |
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig ); |
| 887 |
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail ); |
| 888 |
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey ); |
| 889 |
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim ); |
| 890 |
SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim ); |
| 891 |
SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm ); |
| 892 |
SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass ); |
| 893 |
SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts ); |
| 894 |
SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig ); |
| 895 |
SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank ); |
| 896 |
SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel ); |
| 897 |
SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme ); |
| 898 |
SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset ); |
| 899 |
SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login ); |
| 900 |
SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode ); |
| 901 |
SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder ); |
| 902 |
SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_method, 0, &cbNotify_method ); |
| 903 |
SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_mode, 0, &cbNotify_mode ); |
| 904 |
SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ ); |
| 905 |
SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio ); |
| 906 |
SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest ); |
| 907 |
SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok ); |
| 908 |
|
| 909 |
strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN ); |
| 910 |
strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN ); |
| 911 |
strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN ); |
| 912 |
strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN ); |
| 913 |
strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN ); |
| 914 |
user_regdate = time( NULL ); |
| 915 |
strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN ); |
| 916 |
strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN ); |
| 917 |
strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN ); |
| 918 |
user_viewemail = account -> getUserViewemail( ); |
| 919 |
strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN ); |
| 920 |
strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN ); |
| 921 |
strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN ); |
| 922 |
strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN ); |
| 923 |
strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN ); |
| 924 |
posts = account -> getPosts( ); |
| 925 |
attachsig = account -> getAttachsig( ); |
| 926 |
rank = account -> getRank( ); |
| 927 |
level = account -> getLevel( ); |
| 928 |
strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN ); |
| 929 |
timezone_offset = account -> getTimezoneOffset( ); |
| 930 |
last_login = 0; |
| 931 |
strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN ); |
| 932 |
uorder = account -> getUorder( ); |
| 933 |
notify_method = account -> getNotifyMethod( ); |
| 934 |
notify_mode = account -> getNotifyMode( ); |
| 935 |
strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN ); |
| 936 |
strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN ); |
| 937 |
strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN ); |
| 938 |
user_mailok = account -> getUserMailok( ); |
| 939 |
|
| 940 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 941 |
SQLINTEGER count = 0; |
| 942 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 943 |
//繝ヲ繝シ繧カID繧貞叙蠕励☆繧?/span> |
| 944 |
SQLHANDLE hstmt2 = NULL; |
| 945 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 946 |
sql = "SELECT LAST_INSERT_ID()"; // MySQL |
| 947 |
// sql = "SELECT LAST_INSERT_ROWID()"; // SQLite |
| 948 |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 949 |
SQLUINTEGER last_insert_id; |
| 950 |
SQLINTEGER len; |
| 951 |
SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len ); |
| 952 |
if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){ |
| 953 |
*uid = last_insert_id; |
| 954 |
ret = RES_OK; |
| 955 |
}else{ |
| 956 |
ret = RES_DB_QUERY_ERROR; |
| 957 |
string s( "SQLFetch in insertAccount " ); |
| 958 |
s += odbcDiagString( hstmt, sqlcode ); |
| 959 |
setLastErrorString( s.c_str( ) ); |
| 960 |
} |
| 961 |
}else{ |
| 962 |
string s( "SQLExecDirect in insertAccount " ); |
| 963 |
s += odbcDiagString( hstmt, sqlcode ); |
| 964 |
setLastErrorString( s.c_str( ) ); |
| 965 |
ret = RES_DB_QUERY_ERROR; |
| 966 |
} |
| 967 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 968 |
} |
| 969 |
}else{ |
| 970 |
string s( "SQLRowCount in insertAccount sql=" ); |
| 971 |
s += string( sql ); |
| 972 |
setLastErrorString( s.c_str( ) ); |
| 973 |
ret = RES_DB_QUERY_ERROR; |
| 974 |
} |
| 975 |
}else{ |
| 976 |
string s( "SQLExecute in insertAccount " ); |
| 977 |
s += odbcDiagString( hstmt, sqlcode ); |
| 978 |
setLastErrorString( s.c_str( ) ); |
| 979 |
ret = RES_DB_QUERY_ERROR; |
| 980 |
} |
| 981 |
}else{ |
| 982 |
string s( "SQLPrepare in insertAccount " ); |
| 983 |
s += odbcDiagString( hstmt, sqlcode ); |
| 984 |
setLastErrorString( s.c_str( ) ); |
| 985 |
ret = RES_ERROR; |
| 986 |
} |
| 987 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 988 |
}else{ |
| 989 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" ); |
| 990 |
ret = RES_ERROR; |
| 991 |
} |
| 992 |
|
| 993 |
//vpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧呈嶌縺崎セシ繧? |
| 994 |
SQLUINTEGER activate; |
| 995 |
SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1]; |
| 996 |
SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1]; |
| 997 |
SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1]; |
| 998 |
SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1]; |
| 999 |
SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1]; |
| 1000 |
SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1]; |
| 1001 |
SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1]; |
| 1002 |
SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1]; |
| 1003 |
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; |
| 1004 |
SQLINTEGER cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0; |
| 1005 |
SQLUINTEGER notice_mail; |
| 1006 |
SQLUINTEGER notice_mail_since; |
| 1007 |
if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1008 |
string sql; |
| 1009 |
sql = "INSERT INTO " + dbprefix + "_vpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, base_url, notice_mail, notice_mail_since) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"; |
| 1010 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1011 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1012 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid); |
| 1013 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate); |
| 1014 |
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress); |
| 1015 |
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision); |
| 1016 |
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel); |
| 1017 |
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name); |
| 1018 |
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry); |
| 1019 |
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode); |
| 1020 |
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax); |
| 1021 |
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url); |
| 1022 |
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail, 0, &cbNotice_mail); |
| 1023 |
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail_since, 0, &cbNotice_mail_since); |
| 1024 |
|
| 1025 |
activate = account -> getActivate() ? 1 : 0; |
| 1026 |
strncpy2( (char*)address, account -> getAddress(), VP_ACCOUNT_ADDRESS_LEN ); |
| 1027 |
strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN ); |
| 1028 |
strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN ); |
| 1029 |
strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN ); |
| 1030 |
strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN ); |
| 1031 |
strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN ); |
| 1032 |
strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN ); |
| 1033 |
strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN ); |
| 1034 |
notice_mail = account -> getNoticeMail( ); |
| 1035 |
notice_mail_since = account -> getNoticeMailSince( ); |
| 1036 |
|
| 1037 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1038 |
SQLINTEGER count = 0; |
| 1039 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1040 |
ret = RES_OK; |
| 1041 |
}else{ |
| 1042 |
string s( "SQLRowCount in insertAccount sql=" ); |
| 1043 |
s += string( sql ); |
| 1044 |
setLastErrorString( s.c_str( ) ); |
| 1045 |
ret = RES_DB_QUERY_ERROR; |
| 1046 |
} |
| 1047 |
}else{ |
| 1048 |
string s( "SQLExecute in insertAccount " ); |
| 1049 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1050 |
setLastErrorString( s.c_str( ) ); |
| 1051 |
ret = RES_DB_QUERY_ERROR; |
| 1052 |
} |
| 1053 |
}else{ |
| 1054 |
//xoops_users縺クinsert縺励◆繝ャ繧ウ繝シ繝峨r蜑企勁縺吶k |
| 1055 |
sql = "DELETE FROM " + dbprefix + "_users where uid="; |
| 1056 |
snprintf( buf, 12, "%d", *uid ); |
| 1057 |
sql += string( buf ); |
| 1058 |
SQLHANDLE hstmt2 = NULL; |
| 1059 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1060 |
SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ); |
| 1061 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 1062 |
} |
| 1063 |
string s( "SQLExecDirect in insertAccount sql=" ); |
| 1064 |
s += string( sql ); |
| 1065 |
setLastErrorString( s.c_str( ) ); |
| 1066 |
ret = RES_DB_QUERY_ERROR; |
| 1067 |
} |
| 1068 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1069 |
}else{ |
| 1070 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" ); |
| 1071 |
ret = RES_ERROR; |
| 1072 |
} |
| 1073 |
|
| 1074 |
return ret; |
| 1075 |
} |
| 1076 |
|
| 1077 |
/** |
| 1078 |
* |
| 1079 |
* 繧「繧ォ繧ヲ繝ウ繝域ュ蝣ア繧貞、画峩縺吶k. |
| 1080 |
* |
| 1081 |
* |
| 1082 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1083 |
* @param account 螟画峩縺励◆縺?い繧ォ繧ヲ繝ウ繝域ュ蝣ア |
| 1084 |
* @return RES_OK |
| 1085 |
* @return RES_DB_NOT_INITIALIZED |
| 1086 |
* @return RES_NO_SUCH_SESSION |
| 1087 |
* @return RES_DB_QUERY_ERROR |
| 1088 |
* @return RES_NO_SUCH_USER |
| 1089 |
* @return RES_ERROR |
| 1090 |
* |
| 1091 |
*/ |
| 1092 |
result_t updateAccount( sessionid_t sid, const account_t* account ) |
| 1093 |
{ |
| 1094 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1095 |
if( account == NULL ) return RES_ERROR; |
| 1096 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1097 |
if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER; |
| 1098 |
SQLRETURN sqlcode; |
| 1099 |
result_t ret = RES_ERROR; |
| 1100 |
|
| 1101 |
//xoops縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ譖ク縺崎セシ繧? |
| 1102 |
SQLCHAR uname[ACCOUNT_UNAME_LEN], name[ACCOUNT_NAME_LEN], email[ACCOUNT_EMAIL_LEN], url[ACCOUNT_URL_LEN], user_avatar[ACCOUNT_USER_AVATAR_LEN], user_icq[ACCOUNT_USER_ICQ_LEN], user_from[ACCOUNT_USER_FROM_LEN], user_sig[ACCOUNT_USER_SIG_LEN], actkey[ACCOUNT_ACTKEY_LEN], user_aim[ACCOUNT_USER_AIM_LEN], user_yim[ACCOUNT_USER_YIM_LEN], user_msnm[ACCOUNT_USER_MSNM_LEN], pass[ACCOUNT_PASS_LEN], theme[ACCOUNT_THEME_LEN], umode[ACCOUNT_UMODE_LEN], user_occ[ACCOUNT_USER_OCC_LEN], bio[ACCOUNT_BIO_LEN], user_intrest[ACCOUNT_USER_INTREST_LEN]; |
| 1103 |
SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok; |
| 1104 |
SQLDOUBLE timezone_offset; |
| 1105 |
|
| 1106 |
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; |
| 1107 |
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, cbUser_mailok = 0, cbTimezone_offset = 0; |
| 1108 |
|
| 1109 |
SQLUINTEGER activate; |
| 1110 |
SQLCHAR address[VP_ACCOUNT_ADDRESS_LEN+1]; |
| 1111 |
SQLCHAR division[VP_ACCOUNT_DIVISION_LEN+1]; |
| 1112 |
SQLCHAR tel[VP_ACCOUNT_TEL_LEN+1]; |
| 1113 |
SQLCHAR company_name[VP_ACCOUNT_COMPANY_NAME_LEN+1]; |
| 1114 |
SQLCHAR country[VP_ACCOUNT_COUNTRY_LEN+1]; |
| 1115 |
SQLCHAR zipcode[VP_ACCOUNT_ZIPCODE_LEN+1]; |
| 1116 |
SQLCHAR fax[VP_ACCOUNT_FAX_LEN+1]; |
| 1117 |
SQLCHAR base_url[VP_ACCOUNT_BASE_URL_LEN+1]; |
| 1118 |
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; |
| 1119 |
SQLUINTEGER notice_mail; |
| 1120 |
SQLUINTEGER notice_mail_since; |
| 1121 |
SQLINTEGER len = 0; |
| 1122 |
|
| 1123 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1124 |
string sql; |
| 1125 |
|
| 1126 |
sql = "UPDATE " + dbprefix + "_users SET "; |
| 1127 |
sql += "uname=?, "; |
| 1128 |
sql += "name=?, "; |
| 1129 |
sql += "email=?, "; |
| 1130 |
sql += "url=?, "; |
| 1131 |
sql += "user_avatar=?, "; |
| 1132 |
sql += "user_regdate=?, "; |
| 1133 |
sql += "user_icq=?, "; |
| 1134 |
sql += "user_from=?, "; |
| 1135 |
sql += "user_sig=?, "; |
| 1136 |
sql += "user_viewemail=?, "; |
| 1137 |
sql += "actkey=?, "; |
| 1138 |
sql += "user_aim=?, "; |
| 1139 |
sql += "user_yim=?, "; |
| 1140 |
sql += "user_msnm=?, "; |
| 1141 |
sql += "pass=?, "; |
| 1142 |
sql += "posts=?, "; |
| 1143 |
sql += "attachsig=?, "; |
| 1144 |
sql += "rank=?, "; |
| 1145 |
sql += "level=?, "; |
| 1146 |
sql += "theme=?, "; |
| 1147 |
sql += "timezone_offset=?, "; |
| 1148 |
sql += "last_login=?, "; |
| 1149 |
sql += "umode=?, "; |
| 1150 |
sql += "uorder=?, "; |
| 1151 |
sql += "notify_method=?, "; |
| 1152 |
sql += "notify_mode=?, "; |
| 1153 |
sql += "user_occ=?, "; |
| 1154 |
sql += "bio=?, "; |
| 1155 |
sql += "user_intrest=?, "; |
| 1156 |
sql += "user_mailok=? "; |
| 1157 |
sql += " WHERE uid = ?"; |
| 1158 |
|
| 1159 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1160 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1161 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname ); |
| 1162 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName ); |
| 1163 |
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail ); |
| 1164 |
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl ); |
| 1165 |
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar ); |
| 1166 |
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate ); |
| 1167 |
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq ); |
| 1168 |
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from ); |
| 1169 |
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig ); |
| 1170 |
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail ); |
| 1171 |
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey ); |
| 1172 |
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim ); |
| 1173 |
SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim ); |
| 1174 |
SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm ); |
| 1175 |
SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass ); |
| 1176 |
SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts ); |
| 1177 |
SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig ); |
| 1178 |
SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank ); |
| 1179 |
SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel ); |
| 1180 |
SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme ); |
| 1181 |
SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset ); |
| 1182 |
SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login ); |
| 1183 |
SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode ); |
| 1184 |
SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder ); |
| 1185 |
SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_method, 0, &cbNotify_method ); |
| 1186 |
SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_mode, 0, &cbNotify_mode ); |
| 1187 |
SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ ); |
| 1188 |
SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio ); |
| 1189 |
SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest ); |
| 1190 |
SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok ); |
| 1191 |
SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid ); |
| 1192 |
|
| 1193 |
strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN ); |
| 1194 |
strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN ); |
| 1195 |
strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN ); |
| 1196 |
strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN ); |
| 1197 |
strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN ); |
| 1198 |
user_regdate = time( NULL ); |
| 1199 |
strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN ); |
| 1200 |
strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN ); |
| 1201 |
strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN ); |
| 1202 |
user_viewemail = account -> getUserViewemail( ); |
| 1203 |
strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN ); |
| 1204 |
strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN ); |
| 1205 |
strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN ); |
| 1206 |
strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN ); |
| 1207 |
strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN ); |
| 1208 |
posts = account -> getPosts( ); |
| 1209 |
attachsig = account -> getAttachsig( ); |
| 1210 |
rank = account -> getRank( ); |
| 1211 |
level = account -> getLevel( ); |
| 1212 |
strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN ); |
| 1213 |
timezone_offset = account -> getTimezoneOffset( ); |
| 1214 |
last_login = 0; |
| 1215 |
strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN ); |
| 1216 |
uorder = account -> getUorder( ); |
| 1217 |
notify_method = account -> getNotifyMethod( ); |
| 1218 |
notify_mode = account -> getNotifyMode( ); |
| 1219 |
strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN ); |
| 1220 |
strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN ); |
| 1221 |
strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN ); |
| 1222 |
user_mailok = account -> getUserMailok( ); |
| 1223 |
uid = account -> getUID( ); |
| 1224 |
|
| 1225 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1226 |
SQLINTEGER count = 0; |
| 1227 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1228 |
ret = RES_OK; |
| 1229 |
}else{ |
| 1230 |
string s( "SQLRowCount in updateAccount sql=" ); |
| 1231 |
s += string( sql ); |
| 1232 |
setLastErrorString( s.c_str( ) ); |
| 1233 |
ret = RES_DB_QUERY_ERROR; |
| 1234 |
} |
| 1235 |
}else{ |
| 1236 |
string s( "SQLExecute in updateAccount " ); |
| 1237 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1238 |
setLastErrorString( s.c_str( ) ); |
| 1239 |
ret = RES_DB_QUERY_ERROR; |
| 1240 |
} |
| 1241 |
}else{ |
| 1242 |
setLastErrorString( "SQLPrepare in updateAccount sql=" ); |
| 1243 |
ret = RES_ERROR; |
| 1244 |
} |
| 1245 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1246 |
}else{ |
| 1247 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" ); |
| 1248 |
ret = RES_ERROR; |
| 1249 |
} |
| 1250 |
|
| 1251 |
//vpaccount縺ョ繝ヲ繝シ繧カ繝??繝悶Ν縺ォ谿九j縺ョ諠??ア繧剃ク頑嶌縺阪☆繧?/span> |
| 1252 |
if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1253 |
string sql; |
| 1254 |
|
| 1255 |
sql = "UPDATE " + dbprefix + "_vpaccount_users SET "; |
| 1256 |
sql += "activate=?, "; |
| 1257 |
sql += "address=?, "; |
| 1258 |
sql += "division=?, "; |
| 1259 |
sql += "tel=?, "; |
| 1260 |
sql += "company_name=?, "; |
| 1261 |
sql += "country=?, "; |
| 1262 |
sql += "zipcode=?, "; |
| 1263 |
sql += "fax=?, "; |
| 1264 |
sql += "base_url=?, "; |
| 1265 |
sql += "notice_mail=?, "; |
| 1266 |
sql += "notice_mail_since=? "; |
| 1267 |
sql += "WHERE uid=?"; |
| 1268 |
|
| 1269 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1270 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1271 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &len); |
| 1272 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress); |
| 1273 |
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision); |
| 1274 |
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel); |
| 1275 |
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name); |
| 1276 |
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry); |
| 1277 |
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode); |
| 1278 |
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax); |
| 1279 |
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_ACCOUNT_BASE_URL_LEN, 0, base_url, 0, &cbBase_url); |
| 1280 |
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail, 0, &len); |
| 1281 |
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail_since, 0, &len); |
| 1282 |
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid ); |
| 1283 |
|
| 1284 |
activate = account -> getActivate() ? 1 : 0; |
| 1285 |
strncpy2( (char*)address, account -> getAddress( ) , VP_ACCOUNT_ADDRESS_LEN ); |
| 1286 |
strncpy2( (char*)division, account -> getDivision(), VP_ACCOUNT_DIVISION_LEN ); |
| 1287 |
strncpy2( (char*)tel, account -> getTel(), VP_ACCOUNT_TEL_LEN ); |
| 1288 |
strncpy2( (char*)company_name, account -> getCompanyName(), VP_ACCOUNT_COMPANY_NAME_LEN ); |
| 1289 |
strncpy2( (char*)country, account -> getCountry(), VP_ACCOUNT_COUNTRY_LEN ); |
| 1290 |
strncpy2( (char*)zipcode, account -> getZipcode(), VP_ACCOUNT_ZIPCODE_LEN ); |
| 1291 |
strncpy2( (char*)fax, account -> getFax(), VP_ACCOUNT_FAX_LEN ); |
| 1292 |
strncpy2( (char*)base_url, account -> getBaseURL(), VP_ACCOUNT_BASE_URL_LEN ); |
| 1293 |
notice_mail = account -> getNoticeMail( ); |
| 1294 |
notice_mail_since = account -> getNoticeMailSince( ); |
| 1295 |
uid = account -> getUID( ); |
| 1296 |
|
| 1297 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1298 |
SQLINTEGER count = 0; |
| 1299 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1300 |
ret = RES_OK; |
| 1301 |
}else{ |
| 1302 |
string s( "SQLRowCount in updateAccount sql=" ); |
| 1303 |
s += string( sql ); |
| 1304 |
setLastErrorString( s.c_str( ) ); |
| 1305 |
ret = RES_DB_QUERY_ERROR; |
| 1306 |
} |
| 1307 |
}else{ |
| 1308 |
string s( "SQLExecute in updateAccount " ); |
| 1309 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1310 |
setLastErrorString( s.c_str( ) ); |
| 1311 |
ret = RES_DB_QUERY_ERROR; |
| 1312 |
} |
| 1313 |
}else{ |
| 1314 |
setLastErrorString( "SQLPrepare in updateAccount sql=" ); |
| 1315 |
ret = RES_ERROR; |
| 1316 |
} |
| 1317 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1318 |
}else{ |
| 1319 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" ); |
| 1320 |
ret = RES_ERROR; |
| 1321 |
} |
| 1322 |
return ret; |
| 1323 |
} |
| 1324 |
|
| 1325 |
/** |
| 1326 |
* |
| 1327 |
* criteria_t縺ァ謖?ョ壹&繧後◆遽?峇縺ョ繝ヲ繝シ繧カID繧定ソ斐☆. |
| 1328 |
* 繝ヲ繝シ繧カID縺ョ驟榊?繧堤「コ菫昴@縺ヲ縺昴%縺ォ譖ク縺崎セシ縺ソ?碁?蛻励?繧「繝峨Ξ繧ケ繧?uids縺ォ譖ク縺崎セシ繧?. |
| 1329 |
* 驟榊?縺ョ繧オ繧、繧コ繧?uidsLen縺ォ譖ク縺崎セシ繧? |
| 1330 |
* |
| 1331 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1332 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 1333 |
* @param uids 繝ヲ繝シ繧カ縺ョUID縺ョ驟榊?縺ョ蜃コ蜉帛? |
| 1334 |
* @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛? |
| 1335 |
* @return RES_OK |
| 1336 |
* @return RES_DB_NOT_INITIALIZED |
| 1337 |
* @return RES_NO_SUCH_SESSION |
| 1338 |
* @return RES_DB_QUERY_ERROR |
| 1339 |
* |
| 1340 |
*/ |
| 1341 |
result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen ) |
| 1342 |
{ |
| 1343 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1344 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1345 |
|
| 1346 |
result_t ret = RES_ERROR; |
| 1347 |
userid_t* dst = 0; |
| 1348 |
string sql; |
| 1349 |
SQLRETURN sqlcode; |
| 1350 |
SQLINTEGER count = 0; |
| 1351 |
|
| 1352 |
|
| 1353 |
sql = "SELECT uid FROM " + dbprefix + "_vpaccount_users "; |
| 1354 |
sql += criteria2str( cri ); |
| 1355 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1356 |
*uidsLen = count; |
| 1357 |
dst = new userid_t[ *uidsLen ]; |
| 1358 |
*uids = dst; |
| 1359 |
}else{ |
| 1360 |
return RES_ERROR; |
| 1361 |
} |
| 1362 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1363 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1364 |
userid_t uid; |
| 1365 |
SQLINTEGER len = 0; |
| 1366 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 1367 |
|
| 1368 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){ |
| 1369 |
dst[ i ] = uid; |
| 1370 |
} |
| 1371 |
|
| 1372 |
ret = RES_OK; |
| 1373 |
}else{ |
| 1374 |
string s( "SQLExecDirect in dumpUids " ); |
| 1375 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1376 |
s += "sql="; |
| 1377 |
s += string( sql ); |
| 1378 |
setLastErrorString( s.c_str( ) ); |
| 1379 |
ret = RES_DB_QUERY_ERROR; |
| 1380 |
} |
| 1381 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1382 |
}else{ |
| 1383 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids " ); |
| 1384 |
ret = RES_DB_QUERY_ERROR; |
| 1385 |
} |
| 1386 |
return ret; |
| 1387 |
} |
| 1388 |
|
| 1389 |
/** |
| 1390 |
* |
| 1391 |
* 繧ー繝ォ繝シ繝玲焚繧定ソ斐☆. |
| 1392 |
* 荳肴ュ」縺ェ繧サ繝?す繝ァ繝ウID縺ェ繧?繧定ソ斐☆. |
| 1393 |
* |
| 1394 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1395 |
* @return 繧ー繝ォ繝シ繝玲焚 |
| 1396 |
* |
| 1397 |
*/ |
| 1398 |
int getGroupCount( sessionid_t sid ) |
| 1399 |
{ |
| 1400 |
if( hdbc == NULL ) return 0; |
| 1401 |
if( !isValidSessionID( sid ) ) return 0; |
| 1402 |
|
| 1403 |
SQLRETURN sqlcode; |
| 1404 |
SQLHANDLE hstmt = NULL; |
| 1405 |
string sql; |
| 1406 |
int ret = 0; |
| 1407 |
|
| 1408 |
//繧ー繝ォ繝シ繝玲焚繧呈アゅa繧?/span> |
| 1409 |
sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups"; |
| 1410 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1411 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1412 |
SQLUINTEGER count = 0; |
| 1413 |
SQLINTEGER len; |
| 1414 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len ); |
| 1415 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 1416 |
ret = count; |
| 1417 |
}else { |
| 1418 |
string s( "SQLFetch in getGroupCount sql=" ); |
| 1419 |
s += string( sql ); |
| 1420 |
setLastErrorString( s.c_str( ) ); |
| 1421 |
ret = 0; |
| 1422 |
} |
| 1423 |
}else{ |
| 1424 |
setLastErrorString( "SQLExecDirect in getGroupCount" ); |
| 1425 |
ret = 0; |
| 1426 |
} |
| 1427 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1428 |
}else{ |
| 1429 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" ); |
| 1430 |
ret = 0; |
| 1431 |
} |
| 1432 |
return ret; |
| 1433 |
} |
| 1434 |
|
| 1435 |
/** |
| 1436 |
* |
| 1437 |
* 謇?螻槭げ繝ォ繝シ繝嶺ク?隕ァ蜿門セ? |
| 1438 |
* 繝ヲ繝シ繧カ縺梧園螻槭@縺ヲ縺?k繧ー繝ォ繝シ繝励?ID繧貞叙蠕励☆繧?/span> |
| 1439 |
* |
| 1440 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1441 |
* @param uid 繝ヲ繝シ繧カ縺ョUID |
| 1442 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 1443 |
* @param gids 繧ー繝ォ繝シ繝悠D縺ョ驟榊?縺ョ蜃コ蜉帛? |
| 1444 |
* @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛? |
| 1445 |
* @return RES_DB_NOT_INITIALIZED |
| 1446 |
* @return RES_NO_SUCH_SESSION |
| 1447 |
* @return RES_NO_SUCH_USER |
| 1448 |
* @return RES_DB_QUERY_ERROR |
| 1449 |
* @return RES_OK |
| 1450 |
* |
| 1451 |
*/ |
| 1452 |
result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen ) |
| 1453 |
{ |
| 1454 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1455 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1456 |
if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1457 |
|
| 1458 |
result_t ret = RES_ERROR; |
| 1459 |
string sql; |
| 1460 |
SQLRETURN sqlcode; |
| 1461 |
SQLHANDLE hstmt = NULL; |
| 1462 |
SQLINTEGER count = 0; |
| 1463 |
groupid_t* dst = 0; |
| 1464 |
int len = 0; |
| 1465 |
|
| 1466 |
sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups_users_link"; |
| 1467 |
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 1468 |
sql += criteria2str( cri ); |
| 1469 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1470 |
*gidsLen = count; |
| 1471 |
dst = new groupid_t[ *gidsLen ]; |
| 1472 |
*gids = dst; |
| 1473 |
}else{ |
| 1474 |
return RES_ERROR; |
| 1475 |
} |
| 1476 |
|
| 1477 |
//謇?螻槭☆繧九げ繝ォ繝シ繝励?譛?螟ァ蛟区焚繧呈アゅa繧?/span> |
| 1478 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1479 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1480 |
if( count > 0 ){ |
| 1481 |
SQLHANDLE hstmt2 = NULL; |
| 1482 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1483 |
sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link"; |
| 1484 |
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 1485 |
sql += criteria2str( cri ); |
| 1486 |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1487 |
SQLINTEGER len; |
| 1488 |
groupid_t gid = 0; |
| 1489 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len ); |
| 1490 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){ |
| 1491 |
dst[ i ] = gid; |
| 1492 |
} |
| 1493 |
ret = RES_OK; |
| 1494 |
}else{ |
| 1495 |
string s( "SQLExecDirect in getGroupsByUid " ); |
| 1496 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1497 |
s += string( ", sql=" ) + string( sql ); |
| 1498 |
ret = RES_DB_QUERY_ERROR; |
| 1499 |
} |
| 1500 |
}else{ |
| 1501 |
string s( "SQLAllocHandle in getGroupsByUid " ); |
| 1502 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1503 |
s += string( ", sql=" ) + string( sql ); |
| 1504 |
ret = RES_DB_QUERY_ERROR; |
| 1505 |
} |
| 1506 |
}else{ |
| 1507 |
ret = RES_OK; |
| 1508 |
} |
| 1509 |
}else{ |
| 1510 |
string s( "SQLExecDirect in getGroupsByUid " ); |
| 1511 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1512 |
s += string( ", sql=" ) + string( sql ); |
| 1513 |
ret = RES_DB_QUERY_ERROR; |
| 1514 |
} |
| 1515 |
}else{ |
| 1516 |
string s( "SQLAllocHandle in getGroupsByUid " ); |
| 1517 |
setLastErrorString( s.c_str( ) ); |
| 1518 |
ret = RES_DB_QUERY_ERROR; |
| 1519 |
} |
| 1520 |
return ret; |
| 1521 |
} |
| 1522 |
|
| 1523 |
/** |
| 1524 |
* |
| 1525 |
* 繧ー繝ォ繝シ繝礼ョ。逅?ィゥ髯仙撫蜷医○. |
| 1526 |
* 繝ヲ繝シ繧カ縺ォ繝ォ繝シ繝励?邂。逅?ィゥ髯舌′縺ゅk縺?繧ー繝ォ繝シ繝礼ョ。逅???〒縺ゅk縺?繧貞撫縺?粋繧上○繧? |
| 1527 |
* 繝ヲ繝シ繧カ繧?げ繝ォ繝シ繝励′蟄伜惠縺励↑縺?↑縺ゥ縺ョ逡ー蟶ク縺ョ蝣エ蜷茨シ掲alse繧定ソ斐☆. |
| 1528 |
* |
| 1529 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1530 |
* @param gid 繧ー繝ォ繝シ繝励?UID |
| 1531 |
* @param uid 繝ヲ繝シ繧カ縺ョUID |
| 1532 |
* @return true 邂。逅?ィゥ髯舌≠繧?/span> |
| 1533 |
* @return false 邂。逅?ィゥ髯舌↑縺暦シ後∪縺溘?荳肴? |
| 1534 |
* |
| 1535 |
*/ |
| 1536 |
bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid ) |
| 1537 |
{ |
| 1538 |
if( hdbc == NULL ) return false; |
| 1539 |
if( !isValidSessionID( sid ) ) return false; |
| 1540 |
if( !uidExists( uid ) ) return false; |
| 1541 |
if( !gidExists( gid ) ) return false; |
| 1542 |
|
| 1543 |
bool ret = false; |
| 1544 |
string sql; |
| 1545 |
SQLRETURN sqlcode; |
| 1546 |
SQLINTEGER count = 0; |
| 1547 |
|
| 1548 |
sql = "SELECT * FROM " + dbprefix + "_vpaccount_groups_users_link "; |
| 1549 |
sql += "WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 1550 |
sql += " AND uid=" + string( unsignedIntToString( uid ) ); |
| 1551 |
sql += " AND is_admin=1"; |
| 1552 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1553 |
if( count > 0 ){ |
| 1554 |
ret = true; |
| 1555 |
}else{ |
| 1556 |
ret = false; |
| 1557 |
} |
| 1558 |
}else{ |
| 1559 |
ret = false; |
| 1560 |
} |
| 1561 |
return ret; |
| 1562 |
} |
| 1563 |
|
| 1564 |
/** |
| 1565 |
* |
| 1566 |
* 繧ー繝ォ繝シ繝悠D荳?隕ァ. |
| 1567 |
* 逋サ骭イ縺輔l縺ヲ縺?k繧ー繝ォ繝シ繝励?ID荳?隕ァ繧貞叙蠕励☆繧? |
| 1568 |
* |
| 1569 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1570 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 1571 |
* @param gids 繧ー繝ォ繝シ繝悠D縺ョ驟榊?縺ョ蜃コ蜉帛? |
| 1572 |
* @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー縺ョ蜃コ蜉帛? |
| 1573 |
* @return RES_DB_NOT_INITIALIZED |
| 1574 |
* @return RES_NO_SUCH_SESSION |
| 1575 |
* @return RES_DB_QUERY_ERROR |
| 1576 |
* @return RES_OK |
| 1577 |
* |
| 1578 |
*/ |
| 1579 |
result_t dumpGids( sessionid_t sid, criteria_t* cri, groupid_t** gids, int* gidsLen ) |
| 1580 |
{ |
| 1581 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1582 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1583 |
|
| 1584 |
result_t ret = RES_ERROR; |
| 1585 |
groupid_t* dst = 0; |
| 1586 |
string sql; |
| 1587 |
SQLRETURN sqlcode; |
| 1588 |
SQLINTEGER count = 0; |
| 1589 |
|
| 1590 |
sql = "SELECT gid FROM " + dbprefix + "_vpaccount_groups "; |
| 1591 |
sql += criteria2str( cri ); |
| 1592 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1593 |
*gidsLen = count; |
| 1594 |
dst = new groupid_t[ *gidsLen ]; |
| 1595 |
*gids = dst; |
| 1596 |
}else{ |
| 1597 |
return RES_ERROR; |
| 1598 |
} |
| 1599 |
|
| 1600 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1601 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1602 |
groupid_t gid; |
| 1603 |
SQLINTEGER len = 0; |
| 1604 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len ); |
| 1605 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){ |
| 1606 |
dst[ i ] = gid; |
| 1607 |
} |
| 1608 |
|
| 1609 |
ret = RES_OK; |
| 1610 |
}else{ |
| 1611 |
string s( "SQLExecDirect in dumpGids " ); |
| 1612 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1613 |
s += "sql="; |
| 1614 |
s += string( sql ); |
| 1615 |
setLastErrorString( s.c_str( ) ); |
| 1616 |
ret = RES_DB_QUERY_ERROR; |
| 1617 |
} |
| 1618 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1619 |
} |
| 1620 |
return ret; |
| 1621 |
} |
| 1622 |
|
| 1623 |
/** |
| 1624 |
* |
| 1625 |
* 繧ー繝ォ繝シ繝礼ョ。逅???D繧貞叙蠕励☆繧? |
| 1626 |
* 縺ゅk繧ー繝ォ繝シ繝励?邂。逅????繝ヲ繝シ繧カID繧貞叙蠕励☆繧? |
| 1627 |
* |
| 1628 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1629 |
* @param gid 蝠上>蜷医o縺帙k繧ー繝ォ繝シ繝励rID縺ァ謖?ョ壹☆繧?/span> |
| 1630 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 1631 |
* @param uids 邂。逅????UID縺ョ驟榊?繧貞女縺大叙繧九?繧、繝ウ繧ソ |
| 1632 |
* @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー |
| 1633 |
* @return RES_OK |
| 1634 |
* @return RES_DB_NOT_INITIALIZED |
| 1635 |
* @return RES_NO_SUCH_SESSION |
| 1636 |
* @return RES_DB_QUERY_ERROR |
| 1637 |
* @return RES_ERROR |
| 1638 |
* |
| 1639 |
*/ |
| 1640 |
result_t dumpGroupAdmins( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen ) |
| 1641 |
{ |
| 1642 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1643 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1644 |
|
| 1645 |
result_t ret = RES_ERROR; |
| 1646 |
groupid_t* dst = 0; |
| 1647 |
string sql; |
| 1648 |
SQLRETURN sqlcode; |
| 1649 |
SQLINTEGER count = 0; |
| 1650 |
|
| 1651 |
sql = "SELECT uid FROM " + dbprefix + "_vpaccount_groups_users_link "; |
| 1652 |
sql += " WHERE is_admin=1 and gid=" + unsignedIntToString( gid ); |
| 1653 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1654 |
*uidsLen = count; |
| 1655 |
*uids = new groupid_t[ *uidsLen ]; |
| 1656 |
}else{ |
| 1657 |
return RES_ERROR; |
| 1658 |
} |
| 1659 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1660 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1661 |
userid_t uid; |
| 1662 |
SQLINTEGER len = 0; |
| 1663 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 1664 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){ |
| 1665 |
(*uids)[ i ] = uid; |
| 1666 |
} |
| 1667 |
ret = RES_OK; |
| 1668 |
}else{ |
| 1669 |
string s( "SQLExecDirect in dumpGroupAdmins " ); |
| 1670 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1671 |
s += "sql="; |
| 1672 |
s += string( sql ); |
| 1673 |
setLastErrorString( s.c_str( ) ); |
| 1674 |
ret = RES_DB_QUERY_ERROR; |
| 1675 |
} |
| 1676 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1677 |
} |
| 1678 |
return ret; |
| 1679 |
} |
| 1680 |
|
| 1681 |
/** |
| 1682 |
* |
| 1683 |
* 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜑企勁. |
| 1684 |
* 繧ー繝ォ繝シ繝励↓謇?螻槭☆繧九Θ繝シ繧カ繧抵シ後げ繝ォ繝シ繝励°繧牙炎髯、縺吶k. |
| 1685 |
* |
| 1686 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1687 |
* @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励°繧牙炎髯、縺吶k縺九r謖?ョ壹☆繧九げ繝ォ繝シ繝悠D |
| 1688 |
* @param uid 蜑企勁蟇セ雎。縺ョ繝ヲ繝シ繧カ縺ョID |
| 1689 |
* @return RES_DB_NOT_INITIALIZED |
| 1690 |
* @return RES_NO_SUCH_SESSION |
| 1691 |
* @return RES_NO_SUCH_USER |
| 1692 |
* @return RES_NO_SUCH_GROUP |
| 1693 |
* @return RES_DB_QUERY_ERROR |
| 1694 |
* @return RES_OK; |
| 1695 |
* |
| 1696 |
*/ |
| 1697 |
result_t deleteMember( sessionid_t sid, groupid_t gid, userid_t uid ) |
| 1698 |
{ |
| 1699 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1700 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1701 |
if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1702 |
if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1703 |
|
| 1704 |
result_t ret = RES_ERROR; |
| 1705 |
string sql; |
| 1706 |
SQLRETURN sqlcode; |
| 1707 |
SQLHANDLE hstmt = NULL; |
| 1708 |
|
| 1709 |
sql = "DELETE FROM " + dbprefix + "_vpaccount_groups_users_link "; |
| 1710 |
sql += "WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 1711 |
sql += " AND uid=" + string( unsignedIntToString( uid ) ); |
| 1712 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1713 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1714 |
SQLINTEGER count = 0; |
| 1715 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1716 |
ret = RES_OK; |
| 1717 |
}else{ |
| 1718 |
string s( "SQLRowCount in deleteMember" ); |
| 1719 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1720 |
s += string( ", sql=" ) + string( sql ); |
| 1721 |
setLastErrorString( s.c_str( ) ); |
| 1722 |
ret = RES_NO_SUCH_USER; |
| 1723 |
} |
| 1724 |
}else{ |
| 1725 |
string s( "SQLExecDirect in deleteMember" ); |
| 1726 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1727 |
s += ", sql="; |
| 1728 |
s += string( sql ); |
| 1729 |
setLastErrorString( s.c_str( ) ); |
| 1730 |
ret = RES_DB_QUERY_ERROR; |
| 1731 |
} |
| 1732 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1733 |
}else{ |
| 1734 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteMember" ); |
| 1735 |
ret = RES_ERROR; |
| 1736 |
} |
| 1737 |
return ret; |
| 1738 |
} |
| 1739 |
|
| 1740 |
/** |
| 1741 |
* |
| 1742 |
* 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ霑ス蜉?. |
| 1743 |
* 繧ー繝ォ繝シ繝励?繝。繝ウ繝舌?縺ォ繝ヲ繝シ繧カ繧定ソス蜉?縺吶k. |
| 1744 |
* |
| 1745 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1746 |
* @param gid 謇?螻槫?繧ー繝ォ繝シ繝励?ID |
| 1747 |
* @param uid 謇?螻槭&縺帙k繝ヲ繝シ繧カ縺ョID |
| 1748 |
* @param admin 邂。逅???ィゥ髯舌r荳弱∴繧九↑繧液rue |
| 1749 |
* @return RES_OK |
| 1750 |
* @return RES_DB_NOT_INITIALIZED |
| 1751 |
* @return RES_NO_SUCH_SESSION |
| 1752 |
* @return RES_NO_SUCH_USER |
| 1753 |
* @return RES_NO_SUCH_GROUP |
| 1754 |
* @return RES_DB_QUERY_ERROR |
| 1755 |
* |
| 1756 |
*/ |
| 1757 |
result_t insertMember( sessionid_t sid, groupid_t gid, userid_t uid, bool admin ) |
| 1758 |
{ |
| 1759 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1760 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1761 |
if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1762 |
if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1763 |
|
| 1764 |
result_t ret = RES_ERROR; |
| 1765 |
string sql; |
| 1766 |
SQLRETURN sqlcode; |
| 1767 |
|
| 1768 |
//繝。繝ウ繝舌?繧定ソス蜉? |
| 1769 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1770 |
sql = "INSERT INTO " + dbprefix + "_vpaccount_groups_users_link ( gid, uid, is_admin ) VALUES ("; |
| 1771 |
sql += string( unsignedIntToString( gid ) ) + ", "; |
| 1772 |
sql += string( unsignedIntToString( uid ) ) + ", "; |
| 1773 |
sql += string( admin ? "1" : "0" ) + ") "; |
| 1774 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1775 |
SQLINTEGER count = 0; |
| 1776 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1777 |
ret = RES_OK; |
| 1778 |
}else{ |
| 1779 |
string s( "SQLRowCount in insertMember " ); |
| 1780 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1781 |
s += string( ", sql=" ) + string( sql ); |
| 1782 |
setLastErrorString( s.c_str( ) ); |
| 1783 |
ret = RES_DB_QUERY_ERROR; |
| 1784 |
} |
| 1785 |
}else{ |
| 1786 |
string s( "SQLExecDirect in insertMember " ); |
| 1787 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1788 |
s += string( ", sql=" ) + string( sql ); |
| 1789 |
setLastErrorString( s.c_str( ) ); |
| 1790 |
ret = RES_DB_QUERY_ERROR; |
| 1791 |
} |
| 1792 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1793 |
}else{ |
| 1794 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertMember" ); |
| 1795 |
ret = RES_DB_QUERY_ERROR; |
| 1796 |
} |
| 1797 |
return ret; |
| 1798 |
} |
| 1799 |
|
| 1800 |
/** |
| 1801 |
* |
| 1802 |
* 繧ー繝ォ繝シ繝玲園螻槭Θ繝シ繧カ蜿門セ? |
| 1803 |
* 縺ゅk繧ー繝ォ繝シ繝励?謇?螻槭@縺ヲ縺?k繝ヲ繝シ繧カ縺ョ繝ヲ繝シ繧カID繧貞叙蠕励☆繧?/span> |
| 1804 |
* |
| 1805 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1806 |
* @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励?謇?螻槭Θ繝シ繧カ繧貞撫縺?粋繧上○繧九°繧偵げ繝ォ繝シ繝励rID縺ァ謖?ョ?/span> |
| 1807 |
* @param cri 邨先棡縺ョ遽?峇謖?ョ夲シ後た繝シ繝域擅莉カ謖?ョ?/span> |
| 1808 |
* @param uids 謇?螻槭Θ繝シ繧カ縺ョUID縺ョ驟榊?繧貞女縺大叙繧九?繧、繝ウ繧ソ |
| 1809 |
* @param uidsLen uids驟榊?縺ョ隕∫エ?謨ー |
| 1810 |
* @return RES_OK |
| 1811 |
* @return RES_DB_NOT_INITIALIZED |
| 1812 |
* @return RES_NO_SUCH_SESSION |
| 1813 |
* @return RES_NO_SUCH_GROUP |
| 1814 |
* @return RES_DB_QUERY_ERROR |
| 1815 |
* @return RES_ERROR |
| 1816 |
* |
| 1817 |
*/ |
| 1818 |
result_t getMembers( sessionid_t sid, groupid_t gid, criteria_t* cri, userid_t** uids, int* uidsLen ) |
| 1819 |
{ |
| 1820 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1821 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1822 |
if( !gidExists( gid ) ) return RES_NO_SUCH_GROUP; //gid縺ョ蟄伜惠繧偵メ繧ァ繝?け |
| 1823 |
|
| 1824 |
result_t ret = RES_ERROR; |
| 1825 |
string sql; |
| 1826 |
SQLRETURN sqlcode; |
| 1827 |
SQLHANDLE hstmt = NULL; |
| 1828 |
userid_t* dst = 0; |
| 1829 |
|
| 1830 |
//how many members ? |
| 1831 |
sql = "SELECT COUNT(*) FROM " + dbprefix + "_vpaccount_groups_users_link "; |
| 1832 |
sql += " WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 1833 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1834 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1835 |
SQLUINTEGER count = 0; |
| 1836 |
SQLINTEGER len; |
| 1837 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len ); |
| 1838 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 1839 |
dst = new userid_t[ count ]; |
| 1840 |
*uids = dst; |
| 1841 |
*uidsLen = count; |
| 1842 |
if( count > 0 ){ |
| 1843 |
//retrive member's IDs |
| 1844 |
SQLHANDLE hstmt2 = NULL; |
| 1845 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1846 |
sql = "SELECT uid, gid, is_admin FROM " + dbprefix + "_vpaccount_groups_users_link "; |
| 1847 |
sql += " WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 1848 |
sql += " " + string( criteria2str( cri ) ); |
| 1849 |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1850 |
SQLUINTEGER uid = 0; |
| 1851 |
SQLINTEGER len; |
| 1852 |
SQLBindCol( hstmt2, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 1853 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < count ; i++ ){ |
| 1854 |
dst[ i ] = uid; |
| 1855 |
} |
| 1856 |
ret = RES_OK; |
| 1857 |
}else{ |
| 1858 |
setLastErrorString( "SQLExecDirect in getMembers" ); |
| 1859 |
ret = RES_DB_QUERY_ERROR; |
| 1860 |
} |
| 1861 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 1862 |
}else{ |
| 1863 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" ); |
| 1864 |
ret = RES_DB_QUERY_ERROR; |
| 1865 |
} |
| 1866 |
}else{ |
| 1867 |
ret = RES_OK; |
| 1868 |
} |
| 1869 |
}else{ |
| 1870 |
string s( "SQLFetch in getMembers sql=" ); |
| 1871 |
s += string( sql ); |
| 1872 |
setLastErrorString( s.c_str( ) ); |
| 1873 |
ret = RES_DB_QUERY_ERROR; |
| 1874 |
} |
| 1875 |
}else{ |
| 1876 |
setLastErrorString( "SQLExecDirect in getMembers" ); |
| 1877 |
ret = RES_DB_QUERY_ERROR; |
| 1878 |
} |
| 1879 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1880 |
}else{ |
| 1881 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getMembers" ); |
| 1882 |
ret = RES_DB_QUERY_ERROR; |
| 1883 |
} |
| 1884 |
return ret; |
| 1885 |
} |
| 1886 |
|
| 1887 |
/** |
| 1888 |
* |
| 1889 |
* 繧ー繝ォ繝シ繝励?蜑企勁. |
| 1890 |
* 繝??繧ソ繝吶?繧ケ縺九i繧ー繝ォ繝シ繝励r蜑企勁縺励∪縺? |
| 1891 |
* |
| 1892 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1893 |
* @param gid 縺ゥ縺ョ繧ー繝ォ繝シ繝励?謇?螻槭Θ繝シ繧カ繧貞撫縺?粋繧上○繧九°繧偵げ繝ォ繝シ繝励rID縺ァ謖?ョ?/span> |
| 1894 |
* @return RES_OK |
| 1895 |
* @return RES_DB_QUERY_ERROR |
| 1896 |
* @return RES_NO_SUCH_SESSION |
| 1897 |
* @return RES_DB_NOT_INITIALIZED |
| 1898 |
* |
| 1899 |
*/ |
| 1900 |
result_t deleteGroup( sessionid_t sid, groupid_t gid ) |
| 1901 |
{ |
| 1902 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1903 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1904 |
|
| 1905 |
result_t ret = RES_ERROR; |
| 1906 |
string sql; |
| 1907 |
SQLRETURN sqlcode; |
| 1908 |
SQLHANDLE hstmt = NULL; |
| 1909 |
|
| 1910 |
sql = "DELETE FROM " + dbprefix + "_vpaccount_groups "; |
| 1911 |
sql += "WHERE gid = " + string( unsignedIntToString( gid ) ); |
| 1912 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1913 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1914 |
SQLINTEGER count = 0; |
| 1915 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1916 |
ret = RES_OK; |
| 1917 |
}else{ |
| 1918 |
string s( "SQLRowCount in deleteGroup" ); |
| 1919 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1920 |
s += string( ", sql=" ) + string( sql ); |
| 1921 |
setLastErrorString( s.c_str( ) ); |
| 1922 |
ret = RES_NO_SUCH_USER; |
| 1923 |
} |
| 1924 |
}else{ |
| 1925 |
string s( "SQLExecDirect in deleteGroup" ); |
| 1926 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1927 |
s += ", sql="; |
| 1928 |
s += string( sql ); |
| 1929 |
setLastErrorString( s.c_str( ) ); |
| 1930 |
ret = RES_DB_QUERY_ERROR; |
| 1931 |
} |
| 1932 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1933 |
}else{ |
| 1934 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteGroup" ); |
| 1935 |
ret = RES_ERROR; |
| 1936 |
} |
| 1937 |
return ret; |
| 1938 |
} |
| 1939 |
|
| 1940 |
/** |
| 1941 |
* |
| 1942 |
* 繧ー繝ォ繝シ繝礼匳骭イ. |
| 1943 |
* 繧ー繝ォ繝シ繝励?諠??ア繧偵ョ繝シ繧ソ繝吶?繧ケ縺ォ險倬鹸縺吶k??/span> |
| 1944 |
* 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D繧暖id縺ォ譬シ邏阪☆繧具シ?/span> |
| 1945 |
* |
| 1946 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 1947 |
* @param group 逋サ骭イ縺励◆縺?げ繝ォ繝シ繝励?諠??ア |
| 1948 |
* @param gid 逋サ骭イ縺励◆繧ー繝ォ繝シ繝励↓蟇セ蠢懊☆繧九げ繝ォ繝シ繝悠D |
| 1949 |
* @return RES_OK |
| 1950 |
* @return RES_DB_NOT_INITIALIZED |
| 1951 |
* @return RES_NO_SUCH_SESSION |
| 1952 |
* @return RES_DB_QUERY_ERROR |
| 1953 |
* |
| 1954 |
*/ |
| 1955 |
result_t insertGroup( sessionid_t sid, const group_t* group, groupid_t* gid ) |
| 1956 |
{ |
| 1957 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1958 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1959 |
|
| 1960 |
result_t ret = RES_ERROR; |
| 1961 |
string sql; |
| 1962 |
SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1]; |
| 1963 |
SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS; |
| 1964 |
SQLRETURN sqlcode; |
| 1965 |
|
| 1966 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1967 |
sql = "INSERT INTO " + dbprefix + "_vpaccount_groups ( gname, gdesc ) VALUES ( ?, ? )"; |
| 1968 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1969 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1970 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname ); |
| 1971 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc ); |
| 1972 |
strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN ); |
| 1973 |
strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN ); |
| 1974 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1975 |
SQLINTEGER count = 0; |
| 1976 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1977 |
//繧ー繝ォ繝シ繝悠D繧貞叙蠕励☆繧?/span> |
| 1978 |
SQLHANDLE hstmt2 = NULL; |
| 1979 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1980 |
sql = "SELECT LAST_INSERT_ID()"; // MySQL |
| 1981 |
// sql = "SELECT LAST_INSERT_ROWID()"; // SQLite |
| 1982 |
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1983 |
SQLUINTEGER last_insert_id; |
| 1984 |
SQLINTEGER len; |
| 1985 |
SQLBindCol( hstmt2, 1, SQL_C_ULONG, &last_insert_id, 0, &len ); |
| 1986 |
if( ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS ){ |
| 1987 |
*gid = last_insert_id; |
| 1988 |
ret = RES_OK; |
| 1989 |
}else{ |
| 1990 |
ret = RES_DB_QUERY_ERROR; |
| 1991 |
string s( "SQLFetch in insertGroup " ); |
| 1992 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1993 |
setLastErrorString( s.c_str( ) ); |
| 1994 |
} |
| 1995 |
}else{ |
| 1996 |
string s( "SQLExecDirect in insertGroup " ); |
| 1997 |
s += odbcDiagString( hstmt, sqlcode ); |
| 1998 |
setLastErrorString( s.c_str( ) ); |
| 1999 |
ret = RES_DB_QUERY_ERROR; |
| 2000 |
} |
| 2001 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 2002 |
} |
| 2003 |
}else{ |
| 2004 |
string s( "SQLRowCount in insertGroup sql=" ); |
| 2005 |
s += string( sql ); |
| 2006 |
setLastErrorString( s.c_str( ) ); |
| 2007 |
ret = RES_DB_QUERY_ERROR; |
| 2008 |
} |
| 2009 |
}else{ |
| 2010 |
string s( "SQLExecute in insertGroup " ); |
| 2011 |
s += odbcDiagString( hstmt, sqlcode ); |
| 2012 |
setLastErrorString( s.c_str( ) ); |
| 2013 |
ret = RES_DB_QUERY_ERROR; |
| 2014 |
} |
| 2015 |
}else{ |
| 2016 |
string s( "SQLPrepare in insertGroup " ); |
| 2017 |
s += odbcDiagString( hstmt, sqlcode ); |
| 2018 |
setLastErrorString( s.c_str( ) ); |
| 2019 |
ret = RES_ERROR; |
| 2020 |
} |
| 2021 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2022 |
}else{ |
| 2023 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertGroup" ); |
| 2024 |
ret = RES_ERROR; |
| 2025 |
} |
| 2026 |
return ret; |
| 2027 |
} |
| 2028 |
|
| 2029 |
/** |
| 2030 |
* |
| 2031 |
* 繧ー繝ォ繝シ繝玲ュ蝣ア繧貞、画峩縺吶k |
| 2032 |
* |
| 2033 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 2034 |
* @param group 譁ー縺励>繧ー繝ォ繝シ繝玲ュ蝣ア |
| 2035 |
* @return RES_OK |
| 2036 |
* @return RES_ERROR |
| 2037 |
* @return RES_DB_NOT_INITIALIZED |
| 2038 |
* @return RES_NO_SUCH_SESSION |
| 2039 |
* @return RES_NO_SUCH_GROUP |
| 2040 |
* @return RES_DB_QUERY_ERROR |
| 2041 |
* |
| 2042 |
*/ |
| 2043 |
result_t updateGroup( sessionid_t sid, const group_t* group ) |
| 2044 |
{ |
| 2045 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2046 |
if( group == NULL ) return RES_ERROR; |
| 2047 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 2048 |
if( !gidExists( group -> getGID( ) ) ) return RES_NO_SUCH_GROUP; |
| 2049 |
|
| 2050 |
result_t ret = RES_ERROR; |
| 2051 |
string sql; |
| 2052 |
SQLCHAR gname[VP_GROUP_GNAME_LEN+1], gdesc[VP_GROUP_GDESC_LEN+1]; |
| 2053 |
SQLINTEGER cbGname = SQL_NTS, cbGdesc = SQL_NTS; |
| 2054 |
SQLRETURN sqlcode; |
| 2055 |
|
| 2056 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2057 |
sql = "UPDATE " + dbprefix + "_vpaccount_groups SET gname=?, gdesc=? WHERE gid=" + string( unsignedIntToString( group -> getGID( ) ) ); |
| 2058 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 2059 |
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 2060 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GNAME_LEN, 0, gname, 0, &cbGname ); |
| 2061 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, VP_GROUP_GDESC_LEN, 0, gdesc, 0, &cbGdesc ); |
| 2062 |
strncpy2( (char*)gname, group -> getGname( ), VP_GROUP_GNAME_LEN ); |
| 2063 |
strncpy2( (char*)gdesc, group -> getDesc( ), VP_GROUP_GDESC_LEN ); |
| 2064 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 2065 |
SQLINTEGER count = 0; |
| 2066 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 2067 |
ret = RES_OK; |
| 2068 |
}else{ |
| 2069 |
string s( "SQLRowCount in updateGroup sql=" ); |
| 2070 |
s += string( sql ); |
| 2071 |
setLastErrorString( s.c_str( ) ); |
| 2072 |
ret = RES_DB_QUERY_ERROR; |
| 2073 |
} |
| 2074 |
}else{ |
| 2075 |
string s( "SQLExecute in updateGroup " ); |
| 2076 |
s += odbcDiagString( hstmt, sqlcode ); |
| 2077 |
setLastErrorString( s.c_str( ) ); |
| 2078 |
ret = RES_DB_QUERY_ERROR; |
| 2079 |
} |
| 2080 |
}else{ |
| 2081 |
setLastErrorString( "SQLPrepare in updateGroup sql=" ); |
| 2082 |
ret = RES_ERROR; |
| 2083 |
} |
| 2084 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2085 |
}else{ |
| 2086 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateGroup" ); |
| 2087 |
ret = RES_ERROR; |
| 2088 |
} |
| 2089 |
return RES_OK; |
| 2090 |
} |
| 2091 |
|
| 2092 |
/** |
| 2093 |
* |
| 2094 |
* 繧ー繝ォ繝シ繝玲ュ蝣ア蜿門セ?/span> |
| 2095 |
* |
| 2096 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 2097 |
* @param gid 蜿門セ励@縺溘>繧ー繝ォ繝シ繝励?GID |
| 2098 |
* @param group 蜿門セ励@縺溘げ繝ォ繝シ繝玲ュ蝣ア縺ョ繧「繝峨Ξ繧ケ繧呈嶌縺崎セシ繧?繝昴う繝ウ繧ソ |
| 2099 |
* @return RES_OK |
| 2100 |
* @return RES_DB_NOT_INITIALIZED |
| 2101 |
* @return RES_NO_SUCH_SESSION |
| 2102 |
* @return RES_NO_SUCH_GROUP |
| 2103 |
* @return RES_DB_QUERY_ERROR |
| 2104 |
* |
| 2105 |
*/ |
| 2106 |
result_t getGroup( sessionid_t sid, groupid_t gid, const group_t** group ) |
| 2107 |
{ |
| 2108 |
int len; |
| 2109 |
static criteria c; |
| 2110 |
result_t res = getGroups( sid, &gid, 1, &c, group, &len ); |
| 2111 |
if( len == 0 ) return RES_NO_SUCH_GROUP; |
| 2112 |
return res; |
| 2113 |
} |
| 2114 |
|
| 2115 |
/** |
| 2116 |
* |
| 2117 |
* 隍?焚縺ョ繧ー繝ォ繝シ繝玲ュ蝣ア繧剃ク?蠎ヲ縺ォ蜿門セ励☆繧? |
| 2118 |
* |
| 2119 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 2120 |
* @param gids 蜿門セ励@縺溘>繧ー繝ォ繝シ繝励?GID縺ョ驟榊? |
| 2121 |
* @param gidsLen gids驟榊?縺ョ隕∫エ?謨ー |
| 2122 |
* @param cri 邨先棡縺ョ蜿門セ礼ッ?峇?後た繝シ繝域擅莉カ繧呈欠螳?/span> |
| 2123 |
* @param groups 蜿門セ礼オ先棡縺ョ繧ー繝ォ繝シ繝玲ュ蝣ア縺ョ驟榊?縺ョ繧「繝峨Ξ繧ケ繧呈嶌縺崎セシ繧?繝昴う繝ウ繧ソ |
| 2124 |
* @param groupsLen 蜿門セ礼オ先棡縺ョ驟榊?縺ョ隕∫エ?謨ー |
| 2125 |
* @return RES_OK |
| 2126 |
* @return RES_DB_NOT_INITIALIZED |
| 2127 |
* @return RES_NO_SUCH_SESSION |
| 2128 |
* @return RES_DB_QUERY_ERROR |
| 2129 |
* |
| 2130 |
*/ |
| 2131 |
result_t getGroups( sessionid_t sid, groupid_t* gids, int gidsLen, criteria_t* cri, const group_t** groups, int* groupsLen ) |
| 2132 |
{ |
| 2133 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2134 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 2135 |
|
| 2136 |
SQLRETURN sqlcode; |
| 2137 |
SQLHANDLE hstmt = NULL; |
| 2138 |
result_t ret = RES_ERROR; |
| 2139 |
string sql; |
| 2140 |
group_t* dst = new group_t[ gidsLen ]; |
| 2141 |
|
| 2142 |
sql += "SELECT gid, gname, gdesc "; |
| 2143 |
sql += "FROM " + dbprefix + "_vpaccount_groups "; |
| 2144 |
if( gidsLen > 0 ){ |
| 2145 |
sql += "WHERE gid=" + string( unsignedIntToString( gids[ 0 ] ) ); |
| 2146 |
for( int i = 1; i < gidsLen; i++ ){ |
| 2147 |
sql += " OR gid=" + string( unsignedIntToString( gids[ i ] ) ); |
| 2148 |
} |
| 2149 |
} |
| 2150 |
sql += criteria2str( cri ); |
| 2151 |
|
| 2152 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2153 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2154 |
SQLINTEGER len; |
| 2155 |
groupid_t gid = 0; |
| 2156 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len ); |
| 2157 |
*groupsLen=0; |
| 2158 |
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < gidsLen ; i++ ){ |
| 2159 |
dst[ i ].setGID( gid ); |
| 2160 |
dst[ i ].setGname( getResultCol( hstmt, 2 ).c_str() ); |
| 2161 |
dst[ i ].setDesc( getResultCol( hstmt, 3 ).c_str() ); |
| 2162 |
( *groupsLen )++; |
| 2163 |
} |
| 2164 |
*groups = dst; |
| 2165 |
ret = RES_OK; |
| 2166 |
}else{ |
| 2167 |
setLastErrorString( "SQLExecDirect in getAccounts" ); |
| 2168 |
ret = RES_DB_QUERY_ERROR; |
| 2169 |
} |
| 2170 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2171 |
}else{ |
| 2172 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" ); |
| 2173 |
ret = RES_DB_QUERY_ERROR; |
| 2174 |
} |
| 2175 |
return ret; |
| 2176 |
} |
| 2177 |
|
| 2178 |
/** |
| 2179 |
* |
| 2180 |
* 繝「繝?Ξ繝シ繧ソ讓ゥ髯舌?譛臥┌繧定ソ斐☆ |
| 2181 |
* |
| 2182 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 2183 |
* @param uid 蝠上>蜷医o縺帙◆縺?Θ繝シ繧カ縺ョUID |
| 2184 |
* @return true 讓ゥ髯舌≠繧?/span> |
| 2185 |
* @return false 讓ゥ髯舌↑縺?/span> |
| 2186 |
* |
| 2187 |
*/ |
| 2188 |
bool isModerator( sessionid_t sid, userid_t uid ) |
| 2189 |
{ |
| 2190 |
if( hdbc == NULL ) return false; |
| 2191 |
if( !isValidSessionID( sid ) ) return false; |
| 2192 |
if( !uidExists( uid ) ) return false; |
| 2193 |
|
| 2194 |
bool ret = false; |
| 2195 |
SQLRETURN sqlcode; |
| 2196 |
SQLHANDLE hstmt = NULL; |
| 2197 |
SQLINTEGER count = 0; |
| 2198 |
string sql; |
| 2199 |
groupid_t moderator_gid; |
| 2200 |
|
| 2201 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2202 |
sql = "SELECT value FROM " + dbprefix + "_vpaccount_config"; |
| 2203 |
sql += " WHERE name='moderator_gid'"; |
| 2204 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2205 |
SQLINTEGER len = 0; |
| 2206 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &moderator_gid, 0, &len ); |
| 2207 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 2208 |
sql = "SELECT * from " + dbprefix + "_groups_users_link "; |
| 2209 |
sql += "WHERE groupid=" + unsignedIntToString( moderator_gid ); |
| 2210 |
sql += " AND uid=" + string( unsignedIntToString( uid ) ); |
| 2211 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 2212 |
if( count > 0 ){ |
| 2213 |
ret = true; |
| 2214 |
} |
| 2215 |
} |
| 2216 |
}else{ |
| 2217 |
setLastErrorString( "SQLFetch in isModerator " ); |
| 2218 |
} |
| 2219 |
}else{ |
| 2220 |
string s( "SQLExecDirect in isModerator " ); |
| 2221 |
s += odbcDiagString( hstmt, sqlcode ); |
| 2222 |
s += ", sql="; |
| 2223 |
s += string( sql ); |
| 2224 |
setLastErrorString( s.c_str( ) ); |
| 2225 |
} |
| 2226 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2227 |
}else{ |
| 2228 |
setLastErrorString( "SQLAllocHandle in isModerator " ); |
| 2229 |
} |
| 2230 |
return ret; |
| 2231 |
} |
| 2232 |
|
| 2233 |
/** |
| 2234 |
* |
| 2235 |
* 繝ヲ繝シ繧カID蜿門セ?/span> |
| 2236 |
* |
| 2237 |
* @param uname ID繧貞叙蠕励@縺溘>繝ヲ繝シ繧カ繝シ蜷?/span> |
| 2238 |
* @param uid ID繧剃サ」蜈・縺励◆縺?、画焚縺ョ繝昴う繝ウ繧ソ |
| 2239 |
* @return RES_ERROR |
| 2240 |
* @return RES_OK |
| 2241 |
* @refer result_t |
| 2242 |
* |
| 2243 |
*/ |
| 2244 |
result_t getUid( const char* uname, userid_t* uid ) |
| 2245 |
{ |
| 2246 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2247 |
if( uname == NULL ) return RES_ERROR; |
| 2248 |
|
| 2249 |
result_t ret = RES_ERROR; |
| 2250 |
SQLRETURN sqlcode; |
| 2251 |
SQLHANDLE hstmt = NULL; |
| 2252 |
string sql; |
| 2253 |
string uname2 = addSlashes( uname ); |
| 2254 |
|
| 2255 |
sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + uname2 + "';"; |
| 2256 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2257 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2258 |
userid_t _uid = 0; |
| 2259 |
SQLINTEGER len; |
| 2260 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &_uid, 0, &len ); |
| 2261 |
sqlcode = SQLFetch( hstmt ); |
| 2262 |
if( sqlcode == SQL_SUCCESS ){ |
| 2263 |
*uid = _uid; |
| 2264 |
ret = RES_OK; |
| 2265 |
}else { |
| 2266 |
string s( "SQLFetch in getUid sql=" ); |
| 2267 |
s += string( sql ); |
| 2268 |
setLastErrorString( s.c_str( ) ); |
| 2269 |
ret = RES_NO_SUCH_USER; |
| 2270 |
} |
| 2271 |
}else{ |
| 2272 |
setLastErrorString( "SQLExecDirect in getUid" ); |
| 2273 |
ret = RES_DB_QUERY_ERROR; |
| 2274 |
} |
| 2275 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2276 |
}else{ |
| 2277 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getUid" ); |
| 2278 |
ret = RES_DB_QUERY_ERROR; |
| 2279 |
} |
| 2280 |
|
| 2281 |
return ret; |
| 2282 |
} |
| 2283 |
|
| 2284 |
/** |
| 2285 |
* |
| 2286 |
* 繧サ繝?す繝ァ繝ウ繧剃ス懈?縺踊oops_vpaccount_session縺ォ譖ク縺崎セシ繧?縲 sessionid_t繧痴ession縺ォ霑斐☆縲?/span> |
| 2287 |
* |
| 2288 |
* @param uid xoops_users縺ョuid |
| 2289 |
* @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span> |
| 2290 |
* @return RES_OK 謌仙粥 |
| 2291 |
* @return RES_DB_QUERY_ERROR DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ |
| 2292 |
*/ |
| 2293 |
static result_t addSession( userid_t uid, sessionid_t* session ) |
| 2294 |
{ |
| 2295 |
result_t ret = RES_DB_QUERY_ERROR; |
| 2296 |
SQLRETURN sqlcode; |
| 2297 |
string sql = "INSERT INTO " + dbprefix + "_vpaccount_session (uid) values (" + |
| 2298 |
unsignedIntToString(uid) + ")"; |
| 2299 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2300 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2301 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2302 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2303 |
sql = "SELECT LAST_INSERT_ID()"; |
| 2304 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2305 |
sessionid_t sid; |
| 2306 |
SQLINTEGER len; |
| 2307 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sid, 0, &len ); |
| 2308 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 2309 |
*session = sid; |
| 2310 |
ret = RES_OK; |
| 2311 |
} |
| 2312 |
} |
| 2313 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2314 |
} |
| 2315 |
}else{ |
| 2316 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2317 |
} |
| 2318 |
} |
| 2319 |
return ret; |
| 2320 |
} |
| 2321 |
|
| 2322 |
|
| 2323 |
/** |
| 2324 |
* |
| 2325 |
* 繝ュ繧ー繧、繝ウ隱崎ィシ縺ィ繧サ繝?す繝ァ繝ウ菴懈? |
| 2326 |
* |
| 2327 |
* @param uname 繝ュ繧ー繧、繝ウ蜷?/span> |
| 2328 |
* @param passwd 繝代せ繝ッ繝シ繝?/span> |
| 2329 |
* @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span> |
| 2330 |
* @return RES_OK 繝ュ繧ー繧、繝ウ謌仙粥縲Tession縺ォsessionid_t繧呈嶌縺崎セシ繧薙□縲?lt;br> |
| 2331 |
* @return RES_LOGIN_FAILURE uname縺セ縺溘?passwd縺檎焚蟶ク<br> |
| 2332 |
* @return RES_DB_QUERY_ERROR DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ |
| 2333 |
* |
| 2334 |
*/ |
| 2335 |
result_t loginUser(const char* uname, const char* passwd, sessionid_t* session ) |
| 2336 |
{ |
| 2337 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2338 |
|
| 2339 |
result_t ret; |
| 2340 |
string sql; |
| 2341 |
SQLRETURN sqlcode; |
| 2342 |
|
| 2343 |
// uname, passwd -> uid |
| 2344 |
string escUname = addSlashes( uname ); |
| 2345 |
string escPasswd = addSlashes( passwd ); |
| 2346 |
sql = "SELECT uid FROM " + dbprefix + "_users WHERE uname='" + escUname + "' and pass=md5('" + escPasswd + "')"; |
| 2347 |
|
| 2348 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2349 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2350 |
userid_t uid = 0; |
| 2351 |
SQLINTEGER len; |
| 2352 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 2353 |
sqlcode = SQLFetch( hstmt ); |
| 2354 |
if( sqlcode == SQL_SUCCESS ){ |
| 2355 |
ret = addSession( uid, session ); |
| 2356 |
}else { |
| 2357 |
string s( "SQLFetch in loginUser" ); |
| 2358 |
setLastErrorString( s.c_str( ) ); |
| 2359 |
ret = RES_LOGIN_FAILURE;//illegal loginname or password |
| 2360 |
} |
| 2361 |
}else{ |
| 2362 |
setLastErrorString( "SQLExecDirect in loginUser" ); |
| 2363 |
ret = RES_DB_QUERY_ERROR; |
| 2364 |
} |
| 2365 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2366 |
}else{ |
| 2367 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in loginUser" ); |
| 2368 |
ret = RES_DB_QUERY_ERROR; |
| 2369 |
} |
| 2370 |
|
| 2371 |
return ret; |
| 2372 |
} |
| 2373 |
|
| 2374 |
/** |
| 2375 |
* |
| 2376 |
* 繝ュ繧ー繧「繧ヲ繝医→繧サ繝?す繝ァ繝ウ邨ゆコ?/span> |
| 2377 |
* |
| 2378 |
* @param sid session id |
| 2379 |
* @return 縺ェ縺?/span> |
| 2380 |
* |
| 2381 |
*/ |
| 2382 |
void logoutUser( sessionid_t sid ) |
| 2383 |
{ |
| 2384 |
if( hdbc == NULL ) return; // RES_DB_NOT_INITIALIZED; |
| 2385 |
|
| 2386 |
result_t ret; |
| 2387 |
string sql; |
| 2388 |
|
| 2389 |
sql = "DELETE FROM " + dbprefix + "_vpaccount_session WHERE sid=" + intToString((int)sid); |
| 2390 |
if ( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){ |
| 2391 |
/* |
| 2392 |
if ( fp_mysql_affected_rows(mysql) == 1 ){ |
| 2393 |
// 繝ュ繧ー繧「繧ヲ繝医@縺?/span> |
| 2394 |
} |
| 2395 |
else { |
| 2396 |
// sid縺檎┌蜉ケ |
| 2397 |
} |
| 2398 |
*/ |
| 2399 |
} |
| 2400 |
else { |
| 2401 |
// DB蝠上>蜷医o縺帑クュ縺ョ繧ィ繝ゥ繝シ |
| 2402 |
} |
| 2403 |
} |
| 2404 |
|
| 2405 |
/** |
| 2406 |
* |
| 2407 |
* 繧サ繝?す繝ァ繝ウ縺ョ菴懈?.<br> |
| 2408 |
* XOOPS縺ョsession繝??繝悶Ν縺ォ險倬鹸縺輔l縺殱ess_id縺ィ蠑墓焚sess_id縺檎ュ峨@縺代l |
| 2409 |
* 縺ー?茎ession_t繧剃ス懈?縺吶k縲?/span> |
| 2410 |
* 繝??繧ソ繝吶?繧ケ縺ォ繧サ繝?す繝ァ繝ウ縺ィ蠑墓焚縺ョ諠??ア繧定ィ倬鹸縺吶k |
| 2411 |
* |
| 2412 |
* @param sessionid xoops縺ョsession_id |
| 2413 |
* @param uid xoops_users縺ョuid |
| 2414 |
* @param session sessionid_t繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span> |
| 2415 |
* @return RES_OK |
| 2416 |
* @return RES_ERROR |
| 2417 |
* @return RES_DB_QUERY_ERROR |
| 2418 |
* |
| 2419 |
*/ |
| 2420 |
result_t createSession( const char* sess_id, userid_t uid, sessionid_t* session ) |
| 2421 |
{ |
| 2422 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2423 |
|
| 2424 |
result_t ret; |
| 2425 |
string sql; |
| 2426 |
SQLHANDLE hstmt = NULL; |
| 2427 |
SQLRETURN sqlcode; |
| 2428 |
|
| 2429 |
string escSess_id = addSlashes(sess_id); |
| 2430 |
sql = "SELECT sess_id from " + dbprefix + "_session where sess_id='" + escSess_id + "'"; |
| 2431 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2432 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2433 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 2434 |
ret = addSession( uid, session ); |
| 2435 |
}else{ |
| 2436 |
ret = RES_ERROR; |
| 2437 |
} |
| 2438 |
}else { |
| 2439 |
ret = RES_DB_QUERY_ERROR; |
| 2440 |
} |
| 2441 |
}else{ |
| 2442 |
ret = RES_DB_QUERY_ERROR; |
| 2443 |
} |
| 2444 |
return ret; |
| 2445 |
} |
| 2446 |
|
| 2447 |
/** |
| 2448 |
* |
| 2449 |
* 繧サ繝?す繝ァ繝ウ縺ョ隧ウ邏ー繧痴ession_t縺ァ蜿門セ励☆繧?<br> |
| 2450 |
* |
| 2451 |
* @param sid 繧サ繝?す繝ァ繝ウID |
| 2452 |
* @param ppsession sessionid_t*繧貞女縺大叙繧九◆繧√?繝昴う繝ウ繧ソ縲?/span> |
| 2453 |
* @return RES_OK 謌仙粥縲GreeResult(*ppsession)縺悟ソ?ヲ√??lt;br> |
| 2454 |
* @return RES_NO_SUCH_SESSION<br> |
| 2455 |
* @return RES_DB_QUERY_ERROR<br> |
| 2456 |
* @return RES_DB_NOT_INITIALIZED |
| 2457 |
* |
| 2458 |
*/ |
| 2459 |
result_t getSession( sessionid_t sid, const session_t** ppsession ) |
| 2460 |
{ |
| 2461 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2462 |
|
| 2463 |
result_t ret; |
| 2464 |
string sql; |
| 2465 |
|
| 2466 |
/* |
| 2467 |
sql = "SELECT sid, uid, unix_timestamp(timestamp) from " + dbprefix + |
| 2468 |
"_vpaccount_session where sid=" + unsignedIntToString((unsigned int)sid); |
| 2469 |
if( 0 == SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ){ |
| 2470 |
MYSQL_RES* result = fp_mysql_store_result( mysql ); |
| 2471 |
if( result ){ |
| 2472 |
MYSQL_ROW row = fp_mysql_fetch_row(result); |
| 2473 |
if( row ){ |
| 2474 |
session_t *p = new session[1]; |
| 2475 |
p->setSessionID(sid); |
| 2476 |
p->setUserID(atoi( row[1] != NULL ? row[1] : "" )); |
| 2477 |
p->setDate(atoi( row[2] != NULL ? row[2] : "" )); |
| 2478 |
*ppsession = p; |
| 2479 |
ret = RES_OK; |
| 2480 |
}else{ |
| 2481 |
ret = RES_NO_SUCH_SESSION; |
| 2482 |
} |
| 2483 |
fp_mysql_free_result( result ); |
| 2484 |
}else { |
| 2485 |
ret = RES_DB_QUERY_ERROR; |
| 2486 |
} |
| 2487 |
}else{ |
| 2488 |
ret = RES_DB_QUERY_ERROR; |
| 2489 |
} |
| 2490 |
|
| 2491 |
*/ |
| 2492 |
return ret; |
| 2493 |
} |
| 2494 |
|
| 2495 |
/** |
| 2496 |
* |
| 2497 |
* 繧サ繝?す繝ァ繝ウ縺ョ豁」蠖捺?ァ繧偵メ繧ァ繝?け縺吶k. |
| 2498 |
* |
| 2499 |
* @param sid 繝√ぉ繝?け縺励◆縺гession |
| 2500 |
* @return true 豁」蠖?/span> |
| 2501 |
* @return false 荳肴ュ」 |
| 2502 |
* |
| 2503 |
*/ |
| 2504 |
bool isValidSessionID( sessionid_t sid ) |
| 2505 |
{ |
| 2506 |
if( hdbc == NULL ) return false; |
| 2507 |
|
| 2508 |
bool ret = false; |
| 2509 |
string sql; |
| 2510 |
char buf[ 12 ]; |
| 2511 |
snprintf( buf, 12, "%d", sid ); |
| 2512 |
SQLRETURN sqlcode; |
| 2513 |
SQLHANDLE hstmt = NULL; |
| 2514 |
|
| 2515 |
sql = "SELECT * FROM " + dbprefix + "_vpaccount_session WHERE sid=" + string( buf ); |
| 2516 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2517 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2518 |
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 2519 |
ret = true; |
| 2520 |
}else{ |
| 2521 |
snprintf( buf, 12, "%d", sqlcode ); |
| 2522 |
string s( "SQLFetch in isValidSessionID(sqlcode=" ); |
| 2523 |
s += string( buf ) + ", sql=" + sql + ")"; |
| 2524 |
setLastErrorString( s.c_str() ); |
| 2525 |
ret = false; |
| 2526 |
} |
| 2527 |
}else{ |
| 2528 |
setLastErrorString( "SQLExecDirect in isValidSessionID" ); |
| 2529 |
ret = false; |
| 2530 |
} |
| 2531 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2532 |
}else{ |
| 2533 |
setLastErrorString( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isValidSessionID" ); |
| 2534 |
ret = false; |
| 2535 |
} |
| 2536 |
return ret; |
| 2537 |
} |
| 2538 |
|
| 2539 |
void freeAccount( const account_t* ptr ){ delete[] ( account_t* )ptr; } |
| 2540 |
void freeGroup( const group_t* ptr ){ delete[] ( group_t* )ptr; } |
| 2541 |
void freeSession( const session_t* ptr ){ delete[] ( session_t* )ptr; } |
| 2542 |
void freeUID( const int* ptr ){ delete[] ( int* )ptr; } |
| 2543 |
void freeGID( const int* ptr ){ delete[] ( int* )ptr; } |
| 2544 |
|
| 2545 |
static string errstr; |
| 2546 |
const char* getLastErrorString() |
| 2547 |
{ |
| 2548 |
return errstr.c_str( ); |
| 2549 |
} |
| 2550 |
|
| 2551 |
void setLastErrorString( const char* str ) |
| 2552 |
{ |
| 2553 |
errstr = str; |
| 2554 |
// fprintf( stderr, "setLastErrorString( '%s' );\n", str ); |
| 2555 |
} |